diff options
Diffstat (limited to 'src/mhd/mhd_legal.c')
-rw-r--r-- | src/mhd/mhd_legal.c | 45 |
1 files changed, 34 insertions, 11 deletions
diff --git a/src/mhd/mhd_legal.c b/src/mhd/mhd_legal.c index 25435210e..8353a6901 100644 --- a/src/mhd/mhd_legal.c +++ b/src/mhd/mhd_legal.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2019, 2020, 2022 Taler Systems SA + Copyright (C) 2019, 2020, 2022, 2024 Taler Systems SA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software @@ -126,10 +126,18 @@ mime_matches (const char *accept_pattern, { const char *da = strchr (accept_pattern, '/'); const char *dm = strchr (mime, '/'); + const char *end; if ( (NULL == da) || (NULL == dm) ) return (0 == strcmp ("*", accept_pattern)); + // FIXME: use TALER_MHD_check_accept() here! + /* FIXME: eventually, we might want to parse the "q=$FLOAT" + part after the ';' and figure out which one is the + best/preferred match instead of returning a boolean... */ + end = strchr (da, ';'); + if (NULL == end) + end = &da[strlen (da)]; return ( ( (1 == da - accept_pattern) && ('*' == *accept_pattern) ) || @@ -138,8 +146,9 @@ mime_matches (const char *accept_pattern, mime, da - accept_pattern)) ) ) && ( (0 == strcmp (da, "/*")) || - (0 == strcasecmp (da, - dm)) ); + (0 == strncasecmp (da, + dm, + end - da)) ); } @@ -150,9 +159,9 @@ TALER_MHD_xmime_matches (const char *accept_pattern, char *ap = GNUNET_strdup (accept_pattern); char *sptr; - for (const char *tok = strtok_r (ap, ";", &sptr); + for (const char *tok = strtok_r (ap, ",", &sptr); NULL != tok; - tok = strtok_r (NULL, ";", &sptr)) + tok = strtok_r (NULL, ",", &sptr)) { if (mime_matches (tok, mime)) @@ -179,6 +188,12 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, a = GNUNET_TIME_relative_to_absolute (MAX_TERMS_CACHING); m = GNUNET_TIME_absolute_to_timestamp (a); + /* Round up to next full day to ensure the expiration + time does not become a fingerprint! */ + a = GNUNET_TIME_absolute_round_down (a, + MAX_TERMS_CACHING); + a = GNUNET_TIME_absolute_add (a, + MAX_TERMS_CACHING); TALER_MHD_get_date_string (m.abs_time, dat); GNUNET_log (GNUNET_ERROR_TYPE_INFO, @@ -232,7 +247,7 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, MHD_HEADER_KIND, MHD_HTTP_HEADER_ACCEPT); if (NULL == mime) - mime = "text/html"; + mime = "text/plain"; lang = MHD_lookup_connection_value (conn, MHD_HEADER_KIND, MHD_HTTP_HEADER_ACCEPT_LANGUAGE); @@ -252,12 +267,13 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, { langs = GNUNET_strdup (p->language); } - else + else if (NULL == strstr (langs, + p->language)) { char *tmp = langs; GNUNET_asprintf (&langs, - "%s %s", + "%s,%s", tmp, p->language); GNUNET_free (tmp); @@ -327,7 +343,7 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, { GNUNET_break (MHD_YES == MHD_add_response_header (resp, - "Acceptable-Languages", + "Avail-Languages", langs)); GNUNET_free (langs); } @@ -342,7 +358,7 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, GNUNET_break (MHD_YES == MHD_add_response_header (resp, MHD_HTTP_HEADER_CACHE_CONTROL, - "public max-age=864000")); + "public,max-age=864000")); if (NULL != legal) GNUNET_break (MHD_YES == MHD_add_response_header (resp, @@ -352,6 +368,10 @@ TALER_MHD_reply_legal (struct MHD_Connection *conn, MHD_add_response_header (resp, MHD_HTTP_HEADER_CONTENT_TYPE, t->mime_type)); + GNUNET_break (MHD_YES == + MHD_add_response_header (resp, + MHD_HTTP_HEADER_CONTENT_LANGUAGE, + t->language)); { MHD_RESULT ret; @@ -385,9 +405,9 @@ load_terms (struct TALER_MHD_Legal *legal, const char *mime; unsigned int priority; } mm[] = { + { .ext = ".txt", .mime = "text/plain", .priority = 150 }, { .ext = ".html", .mime = "text/html", .priority = 100 }, { .ext = ".htm", .mime = "text/html", .priority = 99 }, - { .ext = ".txt", .mime = "text/plain", .priority = 50 }, { .ext = ".md", .mime = "text/markdown", .priority = 50 }, { .ext = ".pdf", .mime = "application/pdf", .priority = 25 }, { .ext = ".jpg", .mime = "image/jpeg" }, @@ -650,6 +670,9 @@ TALER_MHD_legal_load (const struct GNUNET_CONFIGURATION_Handle *cfg, if (lang[0] == '.') continue; + if (0 == strcmp (lang, + "locale")) + continue; load_language (legal, path, lang); |