| /* |
| This file is part of libmicrohttpd |
| Copyright (C) 2022 Karlson2k (Evgeny Grin) |
| |
| This test tool 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, or |
| (at your option) any later version. |
| |
| This test tool 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 |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
| */ |
| |
| /** |
| * @file microhttpd/test_auth_parse.c |
| * @brief Unit tests for request's 'Authorization" headers parsing |
| * @author Karlson2k (Evgeny Grin) |
| */ |
| |
| #include "mhd_options.h" |
| #include <string.h> |
| #include <stdio.h> |
| #include "gen_auth.h" |
| #ifdef BAUTH_SUPPORT |
| #include "basicauth.h" |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| #include "digestauth.h" |
| #endif /* DAUTH_SUPPORT */ |
| #include "mhd_assert.h" |
| #include "internal.h" |
| #include "connection.h" |
| |
| |
| #ifndef MHD_STATICSTR_LEN_ |
| /** |
| * Determine length of static string / macro strings at compile time. |
| */ |
| #define MHD_STATICSTR_LEN_(macro) (sizeof(macro) / sizeof(char) - 1) |
| #endif /* ! MHD_STATICSTR_LEN_ */ |
| |
| |
| #if defined(HAVE___FUNC__) |
| #define externalErrorExit(ignore) \ |
| _externalErrorExit_func(NULL, __func__, __LINE__) |
| #define externalErrorExitDesc(errDesc) \ |
| _externalErrorExit_func(errDesc, __func__, __LINE__) |
| #define mhdErrorExit(ignore) \ |
| _mhdErrorExit_func(NULL, __func__, __LINE__) |
| #define mhdErrorExitDesc(errDesc) \ |
| _mhdErrorExit_func(errDesc, __func__, __LINE__) |
| #elif defined(HAVE___FUNCTION__) |
| #define externalErrorExit(ignore) \ |
| _externalErrorExit_func(NULL, __FUNCTION__, __LINE__) |
| #define externalErrorExitDesc(errDesc) \ |
| _externalErrorExit_func(errDesc, __FUNCTION__, __LINE__) |
| #define mhdErrorExit(ignore) \ |
| _mhdErrorExit_func(NULL, __FUNCTION__, __LINE__) |
| #define mhdErrorExitDesc(errDesc) \ |
| _mhdErrorExit_func(errDesc, __FUNCTION__, __LINE__) |
| #else |
| #define externalErrorExit(ignore) _externalErrorExit_func(NULL, NULL, __LINE__) |
| #define externalErrorExitDesc(errDesc) \ |
| _externalErrorExit_func(errDesc, NULL, __LINE__) |
| #define mhdErrorExit(ignore) _mhdErrorExit_func(NULL, NULL, __LINE__) |
| #define mhdErrorExitDesc(errDesc) _mhdErrorExit_func(errDesc, NULL, __LINE__) |
| #endif |
| |
| |
| _MHD_NORETURN static void |
| _externalErrorExit_func (const char *errDesc, const char *funcName, int lineNum) |
| { |
| if ((NULL != errDesc) && (0 != errDesc[0])) |
| fprintf (stderr, "%s", errDesc); |
| else |
| fprintf (stderr, "System or external library call failed"); |
| if ((NULL != funcName) && (0 != funcName[0])) |
| fprintf (stderr, " in %s", funcName); |
| if (0 < lineNum) |
| fprintf (stderr, " at line %d", lineNum); |
| |
| fprintf (stderr, ".\nLast errno value: %d (%s)\n", (int) errno, |
| strerror (errno)); |
| #ifdef MHD_WINSOCK_SOCKETS |
| fprintf (stderr, "WSAGetLastError() value: %d\n", (int) WSAGetLastError ()); |
| #endif /* MHD_WINSOCK_SOCKETS */ |
| fflush (stderr); |
| exit (99); |
| } |
| |
| |
| _MHD_NORETURN static void |
| _mhdErrorExit_func (const char *errDesc, const char *funcName, int lineNum) |
| { |
| if ((NULL != errDesc) && (0 != errDesc[0])) |
| fprintf (stderr, "%s", errDesc); |
| else |
| fprintf (stderr, "MHD unexpected error"); |
| if ((NULL != funcName) && (0 != funcName[0])) |
| fprintf (stderr, " in %s", funcName); |
| if (0 < lineNum) |
| fprintf (stderr, " at line %d", lineNum); |
| |
| fprintf (stderr, ".\nLast errno value: %d (%s)\n", (int) errno, |
| strerror (errno)); |
| |
| fflush (stderr); |
| exit (8); |
| } |
| |
| |
| /* Declarations for local replacements of MHD functions */ |
| /* None, headers are included */ |
| |
| /* Local replacements implementations */ |
| |
| void * |
| MHD_connection_alloc_memory_ (struct MHD_Connection *connection, |
| size_t size) |
| { |
| void *ret; |
| if (NULL == connection) |
| mhdErrorExitDesc ("'connection' parameter is NULL"); |
| /* Use 'read_buffer' just as a flag */ |
| if (NULL != connection->read_buffer) |
| { |
| /* Use 'write_buffer' just as a flag */ |
| if (NULL != connection->write_buffer) |
| mhdErrorExitDesc ("Unexpected third memory allocation, " \ |
| "while previous allocations was not freed"); |
| } |
| /* Just use simple "malloc()" here */ |
| ret = malloc (size); |
| if (NULL == ret) |
| externalErrorExit (); |
| |
| /* Track up to two allocations */ |
| if (NULL == connection->read_buffer) |
| connection->read_buffer = (char *) ret; |
| else |
| connection->write_buffer = (char *) ret; |
| return ret; |
| } |
| |
| |
| /** |
| * Static variable to avoid additional malloc()/free() pairs |
| */ |
| static struct MHD_Connection conn; |
| |
| void |
| MHD_DLOG (const struct MHD_Daemon *daemon, |
| const char *format, |
| ...) |
| { |
| (void) daemon; |
| if (NULL == conn.rq.last) |
| { |
| fprintf (stderr, "Unexpected call of 'MHD_LOG(), format is '%s'.\n", |
| format); |
| fprintf (stderr, "'Authorization' header value: '%s'.\n", |
| (NULL == conn.rq.headers_received) ? |
| "NULL" : (conn.rq.headers_received->value)); |
| mhdErrorExit (); |
| } |
| conn.rq.last = NULL; /* Clear the flag */ |
| return; |
| } |
| |
| |
| /** |
| * Static variable to avoid additional malloc()/free() pairs |
| */ |
| static struct MHD_HTTP_Req_Header req_header; |
| |
| static void |
| test_global_init (void) |
| { |
| memset (&conn, 0, sizeof(conn)); |
| memset (&req_header, 0, sizeof(req_header)); |
| } |
| |
| |
| /** |
| * Add "Authorization" client test header. |
| * |
| * @param hdr the pointer to the headr value, must be valid until end of |
| * checking of this header |
| * @param hdr_len the length of the @a hdr |
| * @note The function is NOT thread-safe |
| */ |
| static void |
| add_AuthHeader (const char *hdr, size_t hdr_len) |
| { |
| if ((NULL != conn.rq.headers_received) || |
| (NULL != conn.rq.headers_received_tail)) |
| externalErrorExitDesc ("Connection's test headers are not empty already"); |
| if (NULL != hdr) |
| { |
| /* Skip initial whitespaces, emulate MHD's headers processing */ |
| while (' ' == hdr[0] || '\t' == hdr[0]) |
| { |
| hdr++; |
| hdr_len--; |
| } |
| req_header.header = MHD_HTTP_HEADER_AUTHORIZATION; /* Static string */ |
| req_header.header_size = MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_AUTHORIZATION); |
| req_header.value = hdr; |
| req_header.value_size = hdr_len; |
| req_header.kind = MHD_HEADER_KIND; |
| req_header.prev = NULL; |
| req_header.next = NULL; |
| conn.rq.headers_received = &req_header; |
| conn.rq.headers_received_tail = &req_header; |
| } |
| else |
| { |
| conn.rq.headers_received = NULL; |
| conn.rq.headers_received_tail = NULL; |
| } |
| conn.state = MHD_CONNECTION_FULL_REQ_RECEIVED; /* Should be a typical value */ |
| } |
| |
| |
| #ifdef BAUTH_SUPPORT |
| /** |
| * Parse previously added Basic Authorization client header and return |
| * result of the parsing. |
| * |
| * Function performs basic checking of the parsing result |
| * @return result of header parsing |
| * @note The function is NOT thread-safe |
| */ |
| static const struct MHD_RqBAuth * |
| get_BAuthRqParams (void) |
| { |
| const struct MHD_RqBAuth *res1; |
| const struct MHD_RqBAuth *res2; |
| /* Store pointer in some member unused in this test */ |
| res1 = MHD_get_rq_bauth_params_ (&conn); |
| if (! conn.rq.bauth_tried) |
| mhdErrorExitDesc ("'rq.bauth_tried' is not set"); |
| res2 = MHD_get_rq_bauth_params_ (&conn); |
| if (res1 != res2) |
| mhdErrorExitDesc ("MHD_get_rq_bauth_params_() returned another pointer " \ |
| "when called for the second time"); |
| return res2; |
| } |
| |
| |
| #endif /* BAUTH_SUPPORT */ |
| |
| #ifdef DAUTH_SUPPORT |
| /** |
| * Parse previously added Digest Authorization client header and return |
| * result of the parsing. |
| * |
| * Function performs basic checking of the parsing result |
| * @return result of header parsing |
| * @note The function is NOT thread-safe |
| */ |
| static const struct MHD_RqDAuth * |
| get_DAuthRqParams (void) |
| { |
| const struct MHD_RqDAuth *res1; |
| const struct MHD_RqDAuth *res2; |
| /* Store pointer in some member unused in this test */ |
| res1 = MHD_get_rq_dauth_params_ (&conn); |
| if (! conn.rq.dauth_tried) |
| mhdErrorExitDesc ("'rq.dauth_tried' is not set"); |
| res2 = MHD_get_rq_dauth_params_ (&conn); |
| if (res1 != res2) |
| mhdErrorExitDesc ("MHD_get_rq_bauth_params_() returned another pointer " \ |
| "when called for the second time"); |
| return res2; |
| } |
| |
| |
| #endif /* DAUTH_SUPPORT */ |
| |
| |
| static void |
| clean_AuthHeaders (void) |
| { |
| conn.state = MHD_CONNECTION_INIT; |
| free (conn.read_buffer); |
| free (conn.write_buffer); |
| |
| #ifdef BAUTH_SUPPORT |
| conn.rq.bauth_tried = false; |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| conn.rq.dauth_tried = false; |
| #endif /* BAUTH_SUPPORT */ |
| |
| #ifdef BAUTH_SUPPORT |
| if ((NULL != conn.rq.bauth) && |
| (conn.read_buffer != (const char *) conn.rq.bauth) && |
| (conn.write_buffer != (const char *) conn.rq.bauth)) |
| externalErrorExitDesc ("Memory allocation is not tracked as it should be"); |
| conn.rq.bauth = NULL; |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| if ((NULL != conn.rq.dauth) && |
| (conn.read_buffer != (const char *) conn.rq.dauth) && |
| (conn.write_buffer != (const char *) conn.rq.dauth)) |
| externalErrorExitDesc ("Memory allocation is not tracked as it should be"); |
| conn.rq.dauth = NULL; |
| #endif /* BAUTH_SUPPORT */ |
| |
| conn.rq.headers_received = NULL; |
| conn.rq.headers_received_tail = NULL; |
| |
| conn.read_buffer = NULL; |
| conn.write_buffer = NULL; |
| conn.rq.last = NULL; |
| } |
| |
| |
| enum MHD_TestAuthType |
| { |
| MHD_TEST_AUTHTYPE_NONE, |
| MHD_TEST_AUTHTYPE_BASIC, |
| MHD_TEST_AUTHTYPE_DIGEST, |
| }; |
| |
| |
| /* return zero if succeed, non-zero otherwise */ |
| static unsigned int |
| expect_result_type_n (const char *hdr, size_t hdr_len, |
| const enum MHD_TestAuthType expected_type, |
| int expect_log, |
| unsigned int line_num) |
| { |
| static char marker1[] = "Expected log call"; |
| unsigned int ret; |
| |
| ret = 0; |
| add_AuthHeader (hdr, hdr_len); |
| if (expect_log) |
| conn.rq.last = marker1; /* Use like a flag */ |
| else |
| conn.rq.last = NULL; |
| #ifdef BAUTH_SUPPORT |
| if (MHD_TEST_AUTHTYPE_BASIC == expected_type) |
| { |
| if (NULL == get_BAuthRqParams ()) |
| { |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Basic Authorization was not found, while it should be.\n"); |
| ret++; |
| } |
| } |
| else |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| if (MHD_TEST_AUTHTYPE_DIGEST == expected_type) |
| { |
| if (NULL == get_DAuthRqParams ()) |
| { |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Digest Authorization was not found, while it should be.\n"); |
| ret++; |
| } |
| } |
| else |
| #endif /* BAUTH_SUPPORT */ |
| { |
| #ifdef BAUTH_SUPPORT |
| if (NULL != get_BAuthRqParams ()) |
| { |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Found Basic Authorization, while it should not be.\n"); |
| ret++; |
| } |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| if (NULL != get_DAuthRqParams ()) |
| { |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Found Digest Authorization, while it should not be.\n"); |
| ret++; |
| } |
| #endif /* DAUTH_SUPPORT */ |
| } |
| #if defined(BAUTH_SUPPORT) && defined(DAUTH_SUPPORT) |
| if (conn.rq.last) |
| { |
| fprintf (stderr, |
| "'Authorization' header parsing ERROR:\n" |
| "Log function must be called, but it was not.\n"); |
| ret++; |
| } |
| #endif /* BAUTH_SUPPORT && DAUTH_SUPPORT */ |
| |
| if (ret) |
| { |
| if (NULL == hdr) |
| fprintf (stderr, |
| "Input: Absence of 'Authorization' header.\n"); |
| else if (0 == hdr_len) |
| fprintf (stderr, |
| "Input: empty 'Authorization' header.\n"); |
| else |
| fprintf (stderr, |
| "Input Header: '%.*s'\n", (int) hdr_len, hdr); |
| fprintf (stderr, |
| "The check is at line: %u\n\n", line_num); |
| ret = 1; |
| } |
| clean_AuthHeaders (); |
| |
| return ret; |
| } |
| |
| |
| #define expect_result_type(h,t,l) \ |
| expect_result_type_n(h,MHD_STATICSTR_LEN_(h),t,l,__LINE__) |
| |
| |
| static unsigned int |
| check_type (void) |
| { |
| unsigned int r = 0; /**< The number of errors */ |
| |
| r += expect_result_type_n (NULL, 0, MHD_TEST_AUTHTYPE_NONE, 0, __LINE__); |
| |
| r += expect_result_type ("", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" \t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t \t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" \t ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" \t \t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t \t ", MHD_TEST_AUTHTYPE_NONE, 0); |
| |
| r += expect_result_type ("Basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" Basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\tBasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t Basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" \tBasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" Basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t\tBasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \tBasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \t Basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic \t", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic \t ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic 123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic \t123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("Basic abc ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" bAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\tbAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t bAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" \tbAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" bAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t\tbAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \tbAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \t bAsIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC \t", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC \t ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC 123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC \t123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("bAsIC abc ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\tbasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" \tbasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t\tbasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \tbasic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \t basic", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic \t", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic \t ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic 123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic \t123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("basic abc ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" BASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\tBASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t BASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" \tBASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type (" BASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t\tBASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \tBASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("\t\t \t BASIC", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC \t", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC \t ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC 123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC \t123", MHD_TEST_AUTHTYPE_BASIC, 0); |
| r += expect_result_type ("BASIC abc ", MHD_TEST_AUTHTYPE_BASIC, 0); |
| /* Only single token is allowed for 'Basic' Authorization */ |
| r += expect_result_type ("Basic a b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic a\tb", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic a\tb", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic abc1 b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic c abc1", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic c abc1 ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic c abc1\t", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic c\tabc1\t", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic c abc1 b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic zyx, b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic zyx,b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic zyx ,b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic zyx;b", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Basic zyx; b", MHD_TEST_AUTHTYPE_NONE, 1); |
| |
| r += expect_result_type ("Basic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" Basic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" Basic2 ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\tBasic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t Basic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" \tBasic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" Basic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t\t\tBasic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t\t \tBasic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t\t \t Basic2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 \t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 \t ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 123", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 \t123", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic2 abc ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" BasicBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\tBasicBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\t BasicBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" \tBasicBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicBasic ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicBasic \t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicBasic \t\t", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicDigest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" BasicDigest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("BasicDigest ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Basic\0", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\0" "Basic", MHD_TEST_AUTHTYPE_NONE, 0); |
| |
| r += expect_result_type ("Digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" Digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tDigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t Digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" \tDigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" Digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t\tDigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \tDigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \t Digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tDigest ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" Digest \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t \tDigest \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| |
| r += expect_result_type ("digEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tdigEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t digEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" \tdigEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t\tdigEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \tdigEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \t digEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digEST ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digEST \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digEST \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tdigEST ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digEST \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t \tdigEST \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tdigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" \tdigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t\tdigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \tdigest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \t digest", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digest ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digest \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("digest \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tdigest ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" digest \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t \tdigest \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("DIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" DIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tDIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t DIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" \tDIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" DIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t\tDIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \tDIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t\t \t DIGEST", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("DIGEST ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("DIGEST \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("DIGEST \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\tDIGEST ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type (" DIGEST \t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("\t \tDIGEST \t ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,\t", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest , ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest , ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,\t, ,\t, ,\t, ,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,\t,\t,\t,\t,\t,\t,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a=b", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a=\"b\"", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc=1", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc=\"1\"", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a=b ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a=\"b\" ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc=1 ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc=\"1\" ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a = b", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a\t=\t\"b\"", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc =1", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc= \"1\"", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a=\tb ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest a = \"b\" ", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc\t\t\t= 1 ", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc =\t\t\t\"1\" ", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc =1,,,,", MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest nc =1 ,,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,,nc= \"1 \"", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \" 1\"", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \"1\",,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \"1\" ,,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \"1\" ,,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \"1\" ,,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| r += expect_result_type ("Digest ,,,, nc= \"1\" ,,,,,", \ |
| MHD_TEST_AUTHTYPE_DIGEST, 0); |
| |
| r += expect_result_type ("Digest nc", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc ,", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc , ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest \tnc\t ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest \tnc\t ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc,", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc,uri", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,uri", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,uri ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,uri,", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1, uri,", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,uri ,", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,uri , ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| /* Binary zero */ |
| r += expect_result_type ("Digest nc=1\0", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1\0" " ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1\t\0", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\0" "1", MHD_TEST_AUTHTYPE_NONE, 1); |
| /* Semicolon */ |
| r += expect_result_type ("Digest nc=1;", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1; ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=;1", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc;=1", MHD_TEST_AUTHTYPE_NONE, 1); |
| /* The equal sign alone */ |
| r += expect_result_type ("Digest =", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest =", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest = ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest ,=", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest , =", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest ,= ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest , = ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1,=", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=1, =", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=bar,=", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=bar, =", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| /* Unclosed quotation */ |
| r += expect_result_type ("Digest nc=\"", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"abc", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\" ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"abc ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\" abc", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\" abc", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"\\", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"\\\"", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\" \\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"\\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\" \\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc=\"\\\"\\\"\\\"\\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"abc", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \" ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"abc ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \" abc", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \" abc", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"\\", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"\\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \" \\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"\\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \" \\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest nc= \"\\\"\\\"\\\"\\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"bar", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" ", MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"bar ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" bar", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" bar", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo= \" bar", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\", bar", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" bar,", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"\\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" \\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"\\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\" \\\" ", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest foo=\"\\\"\\\"\\\"\\\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| /* Full set of parameters with semicolon inside */ |
| r += expect_result_type ("Digest username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", nonce=\"32141232413abcde\", " \ |
| "uri=\"/example\", qop=auth, nc=00000001; cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", nonce=\"32141232413abcde\", " \ |
| "uri=\"/example\", qop=auth, nc=00000001;cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| r += expect_result_type ("Digest username;=\"test@example.com\", " \ |
| "realm=\"users@example.com\", nonce=\"32141232413abcde\", " \ |
| "uri=\"/example\", qop=auth, nc=00000001, cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", \ |
| MHD_TEST_AUTHTYPE_NONE, 1); |
| |
| r += expect_result_type ("Digest2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("2Digest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Digest" "a", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("a" "Digest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" Digest2", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" 2Digest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" Digest" "a", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" a" "Digest", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Digest2 ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("2Digest ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Digest" "a", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("a" "Digest ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("DigestBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("DigestBasic ", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type (" DigestBasic", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("DigestBasic" "a", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("Digest" "\0", MHD_TEST_AUTHTYPE_NONE, 0); |
| r += expect_result_type ("\0" "Digest", MHD_TEST_AUTHTYPE_NONE, 0); |
| return r; |
| } |
| |
| |
| #ifdef BAUTH_SUPPORT |
| |
| /* return zero if succeed, 1 otherwise */ |
| static unsigned int |
| expect_basic_n (const char *hdr, size_t hdr_len, |
| const char *tkn, size_t tkn_len, |
| unsigned int line_num) |
| { |
| const struct MHD_RqBAuth *h; |
| unsigned int ret; |
| |
| mhd_assert (NULL != hdr); |
| mhd_assert (0 != hdr_len); |
| |
| add_AuthHeader (hdr, hdr_len); |
| h = get_BAuthRqParams (); |
| if (NULL == h) |
| mhdErrorExitDesc ("'MHD_get_rq_bauth_params_()' returned NULL"); |
| ret = 1; |
| if (tkn_len != h->token68.len) |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Wrong token length:\tRESULT[%u]: %.*s\tEXPECTED[%u]: %.*s\n", |
| (unsigned) h->token68.len, |
| (int) h->token68.len, |
| h->token68.str ? |
| h->token68.str : "(NULL)", |
| (unsigned) tkn_len, (int) tkn_len, tkn ? tkn : "(NULL)"); |
| else if ( ((NULL == tkn) != (NULL == h->token68.str)) || |
| ((NULL != tkn) && |
| (0 != memcmp (tkn, h->token68.str, tkn_len))) ) |
| fprintf (stderr, |
| "'Authorization' header parsing FAILED:\n" |
| "Wrong token string:\tRESULT[%u]: %.*s\tEXPECTED[%u]: %.*s\n", |
| (unsigned) h->token68.len, |
| (int) h->token68.len, |
| h->token68.str ? |
| h->token68.str : "(NULL)", |
| (unsigned) tkn_len, (int) tkn_len, tkn ? tkn : "(NULL)"); |
| else |
| ret = 0; |
| if (0 != ret) |
| { |
| fprintf (stderr, |
| "Input Header: '%.*s'\n", (int) hdr_len, hdr); |
| fprintf (stderr, |
| "The check is at line: %u\n\n", line_num); |
| } |
| clean_AuthHeaders (); |
| |
| return ret; |
| } |
| |
| |
| #define expect_basic(h,t) \ |
| expect_basic_n(h,MHD_STATICSTR_LEN_(h),t,MHD_STATICSTR_LEN_(t),__LINE__) |
| |
| static unsigned int |
| check_basic (void) |
| { |
| unsigned int r = 0; /**< The number of errors */ |
| |
| r += expect_basic ("Basic a", "a"); |
| r += expect_basic ("Basic a", "a"); |
| r += expect_basic ("Basic \ta", "a"); |
| r += expect_basic ("Basic \ta\t", "a"); |
| r += expect_basic ("Basic \ta ", "a"); |
| r += expect_basic ("Basic a ", "a"); |
| r += expect_basic ("Basic \t a\t ", "a"); |
| r += expect_basic ("Basic \t abc\t ", "abc"); |
| r += expect_basic ("Basic 2143sdfa4325sdfgfdab354354314SDSDFc", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic ("Basic 2143sdfa4325sdfgfdab354354314SDSDFc ", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic ("Basic 2143sdfa4325sdfgfdab354354314SDSDFc", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic ("Basic 2143sdfa4325sdfgfdab354354314SDSDFc ", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic (" Basic 2143sdfa4325sdfgfdab354354314SDSDFc", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic (" Basic 2143sdfa4325sdfgfdab354354314SDSDFc", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic (" Basic 2143sdfa4325sdfgfdab354354314SDSDFc ", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic (" Basic 2143sdfa4325sdfgfdab354354314SDSDFc ", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic (" Basic 2143sdfa4325sdfgfdab354354314SDSDFc ", \ |
| "2143sdfa4325sdfgfdab354354314SDSDFc"); |
| r += expect_basic ("Basic -A.1-z~9+/=====", "-A.1-z~9+/====="); |
| r += expect_basic (" Basic -A.1-z~9+/===== ", "-A.1-z~9+/====="); |
| |
| r += expect_basic_n ("Basic", MHD_STATICSTR_LEN_ ("Basic"), NULL, 0,__LINE__); |
| r += expect_basic_n (" Basic", MHD_STATICSTR_LEN_ (" Basic"), NULL, 0, |
| __LINE__); |
| r += expect_basic_n ("Basic ", MHD_STATICSTR_LEN_ ("Basic "), NULL, 0, |
| __LINE__); |
| r += expect_basic_n ("Basic \t\t", MHD_STATICSTR_LEN_ ("Basic \t\t"), NULL, 0, |
| __LINE__); |
| |
| return r; |
| } |
| |
| |
| #endif /* BAUTH_SUPPORT */ |
| |
| |
| #ifdef DAUTH_SUPPORT |
| |
| /* return zero if succeed, 1 otherwise */ |
| static unsigned int |
| cmp_dauth_param (const char *pname, const struct MHD_RqDAuthParam *param, |
| const char *expected_value) |
| { |
| unsigned int ret; |
| size_t expected_len; |
| bool expected_quoted; |
| mhd_assert (NULL != param); |
| mhd_assert (NULL != pname); |
| ret = 0; |
| |
| if (NULL == expected_value) |
| { |
| expected_len = 0; |
| expected_quoted = false; |
| if (NULL != param->value.str) |
| ret = 1; |
| else if (param->value.len != expected_len) |
| ret = 1; |
| else if (param->quoted != expected_quoted) |
| ret = 1; |
| } |
| else |
| { |
| expected_len = strlen (expected_value); |
| expected_quoted = (NULL != memchr (expected_value, '\\', expected_len)); |
| if (NULL == param->value.str) |
| ret = 1; |
| else if (param->value.len != expected_len) |
| ret = 1; |
| else if (param->quoted != expected_quoted) |
| ret = 1; |
| else if (0 != memcmp (param->value.str, expected_value, expected_len)) |
| ret = 1; |
| } |
| if (0 != ret) |
| { |
| fprintf (stderr, "Parameter '%s' parsed incorrectly:\n", pname); |
| fprintf (stderr, "\tRESULT :\tvalue.str: %.*s", |
| (int) (param->value.str ? param->value.len : 6), |
| param->value.str ? param->value.str : "(NULL)"); |
| fprintf (stderr, "\tvalue.len: %u", |
| (unsigned) param->value.len); |
| fprintf (stderr, "\tquoted: %s\n", |
| (unsigned) param->quoted ? "true" : "false"); |
| fprintf (stderr, "\tEXPECTED:\tvalue.str: %.*s", |
| (int) (expected_value ? expected_len : 6), |
| expected_value ? expected_value : "(NULL)"); |
| fprintf (stderr, "\tvalue.len: %u", |
| (unsigned) expected_len); |
| fprintf (stderr, "\tquoted: %s\n", |
| (unsigned) expected_quoted ? "true" : "false"); |
| } |
| return ret; |
| } |
| |
| |
| /* return zero if succeed, 1 otherwise */ |
| static unsigned int |
| expect_digest_n (const char *hdr, size_t hdr_len, |
| const char *nonce, |
| enum MHD_DigestAuthAlgo3 algo3, |
| const char *response, |
| const char *username, |
| const char *username_ext, |
| const char *realm, |
| const char *uri, |
| const char *qop_raw, |
| enum MHD_DigestAuthQOP qop, |
| const char *cnonce, |
| const char *nc, |
| int userhash, |
| unsigned int line_num) |
| { |
| const struct MHD_RqDAuth *h; |
| unsigned int ret; |
| |
| mhd_assert (NULL != hdr); |
| mhd_assert (0 != hdr_len); |
| |
| add_AuthHeader (hdr, hdr_len); |
| |
| h = get_DAuthRqParams (); |
| if (NULL == h) |
| mhdErrorExitDesc ("'MHD_get_rq_dauth_params_()' returned NULL"); |
| ret = 0; |
| |
| ret += cmp_dauth_param ("nonce", &h->nonce, nonce); |
| if (h->algo3 != algo3) |
| { |
| ret += 1; |
| fprintf (stderr, "Parameter 'algorithm' detected incorrectly:\n"); |
| fprintf (stderr, "\tRESULT :\t%u\n", |
| (unsigned) h->algo3); |
| fprintf (stderr, "\tEXPECTED:\t%u\n", |
| (unsigned) algo3); |
| } |
| ret += cmp_dauth_param ("response", &h->response, response); |
| ret += cmp_dauth_param ("username", &h->username, username); |
| ret += cmp_dauth_param ("username_ext", &h->username_ext, |
| username_ext); |
| ret += cmp_dauth_param ("realm", &h->realm, realm); |
| ret += cmp_dauth_param ("uri", &h->uri, uri); |
| ret += cmp_dauth_param ("qop", &h->qop_raw, qop_raw); |
| if (h->qop != qop) |
| { |
| ret += 1; |
| fprintf (stderr, "Parameter 'qop' detected incorrectly:\n"); |
| fprintf (stderr, "\tRESULT :\t%u\n", |
| (unsigned) h->qop); |
| fprintf (stderr, "\tEXPECTED:\t%u\n", |
| (unsigned) qop); |
| } |
| ret += cmp_dauth_param ("cnonce", &h->cnonce, cnonce); |
| ret += cmp_dauth_param ("nc", &h->nc, nc); |
| if (h->userhash != ! (! userhash)) |
| { |
| ret += 1; |
| fprintf (stderr, "Parameter 'userhash' parsed incorrectly:\n"); |
| fprintf (stderr, "\tRESULT :\t%s\n", |
| h->userhash ? "true" : "false"); |
| fprintf (stderr, "\tEXPECTED:\t%s\n", |
| userhash ? "true" : "false"); |
| } |
| if (0 != ret) |
| { |
| fprintf (stderr, |
| "Input Header: '%.*s'\n", (int) hdr_len, hdr); |
| fprintf (stderr, |
| "The check is at line: %u\n\n", line_num); |
| } |
| clean_AuthHeaders (); |
| |
| return ret; |
| } |
| |
| |
| #define expect_digest(h,no,a,rs,un,ux,rm,ur,qr,qe,c,nc,uh) \ |
| expect_digest_n(h,MHD_STATICSTR_LEN_(h),\ |
| no,a,rs,un,ux,rm,ur,qr,qe,c,nc,uh,__LINE__) |
| |
| static unsigned int |
| check_digest (void) |
| { |
| unsigned int r = 0; /**< The number of errors */ |
| |
| r += expect_digest ("Digest", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest nc=1", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, NULL, \ |
| MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=\"1\"", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=\"1\" ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest ,nc=\"1\" ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=\"1\", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=\"1\" , ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=1, ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest nc=1 , ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest ,,,nc=1, ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest ,,,nc=1 , ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1", 0); |
| r += expect_digest ("Digest ,,,nc=\"1 \", ", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0); |
| r += expect_digest ("Digest nc=\"1 \"", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0); |
| r += expect_digest ("Digest nc=\"1 \" ,", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0); |
| r += expect_digest ("Digest nc=\"1 \", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1 ", 0); |
| r += expect_digest ("Digest nc=\"1;\", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1;", 0); |
| r += expect_digest ("Digest nc=\"1\\;\", ", NULL, MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, "1\\;", 0); |
| |
| r += expect_digest ("Digest userhash=false", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest userhash=\"false\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest userhash=foo", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest userhash=true", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash=\"true\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash=\"\\t\\r\\u\\e\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash=TRUE", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash=True", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash = true", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 1); |
| r += expect_digest ("Digest userhash=True2", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest userhash=\" true\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| |
| r += expect_digest ("Digest algorithm=MD5", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=md5", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=Md5", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=mD5", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"MD5\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"\\M\\D\\5\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"\\m\\d\\5\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=SHA-256", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=sha-256", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=Sha-256", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"SHA-256\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"SHA\\-25\\6\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=\"shA-256\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=MD5-sess", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=MD5-SESS", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=md5-Sess", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5_SESSION, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=SHA-256-seSS", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=SHA-512-256", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA512_256, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=SHA-512-256-sess", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_SHA512_256_SESSION, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=MD5-2", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_INVALID, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=MD5-sess2", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_INVALID, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=SHA-256-512", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_INVALID, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| r += expect_digest ("Digest algorithm=", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_INVALID, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| NULL, MHD_DIGEST_AUTH_QOP_NONE, NULL, NULL, 0); |
| |
| r += expect_digest ("Digest qop=auth", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"auth\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=Auth", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "Auth", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=AUTH", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "AUTH", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"\\A\\ut\\H\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "\\A\\ut\\H", MHD_DIGEST_AUTH_QOP_AUTH, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"auth \"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auth ", MHD_DIGEST_AUTH_QOP_INVALID, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=auth-int", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auth-int", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"auth-int\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auth-int", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"auTh-iNt\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auTh-iNt", MHD_DIGEST_AUTH_QOP_AUTH_INT, NULL, NULL, 0); |
| r += expect_digest ("Digest qop=\"auTh-iNt2\"", NULL, \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| NULL, NULL, NULL, NULL, NULL, \ |
| "auTh-iNt2", MHD_DIGEST_AUTH_QOP_INVALID, NULL, NULL, 0); |
| |
| r += expect_digest ("Digest username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", " \ |
| "nonce=\"32141232413abcde\", " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_MD5, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| NULL, "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, \ |
| "0a4f113b", "00000001", 0); |
| r += expect_digest ("Digest username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest username=test@example.com, " \ |
| "realm=users@example.com, algorithm=\"SHA-256-sess\", " \ |
| "nonce=32141232413abcde, " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=/example, qop=\"auth\", nc=\"00000001\", " \ |
| "cnonce=0a4f113b, " \ |
| "response=6629fae49393a05397450978507c4ef1, " \ |
| "opaque=sadfljk32sdaf", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256_SESSION, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest username = \"test@example.com\", " \ |
| "realm\t=\t\"users@example.com\", algorithm\t= SHA-256, " \ |
| "nonce\t= \"32141232413abcde\", " \ |
| "username*\t=\tUTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri = \"/example\", qop = auth, nc\t=\t00000001, " \ |
| "cnonce\t\t\t= \"0a4f113b\", " \ |
| "response =\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\t\t\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest username=\"test@example.com\"," \ |
| "realm=\"users@example.com\",algorithm=SHA-512-256," \ |
| "nonce=\"32141232413abcde\"," \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates," \ |
| "uri=\"/example\",qop=auth,nc=00000001," \ |
| "cnonce=\"0a4f113b\"," \ |
| "response=\"6629fae49393a05397450978507c4ef1\"," \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA512_256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest username=\"test@example.com\"," \ |
| "realm=\"users@example.com\",algorithm=SHA-256," \ |
| "nonce=\"32141232413abcde\",asdf=asdffdsaf," \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates," \ |
| "uri=\"/example\",qop=auth,nc=00000001,cnonce=\"0a4f113b\"," \ |
| "response=\"6629fae49393a05397450978507c4ef1\"," \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=zyx, username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\"", "32141232413abcde", |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\",,,,,", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=zyx,,,,,,,username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx\", username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx, abc\", " \ |
| "username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx, abc=cde\", " \ |
| "username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\",foo=bar", "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx, abc=cde\", " \ |
| "username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " \ |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\", foo=\"bar1, bar2\"", \ |
| "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx, \\\\\"abc=cde\\\\\"\", " \ |
| "username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\", foo=\"bar1, bar2\"", \ |
| "32141232413abcde", |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| r += expect_digest ("Digest abc=\"zyx, \\\\\"abc=cde\\\\\"\", " \ |
| "username=\"test@example.com\", " \ |
| "realm=\"users@example.com\", algorithm=SHA-256, " \ |
| "nonce=\"32141232413abcde\", " \ |
| "username*=UTF-8''%c2%a3%20and%20%e2%82%ac%20rates, " \ |
| "uri=\"/example\", qop=auth, nc=00000001, " |
| "cnonce=\"0a4f113b\", " \ |
| "response=\"6629fae49393a05397450978507c4ef1\", " \ |
| "opaque=\"sadfljk32sdaf\", foo=\",nc=02\"", |
| "32141232413abcde", \ |
| MHD_DIGEST_AUTH_ALGO3_SHA256, \ |
| "6629fae49393a05397450978507c4ef1", "test@example.com", \ |
| "UTF-8''%c2%a3%20and%20%e2%82%ac%20rates", \ |
| "users@example.com", "/example", \ |
| "auth", MHD_DIGEST_AUTH_QOP_AUTH, "0a4f113b", \ |
| "00000001", 0); |
| |
| return r; |
| } |
| |
| |
| #endif /* DAUTH_SUPPORT */ |
| |
| #define TEST_AUTH_STR "dXNlcjpwYXNz" |
| |
| static unsigned int |
| check_two_auths (void) |
| { |
| unsigned int ret; |
| static struct MHD_HTTP_Req_Header h1; |
| static struct MHD_HTTP_Req_Header h2; |
| static struct MHD_HTTP_Req_Header h3; |
| #ifdef BAUTH_SUPPORT |
| const struct MHD_RqBAuth *bauth; |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| const struct MHD_RqDAuth *dauth; |
| #endif /* DAUTH_SUPPORT */ |
| |
| if ((NULL != conn.rq.headers_received) || |
| (NULL != conn.rq.headers_received_tail)) |
| externalErrorExitDesc ("Connection's test headers are not empty already"); |
| |
| /* Init and use both Basic and Digest Auth headers */ |
| memset (&h1, 0, sizeof(h1)); |
| memset (&h2, 0, sizeof(h2)); |
| memset (&h3, 0, sizeof(h3)); |
| |
| h1.kind = MHD_HEADER_KIND; |
| h1.header = MHD_HTTP_HEADER_HOST; /* Just some random header */ |
| h1.header_size = MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_HOST); |
| h1.value = "localhost"; |
| h1.value_size = strlen (h1.value); |
| |
| h2.kind = MHD_HEADER_KIND; |
| h2.header = MHD_HTTP_HEADER_AUTHORIZATION; |
| h2.header_size = MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_AUTHORIZATION); |
| h2.value = "Basic " TEST_AUTH_STR; |
| h2.value_size = strlen (h2.value); |
| |
| h3.kind = MHD_HEADER_KIND; |
| h3.header = MHD_HTTP_HEADER_AUTHORIZATION; |
| h3.header_size = MHD_STATICSTR_LEN_ (MHD_HTTP_HEADER_AUTHORIZATION); |
| h3.value = "Digest cnonce=" TEST_AUTH_STR; |
| h3.value_size = strlen (h3.value); |
| |
| conn.rq.headers_received = &h1; |
| h1.next = &h2; |
| h2.prev = &h1; |
| h2.next = &h3; |
| h3.prev = &h2; |
| conn.rq.headers_received_tail = &h3; |
| |
| conn.state = MHD_CONNECTION_FULL_REQ_RECEIVED; /* Should be a typical value */ |
| |
| ret = 0; |
| #ifdef BAUTH_SUPPORT |
| bauth = get_BAuthRqParams (); |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| dauth = get_DAuthRqParams (); |
| #endif /* DAUTH_SUPPORT */ |
| #ifdef BAUTH_SUPPORT |
| if (NULL == bauth) |
| { |
| fprintf (stderr, "No Basic Authorization header detected. Line: %u\n", |
| (unsigned int) __LINE__); |
| ret++; |
| } |
| else if ((MHD_STATICSTR_LEN_ (TEST_AUTH_STR) != bauth->token68.len) || |
| (0 != memcmp (bauth->token68.str, TEST_AUTH_STR, |
| bauth->token68.len))) |
| { |
| fprintf (stderr, "Basic Authorization token does not match. Line: %u\n", |
| (unsigned int) __LINE__); |
| ret++; |
| } |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| if (NULL == dauth) |
| { |
| fprintf (stderr, "No Digest Authorization header detected. Line: %u\n", |
| (unsigned int) __LINE__); |
| ret++; |
| } |
| else if ((MHD_STATICSTR_LEN_ (TEST_AUTH_STR) != dauth->cnonce.value.len) || |
| (0 != memcmp (dauth->cnonce.value.str, TEST_AUTH_STR, |
| dauth->cnonce.value.len))) |
| { |
| fprintf (stderr, "Digest Authorization 'cnonce' does not match. Line: %u\n", |
| (unsigned int) __LINE__); |
| ret++; |
| } |
| #endif /* DAUTH_SUPPORT */ |
| |
| /* Cleanup */ |
| conn.rq.headers_received = NULL; |
| conn.rq.headers_received_tail = NULL; |
| conn.state = MHD_CONNECTION_INIT; |
| |
| return ret; |
| } |
| |
| |
| int |
| main (int argc, char *argv[]) |
| { |
| unsigned int errcount = 0; |
| (void) argc; (void) argv; /* Unused. Silent compiler warning. */ |
| test_global_init (); |
| |
| errcount += check_type (); |
| #ifdef BAUTH_SUPPORT |
| errcount += check_basic (); |
| #endif /* BAUTH_SUPPORT */ |
| #ifdef DAUTH_SUPPORT |
| errcount += check_digest (); |
| #endif /* DAUTH_SUPPORT */ |
| errcount += check_two_auths (); |
| if (0 == errcount) |
| printf ("All tests were passed without errors.\n"); |
| return errcount == 0 ? 0 : 1; |
| } |