Move auth tokens to server config.
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -91,3 +91,5 @@ ENV/
|
|||||||
|
|
||||||
.idea
|
.idea
|
||||||
install.txt
|
install.txt
|
||||||
|
Screenshots/
|
||||||
|
.vscode
|
||||||
@@ -102,6 +102,13 @@ def create_death(app: 'gtk_ui.GtkUi'):
|
|||||||
:param app: Main Gtk application
|
:param app: Main Gtk application
|
||||||
:return: Death object or None if dialog was canceled
|
:return: Death object or None if dialog was canceled
|
||||||
"""
|
"""
|
||||||
|
# Set penalties
|
||||||
|
default_drink = app.drinks.data[0].name
|
||||||
|
store = app.ui.get_object('player_penalties_store')
|
||||||
|
store.clear()
|
||||||
|
for player in app.ui.get_object('episode_players_store'):
|
||||||
|
store.append([None, player[1], default_drink, player[0]])
|
||||||
|
|
||||||
# Run the dialog
|
# Run the dialog
|
||||||
dialog = app.ui.get_object("edit_death_dialog") # type: Gtk.Dialog
|
dialog = app.ui.get_object("edit_death_dialog") # type: Gtk.Dialog
|
||||||
result = dialog.run()
|
result = dialog.run()
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ class DialogHandlers:
|
|||||||
|
|
||||||
def do_add_enemy(self, entry):
|
def do_add_enemy(self, entry):
|
||||||
if entry.get_text():
|
if entry.get_text():
|
||||||
store = self.app.ui.get_object('enemy_season_store')
|
|
||||||
enemy = models.Enemy()
|
enemy = models.Enemy()
|
||||||
enemy.name = entry.get_text()
|
enemy.name = entry.get_text()
|
||||||
enemy.season = self.app.get_selected_season_id()
|
enemy.season = self.app.get_selected_season_id()
|
||||||
|
|||||||
@@ -96,12 +96,22 @@ def reload_episode_stats(app: 'gtk_ui.GtkUi'):
|
|||||||
drink_count = sum(len(death.penalties) for death in episode.deaths)
|
drink_count = sum(len(death.penalties) for death in episode.deaths)
|
||||||
app.ui.get_object('ep_drinks_label').set_text(str(drink_count))
|
app.ui.get_object('ep_drinks_label').set_text(str(drink_count))
|
||||||
app.ui.get_object('ep_player_drinks_label').set_text(str(len(episode.deaths)))
|
app.ui.get_object('ep_player_drinks_label').set_text(str(len(episode.deaths)))
|
||||||
|
|
||||||
|
# Compute booze stats
|
||||||
dl_booze = sum(len(death.penalties) * death.penalties[0].size for death in episode.deaths)
|
dl_booze = sum(len(death.penalties) * death.penalties[0].size for death in episode.deaths)
|
||||||
l_booze = round(dl_booze / 10, 2)
|
l_booze = round(dl_booze / 10, 2)
|
||||||
|
player_ml_booze = round((dl_booze * 100) / len(episode.players), 2)
|
||||||
app.ui.get_object('ep_booze_label').set_text('{}l'.format(l_booze))
|
app.ui.get_object('ep_booze_label').set_text('{}l'.format(l_booze))
|
||||||
dl_booze = sum(len(death.penalties) * death.penalties[0].size for death in episode.deaths)
|
app.ui.get_object('ep_player_booze_label').set_text('{}ml'.format(player_ml_booze))
|
||||||
ml_booze = round(dl_booze * 10, 0)
|
|
||||||
app.ui.get_object('ep_player_booze_label').set_text('{}ml'.format(ml_booze))
|
# Compute pure alc stats
|
||||||
|
deaths = episode.deaths
|
||||||
|
dl_alc = 0
|
||||||
|
for death in deaths:
|
||||||
|
dl_alc += sum((penalty.size / 100) * penalty.drink.vol for penalty in death.penalties)
|
||||||
|
ml_alc = round(dl_alc * 100, 2)
|
||||||
|
app.ui.get_object('ep_alc_label').set_text('{}ml'.format(ml_alc))
|
||||||
|
# Compute hardest enemy stats
|
||||||
enemy_list = [death.enemy.name for death in episode.deaths]
|
enemy_list = [death.enemy.name for death in episode.deaths]
|
||||||
sorted_list = Counter(enemy_list).most_common(1)
|
sorted_list = Counter(enemy_list).most_common(1)
|
||||||
if sorted_list:
|
if sorted_list:
|
||||||
|
|||||||
@@ -167,7 +167,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkMenuItem">
|
<object class="GtkMenuItem" id="add_episode_item">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Add Episode</property>
|
<property name="label" translatable="yes">Add Episode</property>
|
||||||
@@ -220,7 +220,7 @@
|
|||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkMenuItem">
|
<object class="GtkMenuItem" id="add_death_item">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Add Death</property>
|
<property name="label" translatable="yes">Add Death</property>
|
||||||
@@ -230,7 +230,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkMenuItem">
|
<object class="GtkMenuItem" id="add_victory_item">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Add Victory</property>
|
<property name="label" translatable="yes">Add Victory</property>
|
||||||
@@ -263,7 +263,7 @@
|
|||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkMenuItem">
|
<object class="GtkMenuItem" id="manage_drinks_item">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="label" translatable="yes">Manage Drinks</property>
|
<property name="label" translatable="yes">Manage Drinks</property>
|
||||||
@@ -549,50 +549,6 @@
|
|||||||
<property name="top_attach">0</property>
|
<property name="top_attach">0</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Most Deaths:</property>
|
|
||||||
<property name="xalign">1</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">0</property>
|
|
||||||
<property name="top_attach">7</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">Hardest Enemy:</property>
|
|
||||||
<property name="xalign">1</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">0</property>
|
|
||||||
<property name="top_attach">8</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="ep_enemy_name_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="top_attach">7</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel" id="ep_worst_player_label">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="left_attach">1</property>
|
|
||||||
<property name="top_attach">8</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel">
|
<object class="GtkLabel">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@@ -731,6 +687,34 @@
|
|||||||
<property name="top_attach">6</property>
|
<property name="top_attach">6</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">Hardest Enemy:</property>
|
||||||
|
<property name="xalign">1</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">0</property>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="ep_enemy_name_label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left_attach">1</property>
|
||||||
|
<property name="top_attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<placeholder/>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ DEFAULT_CONFIG = {
|
|||||||
'auto_connect': False,
|
'auto_connect': False,
|
||||||
'servers': [{
|
'servers': [{
|
||||||
'host': 'localhost',
|
'host': 'localhost',
|
||||||
'port': 12345,
|
'port': 55225,
|
||||||
'buffer_size': 1024,
|
'buffer_size': 1024,
|
||||||
'auth_token': ''}
|
'auth_token': ''}
|
||||||
]
|
]
|
||||||
|
|||||||
18
dsst/dsst_server/config.py
Normal file
18
dsst/dsst_server/config.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# This config will be copied on first launch.
|
||||||
|
# Edit the the copied file at '~/.config/dsst/server.json' before launching the server
|
||||||
|
DEFAULT_CONFIG = {
|
||||||
|
'database': {
|
||||||
|
'db_name': 'dsst',
|
||||||
|
'user': 'dsst',
|
||||||
|
'password': 'dsst'
|
||||||
|
},
|
||||||
|
'server': {
|
||||||
|
'host': 'localhost',
|
||||||
|
'port': 55225,
|
||||||
|
'buffer_size': 1024
|
||||||
|
},
|
||||||
|
'tokens': {
|
||||||
|
'<read_write_token_here>': 'rw',
|
||||||
|
'<read_only_token_here>': 'r'
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,28 +1,23 @@
|
|||||||
import json
|
import json
|
||||||
import pickle
|
import pickle
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from common import util, models
|
from common import util, models
|
||||||
from dsst_server import func_read, func_write, tokens
|
from dsst_server import func_read, func_write
|
||||||
from dsst_server.func_proxy import FunctionProxy
|
from dsst_server.func_proxy import FunctionProxy
|
||||||
from dsst_server.data_access import sql, sql_func
|
from dsst_server.data_access import sql, sql_func
|
||||||
|
from dsst_server.config import DEFAULT_CONFIG
|
||||||
PORT = 12345
|
|
||||||
HOST = socket.gethostname()
|
|
||||||
BUFFER_SIZE = 1024
|
|
||||||
|
|
||||||
|
|
||||||
class DsstServer:
|
class DsstServer:
|
||||||
def __init__(self, config={}):
|
def __init__(self, config):
|
||||||
self.socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
self.socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
print('Created socket')
|
print('Created socket')
|
||||||
|
server_conf = config.get('server')
|
||||||
self.socket_server.bind((HOST, PORT))
|
self.socket_server.bind((server_conf.get('host'), server_conf.get('port')))
|
||||||
print('Bound socket to {} on host {}'.format(PORT, HOST))
|
print('Bound socket to {} on host {}'.format(server_conf.get('port'), server_conf.get('host')))
|
||||||
|
|
||||||
# Initialize database
|
# Initialize database
|
||||||
db_config = config.get('database')
|
db_config = config.get('database')
|
||||||
@@ -37,7 +32,7 @@ class DsstServer:
|
|||||||
'r': read_actions,
|
'r': read_actions,
|
||||||
'rw': read_actions + write_actions
|
'rw': read_actions + write_actions
|
||||||
}
|
}
|
||||||
self.tokens = {token: parm_access[perms] for token, perms in tokens.TOKENS}
|
self.tokens = {token: parm_access[perms] for token, perms in config.get('tokens').items()}
|
||||||
print('Loaded auth tokens: {}'.format(self.tokens.keys()))
|
print('Loaded auth tokens: {}'.format(self.tokens.keys()))
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
@@ -85,8 +80,21 @@ def load_config(config_path: str) -> dict:
|
|||||||
return json.load(config_file)
|
return json.load(config_file)
|
||||||
|
|
||||||
|
|
||||||
|
def save_config(config: dict, config_path: str):
|
||||||
|
path = os.path.dirname(config_path)
|
||||||
|
if not os.path.isdir(path):
|
||||||
|
os.mkdir(path)
|
||||||
|
with open(config_path, 'wb') as file:
|
||||||
|
file.write(json.dumps(config, sort_keys=True, indent=4, separators=(',', ': ')).encode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
config = os.path.join(os.path.expanduser('~'), '.config', 'dsst', 'server.json')
|
config = os.path.join(os.path.expanduser('~'), '.config', 'dsst', 'server.json')
|
||||||
|
if not os.path.isfile(config):
|
||||||
|
save_config(DEFAULT_CONFIG, config)
|
||||||
|
print('No server config file found.\nCopied default config to "{}"\nPlease edit file before starting server.'
|
||||||
|
.format(config))
|
||||||
|
sys.exit(0)
|
||||||
server = DsstServer(load_config(config))
|
server = DsstServer(load_config(config))
|
||||||
try:
|
try:
|
||||||
server.run()
|
server.run()
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# Define access tokens here
|
|
||||||
# i.E: { 'read': ['a', 'b''],
|
|
||||||
# 'write': ['a']
|
|
||||||
# }
|
|
||||||
TOKENS = [('a', 'rw'), ('b', 'r')]
|
|
||||||
Reference in New Issue
Block a user