From e00710b16912043d041c8dbdf5ad0c19ac0afcda Mon Sep 17 00:00:00 2001 From: Jaymie Jeffrey Date: Tue, 24 Mar 2015 10:45:18 +0000 Subject: [PATCH 01/22] Inital Clone --- Moltin/bin/Release/Moltin.dll | Bin 10239 -> 10238 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Moltin/bin/Release/Moltin.dll b/Moltin/bin/Release/Moltin.dll index 697b5fa62ddf785a83ab8de6c693ee4e140a7054..c19fe9e1ab409df1b9066e97332892df1d2ae8ed 100644 GIT binary patch delta 10 RcmezG|IdFy>Bh27bpRpg1$Y1e delta 12 Tcmez8|KEQ?DI@R3(oS^%DQpFW From 216d9ca4e9a6eb521b9568d2e211d70b29511199 Mon Sep 17 00:00:00 2001 From: Jaymie Jeffrey Date: Tue, 24 Mar 2015 14:49:25 +0000 Subject: [PATCH 02/22] Removed redundant classes. --- Moltin/Authenticate.cs | 17 -- Moltin/Authenticate/ClientCredentials.cs | 61 ------ Moltin/IOAuthProvider.cs | 9 + Moltin/Moltin.csproj | 8 +- Moltin/OAuthHandler.cs | 57 ++++++ Moltin/OAuthProvider.cs | 27 +++ Moltin/Request.cs | 17 -- Moltin/Request/HttpRequest.cs | 105 ---------- Moltin/SDK.cs | 179 ------------------ Moltin/bin/Debug/Moltin.dll | Bin 0 -> 6655 bytes Moltin/bin/Debug/Moltin.pdb | Bin 0 -> 13823 bytes ...gnTimeResolveAssemblyReferencesInput.cache | Bin 0 -> 7175 bytes .../Debug/Moltin.csproj.FileListAbsolute.txt | 5 + ...oltin.csprojResolveAssemblyReference.cache | Bin 0 -> 35828 bytes Moltin/obj/Debug/Moltin.dll | Bin 0 -> 6655 bytes Moltin/obj/Debug/Moltin.pdb | Bin 0 -> 13823 bytes ...le_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs | 0 ...le_5937a670-0e60-4077-877b-f7221da3dda1.cs | 0 ...le_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs | 0 19 files changed, 101 insertions(+), 384 deletions(-) delete mode 100644 Moltin/Authenticate.cs delete mode 100644 Moltin/Authenticate/ClientCredentials.cs create mode 100644 Moltin/IOAuthProvider.cs create mode 100644 Moltin/OAuthHandler.cs create mode 100644 Moltin/OAuthProvider.cs delete mode 100644 Moltin/Request.cs delete mode 100644 Moltin/Request/HttpRequest.cs delete mode 100644 Moltin/SDK.cs create mode 100644 Moltin/bin/Debug/Moltin.dll create mode 100644 Moltin/bin/Debug/Moltin.pdb create mode 100644 Moltin/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache create mode 100644 Moltin/obj/Debug/Moltin.csproj.FileListAbsolute.txt create mode 100644 Moltin/obj/Debug/Moltin.csprojResolveAssemblyReference.cache create mode 100644 Moltin/obj/Debug/Moltin.dll create mode 100644 Moltin/obj/Debug/Moltin.pdb create mode 100644 Moltin/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs create mode 100644 Moltin/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs create mode 100644 Moltin/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs diff --git a/Moltin/Authenticate.cs b/Moltin/Authenticate.cs deleted file mode 100644 index 587bac1..0000000 --- a/Moltin/Authenticate.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Moltin -{ - public interface Authenticate - { - void authenticate(Dictionary args); - - void refresh(Dictionary args); - - string get(string key); - } -} diff --git a/Moltin/Authenticate/ClientCredentials.cs b/Moltin/Authenticate/ClientCredentials.cs deleted file mode 100644 index 5c10d08..0000000 --- a/Moltin/Authenticate/ClientCredentials.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web.Helpers; -using System.Web.Script.Serialization; - -namespace Moltin -{ - class ClientCredentials : Authenticate - { - protected Dictionary _data = new Dictionary(){ - {"token", null}, - {"refresh", null}, - {"expires", null} - }; - - public void authenticate(Dictionary args) - { - // Variables - string url = SDK.url + "oauth/access_token"; - Dictionary data = new Dictionary() { - {"grant_type", "client_credentials"}, - {"client_id", args["client_id"]}, - {"client_secret", args["client_secret"]} - }; - - // Make request - SDK.request.setup(url, "POST", data); - string result = SDK.request.make().Replace("\\\"", "'"); - - // Check response - JavaScriptSerializer jss = new JavaScriptSerializer(); - Dictionary json = jss.Deserialize>(result); - - // Check JSON for errors - if (json.ContainsKey("error")) - { - throw new System.ArgumentException(json["error"].ToString()); - } - - // Set data - data["token"] = json["token"].ToString(); - data["refresh"] = json["refresh"].ToString(); - data["expires"] = json["expires"].ToString(); - } - - public void refresh(Dictionary args) - { - authenticate(args); - } - - public string get(string key) - { - if (!_data.ContainsKey(key)) { return null; } - return _data[key]; - } - - } -} diff --git a/Moltin/IOAuthProvider.cs b/Moltin/IOAuthProvider.cs new file mode 100644 index 0000000..c1b15b1 --- /dev/null +++ b/Moltin/IOAuthProvider.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Moltin +{ + public interface IOAuthProvider + { + string NormalizeParameters(Dictionary parameters); + } +} diff --git a/Moltin/Moltin.csproj b/Moltin/Moltin.csproj index d019280..35f2b34 100644 --- a/Moltin/Moltin.csproj +++ b/Moltin/Moltin.csproj @@ -45,11 +45,9 @@ - - - - - + + + diff --git a/Moltin/OAuthHandler.cs b/Moltin/OAuthHandler.cs new file mode 100644 index 0000000..b88bea2 --- /dev/null +++ b/Moltin/OAuthHandler.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Net; + +namespace Moltin +{ + public class OAuthHandler + { + private readonly string apiKey; + private readonly string apiSecret; + + private readonly IOAuthProvider provider; + + public OAuthHandler(IOAuthProvider provider, string apiKey, string apiSecret) + { + this.provider = provider; + + this.apiKey = apiKey; + this.apiSecret = apiSecret; + } + + public string GetAccessToken(string requestTokenUrl) + { + var defaults = new Dictionary + { + { "grant_type", "client_credentials" }, + {"client_id", this.apiKey}, + {"client_secret", this.apiSecret} + }; + + var normalisedParameters = provider.NormalizeParameters(defaults); + + using (var client = new WebClient()) + { + client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); + + return client.UploadString(requestTokenUrl, "POST", normalisedParameters); + } + } + + public string Get(string url) + { + using (var client = new WebClient()) + return client.DownloadString(url); + } + + public string Post(string url, string parameters) + { + using (var client = new WebClient()) + { + client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); + + return client.UploadString(url, "POST", parameters); + } + } + } +} diff --git a/Moltin/OAuthProvider.cs b/Moltin/OAuthProvider.cs new file mode 100644 index 0000000..b64c716 --- /dev/null +++ b/Moltin/OAuthProvider.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Moltin +{ + public class OAuthProvider : IOAuthProvider + { + public string NormalizeParameters(Dictionary parameters) + { + var sb = new StringBuilder(); + + var i = 0; + foreach (var parameter in parameters.OrderBy(x => x.Key).ThenBy(x => x.Value).ToList()) + { + if (i > 0) + sb.Append("&"); + + sb.AppendFormat("{0}={1}", parameter.Key, parameter.Value); + + i++; + } + + return sb.ToString(); + } + } +} diff --git a/Moltin/Request.cs b/Moltin/Request.cs deleted file mode 100644 index d37f921..0000000 --- a/Moltin/Request.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Moltin -{ - public interface Request - { - void setup(string url, string method, Dictionary post = null, string token = null); - - string make(); - - string _randomString(int size); - } -} diff --git a/Moltin/Request/HttpRequest.cs b/Moltin/Request/HttpRequest.cs deleted file mode 100644 index 4672116..0000000 --- a/Moltin/Request/HttpRequest.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Net; - -namespace Moltin -{ - class HttpRequest : Request - { - protected static HttpWebRequest request; - protected static string session; - - public void Main() - { - session = _randomString(20); - } - - public void setup(string url, string method, Dictionary post = null, string token = null) - { - // Create client - request = (HttpWebRequest)WebRequest.Create(url); - request.Method = method; - request.Accept = "application/json"; - - // Add post data - if ( post != null ) - { - // Variables - string query = SDK.toQueryString(post); - byte[] bytes = Encoding.UTF8.GetBytes(query); - - // Add headers - request.ContentType = "application/x-www-form-urlencoded"; - request.ContentLength = bytes.Length; - - // Add to query - Stream stream = request.GetRequestStream(); - stream.Write(bytes, 0, bytes.Length); - stream.Close(); - } - - // Add OAuth header - if ( token != null ) - { - request.Headers["Authorization"] = "Bearer " + token; - } - - // Add session header - request.Headers["X-Moltin-Session"] = session; - } - - public string make() - { - // Variables - WebResponse response; - - try - { - // Make request - response = request.GetResponse(); - } - catch (WebException ex) - { - // Get response anyway - response = ex.Response as WebResponse; - } - - // Read response - StreamReader reader = new StreamReader(response.GetResponseStream()); - string result = reader.ReadToEnd().Trim().Replace("\\\"", "'"); - - // Clean up - reader.Close(); - response.Close(); - - // DEBUG - Console.WriteLine(result); - - // Send back cleaned string - return result; - } - - public string _randomString(int size) - { - // Variables - Random random = new Random((int)DateTime.Now.Ticks); - StringBuilder builder = new StringBuilder(); - char ch; - - // Loop and build string - for (int i = 0; i < size; i++) - { - ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); - builder.Append(ch); - } - - // Send back formatted string - return builder.ToString(); - } - - } -} diff --git a/Moltin/SDK.cs b/Moltin/SDK.cs deleted file mode 100644 index 838db3d..0000000 --- a/Moltin/SDK.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web; -using System.Web.Helpers; -using System.Web.Script.Serialization; - -namespace Moltin -{ - public class SDK - { - // Paths - public static string version = "beta"; - public static string url = "https://api.molt.in/"; - public static string auth_url = "http://auth.molt.in/"; - - // Variables - public static string[] methods = new string[4] { "GET", "POST", "PUT", "DELETE" }; - public static Dictionary store; - public static Request request; - public static Authenticate auth; - - // OAuth - protected static string _token; - protected static string _refresh; - protected static string _expires; - - public SDK(string reqClass, string authClass, Dictionary args = null) - { - // Create objects - request = (Request)System.Activator.CreateInstance(Type.GetType("Moltin."+reqClass)); - auth = (Authenticate)System.Activator.CreateInstance(Type.GetType("Moltin." + authClass)); - - // Check for args - if (args != null) - { - // Check for version - if (args.ContainsKey("version")) { version = args["version"]; } - - // Get information from store - if (args.ContainsKey("token")) { _token = store["token"]; } - if (args.ContainsKey("refresh")) { _refresh = store["refresh"]; } - if (args.ContainsKey("expires")) { _expires = store["expires"]; } - } - } - - public bool authenticate(Dictionary args = null) - { - // Variables - DateTime expires = ( _expires != null ? DateTime.Parse(_expires) : DateTime.Now ); - - // Skip for active auth or refresh current - if (expires.Year > 0 && expires > DateTime.Now) { return true; } - else if (expires.Year > 0 && expires < DateTime.Now) { return refresh(args); } - - // Perform authentication - auth.authenticate(args); - - // Store - _storeToken(); - - return (_token == null ? false : true); - } - - public bool refresh(Dictionary args = null) - { - // Perform refresh - auth.refresh(args); - - // Store - _storeToken(); - - return (_token == null ? false : true); - } - - public static string toQueryString(Dictionary data) - { - // Variables - string uri = ""; - - // Loop dictionary - foreach (KeyValuePair entry in data) - { - uri += HttpUtility.UrlEncode(entry.Key) + "=" + HttpUtility.UrlEncode(entry.Value) + "&"; - } - - // Return new URI - return uri.Remove(uri.Length - 1); - } - - public Dictionary get(string uri, Dictionary post = null) - { - uri = url+version+"/"+uri; - return _request(uri, "GET", post); - } - - public Dictionary post(string uri, Dictionary post = null) - { - uri = url + version + "/" + uri; - return _request(uri, "POST", post); - } - - public Dictionary put(string uri, Dictionary post = null) - { - uri = url + version + "/" + uri; - return _request(uri, "PUT", post); - } - - public Dictionary delete(string uri, Dictionary post = null) - { - uri = url + version + "/" + uri; - return _request(uri, "DELETE", post); - } - - protected void _storeToken() - { - // Get data - _token = auth.get("token"); - _refresh = auth.get("refresh"); - _expires = auth.get("expires"); - - // TODO: Add to longer-term storage - store["token"] = _token; - store["refresh"] = _refresh; - store["expires"] = _expires; - } - - protected Dictionary _request(string url, string method, Dictionary data) - { - // Check type - if (!methods.Contains(method)) - { - throw new System.ArgumentException("Invalid request type (" + method + ")"); - } - - // Check token - if (_token == null) - { - throw new System.ArgumentException("You haven't authenticated yet"); - } - - // Check token expiration - if (DateTime.Parse(_expires).Year > 0 && DateTime.Now > DateTime.Parse(_expires)) - { - throw new System.ArgumentException("Your current OAuth session has expired"); - } - - // Append URL - if (method == "GET" && data.Count > 0) - { - url += "?" + toQueryString(data); - data = null; - } - - // Start request - request.setup(url, method, data, _token); - - // Make request - string result = request.make(); - - // Check response - JavaScriptSerializer jss = new JavaScriptSerializer(); - Dictionary json = jss.Deserialize>(result); - - // Check JSON for error - if (json.ContainsKey("status") && json["status"] == "true" ) - { - string error = ( json.ContainsKey("errors") ? String.Join("\r\n", json["errors"]) : json["error"].ToString() ); - throw new System.ArgumentException(error); - } - - // Return response - return json; - } - - } -} diff --git a/Moltin/bin/Debug/Moltin.dll b/Moltin/bin/Debug/Moltin.dll new file mode 100644 index 0000000000000000000000000000000000000000..c49e7e69c08f277ee982b85839b0e752d10eac20 GIT binary patch literal 6655 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 literal 0 HcmV?d00001 diff --git a/Moltin/bin/Debug/Moltin.pdb b/Moltin/bin/Debug/Moltin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0916c8c0f2b4e79bffec0c001d287f348d89df71 GIT binary patch literal 13823 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 R$Z3kc!|nk3kX)vH{uivid@BF| literal 0 HcmV?d00001 diff --git a/Moltin/obj/Debug/Moltin.dll b/Moltin/obj/Debug/Moltin.dll new file mode 100644 index 0000000000000000000000000000000000000000..c49e7e69c08f277ee982b85839b0e752d10eac20 GIT binary patch literal 6655 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 literal 0 HcmV?d00001 diff --git a/Moltin/obj/Debug/Moltin.pdb b/Moltin/obj/Debug/Moltin.pdb new file mode 100644 index 0000000000000000000000000000000000000000..0916c8c0f2b4e79bffec0c001d287f348d89df71 GIT binary patch literal 13823 zcmeHNYiv|S6rL?*X(_KoUV_%O6ey2ww@`Tnp${mp7AOS+T2r>$Te|Ib7k0NIs7XcC zpfy&-A0&{7_(+7H34|DwSQ8{jAR1AL{vjGPh=zy3gdYa{zL~l0Z7nSn(m;Dpd+xb2 z=P_r_%sn%A?iL38k#ICz5p(BdPxE-aeMinM7JxYUFGk^Z8_R%^irCj~ z5P`<)HuU5OOc&y6PwszD?|ahmOb6zG5Q8*Ia{YQdXsu&$OB%{kiVl&hgwG%np8x9iBf#oPb*{X18~992%* z`O@RAic_w`6Y!#tu<-Dj4?@}Bly5FLcq#Y$=OZ6(=eCis;;XFFHCw00j-3B9BO&kL zJXLF7@Ae4Xsqz2lVERAn)8E=uy?gwbL2qCA`)=>I?O)3Xys39{CT+>JOWidB*DhYW z$e|y^i+^Ux%BT^EmMrpZtO*z;bHo1H8Y2{omdp>t7SxuN_@kA+$h!1sd38x)I2a3r zN|xr-#wwRZ!cPUtjflq|l}2i%kt$`RyvfMgK&-N*ks4(r?1PbY79*W?WPvYK9#nq7 zM5o-SY&OwH4>}jKSAYyrKJX-v&|8sv`a0@YuVXKI@YByb&&{m()}hnDP4@|(2L#_0 zsOQvLj87Vnwx4{o=*%kIGk%OCc?Qq~#?zFoDX7{(S=yp3c~)5zZMee`;MjS@1Q*R7 z(6%4almz1|hgHrCk3SZU2r*3ba#8PDpeaj!vPgBUEZ!K688x1~a4=~2V}Woe>X~nZ zj7Y#Q23Yt@j2LV?#bgm5|Mi^nNB6J(apC7<65~GGb6^cji9#_KJj^W^W?S56a;_*Xb9 z15Ff*g?TflCKmu&lF_y!HcyTspGRliV-JnIF4}&fT zO#!V0O$FTudg0==x>q%=2OW!g<-)eNeWX)QlX6z=TdBV;vD=ozXV&;Tnkfpw<(@{})fzW!kYpq*hJdK&Fow&Kg2Ia#)=;?c|(B3ed&RIaqv2c$gK z9r$<_n1k{-_{@IM4^&y&5n`R0QBi+ud2d9E*fJksdh7Y@kUSJQhRiDxnD3aMm|x~# z-6EKJYV14KTaKJ#>ivrwH3p8Ru|&=km!yP1Hd6U736%Mkc{dT%^n$f`qnH(Ov;?sH{(A7S_OZz?y40wgj{z%7OL3_kf(EXMqW(0Pbz* zTm*QgKQb}n@-nDT!lcI7%V(-kQ-+xMnx-c;O++Q@-`8dC(^*c}^fyge*B*4l|DP@& zyjy^d?B6c`7F@Xr(S9Au;Mr}4TZ~1sV%OiXXMB!RfnMM&-~u4`j%$EHpbcFgfx%*o zT-)Q(v_q&DykTOzrOrE*uRvZb*vVR!?@tcV>ct9mrk>(!y(!#hH@6WdZoG*!_32BT z(E3xG^|`0Iv3_P#`$|shPvd)lYM*?|28jHkf#RLbjp$em6*-v^i+(j<|l z*C{@iTyH;l=5&*QI!5-$V`P1LE3&e@xw$i@ahZ_NzWsi}jTZ&N7HvQKxwh?_$J8Q! z#yszooEbULNk8PdOrHqmnT9Hct^L z^_LZnrr%ren@oa^A;*h4q?DyL{|I@&J9Bb=`(FXf?+Usr(m#2j;|lu9PN@54zJ1rF z5oquCUthqJ3>?Z-FAP Date: Wed, 25 Mar 2015 16:54:44 +0000 Subject: [PATCH 03/22] Created a Token class to hold the relevant authorisation data. Added JSON.net to the project to allow the API calls to return JTokens. --- Moltin/IOAuthProvider.cs | 4 +- Moltin/Model/Token.cs | 10 + Moltin/Moltin.csproj | 8 + Moltin/OAuthHandler.cs | 115 +- Moltin/OAuthProvider.cs | 22 +- Moltin/bin/Debug/Moltin.dll | Bin 6655 -> 8191 bytes Moltin/bin/Debug/Moltin.pdb | Bin 13823 -> 17919 bytes Moltin/bin/Debug/Newtonsoft.Json.dll | Bin 0 -> 513529 bytes Moltin/bin/Debug/Newtonsoft.Json.xml | 8777 +++++++++++++++++ ...gnTimeResolveAssemblyReferencesInput.cache | Bin 7175 -> 7352 bytes .../Debug/Moltin.csproj.FileListAbsolute.txt | 2 + ...oltin.csprojResolveAssemblyReference.cache | Bin 35828 -> 41268 bytes Moltin/obj/Debug/Moltin.dll | Bin 6655 -> 8191 bytes Moltin/obj/Debug/Moltin.pdb | Bin 13823 -> 17919 bytes Moltin/packages.config | 4 + 15 files changed, 8919 insertions(+), 23 deletions(-) create mode 100644 Moltin/Model/Token.cs create mode 100644 Moltin/bin/Debug/Newtonsoft.Json.dll create mode 100644 Moltin/bin/Debug/Newtonsoft.Json.xml create mode 100644 Moltin/packages.config diff --git a/Moltin/IOAuthProvider.cs b/Moltin/IOAuthProvider.cs index c1b15b1..4c63157 100644 --- a/Moltin/IOAuthProvider.cs +++ b/Moltin/IOAuthProvider.cs @@ -1,9 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace Moltin { public interface IOAuthProvider { string NormalizeParameters(Dictionary parameters); + DateTime UnixTimeStampToDateTime(double unixTimeStamp); } } diff --git a/Moltin/Model/Token.cs b/Moltin/Model/Token.cs new file mode 100644 index 0000000..142268a --- /dev/null +++ b/Moltin/Model/Token.cs @@ -0,0 +1,10 @@ +using System; + +namespace Moltin.Model +{ + public class Token + { + public string AccessToken { get; set; } + public DateTime Expires { get; set; } + } +} diff --git a/Moltin/Moltin.csproj b/Moltin/Moltin.csproj index 35f2b34..a2f6fc8 100644 --- a/Moltin/Moltin.csproj +++ b/Moltin/Moltin.csproj @@ -30,6 +30,10 @@ 4 + + False + ..\..\Kudos\packages\Newtonsoft.Json.6.0.8\lib\net45\Newtonsoft.Json.dll + @@ -46,10 +50,14 @@ + + + +