Skip to content

Commit f20a352

Browse files
committed
Acquire creds only once for basic_auth
Instead of acquiring creds by looping at each round, use gss_inquire_cred_by_mech() to work around the union_name issue and get the correct per-mechanism server name. Closes #45 Signed-off-by: Simo Sorce <simo@redhat.com>
1 parent c18ca3a commit f20a352

File tree

1 file changed

+26
-25
lines changed

1 file changed

+26
-25
lines changed

src/mod_auth_gssapi.c

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)