Skip to content

Commit a0cfc1b

Browse files
committed
Support allowing arbitrary mechanisms
Use gss_str_to_oid so OIDs can be used to set arbitrary mechanism in allow lists like GssapiAllowedMech or GssapiBasicAuthMech. Closes #46 Signed-off-by: Simo Sorce <simo@redhat.com>
1 parent f20a352 commit a0cfc1b

File tree

1 file changed

+50
-21
lines changed

1 file changed

+50
-21
lines changed

src/mod_auth_gssapi.c

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,48 +1150,77 @@ static const char *mag_use_basic_auth(cmd_parms *parms, void *mconfig, int on)
11501150
}
11511151
#endif
11521152

1153-
#define MAX_ALLOWED_MECHS 10
1153+
static apr_status_t mag_oid_set_destroy(void *ptr)
1154+
{
1155+
uint32_t min;
1156+
gss_OID_set set = (gss_OID_set)ptr;
1157+
(void)gss_release_oid_set(&min, &set);
1158+
return APR_SUCCESS;
1159+
}
11541160

11551161
static void mag_list_of_mechs(cmd_parms *parms, gss_OID_set *oidset,
11561162
bool add_spnego, const char *w)
11571163
{
1158-
gss_const_OID oid;
1164+
gss_buffer_desc buf = { 0 };
1165+
uint32_t maj, min;
11591166
gss_OID_set set;
1160-
size_t size;
1167+
gss_OID oid;
1168+
bool release_oid = false;
11611169

11621170
if (NULL == *oidset) {
1163-
set = apr_pcalloc(parms->pool, sizeof(gss_OID_set_desc));
1164-
size = sizeof(gss_OID) * MAX_ALLOWED_MECHS;
1165-
set->elements = apr_palloc(parms->pool, size);
1171+
maj = gss_create_empty_oid_set(&min, &set);
1172+
if (maj != GSS_S_COMPLETE) {
1173+
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1174+
"gss_create_empty_oid_set() failed.");
1175+
*oidset = GSS_C_NO_OID_SET;
1176+
return;
1177+
}
11661178
if (add_spnego) {
1167-
set->elements[0] = gss_mech_spnego;
1168-
set->count++;
1179+
oid = discard_const(&gss_mech_spnego);
1180+
maj = gss_add_oid_set_member(&min, oid, &set);
1181+
if (maj != GSS_S_COMPLETE) {
1182+
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1183+
"gss_add_oid_set_member() failed.");
1184+
(void)gss_release_oid_set(&min, &set);
1185+
*oidset = GSS_C_NO_OID_SET;
1186+
return;
1187+
}
11691188
}
1189+
/* register in the pool so it can be released once the server
1190+
* winds down */
1191+
apr_pool_cleanup_register(parms->pool, (void *)set,
1192+
mag_oid_set_destroy,
1193+
apr_pool_cleanup_null);
11701194
*oidset = set;
11711195
} else {
11721196
set = *oidset;
11731197
}
11741198

11751199
if (strcmp(w, "krb5") == 0) {
1176-
oid = gss_mech_krb5;
1200+
oid = discard_const(gss_mech_krb5);
11771201
} else if (strcmp(w, "iakerb") == 0) {
1178-
oid = gss_mech_iakerb;
1202+
oid = discard_const(gss_mech_iakerb);
11791203
} else if (strcmp(w, "ntlmssp") == 0) {
1180-
oid = &gss_mech_ntlmssp;
1204+
oid = discard_const(&gss_mech_ntlmssp);
11811205
} else {
1182-
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1183-
"Unrecognized GSSAPI Mechanism: %s", w);
1184-
return;
1206+
buf.value = discard_const(w);
1207+
buf.length = strlen(w);
1208+
maj = gss_str_to_oid(&min, &buf, &oid);
1209+
if (maj != GSS_S_COMPLETE) {
1210+
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1211+
"Unrecognized GSSAPI Mechanism: [%s]", w);
1212+
return;
1213+
}
1214+
release_oid = true;
11851215
}
1186-
1187-
if (set->count >= MAX_ALLOWED_MECHS) {
1216+
maj = gss_add_oid_set_member(&min, oid, &set);
1217+
if (maj != GSS_S_COMPLETE) {
11881218
ap_log_error(APLOG_MARK, APLOG_ERR, 0, parms->server,
1189-
"Too many GssapiAllowedMech options (MAX: %d)",
1190-
MAX_ALLOWED_MECHS);
1191-
return;
1219+
"gss_add_oid_set_member() failed for [%s].", w);
1220+
}
1221+
if (release_oid) {
1222+
(void)gss_release_oid(&min, &oid);
11921223
}
1193-
set->elements[set->count] = *oid;
1194-
set->count++;
11951224
}
11961225

11971226
static const char *mag_allow_mech(cmd_parms *parms, void *mconfig,

0 commit comments

Comments
 (0)