Browse code
Seed token generator from filesystem
Ed Langley authored on 12/06/2017 22:37:13
Showing 2 changed files
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 |
|