[shotwell] authenticator: Fix crash if service is unavailable
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [shotwell] authenticator: Fix crash if service is unavailable
- Date: Wed, 14 Aug 2019 08:33:35 +0000 (UTC)
commit ccd2bcacea31b6cdfbf70cbf9c0111214a937288
Author: Jens Georg <mail jensge org>
Date: Wed Aug 14 10:30:58 2019 +0200
authenticator: Fix crash if service is unavailable
We did not handle the load_failed signal properly
Fixes #158
.../shotwell/FlickrPublishingAuthenticator.vala | 14 +++++++++++++-
plugins/authenticator/shotwell/GoogleAuthenticator.vala | 11 +++++++++++
plugins/common/WebAuthenticationPane.vala | 15 +++++++++++++++
3 files changed, 39 insertions(+), 1 deletion(-)
---
diff --git a/plugins/authenticator/shotwell/FlickrPublishingAuthenticator.vala
b/plugins/authenticator/shotwell/FlickrPublishingAuthenticator.vala
index 5188ed61..ea4d9ce3 100644
--- a/plugins/authenticator/shotwell/FlickrPublishingAuthenticator.vala
+++ b/plugins/authenticator/shotwell/FlickrPublishingAuthenticator.vala
@@ -54,6 +54,12 @@ namespace Publishing.Authenticator.Shotwell.Flickr {
}
public override void on_page_load() {
+ if (this.load_error != null) {
+ this.error();
+
+ return;
+ }
+
var uri = new Soup.URI(get_view().get_uri());
if (uri.scheme == "shotwell-auth" && this.auth_code == null) {
var form_data = Soup.Form.decode (uri.query);
@@ -77,6 +83,8 @@ namespace Publishing.Authenticator.Shotwell.Flickr {
}
internal class Flickr : Publishing.Authenticator.Shotwell.OAuth1.Authenticator {
+ private WebAuthenticationPane pane;
+
public Flickr(Spit.Publishing.PluginHost host) {
base(API_KEY, API_SECRET, host);
}
@@ -185,13 +193,17 @@ namespace Publishing.Authenticator.Shotwell.Flickr {
}
private void do_web_authentication(string token) {
- var pane = new WebAuthenticationPane(token);
+ pane = new WebAuthenticationPane(token);
host.install_dialog_pane(pane);
pane.authorized.connect(this.do_verify_pin);
pane.error.connect(this.on_web_login_error);
}
private void on_web_login_error() {
+ if (pane.load_error != null) {
+ host.post_error(pane.load_error);
+ return;
+ }
host.post_error(new Spit.Publishing.PublishingError.PROTOCOL_ERROR(_("Flickr authorization
failed")));
}
diff --git a/plugins/authenticator/shotwell/GoogleAuthenticator.vala
b/plugins/authenticator/shotwell/GoogleAuthenticator.vala
index 75d8f37f..5b38ee66 100644
--- a/plugins/authenticator/shotwell/GoogleAuthenticator.vala
+++ b/plugins/authenticator/shotwell/GoogleAuthenticator.vala
@@ -21,6 +21,12 @@ namespace Publishing.Authenticator.Shotwell.Google {
}
public override void on_page_load() {
+ if (this.load_error != null) {
+ this.error ();
+
+ return;
+ }
+
var uri = new Soup.URI(get_view().get_uri());
if (uri.scheme == REVERSE_CLIENT_ID && this.auth_code == null) {
var form_data = Soup.Form.decode (uri.query);
@@ -173,6 +179,7 @@ namespace Publishing.Authenticator.Shotwell.Google {
web_auth_pane = new WebAuthenticationPane(user_authorization_url);
web_auth_pane.authorized.connect(on_web_auth_pane_authorized);
+ web_auth_pane.error.connect(on_web_auth_pane_error);
host.install_dialog_pane(web_auth_pane);
}
@@ -185,6 +192,10 @@ namespace Publishing.Authenticator.Shotwell.Google {
do_get_access_tokens(auth_code);
}
+ private void on_web_auth_pane_error() {
+ host.post_error(web_auth_pane.load_error);
+ }
+
private void do_get_access_tokens(string auth_code) {
debug("ACTION: exchanging authorization code for access & refresh tokens");
diff --git a/plugins/common/WebAuthenticationPane.vala b/plugins/common/WebAuthenticationPane.vala
index c5377483..1704780e 100644
--- a/plugins/common/WebAuthenticationPane.vala
+++ b/plugins/common/WebAuthenticationPane.vala
@@ -12,6 +12,7 @@ namespace Shotwell.Plugins.Common {
}
public string login_uri { owned get; construct; }
+ public Error load_error { get; private set; default = null; }
private WebKit.WebView webview;
@@ -22,6 +23,7 @@ namespace Shotwell.Plugins.Common {
this.webview.get_settings ().enable_plugins = false;
this.webview.load_changed.connect (this.on_page_load_changed);
+ this.webview.load_failed.connect (this.on_page_load_failed);
this.webview.context_menu.connect ( () => { return false; });
}
@@ -29,11 +31,24 @@ namespace Shotwell.Plugins.Common {
protected void set_cursor (Gdk.CursorType type) {
var window = webview.get_window ();
+ if (window == null)
+ return;
+
var display = window.get_display ();
+ if (display == null)
+ return;
+
var cursor = new Gdk.Cursor.for_display (display, type);
window.set_cursor (cursor);
}
+ private bool on_page_load_failed (WebKit.LoadEvent load_event, string uri, Error error) {
+ critical ("Failed to load uri %s: %s", uri, error.message);
+ this.load_error = error;
+
+ return false;
+ }
+
private void on_page_load_changed (WebKit.LoadEvent load_event) {
switch (load_event) {
case WebKit.LoadEvent.STARTED:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]