git.fiddlerwoaroof.com
Browse code

Refactor installer, move user-finding to directory

Ed Langley authored on 13/06/2017 17:53:07
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
-