Mercurial > dovecot > core-2.2
annotate src/lib/uri-util.c @ 22664:fea53c2725c0
director: Fix director_max_parallel_moves/kicks type
Should be uint, not time.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 09 Nov 2017 12:24:16 +0200 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21389
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
2 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
3 #include "lib.h" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
4 #include "array.h" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
5 #include "str.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
15045
diff
changeset
|
6 #include "net.h" |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
7 #include "uri-util.h" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
8 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
9 #include <ctype.h> |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
10 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
11 /* |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
12 * Generic URI parsing. |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
13 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
14 * [URI-GEN] RFC3986 Appendix A: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
15 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
16 * host = IP-literal / IPv4address / reg-name |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
17 * port = *DIGIT |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
18 * reg-name = *( unreserved / pct-encoded / sub-delims ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
19 * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
20 * pct-encoded = "%" HEXDIG HEXDIG |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
21 * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
22 * / "*" / "+" / "," / ";" / "=" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
23 * IP-literal = "[" ( IPv6address / IPvFuture ) "]" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
24 * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
25 * IPv6address = 6( h16 ":" ) ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
26 * / "::" 5( h16 ":" ) ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
27 * / [ h16 ] "::" 4( h16 ":" ) ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
28 * / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
29 * / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
30 * / [ *3( h16 ":" ) h16 ] "::" h16 ":" ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
31 * / [ *4( h16 ":" ) h16 ] "::" ls32 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
32 * / [ *5( h16 ":" ) h16 ] "::" h16 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
33 * / [ *6( h16 ":" ) h16 ] "::" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
34 * h16 = 1*4HEXDIG |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
35 * ls32 = ( h16 ":" h16 ) / IPv4address |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
36 * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
37 * dec-octet = DIGIT ; 0-9 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
38 * / %x31-39 DIGIT ; 10-99 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
39 * / "1" 2DIGIT ; 100-199 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
40 * / "2" %x30-34 DIGIT ; 200-249 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
41 * / "25" %x30-35 ; 250-255 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
42 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
43 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
44 #define URI_MAX_SCHEME_NAME_LEN 64 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
45 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
46 /* Character lookup table |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
47 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
48 * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" [bit0] |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
49 * sub-delims = "!" / "$" / "&" / "'" / "(" / ")" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
50 * / "*" / "+" / "," / ";" / "=" [bit1] |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
51 * gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" [bit2] |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
52 * pchar = unreserved / sub-delims / ":" / "@" [bit0|bit1|bit3] |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
53 * 'pfchar' = unreserved / sub-delims / ":" / "@" / "/" |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
54 * [bit0|bit1|bit3|bit5] |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
55 * 'uchar' = unreserved / sub-delims / ":" [bit0|bit1|bit4] |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
56 * 'qchar' = pchar / "/" / "?" [bit0|bit1|bit3|bit5|bit6] |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
57 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
58 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
59 |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
60 #define CHAR_MASK_UNRESERVED (1<<0) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
61 #define CHAR_MASK_SUB_DELIMS (1<<1) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
62 #define CHAR_MASK_PCHAR ((1<<0)|(1<<1)|(1<<3)) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
63 #define CHAR_MASK_PFCHAR ((1<<0)|(1<<1)|(1<<3)|(1<<5)) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
64 #define CHAR_MASK_UCHAR ((1<<0)|(1<<1)|(1<<4)) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
65 #define CHAR_MASK_QCHAR ((1<<0)|(1<<1)|(1<<3)|(1<<5)|(1<<6)) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
66 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
67 static unsigned const char _uri_char_lookup[256] = { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 10 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
70 0, 2, 0, 4, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 1, 36, // 20 |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
71 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 28, 2, 0, 2, 0, 68, // 30 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
72 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 40 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
73 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 4, 0, 1, // 50 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
74 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 60 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
75 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, // 70 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
76 }; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
77 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
78 static inline int _decode_hex_digit(const unsigned char digit) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
79 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
80 switch (digit) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
81 case '0': case '1': case '2': case '3': case '4': |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
82 case '5': case '6': case '7': case '8': case '9': |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
83 return digit - '0'; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
84 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
85 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
86 return digit - 'a' + 0x0a; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
87 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
88 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
89 return digit - 'A' + 0x0A; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
90 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
91 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
92 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
93 |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
94 static int |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
95 uri_parse_pct_encoded_data(struct uri_parser *parser, |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
96 const unsigned char **p, const unsigned char *pend, |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
97 unsigned char *ch_r) ATTR_NULL(3) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
98 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
99 int value; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
100 |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
101 if (**p != '%' || (pend != NULL && *p >= pend)) |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
102 return 0; |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
103 *p += 1; |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
104 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
105 if (**p == 0 || *(*p+1) == 0 || (pend != NULL && *p+1 >= pend)) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
106 parser->error = "Unexpected URI boundary after '%'"; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
107 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
108 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
109 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
110 if ((value = _decode_hex_digit(**p)) < 0) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
111 parser->error = p_strdup_printf(parser->pool, |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
112 "Expecting hex digit after '%%', but found '%c'", **p); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
113 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
114 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
115 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
116 *ch_r = (value & 0x0f) << 4; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
117 *p += 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
118 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
119 if ((value = _decode_hex_digit(**p)) < 0) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
120 parser->error = p_strdup_printf(parser->pool, |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
121 "Expecting hex digit after '%%%c', but found '%c'", *((*p)-1), **p); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
122 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
123 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
124 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
125 *ch_r |= (value & 0x0f); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
126 *p += 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
127 |
21364
518bc42408d6
lib, lib-http: add HTTP_URL_ALLOW_PCT_NUL flag
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
20868
diff
changeset
|
128 if (!parser->allow_pct_nul && *ch_r == '\0') { |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
129 parser->error = |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
130 "Percent encoding is not allowed to encode NUL character"; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
131 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
132 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
133 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
134 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
135 |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
136 int uri_parse_pct_encoded(struct uri_parser *parser, |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
137 unsigned char *ch_r) |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
138 { |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
139 return uri_parse_pct_encoded_data |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
140 (parser, &parser->cur, parser->end, ch_r); |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
141 } |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
142 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
143 static int |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
144 uri_parse_unreserved_char(struct uri_parser *parser, unsigned char *ch_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
145 { |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
146 int ret; |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
147 |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
148 if ((ret=uri_parse_pct_encoded(parser, ch_r)) != 0) |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
149 return ret; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
150 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
151 if ((*parser->cur & 0x80) != 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
152 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
153 |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
154 if ((_uri_char_lookup[*parser->cur] & CHAR_MASK_UNRESERVED) != 0) { |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
155 *ch_r = *parser->cur; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
156 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
157 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
158 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
159 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
160 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
161 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
162 int uri_parse_unreserved(struct uri_parser *parser, string_t *part) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
163 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
164 int len = 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
165 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
166 while (parser->cur < parser->end) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
167 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
168 unsigned char ch = 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
169 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
170 if ((ret = uri_parse_unreserved_char(parser, &ch)) < 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
171 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
172 if (ret == 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
173 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
174 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
175 if (part != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
176 str_append_c(part, ch); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
177 len++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
178 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
179 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
180 return len > 0 ? 1 : 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
181 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
182 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
183 bool uri_data_decode(struct uri_parser *parser, const char *data, |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
184 const char *until, const char **decoded_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
185 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
186 const unsigned char *p = (const unsigned char *)data; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
187 const unsigned char *pend = (const unsigned char *)until; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
188 string_t *decoded; |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
189 int ret; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
190 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
191 if (pend == NULL) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
192 /* NULL means unlimited; solely rely on '\0' */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
193 pend = (const unsigned char *)(size_t)-1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
194 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
195 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
196 if (p >= pend || *p == '\0') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
197 if (decoded_r != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
198 *decoded_r = ""; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
199 return TRUE; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
200 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
201 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
202 decoded = uri_parser_get_tmpbuf(parser, 256); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
203 while (p < pend && *p != '\0') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
204 unsigned char ch; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
205 |
20867
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
206 if ((ret=uri_parse_pct_encoded_data |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
207 (parser, &p, NULL, &ch)) != 0) { |
32678cf64cd1
uri-util: Added public function for parsing single percent encoding instances.
Stephan Bosch <stephan@rename-it.nl>
parents:
20866
diff
changeset
|
208 if (ret < 0) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
209 return FALSE; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
210 str_append_c(decoded, ch); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
211 } else { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
212 str_append_c(decoded, *p); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
213 p++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
214 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
215 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
216 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
217 if (decoded_r != NULL) |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
218 *decoded_r = p_strdup(parser->pool, str_c(decoded)); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
219 return TRUE; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
220 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
221 |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
222 int uri_cut_scheme(const char **uri_p, const char **scheme_r) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
223 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
224 const char *p = *uri_p; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
225 size_t len = 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
226 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
227 /* RFC 3968: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
228 * scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
229 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
230 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
231 if (!i_isalpha(*p)) |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
232 return -1; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
233 p++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
234 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
235 while (len < URI_MAX_SCHEME_NAME_LEN && *p != '\0') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
236 if (!i_isalnum(*p) && *p != '+' && *p != '-' && *p != '.') |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
237 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
238 p++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
239 len++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
240 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
241 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
242 if (*p != ':') |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
243 return -1; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
244 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
245 if (scheme_r != NULL) |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
246 *scheme_r = t_strdup_until(*uri_p, p); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
247 *uri_p = p + 1; |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
248 return 0; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
249 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
250 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
251 int uri_parse_scheme(struct uri_parser *parser, const char **scheme_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
252 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
253 const char *p; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
254 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
255 if (parser->cur >= parser->end) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
256 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
257 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
258 p = (const char *)parser->cur; |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
259 if (uri_cut_scheme(&p, scheme_r) < 0) |
14737 | 260 return 0; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
261 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
262 parser->cur = (const unsigned char *)p; |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
263 if (!parser->pool->datastack_pool) |
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
264 *scheme_r = p_strdup(parser->pool, *scheme_r); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
265 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
266 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
267 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
268 static int |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
269 uri_parse_dec_octet(struct uri_parser *parser, string_t *literal, |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
270 uint8_t *octet_r) ATTR_NULL(2) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
271 { |
17561
439bba739c49
lib: uri-util - hardern uri_parse_dec_octet() against overflow
Phil Carmody <phil@dovecot.fi>
parents:
17559
diff
changeset
|
272 unsigned int octet = 0; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
273 int count = 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
274 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
275 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
276 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
277 * dec-octet = DIGIT ; 0-9 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
278 * / %x31-39 DIGIT ; 10-99 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
279 * / "1" 2DIGIT ; 100-199 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
280 * / "2" %x30-34 DIGIT ; 200-249 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
281 * / "25" %x30-35 ; 250-255 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
282 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
283 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
284 while (parser->cur < parser->end && i_isdigit(*parser->cur)) { |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
285 octet = octet * 10 + (parser->cur[0] - '0'); |
17561
439bba739c49
lib: uri-util - hardern uri_parse_dec_octet() against overflow
Phil Carmody <phil@dovecot.fi>
parents:
17559
diff
changeset
|
286 if (octet > 255) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
287 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
288 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
289 if (literal != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
290 str_append_c(literal, *parser->cur); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
291 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
292 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
293 count++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
294 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
295 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
296 if (count > 0) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
297 *octet_r = octet; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
298 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
299 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
300 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
301 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
302 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
303 static int |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
304 uri_parse_ipv4address(struct uri_parser *parser, string_t *literal, |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
305 struct in_addr *ip4_r) ATTR_NULL(2,3) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
306 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
307 uint8_t octet; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
308 uint32_t ip = 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
309 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
310 int i; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
311 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
312 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
313 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
314 * IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
315 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
316 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
317 if ((ret = uri_parse_dec_octet(parser, literal, &octet)) <= 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
318 return ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
319 ip = octet; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
320 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
321 for (i = 0; i < 3 && parser->cur < parser->end; i++) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
322 if (*parser->cur != '.') |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
323 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
324 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
325 if (literal != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
326 str_append_c(literal, '.'); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
327 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
328 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
329 if ((ret = uri_parse_dec_octet(parser, literal, &octet)) <= 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
330 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
331 ip = (ip << 8) + octet; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
332 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
333 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
334 if (ip4_r != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
335 ip4_r->s_addr = htonl(ip); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
336 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
337 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
338 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
339 static int |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
340 uri_parse_reg_name(struct uri_parser *parser, |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
341 string_t *reg_name) ATTR_NULL(2) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
342 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
343 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
344 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
345 * reg-name = *( unreserved / pct-encoded / sub-delims ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
346 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
347 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
348 while (parser->cur < parser->end) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
349 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
350 unsigned char c; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
351 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
352 /* unreserved / pct-encoded */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
353 if ((ret = uri_parse_unreserved_char(parser, &c)) < 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
354 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
355 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
356 if (ret > 0) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
357 if (reg_name != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
358 str_append_c(reg_name, c); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
359 continue; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
360 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
361 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
362 /* sub-delims */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
363 c = *parser->cur; |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
364 if ((c & 0x80) == 0 && (_uri_char_lookup[c] & CHAR_MASK_SUB_DELIMS) != 0) { |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
365 if (reg_name != NULL) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
366 str_append_c(reg_name, *parser->cur); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
367 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
368 continue; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
369 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
370 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
371 } |
18495
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
372 return 0; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
373 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
374 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
375 #ifdef HAVE_IPV6 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
376 static int |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
377 uri_parse_ip_literal(struct uri_parser *parser, string_t *literal, |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
378 struct in6_addr *ip6_r) ATTR_NULL(2,3) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
379 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
380 const unsigned char *p; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
381 const char *address; |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
382 struct in6_addr ip6; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
383 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
384 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
385 /* IP-literal = "[" ( IPv6address / IPvFuture ) "]" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
386 * IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
387 * IPv6address = ; Syntax not relevant: parsed using inet_pton() |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
388 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
389 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
390 /* "[" already verified */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
391 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
392 /* Scan for end of address */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
393 for (p = parser->cur+1; p < parser->end; p++) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
394 if (*p == ']') |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
395 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
396 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
397 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
398 if (p >= parser->end || *p != ']') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
399 parser->error = "Expecting ']' at end of IP-literal"; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
400 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
401 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
402 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
403 if (literal != NULL) |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
404 str_append_n(literal, parser->cur, p-parser->cur+1); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
405 address = t_strdup_until(parser->cur+1, p); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
406 parser->cur = p + 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
407 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
408 if (*address == '\0') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
409 parser->error = "Empty IPv6 host address"; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
410 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
411 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
412 if (*address == 'v') { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
413 parser->error = p_strdup_printf(parser->pool, |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
414 "Future IP host address '%s' not supported", address); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
415 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
416 } |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
417 if ((ret = inet_pton(AF_INET6, address, &ip6)) <= 0) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
418 parser->error = p_strdup_printf(parser->pool, |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
419 "Invalid IPv6 host address '%s'", address); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
420 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
421 } |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
422 if (ip6_r != NULL) |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
423 *ip6_r = ip6; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
424 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
425 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
426 #endif |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
427 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
428 static int |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
429 uri_parse_host(struct uri_parser *parser, |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
430 struct uri_authority *auth) ATTR_NULL(2) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
431 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
432 const unsigned char *preserve; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
433 struct in_addr ip4; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
434 struct in6_addr ip6; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
435 string_t *literal = NULL; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
436 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
437 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
438 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
439 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
440 * host = IP-literal / IPv4address / reg-name |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
441 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
442 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
443 literal = uri_parser_get_tmpbuf(parser, 256); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
444 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
445 /* IP-literal / */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
446 if (parser->cur < parser->end && *parser->cur == '[') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
447 #ifdef HAVE_IPV6 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
448 if ((ret=uri_parse_ip_literal(parser, literal, &ip6)) <= 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
449 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
450 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
451 if (auth != NULL) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
452 auth->host_literal = p_strdup(parser->pool, str_c(literal)); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
453 auth->host_ip.family = AF_INET6; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
454 auth->host_ip.u.ip6 = ip6; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
455 auth->have_host_ip = TRUE; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
456 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
457 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
458 #else |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
459 parser->error = "IPv6 host address is not supported"; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
460 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
461 #endif |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
462 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
463 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
464 /* IPv4address / |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
465 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
466 * If it fails to parse, we try to parse it as a reg-name |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
467 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
468 preserve = parser->cur; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
469 if ((ret = uri_parse_ipv4address(parser, literal, &ip4)) > 0) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
470 if (auth != NULL) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
471 auth->host_literal = p_strdup(parser->pool, str_c(literal)); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
472 auth->host_ip.family = AF_INET; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
473 auth->host_ip.u.ip4 = ip4; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
474 auth->have_host_ip = TRUE; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
475 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
476 return ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
477 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
478 parser->cur = preserve; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
479 str_truncate(literal, 0); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
480 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
481 /* reg-name */ |
18495
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
482 if (uri_parse_reg_name(parser, literal) < 0) |
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
483 return -1; |
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
484 if (auth != NULL) { |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
485 auth->host_literal = p_strdup(parser->pool, str_c(literal)); |
18495
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
486 auth->have_host_ip = FALSE; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
487 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
488 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
489 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
490 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
491 static int |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
492 uri_parse_port(struct uri_parser *parser, |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
493 struct uri_authority *auth) ATTR_NULL(2) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
494 { |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
495 const unsigned char *first; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
496 in_port_t port; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
497 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
498 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
499 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
500 * port = *DIGIT |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
501 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
502 |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
503 first = parser->cur; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
504 while (parser->cur < parser->end && i_isdigit(*parser->cur)) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
505 parser->cur++; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
506 |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
507 if (parser->cur == first) |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
508 return 0; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
509 if (net_str2port(t_strdup_until(first, parser->cur), &port) < 0) { |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
510 parser->error = "Invalid port number"; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
511 return -1; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
512 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
513 |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
514 if (auth != NULL) { |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
515 auth->port = port; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
516 auth->have_port = TRUE; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
517 } |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18497
diff
changeset
|
518 return 1; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
519 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
520 |
16738
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
521 int uri_parse_authority(struct uri_parser *parser, |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
522 struct uri_authority *auth) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
523 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
524 const unsigned char *p; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
525 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
526 |
16738
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
527 /* |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
528 * authority = [ userinfo "@" ] host [ ":" port ] |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
529 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
530 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
531 if (auth != NULL) |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21364
diff
changeset
|
532 i_zero(auth); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
533 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
534 /* Scan ahead to check whether there is a [userinfo "@"] uri component */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
535 for (p = parser->cur; p < parser->end; p++){ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
536 /* refuse 8bit characters */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
537 if ((*p & 0x80) != 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
538 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
539 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
540 /* break at first delimiter */ |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
541 if (*p != '%' && (_uri_char_lookup[*p] & CHAR_MASK_UCHAR) == 0) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
542 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
543 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
544 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
545 /* Extract userinfo */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
546 if (p < parser->end && *p == '@') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
547 if (auth != NULL) |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
548 auth->enc_userinfo = p_strdup_until(parser->pool, parser->cur, p); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
549 parser->cur = p+1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
550 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
551 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
552 /* host */ |
18495
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
553 if (uri_parse_host(parser, auth) < 0) |
9024d226b813
uri-util: Allow empty host name in the generic URI syntax as specified in RFC 3986.
Stephan Bosch <stephan@rename-it.nl>
parents:
18137
diff
changeset
|
554 return -1; |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
555 if (parser->cur == parser->end) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
556 return 1; |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
557 switch (*parser->cur) { |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
558 case ':': case '/': case '?': case '#': |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
559 break; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
560 default: |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
561 parser->error = "Invalid host identifier"; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
562 return -1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
563 } |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
564 |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
565 /* [":" port] */ |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
566 if (*parser->cur == ':') { |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
567 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
568 |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
569 if ((ret = uri_parse_port(parser, auth)) < 0) |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
570 return ret; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
571 if (parser->cur == parser->end) |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
572 return 1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
573 switch (*parser->cur) { |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
574 case '/': case '?': case '#': |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
575 break; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
576 default: |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
577 parser->error = "Invalid host port"; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
578 return -1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
579 } |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
580 } |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
581 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
582 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
583 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
584 |
16738
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
585 int uri_parse_slashslash_authority(struct uri_parser *parser, |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
586 struct uri_authority *auth) |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
587 { |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
588 /* "//" authority */ |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
589 |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
590 if ((parser->end - parser->cur) <= 2 || parser->cur[0] != '/' || |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
591 parser->cur[1] != '/') |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
592 return 0; |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
593 |
16757
a114a8bfce61
Fixed uri_parse_slashslash_authority() to skip over "//".
Timo Sirainen <tss@iki.fi>
parents:
16738
diff
changeset
|
594 parser->cur += 2; |
16738
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
595 return uri_parse_authority(parser, auth); |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
596 } |
3bd334529536
uri-util: Added support for parsing bare authority URI component (for use in HTTP).
Stephan Bosch <stephan@rename-it.nl>
parents:
16666
diff
changeset
|
597 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
598 int uri_parse_path_segment(struct uri_parser *parser, const char **segment_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
599 { |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
600 const unsigned char *first = parser->cur; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
601 int ret; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
602 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
603 while (parser->cur < parser->end) { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
604 if (*parser->cur == '%') { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
605 unsigned char ch = 0; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
606 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
607 return -1; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
608 if (ret > 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
609 continue; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
610 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
611 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
612 if ((*parser->cur & 0x80) != 0 || |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
613 (_uri_char_lookup[*parser->cur] & CHAR_MASK_PCHAR) == 0) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
614 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
615 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
616 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
617 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
618 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
619 if (parser->cur < parser->end && |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
620 *parser->cur != '/' && *parser->cur != '?' && *parser->cur != '#' ) { |
20866
07f2f4327553
uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents:
20863
diff
changeset
|
621 parser->error = |
07f2f4327553
uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents:
20863
diff
changeset
|
622 "Path component contains invalid character"; |
07f2f4327553
uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents:
20863
diff
changeset
|
623 return -1; |
07f2f4327553
uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents:
20863
diff
changeset
|
624 } |
07f2f4327553
uri-util: Fixed assertion failure for invalid character in path segment.
Stephan Bosch <stephan@rename-it.nl>
parents:
20863
diff
changeset
|
625 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
626 if (first == parser->cur) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
627 return 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
628 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
629 if (segment_r != NULL) |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
630 *segment_r = p_strdup_until(parser->pool, first, parser->cur); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
631 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
632 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
633 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
634 int uri_parse_path(struct uri_parser *parser, |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
635 int *relative_r, const char *const **path_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
636 { |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
637 const unsigned char *pbegin = parser->cur; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
638 ARRAY_TYPE(const_string) segments; |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
639 const char *segment = NULL; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
640 unsigned int count; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
641 int relative = 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
642 int ret; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
643 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
644 count = 0; |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
645 if (path_r != NULL) |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
646 p_array_init(&segments, parser->pool, 16); |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
647 else |
21389
59437f8764c6
global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21364
diff
changeset
|
648 i_zero(&segments); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
649 |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
650 /* check for a leading '/' and indicate absolute path |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
651 when it is present |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
652 */ |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
653 if (parser->cur < parser->end && *parser->cur == '/') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
654 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
655 relative = 0; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
656 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
657 |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
658 /* parse first segment */ |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
659 if ((ret = uri_parse_path_segment(parser, &segment)) < 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
660 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
661 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
662 for (;;) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
663 if (ret > 0) { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
664 /* strip dot segments */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
665 if (segment[0] == '.') { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
666 if (segment[1] == '.') { |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
667 if (segment[2] == '\0') { |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
668 /* '..' -> skip and... */ |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
669 segment = NULL; |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
670 |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
671 /* ... pop last segment (if any) */ |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
672 if (count > 0) { |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
673 if (path_r != NULL) { |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
674 i_assert(count == array_count(&segments)); |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
675 array_delete(&segments, count-1, 1); |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
676 } |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
677 count--; |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
678 } else if ( relative > 0 ) { |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
679 relative++; |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
680 } |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
681 } |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
682 } else if (segment[1] == '\0') { |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
683 /* '.' -> skip */ |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
684 segment = NULL; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
685 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
686 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
687 } else { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
688 segment = ""; |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
689 } |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
690 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
691 if (segment != NULL) { |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
692 if (path_r != NULL) |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
693 array_append(&segments, &segment, 1); |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
694 count++; |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
695 } |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
696 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
697 if (parser->cur >= parser->end || *parser->cur != '/') |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
698 break; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
699 parser->cur++; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
700 |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
701 /* parse next path segment */ |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
702 if ((ret = uri_parse_path_segment(parser, &segment)) < 0) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
703 return -1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
704 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
705 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
706 if (relative_r != NULL) |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
707 *relative_r = relative; |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
708 if (path_r != NULL) |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
709 *path_r = NULL; |
17537
3f9d15b600b1
imap-url: Fixed handling of ipath-empty syntax (basically empty relative URLs).
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
710 |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
711 if (parser->cur == pbegin) { |
17537
3f9d15b600b1
imap-url: Fixed handling of ipath-empty syntax (basically empty relative URLs).
Stephan Bosch <stephan@rename-it.nl>
parents:
17130
diff
changeset
|
712 /* path part of URI is empty */ |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
713 return 0; |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
714 } |
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
715 |
18497
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
716 if (path_r != NULL) { |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
717 /* special treatment for a trailing '..' or '.' */ |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
718 if (segment == NULL) { |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
719 segment = ""; |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
720 array_append(&segments, &segment, 1); |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
721 } |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
722 array_append_zero(&segments); |
49bcc3954799
uri-util: Added the possibility of only checking the URI without parsing any of the data.
Stephan Bosch <stephan@rename-it.nl>
parents:
18496
diff
changeset
|
723 *path_r = array_get(&segments, &count); |
15193
f960ad98429c
uri-util: Fix handling of '..' and '.' segments in URI paths.
Stephan Bosch <stephan@rename-it.nl>
parents:
15187
diff
changeset
|
724 } |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
725 if (parser->cur < parser->end && |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
726 *parser->cur != '?' && *parser->cur != '#') { |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
727 parser->error = "Path component contains invalid character"; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
728 return -1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
729 } |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
730 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
731 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
732 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
733 int uri_parse_query(struct uri_parser *parser, const char **query_r) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
734 { |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
735 const unsigned char *first = parser->cur; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
736 int ret; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
737 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
738 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
739 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
740 * URI = { ... } [ "?" query ] { ... } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
741 * query = *( pchar / "/" / "?" ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
742 * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
743 */ |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
744 if (parser->cur >= parser->end || *parser->cur != '?') |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
745 return 0; |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
746 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
747 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
748 while (parser->cur < parser->end) { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
749 if (*parser->cur == '%') { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
750 unsigned char ch = 0; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
751 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
752 return -1; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
753 if (ret > 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
754 continue; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
755 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
756 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
757 if ((*parser->cur & 0x80) != 0 || |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
758 (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
759 break; |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
760 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
761 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
762 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
763 if (parser->cur < parser->end && *parser->cur != '#') { |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
764 parser->error = "Query component contains invalid character"; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
765 return -1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
766 } |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
767 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
768 if (query_r != NULL) |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
769 *query_r = p_strdup_until(parser->pool, first+1, parser->cur); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
770 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
771 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
772 |
14594
27c8a6c9088d
Error handling API changes to previous IMAP URL related changes.
Timo Sirainen <tss@iki.fi>
parents:
14587
diff
changeset
|
773 int uri_parse_fragment(struct uri_parser *parser, const char **fragment_r) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
774 { |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
775 const unsigned char *first = parser->cur; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
776 int ret; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
777 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
778 /* RFC 3986: |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
779 * |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
780 * URI = { ... } [ "#" fragment ] |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
781 * fragment = *( pchar / "/" / "?" ) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
782 * pchar = unreserved / pct-encoded / sub-delims / ":" / "@" |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
783 */ |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
784 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
785 if (parser->cur >= parser->end || *parser->cur != '#') |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
786 return 0; |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
787 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
788 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
789 while (parser->cur < parser->end) { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
790 if (*parser->cur == '%') { |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
791 unsigned char ch = 0; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
792 if ((ret=uri_parse_pct_encoded(parser, &ch)) < 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
793 return -1; |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
794 if (ret > 0) |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
795 continue; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
796 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
797 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
798 if ((*parser->cur & 0x80) != 0 || |
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
799 (_uri_char_lookup[*parser->cur] & CHAR_MASK_QCHAR) == 0) |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
800 break; |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
801 parser->cur++; |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
802 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
803 |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
804 if (parser->cur < parser->end) { |
18496
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
805 parser->error = "Fragment component contains invalid character"; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
806 return -1; |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
807 } |
5ae8cd8e42f7
uri-util: Improve errors about invalid characters in URI by reporting the component where the offending character is located.
Stephan Bosch <stephan@rename-it.nl>
parents:
18495
diff
changeset
|
808 |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
809 if (fragment_r != NULL) |
20868
82e8fc1b394f
lib: uri-util: Always fully check the syntax of percent encoding while parsing URI components.
Stephan Bosch <stephan@dovecot.fi>
parents:
20867
diff
changeset
|
810 *fragment_r = p_strdup_until(parser->pool, first+1, parser->cur); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
811 return 1; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
812 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
813 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
814 void uri_parser_init(struct uri_parser *parser, pool_t pool, const char *data) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
815 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
816 parser->pool = pool; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
817 parser->begin = parser->cur = (unsigned char *)data; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
818 parser->end = (unsigned char *)data + strlen(data); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
819 parser->error = NULL; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
820 parser->tmpbuf = NULL; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
821 } |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
822 |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
823 string_t *uri_parser_get_tmpbuf(struct uri_parser *parser, size_t size) |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
824 { |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
825 if (parser->tmpbuf == NULL) |
19299
b0545670fd99
lib: uri_parser_init() wasn't using pool parameter for anything.
Timo Sirainen <tss@iki.fi>
parents:
19035
diff
changeset
|
826 parser->tmpbuf = str_new(parser->pool, size); |
14587
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
827 else |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
828 str_truncate(parser->tmpbuf, 0); |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
829 return parser->tmpbuf; |
ba36e4380cf4
liblib: Added generic URI parsing functions.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
830 } |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
831 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
832 /* |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
833 * Generic URI construction |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
834 */ |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
835 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
836 static void |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
837 uri_data_encode(string_t *out, const unsigned char esc_table[256], |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
838 unsigned char esc_mask, const char *esc_extra, const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
839 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
840 const unsigned char *p = (const unsigned char *)data; |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
841 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
842 while (*p != '\0') { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
843 if ((*p & 0x80) != 0 || (esc_table[*p] & esc_mask) == 0 || |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
844 strchr(esc_extra, (char)*p) != NULL) { |
15487
ce258aa11821
uri-util: Control characters weren't properly escaped.
Timo Sirainen <tss@iki.fi>
parents:
15193
diff
changeset
|
845 str_printfa(out, "%%%02x", *p); |
15045
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
846 } else { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
847 str_append_c(out, *p); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
848 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
849 p++; |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
850 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
851 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
852 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
853 void uri_append_scheme(string_t *out, const char *scheme) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
854 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
855 str_append(out, scheme); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
856 str_append_c(out, ':'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
857 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
858 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
859 void uri_append_user_data(string_t *out, const char *esc, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
860 const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
861 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
862 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_UCHAR, esc, data); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
863 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
864 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
865 void uri_append_userinfo(string_t *out, const char *userinfo) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
866 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
867 uri_append_user_data(out, "", userinfo); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
868 str_append_c(out, '@'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
869 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
870 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
871 void uri_append_host_name(string_t *out, const char *name) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
872 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
873 uri_data_encode(out, _uri_char_lookup, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
874 CHAR_MASK_UNRESERVED | CHAR_MASK_SUB_DELIMS, "", name); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
875 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
876 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
877 void uri_append_host_ip(string_t *out, const struct ip_addr *host_ip) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
878 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
879 const char *addr = net_ip2addr(host_ip); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
880 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
881 if (host_ip->family == AF_INET) { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
882 str_append(out, addr); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
883 return; |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
884 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
885 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
886 i_assert(host_ip->family == AF_INET6); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
887 str_append_c(out, '['); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
888 str_append(out, addr); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
889 str_append_c(out, ']'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
890 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
891 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
892 void uri_append_port(string_t *out, in_port_t port) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
893 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
894 str_printfa(out, ":%u", port); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
895 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
896 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
897 void uri_append_path_segment_data(string_t *out, const char *esc, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
898 const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
899 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
900 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_PCHAR, esc, data); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
901 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
902 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
903 void uri_append_path_segment(string_t *out, const char *segment) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
904 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
905 str_append_c(out, '/'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
906 if (*segment != '\0') |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
907 uri_append_path_data(out, "", segment); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
908 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
909 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
910 void uri_append_path_data(string_t *out, const char *esc, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
911 const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
912 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
913 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_PFCHAR, esc, data); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
914 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
915 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
916 void uri_append_path(string_t *out, const char *path) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
917 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
918 str_append_c(out, '/'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
919 if (*path != '\0') |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
920 uri_append_path_data(out, "", path); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
921 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
922 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
923 void uri_append_query_data(string_t *out, const char *esc, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
924 const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
925 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
926 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_QCHAR, esc, data); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
927 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
928 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
929 void uri_append_query(string_t *out, const char *query) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
930 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
931 str_append_c(out, '?'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
932 if (*query != '\0') |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
933 uri_append_query_data(out, "", query); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
934 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
935 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
936 void uri_append_fragment_data(string_t *out, const char *esc, |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
937 const char *data) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
938 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
939 uri_data_encode(out, _uri_char_lookup, CHAR_MASK_QCHAR, esc, data); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
940 } |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
941 |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
942 void uri_append_fragment(string_t *out, const char *fragment) |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
943 { |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
944 str_append_c(out, '#'); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
945 if (*fragment != '\0') |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
946 uri_append_fragment_data(out, "", fragment); |
345e96ca65a2
Added support for creating IMAP URLs.
Stephan Bosch <stephan@rename-it.nl>
parents:
14737
diff
changeset
|
947 } |