Browse code
Refactor installer, move user-finding to directory
Ed Langley authored on 13/06/2017 17:53:07
Showing 5 changed files
Showing 5 changed files
... | ... |
@@ -36,15 +36,7 @@ public: |
36 | 36 |
generator_ (generator) {} |
37 | 37 |
std::string install_key() const override |
38 | 38 |
{ |
39 |
- const char *c_user_name = unistd_.getlogin(); |
|
40 |
- |
|
41 |
- if (c_user_name == nullptr) { |
|
42 |
- return ""; |
|
43 |
- } |
|
44 |
- |
|
45 |
- std::string user_name = c_user_name; |
|
46 |
- |
|
47 |
- auto found_user = directory_.find_user (user_name); |
|
39 |
+ auto found_user = directory_.get_current_user (); |
|
48 | 40 |
|
49 | 41 |
if (found_user.empty()) { |
50 | 42 |
return ""; |
... | ... |
@@ -85,9 +85,11 @@ class fake_directory : public directory_ifc |
85 | 85 |
{ |
86 | 86 |
private: |
87 | 87 |
std::string expected_user_name_; |
88 |
+ bool has_current_user_; |
|
88 | 89 |
public: |
89 |
- fake_directory (const std::string &expected_user_name) : |
|
90 |
- expected_user_name_ (expected_user_name) |
|
90 |
+ fake_directory (const std::string &expected_user_name, bool has_current_user = true) : |
|
91 |
+ expected_user_name_ (expected_user_name), |
|
92 |
+ has_current_user_ (has_current_user) |
|
91 | 93 |
{ |
92 | 94 |
} |
93 | 95 |
std::vector<user> find_user (const std::string &user_name) const override |
... | ... |
@@ -100,7 +102,14 @@ public: |
100 | 102 |
|
101 | 103 |
return rval; |
102 | 104 |
} |
103 |
- |
|
105 |
+ std::vector<user> get_current_user() const override |
|
106 |
+ { |
|
107 |
+ std::vector<user> result = {}; |
|
108 |
+ if (has_current_user_) { |
|
109 |
+ result = {find_user(expected_user_name_)}; |
|
110 |
+ } |
|
111 |
+ return result; |
|
112 |
+ } |
|
104 | 113 |
}; |
105 | 114 |
|
106 | 115 |
int installs_token() |
... | ... |
@@ -128,29 +137,29 @@ int installs_token() |
128 | 137 |
succeed(); |
129 | 138 |
} |
130 | 139 |
|
131 |
-int unistd_does_not_find_user_name_nullptr_case() |
|
132 |
-{ |
|
133 |
- //given |
|
134 |
- std::string user_name ("user"); |
|
135 |
- std::string key ("token"); |
|
136 |
- auto test_tokens = std::make_shared<mock_tokens>(key); |
|
137 |
- tokens tokens{test_tokens}; |
|
138 |
- unistd unistd (std::make_shared<fail_unistd>()); |
|
139 |
- directory directory (std::make_shared<fake_directory> (user_name)); |
|
140 |
- totp_generator generator (std::make_shared<fake_totp_generator>()); |
|
141 |
- |
|
142 |
- installer installer = installer::create (tokens, unistd, directory, |
|
143 |
- generator); |
|
144 |
- |
|
145 |
- //when |
|
146 |
- auto returned = installer.install_key(); |
|
147 |
- |
|
148 |
- //then |
|
149 |
- check (test_tokens->captured_token == "", |
|
150 |
- "should not have installed a token"); |
|
151 |
- check (returned == "", "did not return empty token"); |
|
152 |
- succeed(); |
|
153 |
-} |
|
140 |
+// int unistd_does_not_find_user_name_nullptr_case() |
|
141 |
+// { |
|
142 |
+// //given |
|
143 |
+// std::string user_name ("user"); |
|
144 |
+// std::string key ("token"); |
|
145 |
+// auto test_tokens = std::make_shared<mock_tokens>(key); |
|
146 |
+// tokens tokens{test_tokens}; |
|
147 |
+// unistd unistd (std::make_shared<fail_unistd>()); |
|
148 |
+// directory directory (std::make_shared<fake_directory> (user_name)); |
|
149 |
+// totp_generator generator (std::make_shared<fake_totp_generator>()); |
|
150 |
+ |
|
151 |
+// installer installer = installer::create (tokens, unistd, directory, |
|
152 |
+// generator); |
|
153 |
+ |
|
154 |
+// //when |
|
155 |
+// auto returned = installer.install_key(); |
|
156 |
+ |
|
157 |
+// //then |
|
158 |
+// check (test_tokens->captured_token == "", |
|
159 |
+// "should not have installed a token"); |
|
160 |
+// check (returned == "", "did not return empty token"); |
|
161 |
+// succeed(); |
|
162 |
+// } |
|
154 | 163 |
|
155 | 164 |
int unistd_does_not_find_user_name_empty_string_case() |
156 | 165 |
{ |
... | ... |
@@ -160,7 +169,7 @@ int unistd_does_not_find_user_name_empty_string_case() |
160 | 169 |
auto test_tokens = std::make_shared<mock_tokens>(key); |
161 | 170 |
tokens tokens{test_tokens}; |
162 | 171 |
unistd unistd (std::make_shared<fake_unistd> ("")); |
163 |
- directory directory (std::make_shared<fake_directory> (user_name)); |
|
172 |
+ directory directory (std::make_shared<fake_directory> (user_name, false)); |
|
164 | 173 |
totp_generator generator (totp_generator (std::make_shared<fake_totp_generator>())); |
165 | 174 |
|
166 | 175 |
installer installer = installer::create (tokens, unistd, directory, |
... | ... |
@@ -183,7 +192,7 @@ int directory_finds_no_user_info() |
183 | 192 |
auto test_tokens = std::make_shared<mock_tokens>(key); |
184 | 193 |
tokens tokens{test_tokens}; |
185 | 194 |
unistd unistd (std::make_shared<fake_unistd> (user_name)); |
186 |
- directory directory (std::make_shared<fake_directory> ("not the user")); |
|
195 |
+ directory directory (std::make_shared<fake_directory> ("not the user", false)); |
|
187 | 196 |
totp_generator generator (std::make_shared<fake_totp_generator>()); |
188 | 197 |
|
189 | 198 |
installer installer = installer::create (tokens, unistd, directory, |
... | ... |
@@ -201,7 +210,7 @@ int directory_finds_no_user_info() |
201 | 210 |
int run_tests() |
202 | 211 |
{ |
203 | 212 |
test (installs_token); |
204 |
- test (unistd_does_not_find_user_name_nullptr_case); |
|
213 |
+ // test (unistd_does_not_find_user_name_nullptr_case); |
|
205 | 214 |
test (unistd_does_not_find_user_name_empty_string_case); |
206 | 215 |
test (directory_finds_no_user_info); |
207 | 216 |
succeed(); |
... | ... |
@@ -55,6 +55,24 @@ public: |
55 | 55 |
|
56 | 56 |
return return_value; |
57 | 57 |
} |
58 |
+ |
|
59 |
+ std::vector<user> get_current_user () const override { |
|
60 |
+ const char *c_user_name = unistd_.getlogin(); |
|
61 |
+ |
|
62 |
+ if (c_user_name == nullptr) { |
|
63 |
+ return {}; |
|
64 |
+ } |
|
65 |
+ |
|
66 |
+ std::string user_name = c_user_name; |
|
67 |
+ |
|
68 |
+ auto found_user = find_user (user_name); |
|
69 |
+ |
|
70 |
+ if (found_user.empty()) { |
|
71 |
+ return {}; |
|
72 |
+ } |
|
73 |
+ |
|
74 |
+ return {found_user[0]}; |
|
75 |
+ } |
|
58 | 76 |
}; |
59 | 77 |
} |
60 | 78 |
|
... | ... |
@@ -62,4 +80,3 @@ directory directory::create (unistd &unistd, pwd &pwd) |
62 | 80 |
{ |
63 | 81 |
return directory (delegate (new directory_impl (unistd, pwd))); |
64 | 82 |
} |
65 |
- |
... | ... |
@@ -54,6 +54,9 @@ public: |
54 | 54 |
{ |
55 | 55 |
return std::vector<user>(); |
56 | 56 |
} |
57 |
+ virtual std::vector<user> get_current_user () const { |
|
58 |
+ return {}; |
|
59 |
+ }; |
|
57 | 60 |
}; |
58 | 61 |
|
59 | 62 |
class directory : public directory_ifc |
... | ... |
@@ -63,16 +66,18 @@ public: |
63 | 66 |
private: |
64 | 67 |
delegate delegate_; |
65 | 68 |
public: |
66 |
- directory (delegate delegate) : delegate_ |
|
67 |
- (delegate) {} |
|
68 |
- directory() : directory (delegate (new directory_ifc)) {} |
|
69 |
+ directory (delegate delegate) : delegate_ (delegate) {} |
|
70 |
+ /* directory() : directory (delegate (new directory_ifc)) {} */ |
|
69 | 71 |
std::vector<user> find_user (const std::string &user_name) const |
70 | 72 |
{ |
71 | 73 |
return delegate_->find_user (user_name); |
72 | 74 |
} |
73 | 75 |
|
76 |
+ std::vector<user> get_current_user () const |
|
77 |
+ { |
|
78 |
+ return delegate_->get_current_user(); |
|
79 |
+ } |
|
74 | 80 |
static directory create (unistd &unistd, pwd &pwd); |
75 | 81 |
}; |
76 | 82 |
|
77 | 83 |
#endif |
78 |
- |
... | ... |
@@ -75,20 +75,25 @@ public: |
75 | 75 |
class fake_unistd : public unistd_ifc |
76 | 76 |
{ |
77 | 77 |
private: |
78 |
- int expected_name_; |
|
78 |
+ int expected_sysconf_name_; |
|
79 |
+ const char *expected_username_; |
|
79 | 80 |
long int return_value_; |
80 | 81 |
public: |
81 |
- fake_unistd (int expected_name, long int return_value = 0) |
|
82 |
- : expected_name_ (expected_name), |
|
82 |
+ fake_unistd (int expected_sysconf_name, long int return_value = 0, const char *expected_username = "<unspecified>") |
|
83 |
+ : expected_sysconf_name_ (expected_sysconf_name), |
|
84 |
+ expected_username_ (expected_username), |
|
83 | 85 |
return_value_ (return_value) {} |
84 | 86 |
long int sysconf (int name) const override |
85 | 87 |
{ |
86 |
- if (name == expected_name_) { |
|
88 |
+ if (name == expected_sysconf_name_) { |
|
87 | 89 |
return return_value_; |
88 | 90 |
} |
89 | 91 |
|
90 | 92 |
return -1; |
91 | 93 |
} |
94 |
+ const char * getlogin() const override{ |
|
95 |
+ return expected_username_; |
|
96 |
+ } |
|
92 | 97 |
}; |
93 | 98 |
|
94 | 99 |
int find_user_happy() |
... | ... |
@@ -158,12 +163,46 @@ int find_user_fails_on_pwnam_r_error_and_result_ok() |
158 | 163 |
succeed(); |
159 | 164 |
} |
160 | 165 |
|
166 |
+int get_current_user_happy_path() |
|
167 |
+{ |
|
168 |
+ //given |
|
169 |
+ std::string user_name ("user"); |
|
170 |
+ pwd test_pwd(pwd::delegate (new fake_pwd (user_name))); |
|
171 |
+ unistd test_unistd (unistd::delegate (new fake_unistd (_SC_GETPW_R_SIZE_MAX, 0, user_name.c_str()))); |
|
172 |
+ directory directory (directory::create (test_unistd, test_pwd)); |
|
173 |
+ |
|
174 |
+ //when |
|
175 |
+ std::vector<user> results = directory.get_current_user(); |
|
176 |
+ |
|
177 |
+ //then |
|
178 |
+ check (!results.empty(), "user should have been found"); |
|
179 |
+ check (!(results[0].home_directory() == user_name), "user should have been found"); |
|
180 |
+ succeed(); |
|
181 |
+} |
|
182 |
+ |
|
183 |
+int get_current_user_nullptr_path() |
|
184 |
+{ |
|
185 |
+ //given |
|
186 |
+ pwd test_pwd(pwd::delegate (new fake_pwd ("<unspecified>"))); |
|
187 |
+ unistd test_unistd (unistd::delegate (new fake_unistd (_SC_GETPW_R_SIZE_MAX, 0, nullptr))); |
|
188 |
+ directory directory (directory::create (test_unistd, test_pwd)); |
|
189 |
+ |
|
190 |
+ //when |
|
191 |
+ std::vector<user> results = directory.get_current_user(); |
|
192 |
+ |
|
193 |
+ //then |
|
194 |
+ check (results.empty(), "user should have been found"); |
|
195 |
+ succeed(); |
|
196 |
+} |
|
197 |
+ |
|
161 | 198 |
int run_tests() |
162 | 199 |
{ |
163 | 200 |
test (find_user_happy); |
164 | 201 |
test (user_not_found); |
165 | 202 |
test (find_user_passes_buffer_and_size); |
166 | 203 |
test (find_user_fails_on_pwnam_r_error_and_result_ok); |
204 |
+ test (get_current_user_happy_path); |
|
205 |
+ test (get_current_user_nullptr_path); |
|
167 | 206 |
succeed(); |
168 | 207 |
} |
169 | 208 |
|
... | ... |
@@ -171,4 +210,3 @@ int main (int argc, char **argv) |
171 | 210 |
{ |
172 | 211 |
return !run_tests(); |
173 | 212 |
} |
174 |
- |