Merge pull request #355 from ctrlaltca/servatrice_passwordauth

Servatrice password authentication
This commit is contained in:
Gavin Bisesi 2014-10-06 15:56:41 -04:00
commit faa66e4d7f
8 changed files with 148 additions and 13 deletions

View file

@ -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]
port=4747
statusupdate=15000
logfile=server.log
; This is the name that servatrice exposes to the users; the default value is pretty boring
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
; 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
; 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
; 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=""
[servernetwork]
active=0
port=14747
ssl_cert=ssl_cert.pem
ssl_key=ssl_key.pem
[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
; 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
[database]
; Database type. Valid values are:
; * none: no database;
; * mysql: mysql or compatible database;
type=none
; Prefix used in he database for table names; default is cockatrice
prefix=cockatrice
; Database connection parameter: server hostname or IP
hostname=localhost
; Database connection parameter: database name
database=servatrice
; Database connection parameter: database user
user=servatrice
; Database connection parameter: database user's password
password=foobar
[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
; Example configuration for a server with rooms configured in the configuration file. Number of rooms defined
roomlist\size=1
; Room name for the room number 1
roomlist\1\name="General room"
; Room description for the room number 1
roomlist\1\description="Play anything here."
; Wether to make users autojoin this room when connected to the server
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."
; Number of game types allowed (defined) in the room number 1
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\2\name="GameType2"
roomlist\1\game_types\3\name="GameType3"
[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
; 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]
; Maximum number of users that can connect from the same IP address; useful to avoid bots, default is 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
; Maximum size in characters of all messages in an interval before new messages gets dropped; default is 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
; Maximum number of games a single user can create; default is 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

View file

@ -208,3 +208,12 @@ CREATE TABLE `cockatrice_replays_access` (
KEY `id_game` (`id_game`)
) 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;

View file

@ -166,7 +166,7 @@ int main(int argc, char *argv[])
configPath = SettingsCache::guessConfigurationPath(configPath);
qWarning() << "Using configuration file: " << configPath;
settingsCache = new SettingsCache();
settingsCache = new SettingsCache(configPath);
loggerThread = new QThread;
loggerThread->setObjectName("logger");

View file

@ -141,9 +141,11 @@ bool Servatrice::initServer()
const QString authenticationMethodStr = settingsCache->value("authentication/method").toString();
if (authenticationMethodStr == "sql") {
authenticationMethod = AuthenticationSql;
} else if(authenticationMethodStr == "password") {
authenticationMethod = AuthenticationPassword;
} else {
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;
}
authenticationMethod = AuthenticationNone;

View file

@ -88,7 +88,7 @@ class Servatrice : public Server
{
Q_OBJECT
public:
enum AuthenticationMethod { AuthenticationNone, AuthenticationSql };
enum AuthenticationMethod { AuthenticationNone, AuthenticationSql, AuthenticationPassword };
private slots:
void statusUpdate();
void shutdownTimeout();

View file

@ -2,6 +2,7 @@
#include "servatrice_database_interface.h"
#include "passwordhasher.h"
#include "serversocketinterface.h"
#include "settingscache.h"
#include "decklist.h"
#include "pb/game_replay.pb.h"
#include <QDebug>
@ -92,6 +93,13 @@ AuthenticationResult Servatrice_DatabaseInterface::checkUserPassword(Server_Prot
{
switch (server->getAuthenticationMethod()) {
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: {
if (!checkSql())
return UnknownUser;

View file

@ -7,6 +7,12 @@
#include <QDesktopServices>
#endif
SettingsCache::SettingsCache(const QString & fileName, QSettings::Format format, QObject * parent)
:QSettings(fileName, format, parent)
{
}
QString SettingsCache::guessConfigurationPath(QString & specificPath)
{
const QString fileName="servatrice.ini";

View file

@ -9,7 +9,7 @@ class SettingsCache : public QSettings {
private:
QSettings *settings;
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);
};