git.fiddlerwoaroof.com
Browse code

prompt text

Greg Wiley authored on 17/04/2017 21:22:24
Showing 2 changed files
... ...
@@ -13,7 +13,11 @@ pam_token_conversation::pam_token_conversation(pam_handle_t *pamh, const pam_p p
13 13
         return;
14 14
     }
15 15
 
16
-    const std::vector<const struct pam_message *> prompts(1);
16
+    struct pam_message prompt;
17
+    std::string message("Dual control token: ");
18
+    prompt.msg = const_cast<char *>(message.c_str());
19
+    std::vector<const struct pam_message *> prompts(1);
20
+    prompts[0] = &prompt;
17 21
     std::vector<struct pam_response *> answers(1);
18 22
     pam_conversation->conv(prompts, answers);
19 23
     std::string answer(answers[0]->resp);
... ...
@@ -26,6 +26,26 @@ class fake_pam_conversation : public pam_conversation {
26 26
         }
27 27
 };
28 28
 
29
+class mock_pam_conversation : public pam_conversation {
30
+    private:
31
+        pam_response response_;
32
+        std::string answer_;
33
+        std::string prompt_;
34
+    public:
35
+        mock_pam_conversation(const std::string &prompt) : prompt_(prompt), answer_("ok:123") {}
36
+        int conv(const std::vector<const struct pam_message *> &prompts, std::vector<struct pam_response *> &answers) {
37
+            if (prompt_ != prompts[0]->msg) {
38
+                throw std::string("prompt does not match");
39
+            }
40
+            response_.resp_retcode = 0;
41
+            response_.resp = const_cast<char *>(answer_.c_str());
42
+            answers.resize(1);
43
+            answers[0] = &response_;
44
+            return 0;
45
+        }
46
+
47
+};
48
+
29 49
 class fake_pam : public pam {
30 50
     private:
31 51
         std::shared_ptr<pam_conversation> conversation_;
... ...
@@ -146,6 +166,24 @@ int returns_empty_user_and_token_when_pam_cant_create_conversation() {
146 166
 
147 167
 }
148 168
 
169
+int prompts_user_with_correct_text() {
170
+    // given
171
+    pam_handle_t *pamh;
172
+    pam_conversation_p match_conversation = (pam_conversation_p) new mock_pam_conversation("Dual control token: ");
173
+    pam_p pam = (pam_p)new fake_pam(match_conversation);
174
+
175
+
176
+    // when / then
177
+    try {
178
+      pam_token_conversation conversation(pamh, pam);
179
+      succeed();
180
+    } catch (const std::string &x) {
181
+        fail();
182
+    }
183
+
184
+
185
+
186
+}
149 187
 
150 188
 RESET_VARS_START
151 189
 RESET_VARS_END
... ...
@@ -158,6 +196,7 @@ int run_tests() {
158 196
     test(returns_empty_user_when_colon_begin);
159 197
     test(returns_empty_user_and_token_when_empty_answer);
160 198
     test(returns_empty_user_and_token_when_pam_cant_create_conversation);
199
+    test(prompts_user_with_correct_text);
161 200
     succeed();
162 201
 }
163 202