Author: brane
Date: Tue Jun 24 05:34:26 2025
New Revision: 1926674

URL: http://svn.apache.org/viewvc?rev=1926674&view=rev
Log:
On the user-defined-authn branch: Code cleanups, consistency fixes and
missing documentation.

* serf.h
  (serf authentication group): Describe the interaction between parts of the
   authentication system during a handshake.
  (serf_authn_init_conn_func_t,
   serf_authn_get_realm_func_t,
   serf_authn_handle_func_t,
   serf_authn_setup_request_func_t,
   serf_authn_validate_response_func_t): Update docstrings and move all output
   parameters to the beginning of the argument list.
  (serf_authn_register_scheme): Move the 'type' output parameter to the
   beginning of the argument list. Update the docstring.
  (serf_authn_unregister_scheme): Declare prototype and update the docstring.

* auth/auth.h
  (serf__authn__unregister_scheme) Remove unused prototype.
* auth/auth.c
  (serf_authn_register_scheme): Update argument list, update docs,
   introduce a local serf-context variable.
  (serf_authn_unregister_scheme): Likewise; also rename from
   serf__authn__unregister_scheme.
* auth/auth_user_defined.c
  (serf__authn_user__init_conn) Update calls to user_init_conn_func and
   user_get_realm_func due to changed argument lists.
  (serf__authn_user__setup_request): Same for setup_request_func, the
   'code' argument is no longer used.
  (serf__authn_user__validate_response): And for validate_response_func, too.

* test/test_auth.c
  (serf_authn_unregister_scheme): Remove the macro, it's now a real function.
  (test_authn_register_one,
   test_authn_register_two,
   test_authn_register_twice,
   test_authn_registered_pool_cleanup) Update callee's argument lists.
  (user_authn_init_conn,
   user_authn_get_realm,
   user_authn_setup_request,
   user_authn_validate_response): Update argument lists.
  (user_authentication): And again, adjust to changes in the calees.

Modified:
    serf/branches/user-defined-authn/auth/auth.c
    serf/branches/user-defined-authn/auth/auth.h
    serf/branches/user-defined-authn/auth/auth_user_defined.c
    serf/branches/user-defined-authn/serf.h
    serf/branches/user-defined-authn/test/test_auth.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=1926674&r1=1926673&r2=1926674&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth.c (original)
+++ serf/branches/user-defined-authn/auth/auth.c Tue Jun 24 05:34:26 2025
@@ -657,15 +657,17 @@ static apr_status_t cleanup_user_scheme(
 }
 
 apr_status_t serf_authn_register_scheme(
-    serf_context_t *ctx, const char *name, void *baton, int flags,
+    int *type,
+    serf_context_t *ctx,
+    const char *name, void *baton, int flags,
     serf_authn_init_conn_func_t init_conn,
     serf_authn_get_realm_func_t get_realm,
     serf_authn_handle_func_t handle,
     serf_authn_setup_request_func_t setup_request,
     serf_authn_validate_response_func_t validate_response,
-    apr_pool_t *result_pool,
-    int *type)
+    apr_pool_t *result_pool)
 {
+    serf_config_t *const config = ctx->config;
     serf__authn_scheme_t *authn_scheme;
     apr_status_t lock_status;
     apr_status_t status;
@@ -674,7 +676,7 @@ apr_status_t serf_authn_register_scheme(
     char *cp;
     int index;
 
-    serf__log(LOGLVL_INFO, LOGCOMP_AUTHN, __FILE__, ctx->config,
+    serf__log(LOGLVL_INFO, LOGCOMP_AUTHN, __FILE__, config,
               "Registering user-defined scheme %s", name);
 
     *type = SERF_AUTHN_NONE;
@@ -705,9 +707,9 @@ apr_status_t serf_authn_register_scheme(
     authn_scheme->user_setup_request_func = setup_request;
     authn_scheme->user_validate_response_func = validate_response;
 
-    lock_status = lock_authn_schemes(ctx->config);
+    lock_status = lock_authn_schemes(config);
     if (lock_status) {
-        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                          ", lock failed %d\n", lock_status);
         return lock_status;
     }
@@ -735,7 +737,9 @@ apr_status_t serf_authn_register_scheme(
         }
     }
     if (index >= AUTHN_SCHEMES_SIZE) {
-        /* No more space in the table. Not very likely. */
+        /* No more space in the table. Shouldn't be possible; if we got this
+           far, we have a valid scheme type, and as long as we have a scheme
+           type, there should be space for the scheme in the table. */
         status = APR_ENOSPC;
         goto cleanup;
     }
@@ -752,28 +756,25 @@ apr_status_t serf_authn_register_scheme(
     user_authn_registered |= scheme_type;
 
   cleanup:
-    lock_status = unlock_authn_schemes(ctx->config);
+    lock_status = unlock_authn_schemes(config);
     if (lock_status) {
-        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                          ", unlock failed %d, status %d\n",
                          lock_status, status);
         return lock_status;
     }
 
-    serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+    serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                      ", status %d\n", status);
     return status;
 }
 
-/* apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx, */
-/*                                           int type, */
-/*                                           const char *name, */
-/*                                           apr_pool_t *scratch_pool); */
-apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
-                                            int type,
-                                            const char *name,
-                                            apr_pool_t *scratch_pool)
+apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx,
+                                          int type,
+                                          const char *name,
+                                          apr_pool_t *scratch_pool)
 {
+    serf_config_t *const config = ctx->config;
     const serf__authn_scheme_t *authn_scheme = NULL;
     const unsigned int scheme_type = type;
     apr_status_t lock_status;
@@ -782,7 +783,7 @@ apr_status_t serf__authn__unregister_sch
     char *cp;
     int index;
 
-    serf__log(LOGLVL_INFO, LOGCOMP_AUTHN, __FILE__, ctx->config,
+    serf__log(LOGLVL_INFO, LOGCOMP_AUTHN, __FILE__, config,
               "Unregistering user-defined scheme %s", name);
 
     /* Generate a lower-case key for the scheme. */
@@ -792,9 +793,9 @@ apr_status_t serf__authn__unregister_sch
         ++cp;
     }
 
-    lock_status = lock_authn_schemes(ctx->config);
+    lock_status = lock_authn_schemes(config);
     if (lock_status) {
-        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                          ", lock failed %d\n", lock_status);
         return lock_status;
     }
@@ -837,15 +838,15 @@ apr_status_t serf__authn__unregister_sch
     user_authn_registered &= ~scheme_type;
 
   cleanup:
-    lock_status = unlock_authn_schemes(ctx->config);
+    lock_status = unlock_authn_schemes(config);
     if (lock_status) {
-        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+        serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                          ", unlock failed %d, status %d\n",
                          lock_status, status);
         return lock_status;
     }
 
-    serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, ctx->config,
+    serf__log_nopref(LOGLVL_INFO, LOGCOMP_AUTHN, config,
                      ", status %d\n", status);
     return status;
 }
@@ -871,13 +872,17 @@ static apr_status_t do_init_authn_scheme
 
     /* Create a self-contained root pool for the mutex. */
     status = apr_allocator_create(&allocator);
-    if (status || !allocator)
-        goto error;
+    if (status || !allocator) {
+        status = status ? status : APR_ENOMEM;
+        goto finish;
+    }
 
     status = apr_pool_create_ex(&authn_schemes_guard_pool,
                                 NULL, NULL, allocator);
-    if (status || !authn_schemes_guard_pool)
-        goto error;
+    if (status || !authn_schemes_guard_pool) {
+        status = status ? status : APR_ENOMEM;
+        goto finish;
+    }
 #if APR_POOL_DEBUG
     apr_pool_tag(authn_schemes_guard_pool, "serf-authn-guard");
 #endif
@@ -885,20 +890,16 @@ static apr_status_t do_init_authn_scheme
     status = apr_thread_mutex_create(&authn_schemes_guard,
                                      APR_THREAD_MUTEX_DEFAULT,
                                      authn_schemes_guard_pool);
-    if (status || !authn_schemes_guard)
-        goto error;
+    if (status || !authn_schemes_guard) {
+        status = status ? status : APR_ENOMEM;
+        goto finish;
+    }
 
     /* Adjust the mask of available user-defined schemes. */
     builtin_types = 0;
     for (index = 0; serf_authn_schemes[index]; ++index)
         builtin_types |= serf_authn_schemes[index]->type;
     user_authn_type_mask &= ~builtin_types;
-    goto finish;
-
-  error:
-    /* We only reach here if something went wrong during initialization. */
-    if (status == APR_SUCCESS)  /* Not likely, but don't return "OK". */
-        status = APR_ENOMEM;    /* Probable failures are allocations. */
 
   finish:
     serf__log_nopref(LOGLVL_DEBUG, LOGCOMP_AUTHN, config,

Modified: serf/branches/user-defined-authn/auth/auth.h
URL: 
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.h?rev=1926674&r1=1926673&r2=1926674&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth.h (original)
+++ serf/branches/user-defined-authn/auth/auth.h Tue Jun 24 05:34:26 2025
@@ -178,12 +178,6 @@ extern const serf__authn_scheme_t serf__
 
 /** User-defined authentication scheme handlers */
 
-/* FIXME: Declare the prototype for the internal unregister implementation */
-apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
-                                            int type,
-                                            const char *name,
-                                            apr_pool_t *scratch_pool);
-
 apr_status_t
 serf__authn_user__init_conn(const serf__authn_scheme_t *scheme,
                             int code,

Modified: serf/branches/user-defined-authn/auth/auth_user_defined.c
URL: 
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth_user_defined.c?rev=1926674&r1=1926673&r2=1926674&view=diff
==============================================================================
--- serf/branches/user-defined-authn/auth/auth_user_defined.c (original)
+++ serf/branches/user-defined-authn/auth/auth_user_defined.c Tue Jun 24 
05:34:26 2025
@@ -119,9 +119,9 @@ serf__authn_user__init_conn(const serf__
 
         apr_pool_create(&scratch_pool, pool);
         authn_baton = apr_pcalloc(pool, sizeof(*authn_baton));
-        status = scheme->user_init_conn_func(scheme->user_baton, code,
-                                             pool, scratch_pool,
-                                             &authn_baton->user_authn_baton);
+        status = scheme->user_init_conn_func(&authn_baton->user_authn_baton,
+                                             scheme->user_baton, code,
+                                             pool, scratch_pool);
         apr_pool_destroy(scratch_pool);
 
         if (status == APR_SUCCESS)
@@ -200,11 +200,11 @@ serf__authn_user__handle(const serf__aut
     status = APR_SUCCESS;
     if (scheme->user_flags & SERF_AUTHN_FLAG_CREDS) {
         const char *realm_name;
-        status = scheme->user_get_realm_func(scheme->user_baton,
+        status = scheme->user_get_realm_func(&realm_name,
+                                             scheme->user_baton,
                                              authn_baton->user_authn_baton,
                                              auth_hdr, auth_attr,
-                                             scratch_pool, scratch_pool,
-                                             &realm_name);
+                                             scratch_pool, scratch_pool);
         if (!status) {
             const char *const realm = serf__construct_realm(
                 SERF__PEER_FROM_CODE(code), conn, realm_name, scratch_pool);
@@ -237,7 +237,7 @@ serf__authn_user__handle(const serf__aut
 apr_status_t
 serf__authn_user__setup_request(const serf__authn_scheme_t *scheme,
                                 peer_t peer,
-                                int code,
+                                int code, /* Ignored, always 0. */
                                 serf_connection_t *conn,
                                 serf_request_t *request,
                                 const char *method,
@@ -271,7 +271,7 @@ serf__authn_user__setup_request(const se
     apr_pool_create(&scratch_pool, conn->pool);
     status = scheme->user_setup_request_func(scheme->user_baton,
                                              authn_baton->user_authn_baton,
-                                             code, conn, request,
+                                             conn, request,
                                              method, uri, hdrs_bkt,
                                              scratch_pool);
     apr_pool_destroy(scratch_pool);
@@ -315,11 +315,11 @@ serf__authn_user__validate_response(cons
 
     authn_baton = authn_info->baton;
     apr_pool_create(&scratch_pool, conn->pool);
-    status = scheme->user_validate_response_func(scheme->user_baton,
+    status = scheme->user_validate_response_func(&reset_pipelining,
+                                                 scheme->user_baton,
                                                  authn_baton->user_authn_baton,
                                                  code, conn, request, response,
-                                                 scratch_pool,
-                                                 &reset_pipelining);
+                                                 scratch_pool);
 
     /* Reset pipelining if the scheme requires it. */
     if (status == APR_SUCCESS && reset_pipelining

Modified: serf/branches/user-defined-authn/serf.h
URL: 
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/serf.h?rev=1926674&r1=1926673&r2=1926674&view=diff
==============================================================================
--- serf/branches/user-defined-authn/serf.h (original)
+++ serf/branches/user-defined-authn/serf.h Tue Jun 24 05:34:26 2025
@@ -951,6 +951,31 @@ serf_bucket_t *serf_request_bucket_reque
  * @defgroup serf authentication
  * @ingroup serf
  * @{
+ *
+ * Interaction during authentication hanshake for user-defined schemes:
+ * ```
+ * scheme                     serf                      peer
+ *    |                         |                        |
+ *    |                         +------> request ------->+
+ *    |                         |                        |
+ *    |                         +<---- authenticate <----+ (401 or 407)
+ *    +<------ init-conn <------+                        |
+ *    |                         |                        |
+ *    |    (get credentials) <--+ (optional)             |
+ *    |                         |                        |
+ *    +<-------- handle <-------+                        |
+ *    |                         |                        |
+ *    |     (pipelining off) <--+ (optional)             |
+ *    |                         |                        |
+ *    +<---- setup-requiest <---+                        |
+ *    |                         +---> request + authn -->+
+ *    |                         |                        |
+ *    |                         +<------ response <------+
+ *    +<-- validate-response <--+                        |
+ *    |                         |                        |
+ *    |      (pipelining on) <--+ (optional)             |
+ *    |                         |                        |
+ * ```
  */
 
 /* Supported authentication types. */
@@ -971,24 +996,85 @@ serf_bucket_t *serf_request_bucket_reque
 #define SERF_AUTHN_FLAG_PIPE  0x01 /**< Authn flags: Allow pipelining */
 #define SERF_AUTHN_FLAG_CREDS 0x02 /**< Authn flags: Require credentials */
 
-/** TODO:  */
+/**
+ * Callback for user-defined authentication scheme providers.
+ *
+ * Called to initialize the connection for this authentication scheme. Return
+ * the connection-specific @a authn_baton allocated from @a result_pool, that
+ * will be passed to the other callbacks when called for the same connection.
+ *
+ * @a baton is the user data pointer passed to serf_authn_register_scheme().
+ *
+ * @a code is the HTTP status code from the response that caused the call to
+ * this callback; either @c SERF_AUTHN_CODE_HOST when the peer is a server, or
+ * @c SERF_AUTHN_CODE_PROXY when proxy authentication is required.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.4.
+ */
 typedef apr_status_t
-(*serf_authn_init_conn_func_t)(void *baton, int code,
+(*serf_authn_init_conn_func_t)(void **authn_baton,
+                               void *baton, int code,
                                apr_pool_t *result_pool,
-                               apr_pool_t *scratch_pool,
-                               void **authn_baton);
+                               apr_pool_t *scratch_pool);
 
-/** TODO:  */
+/**
+ * Callback for user-defined authentication scheme providers.
+ *
+ * Return a unique identifier of the server (or service) in @a realm_name,
+ * allocated from @a result_pool.
+ *
+ * @a baton is the user data pointer passed to serf_authn_register_scheme().
+ *
+ * @a authn_baton is the pointer returned from the init-connection callback.
+ *
+ * @a authn_header and @a authn_attributes contain the value of the
+ * authentication header (WWW-Authenticate or Proxy-Authenticate) recevied in
+ * a server response. @a authn_header contains the scheme name, i.e., "scheme
+ * <atributes>", whereas @a authn_attributes contains only the attributes
+ * without the scheme name.
+ *
+ * If the scheme flag @a SERF_AUTHN_FLAG_PIPE is *not* set, pipelining will be
+ * disabled on the connection after this callback succeeds.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.4.
+ */
 typedef apr_status_t
-(*serf_authn_get_realm_func_t)(void *baton,
+(*serf_authn_get_realm_func_t)(const char **realm_name,
+                               void *baton,
                                void *authn_baton,
                                const char *authn_header,
                                const char *authn_attributes,
                                apr_pool_t *result_pool,
-                               apr_pool_t *scratch_pool,
-                               const char **realm_name);
+                               apr_pool_t *scratch_pool);
 
-/** TODO:  */
+/**
+ * Callback for user-defined authentication scheme providers.
+ *
+ * Called after the init-conn function has succeeded to prepare (cache) the
+ * credentials for this connection, usually in @a auth_baton.
+ *
+ * @a baton, @a authn_baton, @a authn_header and @a authn_attributers have the
+ * same meaning as in the get-realm function; @a code is the same as in the
+ * init-conn function.
+ *
+ * @a response_header is either "Authorization" or "Proxy-Authorization",
+ * depending on the type of the peer for the authentication handshake.
+ *
+ * @a username and @a password are optional (may ba null), provided by the
+ * credentials callback, which is called automatically if the scheme flag
+ * @c SERF_AUTHN_FLAG_CREDS is set.
+ *
+ * @a request is the pending request and @a response is the response that
+ * caused this callback to be called.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.4.
+ */
 typedef apr_status_t
 (*serf_authn_handle_func_t)(void *baton,
                             void *authn_baton,
@@ -1003,11 +1089,24 @@ typedef apr_status_t
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool);
 
-/** TODO:  */
+/**
+ * Callback for user-defined authentication scheme providers.
+ *
+ * Called every time a new authenticated @a request is being prepared for the
+ * connection @a conn, in order to add credentials etc. to the request.
+ *
+ * @a baton and @a authn_baton are the same as in the handle function.
+ *
+ * @a method and @a uri are the requests attributes and @a headers are the
+ * request headers where the credentials are usually set.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.4.
+ */
 typedef apr_status_t
 (*serf_authn_setup_request_func_t)(void *baton,
                                    void *authn_baton,
-                                   int code,
                                    serf_connection_t *conn,
                                    serf_request_t *request,
                                    const char *method,
@@ -1015,22 +1114,35 @@ typedef apr_status_t
                                    serf_bucket_t *headers,
                                    apr_pool_t *scratch_pool);
 
-/** TODO:  */
+/**
+ * Callback for user-defined authentication scheme providers.
+ *
+ * Called every time a @a response with status @a code to the authenticated @a
+ * request is received from the connection @a conn.
+ *
+ * @a baton and @a authn_baton are the same as in the setup-request function
+ *
+ * If the scheme flag @c SERF_AUTHN_FLAG_PIPE is *not* set, return a boolean
+ * value in @a reset_pipelining to indicate whether pipelining on @a conn 
should
+ * be restored to the value before the init-conn callback was invoked.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.4.
+ */
 typedef apr_status_t
-(*serf_authn_validate_response_func_t)(void *baton,
+(*serf_authn_validate_response_func_t)(int *reset_pipelining,
+                                       void *baton,
                                        void *authn_baton,
                                        int code,
                                        serf_connection_t *conn,
                                        serf_request_t *request,
                                        serf_bucket_t *response,
-                                       apr_pool_t *scratch_pool,
-                                       int *reset_pipelining);
+                                       apr_pool_t *scratch_pool);
 
 /**
  * Register an autehtication scheme.
  *
- * The context in @a ctx is used for logging.
- *
  * The @a name is the name of the authentication scheme as it appears in the
  * authorization headers. It must be a valid token as defined in RFC-9110
  * (see reference, below).
@@ -1049,24 +1161,27 @@ typedef apr_status_t
  * serf_config_authn_types(). If an error occurs during registration,
  * @a type will be set to @c SERF_AUTHN_NONE.
  *
- * Internal structures related to this provider will be allocated from
- * @a result_pool, so take care that it lives as long as the autehtication
- * scheme is registered.
+ * The @a ctx is used only for logging.
+ *
+ * Internal structures related to this provider will be allocated from @a
+ * result_pool, so take care that it lives as long as the autehtication scheme
+ * is registered. Ideally, this pool should have a longer lifetime than any of
+ * the pools used in calls to the serf_contex_create() family of functions.
  *
  * @see https://www.rfc-editor.org/rfc/rfc9110#section-11.1
  * @since New in 1.4
  */
 apr_status_t serf_authn_register_scheme(
-    serf_context_t *ctx, const char *name, void *baton, int flags,
+    int *type,
+    serf_context_t *ctx,
+    const char *name, void *baton, int flags,
     serf_authn_init_conn_func_t init_conn,
     serf_authn_get_realm_func_t get_realm,
     serf_authn_handle_func_t handle,
     serf_authn_setup_request_func_t setup_request,
     serf_authn_validate_response_func_t validate_response,
-    apr_pool_t *result_pool,
-    int *type);
+    apr_pool_t *result_pool);
 
-/* FIXME: Think some more about whether unregistering schemes makes sense. */
 /**
  * Unregister an uthentication scheme.
  *
@@ -1076,19 +1191,20 @@ apr_status_t serf_authn_register_scheme(
  * temporary allocations; this pool can be destroyed after the function
  * has returned.
  *
- * The context in @a ctx is used for logging.
- *
- * Unregistering a scheme should be avoided while requests that might
- * use the scheme are in flight.
+ * The @a ctx is used only for logging.
  *
- * So in short, don't use this function at all...?
+ * NOTE: Unregistering a scheme should be avoided, unless you can be absolutely
+ *       sure that there are no outstanding requests, responses, connections or
+ *       contexts that refer to it. There is no internal reference counting or
+ *       other mechanism to ensure that the scheme remains accessible while 
it's
+ *       in use. So in short: *do not* use this function at all.
  *
  * @since New in 1.4
  */
-/* apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx, */
-/*                                           int type, */
-/*                                           const char *name, */
-/*                                           apr_pool_t *scratch_pool); */
+apr_status_t serf_authn_unregister_scheme(serf_context_t *ctx,
+                                          int type,
+                                          const char *name,
+                                          apr_pool_t *scratch_pool);
 
 /** @} */
 

Modified: serf/branches/user-defined-authn/test/test_auth.c
URL: 
http://svn.apache.org/viewvc/serf/branches/user-defined-authn/test/test_auth.c?rev=1926674&r1=1926673&r2=1926674&view=diff
==============================================================================
--- serf/branches/user-defined-authn/test/test_auth.c (original)
+++ serf/branches/user-defined-authn/test/test_auth.c Tue Jun 24 05:34:26 2025
@@ -512,14 +512,6 @@ static void test_auth_on_HEAD(CuTest *tc
 }
 
 
-/* FIXME: Temporary rename of the unregister function. */
-#define serf_authn_unregister_scheme(ctx, type, name, scratch_pool)  \
-    serf__authn__unregister_scheme((ctx), (type), (name), (scratch_pool))
-apr_status_t serf__authn__unregister_scheme(serf_context_t *ctx,
-                                            int type,
-                                            const char *name,
-                                            apr_pool_t *scratch_pool);
-
 static void test_authn_register_one(CuTest *tc)
 {
     test_baton_t *tb = tc->testBaton;
@@ -531,10 +523,11 @@ static void test_authn_register_one(CuTe
     CuAssertIntEquals(tc, APR_SUCCESS, status);
 
     /* Register an authentication scheme */
-    status = serf_authn_register_scheme(tb->context, "Fizzle", baton,
+    status = serf_authn_register_scheme(&type, tb->context,
+                                        "Fizzle", baton,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        tb->pool, &type);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, type != SERF_AUTHN_NONE);
 
@@ -556,17 +549,19 @@ static void test_authn_register_two(CuTe
     CuAssertIntEquals(tc, APR_SUCCESS, status);
 
     /* Register the schemes */
-    status = serf_authn_register_scheme(tb->context, "Tweedledee", baton1,
+    status = serf_authn_register_scheme(&type1, tb->context,
+                                        "Tweedledee", baton1,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        tb->pool, &type1);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, type1 != SERF_AUTHN_NONE);
 
-    status = serf_authn_register_scheme(tb->context, "Tweedledum", baton2,
+    status = serf_authn_register_scheme(&type2, tb->context,
+                                        "Tweedledum", baton2,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        tb->pool, &type2);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, type2 != SERF_AUTHN_NONE);
     CuAssertTrue(tc, type2 != type1);
@@ -591,17 +586,19 @@ static void test_authn_register_twice(Cu
     CuAssertIntEquals(tc, APR_SUCCESS, status);
 
     /* Register an authentication scheme */
-    status = serf_authn_register_scheme(tb->context, "Tweens", baton,
+    status = serf_authn_register_scheme(&type, tb->context,
+                                        "Tweens", baton,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        tb->pool, &type);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, type != SERF_AUTHN_NONE);
 
-    status = serf_authn_register_scheme(tb->context, "Tweens", baton,
+    status = serf_authn_register_scheme(&epyt, tb->context,
+                                        "Tweens", baton,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        tb->pool, &epyt);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_EEXIST, status);
     CuAssertTrue(tc, epyt == SERF_AUTHN_NONE);
 
@@ -641,10 +638,11 @@ static void test_authn_registered_pool_c
     CuAssertTrue(tc, scheme_pool != NULL);
 
     /* Register an authentication scheme */
-    status = serf_authn_register_scheme(tb->context, "Killed", baton,
+    status = serf_authn_register_scheme(&type, tb->context,
+                                        "Killed", baton,
                                         SERF_AUTHN_FLAG_NONE,
                                         NULL, NULL, NULL, NULL, NULL,
-                                        scheme_pool, &type);
+                                        scheme_pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, type != SERF_AUTHN_NONE);
 
@@ -691,10 +689,10 @@ struct user_authn_cache {
 
 static const char *const user_authn_prefix = "Tweedle";
 
-static apr_status_t user_authn_init_conn(void *baton, int code,
+static apr_status_t user_authn_init_conn(void **authn_baton,
+                                         void *baton, int code,
                                          apr_pool_t *result_pool,
-                                         apr_pool_t *scratch_pool,
-                                         void **authn_baton)
+                                         apr_pool_t *scratch_pool)
 {
     USER_AUTHN_COUNT(baton, init_conn);
 
@@ -705,13 +703,13 @@ static apr_status_t user_authn_init_conn
     return APR_SUCCESS;
 }
 
-static apr_status_t user_authn_get_realm(void *baton,
+static apr_status_t user_authn_get_realm(const char **realm_name,
+                                         void *baton,
                                          void *authn_baton,
                                          const char *authn_header,
                                          const char *authn_attributes,
                                          apr_pool_t *result_pool,
-                                         apr_pool_t *scratch_pool,
-                                         const char **realm_name)
+                                         apr_pool_t *scratch_pool)
 {
     const char *end;
     apr_size_t length;
@@ -766,7 +764,6 @@ static apr_status_t user_authn_handle(vo
 
 static apr_status_t user_authn_setup_request(void *baton,
                                              void *authn_baton,
-                                             int code,
                                              serf_connection_t *conn,
                                              serf_request_t *request,
                                              const char *method,
@@ -790,14 +787,14 @@ static apr_status_t user_authn_setup_req
     return SERF_ERROR_AUTHN_FAILED;
 }
 
-static apr_status_t user_authn_validate_response(void *baton,
+static apr_status_t user_authn_validate_response(int *reset_pipelining,
+                                                 void *baton,
                                                  void *authn_baton,
                                                  int code,
                                                  serf_connection_t *conn,
                                                  serf_request_t *request,
                                                  serf_bucket_t *response,
-                                                 apr_pool_t *scratch_pool,
-                                                 int *reset_pipelining)
+                                                 apr_pool_t *scratch_pool)
 {
     USER_AUTHN_COUNT(baton, validate_response);
     *reset_pipelining = 1;
@@ -856,23 +853,25 @@ static void user_authentication(CuTest *
     status = setup_test_context(tb, tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
 
-    status = serf_authn_register_scheme(tb->context, tdee->name, tdee, flags,
+    status = serf_authn_register_scheme(&typedee, tb->context,
+                                        tdee->name, tdee, flags,
                                         user_authn_init_conn,
                                         user_authn_get_realm,
                                         user_authn_handle,
                                         user_authn_setup_request,
                                         user_authn_validate_response,
-                                        tb->pool, &typedee);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, typedee != SERF_AUTHN_NONE);
 
-    status = serf_authn_register_scheme(tb->context, tdum->name, tdum, flags,
+    status = serf_authn_register_scheme(&typedum, tb->context,
+                                        tdum->name, tdum, flags,
                                         user_authn_init_conn,
                                         user_authn_get_realm,
                                         user_authn_handle,
                                         user_authn_setup_request,
                                         user_authn_validate_response,
-                                        tb->pool, &typedum);
+                                        tb->pool);
     CuAssertIntEquals(tc, APR_SUCCESS, status);
     CuAssertTrue(tc, typedum != SERF_AUTHN_NONE);
     CuAssertTrue(tc, typedum != typedee);



Reply via email to