7699d7ec | #include <security/pam_modules.h> |
01c00cfe | #include <algorithm> #include <vector> #include <string> |
7699d7ec | #include "conversation.h" |
01c00cfe | #include "pam.h" |
7699d7ec | |
01c00cfe | pam_token_conversation::pam_token_conversation(pam_handle_t *pamh, const pam_p pam) { pam_conversation_p pam_conversation; |
1bbd05bc | int get_conversation_result = pam->get_conversation(pamh, pam_conversation); if (get_conversation_result != 0) { |
662f2d36 | return; } |
0b6e39a6 | |
f9c4622b | struct pam_message prompt; std::string message("Dual control token: "); prompt.msg = const_cast<char *>(message.c_str()); |
c9d7e817 | prompt.msg_style = PAM_PROMPT_ECHO_OFF; |
f9c4622b | std::vector<const struct pam_message *> prompts(1); prompts[0] = &prompt; |
01c00cfe | std::vector<struct pam_response *> answers(1); |
1bbd05bc | int conversation_result = pam_conversation->conv(prompts, answers); if (conversation_result) { return; } |
12570d65 | if (answers[0]->resp_retcode) { return; } |
01c00cfe | std::string answer(answers[0]->resp); std::string::iterator delim = std::find(answer.begin(), answer.end(), ':'); |
24888e2d | if (delim == answer.end()) { return; } |
01c00cfe | std::string user_name(answer.begin(), delim); std::string token(delim + 1, answer.end()); user_ = user_name; token_ = token; } |
0b6e39a6 | std::string pam_token_conversation::token() { |
01c00cfe | return token_; |
7699d7ec | } |
be7b0e04 | std::string pam_token_conversation::user_name() { |
01c00cfe | return user_; |
be7b0e04 | } |