summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2012-06-15 14:43:07 -0400
committerGünther Deschner <gdeschner@redhat.com>2012-06-26 14:44:44 +0200
commit80d7f68e49c58db3b63b12849cac6429af347f0f (patch)
treef5522903370fcd99131f86ae44b4e3874b75e197
parente3a355d5f2a46f90aa13653c0178442d84e7d1d3 (diff)
downloadgss-proxy-80d7f68e49c58db3b63b12849cac6429af347f0f.tar.gz
gss-proxy-80d7f68e49c58db3b63b12849cac6429af347f0f.tar.xz
gss-proxy-80d7f68e49c58db3b63b12849cac6429af347f0f.zip
WIP: Add name handlers
-rw-r--r--proxy/src/mechglue/gpm_import_and_canon_name.c29
-rw-r--r--proxy/src/mechglue/gpm_init_sec_context.c6
-rw-r--r--proxy/src/mechglue/gpp_acquire_cred.c14
-rw-r--r--proxy/src/mechglue/gpp_import_and_canon_name.c2
-rw-r--r--proxy/src/mechglue/gpp_init_sec_context.c31
-rw-r--r--proxy/src/mechglue/gss_plugin.c41
-rw-r--r--proxy/src/mechglue/gss_plugin.h2
-rw-r--r--proxy/src/mechglue/gssapi_gpm.h6
8 files changed, 93 insertions, 38 deletions
diff --git a/proxy/src/mechglue/gpm_import_and_canon_name.c b/proxy/src/mechglue/gpm_import_and_canon_name.c
index c18b52a..fb78abb 100644
--- a/proxy/src/mechglue/gpm_import_and_canon_name.c
+++ b/proxy/src/mechglue/gpm_import_and_canon_name.c
@@ -26,14 +26,12 @@
#include "gssapi_gpm.h"
OM_uint32 gpm_display_name(OM_uint32 *minor_status,
- gss_name_t input_name,
+ gssx_name *in_name,
gss_buffer_t output_name_buffer,
gss_OID *output_name_type)
{
gss_buffer_desc input_name_buffer = GSS_C_EMPTY_BUFFER;
gssx_name *output_name = NULL;
- gss_name_t tmp;
- gssx_name *name;
uint32_t ret_maj;
uint32_t ret_min;
uint32_t discard;
@@ -44,46 +42,43 @@ OM_uint32 gpm_display_name(OM_uint32 *minor_status,
}
*minor_status = 0;
- if (!input_name) {
+ if (!in_name) {
return GSS_S_CALL_INACCESSIBLE_READ;
}
if (!output_name_buffer || !output_name_type) {
return GSS_S_CALL_INACCESSIBLE_WRITE;
}
- name = (gssx_name *)input_name;
-
- if (name->display_name.octet_string_len == 0) {
- if (name->exported_name.octet_string_len == 0) {
+ if (in_name->display_name.octet_string_len == 0) {
+ if (in_name->exported_name.octet_string_len == 0) {
return GSS_S_BAD_NAME;
}
- gp_conv_gssx_to_buffer(&name->exported_name, &input_name_buffer);
- tmp = (gss_name_t)output_name;
+ gp_conv_gssx_to_buffer(&in_name->exported_name, &input_name_buffer);
ret_maj = gpm_import_name(&ret_min, &input_name_buffer,
- GSS_C_NT_EXPORT_NAME, &tmp);
+ GSS_C_NT_EXPORT_NAME, &output_name);
if (ret_maj) {
goto done;
}
/* steal display_name and name_type */
- name->display_name = output_name->display_name;
+ in_name->display_name = output_name->display_name;
output_name->display_name.octet_string_len = 0;
output_name->display_name.octet_string_val = NULL;
- name->name_type = output_name->name_type;
+ in_name->name_type = output_name->name_type;
output_name->name_type.octet_string_len = 0;
output_name->name_type.octet_string_val = NULL;
}
- ret = gp_copy_gssx_to_buffer(&name->display_name, output_name_buffer);
+ ret = gp_copy_gssx_to_buffer(&in_name->display_name, output_name_buffer);
if (ret) {
ret_min = ret;
ret_maj = GSS_S_FAILURE;
goto done;
}
- ret = gp_conv_gssx_to_oid_alloc(&name->name_type, output_name_type);
+ ret = gp_conv_gssx_to_oid_alloc(&in_name->name_type, output_name_type);
if (ret) {
gss_release_buffer(&discard, output_name_buffer);
ret_min = ret;
@@ -106,7 +101,7 @@ done:
OM_uint32 gpm_import_name(OM_uint32 *minor_status,
gss_buffer_t input_name_buffer,
gss_OID input_name_type,
- gss_name_t *output_name)
+ gssx_name **output_name)
{
gssx_name *name;
int ret;
@@ -142,7 +137,7 @@ OM_uint32 gpm_import_name(OM_uint32 *minor_status,
return GSS_S_FAILURE;
}
- *output_name = (gss_name_t)name;
+ *output_name = name;
return GSS_S_COMPLETE;
}
diff --git a/proxy/src/mechglue/gpm_init_sec_context.c b/proxy/src/mechglue/gpm_init_sec_context.c
index ab6ed80..12df858 100644
--- a/proxy/src/mechglue/gpm_init_sec_context.c
+++ b/proxy/src/mechglue/gpm_init_sec_context.c
@@ -29,7 +29,7 @@
OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
gssx_cred *cred_handle,
gssx_ctx **context_handle,
- gss_name_t target_name,
+ gssx_name *target_name,
gss_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
@@ -63,9 +63,7 @@ OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
arg->context_handle = *context_handle;
}
- if (target_name != GSS_C_NO_NAME) {
- arg->target_name = (gssx_name *)target_name;
- }
+ arg->target_name = target_name;
ret = gp_conv_oid_to_gssx(mech_type, &arg->mech_type);
if (ret) {
diff --git a/proxy/src/mechglue/gpp_acquire_cred.c b/proxy/src/mechglue/gpp_acquire_cred.c
index acd9fc2..c0d3c1f 100644
--- a/proxy/src/mechglue/gpp_acquire_cred.c
+++ b/proxy/src/mechglue/gpp_acquire_cred.c
@@ -66,7 +66,7 @@ OM_uint32 gssi_add_cred(OM_uint32 *minor_status,
maj = gpm_add_cred(&min,
input_cred_handle,
- desired_name,
+ (gssx_name *)desired_name,
desired_mech,
cred_usage,
initiator_time_req,
@@ -90,9 +90,10 @@ OM_uint32 gssi_acquire_cred_with_password(OM_uint32 *minor_status,
gss_OID_set *actual_mechs,
OM_uint32 *time_rec)
{
+ gssx_name *name = (gssx_name *)desired_name;
+ gss_name_t mech_name = GSS_C_NO_NAME;
struct gpm_cred_handle *cred_handle;
gss_cred_id_t local_cred_handle;
- gss_name_t mech_name = GSS_C_NO_NAME;
gss_OID_set special_mechs;
gss_OID_set ret_mechs;
OM_uint32 maj, min;
@@ -112,12 +113,11 @@ OM_uint32 gssi_acquire_cred_with_password(OM_uint32 *minor_status,
return GSS_S_FAILURE;
}
- if (desired_name) {
- gssx_name *name = (gssx_name *)desired_name;
-
- maj = gp_conv_gssx_to_name(&min, name, &mech_name);
+ if (name) {
+ maj = gpm_name_to_local(&min, name, GSS_C_NO_OID, &mech_name);
if (maj) {
- return GSS_S_FAILURE;
+ *minor_status = gpm_map_error(min);
+ return maj;
}
}
diff --git a/proxy/src/mechglue/gpp_import_and_canon_name.c b/proxy/src/mechglue/gpp_import_and_canon_name.c
index 69ecaee..51a1b9d 100644
--- a/proxy/src/mechglue/gpp_import_and_canon_name.c
+++ b/proxy/src/mechglue/gpp_import_and_canon_name.c
@@ -51,7 +51,7 @@ OM_uint32 gssi_import_name(OM_uint32 *minor_status,
maj = gpm_import_name(&min,
input_name_buffer,
input_name_type,
- output_name);
+ (gssx_name **)output_name);
*minor_status = gpm_map_error(min);
return maj;
diff --git a/proxy/src/mechglue/gpp_init_sec_context.c b/proxy/src/mechglue/gpp_init_sec_context.c
index 80bab99..b258d4c 100644
--- a/proxy/src/mechglue/gpp_init_sec_context.c
+++ b/proxy/src/mechglue/gpp_init_sec_context.c
@@ -41,6 +41,8 @@ OM_uint32 gssi_init_sec_context(OM_uint32 *minor_status,
{
struct gpm_context_handle *ctx_handle = NULL;
struct gpm_cred_handle *cred_handle = NULL;
+ gssx_name *name = (gssx_name *)target_name;
+ gss_name_t mech_name = GSS_C_NO_NAME;
gss_cred_id_t local_cred_handle = GSS_C_NO_CREDENTIAL;
gssx_cred *remote_cred_handle = NULL;
OM_uint32 maj, min;
@@ -76,14 +78,22 @@ OM_uint32 gssi_init_sec_context(OM_uint32 *minor_status,
if (mech_type == GSS_C_NO_OID) {
/* shouldn't happen, but if it does we need to return an error
* or we might just loop */
- *minor_status = 0;
- return GSS_S_BAD_MECH;
+ min = 0;
+ maj = GSS_S_BAD_MECH;
+ goto done;
+ }
+
+ if (name) {
+ maj = gpm_name_to_local(&min, name, mech_type, &mech_name);
+ if (maj) {
+ goto done;
+ }
}
maj = gss_init_sec_context(&min,
local_cred_handle,
&ctx_handle->local_ctx_handle,
- target_name,
+ mech_name,
gpm_special_mech(mech_type),
req_flags,
time_req,
@@ -93,12 +103,14 @@ OM_uint32 gssi_init_sec_context(OM_uint32 *minor_status,
output_token,
ret_flags,
time_rec);
+
+ (void)gss_release_name(&min, &mech_name);
} else {
maj = gpm_init_sec_context(&min,
remote_cred_handle,
&ctx_handle->remote_ctx_handle,
- target_name,
+ name,
mech_type,
req_flags,
time_req,
@@ -110,7 +122,14 @@ OM_uint32 gssi_init_sec_context(OM_uint32 *minor_status,
time_rec);
}
- *context_handle = (gss_ctx_id_t)ctx_handle;
- *minor_status = gpm_map_error(min);
+done:
+ if (maj) {
+ if (!*context_handle) {
+ free(ctx_handle);
+ }
+ *minor_status = gpm_map_error(min);
+ } else {
+ *context_handle = (gss_ctx_id_t)ctx_handle;
+ }
return maj;
}
diff --git a/proxy/src/mechglue/gss_plugin.c b/proxy/src/mechglue/gss_plugin.c
index fd976a5..c73cadd 100644
--- a/proxy/src/mechglue/gss_plugin.c
+++ b/proxy/src/mechglue/gss_plugin.c
@@ -250,6 +250,47 @@ uint32_t gpm_unmap_error(uint32_t err)
return err;
}
+uint32_t gpm_name_to_local(uint32_t *minor, gssx_name *name,
+ gss_OID mech_type, gss_name_t *mech_name)
+{
+ uint32_t maj, min;
+ gss_buffer_desc display_name_buffer = GSS_C_EMPTY_BUFFER;
+ gss_OID display_name_type = GSS_C_NO_OID;
+ gss_name_t tmpname = NULL;
+
+ maj = gpm_display_name(minor, name,
+ &display_name_buffer,
+ &display_name_type);
+ if (maj) {
+ return maj;
+ }
+
+ maj = gss_import_name(minor,
+ &display_name_buffer,
+ display_name_type,
+ &tmpname);
+
+ (void)gss_release_buffer(&min, &display_name_buffer);
+ (void)gss_release_oid(&min, &display_name_type);
+
+ if (maj) {
+ return maj;
+ }
+
+ if (mech_type != GSS_C_NO_OID) {
+ /* name for specific mech requested */
+ maj = gss_canonicalize_name(minor,
+ tmpname,
+ gpm_special_mech(mech_type),
+ mech_name);
+ (void)gss_release_name(&min, &tmpname);
+ } else {
+ *mech_name = tmpname;
+ }
+
+ return maj;
+}
+
/*
gssi_acquire_cred
gssi_release_cred
diff --git a/proxy/src/mechglue/gss_plugin.h b/proxy/src/mechglue/gss_plugin.h
index 921bcd3..49d8175 100644
--- a/proxy/src/mechglue/gss_plugin.h
+++ b/proxy/src/mechglue/gss_plugin.h
@@ -45,6 +45,8 @@ const gss_OID gpm_special_mech(const gss_OID mech_type);
gss_OID_set gpm_special_available_mechs(const gss_OID_set mechs);
uint32_t gpm_map_error(uint32_t err);
uint32_t gpm_unmap_error(uint32_t err);
+uint32_t gpm_name_to_local(uint32_t *minor, gssx_name *name,
+ gss_OID mech_type, gss_name_t *mech_name);
OM_uint32 gssi_acquire_cred(OM_uint32 *minor_status,
const gss_name_t desired_name,
diff --git a/proxy/src/mechglue/gssapi_gpm.h b/proxy/src/mechglue/gssapi_gpm.h
index e4281d2..0bb8d1e 100644
--- a/proxy/src/mechglue/gssapi_gpm.h
+++ b/proxy/src/mechglue/gssapi_gpm.h
@@ -123,13 +123,13 @@ OM_uint32 gpm_indicate_mechs_by_attrs(OM_uint32 *minor_status,
gss_OID_set *mechs);
OM_uint32 gpm_display_name(OM_uint32 *minor_status,
- gss_name_t input_name,
+ gssx_name *in_name,
gss_buffer_t output_name_buffer,
gss_OID *output_name_type);
OM_uint32 gpm_import_name(OM_uint32 *minor_status,
gss_buffer_t input_name_buffer,
gss_OID input_name_type,
- gss_name_t *output_name);
+ gssx_name **output_name);
OM_uint32 gpm_export_name(OM_uint32 *minor_status,
const gss_name_t input_name,
gss_buffer_t exported_name);
@@ -149,7 +149,7 @@ OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
gssx_cred *cred_handle,
gssx_ctx **context_handle,
- gss_name_t target_name,
+ gssx_name *target_name,
gss_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,