Browse code
prompt text
Greg Wiley authored on 17/04/2017 21:22:24
Showing 2 changed files
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 |
|