summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorIsaac Boukris <iboukris@gmail.com>2015-06-23 04:13:20 +0300
committerSimo Sorce <simo@redhat.com>2015-06-25 17:10:35 -0400
commit46c0a47fc6b8c97733dbd687b335784db758e8ea (patch)
tree34c2a62a4439f13da3b6193d21c7c311bc0fe669 /src
parentc27219caa2d75baf854b1535eb222d679fbe4fcd (diff)
downloadmod_auth_gssapi-46c0a47fc6b8c97733dbd687b335784db758e8ea.tar.gz
mod_auth_gssapi-46c0a47fc6b8c97733dbd687b335784db758e8ea.tar.xz
mod_auth_gssapi-46c0a47fc6b8c97733dbd687b335784db758e8ea.zip
Retrieve default mechs at server init
This avoids the need to retrieve the list on every auth attempt, and then free it every time. Implemented by adding a server config struct and populating it at server init with gss_indicate_mechs(). Reviewed-by: Simo Sorce <simo@redhat.com>
Diffstat (limited to 'src')
-rw-r--r--src/mod_auth_gssapi.c73
-rw-r--r--src/mod_auth_gssapi.h4
2 files changed, 43 insertions, 34 deletions
diff --git a/src/mod_auth_gssapi.c b/src/mod_auth_gssapi.c
index d673912..6cb8d3a 100644
--- a/src/mod_auth_gssapi.c
+++ b/src/mod_auth_gssapi.c
@@ -407,7 +407,6 @@ static bool mag_auth_basic(request_rec *req,
gss_cred_id_t acquired_cred = GSS_C_NO_CREDENTIAL;
gss_buffer_desc input = GSS_C_EMPTY_BUFFER;
gss_buffer_desc output = GSS_C_EMPTY_BUFFER;
- gss_OID_set indicated_mechs = GSS_C_NO_OID_SET;
gss_OID_set allowed_mechs;
gss_OID_set filtered_mechs;
gss_OID_set actual_mechs = GSS_C_NO_OID_SET;
@@ -430,24 +429,19 @@ static bool mag_auth_basic(request_rec *req,
} else if (cfg->allowed_mechs) {
allowed_mechs = cfg->allowed_mechs;
} else {
+ struct mag_server_config *scfg;
/* Try to fetch the default set if not explicitly configured,
* We need to do this because gss_acquire_cred_with_password()
* is currently limited to acquire creds for a single "default"
* mechanism if no desired mechanisms are passed in. This causes
* authentication to fail for secondary mechanisms as no user
* credentials are generated for those. */
- maj = gss_indicate_mechs(&min, &indicated_mechs);
- if (maj != GSS_S_COMPLETE) {
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, req, "%s",
- mag_error(req, "gss_indicate_mechs() failed",
- maj, min));
- /* if indicated _mechs failed, set GSS_C_NO_OID_SET. This
- * generally causes only the krb5 mechanism to be tried due
- * to implementation constraints, but may change in future. */
- allowed_mechs = GSS_C_NO_OID_SET;
- } else {
- allowed_mechs = indicated_mechs;
- }
+ scfg = ap_get_module_config(req->server->module_config,
+ &auth_gssapi_module);
+ /* In the worst case scenario default_mechs equals to GSS_C_NO_OID_SET.
+ * This generally causes only the krb5 mechanism to be tried due
+ * to implementation constraints, but may change in future. */
+ allowed_mechs = scfg->default_mechs;
}
/* Remove Spnego if present, or we'd repeat failed authentiations
@@ -461,19 +455,14 @@ static bool mag_auth_basic(request_rec *req,
* multiple times uselessly.
*/
filtered_mechs = mag_filter_unwanted_mechs(allowed_mechs);
- if ((allowed_mechs != GSS_C_NO_OID_SET) &&
- (filtered_mechs == GSS_C_NO_OID_SET)) {
+ if (filtered_mechs == allowed_mechs) {
+ /* in case filtered_mechs was not allocated here don't free it */
+ filtered_mechs = GSS_C_NO_OID_SET;
+ } else if (filtered_mechs == GSS_C_NO_OID_SET) {
ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, req, "Fatal "
"failure while filtering mechs, aborting");
goto done;
- } else if (filtered_mechs != allowed_mechs) {
- /* if indicated_mechs where sourced then free them here before
- * reusing the pointer */
- gss_release_oid_set(&min, &indicated_mechs);
-
- /* mark the list of mechs needs to be freed */
- indicated_mechs = filtered_mechs;
-
+ } else {
/* use the filtered list */
allowed_mechs = filtered_mechs;
}
@@ -611,7 +600,7 @@ done:
gss_release_cred(&min, &user_cred);
gss_delete_sec_context(&min, &user_ctx, GSS_C_NO_BUFFER);
gss_release_oid_set(&min, &actual_mechs);
- gss_release_oid_set(&min, &indicated_mechs);
+ gss_release_oid_set(&min, &filtered_mechs);
#ifdef HAVE_GSS_KRB5_CCACHE_NAME
if (user_ccache != NULL) {
maj = gss_krb5_ccache_name(&min, orig_ccache, NULL);
@@ -653,7 +642,6 @@ static int mag_auth(request_rec *req)
char *clientname;
gss_OID mech_type = GSS_C_NO_OID;
gss_OID_set desired_mechs = GSS_C_NO_OID_SET;
- gss_OID_set indicated_mechs = GSS_C_NO_OID_SET;
gss_buffer_desc lname = GSS_C_EMPTY_BUFFER;
struct mag_conn *mc = NULL;
time_t expiration;
@@ -669,14 +657,11 @@ static int mag_auth(request_rec *req)
if (cfg->allowed_mechs) {
desired_mechs = cfg->allowed_mechs;
} else {
+ struct mag_server_config *scfg;
/* Try to fetch the default set if not explicitly configured */
- maj = gss_indicate_mechs(&min, &indicated_mechs);
- if (maj != GSS_S_COMPLETE) {
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, req, "%s",
- mag_error(req, "gss_indicate_mechs() failed",
- maj, min));
- }
- desired_mechs = indicated_mechs;
+ scfg = ap_get_module_config(req->server->module_config,
+ &auth_gssapi_module);
+ desired_mechs = scfg->default_mechs;
}
/* implicit auth for subrequests if main auth already happened */
@@ -970,7 +955,7 @@ done:
ap_auth_name(req)));
}
}
- gss_release_oid_set(&min, &indicated_mechs);
+
if (ctx != GSS_C_NO_CONTEXT)
gss_delete_sec_context(&min, &ctx, GSS_C_NO_BUFFER);
gss_release_cred(&min, &acquired_cred);
@@ -1246,6 +1231,26 @@ static const char *mag_basic_auth_mechs(cmd_parms *parms, void *mconfig,
}
#endif
+static void *mag_create_server_config(apr_pool_t *p, server_rec *s)
+{
+ struct mag_server_config *scfg;
+ uint32_t maj, min;
+
+ scfg = apr_pcalloc(p, sizeof(struct mag_server_config));
+
+ maj = gss_indicate_mechs(&min, &scfg->default_mechs);
+ if (maj != GSS_S_COMPLETE) {
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+ "gss_indicate_mechs() failed");
+ } else {
+ /* Register the set in pool */
+ apr_pool_cleanup_register(p, (void *)scfg->default_mechs,
+ mag_oid_set_destroy, apr_pool_cleanup_null);
+ }
+
+ return scfg;
+}
+
static const command_rec mag_commands[] = {
AP_INIT_FLAG("GssapiSSLonly", mag_ssl_only, NULL, OR_AUTHCFG,
"Work only if connection is SSL Secured"),
@@ -1291,7 +1296,7 @@ module AP_MODULE_DECLARE_DATA auth_gssapi_module =
STANDARD20_MODULE_STUFF,
mag_create_dir_config,
NULL,
- NULL,
+ mag_create_server_config,
NULL,
mag_commands,
mag_register_hooks
diff --git a/src/mod_auth_gssapi.h b/src/mod_auth_gssapi.h
index 2e05bb0..5beda2d 100644
--- a/src/mod_auth_gssapi.h
+++ b/src/mod_auth_gssapi.h
@@ -61,6 +61,10 @@ struct mag_config {
gss_OID_set_desc *basic_mechs;
};
+struct mag_server_config {
+ gss_OID_set default_mechs;
+};
+
struct mag_conn {
apr_pool_t *pool;
gss_ctx_id_t ctx;