Line data Source code
1 : /*-
2 : * Copyright (c) 2005 Doug Rabson
3 : * All rights reserved.
4 : *
5 : * Portions Copyright (c) 2009 Apple Inc. All rights reserved.
6 : *
7 : * Redistribution and use in source and binary forms, with or without
8 : * modification, are permitted provided that the following conditions
9 : * are met:
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : * 2. Redistributions in binary form must reproduce the above copyright
13 : * notice, this list of conditions and the following disclaimer in the
14 : * documentation and/or other materials provided with the distribution.
15 : *
16 : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 : * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 : * SUCH DAMAGE.
27 : *
28 : * $FreeBSD: src/lib/libgssapi/gss_canonicalize_name.c,v 1.1 2005/12/29 14:40:20 dfr Exp $
29 : */
30 :
31 : #include "mech_locl.h"
32 :
33 : /**
34 : * gss_canonicalize_name takes a Internal Name (IN) and converts in into a
35 : * mechanism specific Mechanism Name (MN).
36 : *
37 : * The input name may multiple name, or generic name types.
38 : *
39 : * If the input_name if of the GSS_C_NT_USER_NAME, and the Kerberos
40 : * mechanism is specified, the resulting MN type is a
41 : * GSS_KRB5_NT_PRINCIPAL_NAME.
42 : *
43 : * For more information about @ref internalVSmechname.
44 : *
45 : * @param minor_status minor status code.
46 : * @param input_name name to covert, unchanged by gss_canonicalize_name().
47 : * @param mech_type the type to convert Name too.
48 : * @param output_name the resulting type, release with
49 : * gss_release_name(), independent of input_name.
50 : *
51 : * @returns a gss_error code, see gss_display_status() about printing
52 : * the error code.
53 : *
54 : * @ingroup gssapi
55 : */
56 :
57 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
58 0 : gss_canonicalize_name(OM_uint32 *minor_status,
59 : gss_const_name_t input_name,
60 : const gss_OID mech_type,
61 : gss_name_t *output_name)
62 : {
63 : OM_uint32 major_status;
64 0 : struct _gss_name *name = (struct _gss_name *) input_name;
65 : struct _gss_mechanism_name *mn;
66 : gssapi_mech_interface m;
67 : gss_name_t new_canonical_name;
68 :
69 0 : *minor_status = 0;
70 0 : *output_name = GSS_C_NO_NAME;
71 :
72 0 : if ((m = __gss_get_mechanism(mech_type)) == NULL ||
73 0 : (m->gm_flags & GM_USE_MG_NAME))
74 0 : return GSS_S_BAD_MECH;
75 :
76 0 : major_status = _gss_find_mn(minor_status, name, mech_type, &mn);
77 0 : if (major_status)
78 0 : return major_status;
79 0 : if (mn == NULL)
80 0 : return GSS_S_BAD_NAME;
81 :
82 0 : m = mn->gmn_mech;
83 0 : major_status = m->gm_canonicalize_name(minor_status,
84 0 : mn->gmn_name, mech_type, &new_canonical_name);
85 0 : if (major_status) {
86 0 : _gss_mg_error(m, *minor_status);
87 0 : return (major_status);
88 : }
89 :
90 : /*
91 : * Now we make a new name and mark it as an MN.
92 : */
93 0 : *minor_status = 0;
94 0 : name = _gss_create_name(new_canonical_name, m);
95 0 : if (!name) {
96 0 : m->gm_release_name(minor_status, &new_canonical_name);
97 0 : *minor_status = ENOMEM;
98 0 : return (GSS_S_FAILURE);
99 : }
100 :
101 0 : *output_name = (gss_name_t) name;
102 :
103 0 : return (GSS_S_COMPLETE);
104 : }
|