7d075ab4 |
/* Copyright (C) CJ Affiliate
*
* You may use, distribute and modify this code under the
* terms of the GNU General Public License version 2 or
* later.
*
* You should have received a copy of the license with this
* file. If not, you will find a copy in the "LICENSE" file
* at https://github.com/cjdev/dual-control.
*/
|
bf756dea |
#include <functional>
#include <memory>
#include <string>
#include <vector>
|
c7bdd0eb |
#include <tuple>
|
bf756dea |
|
66796de1 |
#include "installer.h"
|
bf756dea |
#include "user.h"
#include "token.h"
#include "test_util.h"
|
d0d6ce9f |
#include "generator.h"
|
c1e18905 |
#include "typealiases.h"
|
bf756dea |
|
7d075ab4 |
class mock_tokens : public tokens_ifc
{
public:
|
6133fc1e |
mutable std::string captured_key;
|
8c56f42f |
const std::string key_;
mock_tokens (std::string key)
: key_ (key)
{}
|
8c62e61c |
std::string token (const user &user) const override
{
|
8c56f42f |
return key_;
}
|
8c62e61c |
std::string ensure_key (const user &user) const override
{
save (user, key_);
|
3f7d4dd6 |
return key_;
}
|
6133fc1e |
void save (const user &user, const std::string &key) const override
|
7d075ab4 |
{
|
6133fc1e |
captured_key = key;
|
7d075ab4 |
}
|
bf756dea |
};
|
7d075ab4 |
class fake_unistd : public unistd_ifc
{
private:
std::string user_name_;
public:
fake_unistd (const std::string &user_name) : user_name_ (user_name) {}
const char *getlogin() const override
{
return user_name_.c_str();
}
|
bf756dea |
};
|
66796de1 |
|
7d075ab4 |
class fail_unistd : public unistd_ifc
{
public:
const char *getlogin() const override
{
return nullptr;
}
|
55530c94 |
};
|
d0d6ce9f |
class fake_totp_generator : public token_generator_ifc
{
|
dcdd8ca1 |
private:
std::string expected_token;
public:
fake_totp_generator (const std::string expected_token = "000000"):
expected_token (expected_token)
{}
|
40fd6c82 |
std::string generate_token (const octet_vector &key) const override
|
dcdd8ca1 |
{
return expected_token;
}
|
d0d6ce9f |
};
|
7d075ab4 |
class fake_directory : public directory_ifc
{
private:
std::string expected_user_name_;
|
b8155a93 |
bool has_current_user_;
|
7d075ab4 |
public:
|
8c62e61c |
fake_directory (const std::string &expected_user_name,
bool has_current_user = true) :
|
b8155a93 |
expected_user_name_ (expected_user_name),
has_current_user_ (has_current_user)
|
7d075ab4 |
{
}
std::vector<user> find_user (const std::string &user_name) const override
{
std::vector<user> rval;
if (user_name == expected_user_name_) {
rval.push_back (user());
|
bf756dea |
}
|
7d075ab4 |
return rval;
}
|
b8155a93 |
std::vector<user> get_current_user() const override
{
std::vector<user> result = {};
|
8c62e61c |
|
b8155a93 |
if (has_current_user_) {
|
8c62e61c |
result = {find_user (expected_user_name_)};
|
b8155a93 |
}
|
8c62e61c |
|
b8155a93 |
return result;
}
|
bf756dea |
};
|
7d075ab4 |
int installs_token()
{
|
66796de1 |
//given
|
7d075ab4 |
std::string user_name ("user");
|
f04cd01b |
std::string key ("THEKEYIS");
|
c7bdd0eb |
std::string token ("thetoken");
|
8c62e61c |
auto test_tokens = std::make_shared<mock_tokens> (key);
|
bf756dea |
tokens tokens{test_tokens};
|
7d075ab4 |
unistd unistd (std::make_shared<fake_unistd> (user_name));
directory directory (std::make_shared<fake_directory> (user_name));
|
8c62e61c |
std::shared_ptr<fake_totp_generator> fake_generator =
std::make_shared<fake_totp_generator> (token);
|
c7bdd0eb |
totp_generator generator (fake_generator );
|
bf756dea |
|
dcdd8ca1 |
installer installer = installer::create (tokens, unistd, directory,
generator);
|
66796de1 |
//when
|
c7bdd0eb |
std::string actual_key, actual_token;
|
8c62e61c |
std::tie (actual_key, actual_token) = installer.install_key();
|
66796de1 |
//then
|
6133fc1e |
check (test_tokens->captured_key == key, "installed wrong key");
|
c7bdd0eb |
check (actual_key == key, "installer returned wrong key");
check (actual_token == token, "installer returned wrong token");
|
bf756dea |
succeed();
|
66796de1 |
}
|
284e9ab4 |
int unistd_does_not_find_user_name_empty_string_case()
{
//given
std::string user_name ("user");
|
8c56f42f |
std::string key ("token");
|
8c62e61c |
auto test_tokens = std::make_shared<mock_tokens> (key);
|
284e9ab4 |
tokens tokens{test_tokens};
unistd unistd (std::make_shared<fake_unistd> (""));
|
b8155a93 |
directory directory (std::make_shared<fake_directory> (user_name, false));
|
8c62e61c |
totp_generator generator (totp_generator (
std::make_shared<fake_totp_generator>()));
|
284e9ab4 |
|
dcdd8ca1 |
installer installer = installer::create (tokens, unistd, directory,
generator);
|
284e9ab4 |
//when
|
c7bdd0eb |
std::string actual_key, actual_token;
|
8c62e61c |
std::tie (actual_key, actual_token) = installer.install_key();
|
284e9ab4 |
//then
|
c7bdd0eb |
check (actual_key == "",
"should not have installed a token");
check (actual_token == "",
"should not have installed a token");
|
284e9ab4 |
succeed();
}
|
7d075ab4 |
int directory_finds_no_user_info()
{
std::string user_name ("user");
|
8c56f42f |
std::string key ("token");
|
8c62e61c |
auto test_tokens = std::make_shared<mock_tokens> (key);
|
43a993d5 |
tokens tokens{test_tokens};
|
7d075ab4 |
unistd unistd (std::make_shared<fake_unistd> (user_name));
|
8c62e61c |
directory directory (std::make_shared<fake_directory> ("not the user",
false));
|
62a4ee36 |
totp_generator generator (std::make_shared<fake_totp_generator>());
|
43a993d5 |
|
dcdd8ca1 |
installer installer = installer::create (tokens, unistd, directory,
generator);
|
43a993d5 |
//when
|
c7bdd0eb |
std::string actual_key, actual_token;
|
8c62e61c |
std::tie (actual_key, actual_token) = installer.install_key();
|
43a993d5 |
//then
|
6133fc1e |
check (test_tokens->captured_key == "", "installed wrong key");
|
c7bdd0eb |
check (actual_key == "", "did not return empty token");
check (actual_token == "", "did not return an empty token");
|
43a993d5 |
succeed();
}
|
7d075ab4 |
int run_tests()
{
|
377fd79f |
test (installs_token);
test (unistd_does_not_find_user_name_empty_string_case);
test (directory_finds_no_user_info);
|
bf756dea |
succeed();
}
|
7d075ab4 |
int main (int argc, char *argv[])
{
|
bf756dea |
return !run_tests();
}
|
0d8b9a17 |
|