Mercurial > dovecot > core-2.2
annotate src/lib-sasl/mech-oauthbearer.c @ 21718:220d1290751b
lib-sasl: Fix xoauth2 data format
Authentication data was missing user=
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Tue, 07 Mar 2017 18:10:57 +0200 |
parents | 2690e7946ea2 |
children | 45e5e6ea89ae |
rev | line source |
---|---|
21437
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2017 Dovecot authors, see the included COPYING file */ |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
2 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
4 #include "str.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
5 #include "net.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
6 #include "json-parser.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
7 #include "istream.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
8 #include "dsasl-client-private.h" |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
9 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
10 struct oauthbearer_dsasl_client { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
11 struct dsasl_client client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
12 const char *host; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
13 const char *status; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
14 in_port_t port; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
15 bool output_sent; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
16 }; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
17 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
18 static int |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
19 mech_oauthbearer_input(struct dsasl_client *_client, |
21439
2690e7946ea2
lib-sasl: Fix oauthbearer compatibility with 2.2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21437
diff
changeset
|
20 const unsigned char *input, unsigned int input_len, |
21437
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
21 const char **error_r) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 struct oauthbearer_dsasl_client *client = |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 (struct oauthbearer_dsasl_client *)_client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 if (!client->output_sent) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 if (input_len > 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 *error_r = "Server sent non-empty initial response"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 } else { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 client->status = ""; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 /* if response is empty, authentication has *SUCCEEDED* */ |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 if (input_len == 0) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 /* authentication has failed, try parse status. |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 we are only interested in extracting status if possible |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 so we don't really need to much error handling. */ |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 struct istream *is = i_stream_create_from_data(input, input_len); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 const char *status = NULL, *value; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 const char *error = NULL; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 enum json_type jtype; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 bool found_status = FALSE; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 struct json_parser *parser = json_parser_init(is); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 while (json_parse_next(parser, &jtype, &value)>0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 if (found_status && status == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 if (jtype == JSON_TYPE_STRING || |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 jtype == JSON_TYPE_NUMBER) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 status = t_strdup(value); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
51 break; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
52 } else if (jtype == JSON_TYPE_OBJECT_KEY && |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
53 strcmp(value, "status") == 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 found_status = TRUE; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 } else json_parse_skip_next(parser); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
57 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 /* deinitialize json parser */ |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
59 int ret = json_parser_deinit(&parser, &error); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
60 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
61 if (status != NULL) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 client->status = p_strdup(_client->pool, status); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 else { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 ret = -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 if (error == NULL) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 error = "Status value missing"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 if (ret < 0) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 *error_r = t_strdup_printf("Error parsing JSON reply: %s", |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
70 error); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
71 else |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 *error_r = t_strdup_printf("Failed to authenticate: %s", |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
73 client->status); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
75 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 static int |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 mech_oauthbearer_output(struct dsasl_client *_client, |
21439
2690e7946ea2
lib-sasl: Fix oauthbearer compatibility with 2.2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21437
diff
changeset
|
81 const unsigned char **output_r, unsigned int *output_len_r, |
21437
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 const char **error_r) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
84 struct oauthbearer_dsasl_client *client = |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 (struct oauthbearer_dsasl_client *)_client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 string_t *str; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 if (_client->set.authid == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 *error_r = "authid not set"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
92 if (_client->password == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
93 *error_r = "password not set"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
95 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
97 str = str_new(_client->pool, 64); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 str_printfa(str, "n,a=%s,\x01", _client->set.authid); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 if (client->host != NULL && *client->host != '\0') |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 str_printfa(str, "host=%s\x01", client->host); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 if (client->port > 0) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
103 str_printfa(str, "port=%u\x01", client->port); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 str_printfa(str, "auth=Bearer %s\x01", _client->password); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 str_append_c(str, '\x01'); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
107 *output_r = str_data(str); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 *output_len_r = str_len(str); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
109 client->output_sent = TRUE; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
112 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
113 static int |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
114 mech_xoauth2_output(struct dsasl_client *_client, |
21439
2690e7946ea2
lib-sasl: Fix oauthbearer compatibility with 2.2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21437
diff
changeset
|
115 const unsigned char **output_r, unsigned int *output_len_r, |
21437
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 const char **error_r) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 struct oauthbearer_dsasl_client *client = |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
119 (struct oauthbearer_dsasl_client *)_client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 string_t *str; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
122 if (_client->set.authid == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
123 *error_r = "authid not set"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
124 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
125 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
126 if (_client->password == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
127 *error_r = "password not set"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
128 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
129 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
130 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
131 str = str_new(_client->pool, 64); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
132 |
21718
220d1290751b
lib-sasl: Fix xoauth2 data format
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21439
diff
changeset
|
133 str_printfa(str, "user=%s\x01", _client->set.authid); |
21437
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
134 str_printfa(str, "auth=Bearer %s\x01", _client->password); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
135 str_append_c(str, '\x01'); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
136 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
137 *output_r = str_data(str); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
138 *output_len_r = str_len(str); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
139 client->output_sent = TRUE; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
140 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
141 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
142 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
143 static int |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
144 mech_oauthbearer_set_parameter(struct dsasl_client *_client, const char *key, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
145 const char *value, const char **error_r) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
146 { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
147 struct oauthbearer_dsasl_client *client = |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
148 (struct oauthbearer_dsasl_client *)_client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
149 if (strcmp(key, "host") == 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
150 if (value != NULL) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
151 client->host = p_strdup(_client->pool, value); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
152 else |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
153 client->host = NULL; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
154 return 1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
155 } else if (strcmp(key, "port") == 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
156 if (value == NULL) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
157 client->port = 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
158 } else if (net_str2port(key, &client->port) < 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
159 *error_r = "Invalid port value"; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
160 return -1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
161 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
162 return 1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
163 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
164 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
165 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
166 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
167 static int |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
168 mech_oauthbearer_get_result(struct dsasl_client *_client, const char *key, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
169 const char **value_r, const char **error_r ATTR_UNUSED) |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
170 { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
171 struct oauthbearer_dsasl_client *client = |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
172 (struct oauthbearer_dsasl_client *)_client; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
173 if (strcmp(key, "status") == 0) { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
174 /* this is set to value after login attempt */ |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
175 i_assert(client->status != NULL); |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
176 *value_r = client->status; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
177 return 1; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
178 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
179 return 0; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
180 } |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
181 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
182 const struct dsasl_client_mech dsasl_client_mech_oauthbearer = { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
183 .name = "OAUTHBEARER", |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
184 .struct_size = sizeof(struct oauthbearer_dsasl_client), |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
185 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
186 .input = mech_oauthbearer_input, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
187 .output = mech_oauthbearer_output, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
188 .set_parameter = mech_oauthbearer_set_parameter, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
189 .get_result = mech_oauthbearer_get_result, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
190 }; |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
191 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
192 const struct dsasl_client_mech dsasl_client_mech_xoauth2 = { |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
193 .name = "XOAUTH2", |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
194 .struct_size = sizeof(struct oauthbearer_dsasl_client), |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
195 |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
196 .output = mech_xoauth2_output, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
197 .set_parameter = mech_oauthbearer_set_parameter, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
198 .get_result = mech_oauthbearer_get_result, |
7b5d7cb9100a
lib-sasl: Add OAUTHBEARER and XOAUTH2 mechanism
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
199 }; |