X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=srsd.c;h=8d886772bfdc2d20ac2683409d27c47c9cb71fd7;hb=6a966ebc32006b64216715314ce21a506ef1f7c4;hp=4004c137d95cee696292e2452bf91bbe8e75bf61;hpb=28f081e506a26a01ea1b47f106ef77b05acc7d23;p=apps%2Fpfixtools.git diff --git a/srsd.c b/srsd.c index 4004c13..8d88677 100644 --- a/srsd.c +++ b/srsd.c @@ -1,5 +1,5 @@ /******************************************************************************/ -/* postlicyd: a postfix policy daemon with a lot of features */ +/* pfixtools: a collection of postfix related tools */ /* ~~~~~~~~~ */ /* ________________________________________________________________________ */ /* */ @@ -80,29 +80,57 @@ static void srsd_delete(srsd_t **srsd) } } +void urldecode(char *s, char *end) +{ + char *p = s; + + while (*p) { + if (*p == '%' && end - p >= 3) { + int h = (hexval(p[1]) << 4) | hexval(p[2]); + + if (h >= 0) { + *s++ = h; + p += 3; + continue; + } + } + + *s++ = *p++; + } + *s++ = '\0'; +} + int process_srs(srs_t *srs, const char *domain, srsd_t *srsd) { while (srsd->ibuf.len > 4) { char buf[BUFSIZ], *p, *q, *nl; int err; + nl = strchr(srsd->ibuf.data + 4, '\n'); + if (!nl) { + if (srsd->ibuf.len > BUFSIZ) { + syslog(LOG_ERR, "unreasonnable amount of data without a \\n"); + return -1; + } + return 0; + } + if (strncmp("get ", srsd->ibuf.data, 4)) { syslog(LOG_ERR, "bad request, not starting with \"get \""); return -1; } - nl = strchr(srsd->ibuf.data + 4, '\n'); - if (!nl) - return 0; - for (p = srsd->ibuf.data + 4; p < nl && isspace(*p); p++); for (q = nl++; q >= p && isspace(*q); *q-- = '\0'); if (p == q) { + buffer_addstr(&srsd->obuf, "400 empty request ???\n"); syslog(LOG_WARNING, "empty request"); goto skip; } + urldecode(p, q); + if (srsd->decoder) { err = srs_reverse(srs, buf, ssizeof(buf), p); } else { @@ -112,7 +140,6 @@ int process_srs(srs_t *srs, const char *domain, srsd_t *srsd) if (err == 0) { buffer_addstr(&srsd->obuf, "200 "); buffer_addstr(&srsd->obuf, buf); - buffer_addstr(&srsd->obuf, "\r\n"); } else { switch (SRS_ERROR_TYPE(err)) { case SRS_ERRTYPE_SRS: @@ -124,8 +151,8 @@ int process_srs(srs_t *srs, const char *domain, srsd_t *srsd) break; } buffer_addstr(&srsd->obuf, srs_strerror(err)); - buffer_addstr(&srsd->obuf, "\r\n"); } + buffer_addch(&srsd->obuf, '\n'); skip: buffer_consume(&srsd->ibuf, nl - srsd->ibuf.data); @@ -235,7 +262,7 @@ int main_loop(srs_t *srs, const char *domain, int port_enc, int port_dec) srsd_t *tmp; int sock; - sock = accept(srsd->fd, NULL, NULL); + sock = accept_nonblock(srsd->fd); if (sock < 0) { UNIXERR("accept"); continue;