From fce810c27ad09dd73706100435a6e65af0a67604 Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sat, 22 Dec 2007 12:39:44 +0000 Subject: [PATCH] Split base64 code into a separate .c so that the server doesn't pull in rest of the MIME code. Organization: Straylight/Edgeware From: Richard Kettlewell Correct computation of legacy user rights. --- doc/disorder_protocol.5.in | 2 +- lib/Makefile.am | 1 + lib/base64.c | 122 +++++++++++++++++++++++++++++++++++++ lib/base64.h | 38 ++++++++++++ lib/cookies.c | 2 +- lib/mime.c | 82 +------------------------ lib/mime.h | 3 - lib/test.c | 1 + lib/trackdb.c | 4 +- server/server.c | 2 +- 10 files changed, 168 insertions(+), 89 deletions(-) create mode 100644 lib/base64.c create mode 100644 lib/base64.h diff --git a/doc/disorder_protocol.5.in b/doc/disorder_protocol.5.in index cd3a20a..15c8396 100644 --- a/doc/disorder_protocol.5.in +++ b/doc/disorder_protocol.5.in @@ -172,7 +172,7 @@ or .BR title . .TP .B pause -Pause the current track. Requires the \fBpause\R right. +Pause the current track. Requires the \fBpause\fR right. .TP .B play \fITRACK\fR Add a track to the queue. The response contains the queue ID of the track. diff --git a/lib/Makefile.am b/lib/Makefile.am index 1cbb7bf..a7ddf48 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -26,6 +26,7 @@ libdisorder_a_SOURCES=charset.c charset.h \ addr.c addr.h \ authhash.c authhash.h \ basen.c basen.h \ + base64.c base64.h \ cache.c cache.h \ client.c client.h \ client-common.c client-common.h \ diff --git a/lib/base64.c b/lib/base64.c new file mode 100644 index 0000000..8015b1a --- /dev/null +++ b/lib/base64.c @@ -0,0 +1,122 @@ +/* + * This file is part of DisOrder + * Copyright (C) 2005, 2007 Richard Kettlewell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ +/** @file lib/base64.c + * @brief Support for MIME base64 + */ + +#include +#include "types.h" + +#include + +#include + +#include "mem.h" +#include "base64.h" +#include "vector.h" + +static const char mime_base64_table[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +/** @brief Convert MIME base64 + * @param s base64 data + * @return Decoded data + */ +char *mime_base64(const char *s, size_t *nsp) { + struct dynstr d; + const char *t; + int b[4], n, c; + + dynstr_init(&d); + n = 0; + while((c = (unsigned char)*s++)) { + if((t = strchr(mime_base64_table, c))) { + b[n++] = t - mime_base64_table; + if(n == 4) { + dynstr_append(&d, (b[0] << 2) + (b[1] >> 4)); + dynstr_append(&d, (b[1] << 4) + (b[2] >> 2)); + dynstr_append(&d, (b[2] << 6) + b[3]); + n = 0; + } + } else if(c == '=') { + if(n >= 2) { + dynstr_append(&d, (b[0] << 2) + (b[1] >> 4)); + if(n == 3) + dynstr_append(&d, (b[1] << 4) + (b[2] >> 2)); + } + break; + } + } + if(nsp) + *nsp = d.nvec; + dynstr_terminate(&d); + return d.vec; +} + +/** @brief Convert a binary string to base64 + * @param s Bytes to convert + * @param ns Number of bytes to convert + * @return Encoded data + * + * This function does not attempt to split up lines. + */ +char *mime_to_base64(const uint8_t *s, size_t ns) { + struct dynstr d[1]; + + dynstr_init(d); + while(ns >= 3) { + /* Input bytes with output bits: AAAAAABB BBBBCCCC CCDDDDDD */ + /* Output bytes with input bits: 000000 001111 111122 222222 */ + dynstr_append(d, mime_base64_table[s[0] >> 2]); + dynstr_append(d, mime_base64_table[((s[0] & 3) << 4) + + (s[1] >> 4)]); + dynstr_append(d, mime_base64_table[((s[1] & 15) << 2) + + (s[2] >> 6)]); + dynstr_append(d, mime_base64_table[s[2] & 63]); + ns -= 3; + s += 3; + } + if(ns > 0) { + dynstr_append(d, mime_base64_table[s[0] >> 2]); + switch(ns) { + case 1: + dynstr_append(d, mime_base64_table[(s[0] & 3) << 4]); + dynstr_append(d, '='); + dynstr_append(d, '='); + break; + case 2: + dynstr_append(d, mime_base64_table[((s[0] & 3) << 4) + + (s[1] >> 4)]); + dynstr_append(d, mime_base64_table[(s[1] & 15) << 2]); + dynstr_append(d, '='); + break; + } + } + dynstr_terminate(d); + return d->vec; +} + +/* +Local Variables: +c-basic-offset:2 +comment-column:40 +fill-column:79 +End: +*/ diff --git a/lib/base64.h b/lib/base64.h new file mode 100644 index 0000000..a2c20e6 --- /dev/null +++ b/lib/base64.h @@ -0,0 +1,38 @@ +/* + * This file is part of DisOrder + * Copyright (C) 2005, 2007 Richard Kettlewell + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA + */ +/** @file lib/base64.h + * @brief Support for MIME base64 + */ + +#ifndef BASE64_H +#define BASE64_H + +char *mime_base64(const char *s, size_t *nsp); +char *mime_to_base64(const uint8_t *s, size_t ns); + +#endif /* BASE64_H */ + +/* +Local Variables: +c-basic-offset:2 +comment-column:40 +fill-column:79 +End: +*/ diff --git a/lib/cookies.c b/lib/cookies.c index 425b84c..bc8e9b0 100644 --- a/lib/cookies.c +++ b/lib/cookies.c @@ -38,7 +38,7 @@ #include "mem.h" #include "log.h" #include "printf.h" -#include "mime.h" +#include "base64.h" #include "configuration.h" #include "kvp.h" #include "rights.h" diff --git a/lib/mime.c b/lib/mime.c index 87fc43a..7575b7b 100644 --- a/lib/mime.c +++ b/lib/mime.c @@ -34,6 +34,7 @@ #include "vector.h" #include "hex.h" #include "log.h" +#include "base64.h" /** @brief Match whitespace characters */ static int whitespace(int c) { @@ -431,87 +432,6 @@ char *mime_qp(const char *s) { return d.vec; } -static const char mime_base64_table[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/** @brief Convert MIME base64 - * @param s base64 data - * @return Decoded data - */ -char *mime_base64(const char *s, size_t *nsp) { - struct dynstr d; - const char *t; - int b[4], n, c; - - dynstr_init(&d); - n = 0; - while((c = (unsigned char)*s++)) { - if((t = strchr(mime_base64_table, c))) { - b[n++] = t - mime_base64_table; - if(n == 4) { - dynstr_append(&d, (b[0] << 2) + (b[1] >> 4)); - dynstr_append(&d, (b[1] << 4) + (b[2] >> 2)); - dynstr_append(&d, (b[2] << 6) + b[3]); - n = 0; - } - } else if(c == '=') { - if(n >= 2) { - dynstr_append(&d, (b[0] << 2) + (b[1] >> 4)); - if(n == 3) - dynstr_append(&d, (b[1] << 4) + (b[2] >> 2)); - } - break; - } - } - if(nsp) - *nsp = d.nvec; - dynstr_terminate(&d); - return d.vec; -} - -/** @brief Convert a binary string to base64 - * @param s Bytes to convert - * @param ns Number of bytes to convert - * @return Encoded data - * - * This function does not attempt to split up lines. - */ -char *mime_to_base64(const uint8_t *s, size_t ns) { - struct dynstr d[1]; - - dynstr_init(d); - while(ns >= 3) { - /* Input bytes with output bits: AAAAAABB BBBBCCCC CCDDDDDD */ - /* Output bytes with input bits: 000000 001111 111122 222222 */ - dynstr_append(d, mime_base64_table[s[0] >> 2]); - dynstr_append(d, mime_base64_table[((s[0] & 3) << 4) - + (s[1] >> 4)]); - dynstr_append(d, mime_base64_table[((s[1] & 15) << 2) - + (s[2] >> 6)]); - dynstr_append(d, mime_base64_table[s[2] & 63]); - ns -= 3; - s += 3; - } - if(ns > 0) { - dynstr_append(d, mime_base64_table[s[0] >> 2]); - switch(ns) { - case 1: - dynstr_append(d, mime_base64_table[(s[0] & 3) << 4]); - dynstr_append(d, '='); - dynstr_append(d, '='); - break; - case 2: - dynstr_append(d, mime_base64_table[((s[0] & 3) << 4) - + (s[1] >> 4)]); - dynstr_append(d, mime_base64_table[(s[1] & 15) << 2]); - dynstr_append(d, '='); - break; - } - } - dynstr_terminate(d); - return d->vec; -} - /** @brief Parse a RFC2109 Cookie: header * @param s Header field value * @param cd Where to store result diff --git a/lib/mime.h b/lib/mime.h index b6d21ce..b2286be 100644 --- a/lib/mime.h +++ b/lib/mime.h @@ -54,9 +54,6 @@ int mime_rfc2388_content_disposition(const char *s, /* Parse an RFC2388-style content-disposition field */ char *mime_qp(const char *s); -char *mime_base64(const char *s, size_t *nsp); -char *mime_to_base64(const uint8_t *s, size_t ns); -/* convert quoted-printable or base64 data */ /** @brief Parsed form of an HTTP Cookie: header field */ struct cookiedata { diff --git a/lib/test.c b/lib/test.c index c3e4c34..0f38fc3 100644 --- a/lib/test.c +++ b/lib/test.c @@ -61,6 +61,7 @@ #include "split.h" #include "configuration.h" #include "addr.h" +#include "base64.h" static int tests, errors; static int fail_first; diff --git a/lib/trackdb.c b/lib/trackdb.c index dc4cd4e..e030665 100644 --- a/lib/trackdb.c +++ b/lib/trackdb.c @@ -64,7 +64,7 @@ #include "hash.h" #include "unicode.h" #include "unidata.h" -#include "mime.h" +#include "base64.h" #define RESCAN "disorder-rescan" #define DEADLOCK "disorder-deadlock" @@ -2493,7 +2493,7 @@ static int one_old_user(const char *user, const char *password, rights_type r; parse_rights(config->default_rights, &r, 1); - r &= (RIGHT_SCRATCH__MASK|RIGHT_MOVE__MASK|RIGHT_REMOVE__MASK); + r &= ~(rights_type)(RIGHT_SCRATCH__MASK|RIGHT_MOVE__MASK|RIGHT_REMOVE__MASK); r |= (RIGHT_ADMIN|RIGHT_RESCAN |RIGHT_SCRATCH_ANY|RIGHT_MOVE_ANY|RIGHT_REMOVE_ANY); rights = rights_string(r); diff --git a/server/server.c b/server/server.c index a69c451..54dfe55 100644 --- a/server/server.c +++ b/server/server.c @@ -66,7 +66,7 @@ #include "cache.h" #include "unicode.h" #include "cookies.h" -#include "mime.h" +#include "base64.h" #ifndef NONCE_SIZE # define NONCE_SIZE 16 -- [mdw]