]>
Commit | Line | Data |
---|---|---|
bbc27441 | 1 | /* |
5b74111a | 2 | * Copyright (C) 1996-2018 The Squid Software Foundation and contributors |
bbc27441 AJ |
3 | * |
4 | * Squid software is distributed under GPLv2+ license and includes | |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
7 | */ | |
8 | ||
f7f3304a | 9 | #include "squid.h" |
38e16f92 | 10 | #include "format/Quoting.h" |
20efa1c2 AJ |
11 | |
12 | static const char c2x[] = | |
13 | "000102030405060708090a0b0c0d0e0f" | |
14 | "101112131415161718191a1b1c1d1e1f" | |
15 | "202122232425262728292a2b2c2d2e2f" | |
16 | "303132333435363738393a3b3c3d3e3f" | |
17 | "404142434445464748494a4b4c4d4e4f" | |
18 | "505152535455565758595a5b5c5d5e5f" | |
19 | "606162636465666768696a6b6c6d6e6f" | |
20 | "707172737475767778797a7b7c7d7e7f" | |
21 | "808182838485868788898a8b8c8d8e8f" | |
22 | "909192939495969798999a9b9c9d9e9f" | |
23 | "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" | |
24 | "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" | |
25 | "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" | |
26 | "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" | |
27 | "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" | |
28 | "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; | |
29 | ||
20efa1c2 | 30 | char * |
38e16f92 | 31 | Format::QuoteUrlEncodeUsername(const char *name) |
20efa1c2 AJ |
32 | { |
33 | if (NULL == name) | |
34 | return NULL; | |
35 | ||
36 | if (name[0] == '\0') | |
37 | return NULL; | |
38 | ||
39 | return QuoteMimeBlob(name); | |
20efa1c2 AJ |
40 | } |
41 | ||
42 | char * | |
38e16f92 | 43 | Format::QuoteMimeBlob(const char *header) |
20efa1c2 AJ |
44 | { |
45 | int c; | |
46 | int i; | |
47 | char *buf; | |
48 | char *buf_cursor; | |
49 | ||
50 | if (header == NULL) { | |
51 | buf = static_cast<char *>(xcalloc(1, 1)); | |
52 | *buf = '\0'; | |
53 | return buf; | |
54 | } | |
55 | ||
56 | buf = static_cast<char *>(xcalloc(1, (strlen(header) * 3) + 1)); | |
57 | buf_cursor = buf; | |
d6d0eb11 | 58 | /* |
20efa1c2 AJ |
59 | * Whe OLD_LOG_MIME is defined we escape: \x00-\x1F"#%;<>?{}|\\\\^~`\[\]\x7F-\xFF |
60 | * which is the default escape list for the CPAN Perl5 URI module | |
61 | * modulo the inclusion of space (x40) to make the raw logs a bit | |
62 | * more readable. | |
63 | */ | |
64 | ||
65 | while ((c = *(const unsigned char *) header++) != '\0') { | |
66 | #if !OLD_LOG_MIME | |
67 | if (c == '\r') { | |
a38ec4b1 FC |
68 | *buf_cursor = '\\'; |
69 | ++buf_cursor; | |
70 | *buf_cursor = 'r'; | |
71 | ++buf_cursor; | |
20efa1c2 | 72 | } else if (c == '\n') { |
a38ec4b1 FC |
73 | *buf_cursor = '\\'; |
74 | ++buf_cursor; | |
75 | *buf_cursor = 'n'; | |
76 | ++buf_cursor; | |
20efa1c2 AJ |
77 | } else |
78 | #endif | |
79 | if (c <= 0x1F | |
80 | || c >= 0x7F | |
81 | || c == '%' | |
82 | #if OLD_LOG_MIME | |
83 | || c == '"' | |
84 | || c == '#' | |
85 | || c == ';' | |
86 | || c == '<' | |
87 | || c == '>' | |
88 | || c == '?' | |
89 | || c == '{' | |
90 | || c == '}' | |
91 | || c == '|' | |
92 | || c == '\\' | |
93 | || c == '^' | |
94 | || c == '~' | |
95 | || c == '`' | |
96 | #endif | |
97 | || c == '[' | |
98 | || c == ']') { | |
a38ec4b1 FC |
99 | *buf_cursor = '%'; |
100 | ++buf_cursor; | |
20efa1c2 | 101 | i = c * 2; |
a38ec4b1 FC |
102 | *buf_cursor = c2x[i]; |
103 | ++buf_cursor; | |
104 | *buf_cursor = c2x[i + 1]; | |
105 | ++buf_cursor; | |
20efa1c2 AJ |
106 | #if !OLD_LOG_MIME |
107 | ||
108 | } else if (c == '\\') { | |
a38ec4b1 FC |
109 | *buf_cursor = '\\'; |
110 | ++buf_cursor; | |
111 | *buf_cursor = '\\'; | |
112 | ++buf_cursor; | |
20efa1c2 AJ |
113 | #endif |
114 | ||
115 | } else { | |
a38ec4b1 FC |
116 | *buf_cursor = (char) c; |
117 | ++buf_cursor; | |
20efa1c2 AJ |
118 | } |
119 | } | |
120 | ||
121 | *buf_cursor = '\0'; | |
122 | return buf; | |
123 | } | |
f53969cc | 124 |