pam_get_user.c revision 141098
191094Sdes/*- 2115619Sdes * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 391094Sdes * All rights reserved. 491094Sdes * 591094Sdes * This software was developed for the FreeBSD Project by ThinkSec AS and 699158Sdes * Network Associates Laboratories, the Security Research Division of 799158Sdes * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 899158Sdes * ("CBOSS"), as part of the DARPA CHATS research program. 991094Sdes * 1091094Sdes * Redistribution and use in source and binary forms, with or without 1191094Sdes * modification, are permitted provided that the following conditions 1291094Sdes * are met: 1391094Sdes * 1. Redistributions of source code must retain the above copyright 1491094Sdes * notice, this list of conditions and the following disclaimer. 1591094Sdes * 2. Redistributions in binary form must reproduce the above copyright 1691094Sdes * notice, this list of conditions and the following disclaimer in the 1791094Sdes * documentation and/or other materials provided with the distribution. 1891094Sdes * 3. The name of the author may not be used to endorse or promote 1991094Sdes * products derived from this software without specific prior written 2091094Sdes * permission. 2191094Sdes * 2291094Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2391094Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2491094Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2591094Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2691094Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2791094Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2891094Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2991094Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3091094Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3191094Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3291094Sdes * SUCH DAMAGE. 3391094Sdes * 34141098Sdes * $P4: //depot/projects/openpam/lib/pam_get_user.c#20 $ 3591094Sdes */ 3691094Sdes 3791094Sdes#include <sys/param.h> 3891094Sdes 3993982Sdes#include <stdlib.h> 4093982Sdes 4191094Sdes#include <security/pam_appl.h> 4291094Sdes#include <security/openpam.h> 4391094Sdes 4491094Sdes#include "openpam_impl.h" 4591094Sdes 46117610Sdesstatic const char user_prompt[] = "Login:"; 4793982Sdes 4891094Sdes/* 4991094Sdes * XSSO 4.2.1 5091094Sdes * XSSO 6 page 52 5191094Sdes * 5291094Sdes * Retrieve user name 5391094Sdes */ 5491094Sdes 5591094Sdesint 5691094Sdespam_get_user(pam_handle_t *pamh, 5791094Sdes const char **user, 5891094Sdes const char *prompt) 5991094Sdes{ 60125647Sdes const void *promptp; 6193982Sdes char *resp; 6291094Sdes int r; 6391094Sdes 64107937Sdes ENTER(); 6591094Sdes if (pamh == NULL || user == NULL) 66107937Sdes RETURNC(PAM_SYSTEM_ERR); 6791094Sdes r = pam_get_item(pamh, PAM_USER, (const void **)user); 68117610Sdes if (r == PAM_SUCCESS && *user != NULL) 69107937Sdes RETURNC(PAM_SUCCESS); 7091094Sdes if (prompt == NULL) { 71125647Sdes r = pam_get_item(pamh, PAM_USER_PROMPT, &promptp); 72125647Sdes if (r != PAM_SUCCESS || promptp == NULL) 7393982Sdes prompt = user_prompt; 74125647Sdes else 75125647Sdes prompt = promptp; 7691094Sdes } 7793982Sdes r = pam_prompt(pamh, PAM_PROMPT_ECHO_ON, &resp, "%s", prompt); 7891094Sdes if (r != PAM_SUCCESS) 79107937Sdes RETURNC(r); 8093982Sdes r = pam_set_item(pamh, PAM_USER, resp); 81115619Sdes FREE(resp); 8293982Sdes if (r != PAM_SUCCESS) 83107937Sdes RETURNC(r); 84110556Sdes r = pam_get_item(pamh, PAM_USER, (const void **)user); 85110556Sdes RETURNC(r); 8691094Sdes} 8791100Sdes 8891100Sdes/* 8991100Sdes * Error codes: 9091100Sdes * 9191100Sdes * =pam_get_item 9291100Sdes * =pam_prompt 9391100Sdes * =pam_set_item 9491100Sdes * !PAM_SYMBOL_ERR 9591100Sdes */ 9693982Sdes 9793982Sdes/** 9893982Sdes * The =pam_get_user function returns the name of the target user, as 99141098Sdes * specified to =pam_start. 100141098Sdes * If no user was specified, nor set using =pam_set_item, =pam_get_user 101141098Sdes * will prompt for a user name. 102141098Sdes * Either way, a pointer to the user name is stored in the location 103141098Sdes * pointed to by the =user argument. 104141098Sdes * 10593982Sdes * The =prompt argument specifies a prompt to use if no user name is 106141098Sdes * cached. 107141098Sdes * If it is =NULL, the =PAM_USER_PROMPT will be used. 108141098Sdes * If that item is also =NULL, a hardcoded default prompt will be used. 10993982Sdes * 11093982Sdes * >pam_get_item 11193982Sdes * >pam_get_authtok 11293982Sdes */ 113