1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*
* imp_name.c --- import_name
*
* $Source$
* $Author$
* $Header$
*
* Copyright 1991 by the Massachusetts Institute of Technology.
* All Rights Reserved.
*
* For copying and distribution information, please see the file
* <krb5/copyright.h>.
*
*/
#include <gssapi.h>
OM_uint32 gss_service_import_name();
OM_uint32 gss_import_name(minor_status, input_name_buffer, input_name_type,
output_name)
OM_uint32 *minor_status;
gss_buffer_t input_name_buffer;
gss_OID input_name_type;
gss_name_t *output_name;
{
*minor_status = 0;
if ((input_name_type == GSS_C_NULL_OID) ||
gss_compare_OID(input_name_type, &gss_OID_krb5)) {
/*
* Kerberos V5 name
*/
if (!strncasecmp("service:", input_name_buffer->value, 8) &&
input_name_buffer->length >= 8) {
return(gss_service_import_name(minor_status,
input_name_buffer,
output_name));
}
if (*minor_status = krb5_parse_name(input_name_buffer->value,
output_name))
return(gss_make_re(GSS_RE_FAILURE));
else
return(GSS_S_COMPLETE);
}
/*
* It's of an unknown type. We don't know how to deal.
*/
return(gss_make_re(GSS_RE_BAD_NAMETYPE));
}
OM_uint32 gss_service_import_name(minor_status, input_name_buffer, output_name)
OM_uint32 *minor_status;
gss_buffer_t input_name_buffer;
gss_name_t *output_name;
{
char *str, *cp;
char *service, *kservice;
char *host;
char buf[512];
if (!(str = malloc(input_name_buffer->length+1))) {
*minor_status = ENOMEM;
return(gss_make_re(GSS_RE_FAILURE));
}
memcpy(str, input_name_buffer->value, input_name_buffer->length);
str[input_name_buffer->length] = '\0';
/*
* Assume the first eight characters are "service:"
*/
service = cp = str + 8;
if (!(cp = index(cp, '@'))) {
free(str);
return(gss_make_re(GSS_RE_BAD_NAME));
}
*cp++ = 0;
host = cp;
/*
* We will need to do some mapping here later... XXX
*/
kservice = service;
sprintf(buf, "%s/%s", kservice, host);
if (*minor_status = krb5_parse_name(buf, output_name))
return(gss_make_re(GSS_RE_FAILURE));
else
return(GSS_S_COMPLETE);
}
|