diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2012-06-12 10:46:52 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2012-06-28 12:33:48 +0200 |
commit | a61a286cf9d875c462d6d06596afb234314319aa (patch) | |
tree | baef3321de425cbbdabe1c4c084135732d93f7ca | |
parent | 44a79fd73de5862d2106f5ad9192b566502a7052 (diff) |
Add RestProxy::authenticate signal
If caught by application, this signal can be used to set the
credentials to use when authentication is needed. If not caught,
librest behaviour will be unchanged (try to use what the
username/password properties were set to first, and don't try to reuse
them if this fails).
https://bugzilla.gnome.org/show_bug.cgi?id=658937
-rw-r--r-- | rest/rest-proxy.c | 55 | ||||
-rw-r--r-- | rest/rest-proxy.h | 3 |
2 files changed, 52 insertions, 6 deletions
diff --git a/rest/rest-proxy.c b/rest/rest-proxy.c index 4aed44d..1dc18bd 100644 --- a/rest/rest-proxy.c +++ b/rest/rest-proxy.c @@ -62,6 +62,14 @@ enum PROP_SSL_STRICT }; +enum { + AUTHENTICATE, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL] = { 0 }; + + static gboolean _rest_proxy_simple_run_valist (RestProxy *proxy, char **payload, goffset *len, @@ -191,6 +199,16 @@ rest_proxy_dispose (GObject *object) G_OBJECT_CLASS (rest_proxy_parent_class)->dispose (object); } +static gboolean +default_authenticate_cb (RestProxy *self, gboolean retrying) +{ + /* We only want to try the credentials once, otherwise we get in an + * infinite loop with failed credentials, retrying the same invalid + * ones again and again + */ + return !retrying; +} + static void authenticate (RestProxy *self, SoupMessage *msg, @@ -198,10 +216,12 @@ authenticate (RestProxy *self, gboolean retrying, SoupSession *session) { - RestProxyPrivate *priv = GET_PRIVATE (self); + RestProxyPrivate *priv = GET_PRIVATE (self); + gboolean try_auth; - if (!retrying) - soup_auth_authenticate (auth, priv->username, priv->password); + g_signal_emit(self, signals[AUTHENTICATE], 0, retrying, &try_auth); + if (try_auth) + soup_auth_authenticate (auth, priv->username, priv->password); } static void @@ -299,7 +319,7 @@ rest_proxy_class_init (RestProxyClass *klass) "username", "The username for authentication", NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_property (object_class, PROP_USERNAME, pspec); @@ -308,7 +328,7 @@ rest_proxy_class_init (RestProxyClass *klass) "password", "The password for authentication", NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); g_object_class_install_property (object_class, PROP_PASSWORD, pspec); @@ -321,6 +341,31 @@ rest_proxy_class_init (RestProxyClass *klass) g_object_class_install_property (object_class, PROP_SSL_STRICT, pspec); + + /** + * RestProxy::authenticate: + * @proxy: the proxy + * @retrying: %TRUE if this is the second (or later) attempt + * + * Emitted when the proxy requires authentication. If + * credentials are available, set the 'username' and 'password' + * properties on @proxy and return TRUE from the callback. + * This will cause the signal emission to stop, and librest will + * try to connect with these credentials + * If these credentials fail, the signal will be + * emitted again, with @retrying set to %TRUE, which will + * continue until FALSE is returned from the callback. + **/ + signals[AUTHENTICATE] = + g_signal_new ("authenticate", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (RestProxyClass, authenticate), + g_signal_accumulator_true_handled, NULL, NULL, + G_TYPE_BOOLEAN, 1, + G_TYPE_BOOLEAN); + + proxy_class->authenticate = default_authenticate_cb; } static void diff --git a/rest/rest-proxy.h b/rest/rest-proxy.h index 342ce59..077b134 100644 --- a/rest/rest-proxy.h +++ b/rest/rest-proxy.h @@ -77,10 +77,11 @@ struct _RestProxyClass { RestProxyCall *(*new_call)(RestProxy *proxy); gboolean (*simple_run_valist)(RestProxy *proxy, gchar **payload, goffset *len, GError **error, va_list params); + gboolean (*authenticate)(RestProxy *proxy, gboolean retrying); /*< private >*/ /* padding for future expansion */ - gpointer _padding_dummy[8]; + gpointer _padding_dummy[7]; }; #define REST_PROXY_ERROR rest_proxy_error_quark () |