* @param[in] test_cases List of libpamtest test cases. Must end with
* PAMTEST_CASE_SENTINEL
*
+ * @param[in] pam_handle The PAM handle to use to run the tests
+ *
* @code
* int main(void) {
* int rc;
const char *user,
pam_conv_fn conv_fn,
void *conv_userdata,
- struct pam_testcase test_cases[]);
+ struct pam_testcase test_cases[],
+ pam_handle_t *pam_handle);
#else
#define run_pamtest_conv(service, user, conv_fn, conv_data, test_cases) \
- _pamtest_conv(service, user, conv_fn, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0])
+ _pamtest_conv(service, user, conv_fn, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0], pam_handle)
#endif
#ifdef DOXYGEN
* @param[in] test_cases List of libpamtest test cases. Must end with
* PAMTEST_CASE_SENTINEL
*
+ * @param[in] pam_handle The PAM handle to use to run the tests
+ *
* @code
* int main(void) {
* int rc;
enum pamtest_err run_pamtest(const char *service,
const char *user,
struct pamtest_conv_data *conv_data,
- struct pam_testcase test_cases[]);
+ struct pam_testcase test_cases[],
+ pam_handle_t *pam_handle);
#else
-#define run_pamtest(service, user, conv_data, test_cases) \
- _pamtest(service, user, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0]))
+#define run_pamtest(service, user, conv_data, test_cases, pam_handle) \
+ _pamtest(service, user, conv_data, test_cases, sizeof(test_cases)/sizeof(test_cases[0]), pam_handle)
#endif
#ifdef DOXYGEN
pam_conv_fn conv_fn,
void *conv_userdata,
struct pam_testcase test_cases[],
- size_t num_test_cases);
+ size_t num_test_cases,
+ pam_handle_t *pam_handle);
enum pamtest_err _pamtest(const char *service,
const char *user,
struct pamtest_conv_data *conv_data,
struct pam_testcase test_cases[],
- size_t num_test_cases);
+ size_t num_test_cases,
+ pam_handle_t *pam_handle);
const struct pam_testcase *_pamtest_failed_case(struct pam_testcase test_cases[],
size_t num_test_cases);
"conversation for PAM_PROMPT_ECHO_ON input.\n"
);
-static PyObject *pypamtest_run_pamtest(PyObject *module, PyObject *args)
+static PyObject *pypamtest_run_pamtest(PyObject *module,
+ PyObject *args,
+ PyObject *kwargs)
{
int ok;
int rc;
PyObject *py_test_list;
PyObject *py_echo_off = NULL;
PyObject *py_echo_on = NULL;
+ PyObject *py_pam_handle = NULL;
Py_ssize_t num_tests;
struct pam_testcase *test_list;
enum pamtest_err perr;
struct pamtest_conv_data conv_data;
+ pam_handle_t *pam_handle = NULL;
TestResultObject *result = NULL;
+ const char * const kwnames[] = { "username",
+ "service",
+ "tests",
+ "echo_off",
+ "echo_on",
+ "handle",
+ NULL };
(void) module; /* unused */
- ok = PyArg_ParseTuple(args,
- discard_const_p(char, "ssO|OO"),
- &username,
- &service,
- &py_test_list,
- &py_echo_off,
- &py_echo_on);
+ ok = PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ discard_const_p(char, "ssO|OOO"),
+ discard_const_p(char *, kwnames),
+ &username,
+ &service,
+ &py_test_list,
+ &py_echo_off,
+ &py_echo_on,
+ &py_pam_handle);
if (!ok) {
return NULL;
}
return NULL;
}
- perr = _pamtest(service, username, &conv_data, test_list, num_tests);
+ if (py_pam_handle != NULL) {
+ pam_handle = (pam_handle_t *)PyCapsule_GetPointer(py_pam_handle,
+ NULL);
+ if (pam_handle == NULL) {
+ PyMem_Free(test_list);
+ PyErr_Format(PyExc_IOError,
+ "Failed to get the pam handle pointer");
+ return NULL;
+ }
+ }
+
+ perr = _pamtest(service,
+ username,
+ &conv_data,
+ test_list,
+ num_tests,
+ pam_handle);
if (perr != PAMTEST_ERR_OK) {
free_conv_data(&conv_data);
set_pypamtest_exception(PyExc_PamTestError,
{
discard_const_p(char, "run_pamtest"),
(PyCFunction) pypamtest_run_pamtest,
- METH_VARARGS,
+ METH_VARARGS | METH_KEYWORDS,
RunPamTest__doc__,
},
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = empty_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
(void) state; /* unused */
- perr = run_pamtest("matrix", "trinity", NULL, tests);
+ perr = run_pamtest("matrix", "trinity", NULL, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
(void) state; /* unused */
- perr = run_pamtest("matrix", "neo", NULL, tests);
+ perr = run_pamtest("matrix", "neo", NULL, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
(void) state; /* unused */
- perr = run_pamtest("matrix", "trinity", NULL, tests);
+ perr = run_pamtest("matrix", "trinity", NULL, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
v = string_in_list(tests[1].case_out.envlist, "HOMEDIR");
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_new_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_new_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_new_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
}
(void) state; /* unused */
- perr = run_pamtest("matrix", "trinity", NULL, tests);
+ perr = run_pamtest("matrix", "trinity", NULL, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
/* environment is clean before setcred */
conv_data.in_echo_on = trinity_authtoks;
conv_data.out_info = info_arr;
- perr = run_pamtest("matrix_opt", "trinity_ro", &conv_data, tests);
+ perr = run_pamtest("matrix_opt", "trinity_ro", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
assert_string_equal(auth_info_msg, "Authentication succeeded");
conv_data.in_echo_on = trinity_authtoks;
conv_data.out_err = err_arr;
- perr = run_pamtest("matrix_opt", "trinity_ro", &conv_data, tests);
+ perr = run_pamtest("matrix_opt", "trinity_ro", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
assert_string_equal(auth_err_msg, "Authentication failed");
test_setenv("PAM_AUTHTOK_TYPE");
#endif
- perr = run_pamtest("pwrap_get_set", "trinity", NULL, tests);
+ perr = run_pamtest("pwrap_get_set", "trinity", NULL, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
/* PAM_SERVICE is a special case, Linux's libpam lowercases it.
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_equal(perr, PAMTEST_ERR_OK);
assert_non_null(tests[1].case_out.ph);
ZERO_STRUCT(conv_data);
conv_data.in_echo_off = trinity_authtoks;
- perr = run_pamtest("matrix", "trinity", &conv_data, tests);
+ perr = run_pamtest("matrix", "trinity", &conv_data, tests, NULL);
assert_int_not_equal(perr, PAMTEST_ERR_OK);
failed_tc = pamtest_failed_case(tests);