summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2013-08-21 22:35:17 -0400
committerSimo Sorce <simo@redhat.com>2013-08-21 22:57:23 -0400
commit30ed376d96bce711aaede66144260bebd0af9b96 (patch)
tree944e061af5c02101bab4574cd508591247e776cb
parent38e2c7b67d358942eb5e2ced247f581945175fc9 (diff)
downloadgss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.tar.gz
gss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.tar.xz
gss-ntlmssp-30ed376d96bce711aaede66144260bebd0af9b96.zip
Add gss_display_name implementation
-rw-r--r--src/gss_names.c69
-rw-r--r--src/gss_ntlmssp.h5
-rw-r--r--src/gss_spi.c11
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);
+}