Blame
Date:
Mon Jul 4 09:48:39 2022 UTC
Message:
copyright years
001
2021-12-29
op
/*
002
2022-07-04
op
* Copyright (c) 2021, 2022 Omar Polo <op@omarpolo.com>
003
2021-12-29
op
*
004
2021-12-29
op
* Permission to use, copy, modify, and distribute this software for any
005
2021-12-29
op
* purpose with or without fee is hereby granted, provided that the above
006
2021-12-29
op
* copyright notice and this permission notice appear in all copies.
007
2021-12-29
op
*
008
2021-12-29
op
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
009
2021-12-29
op
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
010
2021-12-29
op
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
011
2021-12-29
op
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
012
2021-12-29
op
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
013
2021-12-29
op
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
014
2021-12-29
op
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
015
2021-12-29
op
*/
016
2021-12-29
op
017
2021-12-29
op
#include "gmid.h"
018
2021-12-29
op
019
2021-12-29
op
#include <ctype.h>
020
2021-12-29
op
#include <errno.h>
021
2021-12-29
op
#include <string.h>
022
2021-12-29
op
023
2021-12-29
op
#define MIN(a, b) ((a) < (b) ? (a) : (b))
024
2021-12-29
op
025
2022-03-19
op
static const struct timeval handshake_timeout = { 5, 0 };
026
2021-12-29
op
027
2021-12-29
op
static void proxy_tls_readcb(int, short, void *);
028
2021-12-29
op
static void proxy_tls_writecb(int, short, void *);
029
2021-12-29
op
static void proxy_read(struct bufferevent *, void *);
030
2021-12-29
op
static void proxy_write(struct bufferevent *, void *);
031
2021-12-29
op
static void proxy_error(struct bufferevent *, short, void *);
032
2021-12-29
op
033
2021-12-29
op
static void
034
2021-12-29
op
proxy_tls_readcb(int fd, short event, void *d)
035
2021-12-29
op
{
036
2021-12-29
op
struct bufferevent *bufev = d;
037
2021-12-29
op
struct client *c = bufev->cbarg;
038
2021-12-29
op
char buf[IBUF_READ_SIZE];
039
2021-12-29
op
int what = EVBUFFER_READ;
040
2021-12-29
op
int howmuch = IBUF_READ_SIZE;
041
2021-12-29
op
int res;
042
2021-12-29
op
ssize_t ret;
043
2021-12-29
op
size_t len;
044
2021-12-29
op
045
2021-12-29
op
if (event == EV_TIMEOUT) {
046
2021-12-29
op
what |= EVBUFFER_TIMEOUT;
047
2021-12-29
op
goto err;
048
2021-12-29
op
}
049
2021-12-29
op
050
2021-12-29
op
if (bufev->wm_read.high != 0)
051
2021-12-29
op
howmuch = MIN(sizeof(buf), bufev->wm_read.high);
052
2021-12-29
op
053
2021-12-29
op
switch (ret = tls_read(c->proxyctx, buf, howmuch)) {
054
2021-12-29
op
case TLS_WANT_POLLIN:
055
2021-12-29
op
case TLS_WANT_POLLOUT:
056
2021-12-29
op
goto retry;
057
2021-12-29
op
case -1:
058
2021-12-29
op
what |= EVBUFFER_ERROR;
059
2021-12-29
op
goto err;
060
2021-12-29
op
}
061
2021-12-29
op
len = ret;
062
2021-12-29
op
063
2021-12-29
op
if (len == 0) {
064
2021-12-29
op
what |= EVBUFFER_EOF;
065
2021-12-29
op
goto err;
066
2021-12-29
op
}
067
2021-12-29
op
068
2021-12-29
op
res = evbuffer_add(bufev->input, buf, len);
069
2021-12-29
op
if (res == -1) {
070
2021-12-29
op
what |= EVBUFFER_ERROR;
071
2021-12-29
op
goto err;
072
2021-12-29
op
}
073
2021-12-29
op
074
2021-12-29
op
event_add(&bufev->ev_read, NULL);
075
2021-12-29
op
076
2021-12-29
op
len = EVBUFFER_LENGTH(bufev->input);
077
2021-12-29
op
if (bufev->wm_read.low != 0 && len < bufev->wm_read.low)
078
2021-12-29
op
return;
079
2021-12-29
op
080
2021-12-29
op
if (bufev->readcb != NULL)
081
2021-12-29
op
(*bufev->readcb)(bufev, bufev->cbarg);
082
2021-12-29
op
return;
083
2021-12-29
op
084
2021-12-29
op
retry:
085
2021-12-29
op
event_add(&bufev->ev_read, NULL);
086
2021-12-29
op
return;
087
2021-12-29
op
088
2021-12-29
op
err:
089
2021-12-29
op
(*bufev->errorcb)(bufev, what, bufev->cbarg);
090
2021-12-29
op
}
091
2021-12-29
op
092
2021-12-29
op
static void
093
2021-12-29
op
proxy_tls_writecb(int fd, short event, void *d)
094
2021-12-29
op
{
095
2021-12-29
op
struct bufferevent *bufev = d;
096
2021-12-29
op
struct client *c = bufev->cbarg;
097
2021-12-29
op
ssize_t ret;
098
2021-12-29
op
size_t len;
099
2021-12-29
op
short what = EVBUFFER_WRITE;
100
2021-12-29
op
101
2021-12-29
op
if (event & EV_TIMEOUT) {
102
2021-12-29
op
what |= EVBUFFER_TIMEOUT;
103
2021-12-29
op
goto err;
104
2021-12-29
op
}
105
2021-12-29
op
106
2021-12-29
op
if (EVBUFFER_LENGTH(bufev->output) != 0) {
107
2021-12-29
op
ret = tls_write(c->proxyctx, EVBUFFER_DATA(bufev->output),
108
2021-12-29
op
EVBUFFER_LENGTH(bufev->output));
109
2021-12-29
op
switch (ret) {
110
2021-12-29
op
case TLS_WANT_POLLIN:
111
2021-12-29
op
case TLS_WANT_POLLOUT:
112
2021-12-29
op
goto retry;
113
2021-12-29
op
case -1:
114
2021-12-29
op
what |= EVBUFFER_ERROR;
115
2021-12-29
op
goto err;
116
2021-12-29
op
}
117
2021-12-29
op
len = ret;
118
2021-12-29
op
119
2021-12-29
op
evbuffer_drain(bufev->output, len);
120
2021-12-29
op
}
121
2021-12-29
op
122
2021-12-29
op
if (EVBUFFER_LENGTH(bufev->output) != 0)
123
2021-12-29
op
event_add(&bufev->ev_write, NULL);
124
2021-12-29
op
125
2021-12-29
op
if (bufev->writecb != NULL &&
126
2021-12-29
op
EVBUFFER_LENGTH(bufev->output) <= bufev->wm_write.low)
127
2021-12-29
op
(*bufev->writecb)(bufev, bufev->cbarg);
128
2021-12-29
op
return;
129
2021-12-29
op
130
2021-12-29
op
retry:
131
2021-12-29
op
event_add(&bufev->ev_write, NULL);
132
2021-12-29
op
return;
133
2021-12-29
op
134
2021-12-29
op
err:
135
2021-12-29
op
(*bufev->errorcb)(bufev, what, bufev->cbarg);
136
2021-12-29
op
}
137
2021-12-29
op
138
2021-12-29
op
static void
139
2021-12-29
op
proxy_read(struct bufferevent *bev, void *d)
140
2021-12-29
op
{
141
2021-12-29
op
struct client *c = d;
142
2021-12-29
op
struct evbuffer *src = EVBUFFER_INPUT(bev);
143
2021-12-29
op
char *hdr;
144
2021-12-29
op
size_t len;
145
2021-12-29
op
int code;
146
2021-12-29
op
147
2021-12-29
op
/* intercept the header */
148
2021-12-29
op
if (c->code == 0) {
149
2021-12-29
op
hdr = evbuffer_readln(src, &len, EVBUFFER_EOL_CRLF_STRICT);
150
2021-12-29
op
if (hdr == NULL) {
151
2021-12-29
op
/* max reply + \r\n */
152
2021-12-29
op
if (EVBUFFER_LENGTH(src) > 1029) {
153
2021-12-29
op
log_warn(c, "upstream server is trying to "
154
2021-12-29
op
"send a header that's too long.");
155
2021-12-29
op
proxy_error(bev, EVBUFFER_READ, c);
156
2021-12-29
op
}
157
2021-12-29
op
158
2021-12-29
op
/* wait a bit */
159
2021-12-29
op
return;
160
2021-12-29
op
}
161
2021-12-29
op
162
2021-12-29
op
if (len < 3 || len > 1029 ||
163
2021-12-29
op
!isdigit(hdr[0]) ||
164
2021-12-29
op
!isdigit(hdr[1]) ||
165
2021-12-29
op
!isspace(hdr[2])) {
166
2021-12-29
op
free(hdr);
167
2021-12-29
op
log_warn(c, "upstream server is trying to send a "
168
2021-12-29
op
"header that's too long.");
169
2021-12-29
op
proxy_error(bev, EVBUFFER_READ, c);
170
2021-12-29
op
return;
171
2021-12-29
op
}
172
2021-12-29
op
173
2021-12-29
op
c->header = hdr;
174
2021-12-29
op
code = (hdr[0] - '0') * 10 + (hdr[1] - '0');
175
2021-12-29
op
176
2021-12-29
op
if (code < 10 || code >= 70) {
177
2021-12-29
op
log_warn(c, "upstream server is trying to send an "
178
2021-12-29
op
"invalid reply code: %d", code);
179
2021-12-29
op
proxy_error(bev, EVBUFFER_READ, c);
180
2021-12-29
op
return;
181
2021-12-29
op
}
182
2021-12-29
op
183
2021-12-29
op
start_reply(c, code, hdr + 3);
184
2021-12-29
op
185
2021-12-29
op
if (c->code < 20 || c->code > 29) {
186
2021-12-29
op
proxy_error(bev, EVBUFFER_EOF, c);
187
2021-12-29
op
return;
188
2021-12-29
op
}
189
2021-12-29
op
}
190
2021-12-29
op
191
2021-12-29
op
bufferevent_write_buffer(c->bev, src);
192
2021-12-29
op
}
193
2021-12-29
op
194
2021-12-29
op
static void
195
2021-12-29
op
proxy_write(struct bufferevent *bev, void *d)
196
2021-12-29
op
{
197
2021-12-29
op
struct evbuffer *dst = EVBUFFER_OUTPUT(bev);
198
2021-12-29
op
199
2021-12-29
op
/* request successfully sent */
200
2021-12-29
op
if (EVBUFFER_LENGTH(dst) == 0)
201
2021-12-29
op
bufferevent_disable(bev, EV_WRITE);
202
2021-12-29
op
}
203
2021-12-29
op
204
2021-12-29
op
static void
205
2021-12-29
op
proxy_error(struct bufferevent *bev, short error, void *d)
206
2021-12-29
op
{
207
2021-12-29
op
struct client *c = d;
208
2021-12-29
op
209
2021-12-29
op
/*
210
2021-12-29
op
* If we're here it means that some kind of non-recoverable
211
2021-12-29
op
* error appened.
212
2021-12-29
op
*/
213
2021-12-29
op
214
2021-12-29
op
bufferevent_free(bev);
215
2021-12-29
op
c->proxybev = NULL;
216
2021-12-29
op
217
2021-12-29
op
tls_free(c->proxyctx);
218
2021-12-29
op
c->proxyctx = NULL;
219
2021-12-29
op
220
2021-12-29
op
close(c->pfd);
221
2021-12-29
op
c->pfd = -1;
222
2021-12-29
op
223
2021-12-29
op
/* EOF and no header */
224
2021-12-29
op
if (c->code == 0) {
225
2021-12-29
op
start_reply(c, PROXY_ERROR, "protocol error");
226
2021-12-29
op
return;
227
2021-12-29
op
}
228
2021-12-29
op
229
2021-12-29
op
c->type = REQUEST_DONE;
230
2021-12-29
op
client_write(c->bev, c);
231
2021-12-29
op
}
232
2021-12-29
op
233
2021-12-29
op
static void
234
2021-01-01
op
proxy_enqueue_req(struct client *c)
235
2021-12-29
op
{
236
2021-01-02
op
struct proxy *p = c->proxy;
237
2021-12-29
op
struct evbuffer *evb;
238
2021-12-29
op
char iribuf[GEMINI_URL_LEN];
239
2021-01-01
op
240
2021-01-01
op
c->proxybev = bufferevent_new(c->pfd, proxy_read, proxy_write,
241
2021-01-01
op
proxy_error, c);
242
2021-01-01
op
if (c->proxybev == NULL)
243
2021-01-01
op
fatal("can't allocate bufferevent: %s", strerror(errno));
244
2021-01-01
op
245
2021-01-01
op
if (!p->notls) {
246
2021-01-01
op
event_set(&c->proxybev->ev_read, c->pfd, EV_READ,
247
2021-01-01
op
proxy_tls_readcb, c->proxybev);
248
2021-01-01
op
event_set(&c->proxybev->ev_write, c->pfd, EV_WRITE,
249
2021-01-01
op
proxy_tls_writecb, c->proxybev);
250
2021-01-01
op
251
2021-01-01
op
#if HAVE_LIBEVENT2
252
2021-01-01
op
evbuffer_unfreeze(c->proxybev->input, 0);
253
2021-01-01
op
evbuffer_unfreeze(c->proxybev->output, 1);
254
2021-01-01
op
#endif
255
2021-01-01
op
}
256
2021-12-29
op
257
2021-01-01
op
serialize_iri(&c->iri, iribuf, sizeof(iribuf));
258
2021-01-01
op
259
2021-01-01
op
evb = EVBUFFER_OUTPUT(c->proxybev);
260
2021-01-01
op
evbuffer_add_printf(evb, "%s\r\n", iribuf);
261
2021-01-01
op
262
2021-01-01
op
bufferevent_enable(c->proxybev, EV_READ|EV_WRITE);
263
2021-01-01
op
}
264
2021-01-01
op
265
2021-01-01
op
static void
266
2021-01-01
op
proxy_handshake(int fd, short event, void *d)
267
2021-01-01
op
{
268
2021-01-01
op
struct client *c = d;
269
2021-01-01
op
270
2021-12-29
op
if (event == EV_TIMEOUT) {
271
2021-12-29
op
start_reply(c, PROXY_ERROR, "timeout");
272
2021-12-29
op
return;
273
2021-12-29
op
}
274
2021-12-29
op
275
2021-12-29
op
switch (tls_handshake(c->proxyctx)) {
276
2021-12-29
op
case TLS_WANT_POLLIN:
277
2021-12-29
op
event_set(&c->proxyev, fd, EV_READ, proxy_handshake, c);
278
2021-12-29
op
event_add(&c->proxyev, &handshake_timeout);
279
2021-12-29
op
return;
280
2021-12-29
op
case TLS_WANT_POLLOUT:
281
2021-12-29
op
event_set(&c->proxyev, fd, EV_WRITE, proxy_handshake, c);
282
2021-12-29
op
event_add(&c->proxyev, &handshake_timeout);
283
2021-12-29
op
return;
284
2021-12-29
op
case -1:
285
2021-12-29
op
log_warn(c, "handshake with proxy failed: %s",
286
2021-12-29
op
tls_error(c->proxyctx));
287
2021-12-29
op
start_reply(c, PROXY_ERROR, "handshake failed");
288
2021-12-29
op
return;
289
2021-12-29
op
}
290
2021-12-29
op
291
2022-01-27
op
c->proxyevset = 0;
292
2021-01-01
op
proxy_enqueue_req(c);
293
2021-12-29
op
}
294
2021-12-29
op
295
2021-01-01
op
static int
296
2021-01-01
op
proxy_setup_tls(struct client *c)
297
2021-12-29
op
{
298
2021-01-02
op
struct proxy *p = c->proxy;
299
2021-12-29
op
struct tls_config *conf = NULL;
300
2022-01-30
op
const char *hn;
301
2021-12-29
op
302
2021-12-29
op
if ((conf = tls_config_new()) == NULL)
303
2021-12-29
op
return -1;
304
2021-12-29
op
305
2021-01-01
op
if (p->noverifyname)
306
2021-01-01
op
tls_config_insecure_noverifyname(conf);
307
2021-01-01
op
308
2021-12-29
op
tls_config_insecure_noverifycert(conf);
309
2021-01-01
op
tls_config_set_protocols(conf, p->protocols);
310
2021-12-29
op
311
2021-01-01
op
if (p->cert != NULL) {
312
2021-01-01
op
int r;
313
2021-01-01
op
314
2021-01-01
op
r = tls_config_set_cert_mem(conf, p->cert, p->certlen);
315
2021-01-01
op
if (r == -1)
316
2021-01-01
op
goto err;
317
2021-01-01
op
318
2021-01-01
op
r = tls_config_set_key_mem(conf, p->key, p->keylen);
319
2021-01-01
op
if (r == -1)
320
2021-01-01
op
goto err;
321
2021-01-01
op
}
322
2021-01-01
op
323
2021-12-29
op
if ((c->proxyctx = tls_client()) == NULL)
324
2021-12-29
op
goto err;
325
2021-12-29
op
326
2021-12-29
op
if (tls_configure(c->proxyctx, conf) == -1)
327
2021-12-29
op
goto err;
328
2021-12-29
op
329
2022-01-30
op
if ((hn = p->sni) == NULL)
330
2022-01-30
op
hn = p->host;
331
2022-01-30
op
if (tls_connect_socket(c->proxyctx, c->pfd, hn) == -1)
332
2021-12-29
op
goto err;
333
2021-12-29
op
334
2022-01-27
op
c->proxyevset = 1;
335
2021-12-29
op
event_set(&c->proxyev, c->pfd, EV_READ|EV_WRITE, proxy_handshake, c);
336
2021-12-29
op
event_add(&c->proxyev, &handshake_timeout);
337
2021-12-29
op
338
2021-12-29
op
tls_config_free(conf);
339
2021-12-29
op
return 0;
340
2021-12-29
op
341
2021-12-29
op
err:
342
2021-12-29
op
tls_config_free(conf);
343
2021-01-01
op
if (c->proxyctx != NULL) {
344
2021-12-29
op
tls_free(c->proxyctx);
345
2021-01-01
op
c->proxyctx = NULL;
346
2021-01-01
op
}
347
2021-12-29
op
return -1;
348
2021-12-29
op
}
349
2021-01-01
op
350
2021-01-01
op
int
351
2021-01-01
op
proxy_init(struct client *c)
352
2021-01-01
op
{
353
2021-01-02
op
struct proxy *p = c->proxy;
354
2022-01-27
op
355
2022-01-27
op
if (!p->notls && proxy_setup_tls(c) == -1)
356
2022-01-27
op
return -1;
357
2022-01-27
op
else if (p->notls)
358
2022-01-27
op
proxy_enqueue_req(c);
359
2021-01-01
op
360
2021-01-01
op
c->type = REQUEST_PROXY;
361
2021-01-01
op
362
2022-01-27
op
return 0;
363
2021-01-01
op
}
Omar Polo