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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 };