git.fiddlerwoaroof.com
Browse code

Seed token generator from filesystem

Ed Langley authored on 12/06/2017 22:37:13
Showing 2 changed files
... ...
@@ -18,6 +18,7 @@
18 18
 
19 19
 #include "token.h"
20 20
 #include "user.h"
21
+#include "base32.h"
21 22
 #include "sys_fstream.h"
22 23
 
23 24
 namespace
... ...
@@ -32,22 +33,24 @@ public:
32 33
         fstreams_ (fstreams), generator_(generator) {}
33 34
     std::string token (const user &user) const override
34 35
     {
35
-        return generator_.generate_token("\x00");
36
+        // Get key
37
+        const std::string file_path (user.home_directory() + "/.dual_control");
38
+        fstreams::pstream stream (fstreams_.open_fstream (file_path));
36 39
 
37
-        // // Get key
38
-        // const std::string file_path (user.home_directory() + "/.dual_control");
39
-        // fstreams::pstream stream (fstreams_.open_fstream (file_path));
40
+        // TODO: decode key
41
+        std::vector<char> line_v(40);
42
+        stream->getline(line_v.data(), line_v.size());
40 43
 
41
-        // if (!stream->good()) {
42
-        //     return "";
43
-        // }
44
+        if (stream->fail()) {
45
+            return "";
46
+        }
44 47
 
45
-        // // TODO: decode key
46
-        // std::vector<char> line (21);
47
-        // stream->getline (line.data(), line.size());
48
-        // std::vector<char> key = Base32.decode(line.data());
49
-        // // TODO: generate the token
50
-        // return generator_.generate_token (key);
48
+        base32 codec;
49
+        std::string line(line_v.begin(), line_v.end());
50
+        std::vector<uint8_t> key = codec.decode(line);
51
+
52
+        // TODO: generate the token
53
+        return generator_.generate_token (std::string (key.begin(), key.end()));
51 54
     }
52 55
     void save (const user &user, const std::string &token) const override
53 56
     {
... ...
@@ -89,6 +89,9 @@ private:
89 89
     std::string expected_token = "<unspecified>";
90 90
     std::string key = "<unset>";
91 91
 public:
92
+    fake_totp_generator (std::string expected_token = "<unspecified>") :
93
+        expected_token (expected_token)
94
+    {}
92 95
     std::string generate_token (const std::string &key) const override {
93 96
         return expected_token;
94 97
     }
... ...
@@ -100,10 +103,10 @@ int reads_from_the_right_file ()
100 103
     std::string home_directory = "/somedir";
101 104
     // hardcoded file name is .dual_control in the user's home directory
102 105
     std::string token_file = home_directory + "/.dual_control";
103
-    std::string token ("123456");
104
-    fstreams test_streams (fstreams::delegate (new fake_fstreams (token_file,
105
-                           token)));
106
-    totp_generator generator (totp_generator::delegate (new fake_totp_generator ()));
106
+    std::string token ("AAAAAAAA");
107
+
108
+    fstreams test_streams (fstreams::delegate (new fake_fstreams (token_file, token)));
109
+    totp_generator generator (totp_generator::delegate (new fake_totp_generator (token)));
107 110
 
108 111
     //file_reader test_file_reader (file_reader::delegate (new fake_file_reader));
109 112
     user test_user (user::delegate (new fake_user (home_directory)));
... ...
@@ -157,18 +160,16 @@ int writes_the_token ()
157 160
     temp << token << std::endl;
158 161
     std::string expected_written = temp.str();
159 162
     std::string expected_filename (home_directory + "/.dual_control");
160
-    check (mockfs->captured_filename() == expected_filename,
161
-           "filename does not match");
162
-    check (mockfs->captured_written() == expected_written,
163
-           "token does not match");
163
+    check (mockfs->captured_filename() == expected_filename, "filename does not match");
164
+    check (mockfs->captured_written() == expected_written, "token does not match");
164 165
     succeed();
165 166
 }
166 167
 
167 168
 int run_tests()
168 169
 {
169
-    // test (reads_from_the_right_file);
170
-    // test (returns_empty_string_if_file_open_fail);
171
-    // test (writes_the_token);
170
+    test (reads_from_the_right_file);
171
+    test (returns_empty_string_if_file_open_fail);
172
+    test (writes_the_token);
172 173
     succeed();
173 174
 }
174 175