Mercurial > dovecot > core-2.2
annotate src/lib-oauth2/oauth2-refresh.c @ 21646:7f927c405b2f
lib-oauth2: Support basic authorization
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Tue, 21 Feb 2017 11:18:37 +0200 |
parents | f6d27a985066 |
children | 8afc52576667 |
rev | line source |
---|---|
21575
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
1 /* Copyright (c) 2017 Dovecot authors, see the included COPYING file */ |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
2 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
5 #include "istream.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
6 #include "str.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
7 #include "http-client.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
8 #include "http-url.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
9 #include "json-parser.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
10 #include "oauth2.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
11 #include "oauth2-private.h" |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
12 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
13 static void |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
14 oauth2_refresh_callback(struct oauth2_request *req, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
15 struct oauth2_refresh_result *res) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
16 { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
17 i_assert(res->success == (res->error == NULL)); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
18 i_assert(req->re_callback != NULL); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
19 oauth2_refresh_callback_t *callback = req->re_callback; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
20 req->re_callback = NULL; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
21 callback(res, req->re_context); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
22 oauth2_request_free_internal(req); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
23 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
24 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
25 static bool |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
26 oauth2_refresh_field_parse(const struct oauth2_field *field, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
27 struct oauth2_refresh_result *res) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
28 { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
29 if (strcasecmp(field->name, "expires_in") == 0) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
30 uint32_t expires_in = 0; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
31 if (str_to_uint32(field->value, &expires_in) < 0) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
32 res->success = FALSE; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
33 res->error = t_strdup_printf( |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
34 "Malformed number '%s' in expires_in", |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
35 field->value); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
36 return FALSE; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
37 } else { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
38 res->expires_at = ioloop_time + expires_in; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
39 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
40 } else if (strcasecmp(field->name, "token_type") == 0) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
41 if (strcasecmp(field->value,"bearer") != 0) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
42 res->success = FALSE; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
43 res->error = t_strdup_printf( |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
44 "Expected Bearer token, got '%s'", |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
45 field->value); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
46 return FALSE; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
47 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
48 } else if (strcasecmp(field->name, "access_token") == 0) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
49 /* pooled memory */ |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
50 res->bearer_token = field->value; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
51 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
52 return TRUE; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
53 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
54 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
55 static void |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
56 oauth2_refresh_continue(struct oauth2_request *req, bool success, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
57 const char *error) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
58 { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
59 struct oauth2_refresh_result res; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
60 i_zero(&res); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
61 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
62 res.success = success; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
63 res.error = error; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
64 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
65 if (res.success) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
66 const struct oauth2_field *field; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
67 /* see if we can figure out when it expires */ |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
68 array_foreach(&req->fields, field) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
69 if (!oauth2_refresh_field_parse(field, &res)) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
70 break; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
71 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
72 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
73 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
74 res.fields = &req->fields; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
75 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
76 oauth2_refresh_callback(req, &res); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
77 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
78 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
79 static void |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
80 oauth2_refresh_response(const struct http_response *response, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
81 struct oauth2_request *req) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
82 { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
83 if (response->status / 100 != 2) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
84 oauth2_refresh_continue(req, FALSE, response->reason); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
85 } else { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
86 if (response->payload == NULL) { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
87 oauth2_refresh_continue(req, FALSE, "Missing response body"); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
88 return; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
89 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
90 req->is = response->payload; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
91 i_stream_ref(req->is); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
92 req->parser = json_parser_init(req->is); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
93 req->json_parsed_cb = oauth2_refresh_continue; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
94 req->io = io_add_istream(req->is, oauth2_parse_json, req); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
95 oauth2_parse_json(req); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
96 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
97 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
98 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
99 #undef oauth2_refresh_start |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
100 struct oauth2_request* |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
101 oauth2_refresh_start(const struct oauth2_settings *set, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
102 const struct oauth2_request_input *input, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
103 oauth2_refresh_callback_t *callback, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
104 void *context) |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
105 { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
106 i_assert(oauth2_valid_token(input->token)); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
107 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
108 pool_t pool = pool_alloconly_create_clean("oauth2 refresh", 1024); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
109 struct oauth2_request *req = |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
110 p_new(pool, struct oauth2_request, 1); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
111 struct http_url *url; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
112 const char *error; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
113 struct oauth2_refresh_result fail = { |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
114 .success = FALSE |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
115 }; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
116 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
117 req->pool = pool; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
118 req->set = set; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
119 req->re_callback = callback; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
120 req->re_context = context; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
121 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
122 |
21646
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
123 if (http_url_parse(req->set->refresh_url, NULL, HTTP_URL_ALLOW_USERINFO_PART, |
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
124 pool, &url, &error) < 0) { |
21575
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
125 fail.error = t_strdup_printf("http_url_parse(%s) failed: %s", |
21646
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
126 req->set->refresh_url, error); |
21575
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
127 oauth2_refresh_callback(req, &fail); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
128 return req; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
129 } |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
130 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
131 req->req = http_client_request_url(req->set->client, "POST", url, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
132 oauth2_refresh_response, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
133 req); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
134 string_t *payload = str_new(req->pool, 128); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
135 str_append(payload, "client_secret="); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
136 http_url_escape_param(payload, req->set->client_secret); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
137 str_append(payload, "&grant_type=refresh_token&refresh_token="); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
138 http_url_escape_param(payload, input->token); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
139 str_append(payload, "&client_id="); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
140 http_url_escape_param(payload, req->set->client_id); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
141 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
142 struct istream *is = i_stream_create_from_string(payload); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
143 |
21646
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
144 if (url->user != NULL) |
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
145 http_client_request_set_auth_simple(req->req, url->user, url->password); |
7f927c405b2f
lib-oauth2: Support basic authorization
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21575
diff
changeset
|
146 |
21575
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
147 http_client_request_add_header(req->req, "Content-Type", |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
148 "application/x-www-form-urlencoded"); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
149 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
150 oauth2_request_set_headers(req, input); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
151 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
152 http_client_request_set_payload(req->req, is, FALSE); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
153 i_stream_unref(&is); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
154 http_client_request_set_timeout_msecs(req->req, |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
155 req->set->timeout_msecs); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
156 http_client_request_submit(req->req); |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
157 |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
158 return req; |
f6d27a985066
lib-oauth2: Add support library for OAUTH2
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff
changeset
|
159 } |