summaryrefslogtreecommitdiff
path: root/libsoup/soup-server-auth.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-server-auth.c')
-rw-r--r--libsoup/soup-server-auth.c83
1 files changed, 15 insertions, 68 deletions
diff --git a/libsoup/soup-server-auth.c b/libsoup/soup-server-auth.c
index e2c5138d..47d38693 100644
--- a/libsoup/soup-server-auth.c
+++ b/libsoup/soup-server-auth.c
@@ -18,58 +18,6 @@
#include "soup-misc.h"
#include "soup-uri.h"
-typedef struct {
- const gchar *scheme;
- SoupAuthType type;
- gint strength;
-} AuthScheme;
-
-static AuthScheme known_auth_schemes [] = {
- { "Basic", SOUP_AUTH_TYPE_BASIC, 0 },
- { "Digest", SOUP_AUTH_TYPE_DIGEST, 3 },
- { NULL }
-};
-
-static SoupAuthType
-soup_auth_get_strongest_header (guint auth_types,
- const GSList *vals,
- gchar **out_hdr)
-{
- gchar *header = NULL;
- AuthScheme *scheme = NULL, *iter;
-
- g_return_val_if_fail (vals != NULL, 0);
-
- if (!auth_types)
- return 0;
-
- while (vals) {
- for (iter = known_auth_schemes; iter->scheme; iter++) {
- gchar *tryheader = vals->data;
-
- if ((iter->type & auth_types) &&
- !g_ascii_strncasecmp (tryheader,
- iter->scheme,
- strlen (iter->scheme))) {
- if (!scheme ||
- scheme->strength < iter->strength) {
- header = tryheader;
- scheme = iter;
- }
- break;
- }
- }
-
- vals = vals->next;
- }
-
- if (!scheme)
- return 0;
-
- *out_hdr = header + strlen (scheme->scheme) + 1;
- return scheme->type;
-}
-
static gboolean
check_digest_passwd (SoupServerAuthDigest *digest,
gchar *passwd)
@@ -185,7 +133,7 @@ soup_server_auth_get_user (SoupServerAuth *auth)
static gboolean
parse_digest (SoupServerAuthContext *auth_ctx,
- gchar *header,
+ const char *header,
SoupMessage *msg,
SoupServerAuth *out_auth)
{
@@ -323,26 +271,29 @@ parse_digest (SoupServerAuthContext *auth_ctx,
SoupServerAuth *
soup_server_auth_new (SoupServerAuthContext *auth_ctx,
- const GSList *auth_hdrs,
+ const char *auth_hdr,
SoupMessage *msg)
{
SoupServerAuth *ret;
SoupAuthType type;
- gchar *header = NULL;
+ const char *header = NULL;
g_return_val_if_fail (auth_ctx != NULL, NULL);
g_return_val_if_fail (msg != NULL, NULL);
- if (!auth_hdrs && auth_ctx->types) {
- soup_message_set_status (msg, SOUP_STATUS_UNAUTHORIZED);
+ if (!auth_hdr) {
+ if (auth_ctx->types)
+ soup_message_set_status (msg, SOUP_STATUS_UNAUTHORIZED);
return NULL;
}
- type = soup_auth_get_strongest_header (auth_ctx->types,
- auth_hdrs,
- &header);
-
- if (!type && auth_ctx->types) {
+ if (!g_ascii_strncasecmp (auth_hdr, "Basic ", 6)) {
+ type = SOUP_AUTH_TYPE_BASIC;
+ header = auth_hdr + 6;
+ } else if (!g_ascii_strncasecmp (auth_hdr, "Digest ", 7)) {
+ type = SOUP_AUTH_TYPE_DIGEST;
+ header = auth_hdr + 7;
+ } else if (auth_ctx->types) {
soup_message_set_status (msg, SOUP_STATUS_UNAUTHORIZED);
return NULL;
}
@@ -420,9 +371,7 @@ soup_server_auth_context_challenge (SoupServerAuthContext *auth_ctx,
hdr = g_strdup_printf ("Basic realm=\"%s\"",
auth_ctx->basic_info.realm);
- soup_message_add_header (msg->response_headers,
- header_name,
- hdr);
+ soup_message_headers_append (msg->response_headers, header_name, hdr);
g_free (hdr);
}
@@ -451,9 +400,7 @@ soup_server_auth_context_challenge (SoupServerAuthContext *auth_ctx,
else
g_string_sprintfa (str, "algorithm=\"MD5\"");
- soup_message_add_header (msg->response_headers,
- header_name,
- str->str);
+ soup_message_headers_append (msg->response_headers, header_name, str->str);
g_string_free (str, TRUE);
}
}