#include "stdafx.h" #include #include "iadmw.h" #include "iiscnfg.h" #include "mdkey.h" #include "mdentry.h" #include "mdacl.h" #include "other.h" #include "setpass.h" #include "setuser.h" #include "www.h" #include "rights.hxx" extern OCMANAGER_ROUTINES gHelperRoutines; #define Register_iis_www_log _T("Register_iis_www") INT Register_iis_www() { USE_USER_RIGHTS(); iisDebugOut_Start(Register_iis_www_log, LOG_TYPE_TRACE); int iReturn = TRUE; int iTempFlag = TRUE; int iCount = 0; int iTemp = TRUE; TCHAR szTempSection[255]; ACTION_TYPE atWWW = GetSubcompAction(_T("iis_www"), TRUE); CMDKey cmdKey; ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_www_before")); // --------------------------------------------------- // // Here is the first place where we try to access the metabase! // // --------------------------------------------------- // create node /LM/W3SVC before wamreg.dll create IIS package // the registration of w3svc.dll will also require these initial entries to be here cmdKey.CreateNode(METADATA_MASTER_ROOT_HANDLE, _T("LM/W3SVC")); if ( !(METADATA_HANDLE)cmdKey ) { // We failed to create node on the metabase // this is pretty serious. // we failed to create the ftp service. iisDebugOut((LOG_TYPE_ERROR, _T("%s(): failed to create initial node is metabase 'LM/W3SVC'. GetLastError()=0x%x\n"), Register_iis_www_log, GetLastError())); iReturn = FALSE; goto Register_iis_www_exit; } cmdKey.Close(); // --------------------------------------------------- // // Get the anonymous username/passowrd and iwam username/password accounts. // And verify that the accounts exist and have the right privledges. // // --------------------------------------------------- #ifndef _CHICAGO_ // IUSR_(computername) Register_iis_www_handle_iusr_acct(); SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 33002, g_pTheApp->m_csWWWAnonyName); AdvanceProgressBarTickGauge(); // IWAM_(computername) Register_iis_www_handle_iwam_acct(); SetupSetStringId_Wrapper(g_pTheApp->m_hInfHandle, 33001, g_pTheApp->m_csWAMAccountName); AdvanceProgressBarTickGauge(); #endif // _CHICAGO_ // --------------------------------------------------- // // Install any services or whatever // // when we get out of this: // MAKE SURE THE IISADMIN SERVICE IS RUNNING. // This is because we don't want the startup code called twice. // example: start the metabase, but it takes a minute, // meanwhile, thru com, the metabase tries to get started again, // it will then error out with a "instance of the service is already running" error or something like it. // --------------------------------------------------- WriteToMD_Capabilities(_T("W3SVC")); ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_www_1")); AdvanceProgressBarTickGauge(); ProgressBarTextStack_Set(IDS_IIS_ALL_CONFIGURE); InstallMimeMap(); HandleSecurityTemplates(_T("W3SVC")); // ================ // // LM/W3SVC/n/ // LM/W3SVC/n/ServerBindings // LM/W3SVC/n/SecureBindings // LM/W3SVC/n/ServerComment // LM/W3SVC/n/ServerSize // LM/W3SVC/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. // ================ // About Virtual Roots AddVRootsToMD(_T("W3SVC")); AdvanceProgressBarTickGauge(); LoopThruW3SVCInstancesAndSetStuff(); LogHeapState(FALSE, __FILE__, __LINE__); AdvanceProgressBarTickGauge(); iCount = 1; while(TRUE == iTemp && iCount < 10) { iCount++; _stprintf(szTempSection, _T("register_iis_www_%d"),iCount); // this will return false if the section does not exist iTemp = ProcessSection(g_pTheApp->m_hInfHandle, szTempSection); AdvanceProgressBarTickGauge(); } // // Finaly Save the path to the WWW Root // ProcessSection(g_pTheApp->m_hInfHandle, _T("register_iis_www_after")); ProgressBarTextStack_Pop(); Register_iis_www_exit: iisDebugOut_End(Register_iis_www_log, LOG_TYPE_TRACE); return iReturn; } INT Unregister_iis_www() { int iCount = 0; int iTemp = TRUE; TCHAR szTempSection[255]; ACTION_TYPE atWWW = GetSubcompAction(_T("iis_www"),TRUE); ProcessSection(g_pTheApp->m_hInfHandle, _T("unregister_iis_www_before")); AdvanceProgressBarTickGauge(); iCount = 0; while(TRUE == iTemp && iCount < 10) { iCount++; _stprintf(szTempSection, _T("unregister_iis_www_%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_www_after")); AdvanceProgressBarTickGauge(); return 0; } int LoopThruW3SVCInstancesAndSetStuff() { int iReturn = TRUE; CMDKey cmdKey; CStringArray arrayInstance; int nArray = 0, i = 0; // get all instances into an array cmdKey.OpenNode(_T("LM/W3SVC")); if ( (METADATA_HANDLE)cmdKey ) { CMDKeyIter cmdKeyEnum(cmdKey); CString csKeyName; while (cmdKeyEnum.Next(&csKeyName) == ERROR_SUCCESS) { if (IsValidNumber((LPCTSTR)csKeyName)) { arrayInstance.Add(csKeyName); } } cmdKey.Close(); } nArray = (int)arrayInstance.GetSize(); // set AppFriendlyName for (i=0; idwUnattendConfig) { // if some sort of unattended 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_WAM_USER_NAME) { if (_tcsicmp(g_pTheApp->m_csWAMAccountName_Unattend,_T("")) != 0) {g_pTheApp->m_csWAMAccountName = g_pTheApp->m_csWAMAccountName_Unattend;} } if (g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WAM_USER_PASS) { g_pTheApp->m_csWAMAccountPassword = g_pTheApp->m_csWAMAccountPassword_Unattend; } // let's use the iusr_computername deal err = CreateIWAMAccount(g_pTheApp->m_csWAMAccountName,g_pTheApp->m_csWAMAccountPassword, &iUserWasNewlyCreated); if ( err != NERR_Success ) { // something went wrong, set the user back to iwam!!! g_pTheApp->ReGetMachineAndAccountNames(); g_pTheApp->ResetWAMPassword(); // 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_WAM"),g_pTheApp->m_csWAMAccountName); } WriteToMD_IWamUserName_WWW(); goto Register_iis_www_handle_iwam_acct_Exit; } } if (TRUE == CheckIfThisServerHasAUserThenUseIt(DO_IT_FOR_W3SVC_WAMUSER)) {goto Register_iis_www_handle_iwam_acct_Exit;} // if there are no registry/existing user combinations // then we'll have to create a new iusr for WWW // let's use the iusr_computername deal err = CreateIWAMAccount(g_pTheApp->m_csWAMAccountName,g_pTheApp->m_csWAMAccountPassword, &iUserWasNewlyCreated); if ( err != NERR_Success ) { // regenerate the password and try again... g_pTheApp->ResetWAMPassword(); err = CreateIWAMAccount(g_pTheApp->m_csWAMAccountName,g_pTheApp->m_csWAMAccountPassword, &iUserWasNewlyCreated); } // 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_WAM"),g_pTheApp->m_csWAMAccountName); } // Stick iwam username in the metabase // (this may fail because the password is using encryption -- rsabase.dll) // ================ // LM/W3SVC/WamUserName // LM/W3SVC/WamPwd // ================ WriteToMD_IWamUserName_WWW(); goto Register_iis_www_handle_iwam_acct_Exit; Register_iis_www_handle_iwam_acct_Exit: iisDebugOut_End(Register_iis_www_handle_iwam_acct_log, LOG_TYPE_TRACE); return iReturn; } #define Register_iis_www_handle_iusr_acct_log _T("Register_iis_www_handle_iusr_acct") int Register_iis_www_handle_iusr_acct(void) { int err = FALSE; int iReturn = TRUE; INT iUserWasNewlyCreated = 0; ACTION_TYPE atWWW = GetSubcompAction(_T("iis_www"),FALSE); iisDebugOut_Start(Register_iis_www_handle_iusr_acct_log, LOG_TYPE_TRACE); g_pTheApp->m_csWWWAnonyName = g_pTheApp->m_csGuestName; g_pTheApp->m_csWWWAnonyPassword = 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_WWW_USER_NAME) { if (_tcsicmp(g_pTheApp->m_csWWWAnonyName_Unattend,_T("")) != 0) {g_pTheApp->m_csWWWAnonyName = g_pTheApp->m_csWWWAnonyName_Unattend;} } if (g_pTheApp->dwUnattendConfig & USER_SPECIFIED_INFO_WWW_USER_PASS) { g_pTheApp->m_csWWWAnonyPassword = g_pTheApp->m_csWWWAnonyPassword_Unattend; } err = CreateIUSRAccount(g_pTheApp->m_csWWWAnonyName, g_pTheApp->m_csWWWAnonyPassword, &iUserWasNewlyCreated); if ( err != NERR_Success ) { // something went wrong, set the user back to guest!!! g_pTheApp->m_csWWWAnonyName = g_pTheApp->m_csGuestName; g_pTheApp->m_csWWWAnonyPassword = 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_WWW"),g_pTheApp->m_csWWWAnonyName); } WriteToMD_AnonymousUserName_WWW(FALSE); goto Register_iis_www_handle_iusr_acct_Exit; } } if (TRUE == CheckIfThisServerHasAUserThenUseIt(DO_IT_FOR_W3SVC_ANONYMOUSUSER)) {goto Register_iis_www_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 (atWWW == 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/MSFTPSVC"), DO_IT_FOR_W3SVC_ANONYMOUSUSER)) {goto Register_iis_www_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 == CheckForOtherIUsersAndUseItForWWW()) {goto Register_iis_www_handle_iusr_acct_Exit;} // if there are no registry/existing user combinations // then we'll have to create a new iusr for WWW // this was inited in initapp.cpp: CInitApp::SetSetupParams // and it could have been overridden by the time we get here // let's use the iusr_computername deal g_pTheApp->m_csWWWAnonyName = g_pTheApp->m_csGuestName; g_pTheApp->m_csWWWAnonyPassword = g_pTheApp->m_csGuestPassword; CreateIUSRAccount(g_pTheApp->m_csWWWAnonyName, g_pTheApp->m_csWWWAnonyPassword, &iUserWasNewlyCreated); if (1 == iUserWasNewlyCreated) { // Add to the list //g_pTheApp->UnInstallList_Add(_T("IUSR_WWW"),g_pTheApp->m_csWWWAnonyName); } // ================ // LM/W3SVC/AnonymousUserName // LM/W3SVC/AnonymousPwd // ================ WriteToMD_AnonymousUserName_WWW(FALSE); goto Register_iis_www_handle_iusr_acct_Exit; Register_iis_www_handle_iusr_acct_Exit: iisDebugOut_End(Register_iis_www_handle_iusr_acct_log, LOG_TYPE_TRACE); return iReturn; } // Look in the old iis1.0,2.0,3.0 spot for the ftp user and name. // retrieve it from the registry.. #define CheckForOtherIUsersAndUseItForWWW_log _T("CheckForOtherIUsersAndUseItForWWW") int CheckForOtherIUsersAndUseItForWWW(void) { int iReturn = FALSE; int IfTheUserNotExistThenDoNotDoThis = TRUE; CString csAnonyName; TCHAR szAnonyName[UNLEN+1]; TSTR strAnonyPassword; iisDebugOut_Start(CheckForOtherIUsersAndUseItForWWW_log); CRegKey regFTPParam(HKEY_LOCAL_MACHINE, REG_FTPPARAMETERS, KEY_READ); CRegKey regWWWParam(HKEY_LOCAL_MACHINE, REG_WWWPARAMETERS, KEY_READ); ACTION_TYPE atWWW = GetSubcompAction(_T("iis_www"),FALSE); if (atWWW != AT_INSTALL_UPGRADE) {goto CheckForOtherIUsersAndUseItForWWW_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 CheckForOtherIUsersAndUseItForWWW_Exit;} // retrieve from registry if ( (HKEY) regWWWParam ) { regWWWParam.m_iDisplayWarnings = FALSE; if (ERROR_SUCCESS == regWWWParam.QueryValue(_T("AnonymousUserName"), csAnonyName)) { _tcscpy(szAnonyName, csAnonyName); if ( !GetAnonymousSecret( _T("W3_ANONYMOUS_DATA"), &strAnonyPassword ) ) { goto CheckForOtherIUsersAndUseItForWWW_Exit; } int iThisIsFalseBecauseNoMetabase = FALSE; if (TRUE == MakeThisUserNameAndPasswordWork(DO_IT_FOR_W3SVC_ANONYMOUSUSER, szAnonyName, strAnonyPassword.QueryStr(), iThisIsFalseBecauseNoMetabase, IfTheUserNotExistThenDoNotDoThis)) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s:using old www reg usr:%s.\n"),CheckForOtherIUsersAndUseItForWWW_log,szAnonyName)); iReturn = TRUE; goto CheckForOtherIUsersAndUseItForWWW_Exit; } else { // the user was not found, so don't use this registry data // just flow down to the next check } goto CheckForOtherIUsersAndUseItForWWW_Exit; } } if ( (HKEY) regFTPParam ) { regFTPParam.m_iDisplayWarnings = FALSE; if (ERROR_SUCCESS == regFTPParam.QueryValue(_T("AnonymousUserName"), csAnonyName)) { _tcscpy(szAnonyName, csAnonyName); if ( !GetAnonymousSecret( _T("FTPD_ANONYMOUS_DATA"), &strAnonyPassword ) ) { goto CheckForOtherIUsersAndUseItForWWW_Exit; } int iThisIsFalseBecauseNoMetabase = FALSE; if (TRUE == MakeThisUserNameAndPasswordWork(DO_IT_FOR_W3SVC_ANONYMOUSUSER, szAnonyName, strAnonyPassword.QueryStr(), iThisIsFalseBecauseNoMetabase, IfTheUserNotExistThenDoNotDoThis)) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s:using old ftp reg usr:%s.\n"),CheckForOtherIUsersAndUseItForWWW_log,szAnonyName)); iReturn = TRUE; goto CheckForOtherIUsersAndUseItForWWW_Exit; } 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; } } } CheckForOtherIUsersAndUseItForWWW_Exit: iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s():End.ret=%d\n"),CheckForOtherIUsersAndUseItForWWW_log,iReturn)); return iReturn; } #define MakeThisUserNameAndPasswordWork_log _T("MakeThisUserNameAndPasswordWork") int MakeThisUserNameAndPasswordWork(int iForWhichUser, TCHAR *szAnonyName,TCHAR *szAnonyPassword, int iMetabaseUserExistsButCouldntGetPassword, int IfUserNotExistThenReturnFalse) { USE_USER_RIGHTS(); int iReturn = TRUE; int iMetabaseUpgradeScenarioSoOverWriteOnlyIfAlreadyThere = FALSE; INT iUserWasNewlyCreated = 0; // We want to see if these users exists iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s:usrtype=%d:flag1=%d:flag2=%d\n"),MakeThisUserNameAndPasswordWork_log,iForWhichUser,szAnonyName,iMetabaseUserExistsButCouldntGetPassword,IfUserNotExistThenReturnFalse)); // check if anonyname is blank if (!szAnonyName) {goto MakeThisUserNameAndPasswordWork_Exit;} // Check if just contains nothing if (_tcsicmp(szAnonyName, _T("")) == 0) {goto MakeThisUserNameAndPasswordWork_Exit;} // Only check if the user exists if this is a user on this machine. // if it is not a user on this machine, then don't validate the user/password, // since during Guimode setup, they may not be connected to the network. if ( IsDomainSpecifiedOtherThanLocalMachine(szAnonyName)) { // use whatever they had. // can't verify that the user exists. // can't verify that the password actually works. // so we can't verify that the user exists, so let's figure it doesn't if (IfUserNotExistThenReturnFalse) { iReturn = FALSE; } } else { // Check if this user actually exists... if (IsUserExist(szAnonyName)) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s:The %s user exists\n"),MakeThisUserNameAndPasswordWork_log,szAnonyName)); // The only way we can be down here is if the username is a local account. // Reset the password to make sure it works! ChangeUserPassword(szAnonyName, szAnonyPassword); if (iForWhichUser == DO_IT_FOR_W3SVC_ANONYMOUSUSER) { // IUSR_ account already exist, reuse it g_pTheApp->m_csWWWAnonyName = szAnonyName; // But assume that the password is correct! g_pTheApp->m_csWWWAnonyPassword = szAnonyPassword; // make sure this user has the appropriate rights.. UpdateUserRights(g_pTheApp->m_csWWWAnonyName,g_pstrRightsFor_IUSR,sizeof(g_pstrRightsFor_IUSR)/sizeof(LPTSTR), TRUE); } if (iForWhichUser == DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER) { // IUSR_ account already exist, reuse it g_pTheApp->m_csFTPAnonyName = szAnonyName; // But assume that the password is correct! g_pTheApp->m_csFTPAnonyPassword = szAnonyPassword; // make sure this user has the appropriate rights.. UpdateUserRights(g_pTheApp->m_csFTPAnonyName,g_pstrRightsFor_IUSR,sizeof(g_pstrRightsFor_IUSR)/sizeof(LPTSTR), TRUE); } if (iForWhichUser == DO_IT_FOR_W3SVC_WAMUSER) { // IWAM_ account already exist, resue it g_pTheApp->m_csWAMAccountName = szAnonyName; // But assume that the password is correct! g_pTheApp->m_csWAMAccountPassword = szAnonyPassword; // make sure the user has the appropriate rights UpdateUserRights(g_pTheApp->m_csWAMAccountName,g_pstrRightsFor_IWAM,sizeof(g_pstrRightsFor_IWAM)/sizeof(LPTSTR), TRUE); } } else { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s:The %s user does not exist\n"),MakeThisUserNameAndPasswordWork_log,szAnonyName)); if (IfUserNotExistThenReturnFalse) { iReturn = FALSE; } else { if (iForWhichUser == DO_IT_FOR_W3SVC_ANONYMOUSUSER) { iisDebugOut((LOG_TYPE_WARN, _T("%s():FAIL WARNING: previous W3SVC iusr_ does not exist. creating a new one.\n"),MakeThisUserNameAndPasswordWork_log)); g_pTheApp->m_csWWWAnonyName = szAnonyName; if (!szAnonyPassword || _tcsicmp(szAnonyPassword, _T("")) == 0) {_tcscpy(szAnonyPassword,g_pTheApp->m_csGuestPassword);} g_pTheApp->m_csWWWAnonyPassword = szAnonyPassword; CreateIUSRAccount(g_pTheApp->m_csWWWAnonyName, g_pTheApp->m_csWWWAnonyPassword,&iUserWasNewlyCreated); } if (iForWhichUser == DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER) { iisDebugOut((LOG_TYPE_WARN, _T("%s():FAIL WARNING: previous MSFTPSVC iusr_ does not exist. creating a new one.\n"),MakeThisUserNameAndPasswordWork_log)); g_pTheApp->m_csFTPAnonyName = szAnonyName; if (!szAnonyPassword || _tcsicmp(szAnonyPassword, _T("")) == 0) {_tcscpy(szAnonyPassword,g_pTheApp->m_csGuestPassword);} g_pTheApp->m_csFTPAnonyPassword = szAnonyPassword; CreateIUSRAccount(g_pTheApp->m_csFTPAnonyName, g_pTheApp->m_csFTPAnonyPassword,&iUserWasNewlyCreated); } if (iForWhichUser == DO_IT_FOR_W3SVC_WAMUSER) { iisDebugOut((LOG_TYPE_WARN, _T("%s():FAIL WARNING: previous W3SVC iwam_ does not exist. creating a new one.\n"),MakeThisUserNameAndPasswordWork_log)); g_pTheApp->m_csWAMAccountName = szAnonyName; if (!szAnonyPassword || _tcsicmp(szAnonyPassword, _T("")) == 0) {_tcscpy(szAnonyPassword,g_pTheApp->m_csGuestPassword);} g_pTheApp->m_csWAMAccountPassword = szAnonyPassword; CreateIWAMAccount(g_pTheApp->m_csWAMAccountName,g_pTheApp->m_csWAMAccountPassword,&iUserWasNewlyCreated); } } } } MakeThisUserNameAndPasswordWork_Exit: if (iMetabaseUserExistsButCouldntGetPassword) { iMetabaseUpgradeScenarioSoOverWriteOnlyIfAlreadyThere = TRUE; } if (g_pTheApp->m_bUpgradeTypeHasMetabaseFlag) { iMetabaseUpgradeScenarioSoOverWriteOnlyIfAlreadyThere = TRUE; } if (iForWhichUser == DO_IT_FOR_W3SVC_ANONYMOUSUSER) { // ================ // LM/W3SVC/AnonymousUserName // LM/W3SVC/AnonymousPwd // ================ WriteToMD_AnonymousUserName_WWW(iMetabaseUpgradeScenarioSoOverWriteOnlyIfAlreadyThere); } if (iForWhichUser == DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER) { // ================ // LM/MSFTPSVC/AnonymousUserName // LM/MSFTPSVC/AnonymousPwd // ================ WriteToMD_AnonymousUserName_FTP(iMetabaseUpgradeScenarioSoOverWriteOnlyIfAlreadyThere); } if (iForWhichUser == DO_IT_FOR_W3SVC_WAMUSER) { // ================ // LM/W3SVC/WamUserName // LM/W3SVC/WamPwd // ================ WriteToMD_IWamUserName_WWW(); } iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s():End.ret=%d.\n"),MakeThisUserNameAndPasswordWork_log,iReturn)); return iReturn; } // // Returns true if it can get the ftp/WWW username and password from the metabase, // if it can then it will make sure that it can use that user <-- by creating it if it doesn't exist // #define CheckIfThisServerHasAUserThenUseIt_log _T("CheckIfThisServerHasAUserThenUseIt") int CheckIfThisServerHasAUserThenUseIt(int iForWhichUser) { int iReturn = FALSE; TCHAR szAnonyName[UNLEN+1]; TCHAR szAnonyPassword[PWLEN+1]; TCHAR szMetabasePath[_MAX_PATH]; int iMetabaseUserExistsButCouldntGetPassword = TRUE; // set defaults for the w3svc user int iMetabaseID_ForUserName = MD_ANONYMOUS_USER_NAME; int iMetabaseID_ForUserPassword = MD_ANONYMOUS_PWD; _tcscpy(szMetabasePath,_T("LM/W3SVC")); if (iForWhichUser == DO_IT_FOR_MSFTPSVC_ANONYMOUSUSER) { _tcscpy(szMetabasePath,_T("LM/MSFTPSVC")); iMetabaseID_ForUserName = MD_ANONYMOUS_USER_NAME; iMetabaseID_ForUserPassword = MD_ANONYMOUS_PWD; } if (iForWhichUser == DO_IT_FOR_W3SVC_WAMUSER) { _tcscpy(szMetabasePath,_T("LM/W3SVC")); iMetabaseID_ForUserName = MD_WAM_USER_NAME; iMetabaseID_ForUserPassword = MD_WAM_PWD; } iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s():Start:%s:whichuser=%d\n"),CheckIfThisServerHasAUserThenUseIt_log,szMetabasePath,iForWhichUser)); // See if it's already in the metabase if it is then use that. if (TRUE == GetDataFromMetabase(szMetabasePath, iMetabaseID_ForUserName, (PBYTE)szAnonyName, UNLEN+1)) { // Check if the username is null if (!szAnonyName) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("...GetDataFromMetabase:username is null.fail.\n"))); iReturn = FALSE; goto CheckIfThisServerHasAUserThenUseIt_Exit; } // Check if just contains nothing if (_tcsicmp(szAnonyName, _T("")) == 0) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("...GetDataFromMetabase:username is blank.fail.\n"))); iReturn = FALSE; goto CheckIfThisServerHasAUserThenUseIt_Exit; } // see if we can get the password too! iMetabaseUserExistsButCouldntGetPassword = TRUE; if (TRUE == GetDataFromMetabase(szMetabasePath, iMetabaseID_ForUserPassword, (PBYTE)szAnonyPassword, PWLEN+1)) { iMetabaseUserExistsButCouldntGetPassword = FALSE; } // Yes, we got the username and password. // let's see if they are valid... MakeThisUserNameAndPasswordWork(iForWhichUser, szAnonyName, szAnonyPassword, iMetabaseUserExistsButCouldntGetPassword, FALSE); iReturn = TRUE; } CheckIfThisServerHasAUserThenUseIt_Exit: iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s():End.ret=%d.\n"),CheckIfThisServerHasAUserThenUseIt_log,iReturn)); return iReturn; } #define CheckIfServerAHasAUserThenUseForServerB_log _T("CheckIfServerAHasAUserThenUseForServerB") int CheckIfServerAHasAUserThenUseForServerB(TCHAR *szServerAMetabasePath,int iServerBisWhichUser) { int iReturn = FALSE; TCHAR szAnonyName[UNLEN+1]; TCHAR szAnonyPassword[PWLEN+1]; int iMetabaseUserExistsButCouldntGetPassword = TRUE; iisDebugOut_Start(CheckIfServerAHasAUserThenUseForServerB_log); // see if www server has a user there, if it does then use that. // See if it's already in the metabase if it is then use that. if (TRUE == GetDataFromMetabase(szServerAMetabasePath, MD_ANONYMOUS_USER_NAME, (PBYTE)szAnonyName, UNLEN+1)) { // Check if the username is null if (!szAnonyName) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("...GetDataFromMetabase:username is null.fail.\n"))); iReturn = FALSE; goto CheckIfServerAHasAUserThenUseForServerB_Exit; } // Check if just contains nothing if (_tcsicmp(szAnonyName, _T("")) == 0) { iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("...GetDataFromMetabase:username is blank.fail.\n"))); iReturn = FALSE; goto CheckIfServerAHasAUserThenUseForServerB_Exit; } // see if we can get the password too! iMetabaseUserExistsButCouldntGetPassword = TRUE; if (TRUE == GetDataFromMetabase(szServerAMetabasePath, MD_ANONYMOUS_PWD, (PBYTE)szAnonyPassword, PWLEN+1)) { iMetabaseUserExistsButCouldntGetPassword = FALSE; } // Yes, we got the username and password. // let's see if they are valid... MakeThisUserNameAndPasswordWork(iServerBisWhichUser, szAnonyName, szAnonyPassword, iMetabaseUserExistsButCouldntGetPassword, FALSE); iReturn = TRUE; } CheckIfServerAHasAUserThenUseForServerB_Exit: iisDebugOut((LOG_TYPE_TRACE_WIN32_API, _T("%s():End.ret=%d.\n"),CheckIfServerAHasAUserThenUseForServerB_log,iReturn)); return iReturn; } #endif // _CHICAGO_