1 /* 2 * Copyright (c) 2011, PADL Software Pty Ltd. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 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 * 3. Neither the name of PADL Software nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include "gsskrb5_locl.h" 34 35 OM_uint32 GSSAPI_CALLCONV 36 _gsskrb5_pname_to_uid(OM_uint32 *minor_status, 37 const gss_name_t pname, 38 const gss_OID mech_type, 39 uid_t *uidp) 40 { 41 #ifdef NO_LOCALNAME 42 *minor_status = KRB5_NO_LOCALNAME; 43 return GSS_S_FAILURE; 44 #else 45 krb5_error_code ret; 46 krb5_context context; 47 krb5_const_principal princ = (krb5_const_principal)pname; 48 char localname[256]; 49 #ifdef POSIX_GETPWNAM_R 50 char pwbuf[2048]; 51 struct passwd pw, *pwd; 52 #else 53 struct passwd *pwd; 54 #endif 55 56 GSSAPI_KRB5_INIT(&context); 57 58 *minor_status = 0; 59 60 ret = krb5_aname_to_localname(context, princ, 61 sizeof(localname), localname); 62 if (ret != 0) { 63 *minor_status = ret; 64 return GSS_S_FAILURE; 65 } 66 67 #ifdef POSIX_GETPWNAM_R 68 if (getpwnam_r(localname, &pw, pwbuf, sizeof(pwbuf), &pwd) != 0) { 69 *minor_status = KRB5_NO_LOCALNAME; 70 return GSS_S_FAILURE; 71 } 72 #else 73 pwd = getpwnam(localname); 74 #endif 75 76 if (pwd == NULL) { 77 *minor_status = KRB5_NO_LOCALNAME; 78 return GSS_S_FAILURE; 79 } 80 81 *uidp = pwd->pw_uid; 82 83 return GSS_S_COMPLETE; 84 #endif /* NO_LOCALNAME */ 85 } 86