Add CreateLoginserverWorldAdminAccount command [skip ci]

This commit is contained in:
Akkadius 2019-07-09 05:23:21 -05:00
parent b165760f18
commit 739f54bbfb
7 changed files with 208 additions and 16 deletions

View File

@ -70,3 +70,59 @@ bool AccountManagement::CreateLocalLoginServerAccount(
return false;
}
/**
* @param username
* @param password
* @param email
* @return
*/
bool AccountManagement::CreateLoginserverWorldAdminAccount(
const std::string &username,
const std::string &password,
const std::string &email,
const std::string &first_name,
const std::string &last_name,
const std::string &ip_address
)
{
auto mode = server.options.GetEncryptionMode();
auto hash = eqcrypt_hash(username, password, mode);
LogInfo(
"Attempting to create world admin account | username [{0}] encryption algorithm [{1}] ({2})",
username,
GetEncryptionByModeId(mode),
mode
);
if (server.db->DoesLoginserverWorldAdminAccountExist(username)) {
LogInfo(
"Attempting to create world admin account for user [{0}] but already exists!",
username
);
return false;
}
if (server.db->CreateLoginserverWorldAdminAccount(
username,
hash,
first_name,
last_name,
email,
ip_address
)) {
LogInfo(
"Account creation success for user [{0}] encryption algorithm [{1}] ({2})",
username,
GetEncryptionByModeId(mode),
mode
);
return true;
}
LogError("Failed to create world admin account account for user [{0}]!", username);
return false;
}

View File

@ -24,7 +24,28 @@
class AccountManagement {
public:
/**
* @param username
* @param password
* @return
*/
static bool CreateLocalLoginServerAccount(std::string username, std::string password);
/**
* @param username
* @param password
* @param email
* @return
*/
static bool CreateLoginserverWorldAdminAccount(
const std::string &username,
const std::string &password,
const std::string &email,
const std::string &first_name = "",
const std::string &last_name = "",
const std::string &ip_address = ""
);
};

View File

@ -57,7 +57,7 @@ Database::Database(
user.c_str(),
pass.c_str(),
name.c_str(),
atoi(port.c_str()),
std::stoi(port),
&errnum,
errbuf
)
@ -66,7 +66,7 @@ Database::Database(
exit(1);
}
else {
Log(Logs::General, Logs::Status, "Using database '%s' at %s:%d", database, host, port);
LogStatus("Using database [{0}] at [{1}:{2}]", name, host, port);
}
}
@ -477,6 +477,7 @@ bool Database::CreateWorldRegistration(
server_short_name
);
return false;
}
@ -608,4 +609,57 @@ void Database::LoadLogSettings(EQEmuLogSys::LogSettings *log_settings)
}
delete[] categories_in_database;
}
}
/**
* @param account_name
* @param account_password
* @param first_name
* @param last_name
* @param email
* @param ip_address
* @return
*/
bool Database::CreateLoginserverWorldAdminAccount(
const std::string &account_name,
const std::string &account_password,
const std::string &first_name,
const std::string &last_name,
const std::string &email,
const std::string &ip_address
)
{
auto query = fmt::format(
"INSERT INTO login_server_admins (account_name, account_password, first_name, last_name, email, registration_date, "
"registration_ip_address) "
"VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', NOW(), '{5}')",
EscapeString(account_name),
EscapeString(account_password),
EscapeString(first_name),
EscapeString(last_name),
EscapeString(email),
ip_address
);
auto results = QueryDatabase(query);
return results.Success();
}
/**
* @param account_name
* @return
*/
bool Database::DoesLoginserverWorldAdminAccountExist(
const std::string &account_name
)
{
auto query = fmt::format(
"SELECT account_name FROM login_server_admins WHERE account_name = '{0}'",
EscapeString(account_name)
);
auto results = QueryDatabase(query);
return (results.RowCount() == 1);
}

View File

@ -159,9 +159,9 @@ public:
* @return
*/
Database::DbWorldRegistration GetWorldRegistration(
const std::string& short_name,
const std::string& remote_ip,
const std::string& local_ip
const std::string &short_name,
const std::string &remote_ip,
const std::string &local_ip
);
/**
@ -211,9 +211,33 @@ public:
std::string CreateLoginserverApiToken(bool write_mode, bool read_mode);
MySQLRequestResult GetLoginserverApiTokens();
/**
* @param account_name
* @param account_password
* @param first_name
* @param last_name
* @param email
* @param ip_address
* @return
*/
bool CreateLoginserverWorldAdminAccount(
const std::string &account_name,
const std::string &account_password,
const std::string &first_name,
const std::string &last_name,
const std::string &email,
const std::string &ip_address
);
/**
* @param account_name
* @return
*/
bool DoesLoginserverWorldAdminAccountExist(const std::string &account_name);
protected:
std::string user, pass, host, port, name;
MYSQL *database;
MYSQL *database{};
};
#endif

View File

@ -17,7 +17,7 @@ DROP TABLE IF EXISTS `login_server_admins`;
CREATE TABLE `login_server_admins` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`account_name` varchar(30) NOT NULL,
`account_password` varchar(100) NOT NULL,
`account_password` varchar(255) NOT NULL,
`first_name` varchar(50) NOT NULL,
`last_name` varchar(50) NOT NULL,
`email` varchar(100) NOT NULL,

View File

@ -64,19 +64,29 @@ namespace LoginserverCommandHandler {
argh::parser cmd;
cmd.parse(argc, argv, argh::parser::PREFER_PARAM_FOR_UNREG_OPTION);
LoginserverCommandHandler::DisplayDebug(cmd);
/**
* Declare command mapping
*/
std::map<std::string, void (*)(int argc, char **argv, argh::parser &cmd)> function_map;
function_map["create-loginserver-api-token"] = &LoginserverCommandHandler::CreateLoginserverApiToken;
function_map["list-loginserver-api-tokens"] = &LoginserverCommandHandler::ListLoginserverApiTokens;
function_map["create-loginserver-account"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount;
std::map<std::string, void (*)(int argc, char **argv, argh::parser &cmd)>::const_iterator it = function_map.begin();
std::map<std::string, void (*)(int argc, char **argv, argh::parser &cmd)>::const_iterator end = function_map.end();
function_map["create-loginserver-api-token"] = &LoginserverCommandHandler::CreateLoginserverApiToken;
function_map["list-loginserver-api-tokens"] = &LoginserverCommandHandler::ListLoginserverApiTokens;
function_map["create-loginserver-account"] = &LoginserverCommandHandler::CreateLocalLoginserverAccount;
function_map["create-loginserver-world-admin-account"] = &LoginserverCommandHandler::CreateLoginserverWorldAdminAccount;
std::map<std::string, void (*)(
int argc,
char **argv,
argh::parser &cmd
)>::const_iterator it = function_map.begin();
std::map<std::string, void (*)(
int argc,
char **argv,
argh::parser &cmd
)>::const_iterator end = function_map.end();
bool ran_command = false;
while (it != end) {
@ -103,9 +113,12 @@ namespace LoginserverCommandHandler {
std::cout << "> create-loginserver-api-token --write --read" << std::endl;
std::cout << "> list-loginserver-api-tokens" << std::endl;
std::cout << std::endl;
std::cout << "# Accounts" << std::endl;
std::cout << "# User Accounts" << std::endl;
std::cout << "> create-loginserver-account --username=* --password=*" << std::endl;
std::cout << std::endl;
std::cout << "# World Accounts" << std::endl;
std::cout << "> create-loginserver-world-admin-account --username=* --password=* --email=*" << std::endl;
std::cout << std::endl;
std::cout << std::endl;
}
@ -159,7 +172,7 @@ namespace LoginserverCommandHandler {
*/
void CreateLocalLoginserverAccount(int argc, char **argv, argh::parser &cmd)
{
if (cmd("--username").str().empty() || cmd("--username").str().empty()) {
if (cmd("--username").str().empty() || cmd("--password").str().empty()) {
LogInfo("Command Example: create-loginserver-account --username=user --password=password");
exit(1);
}
@ -167,4 +180,27 @@ namespace LoginserverCommandHandler {
AccountManagement::CreateLocalLoginServerAccount(cmd("--username").str(), cmd("--password").str());
}
/**
* @param argc
* @param argv
* @param cmd
*/
void CreateLoginserverWorldAdminAccount(int argc, char **argv, argh::parser &cmd)
{
if (
cmd("--username").str().empty() ||
cmd("--password").str().empty() ||
cmd("--email").str().empty()) {
LogInfo("Command Example: create-loginserver-account --username=user --password=password");
exit(1);
}
AccountManagement::CreateLoginserverWorldAdminAccount(
cmd("--username").str(),
cmd("--password").str(),
cmd("--email").str()
);
}
}

View File

@ -29,6 +29,7 @@ namespace LoginserverCommandHandler {
void CreateLoginserverApiToken(int argc, char **argv, argh::parser &cmd);
void ListLoginserverApiTokens(int argc, char **argv, argh::parser &cmd);
void CreateLocalLoginserverAccount(int argc, char **argv, argh::parser &cmd);
void CreateLoginserverWorldAdminAccount(int argc, char **argv, argh::parser &cmd);
};