Mercurial > dovecot > core-2.2
annotate src/lib-imap-urlauth/imap-urlauth-connection.c @ 15187:02451e967a06
Renamed network.[ch] to net.[ch].
The function prefixes already started with net_ instead of network_.
And icecap wants to use network.h for other purpose. :)
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 03 Oct 2012 18:17:26 +0300 |
parents | 002e0a120c2a |
children | 90710c6c3beb |
rev | line source |
---|---|
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1 /* Copyright (c) 2012 Dovecot authors, see the included COPYING file */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
2 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
3 #include "lib.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
4 #include "llist.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
5 #include "str.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
6 #include "str-sanitize.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
7 #include "strescape.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
8 #include "ioloop.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
9 #include "safe-mkstemp.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
10 #include "hostpid.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
15068
diff
changeset
|
11 #include "net.h" |
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
12 #include "istream.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
13 #include "ostream.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
14 #include "write-full.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
15 #include "array.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
16 #include "aqueue.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
17 #include "mail-user.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
18 #include "imap-urlauth-fetch.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
19 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
20 #include "imap-urlauth-connection.h" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
21 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
22 enum imap_urlauth_state { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
23 IMAP_URLAUTH_STATE_DISCONNECTED = 0, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
24 IMAP_URLAUTH_STATE_AUTHENTICATING, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
25 IMAP_URLAUTH_STATE_AUTHENTICATED, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
26 IMAP_URLAUTH_STATE_SELECTING_TARGET, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
27 IMAP_URLAUTH_STATE_UNSELECTING_TARGET, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
28 IMAP_URLAUTH_STATE_READY, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
29 IMAP_URLAUTH_STATE_REQUEST_PENDING, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
30 IMAP_URLAUTH_STATE_REQUEST_WAIT, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
31 }; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
32 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
33 struct imap_urlauth_request { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
34 struct imap_urlauth_target *target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
35 struct imap_urlauth_request *prev, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
36 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
37 char *url; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
38 enum imap_urlauth_fetch_flags flags; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
39 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
40 char *bodypartstruct; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
41 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
42 imap_urlauth_request_callback_t *callback; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
43 void *context; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
44 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
45 unsigned int binary_has_nuls; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
46 }; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
47 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
48 struct imap_urlauth_target { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
49 struct imap_urlauth_target *prev, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
50 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
51 char *userid; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
52 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
53 struct imap_urlauth_request *requests_head, *requests_tail; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
54 }; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
55 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
56 struct imap_urlauth_connection { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
57 int refcount; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
58 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
59 char *path, *session_id; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
60 struct mail_user *user; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
61 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
62 int fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
63 struct istream *input; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
64 struct ostream *output; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
65 struct io *io; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
66 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
67 struct timeout *to_reconnect, *to_idle, *to_response; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
68 time_t last_reconnect; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
69 unsigned int reconnect_attempts; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
70 unsigned int idle_timeout_msecs; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
71 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
72 char *literal_temp_path; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
73 int literal_fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
74 buffer_t *literal_buf; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
75 uoff_t literal_size, literal_bytes_left; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
76 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
77 enum imap_urlauth_state state; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
78 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
79 /* userid => target struct */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
80 struct imap_urlauth_target *targets_head, *targets_tail; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
81 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
82 unsigned int reading_literal:1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
83 }; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
84 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
85 #define IMAP_URLAUTH_RECONNECT_MIN_SECS 2 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
86 #define IMAP_URLAUTH_RECONNECT_MAX_ATTEMPTS 3 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
87 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
88 #define IMAP_URLAUTH_RESPONSE_TIMEOUT_MSECS 2*60*1000 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
89 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
90 #define IMAP_URLAUTH_HANDSHAKE "VERSION\timap-urlauth\t1\t0\n" |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
91 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
92 #define IMAP_URLAUTH_MAX_INLINE_LITERAL_SIZE (1024*32) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
93 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
94 static void imap_urlauth_connection_disconnect |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
95 (struct imap_urlauth_connection *conn, const char *reason); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
96 static void imap_urlauth_connection_abort |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
97 (struct imap_urlauth_connection *conn, const char *reason); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
98 static void imap_urlauth_connection_reconnect |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
99 (struct imap_urlauth_connection *conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
100 static void imap_urlauth_connection_idle_disconnect |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
101 (struct imap_urlauth_connection *conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
102 static void imap_urlauth_connection_timeout_abort |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
103 (struct imap_urlauth_connection *conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
104 static void imap_urlauth_connection_fail |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
105 (struct imap_urlauth_connection *conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
106 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
107 struct imap_urlauth_connection * |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
108 imap_urlauth_connection_init(const char *path, struct mail_user *user, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
109 const char *session_id, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
110 unsigned int idle_timeout_msecs) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
111 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
112 struct imap_urlauth_connection *conn; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
113 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
114 conn = i_new(struct imap_urlauth_connection, 1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
115 conn->refcount = 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
116 conn->path = i_strdup(path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
117 if (session_id != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
118 conn->session_id = i_strdup(session_id); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
119 conn->user = user; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
120 conn->fd = -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
121 conn->literal_fd = -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
122 conn->idle_timeout_msecs = idle_timeout_msecs; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
123 return conn; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
124 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
125 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
126 void imap_urlauth_connection_deinit(struct imap_urlauth_connection **_conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
127 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
128 struct imap_urlauth_connection *conn = *_conn; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
129 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
130 *_conn = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
131 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
132 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
133 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
134 i_free(conn->path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
135 if (conn->session_id != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
136 i_free(conn->session_id); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
137 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
138 i_assert(conn->to_idle == NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
139 i_assert(conn->to_reconnect == NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
140 i_assert(conn->to_response == NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
141 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
142 i_free(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
143 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
144 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
145 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
146 imap_urlauth_stop_response_timeout(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
147 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
148 if (conn->to_response != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
149 timeout_remove(&conn->to_response); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
150 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
151 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
152 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
153 imap_urlauth_start_response_timeout(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
154 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
155 imap_urlauth_stop_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
156 conn->to_response = timeout_add(IMAP_URLAUTH_RESPONSE_TIMEOUT_MSECS, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
157 imap_urlauth_connection_timeout_abort, conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
158 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
159 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
160 static struct imap_urlauth_target * |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
161 imap_urlauth_connection_get_target(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
162 const char *target_user) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
163 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
164 struct imap_urlauth_target *target = conn->targets_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
165 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
166 while (target != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
167 if (strcmp(target->userid, target_user) == 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
168 return target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
169 target = target->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
170 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
171 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
172 target = i_new(struct imap_urlauth_target, 1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
173 target->userid = i_strdup(target_user); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
174 DLLIST2_APPEND(&conn->targets_head, &conn->targets_tail, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
175 return target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
176 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
177 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
178 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
179 imap_urlauth_target_free(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
180 struct imap_urlauth_target *target) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
181 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
182 DLLIST2_REMOVE(&conn->targets_head, &conn->targets_tail, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
183 i_free(target->userid); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
184 i_free(target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
185 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
186 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
187 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
188 imap_urlauth_connection_select_target(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
189 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
190 struct imap_urlauth_target *target = conn->targets_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
191 const char *cmd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
192 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
193 if (target == NULL || conn->state != IMAP_URLAUTH_STATE_AUTHENTICATED) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
194 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
195 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
196 if (conn->user->mail_debug) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
197 i_debug("imap-urlauth: Selecting target user `%s'", target->userid); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
198 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
199 conn->state = IMAP_URLAUTH_STATE_SELECTING_TARGET; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
200 cmd = t_strdup_printf("USER\t%s\n", str_tabescape(target->userid)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
201 if (o_stream_send_str(conn->output, cmd) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
202 i_warning("Error sending USER request to imap-urlauth server: %m"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
203 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
204 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
205 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
206 imap_urlauth_start_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
207 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
208 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
209 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
210 imap_urlauth_connection_send_request(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
211 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
212 struct imap_urlauth_request *urlreq; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
213 string_t *cmd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
214 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
215 if (conn->targets_head == NULL || |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
216 (conn->targets_head->requests_head == NULL && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
217 conn->targets_head->next == NULL && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
218 conn->state == IMAP_URLAUTH_STATE_READY)) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
219 if (conn->user->mail_debug) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
220 i_debug("imap-urlauth: No more requests pending; scheduling disconnect"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
221 if (conn->to_idle != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
222 timeout_remove(&conn->to_idle); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
223 if (conn->idle_timeout_msecs > 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
224 conn->to_idle = timeout_add(conn->idle_timeout_msecs, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
225 imap_urlauth_connection_idle_disconnect, conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
226 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
227 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
228 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
229 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
230 if (conn->state == IMAP_URLAUTH_STATE_AUTHENTICATED) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
231 imap_urlauth_connection_select_target(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
232 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
233 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
234 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
235 if (conn->state != IMAP_URLAUTH_STATE_READY) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
236 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
237 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
238 urlreq = conn->targets_head->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
239 if (urlreq == NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
240 if (conn->targets_head->next == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
241 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
242 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
243 conn->state = IMAP_URLAUTH_STATE_UNSELECTING_TARGET; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
244 imap_urlauth_target_free(conn, conn->targets_head); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
245 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
246 if (o_stream_send_str(conn->output, "END\n") < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
247 i_warning("Error sending END request to imap-urlauth server: %m"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
248 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
249 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
250 imap_urlauth_start_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
251 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
252 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
253 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
254 if (conn->user->mail_debug) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
255 i_debug("imap-urlauth: Fetching URL `%s'", urlreq->url); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
256 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
257 cmd = t_str_new(128); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
258 str_append(cmd, "URL\t"); |
15068
002e0a120c2a
Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents:
15066
diff
changeset
|
259 str_append_tabescaped(cmd, urlreq->url); |
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
260 if ((urlreq->flags & IMAP_URLAUTH_FETCH_FLAG_BODYPARTSTRUCTURE) != 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
261 str_append(cmd, "\tbpstruct"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
262 if ((urlreq->flags & IMAP_URLAUTH_FETCH_FLAG_BINARY) != 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
263 str_append(cmd, "\tbinary"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
264 else if ((urlreq->flags & IMAP_URLAUTH_FETCH_FLAG_BODY) != 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
265 str_append(cmd, "\tbody"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
266 str_append_c(cmd, '\n'); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
267 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
268 conn->state = IMAP_URLAUTH_STATE_REQUEST_PENDING; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
269 if (o_stream_send(conn->output, str_data(cmd), str_len(cmd)) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
270 i_warning("Error sending URL request to imap-urlauth server: %m"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
271 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
272 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
273 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
274 imap_urlauth_start_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
275 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
276 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
277 struct imap_urlauth_request * |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
278 imap_urlauth_request_new(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
279 const char *target_user, const char *url, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
280 enum imap_urlauth_fetch_flags flags, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
281 imap_urlauth_request_callback_t *callback, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
282 void *context) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
283 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
284 struct imap_urlauth_request *urlreq; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
285 struct imap_urlauth_target *target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
286 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
287 target = imap_urlauth_connection_get_target(conn, target_user); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
288 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
289 urlreq = i_new(struct imap_urlauth_request, 1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
290 urlreq->url = i_strdup(url); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
291 urlreq->flags = flags; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
292 urlreq->target = target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
293 urlreq->callback = callback; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
294 urlreq->context = context; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
295 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
296 DLLIST2_APPEND(&target->requests_head, &target->requests_tail, urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
297 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
298 if (conn->to_idle != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
299 timeout_remove(&conn->to_idle); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
300 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
301 if (conn->user->mail_debug) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
302 i_debug("imap-urlauth: Added request for URL `%s' from user `%s'", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
303 url, target_user); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
304 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
305 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
306 imap_urlauth_connection_send_request(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
307 return urlreq; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
308 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
309 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
310 static void imap_urlauth_request_free(struct imap_urlauth_request *urlreq) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
311 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
312 struct imap_urlauth_target *target = urlreq->target; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
313 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
314 DLLIST2_REMOVE(&target->requests_head, &target->requests_tail, urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
315 i_free(urlreq->url); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
316 i_free(urlreq->bodypartstruct); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
317 i_free(urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
318 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
319 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
320 void imap_urlauth_request_abort(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
321 struct imap_urlauth_request *urlreq) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
322 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
323 if (urlreq->callback != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
324 T_BEGIN { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
325 urlreq->callback(NULL, urlreq->context); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
326 } T_END; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
327 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
328 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
329 if (conn->state == IMAP_URLAUTH_STATE_REQUEST_PENDING && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
330 conn->targets_head != NULL && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
331 conn->targets_head->requests_head == urlreq) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
332 /* cannot just drop pending request without breaking |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
333 protocol state */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
334 urlreq->callback = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
335 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
336 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
337 imap_urlauth_request_free(urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
338 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
339 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
340 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
341 imap_urlauth_request_fail(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
342 struct imap_urlauth_request *urlreq, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
343 const char *error) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
344 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
345 struct imap_urlauth_fetch_reply reply; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
346 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
347 memset(&reply, 0, sizeof(reply)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
348 reply.url = urlreq->url; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
349 reply.flags = urlreq->flags; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
350 reply.succeeded = FALSE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
351 reply.error = error; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
352 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
353 if (urlreq->callback != NULL) T_BEGIN { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
354 (void)urlreq->callback(&reply, urlreq->context); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
355 } T_END; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
356 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
357 if (conn->state == IMAP_URLAUTH_STATE_REQUEST_PENDING && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
358 conn->targets_head != NULL && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
359 conn->targets_head->requests_head == urlreq) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
360 /* cannot just drop pending request without breaking protocol state */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
361 urlreq->callback = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
362 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
363 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
364 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
365 imap_urlauth_request_free(urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
366 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
367 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
368 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
369 imap_urlauth_target_abort(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
370 struct imap_urlauth_target *target) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
371 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
372 struct imap_urlauth_request *urlreq, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
373 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
374 urlreq = target->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
375 while (urlreq != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
376 next = urlreq->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
377 imap_urlauth_request_abort(conn, urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
378 urlreq = next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
379 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
380 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
381 imap_urlauth_target_free(conn, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
382 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
383 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
384 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
385 imap_urlauth_target_fail(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
386 struct imap_urlauth_target *target, const char *error) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
387 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
388 struct imap_urlauth_request *urlreq, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
389 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
390 urlreq = target->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
391 while (urlreq != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
392 next = urlreq->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
393 imap_urlauth_request_fail(conn, urlreq, error); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
394 urlreq = next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
395 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
396 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
397 imap_urlauth_target_free(conn, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
398 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
399 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
400 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
401 imap_urlauth_target_abort_by_context(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
402 struct imap_urlauth_target *target, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
403 void *context) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
404 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
405 struct imap_urlauth_request *urlreq, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
406 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
407 /* abort all matching requests */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
408 urlreq = target->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
409 while (urlreq != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
410 next = urlreq->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
411 if (urlreq->context == context) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
412 imap_urlauth_request_abort(conn, urlreq); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
413 urlreq = next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
414 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
415 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
416 if (target->requests_head == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
417 imap_urlauth_target_free(conn, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
418 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
419 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
420 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
421 imap_urlauth_connection_abort(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
422 const char *reason) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
423 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
424 struct imap_urlauth_target *target, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
425 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
426 if (reason == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
427 reason = "Aborting due to error"; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
428 imap_urlauth_connection_disconnect(conn, reason); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
429 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
430 /* abort all requests */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
431 target = conn->targets_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
432 while (target != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
433 next = target->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
434 imap_urlauth_target_abort(conn, target); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
435 target = next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
436 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
437 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
438 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
439 void imap_urlauth_request_abort_by_context(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
440 void *context) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
441 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
442 struct imap_urlauth_target *target, *next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
443 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
444 /* abort all matching requests */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
445 target = conn->targets_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
446 while (target != NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
447 next = target->next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
448 imap_urlauth_target_abort_by_context(conn, target, context); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
449 target = next; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
450 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
451 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
452 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
453 static void imap_urlauth_connection_fail(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
454 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
455 if (conn->reconnect_attempts > IMAP_URLAUTH_RECONNECT_MAX_ATTEMPTS) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
456 imap_urlauth_connection_abort(conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
457 "Connection failed and connection attempts exhausted"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
458 } else { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
459 imap_urlauth_connection_reconnect(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
460 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
461 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
462 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
463 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
464 imap_urlauth_connection_create_temp_fd(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
465 const char **path_r) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
466 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
467 string_t *path; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
468 int fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
469 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
470 path = t_str_new(128); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
471 mail_user_set_get_temp_prefix(path, conn->user->set); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
472 fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
473 if (fd == -1) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
474 i_error("safe_mkstemp(%s) failed: %m", str_c(path)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
475 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
476 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
477 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
478 /* we just want the fd, unlink it */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
479 if (unlink(str_c(path)) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
480 /* shouldn't happen.. */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
481 i_error("unlink(%s) failed: %m", str_c(path)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
482 i_close_fd(&fd); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
483 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
484 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
485 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
486 *path_r = str_c(path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
487 return fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
488 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
489 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
490 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
491 imap_urlauth_connection_read_literal_init(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
492 uoff_t size) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
493 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
494 const char *path; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
495 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
496 i_assert(conn->literal_fd == -1 && conn->literal_buf == NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
497 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
498 if (size <= IMAP_URLAUTH_MAX_INLINE_LITERAL_SIZE) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
499 /* read the literal directly */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
500 if (size > 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
501 conn->literal_buf = |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
502 buffer_create_dynamic(default_pool, size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
503 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
504 } else { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
505 /* read it into a file */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
506 conn->literal_fd = |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
507 imap_urlauth_connection_create_temp_fd(conn, &path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
508 if (conn->literal_fd == -1) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
509 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
510 conn->literal_temp_path = i_strdup(path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
511 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
512 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
513 conn->literal_size = size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
514 conn->literal_bytes_left = size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
515 conn->reading_literal = TRUE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
516 return 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
517 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
518 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
519 void imap_urlauth_connection_continue(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
520 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
521 i_assert(conn->targets_head != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
522 i_assert(conn->targets_head->requests_head != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
523 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
524 if (conn->state != IMAP_URLAUTH_STATE_REQUEST_WAIT) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
525 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
526 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
527 conn->state = IMAP_URLAUTH_STATE_READY; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
528 imap_urlauth_request_free(conn->targets_head->requests_head); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
529 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
530 imap_urlauth_connection_send_request(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
531 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
532 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
533 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
534 imap_urlauth_connection_read_literal_data(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
535 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
536 const unsigned char *data; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
537 size_t size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
538 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
539 /* read data */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
540 data = i_stream_get_data(conn->input, &size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
541 if (size > conn->literal_bytes_left) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
542 size = conn->literal_bytes_left; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
543 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
544 /* write to buffer or file */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
545 if (size > 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
546 if (conn->literal_fd >= 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
547 if (write_full(conn->literal_fd, data, size) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
548 i_error("imap-urlauth: write(%s) failed: %m", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
549 conn->literal_temp_path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
550 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
551 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
552 } else { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
553 i_assert(conn->literal_buf != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
554 buffer_append(conn->literal_buf, data, size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
555 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
556 i_stream_skip(conn->input, size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
557 conn->literal_bytes_left -= size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
558 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
559 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
560 /* exit if not finished */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
561 if (conn->literal_bytes_left > 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
562 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
563 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
564 /* read LF guard */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
565 data = i_stream_get_data(conn->input, &size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
566 if (size < 1) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
567 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
568 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
569 /* check LF guard */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
570 if (data[0] != '\n') { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
571 i_error("imap-urlauth: no LF at end of literal (found 0x%x)", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
572 data[0]); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
573 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
574 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
575 i_stream_skip(conn->input, 1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
576 return 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
577 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
578 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
579 static void literal_stream_destroy(buffer_t *buffer) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
580 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
581 buffer_free(&buffer); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
582 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
583 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
584 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
585 imap_urlauth_fetch_reply_set_literal_stream(struct imap_urlauth_connection *conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
586 struct imap_urlauth_fetch_reply *reply) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
587 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
588 const unsigned char *data; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
589 size_t size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
590 uoff_t fd_size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
591 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
592 if (conn->literal_fd != -1) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
593 reply->input = i_stream_create_fd(conn->literal_fd, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
594 (size_t)-1, TRUE); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
595 if (i_stream_get_size(reply->input, TRUE, &fd_size) < 1 || |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
596 fd_size != conn->literal_size) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
597 i_stream_unref(&reply->input); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
598 i_error("imap-urlauth: Failed to obtain proper size from literal stream"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
599 imap_urlauth_connection_abort(conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
600 "Failed during literal transfer"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
601 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
602 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
603 } else { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
604 data = buffer_get_data(conn->literal_buf, &size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
605 i_assert(size == conn->literal_size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
606 reply->input = i_stream_create_from_data(data, size); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
607 i_stream_set_destroy_callback(reply->input, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
608 literal_stream_destroy, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
609 conn->literal_buf); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
610 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
611 reply->size = conn->literal_size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
612 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
613 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
614 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
615 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
616 imap_urlauth_connection_read_literal(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
617 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
618 struct imap_urlauth_request *urlreq = conn->targets_head->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
619 struct imap_urlauth_fetch_reply reply; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
620 int ret; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
621 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
622 i_assert(conn->reading_literal); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
623 i_assert(urlreq != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
624 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
625 if (conn->literal_size > 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
626 ret = imap_urlauth_connection_read_literal_data(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
627 if (ret <= 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
628 return ret; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
629 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
630 i_assert(conn->literal_bytes_left == 0); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
631 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
632 /* reply */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
633 memset(&reply, 0, sizeof(reply)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
634 reply.url = urlreq->url; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
635 reply.flags = urlreq->flags; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
636 reply.bodypartstruct = urlreq->bodypartstruct; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
637 reply.binary_has_nuls = urlreq->binary_has_nuls; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
638 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
639 if (conn->literal_size > 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
640 if (imap_urlauth_fetch_reply_set_literal_stream(conn, &reply) < 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
641 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
642 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
643 reply.succeeded = TRUE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
644 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
645 ret = 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
646 if (urlreq->callback != NULL) T_BEGIN { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
647 ret = urlreq->callback(&reply, urlreq->context); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
648 } T_END; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
649 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
650 if (reply.input != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
651 i_stream_unref(&reply.input); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
652 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
653 if (ret < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
654 /* Drop any related requests upon error */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
655 imap_urlauth_request_abort_by_context(conn, urlreq->context); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
656 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
657 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
658 conn->state = IMAP_URLAUTH_STATE_REQUEST_WAIT; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
659 if (ret != 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
660 imap_urlauth_connection_continue(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
661 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
662 /* finished */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
663 i_free_and_null(conn->literal_temp_path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
664 conn->literal_fd = -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
665 conn->literal_buf = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
666 conn->reading_literal = FALSE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
667 return 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
668 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
669 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
670 static int imap_urlauth_input_pending(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
671 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
672 struct imap_urlauth_request *urlreq; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
673 const char *response, *const *args, *bpstruct = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
674 uoff_t literal_size; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
675 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
676 i_assert(conn->targets_head != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
677 i_assert(conn->targets_head->requests_head != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
678 urlreq = conn->targets_head->requests_head; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
679 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
680 if (conn->reading_literal) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
681 /* Read pending literal; may callback */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
682 return imap_urlauth_connection_read_literal(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
683 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
684 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
685 /* "OK"[<metadata-items>]"\t"<literal-size>"\n" or |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
686 "NO"["\terror="<error>]"\n" */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
687 if ((response = i_stream_next_line(conn->input)) == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
688 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
689 imap_urlauth_stop_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
690 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
691 args = t_strsplit_tabescaped(response); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
692 if (args[0] == NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
693 i_error("imap-urlauth: Empty URL response: %s", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
694 str_sanitize(response, 80)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
695 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
696 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
697 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
698 if (strcmp(args[0], "OK") != 0 || args[1] == NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
699 if (strcmp(args[0], "NO") == 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
700 const char *param = args[1], *error = NULL; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
701 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
702 if (param != NULL && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
703 strncasecmp(param, "error=", 6) == 0 && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
704 param[6] != '\0') { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
705 error = param+6; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
706 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
707 imap_urlauth_request_fail(conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
708 conn->targets_head->requests_head, error); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
709 return 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
710 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
711 i_error("imap-urlauth: Unexpected URL response: %s", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
712 str_sanitize(response, 80)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
713 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
714 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
715 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
716 /* read metadata */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
717 args++; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
718 for (; args[1] != NULL; args++) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
719 const char *param = args[0]; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
720 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
721 if (strcasecmp(param, "hasnuls") == 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
722 urlreq->binary_has_nuls = TRUE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
723 } else if (strncasecmp(param, "bpstruct=", 9) == 0 && |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
724 param[9] != '\0') { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
725 bpstruct = param+9; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
726 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
727 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
728 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
729 /* read literal size */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
730 if (str_to_uoff(args[0], &literal_size) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
731 i_error("imap-urlauth: " |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
732 "Overflowing unsigned integer value for literal size: %s", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
733 args[1]); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
734 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
735 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
736 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
737 /* read literal */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
738 if (imap_urlauth_connection_read_literal_init(conn, literal_size) < 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
739 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
740 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
741 urlreq->bodypartstruct = i_strdup(bpstruct); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
742 return imap_urlauth_connection_read_literal(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
743 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
744 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
745 static int imap_urlauth_input_next(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
746 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
747 const char *response; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
748 int ret; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
749 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
750 switch (conn->state) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
751 case IMAP_URLAUTH_STATE_AUTHENTICATING: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
752 case IMAP_URLAUTH_STATE_UNSELECTING_TARGET: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
753 if ((response = i_stream_next_line(conn->input)) == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
754 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
755 imap_urlauth_stop_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
756 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
757 if (strcasecmp(response, "OK") != 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
758 if (conn->state == IMAP_URLAUTH_STATE_AUTHENTICATING) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
759 i_error("imap-urlauth: Failed to authenticate to service: " |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
760 "Got unexpected response: %s", str_sanitize(response, 80)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
761 else |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
762 i_error("imap-urlauth: Failed to unselect target user: " |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
763 "Got unexpected response: %s", str_sanitize(response, 80)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
764 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
765 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
766 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
767 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
768 if (conn->user->mail_debug) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
769 if (conn->state == IMAP_URLAUTH_STATE_AUTHENTICATING) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
770 i_debug("imap-urlauth: Successfully authenticated to service"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
771 else |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
772 i_debug("imap-urlauth: Successfully unselected target user"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
773 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
774 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
775 conn->state = IMAP_URLAUTH_STATE_AUTHENTICATED; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
776 imap_urlauth_connection_select_target(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
777 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
778 case IMAP_URLAUTH_STATE_SELECTING_TARGET: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
779 if ((response = i_stream_next_line(conn->input)) == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
780 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
781 imap_urlauth_stop_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
782 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
783 i_assert(conn->targets_head != NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
784 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
785 if (strcasecmp(response, "NO") == 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
786 if (conn->user->mail_debug) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
787 i_debug("imap-urlauth: Failed to select target user %s", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
788 conn->targets_head->userid); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
789 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
790 imap_urlauth_target_fail(conn, conn->targets_head, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
791 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
792 conn->state = IMAP_URLAUTH_STATE_AUTHENTICATED; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
793 imap_urlauth_connection_select_target(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
794 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
795 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
796 if (strcasecmp(response, "OK") != 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
797 i_error("imap-urlauth: Failed to select target user %s: " |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
798 "Got unexpected response: %s", conn->targets_head->userid, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
799 str_sanitize(response, 80)); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
800 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
801 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
802 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
803 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
804 if (conn->user->mail_debug) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
805 i_debug("imap-urlauth: Successfully selected target user %s", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
806 conn->targets_head->userid); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
807 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
808 conn->state = IMAP_URLAUTH_STATE_READY; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
809 imap_urlauth_connection_send_request(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
810 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
811 case IMAP_URLAUTH_STATE_AUTHENTICATED: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
812 case IMAP_URLAUTH_STATE_READY: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
813 case IMAP_URLAUTH_STATE_REQUEST_WAIT: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
814 if ((response = i_stream_next_line(conn->input)) == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
815 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
816 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
817 i_error("imap-urlauth: Received input while no requests were pending"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
818 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
819 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
820 case IMAP_URLAUTH_STATE_REQUEST_PENDING: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
821 if ((ret = imap_urlauth_input_pending(conn)) < 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
822 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
823 return ret; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
824 case IMAP_URLAUTH_STATE_DISCONNECTED: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
825 break; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
826 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
827 i_unreached(); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
828 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
829 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
830 static void imap_urlauth_input(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
831 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
832 int ret; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
833 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
834 i_assert(conn->state != IMAP_URLAUTH_STATE_DISCONNECTED); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
835 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
836 if (conn->input->closed) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
837 /* disconnected */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
838 i_error("imap-urlauth: Service disconnected unexpectedly"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
839 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
840 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
841 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
842 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
843 switch (i_stream_read(conn->input)) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
844 case -1: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
845 /* disconnected */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
846 i_error("imap-urlauth: Service disconnected unexpectedly"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
847 imap_urlauth_connection_fail(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
848 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
849 case -2: |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
850 /* input buffer full */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
851 i_error("imap-urlauth: Service sent too large input"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
852 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
853 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
854 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
855 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
856 while (!conn->input->closed) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
857 if ((ret = imap_urlauth_input_next(conn)) <= 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
858 break; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
859 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
860 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
861 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
862 static int |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
863 imap_urlauth_connection_do_connect(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
864 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
865 string_t *str; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
866 int fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
867 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
868 if (conn->state != IMAP_URLAUTH_STATE_DISCONNECTED) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
869 imap_urlauth_connection_send_request(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
870 return 1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
871 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
872 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
873 if (conn->user->auth_token == NULL) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
874 i_error("imap-urlauth: cannot authenticate because no auth token " |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
875 "is available for this session (standalone IMAP?)."); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
876 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
877 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
878 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
879 if (conn->user->mail_debug) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
880 i_debug("imap-urlauth: Connecting to service at %s", conn->path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
881 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
882 i_assert(conn->fd == -1); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
883 fd = net_connect_unix(conn->path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
884 if (fd == -1) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
885 i_error("imap-urlauth: net_connect_unix(%s) failed: %m", |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
886 conn->path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
887 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
888 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
889 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
890 if (conn->to_reconnect != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
891 timeout_remove(&conn->to_reconnect); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
892 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
893 conn->fd = fd; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
894 conn->input = i_stream_create_fd(fd, (size_t)-1, FALSE); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
895 conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
896 conn->io = io_add(fd, IO_READ, imap_urlauth_input, conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
897 conn->state = IMAP_URLAUTH_STATE_AUTHENTICATING; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
898 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
899 str = t_str_new(128); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
900 str_printfa(str, IMAP_URLAUTH_HANDSHAKE"AUTH\t%s\t", my_pid); |
15068
002e0a120c2a
Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents:
15066
diff
changeset
|
901 str_append_tabescaped(str, conn->user->username); |
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
902 str_append_c(str, '\t'); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
903 if (conn->session_id != NULL) |
15068
002e0a120c2a
Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents:
15066
diff
changeset
|
904 str_append_tabescaped(str, conn->session_id); |
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
905 str_append_c(str, '\t'); |
15068
002e0a120c2a
Renamed str_tabescape_write() to str_append_tabescaped()
Timo Sirainen <tss@iki.fi>
parents:
15066
diff
changeset
|
906 str_append_tabescaped(str, conn->user->auth_token); |
15066
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
907 str_append_c(str, '\n'); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
908 if (o_stream_send(conn->output, str_data(str), str_len(str)) < 0) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
909 i_warning("Error sending handshake to imap-urlauth server: %m"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
910 imap_urlauth_connection_abort(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
911 return -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
912 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
913 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
914 imap_urlauth_start_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
915 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
916 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
917 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
918 int imap_urlauth_connection_connect(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
919 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
920 conn->reconnect_attempts = 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
921 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
922 if (conn->to_reconnect == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
923 return imap_urlauth_connection_do_connect(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
924 return 0; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
925 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
926 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
927 static void imap_urlauth_connection_disconnect |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
928 (struct imap_urlauth_connection *conn, const char *reason) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
929 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
930 conn->state = IMAP_URLAUTH_STATE_DISCONNECTED; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
931 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
932 if (conn->fd != -1) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
933 if (conn->user->mail_debug) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
934 if (reason == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
935 i_debug("imap-urlauth: Disconnecting from service"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
936 else |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
937 i_debug("imap-urlauth: Disconnected: %s", reason); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
938 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
939 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
940 io_remove(&conn->io); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
941 i_stream_destroy(&conn->input); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
942 o_stream_destroy(&conn->output); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
943 net_disconnect(conn->fd); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
944 conn->fd = -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
945 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
946 conn->reading_literal = FALSE; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
947 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
948 if (conn->literal_fd != -1) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
949 if (close(conn->literal_fd) < 0) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
950 i_error("imap-urlauth: close(%s) failed: %m", conn->literal_temp_path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
951 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
952 i_free_and_null(conn->literal_temp_path); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
953 conn->literal_fd = -1; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
954 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
955 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
956 if (conn->literal_buf != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
957 buffer_free(&conn->literal_buf); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
958 if (conn->to_reconnect != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
959 timeout_remove(&conn->to_reconnect); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
960 if (conn->to_idle != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
961 timeout_remove(&conn->to_idle); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
962 imap_urlauth_stop_response_timeout(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
963 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
964 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
965 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
966 imap_urlauth_connection_do_reconnect(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
967 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
968 if (conn->reconnect_attempts >= IMAP_URLAUTH_RECONNECT_MAX_ATTEMPTS) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
969 imap_urlauth_connection_abort(conn, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
970 "Connection failed and connection attempts exhausted"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
971 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
972 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
973 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
974 if (ioloop_time - conn->last_reconnect < IMAP_URLAUTH_RECONNECT_MIN_SECS) { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
975 if (conn->user->mail_debug) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
976 i_debug("imap-urlauth: Scheduling reconnect"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
977 if (conn->to_reconnect != NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
978 timeout_remove(&conn->to_reconnect); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
979 conn->to_reconnect = |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
980 timeout_add(IMAP_URLAUTH_RECONNECT_MIN_SECS*1000, |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
981 imap_urlauth_connection_do_reconnect, conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
982 } else { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
983 conn->reconnect_attempts++; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
984 conn->last_reconnect = ioloop_time; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
985 (void)imap_urlauth_connection_do_connect(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
986 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
987 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
988 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
989 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
990 imap_urlauth_connection_reconnect(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
991 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
992 imap_urlauth_connection_disconnect(conn, NULL); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
993 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
994 /* don't reconnect if there are no requests */ |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
995 if (conn->targets_head == NULL) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
996 return; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
997 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
998 imap_urlauth_connection_do_reconnect(conn); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
999 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1000 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1001 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1002 imap_urlauth_connection_idle_disconnect(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1003 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1004 imap_urlauth_connection_disconnect(conn, "Idle timeout"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1005 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1006 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1007 static void |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1008 imap_urlauth_connection_timeout_abort(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1009 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1010 imap_urlauth_connection_abort(conn, "Service is not responding"); |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1011 } |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1012 |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1013 bool imap_urlauth_connection_is_connected(struct imap_urlauth_connection *conn) |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1014 { |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1015 return conn->fd != -1 && conn->state != IMAP_URLAUTH_STATE_DISCONNECTED; |
d419aac7ab31
Added support for IMAP URLAUTH and URLAUTH=BINARY extensions
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1016 } |