Merge pull request #355 from ctrlaltca/servatrice_passwordauth
Servatrice password authentication
This commit is contained in:
commit
faa66e4d7f
8 changed files with 148 additions and 13 deletions
|
@ -1,50 +1,160 @@
|
||||||
|
; Servatrice configuration file
|
||||||
|
;
|
||||||
|
; This is the main configuration file for Servatrice; while using a configuration is not mandatory,
|
||||||
|
; you may want to customize some aspects of your servatrice instance, like its name, port or the way
|
||||||
|
; users can authenticate to the server.
|
||||||
|
|
||||||
|
|
||||||
[server]
|
[server]
|
||||||
port=4747
|
|
||||||
statusupdate=15000
|
; This is the name that servatrice exposes to the users; the default value is pretty boring
|
||||||
logfile=server.log
|
|
||||||
name="My Cockatrice server"
|
name="My Cockatrice server"
|
||||||
|
|
||||||
|
; Multiple servatrice servers can run on the same host using the same database; each server instance
|
||||||
|
; must have a different id; the default id is 1
|
||||||
id=1
|
id=1
|
||||||
|
|
||||||
|
; The TCP port number servatrice will listen on for clients; default is 4747
|
||||||
|
port=4747
|
||||||
|
|
||||||
|
; Servatrice can scale up to serve big number of users using more than one parallel thread of execution;
|
||||||
|
; If your server is hosting a lot of players and they frequently report of being unable to login or
|
||||||
|
; long delays (lag), you may want to try increasing this value; default is 1.
|
||||||
number_pools=1
|
number_pools=1
|
||||||
|
|
||||||
|
; When database is enabled, servatrice writes the server status in the "update" database table; this
|
||||||
|
; setting defines every how many milliseconds servatrice will update its status; default is 15000 (15 secs)
|
||||||
|
statusupdate=15000
|
||||||
|
|
||||||
|
; Do you want servatrice to write important events and errors to a logfile? Default is 1 (yes).
|
||||||
writelog=1
|
writelog=1
|
||||||
|
|
||||||
|
; Choose a name for the log file, if enabled; you can specify an absolute path or a path relative to
|
||||||
|
; the servatrice executable; the default file name is server.log (in the same path as servatrice)
|
||||||
|
logfile=server.log
|
||||||
|
|
||||||
|
; You may want to silence some commonly recurring messages in the logfile. This setting can contain a
|
||||||
|
; comma-separed list of words; if any message that is about to be logged contains at least one of these words,
|
||||||
|
; it won't be logged. Default is empty; example: "kittens,ponies,faires"
|
||||||
logfilters=""
|
logfilters=""
|
||||||
|
|
||||||
[servernetwork]
|
|
||||||
active=0
|
|
||||||
port=14747
|
|
||||||
ssl_cert=ssl_cert.pem
|
|
||||||
ssl_key=ssl_key.pem
|
|
||||||
|
|
||||||
[authentication]
|
[authentication]
|
||||||
|
|
||||||
|
; Servatrice can authenticate users connecting. It currently supports 3 different authentication methods:
|
||||||
|
; * none: no authentication, accept every user;
|
||||||
|
; * password: require users to specify a common password to log in;
|
||||||
|
; * sql: authenticate users against the "users" table of the database;
|
||||||
|
; Please note that only the "sql" method permits to have registered users and store their data on the server.
|
||||||
method=none
|
method=none
|
||||||
|
|
||||||
|
; if the chosen authentication method is password, here you can define the password your users will use to log in
|
||||||
|
password=123456
|
||||||
|
|
||||||
|
; Accept only registered users? default is 0 (accept unregistered users)
|
||||||
regonly=0
|
regonly=0
|
||||||
|
|
||||||
|
|
||||||
[database]
|
[database]
|
||||||
|
|
||||||
|
; Database type. Valid values are:
|
||||||
|
; * none: no database;
|
||||||
|
; * mysql: mysql or compatible database;
|
||||||
type=none
|
type=none
|
||||||
|
|
||||||
|
; Prefix used in he database for table names; default is cockatrice
|
||||||
prefix=cockatrice
|
prefix=cockatrice
|
||||||
|
|
||||||
|
; Database connection parameter: server hostname or IP
|
||||||
hostname=localhost
|
hostname=localhost
|
||||||
|
|
||||||
|
; Database connection parameter: database name
|
||||||
database=servatrice
|
database=servatrice
|
||||||
|
|
||||||
|
; Database connection parameter: database user
|
||||||
user=servatrice
|
user=servatrice
|
||||||
|
|
||||||
|
; Database connection parameter: database user's password
|
||||||
password=foobar
|
password=foobar
|
||||||
|
|
||||||
[rooms]
|
[rooms]
|
||||||
|
|
||||||
|
; A servtrice server can expose to the users different "rooms" to chat and create games. Rooms can be defined
|
||||||
|
; with two different methods:
|
||||||
|
; config: rooms are defined in this configuration (see the following example)
|
||||||
|
; sql: rooms are defined in the "rooms" table of the database
|
||||||
method=config
|
method=config
|
||||||
|
|
||||||
|
; Example configuration for a server with rooms configured in the configuration file. Number of rooms defined
|
||||||
roomlist\size=1
|
roomlist\size=1
|
||||||
|
|
||||||
|
; Room name for the room number 1
|
||||||
roomlist\1\name="General room"
|
roomlist\1\name="General room"
|
||||||
|
|
||||||
|
; Room description for the room number 1
|
||||||
roomlist\1\description="Play anything here."
|
roomlist\1\description="Play anything here."
|
||||||
|
|
||||||
|
; Wether to make users autojoin this room when connected to the server
|
||||||
roomlist\1\autojoin=true
|
roomlist\1\autojoin=true
|
||||||
|
|
||||||
|
; Message displayed to each user when he joins room number 1
|
||||||
roomlist\1\joinmessage="This message is only here to show that rooms can have a join message."
|
roomlist\1\joinmessage="This message is only here to show that rooms can have a join message."
|
||||||
|
|
||||||
|
; Number of game types allowed (defined) in the room number 1
|
||||||
roomlist\1\game_types\size=3
|
roomlist\1\game_types\size=3
|
||||||
|
|
||||||
|
; Name of the three game types for the room number 1
|
||||||
roomlist\1\game_types\1\name="GameType1"
|
roomlist\1\game_types\1\name="GameType1"
|
||||||
roomlist\1\game_types\2\name="GameType2"
|
roomlist\1\game_types\2\name="GameType2"
|
||||||
roomlist\1\game_types\3\name="GameType3"
|
roomlist\1\game_types\3\name="GameType3"
|
||||||
|
|
||||||
|
|
||||||
[game]
|
[game]
|
||||||
max_game_inactivity_time=120
|
|
||||||
|
; Maximum time in seconds a player can stay inactive, with his client hot even responding to pings, before is
|
||||||
|
; considered disconnected; default is 15
|
||||||
max_player_inactivity_time=15
|
max_player_inactivity_time=15
|
||||||
|
|
||||||
|
; Maximum time in seconds all players in a game can stay inactive before the game is automatically closed;
|
||||||
|
; default is 120
|
||||||
|
max_game_inactivity_time=120
|
||||||
|
|
||||||
|
|
||||||
[security]
|
[security]
|
||||||
|
|
||||||
|
; Maximum number of users that can connect from the same IP address; useful to avoid bots, default is 4
|
||||||
max_users_per_address=4
|
max_users_per_address=4
|
||||||
|
|
||||||
|
; Servatrice can avoid users from flooding rooms with large number messages in an interval of time.
|
||||||
|
; This setting defines the length in seconds of the considered interval; default is 10
|
||||||
message_counting_interval=10
|
message_counting_interval=10
|
||||||
|
|
||||||
|
; Maximum size in characters of all messages in an interval before new messages gets dropped; default is 1000
|
||||||
max_message_size_per_interval=1000
|
max_message_size_per_interval=1000
|
||||||
|
|
||||||
|
; Maximum number of messages in an interval before new messages gets dropped; default is 10
|
||||||
max_message_count_per_interval=10
|
max_message_count_per_interval=10
|
||||||
|
|
||||||
|
; Maximum number of games a single user can create; default is 5
|
||||||
max_games_per_user=5
|
max_games_per_user=5
|
||||||
|
|
||||||
|
|
||||||
|
; EXPERIMENTAL - NOT WORKING YET
|
||||||
|
; The following settings are relative to the server network functionality, that is not yet complete.
|
||||||
|
; Avoid enabling it unless you are willing to test it and help its development.
|
||||||
|
|
||||||
|
[servernetwork]
|
||||||
|
|
||||||
|
; Servatrice servers can connect themselves and build a network. This settins enable the ability of servatrice
|
||||||
|
; of waiting for other server's connections and connect to other servers. Other servers can be defined in the
|
||||||
|
; "servers" table of the database. Default is 0 (disabled)
|
||||||
|
active=0
|
||||||
|
|
||||||
|
; The TCP port number servatrice will listen on for other servers; default is 14747
|
||||||
|
port=14747
|
||||||
|
|
||||||
|
; Server-to-server communication needs a valid certificate in PEM format. Enter its filename in this setting
|
||||||
|
ssl_cert=ssl_cert.pem
|
||||||
|
|
||||||
|
; Filename of the private key for the server-to-server certificate
|
||||||
|
ssl_key=ssl_key.pem
|
||||||
|
|
|
@ -208,3 +208,12 @@ CREATE TABLE `cockatrice_replays_access` (
|
||||||
KEY `id_game` (`id_game`)
|
KEY `id_game` (`id_game`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `cockatrice_rooms` (
|
||||||
|
`id` int(7) unsigned NOT NULL auto_increment,
|
||||||
|
`name` varchar(50) NOT NULL,
|
||||||
|
`descr` varchar(255) NOT NULL,
|
||||||
|
`autojoin` tinyint(1) default 0,
|
||||||
|
`join_message` varchar(255) NOT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
configPath = SettingsCache::guessConfigurationPath(configPath);
|
configPath = SettingsCache::guessConfigurationPath(configPath);
|
||||||
qWarning() << "Using configuration file: " << configPath;
|
qWarning() << "Using configuration file: " << configPath;
|
||||||
settingsCache = new SettingsCache();
|
settingsCache = new SettingsCache(configPath);
|
||||||
|
|
||||||
loggerThread = new QThread;
|
loggerThread = new QThread;
|
||||||
loggerThread->setObjectName("logger");
|
loggerThread->setObjectName("logger");
|
||||||
|
|
|
@ -141,9 +141,11 @@ bool Servatrice::initServer()
|
||||||
const QString authenticationMethodStr = settingsCache->value("authentication/method").toString();
|
const QString authenticationMethodStr = settingsCache->value("authentication/method").toString();
|
||||||
if (authenticationMethodStr == "sql") {
|
if (authenticationMethodStr == "sql") {
|
||||||
authenticationMethod = AuthenticationSql;
|
authenticationMethod = AuthenticationSql;
|
||||||
|
} else if(authenticationMethodStr == "password") {
|
||||||
|
authenticationMethod = AuthenticationPassword;
|
||||||
} else {
|
} else {
|
||||||
if (regServerOnly) {
|
if (regServerOnly) {
|
||||||
qDebug() << "Registration only server enabled but no DB Connection : Error.";
|
qDebug() << "Registration only server enabled but no authentication method defined: Error.";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
authenticationMethod = AuthenticationNone;
|
authenticationMethod = AuthenticationNone;
|
||||||
|
|
|
@ -88,7 +88,7 @@ class Servatrice : public Server
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
enum AuthenticationMethod { AuthenticationNone, AuthenticationSql };
|
enum AuthenticationMethod { AuthenticationNone, AuthenticationSql, AuthenticationPassword };
|
||||||
private slots:
|
private slots:
|
||||||
void statusUpdate();
|
void statusUpdate();
|
||||||
void shutdownTimeout();
|
void shutdownTimeout();
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include "servatrice_database_interface.h"
|
#include "servatrice_database_interface.h"
|
||||||
#include "passwordhasher.h"
|
#include "passwordhasher.h"
|
||||||
#include "serversocketinterface.h"
|
#include "serversocketinterface.h"
|
||||||
|
#include "settingscache.h"
|
||||||
#include "decklist.h"
|
#include "decklist.h"
|
||||||
#include "pb/game_replay.pb.h"
|
#include "pb/game_replay.pb.h"
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
@ -92,6 +93,13 @@ AuthenticationResult Servatrice_DatabaseInterface::checkUserPassword(Server_Prot
|
||||||
{
|
{
|
||||||
switch (server->getAuthenticationMethod()) {
|
switch (server->getAuthenticationMethod()) {
|
||||||
case Servatrice::AuthenticationNone: return UnknownUser;
|
case Servatrice::AuthenticationNone: return UnknownUser;
|
||||||
|
case Servatrice::AuthenticationPassword: {
|
||||||
|
QString configPassword = settingsCache->value("authentication/password").toString();
|
||||||
|
if (configPassword == password)
|
||||||
|
return PasswordRight;
|
||||||
|
|
||||||
|
return NotLoggedIn;
|
||||||
|
}
|
||||||
case Servatrice::AuthenticationSql: {
|
case Servatrice::AuthenticationSql: {
|
||||||
if (!checkSql())
|
if (!checkSql())
|
||||||
return UnknownUser;
|
return UnknownUser;
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
#include <QDesktopServices>
|
#include <QDesktopServices>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
SettingsCache::SettingsCache(const QString & fileName, QSettings::Format format, QObject * parent)
|
||||||
|
:QSettings(fileName, format, parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
QString SettingsCache::guessConfigurationPath(QString & specificPath)
|
QString SettingsCache::guessConfigurationPath(QString & specificPath)
|
||||||
{
|
{
|
||||||
const QString fileName="servatrice.ini";
|
const QString fileName="servatrice.ini";
|
||||||
|
|
|
@ -9,7 +9,7 @@ class SettingsCache : public QSettings {
|
||||||
private:
|
private:
|
||||||
QSettings *settings;
|
QSettings *settings;
|
||||||
public:
|
public:
|
||||||
SettingsCache(const QString & fileName="servatrice.ini", QSettings::Format format=QSettings::IniFormat, QObject * parent = 0) { };
|
SettingsCache(const QString & fileName="servatrice.ini", QSettings::Format format=QSettings::IniFormat, QObject * parent = 0);
|
||||||
static QString guessConfigurationPath(QString & specificPath);
|
static QString guessConfigurationPath(QString & specificPath);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue