1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* soup-auth-basic.c: HTTP Basic Authentication
*
* Copyright (C) 2001-2002, Ximian, Inc.
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <string.h>
#include "soup-auth-basic.h"
#include "soup-headers.h"
#include "soup-message.h"
#include "soup-misc.h"
#include "soup-private.h"
#include "soup-uri.h"
static GSList *get_protection_space (SoupAuth *auth, const SoupUri *source_uri);
static void authenticate (SoupAuth *auth, const char *username, const char *password);
static char *get_authorization (SoupAuth *auth, SoupMessage *msg);
struct _SoupAuthBasicPrivate {
char *token;
};
#define PARENT_TYPE SOUP_TYPE_AUTH
static SoupAuthClass *parent_class;
static void
init (GObject *object)
{
SoupAuthBasic *basic = SOUP_AUTH_BASIC (object);
basic->priv = g_new0 (SoupAuthBasicPrivate, 1);
}
static void
finalize (GObject *object)
{
SoupAuthBasic *basic = SOUP_AUTH_BASIC (object);
g_free (basic->priv->token);
g_free (basic->priv);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
class_init (GObjectClass *object_class)
{
SoupAuthClass *auth_class = SOUP_AUTH_CLASS (object_class);
parent_class = g_type_class_ref (PARENT_TYPE);
auth_class->scheme_name = "Basic";
auth_class->get_protection_space = get_protection_space;
auth_class->authenticate = authenticate;
auth_class->get_authorization = get_authorization;
object_class->finalize = finalize;
}
SOUP_MAKE_TYPE (soup_auth_basic, SoupAuthBasic, class_init, init, PARENT_TYPE)
static GSList *
get_protection_space (SoupAuth *auth, const SoupUri *source_uri)
{
SoupUri *psuri;
char *p;
psuri = soup_uri_copy (source_uri);
/* Strip query and filename component */
g_free (psuri->query);
psuri->query = NULL;
p = strrchr (psuri->path, '/');
if (p && p != psuri->path && p[1])
*p = '\0';
return g_slist_prepend (NULL, psuri);
}
static void
authenticate (SoupAuth *auth, const char *username, const char *password)
{
SoupAuthBasic *basic = SOUP_AUTH_BASIC (auth);
char *user_pass;
int len;
g_return_if_fail (username != NULL);
g_return_if_fail (password != NULL);
SOUP_AUTH_CLASS (parent_class)->authenticate (auth, username, password);
user_pass = g_strdup_printf ("%s:%s", username, password);
len = strlen (user_pass);
basic->priv->token = soup_base64_encode (user_pass, len);
memset (user_pass, 0, len);
g_free (user_pass);
}
static char *
get_authorization (SoupAuth *auth, SoupMessage *msg)
{
SoupAuthBasic *basic = SOUP_AUTH_BASIC (auth);
return g_strdup_printf ("Basic %s", basic->priv->token);
}
|