From ac77a4a3c1b7a989409507e6ced95c400eeacc54 Mon Sep 17 00:00:00 2001 From: Christian Daniel Jensen Date: Mon, 2 Nov 2026 05:03:25 -0700 Subject: [PATCH] Provide native Continuum-Servatrice configuration and isolated SQL schema --- servatrice/continuum-servatrice.ini.example | 593 ++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 servatrice/continuum-servatrice.ini.example diff --git a/servatrice/continuum-servatrice.ini.example b/servatrice/continuum-servatrice.ini.example new file mode 100644 index 000000000..e2308d25e --- /dev/null +++ b/servatrice/continuum-servatrice.ini.example @@ -0,0 +1,593 @@ +; Continuum-Servatrice configuration file +; +; This is the main configuration file for Continuum-Servatrice; while using a configuration is not mandatory, +; you may want to customize some aspects of your continuum-servatrice instance, like its name, port or the way +; users can authenticate to the server. +; +; Can be passed to continuum-servatrice with --config /path/to/continuum-servatrice.ini + +[server] + +; This is the name that continuum-servatrice exposes to the users; the default value is pretty boring +name="My Continuum-Servatrice server" + +; Multiple continuum-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 IP address continuum-servatrice will listen on for clients; defaults to "any" to listen on all the interfaces, +; a specific IPv4/v6 addresses can be used, eg for localhost-only 127.0.0.1 for IPv4 or ::1 for IPv6. + +host=any + +; The TCP port number Continuum-Servatrice will listen on for clients; default is 4747; +; Will be removed in the future, use websocket connection instead +port=4757 + +; Continuum-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. +; Set to 0 to disable the tcp server. +number_pools=1 + +; Continuum-Servatrice can listen for clients on websockets, too. Multiple connection pools are available but +; unfortunately, due to a Qt limitation, they must run in the same execution thread. +; Set to 0 to disable the websocket server. +websocket_number_pools=1 + +; The IP address continuum-servatrice will listen on for websockets clients; defaults to "any" +websocket_host=any + +; The TCP port number continuum-servatrice will listen on for websockets clients; default is 4748 +websocket_port=4758 + +; If websockets are served through a reverse proxy (e.g. nginx), the real client address can be +; read from an HTTP header such as X-Real-IP or X-Forwarded-For. A comma-separated X-Forwarded-For +; list resolves to its rightmost entry, which is the one the proxy appended. The header is ONLY +; trusted when the websocket connection itself originates from an address listed in +; security/trusted_sources (default 127.0.0.1,::1), so that clients cannot spoof their address to +; bypass bans or rate limits. +web_socket_ip_header= + +; When database is enabled, continuum-servatrice writes the server status in the "update" database table; this +; setting defines every how many milliseconds continuum-servatrice will update its status; default is 15000 (15 secs) +statusupdate=15000 + +; Do you want continuum-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 continuum-servatrice executable; the default file name is server.log (in the same path as continuum-servatrice) +; Note: When running continuum-servatrice under windows you will need to use double backslashes between folder locations +; [ex: C:\\Temp\\server.log ] +logfile=continuum-servatrice.log + +; You may want to log only certain messages in the logfile. The default log level is extremely verbose. +; This setting should contain a comma-separated list of strings that will be selectively logged. +; All other lines will be excluded from the log. Default is empty; example: "Registration,_Login,foobar" +logfilters="" + +; Set the time interval in seconds that continuum-servatrice will use to communicate with each connected client +; to verify the client has not timed out. Defaults is 1 seconds +clientkeepalive=1 + +; Maximum time in seconds a player can stay inactive with there client not even responding to pings, before is +; considered disconnected; default is 15 +max_player_inactivity_time=15 + +; More modern clients generate client IDs based on specific client side information. Enable this option to +; require that clients report the client ID in order to log into the server. Default is false +requireclientid=false + +; You can limit the types of clients that connect to the server by requiring different features be available +; on the client. This setting can contain a comma-seperated list of features. if any of the features +; listed in this line are not available on the client the client will be denied access to the server upon +; attempting to log in. Example: "client_id,client_ver,websocket" +requiredfeatures="" + +; You can define custom warnings that users are sent when the moderation staff uses the right client warn user +; menu option. This list is comma seperated that each item will appear in the drop down list for staff members +; to choose from. Each entry may optionally carry a recommended starting intervention level (see the moderator +; guide) by appending "|" and the level number. Entries without an explicit level default to intervention +; level 1. Example: "Flaming,Foul Language" +officialwarnings="Abusive Language|1,Calling Out User|1,Causing Drama|1,Cheating|2,Disrespecting Staff|1,Disrupting a Draft|1,Inappropriate Avatar|3,Inappropriate Game Name|1,Kicking Without Valid Reason|1,Spamming|1,Targeted Harassment|2" + +; Maximum time in seconds a player can stay connected but idle. Default is 3600 (0 = disabled) +; Clients will be notified at the 90% time period of pending disconnection if they do not take action. +idleclienttimeout=3600 + +[authentication] + +; Continuum-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 false (accept unregistered users) +regonly=false + +[users] + +; The minimum length a username can be +minnamelength=6 + +; The maximum length a username can be +maxnamelength=12 + +; If a username should be allowed to contain lowercase chars [a-z] +allowlowercase=true + +; If a username should be allowed to conatain uppercase chars [A-Z] +allowuppercase=true + +; If a username should be allowed to contain numbers [0-9] +allownumerics=true + +; Define punctuation allowed in usernames +allowedpunctuation=_.- + +; If a username can begin with punctuation defined in allowedpunctuation +allowpunctuationprefix=false + +; Disallow usernames containing these words. This list is comma seperated, e.g. +; "admin,user,name" +disallowedwords="admin" + +; Overwrite the words shown to the user when they enter a wrong username, +; use \n to start a new line. Neither the real wordlist nor the disallowed +; expressions will be sent to the user if this is set. +; In the old versions of the client this list will be prefaced with +; "can not contain any of the following words:" +; example: +;displaydisallowedwords="no attempts at impersonating staff\nno unparliamentary language\nno references to controversial figures\nstaff reserves the right to remove accounts deemed inappropriate" +; Setting it to nothing will simply hide the list: +;displaydisallowedwords= + +; Disallow usernames matching these regular expressions. This list is comma +; separated, e.g. "\\w+\\d+,\\d{2}user", hence you cannot use commas in your +; expressions. Backslashes must be escaped, so `\w+\d+` becomes `\\w+\\d+`. +; WARNING: Complex expressions can be harmful to performance. Please make sure +; your expressions are considered well formed. See this page for info: +; http://www.regular-expressions.info/catastrophic.html +disallowedregexp="" + +; Define minimum password length +; Default 6. +minpasswordlength = 6 + +[registration] + +; Continuum-Servatrice can process registration requests to add new users on the fly. +; Enable this feature? Default false. +;enabled=false + +; Require users to provide an email address in order to register. Default true. +;requireemail=true + +; Require email activation. Newly registered users will receive an activation token by email, +; and will be required to input back this token on cockatrice at the first login to get their +; account activated. Default true. +;requireemailactivation=true + +; Set this number to the maximum number of accounts any one user can use to create new accounts +; using the same email address. 0 = Unlimited number of accounts (default). +;maxaccountsperemail=0 + +; You can prevent users from using certain mail domains for registration. This setting contains a +; comma-seperated list of email provider domains that you would like to prevent users from using +; during registration. Comparison's are implicit, so placing an entry such as mail.com will also +; prevent users from registering accounts with providers such as gmail.com and hotmail.com +; Example: "10minutemail.com,gmail.com" +;emailproviderblacklist="" + +; You can require users to only use certain email domains for registration. This setting is a +; comma-separated list of email provider domains that you have explicitly audited and require +; the use of in order to create an account. Comparison's are explicit, so you must specify the +; domain in completion, such as gmail.com and hotmail.com. Email whitelist is checked before +; Email blacklist is checked, so an email cannot be in both setting configurations. +; Example: "gmail.com,hotmail.com,icloud.com" +;emailproviderwhitelist="" + +[forgotpassword] + +; Continuum-Servatrice can process reset password requests allowing users to reset their account +; passwords in the event they forget it. Should this feature be enabled? Default: false. +; enable=false + +; Reset password request should not be allowed to stay valid forever. This settings +; informs continuum-servatrice how long a players reset password reset token is valid for (in minutes). +; Default: 60 +; tokenlife=60 + +; Continuum-Servatrice can challenge users that are making reset password requests to answer +; questions in regards to their account to help validate they are the true owner of the account. +; Should this feature be enabled? Default: false +; enablechallenge=false + +; Email subject for the reset password emails +; subject="Continuumatrice reset password token" + +; Reset password email body. You can use these tags here: %username %token +; They will be substituted with the actual values in the email +; +; body="Hi %username,\r\nthanks for reaching out to us with your password reset request for our Continuumatrice server.\r\nHere's your unique token in order to reset your account password in the app:\r\n\r\n%token\r\n\r\nHappy gaming!" + + +[smtp] + +; Enable the internal smtp client to send registration emails. If you would like to +; use some other method to send email activation tokens set this value to false. Otherwise +; setting it to true (default) the server will send canned generated emails containing +; activation tokens for you during update intervals. Setting this to false will require +; you to either manually activate user accounts or manually send users the activation token +; by whatever means. +enableinternalsmtpclient=true + +; Connectin type: currently supported method are "tcp" and "ssl"; tls is autodetected if available +connection=tcp + +; Accept all certificates: in ssl mode, enable this if your server is using an invalid/self signed certificate +acceptallcerts=false; + +; Hostname or IP addres of the smtp server +host=localhost + +; Smtp port number of the smtp server. Usual values are 25 or 587 for tcp, 465 for ssl +port=25 + +; Username: this typically matches the "from" email address +username=root@localhost + +; Password for the username +password=foobar + +; Sender email address: the "from" email address +email=root@localhost + +; Sender email name +name="Continuumatrice server" + +; Maximum number of attempts to deliver a given e-mail before giving up. +; If the smtp server is unreachable or repeatedly rejects a message, the server +; will retry with an exponentially growing delay up to this many times, then drop +; the message from the queue and log the failure. Default: 5 +maxretries=5 + +; Initial retry delay in seconds between delivery attempts. Doubles with each +; failed attempt (capped at 30 minutes). Default: 60 +retrydelay=60 + +; Email subject +subject="Continuumatrice server account activation token" + +; Email body. You can use these tags here: %username %token +; They will be substituted with the actual values in the email +; +body="Hi %username, thank our for registering on our Continuumatrice server\r\nHere's the activation token you need to supply for activating your account:\r\n\r\n%token\r\n\r\nHappy gaming!" + +[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=continuum_servatrice + +; Database connection parameter: server hostname or IP +hostname=localhost + +; Database connection parameter: database name +database=continuum-servatrice + +; Database connection parameter: database user +user=continuum-servatrice + +; Database connection parameter: database user's password +password=foobar + +[rooms] + +; A continuum-servatrice 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." + +; Rooms can restrict the level of user that can join. Current supported options are none, registered, moderator, administrator. +; Default is none. +roomlist\1\permissionlevel=none + +; Rooms can restrict the permission level of users that can join, Currnetly supported options are none, privileged, vip, and donator. +; Default is none. +roomlist\1\privilegelevel=none + +; 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." + +; The number of chat history messages to save that gets presented to a user joining the room +roomlist\1\chathistorysize=100 + +; 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" + +; Optional chat channels for room number 1, in addition to the implicit Main +; channel every room has. Each channel needs a stable ASCII id, a display name +; (server data, like the room name) and an access level. Supported levels, from +; least to most restrictive, are: public, registered, judge, moderator, admin +; and developer. Access is evaluated against the member's user flags, not as a +; ladder: a moderator channel admits moderators (admins hold the moderator +; flag alongside the admin flag, so they are admitted too), an admin channel +; admits only admins, and a developer channel admits only developers and +; admins. In particular, developers cannot read moderator or admin channels. +; A judge channel additionally admits moderators. +; Public channels are visible to every room member. +; +; Write access defaults to the read level, so by default a channel is readable +; and writable by the same members. Set writeaccess higher for read-mostly +; channels (e.g. a developer news feed readable by everyone but writable only +; by developers). Members who can read but not write see the channel with a +; disabled message input. +; +; banner is an optional static notice shown at the top of the channel, similar +; to the room joinmessage on Main. Empty or unset = none. +roomlist\1\channels\size=3 +roomlist\1\channels\1\id=looking-for-players +roomlist\1\channels\1\displayname="Looking for players" +roomlist\1\channels\1\access=public +roomlist\1\channels\1\banner="Find opponents here. Be friendly!" +roomlist\1\channels\2\id=moderators +roomlist\1\channels\2\displayname="Moderators" +roomlist\1\channels\2\access=moderator +roomlist\1\channels\3\id=developer-news +roomlist\1\channels\3\displayname="Developer news" +roomlist\1\channels\3\access=public +roomlist\1\channels\3\writeaccess=developer +roomlist\1\channels\3\banner="Official announcements from the developers." + + +[game] + +; 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 + +; All actions during a game are recorded and stored in the database as a replay that all participants of +; the game can go back to and review after the game is closed. This can require a fairly large amount of +; storage to save all the information. Disable this option to prevent the storing of replay data in +; the database. Default value is true. +store_replays=true + +; Allow users to create a new game and join it as a judge. The host will be able to execute any action on +; the cards of every player. This is needed in order to support some games (eg. Werewolf). +; Default off to prevent abuse on servers that are mostly running other games. +allow_create_as_judge=false + +[security] +; You may want to restrict the number of users that can connect to your server at any given time. +enable_max_user_limit=false + +; Maximum number of users that can connect to the server, default is 500. +max_users_total=500 + +; Maximum number of users that can connect to the server using a tcp connection, default is 500. +max_users_tcp=500 + +; Maximum number of users that can connect to the server using a websocket connection, default is 500. +max_users_websocket=500 + +; Maximum number of users that can connect from the same IP address; useful to avoid bots, default is 4 +max_users_per_address=4 + +; Maximum number of failed login attempts from a single IP address before that +; address is temporarily locked out. Default is 5; set to 0 to disable. +max_login_attempts_per_ip=5 + +; Length in seconds of the sliding window used for the login lockout. Default is 900 (15 minutes). +login_attempt_window_seconds=900 + +; Maximum number of account registrations from a single IP address within the window below. +; Default is 2; set to 0 to disable. +max_registrations_per_ip=2 + +; Length in seconds of the registration window. Default is 3600 (1 hour). +registration_window_seconds=3600 + +; Maximum number of forgot-password requests from a single IP address within the window below. +; Default is 3; set to 0 to disable. +max_forgot_password_requests_per_ip=3 + +; Length in seconds of the forgot-password window. Default is 3600 (1 hour). +forgot_password_window_seconds=3600 +; How strictly new authentication features are enforced. Possible values: +; * legacy: accounts that still use the legacy 1000-round SHA-512 hash keep logging in with it +; (they are served the legacy salt, never a challenge-response nonce) and are never +; auto-migrated to scrypt. Already-migrated scrypt rows keep logging in via +; challenge-response. New credentials may use either format; +; * mixed: accept both legacy hashes and challenge-response authentication (default); +; * strict: only accept challenge-response authentication from clients that support it, +; and reject plain password submissions. Legacy accounts are migrated to scrypt +; automatically on their next successful login. Strict only constrains +; registered SQL accounts: guest/unregistered logins and servers with +; authentication/method set to none or password are unaffected, since +; they have no stored verifier to challenge against. +; +; Note: anyone holding only the legacy salt+hash of a not-yet-migrated account +; (e.g. from a wire capture of an old client, or an old database dump) can log in +; with it and then set a brand new password of their choosing. Before +; challenge-response a captured hash yielded a session, but changing the password +; still required the plaintext old password. There is no way around this without +; a plaintext proof at migration time, so not-yet-migrated rows should be treated +; accordingly. +; +; Challenge-response verifiers are scrypt (RFC 7914, N=32768, r=8, p=1) stored as +; "$scrypt$$$

$$". The stored verifier is password-equivalent: +; plaintext passwords never reach the client configuration and never go over the wire, but +; a database dump yields credentials that can answer a login challenge directly. +authentication_strictness=mixed + +; Optional key that seals the legacy password backup (64 hex characters). +; Migrating an account to scrypt normally strands old clients, which can only present +; the legacy hash. With a key configured, the server keeps that hash encrypted next to +; the scrypt verifier, so old clients can still log in during the window below without +; the database holding a fast-crackable hash in the clear. +; Generate with: openssl rand -hex 32 +; If unset there is no downgrade path at all: a migrated account keeps only a scrypt +; verifier, and an administrator's password reset stores a verifier too, so pre-challenge +; clients cannot log in with the temporary password either. Set the key if you still serve +; them. Rotating the key invalidates existing backups (they become unusable immediately; +; expired ones are still purged). +legacy_backup_key= + +; Days a legacy password backup may go unused before it is purged from the database. +; Logging in with an old client refreshes the window; backups that are never touched +; age out. Default 180. +legacy_backup_ttl_days=180 + +; You may want to allow an unlimited number of users from a trusted source. This setting can contain a +; comma-separed list of IP addresses which will allow an unlimited number of connections from each of the +; IP addresses listed (ignoring the max_users_per_address). Entries must be exact IP addresses; hostnames, prefixes +; and subnets are ignored. Default is "127.0.0.1,::1"; example: "192.73.233.244,81.4.100.74" +trusted_sources="127.0.0.1,::1" + +; Continuum-Servatrice can avoid users from flooding rooms with large number of 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; set to -1 to disable; 0 disallows game creation +max_games_per_user=5 + +; Continuum-Servatrice can avoid users from flooding games with large number of game commands in an interval of time. +; This setting defines the length in seconds of the considered interval; default is 10 +command_counting_interval=10 + +; Maximum number of game commands in an interval before new commands gets dropped; default is 20 +max_command_count_per_interval=20 + +[reporting] +; Maximum number of user reports a single user can file per day; default is 10; set to 0 to disable the limit +max_reports_per_day=10 + +; Maximum number of report comments a single user can post per hour; default is 30; set to 0 to disable the limit +max_comments_per_hour=30 + +[metrics] +; Command containers that take longer than this many milliseconds are logged +; as slow commands. Set to 0 to disable the log line. A latency spike produces +; one warning per slow container with no rate limiting of its own -- a bad +; patch can briefly flood the log, which is how you notice it. +slow_command_ms=500 + +; Each socket pool thread runs a watchdog heartbeat. If a heartbeat arrives +; this many milliseconds late, the stall is logged and exposed as +; continuum-servatrice_eventloop_* metrics in the Developer tab. Set to 0 to disable +; the watchdogs. +stall_warn_ms=2000 + +[logging] +; Admin/Moderators can query the stored logs for information when looking up reports by various players. This +; option can allow or disallow them from doing so. +; !!NOTE!! Enabling this feature puts a very high CPU and DISK load on the server, enable with caution. +enablelogquery=false + +; Continuum-Servatrice can log user messages to the database table cockatrice_log. +; These messages can come from different sources; each source can be enabled separately. + +; Log user messages inside chat rooms +log_user_msg_room=false + +; Log user messages inside games +log_user_msg_game=false + +; Log user messages in private chats +log_user_msg_chat=false + +; Log user messages coming from other servers in the network +log_user_msg_isl=false + +[audit] + +; Continuum-Servatrice can record certain actions being performed in the database for server operators to better understand +; if some one may be abusing application functionality. Enabling auditing will allow continuum-servatrice to record any +; of the below enabled audit functionality to be recorded. +; Default: true +enable_audit=true + +; Continuum-Servatrice can record when users attempt a new account registration. Should we enable auditing for this action? +; Default: true +enable_registration_audit=true + +; Continuum-Servatrice can record when a users attempts to reset the account password. Should we enable auditing for this action? +; Default: true +enable_forgotpassword_audit=true + + +; 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] + +; Continuum-Servatrice servers can connect themselves and build a network. This settins enable the ability of continuum-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 Continuum-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 + + +[deck_share] + +; How many days a created deck share link remains valid before it expires. +; Default: 7 +expiry_days=7 + +; How often (in minutes) the server checks for and removes expired deck shares. +; A value of 0 disables the automatic cleanup. +; Default: 60 +cleanup_interval=60 + +; Maximum number of decks a single share link can contain. +; Default: 50 +max_decks_per_share=50 + +; Maximum number of share links a single user may create per day. +; A value of 0 disables the limit. +; Default: 50 +max_shares_per_day=50