git.fiddlerwoaroof.com
conversation.cc
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
 }