Leaked source code of windows server 2003
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

#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;
}