From 948e5d908e1a9cf25375668d9167da7051021ce6 Mon Sep 17 00:00:00 2001 From: Christophe Fergeau Date: Tue, 12 Jun 2012 19:10:57 +0200 Subject: 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 --- rest/Makefile.am | 3 ++ rest/rest-proxy-auth-private.h | 38 ++++++++++++++++++ rest/rest-proxy-auth.c | 89 ++++++++++++++++++++++++++++++++++++++++++ rest/rest-proxy-auth.h | 69 ++++++++++++++++++++++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 rest/rest-proxy-auth-private.h create mode 100644 rest/rest-proxy-auth.c create mode 100644 rest/rest-proxy-auth.h 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 + * + * 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 +#include +#include + +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 + * + * 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 + +#include +#include + +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 + * + * 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 + +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 */ -- cgit v1.2.3