1 /*- 2 * Copyright (c) 2002-2003 Networks Associates Technology, Inc. 3 * All rights reserved. 4 * 5 * This software was developed for the FreeBSD Project by ThinkSec AS and 6 * Network Associates Laboratories, the Security Research Division of 7 * Network Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 8 * ("CBOSS"), as part of the DARPA CHATS research program. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote 19 * products derived from this software without specific prior written 20 * permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * $P4: //depot/projects/openpam/include/security/openpam.h#27 $ 35 */ 36 37 #ifndef _SECURITY_OPENPAM_H_INCLUDED 38 #define _SECURITY_OPENPAM_H_INCLUDED 39 40 /* 41 * Annoying but necessary header pollution 42 */ 43 #include <stdarg.h> 44 45 #ifdef __cplusplus 46 extern "C" { 47 #endif 48 49 struct passwd; 50 51 /* 52 * API extensions 53 */ 54 int 55 openpam_borrow_cred(pam_handle_t *_pamh, 56 const struct passwd *_pwd); 57 58 void 59 openpam_free_data(pam_handle_t *_pamh, 60 void *_data, 61 int _status); 62 63 const char * 64 openpam_get_option(pam_handle_t *_pamh, 65 const char *_option); 66 67 int 68 openpam_restore_cred(pam_handle_t *_pamh); 69 70 int 71 openpam_set_option(pam_handle_t *_pamh, 72 const char *_option, 73 const char *_value); 74 75 int 76 pam_error(pam_handle_t *_pamh, 77 const char *_fmt, 78 ...); 79 80 int 81 pam_get_authtok(pam_handle_t *_pamh, 82 int _item, 83 const char **_authtok, 84 const char *_prompt); 85 86 int 87 pam_info(pam_handle_t *_pamh, 88 const char *_fmt, 89 ...); 90 91 int 92 pam_prompt(pam_handle_t *_pamh, 93 int _style, 94 char **_resp, 95 const char *_fmt, 96 ...); 97 98 int 99 pam_setenv(pam_handle_t *_pamh, 100 const char *_name, 101 const char *_value, 102 int _overwrite); 103 104 int 105 pam_vinfo(pam_handle_t *_pamh, 106 const char *_fmt, 107 va_list _ap); 108 109 int 110 pam_verror(pam_handle_t *_pamh, 111 const char *_fmt, 112 va_list _ap); 113 114 int 115 pam_vprompt(pam_handle_t *_pamh, 116 int _style, 117 char **_resp, 118 const char *_fmt, 119 va_list _ap); 120 121 /* 122 * Read cooked lines. 123 * Checking for _IOFBF is a fairly reliable way to detect the presence 124 * of <stdio.h>, as SUSv3 requires it to be defined there. 125 */ 126 #ifdef _IOFBF 127 char * 128 openpam_readline(FILE *_f, 129 int *_lineno, 130 size_t *_lenp); 131 #endif 132 133 /* 134 * Log levels 135 */ 136 enum { 137 PAM_LOG_DEBUG, 138 PAM_LOG_VERBOSE, 139 PAM_LOG_NOTICE, 140 PAM_LOG_ERROR 141 }; 142 143 /* 144 * Log to syslog 145 */ 146 void 147 _openpam_log(int _level, 148 const char *_func, 149 const char *_fmt, 150 ...) 151 #if defined(__GNUC__) 152 __attribute__((__format__(__printf__, 3, 4))) 153 #endif 154 ; 155 156 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) 157 #define openpam_log(lvl, ...) \ 158 _openpam_log((lvl), __func__, __VA_ARGS__) 159 #elif defined(__GNUC__) && (__GNUC__ >= 3) 160 #define openpam_log(lvl, ...) \ 161 _openpam_log((lvl), __func__, __VA_ARGS__) 162 #elif defined(__GNUC__) && (__GNUC__ >= 2) && (__GNUC_MINOR__ >= 95) 163 #define openpam_log(lvl, fmt...) \ 164 _openpam_log((lvl), __func__, ##fmt) 165 #elif defined(__GNUC__) && defined(__FUNCTION__) 166 #define openpam_log(lvl, fmt...) \ 167 _openpam_log((lvl), __FUNCTION__, ##fmt) 168 #else 169 void 170 openpam_log(int _level, 171 const char *_format, 172 ...); 173 #endif 174 175 /* 176 * Generic conversation function 177 */ 178 struct pam_message; 179 struct pam_response; 180 int openpam_ttyconv(int _n, 181 const struct pam_message **_msg, 182 struct pam_response **_resp, 183 void *_data); 184 185 extern int openpam_ttyconv_timeout; 186 187 /* 188 * Null conversation function 189 */ 190 int openpam_nullconv(int _n, 191 const struct pam_message **_msg, 192 struct pam_response **_resp, 193 void *_data); 194 195 /* 196 * PAM primitives 197 */ 198 enum { 199 PAM_SM_AUTHENTICATE, 200 PAM_SM_SETCRED, 201 PAM_SM_ACCT_MGMT, 202 PAM_SM_OPEN_SESSION, 203 PAM_SM_CLOSE_SESSION, 204 PAM_SM_CHAUTHTOK, 205 /* keep this last */ 206 PAM_NUM_PRIMITIVES 207 }; 208 209 /* 210 * Dummy service module function 211 */ 212 #define PAM_SM_DUMMY(type) \ 213 PAM_EXTERN int \ 214 pam_sm_##type(pam_handle_t *pamh, int flags, \ 215 int argc, const char *argv[]) \ 216 { \ 217 return (PAM_IGNORE); \ 218 } 219 220 /* 221 * PAM service module functions match this typedef 222 */ 223 struct pam_handle; 224 typedef int (*pam_func_t)(struct pam_handle *, int, int, const char **); 225 226 /* 227 * A struct that describes a module. 228 */ 229 typedef struct pam_module pam_module_t; 230 struct pam_module { 231 char *path; 232 pam_func_t func[PAM_NUM_PRIMITIVES]; 233 void *dlh; 234 int refcount; 235 pam_module_t *prev; 236 pam_module_t *next; 237 }; 238 239 /* 240 * Source-code compatibility with Linux-PAM modules 241 */ 242 #if defined(PAM_SM_AUTH) || defined(PAM_SM_ACCOUNT) || \ 243 defined(PAM_SM_SESSION) || defined(PAM_SM_PASSWORD) 244 #define LINUX_PAM_MODULE 245 #endif 246 #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_AUTH) 247 #define _PAM_SM_AUTHENTICATE 0 248 #define _PAM_SM_SETCRED 0 249 #else 250 #undef PAM_SM_AUTH 251 #define PAM_SM_AUTH 252 #define _PAM_SM_AUTHENTICATE pam_sm_authenticate 253 #define _PAM_SM_SETCRED pam_sm_setcred 254 #endif 255 #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_ACCOUNT) 256 #define _PAM_SM_ACCT_MGMT 0 257 #else 258 #undef PAM_SM_ACCOUNT 259 #define PAM_SM_ACCOUNT 260 #define _PAM_SM_ACCT_MGMT pam_sm_acct_mgmt 261 #endif 262 #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_SESSION) 263 #define _PAM_SM_OPEN_SESSION 0 264 #define _PAM_SM_CLOSE_SESSION 0 265 #else 266 #undef PAM_SM_SESSION 267 #define PAM_SM_SESSION 268 #define _PAM_SM_OPEN_SESSION pam_sm_open_session 269 #define _PAM_SM_CLOSE_SESSION pam_sm_close_session 270 #endif 271 #if defined(LINUX_PAM_MODULE) && !defined(PAM_SM_PASSWORD) 272 #define _PAM_SM_CHAUTHTOK 0 273 #else 274 #undef PAM_SM_PASSWORD 275 #define PAM_SM_PASSWORD 276 #define _PAM_SM_CHAUTHTOK pam_sm_chauthtok 277 #endif 278 279 /* 280 * Infrastructure for static modules using GCC linker sets. 281 * You are not expected to understand this. 282 */ 283 #if defined(__FreeBSD__) 284 #define PAM_SOEXT ".so" 285 #else 286 #ifndef NO_STATIC_MODULES 287 #define NO_STATIC_MODULES 288 #endif 289 #endif 290 #if defined(__GNUC__) && !defined(__PIC__) && !defined(NO_STATIC_MODULES) 291 /* gcc, static linking */ 292 #include <sys/cdefs.h> 293 #include <linker_set.h> 294 #define OPENPAM_STATIC_MODULES 295 #define PAM_EXTERN static 296 #define PAM_MODULE_ENTRY(name) \ 297 static char _pam_name[] = name PAM_SOEXT; \ 298 static struct pam_module _pam_module = { _pam_name, { \ 299 _PAM_SM_AUTHENTICATE, _PAM_SM_SETCRED, _PAM_SM_ACCT_MGMT, \ 300 _PAM_SM_OPEN_SESSION, _PAM_SM_CLOSE_SESSION, _PAM_SM_CHAUTHTOK }, \ 301 NULL, 0, NULL, NULL }; \ 302 DATA_SET(_openpam_static_modules, _pam_module) 303 #else 304 /* normal case */ 305 #define PAM_EXTERN 306 #define PAM_MODULE_ENTRY(name) 307 #endif 308 309 #ifdef __cplusplus 310 } 311 #endif 312 313 #endif 314