/// <summary> /// Attempts to parse a string as an Rdp setting /// </summary> /// <param name="rdpSettingString">The Rdp setting in string format</param> /// <param name="setting">The parsed RdpSetting</param> /// <returns>If parse was successful. There will be no cake.</returns> public static bool TryParse(string rdpSettingString, out RdpSetting setting) { setting = null; if (string.IsNullOrWhiteSpace(rdpSettingString)) { return(false); } Match regexMatch = SettingRegex.Match(rdpSettingString); if (!regexMatch.Success) { return(false); } string settingName = regexMatch.Groups[SettingNameGroupName].Value; char settingType = regexMatch.Groups[SettingTypeGroupName].Value[0]; string settingValue = regexMatch.Groups[SettingValueGroupName].Value; try { setting = new RdpSetting(settingName, settingType, settingValue); } catch (ArgumentException) { return(false); } return(true); }
/// <summary> /// Parses a string and converts each line into an rdp setting if it is valid /// </summary> /// <param name="data">The string to parse</param> /// <returns>A list of rdp settings</returns> private static List <RdpSetting> ParseSettings(string data) { List <RdpSetting> settings = new List <RdpSetting>(); if (string.IsNullOrWhiteSpace(data)) { return(settings); } using (StringReader reader = new StringReader(data)) { string line; while ((line = reader.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) { continue; } RdpSetting parsedSetting; if (RdpSetting.TryParse(line, out parsedSetting)) { settings.Add(parsedSetting); } } } return(settings); }
/// <summary> /// Checks if an alternate full address is supplied, if not, then all it. /// This stops people from adding a full address after the signing is done /// </summary> /// <param name="settings">The collection of settings to check and add to</param> private static void EnsureAlternateFullAddressExists(List <RdpSetting> settings) { if (settings.Any(x => x.SettingName.Equals(RdpSettingHelper.AlternateFullAddressSettingName, StringComparison.OrdinalIgnoreCase))) { return; } RdpSetting fullAddressSetting = settings.FirstOrDefault(x => x.SettingName.Equals(RdpSettingHelper.FullAddressSettingName, StringComparison.OrdinalIgnoreCase) ); if (fullAddressSetting == null) { throw new Exception("Supplied Rdp settings do not contain a '" + RdpSettingHelper.FullAddressSettingName + "' setting"); } settings.Add(new RdpSetting(RdpSettingHelper.AlternateFullAddressSettingName, fullAddressSetting.SettingType, fullAddressSetting.SettingValue)); }
/// <summary> /// Signs the provided rdp string /// </summary> /// <param name="rdpText">The string data inside an rdp file</param> /// <param name="signingCertificate">The certificate you wish to use when signing</param> /// <returns>The signed value within an rdp file</returns> public static string Sign(string rdpText, X509Certificate2 signingCertificate) { List <RdpSetting> settings = ParseSettings(rdpText); RemoveSignSettings(settings); EnsureAlternateFullAddressExists(settings); List <RdpSetting> settingsToSign = settings.Where(setting => setting.IsSignableSetting).ToList(); RdpSetting signScopeSetting = BuildSignScopeSetting(settingsToSign); settings.Add(signScopeSetting); settingsToSign.Add(signScopeSetting); RdpSetting signatureSetting = BuildSignatureSetting(settingsToSign, signingCertificate); settings.Add(signatureSetting); string signedRdpFile = FlattenSettings(settings); return(signedRdpFile); }