You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
289 lines
11 KiB
289 lines
11 KiB
#include "stdafx.h"
|
|
#include <ole2.h>
|
|
#include "iadmw.h"
|
|
#include "iiscnfg.h"
|
|
#include "mdkey.h"
|
|
#include "mdentry.h"
|
|
#include "mdacl.h"
|
|
#include "setpass.h"
|
|
#include "www.h"
|
|
|
|
int Register_iis_ftp_handle_iusr_acct(void);
|
|
int CheckForOtherIUsersAndUseItForFTP(void);
|
|
INT Register_iis_ftp(void);
|
|
INT Unregister_iis_ftp(void);
|
|
|
|
// returns true if successfully registered ftp component.
|
|
// returns false if failed.
|
|
INT Register_iis_ftp()
|
|
{
|
|
iisDebugOut_Start(_T("Register_iis_ftp"),LOG_TYPE_TRACE);
|
|
int iReturn = TRUE;
|
|
int iTempFlag = TRUE;
|
|
int iCount = 0;
|
|
int iTemp = TRUE;
|
|
TCHAR szTempSection[255];
|
|
|
|
ACTION_TYPE atFTP = GetSubcompAction(_T("iis_ftp"), TRUE);
|
|
|
|
ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_ftp_before"));
|
|
AdvanceProgressBarTickGauge();
|
|
|
|
// Grab the IUSR_machine name account
|
|
// so we can save it in the metabase during FTP_Upgrade_RegToMetabase();
|
|
Register_iis_ftp_handle_iusr_acct();
|
|
SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 33003, g_pTheApp->m_csFTPAnonyName);
|
|
AdvanceProgressBarTickGauge();
|
|
|
|
WriteToMD_Capabilities(_T("MSFTPSVC"));
|
|
HandleSecurityTemplates(_T("MSFTPSVC"));
|
|
// ================
|
|
//
|
|
// LM/MSFTPSVC/n/
|
|
// LM/MSFTPSVC/n/ServerBindings
|
|
// LM/MSFTPSVC/n/SecureBindings
|
|
// LM/MSFTPSVC/n/ServerComment
|
|
// LM/MSFTPSVC/n/ServerSize
|
|
// LM/MSFTPSVC/n/MD_NOT_DELETABLE
|
|
//
|
|
// fresh = ok.
|
|
// reinstall = ok -- Do not re-create these things if it is a reinstall...
|
|
// upgrade 1,2,3 = ok, handles upgrades.
|
|
// upgrade 4 = ok. if exists, should leave what the user had.
|
|
// otherwise write in the default stuff
|
|
//
|
|
// if the user does not have these virtual roots which we installed during iis4 days
|
|
// then we don't need to verify that they are they. the user removed them for some
|
|
// reason, and we should honor that.
|
|
// a. make sure the iishelp points to the right place though.
|
|
// ================
|
|
ProgressBarTextStack_Set(IDS_IIS_ALL_CONFIGURE);
|
|
AddVRootsToMD(_T("MSFTPSVC"));
|
|
|
|
iCount = 0;
|
|
while(TRUE == iTemp && iCount < 10)
|
|
{
|
|
iCount++;
|
|
_stprintf(szTempSection, _T("register_iis_ftp_%d"),iCount);
|
|
|
|
// this will return false if the section does not exist
|
|
iTemp = ProcessSection(g_pTheApp->m_hInfHandle, szTempSection);
|
|
AdvanceProgressBarTickGauge();
|
|
}
|
|
|
|
ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_ftp_after"));
|
|
|
|
ProgressBarTextStack_Pop();
|
|
goto Register_iis_ftp_Exit;
|
|
|
|
Register_iis_ftp_Exit:
|
|
iisDebugOut_End(_T("Register_iis_ftp"),LOG_TYPE_TRACE);
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
INT Unregister_iis_ftp()
|
|
{
|
|
int iReturn = TRUE;
|
|
int iCount = 0;
|
|
int iTemp = TRUE;
|
|
TCHAR szTempSection[255];
|
|
|
|
ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_ftp_before"));
|
|
AdvanceProgressBarTickGauge();
|
|
|
|
iCount = 0;
|
|
while(TRUE == iTemp && iCount < 10)
|
|
{
|
|
iCount++;
|
|
_stprintf(szTempSection, _T("unregister_iis_ftp_%d"),iCount);
|
|
|
|
// this will return false if the section does not exist
|
|
iTemp = ProcessSection(g_pTheApp->m_hInfHandle, szTempSection);
|
|
AdvanceProgressBarTickGauge();
|
|
}
|
|
|
|
ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_ftp_after"));
|
|
AdvanceProgressBarTickGauge();
|
|
return iReturn;
|
|
}
|
|
|
|
int Register_iis_ftp_handle_iusr_acct()
|
|
{
|
|
int err = FALSE;
|
|
int iReturn = TRUE;
|
|
INT iUserWasNewlyCreated = 0;
|
|
|
|
ACTION_TYPE atFTP = GetSubcompAction(_T("iis_ftp"),FALSE);
|
|
|
|
// this was inited in initapp.cpp: CInitApp::SetSetupParams
|
|
// and it could have been overridden by the time we get here
|
|
g_pTheApp->m_csFTPAnonyName = g_pTheApp->m_csGuestName;
|
|
g_pTheApp->m_csFTPAnonyPassword = g_pTheApp->m_csGuestPassword;
|
|
|
|
if (0 != g_pTheApp->dwUnattendConfig)
|
|
{
|
|
// if some sort of unattended www user was specified
|
|
// then use it. if they specified only a password,
|
|
// then use that password for the default user.
|
|
if (g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_NAME)
|
|
{
|
|
if (_tcsicmp(g_pTheApp->m_csFTPAnonyName_Unattend,_T("")) != 0)
|
|
{
|
|
g_pTheApp->m_csFTPAnonyName = g_pTheApp->m_csFTPAnonyName_Unattend;
|
|
}
|
|
}
|
|
|
|
if (g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_FTP_USER_PASS)
|
|
{
|
|
g_pTheApp->m_csFTPAnonyPassword = g_pTheApp->m_csFTPAnonyPassword_Unattend;
|
|
}
|
|
|
|
err = CreateIUSRAccount(g_pTheApp->m_csFTPAnonyName, g_pTheApp->m_csFTPAnonyPassword,&iUserWasNewlyCreated);
|
|
if ( err != NERR_Success )
|
|
{
|
|
// something went wrong, set the user back to guest!!!
|
|
g_pTheApp->m_csFTPAnonyName = g_pTheApp->m_csGuestName;
|
|
g_pTheApp->m_csFTPAnonyPassword = g_pTheApp->m_csGuestPassword;
|
|
|
|
// flow down and process CheckIfThisServerHasAUserThenUseIt()
|
|
// since things are now hosed!
|
|
}
|
|
else
|
|
{
|
|
// Check if the user was NewlyCreated.
|
|
// if it was then add it to list that eventually gets written to
|
|
// the registry -- so that when uninstall happens, setup knows
|
|
// which users it added -- so that it can remove them!
|
|
if (1 == iUserWasNewlyCreated)
|
|
{
|
|
// Add to the list
|
|
g_pTheApp->UnInstallList_Add(_T("IUSR_FTP"),g_pTheApp->m_csFTPAnonyName);
|
|
}
|
|
WriteToMD_AnonymousUserName_FTP(FALSE);
|
|
goto Register_iis_ftp_handle_iusr_acct_Exit;
|
|
}
|
|
}
|
|
|
|
// check the metabase to see if it already has an entry in it
|
|
if (TRUE == CheckIfThisServerHasAUserThenUseIt(DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER))
|
|
{goto Register_iis_ftp_handle_iusr_acct_Exit;}
|
|
|
|
// Well, i guess the there is no metabase entry for the iusr under ftp.
|
|
|
|
// see if we can get it from somewhere else...
|
|
if (atFTP == AT_INSTALL_FRESH)
|
|
{
|
|
// if this is a fresh install of ftp, then
|
|
// let's try to use the www user
|
|
if (TRUE == CheckIfServerAHasAUserThenUseForServerB(_T("LM/W3SVC"), DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER))
|
|
{goto Register_iis_ftp_handle_iusr_acct_Exit;}
|
|
}
|
|
|
|
// if this is an upgrade or fresh or whatevers
|
|
// see if we can get it from an older iis place
|
|
if (TRUE == CheckForOtherIUsersAndUseItForFTP())
|
|
{goto Register_iis_ftp_handle_iusr_acct_Exit;}
|
|
|
|
// if there are no registry/existing user combinations
|
|
// then we'll have to create a new iusr for ftp
|
|
|
|
// let's use the iusr_computername deal
|
|
g_pTheApp->m_csFTPAnonyName = g_pTheApp->m_csGuestName;
|
|
g_pTheApp->m_csFTPAnonyPassword = g_pTheApp->m_csGuestPassword;
|
|
CreateIUSRAccount(g_pTheApp->m_csFTPAnonyName, g_pTheApp->m_csFTPAnonyPassword,&iUserWasNewlyCreated);
|
|
|
|
// ================
|
|
// LM/MSFTPSVC/AnonymousUserName
|
|
// LM/MSFTPSVC/AnonymousPwd
|
|
// ================
|
|
WriteToMD_AnonymousUserName_FTP(FALSE);
|
|
goto Register_iis_ftp_handle_iusr_acct_Exit;
|
|
|
|
Register_iis_ftp_handle_iusr_acct_Exit:
|
|
return iReturn;
|
|
}
|
|
|
|
|
|
// Look in the old iis1.0,2.0,3.0 spot for the ftp user and name.
|
|
// retrieve it from the registry..
|
|
int CheckForOtherIUsersAndUseItForFTP(void)
|
|
{
|
|
int iReturn = FALSE;
|
|
int IfTheUserNotExistThenDoNotDoThis = TRUE;
|
|
|
|
TSTR strAnonyName;
|
|
CString csAnonyName;
|
|
TSTR strAnonyPassword;
|
|
|
|
CRegKey regFTPParam(HKEY_LOCAL_MACHINE, REG_FTPPARAMETERS, KEY_READ);
|
|
CRegKey regWWWParam(HKEY_LOCAL_MACHINE, REG_WWWPARAMETERS, KEY_READ);
|
|
|
|
iisDebugOut_Start(_T("CheckForOtherIUsersAndUseItForFTP"));
|
|
|
|
ACTION_TYPE atFTP = GetSubcompAction(_T("iis_ftp"),FALSE);
|
|
if (atFTP != AT_INSTALL_UPGRADE)
|
|
{goto CheckForOtherIUsersAndUseItForFTP_Exit;}
|
|
|
|
if (g_pTheApp->m_eUpgradeType != UT_351 && g_pTheApp->m_eUpgradeType != UT_10 && g_pTheApp->m_eUpgradeType != UT_20 && g_pTheApp->m_eUpgradeType != UT_30)
|
|
{goto CheckForOtherIUsersAndUseItForFTP_Exit;}
|
|
|
|
if ( (HKEY) regFTPParam )
|
|
{
|
|
regFTPParam.m_iDisplayWarnings = FALSE;
|
|
if (ERROR_SUCCESS == regFTPParam.QueryValue(_T("AnonymousUserName"), csAnonyName))
|
|
{
|
|
if ( !strAnonyName.Copy( csAnonyName.GetBuffer(0) ) ||
|
|
!GetAnonymousSecret( _T("FTPD_ANONYMOUS_DATA"), &strAnonyPassword ) )
|
|
{
|
|
goto CheckForOtherIUsersAndUseItForFTP_Exit;
|
|
}
|
|
|
|
int iThisIsFalseBecauseNoMetabase = FALSE;
|
|
if (TRUE == MakeThisUserNameAndPasswordWork(DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER , strAnonyName.QueryStr(), strAnonyPassword.QueryStr(), iThisIsFalseBecauseNoMetabase, IfTheUserNotExistThenDoNotDoThis))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("CheckForOtherIUsersAndUseItForFTP:using old ftp reg usr:%s.\n"), strAnonyPassword.QueryStr() ));
|
|
iReturn = TRUE;
|
|
goto CheckForOtherIUsersAndUseItForFTP_Exit;
|
|
}
|
|
else
|
|
{
|
|
// the user was not found, so don't use this registry data
|
|
// just flow down to the next check
|
|
}
|
|
}
|
|
}
|
|
|
|
// retrieve from registry
|
|
if ( (HKEY) regWWWParam )
|
|
{
|
|
regWWWParam.m_iDisplayWarnings = FALSE;
|
|
if (ERROR_SUCCESS == regWWWParam.QueryValue(_T("AnonymousUserName"), csAnonyName))
|
|
{
|
|
if ( !strAnonyName.Copy( csAnonyName.GetBuffer(0) ) ||
|
|
!GetAnonymousSecret( _T("W3_ANONYMOUS_DATA"), &strAnonyPassword ) )
|
|
{
|
|
iReturn = FALSE;
|
|
goto CheckForOtherIUsersAndUseItForFTP_Exit;
|
|
}
|
|
|
|
int iThisIsFalseBecauseNoMetabase = FALSE;
|
|
if (TRUE == MakeThisUserNameAndPasswordWork(DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER , strAnonyName.QueryStr() , strAnonyPassword.QueryStr(), iThisIsFalseBecauseNoMetabase, IfTheUserNotExistThenDoNotDoThis))
|
|
{
|
|
iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("CheckForOtherIUsersAndUseItForFTP:using old www reg usr:%s.\n"),strAnonyName.QueryStr()));
|
|
iReturn = TRUE;
|
|
}
|
|
else
|
|
{
|
|
// if this didn't work, then we'll have to return false
|
|
// in other words -- we couldn't find a valid registry and existing user entry...
|
|
iReturn = FALSE;
|
|
}
|
|
goto CheckForOtherIUsersAndUseItForFTP_Exit;
|
|
}
|
|
}
|
|
|
|
CheckForOtherIUsersAndUseItForFTP_Exit:
|
|
iisDebugOut_End(_T("CheckForOtherIUsersAndUseItForFTP"));
|
|
return iReturn;
|
|
}
|