summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2010-06-07 17:03:19 -0400
committerDan Winship <danw@gnome.org>2010-12-09 12:04:51 +0100
commit815066543f0b34cffacac60c46e22dd6705dc76d (patch)
tree823c81a3e68ec5e939f562f3130f6c60ea5479e8
parentf4fed344602d061fed46c64a037feb1403982f28 (diff)
downloadlibsoup-815066543f0b34cffacac60c46e22dd6705dc76d.tar.gz
SoupSession, SoupAuthManagerNTLM: Use subfeatures for NTLM auth too
Deprecate SoupSession:use-ntlm in favor of using soup_session_add_feature_by_type() with SOUP_TYPE_AUTH_NTLM.
-rw-r--r--libsoup/soup-auth-manager-ntlm.c102
-rw-r--r--libsoup/soup-auth-ntlm.h3
-rw-r--r--libsoup/soup-auth.h2
-rw-r--r--libsoup/soup-session.c27
-rw-r--r--tests/ntlm-test.c8
5 files changed, 67 insertions, 75 deletions
diff --git a/libsoup/soup-auth-manager-ntlm.c b/libsoup/soup-auth-manager-ntlm.c
index 6e6956c9..49db6133 100644
--- a/libsoup/soup-auth-manager-ntlm.c
+++ b/libsoup/soup-auth-manager-ntlm.c
@@ -32,19 +32,14 @@ static void request_started (SoupSessionFeature *feature, SoupSession *session,
SoupMessage *msg, SoupSocket *socket);
static void request_unqueued (SoupSessionFeature *feature,
SoupSession *session, SoupMessage *msg);
+static gboolean add_feature (SoupSessionFeature *feature, GType type);
+static gboolean remove_feature (SoupSessionFeature *feature, GType type);
+static gboolean has_feature (SoupSessionFeature *feature, GType type);
G_DEFINE_TYPE_WITH_CODE (SoupAuthManagerNTLM, soup_auth_manager_ntlm, SOUP_TYPE_AUTH_MANAGER,
G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE,
soup_auth_manager_ntlm_session_feature_init))
-enum {
- PROP_0,
-
- PROP_USE_NTLM,
-
- LAST_PROP
-};
-
typedef enum {
SOUP_NTLM_NEW,
SOUP_NTLM_SENT_REQUEST,
@@ -81,11 +76,6 @@ static char *soup_ntlm_response (const char *nonce,
const char *host,
const char *domain);
-static void set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec);
-static void get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec);
-
static void
soup_auth_manager_ntlm_init (SoupAuthManagerNTLM *ntlm)
{
@@ -135,16 +125,6 @@ soup_auth_manager_ntlm_class_init (SoupAuthManagerNTLMClass *auth_manager_ntlm_c
g_type_class_add_private (auth_manager_ntlm_class, sizeof (SoupAuthManagerNTLMPrivate));
object_class->finalize = finalize;
- object_class->set_property = set_property;
- object_class->get_property = get_property;
-
- g_object_class_install_property (
- object_class, PROP_USE_NTLM,
- g_param_spec_boolean (SOUP_AUTH_MANAGER_NTLM_USE_NTLM,
- "Use NTLM",
- "Whether or not to use NTLM authentication",
- FALSE,
- G_PARAM_READWRITE));
}
static void
@@ -158,40 +138,9 @@ soup_auth_manager_ntlm_session_feature_init (SoupSessionFeatureInterface *featur
feature_interface->request_queued = request_queued;
feature_interface->request_started = request_started;
feature_interface->request_unqueued = request_unqueued;
-}
-
-static void
-set_property (GObject *object, guint prop_id,
- const GValue *value, GParamSpec *pspec)
-{
- SoupAuthManagerNTLMPrivate *priv =
- SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (object);
-
- switch (prop_id) {
- case PROP_USE_NTLM:
- priv->use_ntlm = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-get_property (GObject *object, guint prop_id,
- GValue *value, GParamSpec *pspec)
-{
- SoupAuthManagerNTLMPrivate *priv =
- SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (object);
-
- switch (prop_id) {
- case PROP_USE_NTLM:
- g_value_set_boolean (value, priv->use_ntlm);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ feature_interface->add_feature = add_feature;
+ feature_interface->remove_feature = remove_feature;
+ feature_interface->has_feature = has_feature;
}
static void
@@ -424,6 +373,45 @@ request_unqueued (SoupSessionFeature *ntlm, SoupSession *session,
soup_auth_manager_parent_feature_interface->request_unqueued (ntlm, session, msg);
}
+static gboolean
+add_feature (SoupSessionFeature *feature, GType type)
+{
+ SoupAuthManagerNTLMPrivate *priv =
+ SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (feature);
+
+ if (type == SOUP_TYPE_AUTH_NTLM) {
+ priv->use_ntlm = TRUE;
+ return TRUE;
+ }
+
+ return soup_auth_manager_parent_feature_interface->add_feature (feature, type);
+}
+
+static gboolean
+remove_feature (SoupSessionFeature *feature, GType type)
+{
+ SoupAuthManagerNTLMPrivate *priv =
+ SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (feature);
+
+ if (type == SOUP_TYPE_AUTH_NTLM) {
+ priv->use_ntlm = FALSE;
+ return TRUE;
+ }
+
+ return soup_auth_manager_parent_feature_interface->remove_feature (feature, type);
+}
+
+static gboolean
+has_feature (SoupSessionFeature *feature, GType type)
+{
+ SoupAuthManagerNTLMPrivate *priv =
+ SOUP_AUTH_MANAGER_NTLM_GET_PRIVATE (feature);
+
+ if (type == SOUP_TYPE_AUTH_NTLM)
+ return priv->use_ntlm;
+
+ return soup_auth_manager_parent_feature_interface->has_feature (feature, type);
+}
/* NTLM code */
diff --git a/libsoup/soup-auth-ntlm.h b/libsoup/soup-auth-ntlm.h
index f494c02d..1f56976b 100644
--- a/libsoup/soup-auth-ntlm.h
+++ b/libsoup/soup-auth-ntlm.h
@@ -8,7 +8,6 @@
#include "soup-auth.h"
-#define SOUP_TYPE_AUTH_NTLM (soup_auth_ntlm_get_type ())
#define SOUP_AUTH_NTLM(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SOUP_TYPE_AUTH_NTLM, SoupAuthNTLM))
#define SOUP_AUTH_NTLM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SOUP_TYPE_AUTH_NTLM, SoupAuthNTLMClass))
#define SOUP_IS_AUTH_NTLM(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SOUP_TYPE_AUTH_NTLM))
@@ -25,8 +24,6 @@ typedef struct {
} SoupAuthNTLMClass;
-GType soup_auth_ntlm_get_type (void);
-
SoupAuth *soup_auth_ntlm_new (const char *realm,
const char *host);
const char *soup_auth_ntlm_get_username (SoupAuth *auth);
diff --git a/libsoup/soup-auth.h b/libsoup/soup-auth.h
index 61a82363..0a26e8c3 100644
--- a/libsoup/soup-auth.h
+++ b/libsoup/soup-auth.h
@@ -106,6 +106,8 @@ void soup_auth_has_saved_password (SoupAuth *auth,
GType soup_auth_basic_get_type (void);
#define SOUP_TYPE_AUTH_DIGEST (soup_auth_digest_get_type ())
GType soup_auth_digest_get_type (void);
+#define SOUP_TYPE_AUTH_NTLM (soup_auth_ntlm_get_type ())
+GType soup_auth_ntlm_get_type (void);
G_END_DECLS
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index ffefca8a..bd6aa6a1 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -181,9 +181,7 @@ soup_session_init (SoupSession *session)
priv->features_cache = g_hash_table_new (NULL, NULL);
- auth_manager = g_object_new (SOUP_TYPE_AUTH_MANAGER_NTLM,
- SOUP_AUTH_MANAGER_NTLM_USE_NTLM, FALSE,
- NULL);
+ auth_manager = g_object_new (SOUP_TYPE_AUTH_MANAGER_NTLM, NULL);
g_signal_connect (auth_manager, "authenticate",
G_CALLBACK (auth_manager_authenticate), session);
soup_session_feature_add_feature (SOUP_SESSION_FEATURE (auth_manager),
@@ -492,6 +490,14 @@ soup_session_class_init (SoupSessionClass *session_class)
0, G_MAXUINT, 0,
G_PARAM_READWRITE));
/**
+ * SoupSession:use-ntlm:
+ *
+ * Whether or not to use NTLM authentication.
+ *
+ * Deprecated: use soup_session_add_feature_by_type() with
+ * #SOUP_TYPE_AUTH_NTLM.
+ **/
+ /**
* SOUP_SESSION_USE_NTLM:
*
* Alias for the #SoupSession:use-ntlm property. (Whether or
@@ -851,9 +857,10 @@ set_property (GObject *object, guint prop_id,
case PROP_USE_NTLM:
feature = soup_session_get_feature (session, SOUP_TYPE_AUTH_MANAGER_NTLM);
if (feature) {
- g_object_set_property (G_OBJECT (feature),
- SOUP_AUTH_MANAGER_NTLM_USE_NTLM,
- value);
+ if (g_value_get_boolean (value))
+ soup_session_feature_add_feature (feature, SOUP_TYPE_AUTH_NTLM);
+ else
+ soup_session_feature_remove_feature (feature, SOUP_TYPE_AUTH_NTLM);
} else
g_warning ("Trying to set use-ntlm on session with no auth-manager");
break;
@@ -958,11 +965,9 @@ get_property (GObject *object, guint prop_id,
break;
case PROP_USE_NTLM:
feature = soup_session_get_feature (session, SOUP_TYPE_AUTH_MANAGER_NTLM);
- if (feature) {
- g_object_get_property (G_OBJECT (feature),
- SOUP_AUTH_MANAGER_NTLM_USE_NTLM,
- value);
- } else
+ if (feature)
+ g_value_set_boolean (value, soup_session_feature_has_feature (feature, SOUP_TYPE_AUTH_NTLM));
+ else
g_value_set_boolean (value, FALSE);
break;
case PROP_SSL_CA_FILE:
diff --git a/tests/ntlm-test.c b/tests/ntlm-test.c
index 3c555ee6..cd74b15f 100644
--- a/tests/ntlm-test.c
+++ b/tests/ntlm-test.c
@@ -338,10 +338,10 @@ do_ntlm_round (SoupURI *base_uri, gboolean use_ntlm, const char *user)
g_return_if_fail (use_ntlm || !alice);
- session = soup_test_session_new (
- SOUP_TYPE_SESSION_ASYNC,
- SOUP_SESSION_USE_NTLM, use_ntlm,
- NULL);
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
+ if (use_ntlm)
+ soup_session_add_feature_by_type (session, SOUP_TYPE_AUTH_NTLM);
+
if (user) {
g_signal_connect (session, "authenticate",
G_CALLBACK (authenticate), (char *)user);