diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2012-06-12 19:10:57 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2012-06-28 12:33:48 +0200 |
commit | 948e5d908e1a9cf25375668d9167da7051021ce6 (patch) | |
tree | df6182414a946a2d8c9b9b82293ed9869442ee8e | |
parent | a61a286cf9d875c462d6d06596afb234314319aa (diff) |
Introduce RestProxyAuth type
This will be used by the RestProxy authentication code to be
able to "pause" the sending of the current message. This will give
applications the opportunity to get back to the main loop to
do the authentication work before resuming the current request.
https://bugzilla.gnome.org/show_bug.cgi?id=658937
-rw-r--r-- | rest/Makefile.am | 3 | ||||
-rw-r--r-- | rest/rest-proxy-auth-private.h | 38 | ||||
-rw-r--r-- | rest/rest-proxy-auth.c | 89 | ||||
-rw-r--r-- | rest/rest-proxy-auth.h | 69 |
4 files changed, 199 insertions, 0 deletions
diff --git a/rest/Makefile.am b/rest/Makefile.am index e8a313f..69e7f5b 100644 --- a/rest/Makefile.am +++ b/rest/Makefile.am @@ -6,6 +6,8 @@ lib_sources = \ rest-param.c \ rest-params.c \ rest-proxy.c \ + rest-proxy-auth.c \ + rest-proxy-auth-private.h \ rest-proxy-call.c \ rest-proxy-call-private.h \ rest-xml-node.c \ @@ -25,6 +27,7 @@ lib_headers = \ rest-param.h \ rest-params.h \ rest-proxy.h \ + rest-proxy-auth.h \ rest-proxy-call.h \ rest-enum-types.h \ oauth-proxy.h \ diff --git a/rest/rest-proxy-auth-private.h b/rest/rest-proxy-auth-private.h new file mode 100644 index 0000000..056174e --- /dev/null +++ b/rest/rest-proxy-auth-private.h @@ -0,0 +1,38 @@ +/* + * librest - RESTful web services access + * Copyright (c) 2012, Red Hat, Inc. + * + * Authors: Christophe Fergeau <cfergeau@redhat.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef _REST_PROXY_AUTH_PRIVATE +#define _REST_PROXY_AUTH_PRIVATE + +#include <libsoup/soup.h> +#include <rest/rest-proxy.h> +#include <rest/rest-proxy-auth.h> + +G_BEGIN_DECLS + +RestProxyAuth* rest_proxy_auth_new (RestProxy *proxy, + SoupSession *session, + SoupMessage *message, + SoupAuth *auth); + +G_END_DECLS + +#endif /* _REST_PROXY_AUTH_PRIVATE */ diff --git a/rest/rest-proxy-auth.c b/rest/rest-proxy-auth.c new file mode 100644 index 0000000..f336e7f --- /dev/null +++ b/rest/rest-proxy-auth.c @@ -0,0 +1,89 @@ +/* + * librest - RESTful web services access + * Copyright (c) 2012, Red Hat, Inc. + * + * Authors: Christophe Fergeau <cfergeau@redhat.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ +#include <config.h> + +#include <rest/rest-proxy-auth.h> +#include <rest/rest-proxy-auth-private.h> + +G_DEFINE_TYPE (RestProxyAuth, rest_proxy_auth, G_TYPE_OBJECT) + +#define REST_PROXY_AUTH_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), REST_TYPE_PROXY_AUTH, RestProxyAuthPrivate)) + +struct _RestProxyAuthPrivate { + /* used to hold state during async authentication */ + RestProxy *proxy; + SoupSession *session; + SoupMessage *message; + SoupAuth *auth; + gboolean paused; +}; + +static void +rest_proxy_auth_dispose (GObject *object) +{ + RestProxyAuthPrivate *priv = ((RestProxyAuth*)object)->priv; + + g_clear_object (&priv->proxy); + g_clear_object (&priv->session); + g_clear_object (&priv->message); + g_clear_object (&priv->auth); + + G_OBJECT_CLASS (rest_proxy_auth_parent_class)->dispose (object); +} + +static void +rest_proxy_auth_class_init (RestProxyAuthClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (RestProxyAuthPrivate)); + + object_class->dispose = rest_proxy_auth_dispose; +} + +static void +rest_proxy_auth_init (RestProxyAuth *proxy) +{ + proxy->priv = REST_PROXY_AUTH_GET_PRIVATE (proxy); +} + +G_GNUC_INTERNAL RestProxyAuth* +rest_proxy_auth_new (RestProxy *proxy, + SoupSession *session, + SoupMessage *message, + SoupAuth *soup_auth) +{ + RestProxyAuth *rest_auth; + + g_return_val_if_fail (REST_IS_PROXY (proxy), NULL); + g_return_val_if_fail (SOUP_IS_SESSION (session), NULL); + g_return_val_if_fail (SOUP_IS_MESSAGE (message), NULL); + g_return_val_if_fail (SOUP_IS_AUTH (soup_auth), NULL); + + rest_auth = REST_PROXY_AUTH (g_object_new (REST_TYPE_PROXY_AUTH, NULL)); + rest_auth->priv->proxy = g_object_ref(proxy); + rest_auth->priv->session = g_object_ref(session); + rest_auth->priv->message = g_object_ref(message); + rest_auth->priv->auth = g_object_ref(soup_auth); + + return rest_auth; +} diff --git a/rest/rest-proxy-auth.h b/rest/rest-proxy-auth.h new file mode 100644 index 0000000..9761f75 --- /dev/null +++ b/rest/rest-proxy-auth.h @@ -0,0 +1,69 @@ +/* + * librest - RESTful web services access + * Copyright (c) 2012, Red Hat, Inc. + * + * Authors: Christophe Fergeau <cfergeau@redhat.com> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU Lesser General Public License, + * version 2.1, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for + * more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#ifndef _REST_PROXY_AUTH +#define _REST_PROXY_AUTH + +#include <glib-object.h> + +G_BEGIN_DECLS + +#define REST_TYPE_PROXY_AUTH rest_proxy_auth_get_type() + +#define REST_PROXY_AUTH(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), REST_TYPE_PROXY_AUTH, RestProxyAuth)) + +#define REST_PROXY_AUTH_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), REST_TYPE_PROXY_AUTH, RestProxyAuthClass)) + +#define REST_IS_PROXY_AUTH(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REST_TYPE_PROXY_AUTH)) + +#define REST_IS_PROXY_AUTH_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), REST_TYPE_PROXY_AUTH)) + +#define REST_PROXY_AUTH_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), REST_TYPE_PROXY_AUTH, RestProxyAuthClass)) + +typedef struct _RestProxyAuthPrivate RestProxyAuthPrivate; + +/** + * RestProxyAuth: + * + * #RestProxyAuth has no publicly available members. + */ +typedef struct { + GObject parent; + RestProxyAuthPrivate *priv; +} RestProxyAuth; + +typedef struct { + GObjectClass parent_class; + /*< private >*/ + /* padding for future expansion */ + gpointer _padding_dummy[8]; +} RestProxyAuthClass; + +GType rest_proxy_auth_get_type (void); + +G_END_DECLS + +#endif /* _REST_PROXY_AUTH */ |