git.fiddlerwoaroof.com
conversation.cc
7699d7ec
 #include <security/pam_modules.h>
01c00cfe
 #include <algorithm>
 #include <vector>
 #include <string>
7699d7ec
 
 #include "conversation.h"
 
2fade7af
 namespace
 {
6f31174c
 conversation_result err = {"",""};
2ff5dc7c
 class impl : public conversation_ifc
 {
 private:
     pam pam_;
 public:
     impl (pam &pam) : pam_ (pam) {}
     conversation_result initiate (const pam_request &request)
2fade7af
     {
2ff5dc7c
         const pam_conv *conv;
         int get_conv_result = pam_.get_conv (request.handle(), &conv);
6f31174c
 
         if (get_conv_result != PAM_SUCCESS) {
             return err;
         }
 
2ff5dc7c
         pam_message msg;
         msg.msg = const_cast<char *> ("Dual control token: ");
         msg.msg_style = PAM_PROMPT_ECHO_OFF;
         std::vector<const pam_message *> messages;
         messages.push_back (&msg);
         std::vector<pam_response *> responses (1);
         int conv_result = conv->conv (1, messages.data(), responses.data(),
                                       conv->appdata_ptr);
         std::string answer (responses[0]->resp);
 
         std::string::iterator delim = std::find (answer.begin(), answer.end(), ':');
 
6f31174c
         if (delim == answer.end()) {
             return err;
2ff5dc7c
         }
 
6f31174c
         return {
             std::string (answer.begin(), delim),
             std::string (delim + 1, answer.end())
         };
 
2ff5dc7c
     }
 };
2fade7af
 }
 
2ff5dc7c
 conversation create_conversation (pam &pam)
 {
     return conversation (std::shared_ptr<conversation_ifc> (new impl (pam)));
2fade7af
 }
 
d49437a6
 /*
 int (*conv)(int num_msg, const struct pam_message **msg,
                 struct pam_response **resp, void *appdata_ptr)
    */
 
f46fb7b6
 /*
b017a4d2
 pam_token_conversation::pam_token_conversation (pam_handle_t *pamh,
         const pam_p pam)
cdf7fd74
 {
01c00cfe
     pam_conversation_p pam_conversation;
b017a4d2
     int get_conversation_result = pam->get_conversation (pamh,
                                   pam_conversation);
 
1bbd05bc
     if (get_conversation_result != 0) {
662f2d36
         return;
     }
0b6e39a6
 
f9c4622b
     struct pam_message prompt;
b017a4d2
 
     std::string message ("Dual control token: ");
 
     prompt.msg = const_cast<char *> (message.c_str());
 
c9d7e817
     prompt.msg_style = PAM_PROMPT_ECHO_OFF;
b017a4d2
 
     std::vector<const struct pam_message *> prompts (1);
 
f9c4622b
     prompts[0] = &prompt;
b017a4d2
 
     std::vector<struct pam_response *> answers (1);
 
     int conversation_result = pam_conversation->conv (prompts, answers);
 
1bbd05bc
     if (conversation_result) {
         return;
     }
12570d65
 
     if (answers[0]->resp_retcode) {
         return;
     }
b017a4d2
 
     std::string answer (answers[0]->resp);
     std::string::iterator delim = std::find (answer.begin(), answer.end(), ':');
 
24888e2d
     if (delim == answer.end()) {
         return;
     }
b017a4d2
 
     std::string user_name (answer.begin(), delim);
     std::string token (delim + 1, answer.end());
01c00cfe
     user_ = user_name;
     token_ = token;
 }
0b6e39a6
 
cdf7fd74
 std::string pam_token_conversation::token()
 {
01c00cfe
     return token_;
7699d7ec
 }
 
cdf7fd74
 std::string pam_token_conversation::user_name()
 {
01c00cfe
     return user_;
be7b0e04
 }
f46fb7b6
 */
92957308