public override void InitForConfiguration(ref string locationSubPath, out string configPath, out string locationConfigPath, IInternalConfigRoot root, params object[] hostInitConfigurationParams) { WebLevel webLevel = (WebLevel)hostInitConfigurationParams[0]; // ConfigurationFileMap fileMap = (ConfigurationFileMap) hostInitConfigurationParams[1]; string path = (string)hostInitConfigurationParams[2]; string site = (string)hostInitConfigurationParams[3]; if (locationSubPath == null) { locationSubPath = (string)hostInitConfigurationParams[4]; } string server = (string)hostInitConfigurationParams[5]; string userName = (string)hostInitConfigurationParams[6]; string password = (string)hostInitConfigurationParams[7]; IntPtr tokenHandle = (IntPtr)hostInitConfigurationParams[8]; configPath = null; locationConfigPath = null; _Server = server; _Username = GetUserNameFromFullName(userName); _Domain = GetDomainFromFullName(userName); _Password = password; _Identity = (tokenHandle == IntPtr.Zero) ? null : new WindowsIdentity(tokenHandle); //CreateWindowsIdentity(username, domain, password, tokenHandle); _PathMap = new Hashtable(StringComparer.OrdinalIgnoreCase); #if !FEATURE_PAL // FEATURE_PAL does not have WindowsImpersonationContext, COM objects // // Send the path arguments to the server for parsing, // and retreive the normalized paths and path mapping // from config paths to file paths. // string filePaths; try { WindowsImpersonationContext wiContext = (_Identity != null) ? _Identity.Impersonate() : null; try { IRemoteWebConfigurationHostServer remoteSrv = RemoteWebConfigurationHost.CreateRemoteObject(server, _Username, _Domain, password); //(IRemoteWebConfigurationHostServer) Activator.CreateInstance(type); try { filePaths = remoteSrv.GetFilePaths((int)webLevel, path, site, locationSubPath); } finally { // Release COM objects while (Marshal.ReleaseComObject(remoteSrv) > 0) { } } } finally { if (wiContext != null) { wiContext.Undo(); } } } catch { // Wrap finally clause with a try to avoid exception clauses being run // while the thread is impersonated. throw; } if (filePaths == null) { throw ExceptionUtil.UnexpectedError("RemoteWebConfigurationHost::InitForConfiguration"); } // // Format of filePaths: // appPath < appSiteName < appSiteID < configPath < locationConfigPath [< configPath < fileName]+ // string[] parts = filePaths.Split(RemoteWebConfigurationHostServer.FilePathsSeparatorParams); if (parts.Length < 7 || (parts.Length - 5) % 2 != 0) { throw ExceptionUtil.UnexpectedError("RemoteWebConfigurationHost::InitForConfiguration"); } // convert empty strings to nulls for (int i = 0; i < parts.Length; i++) { if (parts[i].Length == 0) { parts[i] = null; } } // get config paths string appPath = parts[0]; string appSiteName = parts[1]; string appSiteID = parts[2]; configPath = parts[3]; locationConfigPath = parts[4]; _ConfigPath = configPath; // Create a WebConfigurationFileMap to be used when we later initialize our delegating WebConfigurationHost WebConfigurationFileMap configFileMap = new WebConfigurationFileMap(); VirtualPath appPathVirtualPath = VirtualPath.CreateAbsoluteAllowNull(appPath); configFileMap.Site = appSiteID; // populate the configpath->physical path mapping for (int i = 5; i < parts.Length; i += 2) { string configPathTemp = parts[i]; string physicalFilePath = parts[i + 1]; _PathMap.Add(configPathTemp, physicalFilePath); // Update the WebConfigurationFileMap if (WebConfigurationHost.IsMachineConfigPath(configPathTemp)) { configFileMap.MachineConfigFilename = physicalFilePath; } else { string vPathString; bool isRootApp; if (WebConfigurationHost.IsRootWebConfigPath(configPathTemp)) { vPathString = null; isRootApp = false; } else { VirtualPath vPath; string dummy; WebConfigurationHost.GetSiteIDAndVPathFromConfigPath(configPathTemp, out dummy, out vPath); vPathString = VirtualPath.GetVirtualPathString(vPath); isRootApp = (vPath == appPathVirtualPath); } configFileMap.VirtualDirectories.Add(vPathString, new VirtualDirectoryMapping(Path.GetDirectoryName(physicalFilePath), isRootApp)); } } #else // !FEATURE_PAL: set dummy config path string appPath = null; _ConfigPath = configPath; #endif // !FEATURE_PAL // Delegate to a WebConfigurationHost for unhandled methods. WebConfigurationHost webConfigurationHost = new WebConfigurationHost(); webConfigurationHost.Init(root, true, new UserMapPath(configFileMap, /*pathsAreLocal*/ false), null, appPath, appSiteName, appSiteID); Host = webConfigurationHost; }
public override void InitForConfiguration(ref string locationSubPath, out string configPath, out string locationConfigPath, IInternalConfigRoot root, params object[] hostInitConfigurationParams) { string str6; WebLevel level = (WebLevel)hostInitConfigurationParams[0]; string str = (string)hostInitConfigurationParams[2]; string site = (string)hostInitConfigurationParams[3]; if (locationSubPath == null) { locationSubPath = (string)hostInitConfigurationParams[4]; } string str3 = (string)hostInitConfigurationParams[5]; string fullUserName = (string)hostInitConfigurationParams[6]; string password = (string)hostInitConfigurationParams[7]; IntPtr userToken = (IntPtr)hostInitConfigurationParams[8]; configPath = null; locationConfigPath = null; this._Server = str3; this._Username = GetUserNameFromFullName(fullUserName); this._Domain = GetDomainFromFullName(fullUserName); this._Password = password; this._Identity = (userToken == IntPtr.Zero) ? null : new WindowsIdentity(userToken); this._PathMap = new Hashtable(StringComparer.OrdinalIgnoreCase); try { WindowsImpersonationContext context = (this._Identity != null) ? this._Identity.Impersonate() : null; try { IRemoteWebConfigurationHostServer o = CreateRemoteObject(str3, this._Username, this._Domain, password); try { str6 = o.GetFilePaths((int)level, str, site, locationSubPath); } finally { while (Marshal.ReleaseComObject(o) > 0) { } } } finally { if (context != null) { context.Undo(); } } } catch { throw; } if (str6 == null) { throw System.Web.Util.ExceptionUtil.UnexpectedError("RemoteWebConfigurationHost::InitForConfiguration"); } string[] strArray = str6.Split(RemoteWebConfigurationHostServer.FilePathsSeparatorParams); if ((strArray.Length < 7) || (((strArray.Length - 5) % 2) != 0)) { throw System.Web.Util.ExceptionUtil.UnexpectedError("RemoteWebConfigurationHost::InitForConfiguration"); } for (int i = 0; i < strArray.Length; i++) { if (strArray[i].Length == 0) { strArray[i] = null; } } string virtualPath = strArray[0]; string str8 = strArray[1]; string str9 = strArray[2]; configPath = strArray[3]; locationConfigPath = strArray[4]; this._ConfigPath = configPath; WebConfigurationFileMap fileMap = new WebConfigurationFileMap(); VirtualPath path = VirtualPath.CreateAbsoluteAllowNull(virtualPath); fileMap.Site = str9; for (int j = 5; j < strArray.Length; j += 2) { string key = strArray[j]; string str11 = strArray[j + 1]; this._PathMap.Add(key, str11); if (WebConfigurationHost.IsMachineConfigPath(key)) { fileMap.MachineConfigFilename = str11; } else { string virtualPathString; bool flag; if (WebConfigurationHost.IsRootWebConfigPath(key)) { virtualPathString = null; flag = false; } else { VirtualPath path2; string str13; WebConfigurationHost.GetSiteIDAndVPathFromConfigPath(key, out str13, out path2); virtualPathString = VirtualPath.GetVirtualPathString(path2); flag = path2 == path; } fileMap.VirtualDirectories.Add(virtualPathString, new VirtualDirectoryMapping(Path.GetDirectoryName(str11), flag)); } } WebConfigurationHost host = new WebConfigurationHost(); object[] hostInitParams = new object[6]; hostInitParams[0] = true; hostInitParams[1] = new UserMapPath(fileMap, false); hostInitParams[3] = virtualPath; hostInitParams[4] = str8; hostInitParams[5] = str9; host.Init(root, hostInitParams); base.Host = host; }