Author: brane Date: Sun Jun 8 01:33:45 2025 New Revision: 1926227 URL: http://svn.apache.org/viewvc?rev=1926227&view=rev Log: On the user-defined-auth branch: Don't "subclass" a private struct. Next time, save some of those overactiv neurons for actual thinking.
* auth/auth.h (serf__user_authn_scheme_t): Remove. Move its contents to ... (serf__authn_scheme_t): ... here. * auth/auth.c (serf_authn_register_scheme): Deal with the struct merge. * auth/auth_basic.c, auth/auth_spnego.c, auth/auth_spnego.c: Explicitly initialize serf__authn_scheme_t::magic, even though it's not really necessary for static objects. * auth/auth_user_defined.c (validate_user_authn): New; replaces safe_cast_scheme. (serf__authn_user__init_conn, serf__authn_user__handler, serf__authn_user__setup_request, serf__authn_user__validate_response): Use validate_user_authn. 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/auth/auth_user_defined.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=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth.c (original) +++ serf/branches/user-defined-authn/auth/auth.c Sun Jun 8 01:33:45 2025 @@ -627,7 +627,7 @@ apr_status_t serf_authn_register_scheme( apr_pool_t *result_pool, int *type) { - serf__user_authn_scheme_t *user_scheme; + serf__authn_scheme_t *authn_scheme; apr_status_t lock_status; apr_status_t status; unsigned int scheme_type; @@ -636,9 +636,7 @@ apr_status_t serf_authn_register_scheme( int index; *type = SERF_AUTHN_NONE; - user_scheme = apr_palloc(result_pool, sizeof(*user_scheme)); - user_scheme->magic = serf__authn_user__magic; - user_scheme->baton = baton; + authn_scheme = apr_palloc(result_pool, sizeof(*authn_scheme)); /* Generate a lower-case key for the scheme. */ key = cp = apr_pstrdup(result_pool, name); @@ -646,13 +644,17 @@ apr_status_t serf_authn_register_scheme( *cp = apr_tolower(*cp); ++cp; } - user_scheme->authn_scheme.name = apr_pstrdup(result_pool, name); - user_scheme->authn_scheme.key = key; - /* user_scheme->authn_scheme.type = ?; Will be updated later, under lock. */ - user_scheme->authn_scheme.init_conn_func = serf__authn_user__init_conn; - user_scheme->authn_scheme.handle_func = serf__authn_user__handler; - user_scheme->authn_scheme.setup_request_func = serf__authn_user__setup_request; - user_scheme->authn_scheme.validate_response_func = serf__authn_user__validate_response; + authn_scheme->name = apr_pstrdup(result_pool, name); + authn_scheme->key = key; + /* user_scheme->type = ?; Will be updated later, under lock. */ + authn_scheme->init_conn_func = serf__authn_user__init_conn; + authn_scheme->handle_func = serf__authn_user__handler; + authn_scheme->setup_request_func = serf__authn_user__setup_request; + authn_scheme->validate_response_func = serf__authn_user__validate_response; + + /* User-defined scheme data. */ + authn_scheme->magic = serf__authn_user__magic; + authn_scheme->baton = baton; lock_status = lock_autn_schemes(NULL /* TODO: whence cometh config? */); if (lock_status) @@ -687,8 +689,8 @@ apr_status_t serf_authn_register_scheme( } /* Insert into the slot, and add the sentinel. */ - user_scheme->authn_scheme.type = scheme_type; - serf_authn_schemes[index] = &user_scheme->authn_scheme; + authn_scheme->type = scheme_type; + serf_authn_schemes[index] = authn_scheme; serf_authn_schemes[index + 1] = NULL; *type = scheme_type; Modified: serf/branches/user-defined-authn/auth/auth.h URL: http://svn.apache.org/viewvc/serf/branches/user-defined-authn/auth/auth.h?rev=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth.h (original) +++ serf/branches/user-defined-authn/auth/auth.h Sun Jun 8 01:33:45 2025 @@ -108,6 +108,16 @@ struct serf__authn_scheme_t { /* Function to validate the authentication header of a response */ serf__validate_response_func_t validate_response_func; + + /* + * Additional data for user-defined authentication schemes. + */ + + /* The magic number that helps verify the user-defined scheme data. */ + apr_uint64_t magic; + + /* The baton used by the callbacks. */ + void *baton; }; @@ -141,22 +151,6 @@ extern const serf__authn_scheme_t serf__ /** User-defined authentication scheme handlers */ -/* This struct extends serf__authn_scheme_t with info needed for - the user-defined scheme implementation. It's essentially a subclass; - per C semantics, the address of the struct is also the address of - its first member, so we can safely put a pointer to this struct - into serf_authn_schemes. */ -typedef struct serf__user_authn_scheme_t serf__user_authn_scheme_t; -struct serf__user_authn_scheme_t { - serf__authn_scheme_t authn_scheme; - - /* The magic number that helps identify this struct. */ - apr_uint64_t magic; - - /* The baton used by the callbacks. */ - void *baton; -}; - #ifndef SERF__AUTHN__HAVE_UNREGISTER /* Declare the prototype for the internal unregister implementation */ apr_status_t serf__authn__unregister_scheme(int type, 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=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_basic.c (original) +++ serf/branches/user-defined-authn/auth/auth_basic.c Sun Jun 8 01:33:45 2025 @@ -198,4 +198,6 @@ const serf__authn_scheme_t serf__basic_a serf__handle_basic_auth, serf__setup_request_basic_auth, validate_response_func, + + 0 /* user-defined scheme magic */ }; 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=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_digest.c (original) +++ serf/branches/user-defined-authn/auth/auth_digest.c Sun Jun 8 01:33:45 2025 @@ -566,4 +566,6 @@ const serf__authn_scheme_t serf__digest_ serf__handle_digest_auth, serf__setup_request_digest_auth, serf__validate_response_digest_auth, + + 0 /* user-defined scheme magic */ }; 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=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_spnego.c (original) +++ serf/branches/user-defined-authn/auth/auth_spnego.c Sun Jun 8 01:33:45 2025 @@ -663,6 +663,8 @@ const serf__authn_scheme_t serf__spnego_ serf__handle_spnego_auth, serf__setup_request_spnego_auth, serf__validate_response_spnego_auth, + + 0 /* user-defined scheme magic */ }; #ifdef WIN32 @@ -674,6 +676,8 @@ const serf__authn_scheme_t serf__ntlm_au serf__handle_spnego_auth, serf__setup_request_spnego_auth, serf__validate_response_spnego_auth, + + 0 /* user-defined scheme magic */ }; #endif /* #ifdef WIN32 */ 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=1926227&r1=1926226&r2=1926227&view=diff ============================================================================== --- serf/branches/user-defined-authn/auth/auth_user_defined.c (original) +++ serf/branches/user-defined-authn/auth/auth_user_defined.c Sun Jun 8 01:33:45 2025 @@ -25,14 +25,11 @@ #include "auth.h" -static const serf__user_authn_scheme_t * -safe_cast_scheme(const serf__authn_scheme_t *scheme) +static const bool +validate_user_authn(const serf__authn_scheme_t *scheme) { - const serf__user_authn_scheme_t *const user_scheme = (const void *)scheme; - if (scheme->type & *serf__authn_user__type_mask - && user_scheme->magic == serf__authn_user__magic) - return user_scheme; - return NULL; + return (scheme->type & *serf__authn_user__type_mask + && scheme->magic == serf__authn_user__magic); } apr_status_t @@ -41,7 +38,7 @@ serf__authn_user__init_conn(const serf__ serf_connection_t *conn, apr_pool_t *pool) { - if (!safe_cast_scheme(scheme)) + if (!validate_user_authn(scheme)) return APR_EINVAL; return APR_ENOTIMPL; @@ -56,7 +53,7 @@ serf__authn_user__handler(const serf__au const char *auth_attr, apr_pool_t *pool) { - if (!safe_cast_scheme(scheme)) + if (!validate_user_authn(scheme)) return APR_EINVAL; return APR_ENOTIMPL; @@ -72,7 +69,7 @@ serf__authn_user__setup_request(const se const char *uri, serf_bucket_t *hdrs_bkt) { - if (!safe_cast_scheme(scheme)) + if (!validate_user_authn(scheme)) return APR_EINVAL; return APR_ENOTIMPL; @@ -87,7 +84,7 @@ serf__authn_user__validate_response(cons serf_bucket_t *response, apr_pool_t *pool) { - if (!safe_cast_scheme(scheme)) + if (!validate_user_authn(scheme)) return APR_EINVAL; return APR_ENOTIMPL;