00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __LIBPAMTEST_H_
00020 #define __LIBPAMTEST_H_
00021
00022 #include <stdint.h>
00023 #include <security/pam_appl.h>
00024
00034 enum pamtest_ops {
00036 PAMTEST_AUTHENTICATE,
00038 PAMTEST_SETCRED,
00040 PAMTEST_ACCOUNT,
00042 PAMTEST_OPEN_SESSION,
00044 PAMTEST_CLOSE_SESSION,
00046 PAMTEST_CHAUTHTOK,
00047
00052 PAMTEST_GETENVLIST = 20,
00057 PAMTEST_KEEPHANDLE,
00058 };
00059
00060
00067 struct pam_testcase {
00068 enum pamtest_ops pam_operation;
00069 int expected_rv;
00070 int flags;
00071
00072 int op_rv;
00073
00074 union {
00075 char **envlist;
00076 pam_handle_t *ph;
00077 } case_out;
00078 };
00079
00081 #define pam_test(op, expected) { op, expected, 0, 0, { .envlist = NULL } }
00082
00083 #define pam_test_flags(op, expected, flags) { op, expected, flags, 0, { .envlist = NULL } }
00084
00088 enum pamtest_err {
00090 PAMTEST_ERR_OK,
00092 PAMTEST_ERR_START,
00094 PAMTEST_ERR_CASE,
00096 PAMTEST_ERR_OP,
00098 PAMTEST_ERR_END,
00100 PAMTEST_ERR_KEEPHANDLE,
00102 PAMTEST_ERR_INTERNAL,
00103 };
00104
00111 typedef int (*pam_conv_fn)(int num_msg,
00112 const struct pam_message **msg,
00113 struct pam_response **resp,
00114 void *appdata_ptr);
00115
00120 struct pamtest_conv_data {
00125 const char **in_echo_off;
00130 const char **in_echo_on;
00131
00135 char **out_err;
00139 char **out_info;
00140 };
00141
00142 #ifdef DOXYGEN
00143
00174 enum pamtest_err run_pamtest_conv(const char *service,
00175 const char *user,
00176 pam_conv_fn conv_fn,
00177 void *conv_userdata,
00178 struct pam_testcase test_cases[]);
00179 #else
00180 #define run_pamtest_conv(service, user, conv_fn, conv_data, test_cases) \
00181 _pamtest_conv(service, user, conv_fn, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0])
00182 #endif
00183
00184 #ifdef DOXYGEN
00185
00214 enum pamtest_err run_pamtest(const char *service,
00215 const char *user,
00216 struct pamtest_conv_data *conv_data,
00217 struct pam_testcase test_cases[]);
00218 #else
00219 #define run_pamtest(service, user, conv_data, test_cases) \
00220 _pamtest(service, user, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0]))
00221 #endif
00222
00223 #ifdef DOXYGEN
00224
00236 const struct pam_testcase *pamtest_failed_case(struct pam_testcase *test_cases);
00237 #else
00238 #define pamtest_failed_case(test_cases) \
00239 _pamtest_failed_case(test_cases, sizeof(test_cases) / sizeof(test_cases[0]))
00240 #endif
00241
00249 const char *pamtest_strerror(enum pamtest_err perr);
00250
00256 void pamtest_free_env(char **envlist);
00257
00258
00259
00260 enum pamtest_err _pamtest_conv(const char *service,
00261 const char *user,
00262 pam_conv_fn conv_fn,
00263 void *conv_userdata,
00264 struct pam_testcase test_cases[],
00265 size_t num_test_cases);
00266
00267 enum pamtest_err _pamtest(const char *service,
00268 const char *user,
00269 struct pamtest_conv_data *conv_data,
00270 struct pam_testcase test_cases[],
00271 size_t num_test_cases);
00272
00273 const struct pam_testcase *_pamtest_failed_case(struct pam_testcase test_cases[],
00274 size_t num_test_cases);
00275
00278 #endif