@@ -402,12 +402,12 @@ static bool mag_auth_basic(request_rec *req,
402402 gss_name_t server = GSS_C_NO_NAME ;
403403 gss_cred_id_t server_cred = GSS_C_NO_CREDENTIAL ;
404404 gss_ctx_id_t server_ctx = GSS_C_NO_CONTEXT ;
405+ gss_cred_id_t acquired_cred = GSS_C_NO_CREDENTIAL ;
405406 gss_buffer_desc input = GSS_C_EMPTY_BUFFER ;
406407 gss_buffer_desc output = GSS_C_EMPTY_BUFFER ;
407408 gss_OID_set indicated_mechs = GSS_C_NO_OID_SET ;
408409 gss_OID_set allowed_mechs ;
409410 gss_OID_set filtered_mechs ;
410- gss_OID_set_desc all_mechs_desc ;
411411 gss_OID_set actual_mechs = GSS_C_NO_OID_SET ;
412412 uint32_t init_flags = 0 ;
413413 uint32_t maj , min ;
@@ -524,6 +524,22 @@ static bool mag_auth_basic(request_rec *req,
524524 goto done ;
525525 }
526526
527+ /* must acquire creds based on the actual mechs we want to try */
528+ if (!mag_acquire_creds (req , cfg , actual_mechs ,
529+ GSS_C_BOTH , & acquired_cred , NULL )) {
530+ goto done ;
531+ }
532+
533+ if (cred_usage == GSS_C_BOTH ) {
534+ /* must acquire with GSS_C_ACCEPT to get the server name */
535+ if (!mag_acquire_creds (req , cfg , actual_mechs ,
536+ GSS_C_ACCEPT , & server_cred , NULL )) {
537+ goto done ;
538+ }
539+ } else {
540+ server_cred = acquired_cred ;
541+ }
542+
527543#ifdef HAVE_CRED_STORE
528544 if (cfg -> deleg_ccache_dir ) {
529545 /* delegate ourselves credentials so we store them as requested */
@@ -543,35 +559,17 @@ static bool mag_auth_basic(request_rec *req,
543559 gss_release_buffer (& min , & output );
544560 gss_release_buffer (& min , & input );
545561 gss_release_name (& min , & server );
546- gss_release_cred (& min , & server_cred );
547562
548- all_mechs_desc .count = 1 ;
549- all_mechs_desc .elements = & actual_mechs -> elements [i ];
550- allowed_mechs = & all_mechs_desc ;
551-
552- /* must acquire with GSS_C_ACCEPT to get the server name */
553- if (!mag_acquire_creds (req , cfg , allowed_mechs ,
554- GSS_C_ACCEPT , & server_cred , NULL )) {
555- continue ;
556- }
557- maj = gss_inquire_cred (& min , server_cred , & server ,
558- NULL , NULL , NULL );
563+ maj = gss_inquire_cred_by_mech (& min , server_cred ,
564+ & actual_mechs -> elements [i ],
565+ & server , NULL , NULL , NULL );
559566 if (GSS_ERROR (maj )) {
560567 ap_log_rerror (APLOG_MARK , APLOG_ERR , 0 , req ,
561- "%s" , mag_error (req , "gss_inquired_cred_ () "
568+ "%s" , mag_error (req , "gss_inquired_cred_by_mech () "
562569 "failed" , maj , min ));
563570 continue ;
564571 }
565572
566- if (cred_usage == GSS_C_BOTH ) {
567- /* reacquire server creds in order to allow delegation */
568- gss_release_cred (& min , & server_cred );
569- if (!mag_acquire_creds (req , cfg , allowed_mechs ,
570- GSS_C_BOTH , & server_cred , NULL )) {
571- continue ;
572- }
573- }
574-
575573 do {
576574 /* output and input are inverted here, this is intentional */
577575 maj = gss_init_sec_context (& min , user_cred , & user_ctx , server ,
@@ -585,7 +583,7 @@ static bool mag_auth_basic(request_rec *req,
585583 break ;
586584 }
587585 gss_release_buffer (& min , & output );
588- maj = gss_accept_sec_context (& min , & server_ctx , server_cred ,
586+ maj = gss_accept_sec_context (& min , & server_ctx , acquired_cred ,
589587 & input , GSS_C_NO_CHANNEL_BINDINGS ,
590588 client , mech_type , & output , NULL ,
591589 vtime , delegated_cred );
@@ -608,8 +606,10 @@ static bool mag_auth_basic(request_rec *req,
608606 gss_release_buffer (& min , & output );
609607 gss_release_buffer (& min , & input );
610608 gss_release_name (& min , & server );
611- gss_release_cred (& min , & server_cred );
609+ if (server_cred != acquired_cred )
610+ gss_release_cred (& min , & server_cred );
612611 gss_delete_sec_context (& min , & server_ctx , GSS_C_NO_BUFFER );
612+ gss_release_cred (& min , & acquired_cred );
613613 gss_release_name (& min , & user );
614614 gss_release_cred (& min , & user_cred );
615615 gss_delete_sec_context (& min , & user_ctx , GSS_C_NO_BUFFER );
@@ -834,6 +834,7 @@ static int mag_auth(request_rec *req)
834834 cred_usage = GSS_C_BOTH ;
835835 }
836836#endif
837+
837838 if (auth_type == AUTH_TYPE_BASIC ) {
838839 if (mag_auth_basic (req , cfg , ba_user , ba_pwd ,
839840 cred_usage , & client , & mech_type ,
0 commit comments