using System; using System.Collections.Generic; using System.Text; using System.IO; namespace FastReport.Cloud.OAuth { /// /// Represents parser for parse OAuth responses. /// public static class Parser { #region Private Methods private static Dictionary ParseParameters(Stream stream) { Dictionary parsedParameters = new Dictionary(); StreamReader reader = new StreamReader(stream); string data = reader.ReadToEnd(); if (!String.IsNullOrEmpty(data)) { string[] parameters = data.Split('&'); foreach (string param in parameters) { string[] pair = param.Split('='); parsedParameters.Add(pair[0], pair[1]); } } return parsedParameters; } private static string ClearJsonString(string str) { str = str.Trim(); int firstIndex = str.IndexOf("\""); int lastIndex = str.LastIndexOf("\""); if (firstIndex != -1 && lastIndex != -1) { str = str.Substring(firstIndex + 1, lastIndex - firstIndex - 1); } return str; } private static Dictionary ParseJsonParameters(Stream stream) { Dictionary parsedParameters = new Dictionary(); StreamReader reader = new StreamReader(stream); string data = reader.ReadToEnd(); if (!String.IsNullOrEmpty(data)) { string[] lines = data.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < lines.Length; i++) { string line = lines[i]; int index = line.IndexOf('{'); if (index > -1) { line = line.Remove(index, 1); } index = line.IndexOf('}'); if (index > -1) { line = line.Remove(index, 1); } string[] pairs = line.Split(','); for (int j = 0; j < pairs.Length; j++) { string[] pair = pairs[j].Split(':'); if (pair.Length == 2) { string key = ClearJsonString(pair[0]); string value = ClearJsonString(pair[1]); parsedParameters.Add(key, value); } } } } return parsedParameters; } #endregion // Private Methods #region Public Methods /// /// Parses token information in stream. /// /// The stream for parse. /// The OAuth token. public static Token ParseToken(Stream stream) { Dictionary parameters = ParseParameters(stream); return new Token(parameters["oauth_token"], parameters["oauth_token_secret"]); } /// /// Parses token information in stream for SkyDrive. /// /// The stream for parse. /// The SkyDrive access token. public static string ParseSkyDriveToken(Stream stream) { Dictionary parameters = ParseJsonParameters(stream); return Uri.UnescapeDataString(parameters["access_token"]); } /// /// Parses token information in stream for Google Drive. /// /// The stream for parse. /// The Google Drive access token. public static string ParseGoogleDriveToken(Stream stream) { Dictionary parameters = ParseJsonParameters(stream); return Uri.UnescapeDataString(parameters["access_token"]); } /// /// Parses token information in stream for FastCloud. /// /// The stream for parse. /// The FastCloud access token. public static string ParseFastCloudToken(Stream stream) { Dictionary parameters = ParseJsonParameters(stream); return Uri.UnescapeDataString(parameters["token"]); } #endregion // Public Methods } }