handle username part of the ntlm name

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@22373 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Love Hörnquist Åstrand
2007-12-28 18:36:06 +00:00
parent 7e14fe4f56
commit 66f8605e07
6 changed files with 61 additions and 9 deletions

View File

@@ -189,12 +189,29 @@ _gss_ntlm_accept_sec_context
ctx->ictx,
&type3,
&session);
heim_ntlm_free_type3(&type3);
if (maj_stat) {
heim_ntlm_free_type3(&type3);
_gss_ntlm_delete_sec_context(minor_status, context_handle, NULL);
return maj_stat;
}
if (src_name) {
ntlm_name n = calloc(1, sizeof(*n));
if (n) {
n->user = strdup(type3.username);
n->domain = strdup(type3.targetname);
}
if (n == NULL || n->user == NULL || n->domain == NULL) {
heim_ntlm_free_type3(&type3);
_gss_ntlm_delete_sec_context(minor_status,
context_handle, NULL);
return maj_stat;
}
*src_name = (gss_name_t)n;
}
heim_ntlm_free_type3(&type3);
ret = krb5_data_copy(&ctx->sessionkey,
session.data, session.length);
if (ret) {

View File

@@ -80,15 +80,14 @@ OM_uint32 _gss_ntlm_acquire_cred
}
}
if (cred_usage == GSS_C_BOTH || cred_usage == GSS_C_INITIATE) {
gss_cred_id_t gcred;
ntlm_cred cred;
*min_stat = _gss_ntlm_get_user_cred(name->domain, &cred);
if (*min_stat)
return GSS_S_FAILURE;
cred->usage = cred_usage;
gcred = (gss_cred_id_t)cred;
_gss_ntlm_release_cred(NULL, &gcred);
*output_cred_handle = (gss_cred_id_t)cred;
}
return (GSS_S_COMPLETE);

View File

@@ -43,11 +43,30 @@ OM_uint32 _gss_ntlm_display_name
)
{
*minor_status = 0;
if (output_name_type)
*output_name_type = GSS_NTLM_MECHANISM;
if (output_name_buffer) {
ntlm_name n = (ntlm_name)input_name;
char *str;
int len;
output_name_buffer->length = 0;
output_name_buffer->value = NULL;
if (n == NULL) {
*minor_status = 0;
return GSS_S_BAD_NAME;
}
len = asprintf(&str, "%s@%s", n->user, n->domain);
if (str == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
output_name_buffer->length = len;
output_name_buffer->value = str;
}
return GSS_S_COMPLETE;
}

View File

@@ -65,6 +65,7 @@ OM_uint32 _gss_ntlm_import_name
p = strchr(name, '@');
if (p == NULL)
return GSS_S_BAD_NAME;
p[0] = '\0';
p++;
p2 = strchr(p, '.');
if (p2 && p2[1] != '\0') {
@@ -75,15 +76,26 @@ OM_uint32 _gss_ntlm_import_name
}
strupr(p);
n = malloc(sizeof(n) + strlen(p));
if (n == NULL) {
n = calloc(1, sizeof(*n));
if (name == NULL) {
free(name);
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
strcpy(n->domain, p);
n->user = strdup(name);
n->domain = strdup(p);
free(name);
if (n->user == NULL || n->domain == NULL) {
free(n->user);
free(n->domain);
free(n);
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
*output_name = (gss_name_t)n;
return GSS_S_COMPLETE;

View File

@@ -97,6 +97,7 @@ struct ntlmv2_key {
extern struct ntlm_server_interface ntlmsspi_kdc_digest;
typedef struct ntlm_cred {
gss_cred_usage_t usage;
char *username;
char *domain;
struct ntlm_buf key;
@@ -128,7 +129,8 @@ typedef struct {
} *ntlm_ctx;
typedef struct {
char domain[1];
char *user;
char *domain;
} *ntlm_name;
#include <ntlm/ntlm-private.h>

View File

@@ -43,8 +43,11 @@ OM_uint32 _gss_ntlm_release_name
if (minor_status)
*minor_status = 0;
if (input_name) {
free(*input_name);
ntlm_name n = (ntlm_name)*input_name;
*input_name = GSS_C_NO_NAME;
free(n->user);
free(n->domain);
free(n);
}
return GSS_S_COMPLETE;
}