Author: brane Date: Sun Jun 15 15:54:14 2025 New Revision: 1926448 URL: http://svn.apache.org/viewvc?rev=1926448&view=rev Log: On the user-defined-authn branch: Replace hard-coded 401/407 HTTP status codes with constant macros. The macros are public because the user-defined authn schemes will need them -- the concept of 401/407 is already public from the existing credentials callback -- so we may as well use them in our code, too.
* serf.h (SERF_AUTHN_CODE_HOST, SERF_AUTHN_CODE_PROXY): Define to 401/407, respectively. (serf_credentials_callback_t): Update the docstring. * auth/auth.h (SERF__PEER_FROM_CODE, SERF__CODE_FROM_PEER, SERF__HEADER_FROM_CODE, SERF__HEADER_FROM_PEER): New helper macros encode patterns that are copy/pasted throughout the implementation. * auth/auth.c: Replace 401/407 with the new constants. * auth/auth_basic.c, auth/auth_digest.c, auth/auth_spnego.c: Likewise; also use the new helper macros. * test/test_buckets.c, test/test_server.c, test/test_ssl.c: Likewise; use the new constants in mock responses, too. Modified: serf/branches/user-defined-authn/auth/auth.c serf/branches/user-defined-authn/auth/auth.h serf/branches/user-defined-authn/auth/auth_basic.c serf/branches/user-defined-authn/auth/auth_digest.c serf/branches/user-defined-authn/auth/auth_spnego.c serf/branches/user-defined-authn/serf.h serf/branches/user-defined-authn/test/test_buckets.c serf/branches/user-defined-authn/test/test_server.c serf/branches/user-defined-authn/test/test_ssl.c Modified: serf/branches/user-defined-authn/auth/auth.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth.c (original) +++ serf/branches/user-defined-authn/auth/auth.c Sun Jun 15 15:54:14 2025 @@ -173,7 +173,7 @@ static int handle_auth_headers(int code, if (!auth_hdr) continue; - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = serf__get_authn_info_for_server(conn); } else { authn_info = &ctx->proxy_authn_info; @@ -284,14 +284,14 @@ static apr_status_t dispatch_auth(int co serf_bucket_t *response, apr_pool_t *pool) { - if (code == 401 || code == 407) { + if (code == SERF_AUTHN_CODE_HOST || code == SERF_AUTHN_CODE_PROXY) { serf_bucket_t *hdrs; auth_baton_t ab = { 0 }; ab.hdrs = apr_hash_make(pool); ab.pool = pool; - if (code == 401) + if (code == SERF_AUTHN_CODE_HOST) ab.header = "WWW-Authenticate"; else ab.header = "Proxy-Authenticate"; @@ -314,7 +314,8 @@ static apr_status_t dispatch_auth(int co serf__log(LOGLVL_DEBUG, LOGCOMP_AUTHN, __FILE__, request->conn->config, "%s authz required. Response header(s): %s\n", - code == 401 ? "Server" : "Proxy", auth_hdr); + code == SERF_AUTHN_CODE_HOST ? "Server" : "Proxy", + auth_hdr); } } #endif /* SERF_LOGGING_ENABLED */ @@ -379,7 +380,7 @@ apr_status_t serf__handle_auth_response( return APR_SUCCESS; } - if (sl.code == 401 || sl.code == 407) { + if (sl.code == SERF_AUTHN_CODE_HOST || sl.code == SERF_AUTHN_CODE_PROXY) { /* Authentication requested. */ /* Don't bother handling the authentication request if the response @@ -526,16 +527,16 @@ apr_status_t serf__auth_setup_connection authn_info = &ctx->proxy_authn_info; if (authn_info->scheme) { status = authn_info->scheme->init_conn_func(authn_info->scheme, - 407, conn, - conn->pool); + SERF_AUTHN_CODE_PROXY, + conn, conn->pool); } } else { authn_info = serf__get_authn_info_for_server(conn); if (authn_info->scheme) { status = authn_info->scheme->init_conn_func(authn_info->scheme, - 401, conn, - conn->pool); + SERF_AUTHN_CODE_HOST, + conn, conn->pool); } } Modified: serf/branches/user-defined-authn/auth/auth.h URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.h?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth.h (original) +++ serf/branches/user-defined-authn/auth/auth.h Sun Jun 15 15:54:14 2025 @@ -149,6 +149,19 @@ extern const serf__authn_scheme_t serf__ #endif /* SERF_HAVE_SPNEGO */ +/** Helper macros for code <-> peer <-> header conversion */ +#define SERF__PEER_FROM_CODE(code) \ + (((code) == SERF_AUTHN_CODE_HOST) ? HOST : PROXY) + +#define SERF__CODE_FROM_PEER(peer) \ + (((peer) == HOST) ? SERF_AUTHN_CODE_HOST : SERF_AUTHN_CODE_PROXY) + +#define SERF__HEADER_FROM_CODE(code) \ + SERF__HEADER_FROM_PEER(SERF__PEER_FROM_CODE((code))) + +#define SERF__HEADER_FROM_PEER(peer) \ + (((peer) == HOST) ? "Authorization" : "Proxy-Authorization") + /** User-defined authentication scheme handlers */ /* FIXME: Declare the prototype for the internal unregister implementation */ Modified: serf/branches/user-defined-authn/auth/auth_basic.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_basic.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_basic.c (original) +++ serf/branches/user-defined-authn/auth/auth_basic.c Sun Jun 15 15:54:14 2025 @@ -62,7 +62,7 @@ serf__handle_basic_auth(const serf__auth return SERF_ERROR_AUTHN_FAILED; } - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = serf__get_authn_info_for_server(conn); } else { authn_info = &ctx->proxy_authn_info; @@ -88,7 +88,7 @@ serf__handle_basic_auth(const serf__auth return SERF_ERROR_AUTHN_MISSING_ATTRIBUTE; } - realm = serf__construct_realm(code == 401 ? HOST : PROXY, + realm = serf__construct_realm(SERF__PEER_FROM_CODE(code), conn, realm_name, pool); } @@ -112,7 +112,7 @@ serf__handle_basic_auth(const serf__auth serf__encode_auth_header(&basic_info->value, scheme->name, tmp, tmp_len, pool); - basic_info->header = (code == 401) ? "Authorization" : "Proxy-Authorization"; + basic_info->header = SERF__HEADER_FROM_CODE(code); return APR_SUCCESS; } @@ -133,7 +133,7 @@ serf__init_basic_connection(const serf__ serf_context_t *ctx = conn->ctx; serf__authn_info_t *authn_info; - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = serf__get_authn_info_for_server(conn); } else { authn_info = &ctx->proxy_authn_info; Modified: serf/branches/user-defined-authn/auth/auth_digest.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_digest.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_digest.c (original) +++ serf/branches/user-defined-authn/auth/auth_digest.c Sun Jun 15 15:54:14 2025 @@ -264,7 +264,7 @@ serf__handle_digest_auth(const serf__aut return SERF_ERROR_AUTHN_FAILED; } - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = serf__get_authn_info_for_server(conn); } else { authn_info = &ctx->proxy_authn_info; @@ -318,7 +318,7 @@ serf__handle_digest_auth(const serf__aut return SERF_ERROR_AUTHN_MISSING_ATTRIBUTE; } - realm = serf__construct_realm(code == 401 ? HOST : PROXY, + realm = serf__construct_realm(SERF__PEER_FROM_CODE(code), conn, realm_name, pool); @@ -334,8 +334,7 @@ serf__handle_digest_auth(const serf__aut return status; } - digest_info->header = (code == 401) ? "Authorization" : - "Proxy-Authorization"; + digest_info->header = SERF__HEADER_FROM_CODE(code); /* Store the digest authentication parameters in the context cached for this server in the serf context, so we can use it to create the @@ -375,7 +374,7 @@ serf__init_digest_connection(const serf_ serf_context_t *ctx = conn->ctx; serf__authn_info_t *authn_info; - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = serf__get_authn_info_for_server(conn); } else { authn_info = &ctx->proxy_authn_info; @@ -437,8 +436,7 @@ serf__setup_request_digest_auth(const se } /* Build a new Authorization header. */ - digest_info->header = (peer == HOST) ? "Authorization" : - "Proxy-Authorization"; + digest_info->header = SERF__HEADER_FROM_PEER(peer); status = build_auth_header(&value, digest_info, path, method, conn->pool); if (status) Modified: serf/branches/user-defined-authn/auth/auth_spnego.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_spnego.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_spnego.c (original) +++ serf/branches/user-defined-authn/auth/auth_spnego.c Sun Jun 15 15:54:14 2025 @@ -380,7 +380,7 @@ serf__init_spnego_connection(const serf_ /* For proxy authentication, reuse the gss context for all connections. For server authentication, create a new gss context per connection. */ - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { authn_info = &conn->authn_info; } else { authn_info = &ctx->proxy_authn_info; @@ -424,11 +424,12 @@ serf__handle_spnego_auth(const serf__aut { serf_connection_t *conn = request->conn; serf_context_t *ctx = conn->ctx; - gss_authn_info_t *gss_info = (code == 401) ? conn->authn_info.baton : - ctx->proxy_authn_info.baton; + gss_authn_info_t *gss_info = ((code == SERF_AUTHN_CODE_HOST) + ? conn->authn_info.baton : + ctx->proxy_authn_info.baton); return do_auth(scheme, - code == 401 ? HOST : PROXY, + SERF__PEER_FROM_CODE(code), code, gss_info, request->conn, Modified: serf/branches/user-defined-authn/serf.h URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/serf.h?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/serf.h (original) +++ serf/branches/user-defined-authn/serf.h Sun Jun 15 15:54:14 2025 @@ -443,7 +443,11 @@ typedef apr_status_t (*serf_response_han * can handle server and proxy authentication. * code = 401 (server) or 407 (proxy). * baton = the baton passed to serf_context_run. - * authn_type = one of "Basic", "Digest". + * authn_type = one of "Basic", "Digest", or the name of a user-defined + * authentication scheme if it uses this callback. + * + * @see SERF_AUTHN_CODE_HOST + * @see SERF_AUTHN_CODE_PROXY */ typedef apr_status_t (*serf_credentials_callback_t)( char **username, @@ -957,6 +961,11 @@ serf_bucket_t *serf_request_bucket_reque #define SERF_AUTHN_NEGOTIATE 0x08 /**< Authentication type: Negotiate */ #define SERF_AUTHN_ALL ~0x00 /**< All authentication types */ +/* For user-defined authentication callbacks: these the sources of an + authentication callback. */ +#define SERF_AUTHN_CODE_HOST 401 /**< Authentication request from a host */ +#define SERF_AUTHN_CODE_PROXY 407 /**< Authentication requset from a proxy */ + /** * Register an autehtication scheme. * Modified: serf/branches/user-defined-authn/test/test_buckets.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_buckets.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/test/test_buckets.c (original) +++ serf/branches/user-defined-authn/test/test_buckets.c Sun Jun 15 15:54:14 2025 @@ -1532,7 +1532,7 @@ static void test_response_bucket_iis_sta serf_bucket_response_status(bkt, &sline); CuAssertTrue(tc, sline.version == SERF_HTTP_11); - CuAssertIntEquals(tc, 401, sline.code); + CuAssertIntEquals(tc, SERF_AUTHN_CODE_HOST, sline.code); /* Probably better to have just "Logon failed" as reason. But current behavior is also acceptable.*/ @@ -1563,7 +1563,7 @@ static void test_response_bucket_no_reas serf_bucket_response_status(bkt, &sline); CuAssertTrue(tc, sline.version == SERF_HTTP_11); - CuAssertIntEquals(tc, 401, sline.code); + CuAssertIntEquals(tc, SERF_AUTHN_CODE_HOST, sline.code); /* Probably better to have just "Logon failed" as reason. But current behavior is also acceptable.*/ Modified: serf/branches/user-defined-authn/test/test_server.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_server.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/test/test_server.c (original) +++ serf/branches/user-defined-authn/test/test_server.c Sun Jun 15 15:54:14 2025 @@ -78,12 +78,13 @@ static apr_status_t client_generate_resp serf_bucket_t *headers; #define CRLF "\r\n" - if (tb->user_baton_l == 401) { + if (tb->user_baton_l == SERF_AUTHN_CODE_HOST) { tb->user_baton_l = 0; body = SERF_BUCKET_SIMPLE_STRING("NOT HERE" CRLF, allocator); - resp = serf_bucket_outgoing_response_create(body, 401, "Unauth", + resp = serf_bucket_outgoing_response_create(body, + SERF_AUTHN_CODE_HOST, "Unauth", SERF_HTTP_11, allocator); headers = serf_bucket_outgoing_response_get_headers(resp); @@ -299,7 +300,7 @@ static void test_listen_auth_http(CuTest create_new_request(tb, &handler_ctx[0], "GET", "/", 1); create_new_request(tb, &handler_ctx[1], "GET", "/", 2); - tb->user_baton_l = 401; + tb->user_baton_l = SERF_AUTHN_CODE_HOST; tb->user_baton = tc; status = run_client_server_loop(tb, num_requests, @@ -327,7 +328,7 @@ static void test_listen_auth_http2(CuTes create_new_request(tb, &handler_ctx[0], "GET", "/", 1); create_new_request(tb, &handler_ctx[1], "GET", "/", 2); - tb->user_baton_l = 401; + tb->user_baton_l = SERF_AUTHN_CODE_HOST; tb->user_baton = tc; status = run_client_server_loop(tb, num_requests, Modified: serf/branches/user-defined-authn/test/test_ssl.c URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_ssl.c?rev=1926448&r1=1926447&r2=1926448&view=diff ============================================================================== --- serf/branches/user-defined-authn/test/test_ssl.c (original) +++ serf/branches/user-defined-authn/test/test_ssl.c Sun Jun 15 15:54:14 2025 @@ -1399,7 +1399,7 @@ static void test_ssltunnel_no_creds_cb(C RequestsReceivedByProxy HTTPRequest(MethodEqualTo("CONNECT"), URLEqualTo(tb->serv_host)) - Respond(WithCode(407), WithChunkedBody(""), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithChunkedBody(""), WithHeader("Proxy-Authentication", "Basic realm=\"Test Suite Proxy\"")) SetupSSLTunnel @@ -1430,7 +1430,7 @@ ssltunnel_basic_authn_callback(char **us if (strcmp("Basic", authn_type) != 0) return REPORT_TEST_SUITE_ERROR(); - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { if (strcmp(apr_psprintf(pool, "<%s> Test Suite", tb->serv_url), realm) != 0) return REPORT_TEST_SUITE_ERROR(); @@ -1438,7 +1438,7 @@ ssltunnel_basic_authn_callback(char **us *username = "serf"; *password = "serftest"; } - else if (code == 407) { + else if (code == SERF_AUTHN_CODE_PROXY) { if (strcmp(apr_psprintf(pool, "<http://localhost:%u> Test Suite Proxy", tb->proxy_port), realm) != 0) return REPORT_TEST_SUITE_ERROR(); @@ -1482,7 +1482,7 @@ static void ssltunnel_basic_auth(CuTest Given(tb->mh) RequestsReceivedByServer GETRequest(URLEqualTo("/"), HeaderNotSet("Authorization")) - Respond(WithCode(401),WithChunkedBody("1"), + Respond(WithCode(SERF_AUTHN_CODE_HOST),WithChunkedBody("1"), WithHeader("www-Authenticate", "bAsIc realm=\"Test Suite\""), OnConditionThat(serv_close_conn, WithConnectionCloseHeader)) GETRequest(URLEqualTo("/"), @@ -1492,7 +1492,7 @@ static void ssltunnel_basic_auth(CuTest HTTPRequest(MethodEqualTo("CONNECT"), URLEqualTo(tb->serv_host), HeaderNotSet("Proxy-Authorization")) - Respond(WithCode(407), WithChunkedBody(""), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithChunkedBody(""), WithHeader("Proxy-Authenticate", "Basic realm=\"Test Suite Proxy\""), OnConditionThat(proxy407_close_conn, WithConnectionCloseHeader)) @@ -1573,7 +1573,7 @@ basic_authn_callback_2ndtry(char **usern if (strcmp("Basic", authn_type) != 0) return REPORT_TEST_SUITE_ERROR(); - if (code == 401) { + if (code == SERF_AUTHN_CODE_HOST) { if (strcmp(apr_psprintf(pool, "<%s> Test Suite", tb->serv_url), realm) != 0) return REPORT_TEST_SUITE_ERROR(); @@ -1581,7 +1581,7 @@ basic_authn_callback_2ndtry(char **usern *username = "serf"; *password = secondtry ? "serftest" : "wrongpwd"; } - else if (code == 407) { + else if (code == SERF_AUTHN_CODE_PROXY) { if (strcmp(apr_psprintf(pool, "<http://localhost:%u> Test Suite Proxy", tb->proxy_port), realm) != 0) return REPORT_TEST_SUITE_ERROR(); @@ -1640,7 +1640,7 @@ static void test_ssltunnel_basic_auth_2n HTTPRequest(MethodEqualTo("CONNECT"), URLEqualTo(tb->serv_host), HeaderNotSet("Proxy-Authorization")) - Respond(WithCode(407), WithChunkedBody(""), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithChunkedBody(""), WithHeader("Proxy-Authenticate", "Basic realm=\"Test Suite Proxy\"")) /* serfproxy:wrongpwd fails, close connection. */ @@ -1648,7 +1648,7 @@ static void test_ssltunnel_basic_auth_2n URLEqualTo(tb->serv_host), HeaderNotEqualTo("Proxy-Authorization", "Basic c2VyZnByb3h5OnNlcmZ0ZXN0")) - Respond(WithCode(407), WithChunkedBody(""), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithChunkedBody(""), WithHeader("Proxy-Authenticate", "Basic realm=\"Test Suite Proxy\"")) CloseConnection @@ -1697,7 +1697,7 @@ proxy_digest_authn_callback(char **usern tb->result_flags |= TEST_RESULT_AUTHNCB_CALLED; - if (code != 407) + if (code != SERF_AUTHN_CODE_PROXY) return REPORT_TEST_SUITE_ERROR(); if (strcmp("Digest", authn_type) != 0) return REPORT_TEST_SUITE_ERROR(); @@ -1790,7 +1790,7 @@ static void test_ssltunnel_digest_auth(C HTTPRequest(MethodEqualTo("CONNECT"), URLEqualTo(tb->serv_host), HeaderNotSet("Proxy-Authorization")) - Respond(WithCode(407), WithChunkedBody("1"), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithChunkedBody("1"), WithHeader("Proxy-Authenticate", "Basic realm=\"Test Suite Proxy\""), WithHeader("Proxy-Authenticate", "NonExistent blablablabla"), @@ -1839,7 +1839,7 @@ static void test_ssltunnel_spnego_authn( HTTPRequest(MethodEqualTo("CONNECT"), URLEqualTo(tb->serv_host), HeaderEqualTo("Host", tb->serv_host)) - Respond(WithCode(407), + Respond(WithCode(SERF_AUTHN_CODE_PROXY), WithHeader("Proxy-Authenticate", "Negotiate"), WithHeader("Proxy-Authenticate", "Kerberos"), WithHeader("Proxy-Authenticate", "NTLM"), @@ -1873,7 +1873,7 @@ static void test_server_spnego_authn(CuT Given(tb->mh) GETRequest(URLEqualTo("/"), HeaderEqualTo("Host", tb->serv_host)) - Respond(WithCode(401), + Respond(WithCode(SERF_AUTHN_CODE_HOST), WithHeader("WWW-Authenticate", "Negotiate"), WithHeader("Content-Type", "text/html"), WithBody("<html><body>Authn required</body></html>"))