#include <vector>
#include <algorithm>
#include <string>
#include <security/pam_modules.h>
#include "conversation.h"
#include "test_util.h"
#include "pam.h"
class fake_pam_conversation : public pam_conversation {
private:
pam_response response_;
std::string answer_;
public:
fake_pam_conversation(const std::string &answer) : answer_(answer) {}
int conv(const std::vector<const struct pam_message *> &prompts, std::vector<struct pam_response *> &answers) {
if (prompts.size() != 1) {
throw std::string("test only supports one prompt");
}
response_.resp_retcode = 0;
response_.resp = const_cast<char *>(answer_.c_str());
answers.resize(1);
answers[0] = &response_;
return 0;
}
};
class fake_pam : public pam {
private:
std::string answer_;
public:
fake_pam(const std::string &answer) : answer_(answer) {}
int get_conversation(pam_handle_t *pamh, std::shared_ptr<pam_conversation> &conversation) {
conversation.reset(new fake_pam_conversation(answer_));
return 0;
}
};
int returns_correct_token() {
//given
pam_handle_t *pamh;
pam_p pam = (pam_p)new fake_pam("user:code");
//when
pam_token_conversation conversation(pamh, pam);
//then
check(conversation.token() == "code", "returned incorrect token");
succeed();
}
int returns_correct_user_name() {
//given
pam_handle_t *pamh;
pam_p pam = (pam_p)new fake_pam("sally:token");
//when
pam_token_conversation conversation(pamh, pam);
//then
check(conversation.user_name() == "sally", "returned incorrect user name");
succeed();
}
int returns_empty_string_with_bad_input() {
//given
pam_handle_t *pamh;
pam_p pam = (pam_p)new fake_pam("sally");
//when
pam_token_conversation conversation(pamh, pam);
//then
check(conversation.user_name() == "", "did not return empty user name");
check(conversation.token() == "", "did not return empty token");
succeed();
}
RESET_VARS_START
RESET_VARS_END
int run_tests() {
test(returns_correct_token);
test(returns_correct_user_name);
test(returns_empty_string_with_bad_input);
succeed();
}
int main(int argc, char *args[]) {
return !run_tests();
}