1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright (c) 1992-1995, by Sun Microsystems, Inc. 24*7c478bd9Sstevel@tonic-gate * All rights reserved. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 28*7c478bd9Sstevel@tonic-gate 29*7c478bd9Sstevel@tonic-gate #include <security/pam_appl.h> 30*7c478bd9Sstevel@tonic-gate #include <string.h> 31*7c478bd9Sstevel@tonic-gate #include <stdlib.h> 32*7c478bd9Sstevel@tonic-gate #include <malloc.h> 33*7c478bd9Sstevel@tonic-gate 34*7c478bd9Sstevel@tonic-gate #include "sample_utils.h" 35*7c478bd9Sstevel@tonic-gate 36*7c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 37*7c478bd9Sstevel@tonic-gate /* */ 38*7c478bd9Sstevel@tonic-gate /* Utilities Functions */ 39*7c478bd9Sstevel@tonic-gate /* */ 40*7c478bd9Sstevel@tonic-gate /* ******************************************************************** */ 41*7c478bd9Sstevel@tonic-gate 42*7c478bd9Sstevel@tonic-gate /* 43*7c478bd9Sstevel@tonic-gate * __free_msg(): 44*7c478bd9Sstevel@tonic-gate * free storage for messages used in the call back "pam_conv" functions 45*7c478bd9Sstevel@tonic-gate */ 46*7c478bd9Sstevel@tonic-gate 47*7c478bd9Sstevel@tonic-gate void 48*7c478bd9Sstevel@tonic-gate __free_msg(num_msg, msg) 49*7c478bd9Sstevel@tonic-gate int num_msg; 50*7c478bd9Sstevel@tonic-gate struct pam_message *msg; 51*7c478bd9Sstevel@tonic-gate { 52*7c478bd9Sstevel@tonic-gate int i; 53*7c478bd9Sstevel@tonic-gate struct pam_message *m; 54*7c478bd9Sstevel@tonic-gate 55*7c478bd9Sstevel@tonic-gate if (msg) { 56*7c478bd9Sstevel@tonic-gate m = msg; 57*7c478bd9Sstevel@tonic-gate for (i = 0; i < num_msg; i++, m++) { 58*7c478bd9Sstevel@tonic-gate if (m->msg) 59*7c478bd9Sstevel@tonic-gate free(m->msg); 60*7c478bd9Sstevel@tonic-gate } 61*7c478bd9Sstevel@tonic-gate free(msg); 62*7c478bd9Sstevel@tonic-gate } 63*7c478bd9Sstevel@tonic-gate } 64*7c478bd9Sstevel@tonic-gate 65*7c478bd9Sstevel@tonic-gate /* 66*7c478bd9Sstevel@tonic-gate * __free_resp(): 67*7c478bd9Sstevel@tonic-gate * free storage for responses used in the call back "pam_conv" functions 68*7c478bd9Sstevel@tonic-gate */ 69*7c478bd9Sstevel@tonic-gate 70*7c478bd9Sstevel@tonic-gate void 71*7c478bd9Sstevel@tonic-gate __free_resp(num_msg, resp) 72*7c478bd9Sstevel@tonic-gate int num_msg; 73*7c478bd9Sstevel@tonic-gate struct pam_response *resp; 74*7c478bd9Sstevel@tonic-gate { 75*7c478bd9Sstevel@tonic-gate int i; 76*7c478bd9Sstevel@tonic-gate struct pam_response *r; 77*7c478bd9Sstevel@tonic-gate 78*7c478bd9Sstevel@tonic-gate if (resp) { 79*7c478bd9Sstevel@tonic-gate r = resp; 80*7c478bd9Sstevel@tonic-gate for (i = 0; i < num_msg; i++, r++) { 81*7c478bd9Sstevel@tonic-gate if (r->resp) 82*7c478bd9Sstevel@tonic-gate free(r->resp); 83*7c478bd9Sstevel@tonic-gate } 84*7c478bd9Sstevel@tonic-gate free(resp); 85*7c478bd9Sstevel@tonic-gate } 86*7c478bd9Sstevel@tonic-gate } 87*7c478bd9Sstevel@tonic-gate 88*7c478bd9Sstevel@tonic-gate /* 89*7c478bd9Sstevel@tonic-gate * __display_errmsg(): 90*7c478bd9Sstevel@tonic-gate * display error message by calling the call back functions 91*7c478bd9Sstevel@tonic-gate * provided by the application through "pam_conv" structure 92*7c478bd9Sstevel@tonic-gate */ 93*7c478bd9Sstevel@tonic-gate 94*7c478bd9Sstevel@tonic-gate int 95*7c478bd9Sstevel@tonic-gate __display_errmsg(conv_funp, num_msg, messages, conv_apdp) 96*7c478bd9Sstevel@tonic-gate int (*conv_funp)(); 97*7c478bd9Sstevel@tonic-gate int num_msg; 98*7c478bd9Sstevel@tonic-gate char messages[PAM_MAX_NUM_MSG][PAM_MAX_MSG_SIZE]; 99*7c478bd9Sstevel@tonic-gate void *conv_apdp; 100*7c478bd9Sstevel@tonic-gate { 101*7c478bd9Sstevel@tonic-gate struct pam_message *msg; 102*7c478bd9Sstevel@tonic-gate struct pam_message *m; 103*7c478bd9Sstevel@tonic-gate struct pam_response *resp; 104*7c478bd9Sstevel@tonic-gate int i; 105*7c478bd9Sstevel@tonic-gate int k; 106*7c478bd9Sstevel@tonic-gate int retcode; 107*7c478bd9Sstevel@tonic-gate 108*7c478bd9Sstevel@tonic-gate msg = (struct pam_message *)calloc(num_msg, 109*7c478bd9Sstevel@tonic-gate sizeof (struct pam_message)); 110*7c478bd9Sstevel@tonic-gate if (msg == NULL) { 111*7c478bd9Sstevel@tonic-gate return (PAM_CONV_ERR); 112*7c478bd9Sstevel@tonic-gate } 113*7c478bd9Sstevel@tonic-gate m = msg; 114*7c478bd9Sstevel@tonic-gate 115*7c478bd9Sstevel@tonic-gate i = 0; 116*7c478bd9Sstevel@tonic-gate k = num_msg; 117*7c478bd9Sstevel@tonic-gate resp = NULL; 118*7c478bd9Sstevel@tonic-gate while (k--) { 119*7c478bd9Sstevel@tonic-gate /* 120*7c478bd9Sstevel@tonic-gate * fill out the pam_message structure to display error message 121*7c478bd9Sstevel@tonic-gate */ 122*7c478bd9Sstevel@tonic-gate m->msg_style = PAM_ERROR_MSG; 123*7c478bd9Sstevel@tonic-gate m->msg = (char *)malloc(PAM_MAX_MSG_SIZE); 124*7c478bd9Sstevel@tonic-gate if (m->msg != NULL) 125*7c478bd9Sstevel@tonic-gate (void) strcpy(m->msg, (const char *)messages[i]); 126*7c478bd9Sstevel@tonic-gate else 127*7c478bd9Sstevel@tonic-gate continue; 128*7c478bd9Sstevel@tonic-gate m++; 129*7c478bd9Sstevel@tonic-gate i++; 130*7c478bd9Sstevel@tonic-gate } 131*7c478bd9Sstevel@tonic-gate 132*7c478bd9Sstevel@tonic-gate /* 133*7c478bd9Sstevel@tonic-gate * Call conv function to display the message, 134*7c478bd9Sstevel@tonic-gate * ignoring return value for now 135*7c478bd9Sstevel@tonic-gate */ 136*7c478bd9Sstevel@tonic-gate retcode = conv_funp(num_msg, &msg, &resp, conv_apdp); 137*7c478bd9Sstevel@tonic-gate __free_msg(num_msg, msg); 138*7c478bd9Sstevel@tonic-gate __free_resp(num_msg, resp); 139*7c478bd9Sstevel@tonic-gate return (retcode); 140*7c478bd9Sstevel@tonic-gate } 141*7c478bd9Sstevel@tonic-gate 142*7c478bd9Sstevel@tonic-gate /* 143*7c478bd9Sstevel@tonic-gate * __get_authtok(): 144*7c478bd9Sstevel@tonic-gate * get authentication token by calling the call back functions 145*7c478bd9Sstevel@tonic-gate * provided by the application through "pam_conv" structure 146*7c478bd9Sstevel@tonic-gate */ 147*7c478bd9Sstevel@tonic-gate 148*7c478bd9Sstevel@tonic-gate int 149*7c478bd9Sstevel@tonic-gate __get_authtok(conv_funp, num_msg, messages, conv_apdp, ret_respp) 150*7c478bd9Sstevel@tonic-gate int (*conv_funp)(); 151*7c478bd9Sstevel@tonic-gate int num_msg; 152*7c478bd9Sstevel@tonic-gate char messages[PAM_MAX_NUM_MSG][PAM_MAX_MSG_SIZE]; 153*7c478bd9Sstevel@tonic-gate void *conv_apdp; 154*7c478bd9Sstevel@tonic-gate struct pam_response **ret_respp; 155*7c478bd9Sstevel@tonic-gate { 156*7c478bd9Sstevel@tonic-gate struct pam_message *msg; 157*7c478bd9Sstevel@tonic-gate struct pam_message *m; 158*7c478bd9Sstevel@tonic-gate int i; 159*7c478bd9Sstevel@tonic-gate int k; 160*7c478bd9Sstevel@tonic-gate int retcode; 161*7c478bd9Sstevel@tonic-gate 162*7c478bd9Sstevel@tonic-gate i = 0; 163*7c478bd9Sstevel@tonic-gate k = num_msg; 164*7c478bd9Sstevel@tonic-gate 165*7c478bd9Sstevel@tonic-gate msg = (struct pam_message *)calloc(num_msg, 166*7c478bd9Sstevel@tonic-gate sizeof (struct pam_message)); 167*7c478bd9Sstevel@tonic-gate if (msg == NULL) { 168*7c478bd9Sstevel@tonic-gate return (PAM_CONV_ERR); 169*7c478bd9Sstevel@tonic-gate } 170*7c478bd9Sstevel@tonic-gate m = msg; 171*7c478bd9Sstevel@tonic-gate 172*7c478bd9Sstevel@tonic-gate while (k--) { 173*7c478bd9Sstevel@tonic-gate /* 174*7c478bd9Sstevel@tonic-gate * fill out the message structure to display error message 175*7c478bd9Sstevel@tonic-gate */ 176*7c478bd9Sstevel@tonic-gate m->msg_style = PAM_PROMPT_ECHO_OFF; 177*7c478bd9Sstevel@tonic-gate m->msg = (char *)malloc(PAM_MAX_MSG_SIZE); 178*7c478bd9Sstevel@tonic-gate if (m->msg != NULL) 179*7c478bd9Sstevel@tonic-gate (void) strcpy(m->msg, (char *)messages[i]); 180*7c478bd9Sstevel@tonic-gate else 181*7c478bd9Sstevel@tonic-gate continue; 182*7c478bd9Sstevel@tonic-gate m++; 183*7c478bd9Sstevel@tonic-gate i++; 184*7c478bd9Sstevel@tonic-gate } 185*7c478bd9Sstevel@tonic-gate 186*7c478bd9Sstevel@tonic-gate /* 187*7c478bd9Sstevel@tonic-gate * Call conv function to display the prompt, 188*7c478bd9Sstevel@tonic-gate * ignoring return value for now 189*7c478bd9Sstevel@tonic-gate */ 190*7c478bd9Sstevel@tonic-gate retcode = conv_funp(num_msg, &msg, ret_respp, conv_apdp); 191*7c478bd9Sstevel@tonic-gate __free_msg(num_msg, msg); 192*7c478bd9Sstevel@tonic-gate return (retcode); 193*7c478bd9Sstevel@tonic-gate } 194