diff --git a/ShareX.UploadersLib/FileUploaders/GoogleDrive.cs b/ShareX.UploadersLib/FileUploaders/GoogleDrive.cs index 0a8928102..8a59b592a 100644 --- a/ShareX.UploadersLib/FileUploaders/GoogleDrive.cs +++ b/ShareX.UploadersLib/FileUploaders/GoogleDrive.cs @@ -45,8 +45,13 @@ public GoogleDrive(OAuth2Info oauth) public string GetAuthorizationURL() { - return string.Format("https://accounts.google.com/o/oauth2/auth?response_type={0}&client_id={1}&redirect_uri={2}&scope={3}", - "code", AuthInfo.Client_ID, "urn:ietf:wg:oauth:2.0:oob", URLHelpers.URLEncode("https://www.googleapis.com/auth/drive")); + Dictionary args = new Dictionary(); + args.Add("response_type", "code"); + args.Add("client_id", AuthInfo.Client_ID); + args.Add("redirect_uri", "urn:ietf:wg:oauth:2.0:oob"); + args.Add("scope", "https://www.googleapis.com/auth/drive"); + + return CreateQuery("https://accounts.google.com/o/oauth2/auth", args); } public bool GetAccessToken(string code) @@ -105,13 +110,6 @@ public bool RefreshAccessToken() return false; } - private NameValueCollection GetAuthHeaders() - { - NameValueCollection headers = new NameValueCollection(); - headers.Add("Authorization", "Bearer " + AuthInfo.Token.access_token); - return headers; - } - public bool CheckAuthorization() { if (OAuth2Info.CheckOAuth(AuthInfo)) @@ -131,6 +129,13 @@ public bool CheckAuthorization() return true; } + private NameValueCollection GetAuthHeaders() + { + NameValueCollection headers = new NameValueCollection(); + headers.Add("Authorization", "Bearer " + AuthInfo.Token.access_token); + return headers; + } + private void SetMetadata(string fileID, string title, string parentID = null) { string url = string.Format("https://www.googleapis.com/drive/v2/files/{0}", fileID); diff --git a/ShareX.UploadersLib/FileUploaders/OneDrive.cs b/ShareX.UploadersLib/FileUploaders/OneDrive.cs new file mode 100644 index 000000000..8f6ec20a4 --- /dev/null +++ b/ShareX.UploadersLib/FileUploaders/OneDrive.cs @@ -0,0 +1,139 @@ +#region License Information (GPL v3) + +/* + ShareX - A program that allows you to take screenshots and share any file type + Copyright (C) 2007-2014 ShareX Developers + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + Optionally you can also view the license at . +*/ + +#endregion License Information (GPL v3) + +using Newtonsoft.Json; +using ShareX.HelpersLib; +using ShareX.UploadersLib.HelperClasses; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace ShareX.UploadersLib.FileUploaders +{ + public sealed class OneDrive : FileUploader, IOAuth2 + { + public OAuth2Info AuthInfo { get; set; } + public string FolderID { get; set; } + + public OneDrive(OAuth2Info authInfo) + { + AuthInfo = authInfo; + } + + public string GetAuthorizationURL() + { + Dictionary args = new Dictionary(); + args.Add("client_id", AuthInfo.Client_ID); + args.Add("scope", "wl.offline_access wl.basic wl.skydrive_update"); + args.Add("response_type", "code"); + args.Add("redirect_uri", Links.URL_CALLBACK); + + return CreateQuery("https://login.live.com/oauth20_authorize.srf", args); + } + + public bool GetAccessToken(string code) + { + Dictionary args = new Dictionary(); + args.Add("client_id", AuthInfo.Client_ID); + args.Add("redirect_uri", Links.URL_CALLBACK); + args.Add("client_secret", AuthInfo.Client_Secret); + args.Add("code", code); + args.Add("grant_type", "authorization_code"); + + string response = SendRequestURLEncoded("https://login.live.com/oauth20_token.srf", args); + + if (!string.IsNullOrEmpty(response)) + { + OAuth2Token token = JsonConvert.DeserializeObject(response); + + if (token != null && !string.IsNullOrEmpty(token.access_token)) + { + token.UpdateExpireDate(); + AuthInfo.Token = token; + return true; + } + } + + return false; + } + + public bool RefreshAccessToken() + { + if (OAuth2Info.CheckOAuth(AuthInfo) && !string.IsNullOrEmpty(AuthInfo.Token.refresh_token)) + { + Dictionary args = new Dictionary(); + args.Add("client_id", AuthInfo.Client_ID); + args.Add("redirect_uri", Links.URL_CALLBACK); + args.Add("client_secret", AuthInfo.Client_Secret); + args.Add("refresh_token", AuthInfo.Token.refresh_token); + args.Add("grant_type", "refresh_token"); + + string response = SendRequestURLEncoded("https://login.live.com/oauth20_token.srf", args); + + if (!string.IsNullOrEmpty(response)) + { + OAuth2Token token = JsonConvert.DeserializeObject(response); + + if (token != null && !string.IsNullOrEmpty(token.access_token)) + { + token.UpdateExpireDate(); + string refresh_token = AuthInfo.Token.refresh_token; + AuthInfo.Token = token; + AuthInfo.Token.refresh_token = refresh_token; + return true; + } + } + } + + return false; + } + + public bool CheckAuthorization() + { + if (OAuth2Info.CheckOAuth(AuthInfo)) + { + if (AuthInfo.Token.IsExpired && !RefreshAccessToken()) + { + Errors.Add("Refresh access token failed."); + return false; + } + } + else + { + Errors.Add("Login is required."); + return false; + } + + return true; + } + + public override UploadResult Upload(Stream stream, string fileName) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/ShareX.UploadersLib/Forms/UploadersConfigForm.Designer.cs b/ShareX.UploadersLib/Forms/UploadersConfigForm.Designer.cs index a64de01ab..48f4839e9 100644 --- a/ShareX.UploadersLib/Forms/UploadersConfigForm.Designer.cs +++ b/ShareX.UploadersLib/Forms/UploadersConfigForm.Designer.cs @@ -1547,12 +1547,12 @@ private void InitializeComponent() // // oAuth2OneDrive // - this.oAuth2OneDrive.IsRefreshable = false; resources.ApplyResources(this.oAuth2OneDrive, "oAuth2OneDrive"); this.oAuth2OneDrive.Name = "oAuth2OneDrive"; this.oAuth2OneDrive.OpenButtonClicked += new ShareX.UploadersLib.OAuthControl.OpenButtonClickedEventHandler(this.oAuth2OneDrive_OpenButtonClicked); this.oAuth2OneDrive.CompleteButtonClicked += new ShareX.UploadersLib.OAuthControl.CompleteButtonClickedEventHandler(this.oAuth2OneDrive_CompleteButtonClicked); this.oAuth2OneDrive.ClearButtonClicked += new ShareX.UploadersLib.OAuthControl.ClearButtonclickedEventHandler(this.oAuth2OneDrive_ClearButtonClicked); + this.oAuth2OneDrive.RefreshButtonClicked += new ShareX.UploadersLib.OAuthControl.RefreshButtonClickedEventHandler(this.oAuth2OneDrive_RefreshButtonClicked); // // tpAmazonS3 // diff --git a/ShareX.UploadersLib/Forms/UploadersConfigForm.cs b/ShareX.UploadersLib/Forms/UploadersConfigForm.cs index 0fe8ce374..93ed1a0cf 100644 --- a/ShareX.UploadersLib/Forms/UploadersConfigForm.cs +++ b/ShareX.UploadersLib/Forms/UploadersConfigForm.cs @@ -50,7 +50,7 @@ public UploadersConfigForm(UploadersConfig uploadersConfig) InitializeComponent(); // TODO: Add OneDrive support - tcFileUploaders.TabPages.Remove(tpOneDrive); + //tcFileUploaders.TabPages.Remove(tpOneDrive); if (!string.IsNullOrEmpty(Config.FilePath)) { @@ -332,6 +332,13 @@ public void LoadSettings(UploadersConfig uploadersConfig) txtGoogleDriveFolderID.Enabled = Config.GoogleDriveUseFolder; txtGoogleDriveFolderID.Text = Config.GoogleDriveFolderID; + // One Drive + + if (OAuth2Info.CheckOAuth(Config.OneDriveOAuth2Info)) + { + oAuth2OneDrive.Status = OAuthLoginStatus.LoginSuccessful; + } + // Minus cbMinusURLType.Items.Clear(); @@ -1774,6 +1781,11 @@ private void oAuth2OneDrive_CompleteButtonClicked(string code) OneDriveAuthComplete(code); } + private void oAuth2OneDrive_RefreshButtonClicked() + { + OneDriveAuthRefresh(); + } + private void oAuth2OneDrive_ClearButtonClicked() { Config.OneDriveOAuth2Info = null; diff --git a/ShareX.UploadersLib/Forms/UploadersConfigForm.resx b/ShareX.UploadersLib/Forms/UploadersConfigForm.resx index 20628662d..9073cc19e 100644 --- a/ShareX.UploadersLib/Forms/UploadersConfigForm.resx +++ b/ShareX.UploadersLib/Forms/UploadersConfigForm.resx @@ -1,4 +1,4 @@ - +