diff options
author | Simo Sorce <simo@redhat.com> | 2013-08-21 22:35:17 -0400 |
---|---|---|
committer | Simo Sorce <simo@redhat.com> | 2013-08-21 22:57:23 -0400 |
commit | 30ed376d96bce711aaede66144260bebd0af9b96 (patch) | |
tree | 944e061af5c02101bab4574cd508591247e776cb | |
parent | 38e2c7b67d358942eb5e2ced247f581945175fc9 (diff) | |
download | gss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.tar.gz gss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.tar.xz gss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.zip |
Add gss_display_name implementation
-rw-r--r-- | src/gss_names.c | 69 | ||||
-rw-r--r-- | src/gss_ntlmssp.h | 5 | ||||
-rw-r--r-- | src/gss_spi.c | 11 |
3 files changed, 85 insertions, 0 deletions
diff --git a/src/gss_names.c b/src/gss_names.c index 7ccc3a0..a881851 100644 --- a/src/gss_names.c +++ b/src/gss_names.c @@ -15,6 +15,8 @@ License along with this library; if not, see <http://www.gnu.org/licenses/>. */ +#define _GNU_SOURCE + #include <errno.h> #include <limits.h> #include <pwd.h> @@ -353,3 +355,70 @@ uint32_t gssntlm_release_name(uint32_t *minor_status, *input_name = GSS_C_NO_NAME; return GSS_S_COMPLETE; } + +uint32_t gssntlm_display_name(uint32_t *minor_status, + gss_name_t input_name, + gss_buffer_t output_name_buffer, + gss_OID *output_name_type) +{ + struct gssntlm_name *in; + gss_buffer_t out; + int ret; + + *minor_status = 0; + + if (input_name == GSS_C_NO_NAME || output_name_buffer == NULL) { + return GSS_S_CALL_INACCESSIBLE_READ; + } + + in = (struct gssntlm_name *)input_name; + out = output_name_buffer; + + switch (in->type) { + case GSSNTLM_NAME_NULL: + return GSS_S_BAD_NAME; + case GSSNTLM_NAME_ANON: + out->value = strdup("NT AUTHORITY\\ANONYMOUS LOGON"); + if (!out->value) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + out->length = strlen(out->value) + 1; + if (output_name_type) { + *output_name_type = GSS_C_NT_ANONYMOUS; + } + break; + case GSSNTLM_NAME_USER: + if (in->data.user.domain) { + ret = asprintf((char **)&out->value, "%s\\%s", + in->data.user.domain, in->data.user.name); + if (ret == -1) { + out->value = NULL; + } + } else { + out->value = strdup(in->data.user.name); + } + if (!out->value) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + out->length = strlen(out->value) + 1; + if (output_name_type) { + *output_name_type = GSS_C_NT_USER_NAME; + } + break; + case GSSNTLM_NAME_SERVER: + out->value = strdup(in->data.server.name); + if (!out->value) { + *minor_status = ENOMEM; + return GSS_S_FAILURE; + } + out->length = strlen(out->value) + 1; + if (output_name_type) { + *output_name_type = GSS_C_NT_HOSTBASED_SERVICE; + } + break; + } + + return GSS_S_COMPLETE; +} diff --git a/src/gss_ntlmssp.h b/src/gss_ntlmssp.h index de56bad..190fd13 100644 --- a/src/gss_ntlmssp.h +++ b/src/gss_ntlmssp.h @@ -283,4 +283,9 @@ uint32_t gssntlm_inquire_context(uint32_t *minor_status, uint32_t *ctx_flags, int *locally_initiated, int *open); + +uint32_t gssntlm_display_name(uint32_t *minor_status, + gss_name_t input_name, + gss_buffer_t output_name_buffer, + gss_OID *output_name_type); #endif /* _GSS_NTLMSSP_H_ */ diff --git a/src/gss_spi.c b/src/gss_spi.c index d456f14..9f640a8 100644 --- a/src/gss_spi.c +++ b/src/gss_spi.c @@ -253,3 +253,14 @@ OM_uint32 gss_inquire_context(OM_uint32 *minor_status, locally_initiated, open); } + +OM_uint32 gss_display_name(OM_uint32 *minor_status, + gss_name_t input_name, + gss_buffer_t output_name_buffer, + gss_OID *output_name_type) +{ + return gssntlm_display_name(minor_status, + input_name, + output_name_buffer, + output_name_type); +} |