Basic implementation of OAuthListener

This commit is contained in:
Jaex 2022-12-07 16:18:16 +03:00
parent a9782a5112
commit 4ae7cc56a9
6 changed files with 80 additions and 19 deletions

View file

@ -57,16 +57,16 @@ public override GenericUploader CreateUploader(UploadersConfig config, TaskRefer
public sealed class YouTube : FileUploader, IOAuth2
{
public OAuth2Info AuthInfo => googleAuth.AuthInfo;
public OAuth2Info AuthInfo => OAuth2.AuthInfo;
public YouTubeVideoPrivacy PrivacyType { get; set; }
public bool UseShortenedLink { get; set; }
public bool ShowDialog { get; set; }
private GoogleOAuth2 googleAuth;
public GoogleOAuth2 OAuth2 { get; private set; }
public YouTube(OAuth2Info oauth)
{
googleAuth = new GoogleOAuth2(oauth, this)
OAuth2 = new GoogleOAuth2(oauth, this)
{
Scope = "https://www.googleapis.com/auth/youtube.upload"
};
@ -74,22 +74,22 @@ public YouTube(OAuth2Info oauth)
public bool RefreshAccessToken()
{
return googleAuth.RefreshAccessToken();
return OAuth2.RefreshAccessToken();
}
public bool CheckAuthorization()
{
return googleAuth.CheckAuthorization();
return OAuth2.CheckAuthorization();
}
public string GetAuthorizationURL()
{
return googleAuth.GetAuthorizationURL();
return OAuth2.GetAuthorizationURL();
}
public bool GetAccessToken(string code)
{
return googleAuth.GetAccessToken(code);
return OAuth2.GetAccessToken(code);
}
public override UploadResult Upload(Stream stream, string fileName)
@ -133,7 +133,7 @@ public override UploadResult Upload(Stream stream, string fileName)
string metadata = JsonConvert.SerializeObject(uploadVideo);
UploadResult result = SendRequestFile("https://www.googleapis.com/upload/youtube/v3/videos?part=id,snippet,status", stream, fileName, "file",
headers: googleAuth.GetAuthHeaders(), relatedData: metadata);
headers: OAuth2.GetAuthHeaders(), relatedData: metadata);
if (!string.IsNullOrEmpty(result.Response))
{

View file

@ -3041,10 +3041,17 @@ private void txtGfycatTitle_TextChanged(object sender, EventArgs e)
#region YouTube
private void oauth2YouTube_OpenButtonClicked()
private async void oauth2YouTube_OpenButtonClicked()
{
OAuth2Info oauth = new OAuth2Info(APIKeys.GoogleClientID, APIKeys.GoogleClientSecret);
Config.YouTubeOAuth2Info = OAuth2Open(new YouTube(oauth));
GoogleOAuth2 oauthGoogle = new YouTube(oauth).OAuth2;
OAuthListener listener = new OAuthListener(oauthGoogle);
bool result = await listener.ConnectAsync();
if (result)
{
Config.YouTubeOAuth2Info = listener.OAuth.AuthInfo;
}
ConfigureOAuthStatus(oauth2YouTube, result);
}
private void oauth2YouTube_CompleteButtonClicked(string code)

View file

@ -30,15 +30,15 @@
namespace ShareX.UploadersLib
{
public class GoogleOAuth2 : IOAuth2
public class GoogleOAuth2 : IOAuth2Loopback
{
private const string AuthorizationEndpoint = "https://accounts.google.com/o/oauth2/v2/auth";
private const string TokenEndpoint = "https://oauth2.googleapis.com/token";
private const string UserInfoEndpoint = "https://www.googleapis.com/oauth2/v3/userinfo";
private const string RedirectMethod = "urn:ietf:wg:oauth:2.0:oob"; // Manual copy-paste method
public OAuth2Info AuthInfo { get; private set; }
private Uploader GoogleUploader { get; set; }
public string RedirectURI { get; set; }
public string Scope { get; set; }
public GoogleOAuth2(OAuth2Info oauth, Uploader uploader)
@ -52,7 +52,7 @@ public string GetAuthorizationURL()
Dictionary<string, string> args = new Dictionary<string, string>();
args.Add("response_type", "code");
args.Add("client_id", AuthInfo.Client_ID);
args.Add("redirect_uri", RedirectMethod);
args.Add("redirect_uri", RedirectURI);
args.Add("scope", Scope);
return URLHelpers.CreateQueryString(AuthorizationEndpoint, args);
@ -64,7 +64,7 @@ public bool GetAccessToken(string code)
args.Add("code", code);
args.Add("client_id", AuthInfo.Client_ID);
args.Add("client_secret", AuthInfo.Client_Secret);
args.Add("redirect_uri", RedirectMethod);
args.Add("redirect_uri", RedirectURI);
args.Add("grant_type", "authorization_code");
string response = GoogleUploader.SendRequestURLEncoded(HttpMethod.POST, TokenEndpoint, args);

View file

@ -0,0 +1,32 @@
#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
Copyright (c) 2007-2022 ShareX Team
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 <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
namespace ShareX.UploadersLib
{
public interface IOAuth2Loopback : IOAuth2
{
string RedirectURI { get; set; }
}
}

View file

@ -35,14 +35,32 @@ namespace ShareX.UploadersLib
{
public class OAuthListener
{
public IOAuth2 OAuth { get; private set; }
public IOAuth2Loopback OAuth { get; private set; }
public async Task<string> ConnectAsync()
public OAuthListener(IOAuth2Loopback oauth)
{
OAuth = oauth;
}
public async Task<bool> ConnectAsync()
{
IPAddress ip = IPAddress.Loopback;
int port = URLHelpers.GetRandomUnusedPort();
string redirectURI = string.Format($"http://{ip}:{port}/");
URLHelpers.OpenURL(redirectURI + "?code=test");
OAuth.RedirectURI = redirectURI;
string url = OAuth.GetAuthorizationURL();
if (!string.IsNullOrEmpty(url))
{
URLHelpers.OpenURL(url);
DebugHelper.WriteLine("Authorization URL is opened: " + url);
}
else
{
DebugHelper.WriteLine("Authorization URL is empty.");
return false;
}
try
{
@ -79,7 +97,10 @@ public async Task<string> ConnectAsync()
}
}
return code;
if (!string.IsNullOrEmpty(code))
{
return await Task.Run(() => OAuth.GetAccessToken(code));
}
}
}
catch (Exception e)
@ -87,7 +108,7 @@ public async Task<string> ConnectAsync()
DebugHelper.WriteException(e);
}
return null;
return false;
}
}
}

View file

@ -256,6 +256,7 @@
<Compile Include="Helpers\RequestHelpers.cs" />
<Compile Include="Helpers\UploaderErrorManager.cs" />
<Compile Include="OAuth\GoogleOAuth2.cs" />
<Compile Include="OAuth\IOauth2Loopback.cs" />
<Compile Include="OAuth\IOAuthBase.cs" />
<Compile Include="OAuth\OAuth2ProofKey.cs" />
<Compile Include="Helpers\SSLBypassHelper.cs" />