pam_vprompt.c revision 255376
191094Sdes/*- 2115619Sdes * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 3228690Sdes * Copyright (c) 2004-2011 Dag-Erling Sm��rgrav 491094Sdes * All rights reserved. 591094Sdes * 691094Sdes * This software was developed for the FreeBSD Project by ThinkSec AS and 799158Sdes * Network Associates Laboratories, the Security Research Division of 899158Sdes * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 999158Sdes * ("CBOSS"), as part of the DARPA CHATS research program. 1091094Sdes * 1191094Sdes * Redistribution and use in source and binary forms, with or without 1291094Sdes * modification, are permitted provided that the following conditions 1391094Sdes * are met: 1491094Sdes * 1. Redistributions of source code must retain the above copyright 1591094Sdes * notice, this list of conditions and the following disclaimer. 1691094Sdes * 2. Redistributions in binary form must reproduce the above copyright 1791094Sdes * notice, this list of conditions and the following disclaimer in the 1891094Sdes * documentation and/or other materials provided with the distribution. 1991094Sdes * 3. The name of the author may not be used to endorse or promote 2091094Sdes * products derived from this software without specific prior written 2191094Sdes * permission. 2291094Sdes * 2391094Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 2491094Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2591094Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2691094Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2791094Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2891094Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2991094Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3091094Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 3191094Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3291094Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3391094Sdes * SUCH DAMAGE. 3491094Sdes * 35255376Sdes * $Id: pam_vprompt.c 648 2013-03-05 17:54:27Z des $ 3691094Sdes */ 3791094Sdes 38228690Sdes#ifdef HAVE_CONFIG_H 39228690Sdes# include "config.h" 40228690Sdes#endif 41228690Sdes 4291094Sdes#include <stdarg.h> 4391094Sdes#include <stdio.h> 4491094Sdes#include <stdlib.h> 4591094Sdes 4691094Sdes#include <security/pam_appl.h> 4791094Sdes 48107937Sdes#include "openpam_impl.h" 49107937Sdes 5091094Sdes/* 5191094Sdes * OpenPAM extension 5291094Sdes * 5391094Sdes * Call the conversation function 5491094Sdes */ 5591094Sdes 5691094Sdesint 57174832Sdespam_vprompt(const pam_handle_t *pamh, 5891094Sdes int style, 5991094Sdes char **resp, 6091094Sdes const char *fmt, 6191094Sdes va_list ap) 6291094Sdes{ 6391094Sdes char msgbuf[PAM_MAX_MSG_SIZE]; 6491094Sdes struct pam_message msg; 6591094Sdes const struct pam_message *msgp; 6691094Sdes struct pam_response *rsp; 67125647Sdes const struct pam_conv *conv; 68125647Sdes const void *convp; 6991094Sdes int r; 7091094Sdes 71107937Sdes ENTER(); 72125647Sdes r = pam_get_item(pamh, PAM_CONV, &convp); 7391097Sdes if (r != PAM_SUCCESS) 74107937Sdes RETURNC(r); 75125647Sdes conv = convp; 76110989Sdes if (conv == NULL || conv->conv == NULL) { 7791097Sdes openpam_log(PAM_LOG_ERROR, "no conversation function"); 78107937Sdes RETURNC(PAM_SYSTEM_ERR); 7991097Sdes } 8091094Sdes vsnprintf(msgbuf, PAM_MAX_MSG_SIZE, fmt, ap); 8191094Sdes msg.msg_style = style; 8291094Sdes msg.msg = msgbuf; 8391094Sdes msgp = &msg; 8494968Sdes rsp = NULL; 8591097Sdes r = (conv->conv)(1, &msgp, &rsp, conv->appdata_ptr); 8691094Sdes *resp = rsp == NULL ? NULL : rsp->resp; 87115619Sdes FREE(rsp); 88107937Sdes RETURNC(r); 8991094Sdes} 9091100Sdes 9191100Sdes/* 9291100Sdes * Error codes: 9391100Sdes * 9491100Sdes * !PAM_SYMBOL_ERR 9591100Sdes * PAM_SYSTEM_ERR 9691100Sdes * PAM_BUF_ERR 9791100Sdes * PAM_CONV_ERR 9891100Sdes */ 9991100Sdes 10091100Sdes/** 10191100Sdes * The =pam_vprompt function constructs a string from the =fmt and =ap 10291100Sdes * arguments using =vsnprintf, and passes it to the given PAM context's 10391100Sdes * conversation function. 10491100Sdes * 10591100Sdes * The =style argument specifies the type of interaction requested, and 10691100Sdes * must be one of the following: 10791100Sdes * 10891100Sdes * =PAM_PROMPT_ECHO_OFF: 10991100Sdes * Display the message and obtain the user's response without 11091100Sdes * displaying it. 11191100Sdes * =PAM_PROMPT_ECHO_ON: 11291100Sdes * Display the message and obtain the user's response. 11391100Sdes * =PAM_ERROR_MSG: 11491100Sdes * Display the message as an error message, and do not wait 11591100Sdes * for a response. 11691100Sdes * =PAM_TEXT_INFO: 11791100Sdes * Display the message as an informational message, and do 11891100Sdes * not wait for a response. 11991100Sdes * 12091100Sdes * A pointer to the response, or =NULL if the conversation function did 12191100Sdes * not return one, is stored in the location pointed to by the =resp 12291100Sdes * argument. 12391100Sdes * 12491100Sdes * The message and response should not exceed =PAM_MAX_MSG_SIZE or 12591100Sdes * =PAM_MAX_RESP_SIZE, respectively. 12691100Sdes * If they do, they may be truncated. 12791100Sdes * 12891100Sdes * >pam_error 12991100Sdes * >pam_info 13091100Sdes * >pam_prompt 13191100Sdes * >pam_verror 13291100Sdes * >pam_vinfo 13391100Sdes */ 134