dcerpc-gssapi: add function to retrieve client name
authorSimo Sorce <idra@samba.org>
Wed, 25 Aug 2010 20:21:51 +0000 (16:21 -0400)
committerGünther Deschner <gd@samba.org>
Mon, 30 Aug 2010 12:34:01 +0000 (14:34 +0200)
Signed-off-by: Günther Deschner <gd@samba.org>
source3/librpc/rpc/dcerpc_gssapi.c
source3/librpc/rpc/dcerpc_gssapi.h

index 03c6ae963f269018b9cb7974797accb91d574d0e..af94b66780d6011ff363ee0506d251005c6b83d6 100644 (file)
@@ -629,6 +629,43 @@ DATA_BLOB gse_get_session_key(TALLOC_CTX *mem_ctx,
        return ret;
 }
 
+NTSTATUS gse_get_client_name(struct gse_context *gse_ctx,
+                            TALLOC_CTX *mem_ctx, char **cli_name)
+{
+       OM_uint32 gss_min, gss_maj;
+       gss_buffer_desc name_buffer;
+
+       if (!gse_ctx->authenticated) {
+               return NT_STATUS_ACCESS_DENIED;
+       }
+
+       if (!gse_ctx->client_name) {
+               return NT_STATUS_NOT_FOUND;
+       }
+
+       /* TODO: check OID matches KRB5 Principal Name OID ? */
+
+       gss_maj = gss_display_name(&gss_min,
+                                  gse_ctx->client_name,
+                                  &name_buffer, NULL);
+       if (gss_maj) {
+               DEBUG(0, ("gss_display_name failed [%s]\n",
+                         gse_errstr(talloc_tos(), gss_maj, gss_min)));
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       *cli_name = talloc_strndup(talloc_tos(),
+                                       (char *)name_buffer.value,
+                                       name_buffer.length);
+
+       gss_maj = gss_release_buffer(&gss_min, &name_buffer);
+
+       if (!*cli_name) {
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       return NT_STATUS_OK;
+}
 
 NTSTATUS gse_get_authz_data(struct gse_context *gse_ctx,
                            TALLOC_CTX *mem_ctx, DATA_BLOB *pac)
@@ -947,6 +984,11 @@ DATA_BLOB gse_get_session_key(TALLOC_CTX *mem_ctx,
        return data_blob_null;
 }
 
+NTSTATUS gse_get_client_name(struct gse_context *gse_ctx,
+                            TALLOC_CTX *mem_ctx, char **client_name)
+{
+       return NT_STATUS_NOT_IMPLEMENTED;
+}
 
 NTSTATUS gse_get_authz_data(struct gse_context *gse_ctx,
                            TALLOC_CTX *mem_ctx, DATA_BLOB *pac)
index 4da4af7f627c1ad84df398b36541b8c6b6702c11..0ffed2c457155609dc5672e71f7366a51308ad4f 100644 (file)
@@ -57,6 +57,8 @@ NTSTATUS gse_verify_server_auth_flags(struct gse_context *gse_ctx);
 bool gse_require_more_processing(struct gse_context *gse_ctx);
 DATA_BLOB gse_get_session_key(TALLOC_CTX *mem_ctx,
                                struct gse_context *gse_ctx);
+NTSTATUS gse_get_client_name(struct gse_context *gse_ctx,
+                            TALLOC_CTX *mem_ctx, char **client_name);
 NTSTATUS gse_get_authz_data(struct gse_context *gse_ctx,
                            TALLOC_CTX *mem_ctx, DATA_BLOB *pac);
 NTSTATUS gse_get_authtime(struct gse_context *gse_ctx, time_t *authtime);