summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2012-06-12 19:10:57 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2012-06-28 12:33:48 +0200
commit948e5d908e1a9cf25375668d9167da7051021ce6 (patch)
treedf6182414a946a2d8c9b9b82293ed9869442ee8e
parenta61a286cf9d875c462d6d06596afb234314319aa (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.am3
-rw-r--r--rest/rest-proxy-auth-private.h38
-rw-r--r--rest/rest-proxy-auth.c89
-rw-r--r--rest/rest-proxy-auth.h69
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 */