public IBuildServerCredentials GetBuildServerCredentials(IBuildServerAdapter buildServerAdapter, bool useStoredCredentialsIfExisting) { lock (buildServerCredentialsLock) { IBuildServerCredentials buildServerCredentials = new BuildServerCredentials { UseGuestAccess = true }; const string CredentialsConfigName = "Credentials"; const string UseGuestAccessKey = "UseGuestAccess"; const string UsernameKey = "Username"; const string PasswordKey = "Password"; using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Read, FileShare.Read)) { if (stream.Position < stream.Length) { var protectedData = new byte[stream.Length]; stream.Read(protectedData, 0, (int)stream.Length); try { byte[] unprotectedData = ProtectedData.Unprotect(protectedData, null, DataProtectionScope.CurrentUser); using (var memoryStream = new MemoryStream(unprotectedData)) { ConfigFile credentialsConfig = new ConfigFile("", false); using (var textReader = new StreamReader(memoryStream, Encoding.UTF8)) { credentialsConfig.LoadFromString(textReader.ReadToEnd()); } ConfigSection section = credentialsConfig.FindConfigSection(CredentialsConfigName); if (section != null) { buildServerCredentials.UseGuestAccess = section.GetValueAsBool(UseGuestAccessKey, true); buildServerCredentials.Username = section.GetValue(UsernameKey); buildServerCredentials.Password = section.GetValue(PasswordKey); if (useStoredCredentialsIfExisting) { return buildServerCredentials; } } } } catch (CryptographicException) { // As per MSDN, the ProtectedData.Unprotect method is per user, // it will throw the CryptographicException if the current user // is not the one who protected the data. // Set this variable to false so the user can reset the credentials. useStoredCredentialsIfExisting = false; } } } if (!useStoredCredentialsIfExisting) { buildServerCredentials = ShowBuildServerCredentialsForm(buildServerAdapter.UniqueKey, buildServerCredentials); if (buildServerCredentials != null) { ConfigFile credentialsConfig = new ConfigFile("", true); ConfigSection section = credentialsConfig.FindOrCreateConfigSection(CredentialsConfigName); section.SetValueAsBool(UseGuestAccessKey, buildServerCredentials.UseGuestAccess); section.SetValue(UsernameKey, buildServerCredentials.Username); section.SetValue(PasswordKey, buildServerCredentials.Password); using (var stream = GetBuildServerOptionsIsolatedStorageStream(buildServerAdapter, FileAccess.Write, FileShare.None)) { using (var memoryStream = new MemoryStream()) { using (var textWriter = new StreamWriter(memoryStream, Encoding.UTF8)) { textWriter.Write(credentialsConfig.GetAsString()); } var protectedData = ProtectedData.Protect(memoryStream.ToArray(), null, DataProtectionScope.CurrentUser); stream.Write(protectedData, 0, protectedData.Length); } } return buildServerCredentials; } } return null; } }
public static IEnumerable<ReleaseVersion> Parse(string versionsStr) { ConfigFile cfg = new ConfigFile("", true); cfg.LoadFromString(versionsStr); var sections = cfg.GetConfigSections("Version"); return sections.Select(FromSection).Where(version => version != null); }