xref: /netbsd-src/crypto/external/bsd/heimdal/dist/lib/gssapi/ntlm/import_name.c (revision d3273b5b76f5afaafe308cead5511dbb8df8c5e9)
1 /*	$NetBSD: import_name.c,v 1.2 2017/01/28 21:31:46 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1997 - 2003 Kungliga Tekniska Högskolan
5  * (Royal Institute of Technology, Stockholm, Sweden).
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the Institute nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include "ntlm.h"
37 
38 OM_uint32 GSSAPI_CALLCONV
_gss_ntlm_import_name(OM_uint32 * minor_status,const gss_buffer_t input_name_buffer,const gss_OID input_name_type,gss_name_t * output_name)39 _gss_ntlm_import_name
40            (OM_uint32 * minor_status,
41             const gss_buffer_t input_name_buffer,
42             const gss_OID input_name_type,
43             gss_name_t * output_name
44            )
45 {
46     char *name, *p, *p2;
47     int is_hostnamed;
48     int is_username;
49     ntlm_name n;
50 
51     *minor_status = 0;
52 
53     if (output_name == NULL)
54 	return GSS_S_CALL_INACCESSIBLE_WRITE;
55 
56     *output_name = GSS_C_NO_NAME;
57 
58     is_hostnamed = gss_oid_equal(input_name_type, GSS_C_NT_HOSTBASED_SERVICE);
59     is_username = gss_oid_equal(input_name_type, GSS_C_NT_USER_NAME);
60 
61     if (!is_hostnamed && !is_username)
62 	return GSS_S_BAD_NAMETYPE;
63 
64     name = malloc(input_name_buffer->length + 1);
65     if (name == NULL) {
66 	*minor_status = ENOMEM;
67 	return GSS_S_FAILURE;
68     }
69     memcpy(name, input_name_buffer->value, input_name_buffer->length);
70     name[input_name_buffer->length] = '\0';
71 
72     /* find "domain" part of the name and uppercase it */
73     p = strchr(name, '@');
74     if (p == NULL) {
75         free(name);
76 	return GSS_S_BAD_NAME;
77     }
78     p[0] = '\0';
79     p++;
80     p2 = strchr(p, '.');
81     if (p2 && p2[1] != '\0') {
82 	if (is_hostnamed) {
83 	    p = p2 + 1;
84 	    p2 = strchr(p, '.');
85 	}
86 	if (p2)
87 	    *p2 = '\0';
88     }
89     strupr(p);
90 
91     n = calloc(1, sizeof(*n));
92     if (n == NULL) {
93 	free(name);
94 	*minor_status = ENOMEM;
95 	return GSS_S_FAILURE;
96     }
97 
98     n->user = strdup(name);
99     n->domain = strdup(p);
100 
101     free(name);
102 
103     if (n->user == NULL || n->domain == NULL) {
104 	free(n->user);
105 	free(n->domain);
106 	free(n);
107 	*minor_status = ENOMEM;
108 	return GSS_S_FAILURE;
109     }
110 
111     *output_name = (gss_name_t)n;
112 
113     return GSS_S_COMPLETE;
114 }
115