git.fiddlerwoaroof.com
Browse code

pam impl returns correct user and token

Greg Wiley authored on 20/04/2017 21:46:12
Showing 3 changed files
... ...
@@ -18,21 +18,40 @@ namespace
18 18
         public:
19 19
            impl(pam &pam) : pam_(pam) {}
20 20
            conversation_result initiate (const pam_request &request) {
21
-           pam_conv *out;
22
-           int result = pam_.get:_conv(request.handle(),
23
-               /*int get_conv (pam_handle *handle, const pam_conv **out)
24
-    {
25
-        return delegate_->get_conv (handle, out);
26
-    }
27
-    */
21
+               const pam_conv *conv;
22
+               int get_conv_result = pam_.get_conv (request.handle(), &conv);
23
+               pam_message msg;
24
+               msg.msg = const_cast<char *>("Dual control token: ");
25
+               msg.msg_style = PAM_PROMPT_ECHO_OFF;
26
+               std::vector<const pam_message *> messages;
27
+               messages.push_back(&msg);
28
+               std::vector<pam_response *> responses(1);
29
+               int conv_result = conv->conv(1, messages.data(), responses.data(), conv->appdata_ptr);
30
+               std::string answer(responses[0]->resp);
31
+
32
+                std::string user;
33
+                std::string token;
34
+               std::string::iterator delim = std::find (answer.begin(), answer.end(), ':');
35
+                if (delim != answer.end()) {
36
+                    user = std::string(answer.begin(), delim);
37
+                    token = std::string(delim + 1, answer.end());
38
+                }
39
+
40
+               return {user, token};
28 41
            }
29 42
     };
30 43
 }
31 44
 
32 45
 conversation create_conversation(pam &pam) {
33
-    return conversation(std::shared_ptr<conversation_ifc>(new impl));
46
+    return conversation(std::shared_ptr<conversation_ifc>(new impl(pam)));
34 47
 }
35 48
 
49
+/*
50
+int (*conv)(int num_msg, const struct pam_message **msg,
51
+                struct pam_response **resp, void *appdata_ptr)
52
+   */
53
+
54
+
36 55
 /*
37 56
 pam_token_conversation::pam_token_conversation (pam_handle_t *pamh,
38 57
         const pam_p pam)
... ...
@@ -3,7 +3,7 @@
3 3
 
4 4
 #include "request.h"
5 5
 
6
-std::vector<std::string> pam_request::arguments()
6
+std::vector<std::string> pam_request::arguments() const
7 7
 {
8 8
     std::vector<std::string> rval;
9 9
 
... ...
@@ -17,12 +17,12 @@ public:
17 17
           flags_ (flags),
18 18
           argc_ (argc),
19 19
           argv_ (argv) {}
20
-    std::vector<std::string> arguments();
21
-    int flags()
20
+    std::vector<std::string> arguments() const;
21
+    int flags() const
22 22
     {
23 23
         return flags_;
24 24
     }
25
-    pam_handle *handle()
25
+    pam_handle *handle() const
26 26
     {
27 27
         return handle_;
28 28
     }