From 09500ebaa8d390461d5e03923bd713ab7e198db5 Mon Sep 17 00:00:00 2001 From: Jaex Date: Wed, 7 Dec 2022 17:26:58 +0300 Subject: [PATCH] Implement IDisposable --- .../Forms/UploadersConfigForm.cs | 5 ++ ShareX.UploadersLib/OAuth/OAuthListener.cs | 70 ++++++++++++------- .../Resources/OAuthCallbackPage.html | 6 -- 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/ShareX.UploadersLib/Forms/UploadersConfigForm.cs b/ShareX.UploadersLib/Forms/UploadersConfigForm.cs index 8f26614e6..9d910fa9a 100644 --- a/ShareX.UploadersLib/Forms/UploadersConfigForm.cs +++ b/ShareX.UploadersLib/Forms/UploadersConfigForm.cs @@ -3051,6 +3051,11 @@ private async void oauth2YouTube_OpenButtonClicked() { Config.YouTubeOAuth2Info = listener.OAuth.AuthInfo; } + else + { + Config.YouTubeOAuth2Info = null; + } + this.ForceActivate(); ConfigureOAuthStatus(oauth2YouTube, result); } diff --git a/ShareX.UploadersLib/OAuth/OAuthListener.cs b/ShareX.UploadersLib/OAuth/OAuthListener.cs index 106128aee..2fd3efa57 100644 --- a/ShareX.UploadersLib/OAuth/OAuthListener.cs +++ b/ShareX.UploadersLib/OAuth/OAuthListener.cs @@ -33,50 +33,63 @@ namespace ShareX.UploadersLib { - public class OAuthListener + public class OAuthListener : IDisposable { public IOAuth2Loopback OAuth { get; private set; } + public string Code { get; private set; } + + private HttpListener listener; public OAuthListener(IOAuth2Loopback oauth) { OAuth = oauth; } + public void Dispose() + { + listener?.Close(); + listener = null; + } + public async Task ConnectAsync() { - IPAddress ip = IPAddress.Loopback; - int port = URLHelpers.GetRandomUnusedPort(); - string redirectURI = string.Format($"http://{ip}:{port}/"); - - 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 { - using (HttpListener listener = new HttpListener()) + Dispose(); + Code = null; + + IPAddress ip = IPAddress.Loopback; + int port = URLHelpers.GetRandomUnusedPort(); + string redirectURI = string.Format($"http://{ip}:{port}/"); + + 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 + { + listener = new HttpListener(); listener.Prefixes.Add(redirectURI); listener.Start(); HttpListenerContext context = await listener.GetContextAsync(); - string code = context.Request.QueryString.Get("code"); + Code = context.Request.QueryString.Get("code"); using (HttpListenerResponse response = context.Response) { string status; - if (!string.IsNullOrEmpty(code)) + if (!string.IsNullOrEmpty(Code)) { status = "Authorization completed successfully."; } @@ -96,16 +109,21 @@ public async Task ConnectAsync() await responseOutput.FlushAsync(); } } + } + finally + { + Dispose(); + } - if (!string.IsNullOrEmpty(code)) - { - return await Task.Run(() => OAuth.GetAccessToken(code)); - } + if (!string.IsNullOrEmpty(Code)) + { + return await Task.Run(() => OAuth.GetAccessToken(Code)); } } catch (Exception e) { DebugHelper.WriteException(e); + e.ShowError(); } return false; diff --git a/ShareX.UploadersLib/Resources/OAuthCallbackPage.html b/ShareX.UploadersLib/Resources/OAuthCallbackPage.html index 9e966ee3c..591be52e9 100644 --- a/ShareX.UploadersLib/Resources/OAuthCallbackPage.html +++ b/ShareX.UploadersLib/Resources/OAuthCallbackPage.html @@ -37,12 +37,6 @@

{0}

You can now close this page.

- - \ No newline at end of file