Merge branch 'master' of github:b3yond/ticketfrei

remotes/1691122043333111478/csrf
b3yond 2019-01-12 00:34:13 +01:00
commit de525adb7a
7 changed files with 94 additions and 13 deletions

View File

@ -17,6 +17,9 @@ Steps to reproduce the behavior:
3. Scroll down to '....' 3. Scroll down to '....'
4. See error 4. See error
**Ticketfrei Version**
See the commit on which Ticketfrei is running at example.org/version.
**Screenshots** **Screenshots**
If applicable, add screenshots to help explain your problem. If applicable, add screenshots to help explain your problem.

View File

@ -1,6 +1,6 @@
Copyright (c) 2017 Thomas L <tom@dl6tom.de> Copyright (c) 2017 Thomas L <tom@dl6tom.de>
Copyright (c) 2017 b3yond <b3yond@riseup.net> Copyright (c) 2017 b3yond <b3yond@riseup.net>
Copyright (c) 2018 sid Copyright (c) 2018 sid <sid-sid@riseup.net>
Permission to use, copy, modify, and distribute this software for any Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above purpose with or without fee is hereby granted, provided that the above

View File

@ -108,7 +108,7 @@ virtualenv -p python3 .
Install the dependencies: Install the dependencies:
```shell ```shell
pip install tweepy pytoml Mastodon.py bottle pyjwt pylibscrypt Markdown twx pip install tweepy pytoml Mastodon.py bottle pyjwt pylibscrypt Markdown twx gitpython
``` ```
Configure the bot: Configure the bot:

View File

@ -19,7 +19,11 @@ class Mailbot(Bot):
def crawl(self, user): def crawl(self, user):
reports = [] reports = []
# todo: adjust to actual mailbox # todo: adjust to actual mailbox
mails = mailbox.mbox("/var/mail/" + config['mail']['mbox_user']) try:
mails = mailbox.mbox("/var/mail/" + config['mail']['mbox_user'])
except FileNotFoundError:
logger.error("No mbox file found.")
return reports
for msg in mails: for msg in mails:
if get_date_from_header(msg['Date']) > user.get_seen_mail(): if get_date_from_header(msg['Date']) > user.get_seen_mail():
if user.get_city().lower() in msg['To'].lower(): if user.get_city().lower() in msg['To'].lower():

View File

@ -1,5 +1,70 @@
import pytoml as toml import pytoml as toml
import os
def load_env():
"""
load environment variables from the environment. If empty, use default
values from config.toml.example.
:return: config dictionary of dictionaries.
"""
with open('config.toml.example') as defaultconf:
configdict = toml.load(defaultconf)
try:
if os.environ['CONSUMER_KEY'] != "":
configdict['twitter']['consumer_key'] = os.environ['CONSUMER_KEY']
except KeyError:
pass
try:
if os.environ['CONSUMER_SECRET'] != "":
configdict['twitter']['consumer_secret'] = os.environ['CONSUMER_SECRET']
except KeyError:
pass
try:
if os.environ['HOST'] != "":
configdict['web']['host'] = os.environ['HOST']
except KeyError:
pass
try:
if os.environ['PORT'] != "":
configdict['web']['port'] = os.environ['PORT']
except KeyError:
pass
try:
if os.environ['CONTACT'] != "":
configdict['web']['contact'] = os.environ['CONTACT']
except KeyError:
pass
try:
if os.environ['MBOX_USER'] != "":
configdict['mail']['mbox_user'] = os.environ['MBOX_USER']
except KeyError:
pass
try:
if os.environ['DB_PATH'] != "":
configdict['database']['db_path'] = os.environ['DB_PATH']
except KeyError:
pass
return configdict
# read config in TOML format (https://github.com/toml-lang/toml#toml) # read config in TOML format (https://github.com/toml-lang/toml#toml)
with open('config.toml') as configfile: try:
config = toml.load(configfile) with open('config.toml') as configfile:
config = toml.load(configfile)
except FileNotFoundError:
config = load_env()
if __name__ == "__main__":
for category in config:
for key in config[category]:
print(key + "=" + str(config[category][key]))

9
db.py
View File

@ -14,7 +14,6 @@ class DB(object):
self.conn = sqlite3.connect(dbfile) self.conn = sqlite3.connect(dbfile)
self.cur = self.conn.cursor() self.cur = self.conn.cursor()
self.create() self.create()
self.secret = self.get_secret()
def execute(self, *args, **kwargs): def execute(self, *args, **kwargs):
return self.cur.execute(*args, **kwargs) return self.cur.execute(*args, **kwargs)
@ -189,7 +188,7 @@ class DB(object):
'passhash': scrypt_mcf( 'passhash': scrypt_mcf(
password.encode('utf-8') password.encode('utf-8')
).decode('ascii') ).decode('ascii')
}, self.secret).decode('ascii') }, self.get_secret()).decode('ascii')
def mail_subscription_token(self, email, city): def mail_subscription_token(self, email, city):
""" """
@ -203,17 +202,17 @@ class DB(object):
token = jwt.encode({ token = jwt.encode({
'email': email, 'email': email,
'city': city 'city': city
}, self.secret).decode('ascii') }, self.get_secret()).decode('ascii')
return token return token
def confirm_subscription(self, token): def confirm_subscription(self, token):
json = jwt.decode(token, self.secret) json = jwt.decode(token, self.get_secret())
return json['email'], json['city'] return json['email'], json['city']
def confirm(self, token, city): def confirm(self, token, city):
from user import User from user import User
try: try:
json = jwt.decode(token, self.secret) json = jwt.decode(token, self.get_secret())
except jwt.DecodeError: except jwt.DecodeError:
return None # invalid token return None # invalid token
if 'passhash' in json.keys(): if 'passhash' in json.keys():

View File

@ -56,11 +56,22 @@ def register_post():
@get('/confirm/<city>/<token>') @get('/confirm/<city>/<token>')
@view('template/propaganda.tpl') @view('template/propaganda.tpl')
def confirm(city, token): def confirm(city, token):
# check whether city already exists
if db.by_city(city):
return dict(error='This Account was already confirmed, please try '
'signing in.')
# create db-entry # create db-entry
if db.confirm(token, city): if db.confirm(token, city):
# :todo show info "Account creation successful." # :todo show info "Account creation successful."
redirect('/settings') redirect('/settings')
return dict(error='Email confirmation failed.') return dict(error='Account creation failed. Please try to register again.')
@get('/version')
def version():
import git
repo = git.Repo(search_parent_directories=True)
return repo.head.object.hexsha
@post('/login') @post('/login')
@ -259,7 +270,6 @@ application = bottle.default_app()
bottle.install(SessionPlugin('/')) bottle.install(SessionPlugin('/'))
if __name__ == '__main__': if __name__ == '__main__':
# testing only bottle.run(host="0.0.0.0", port=config["web"]["port"])
bottle.run(host=config["web"]["host"], port=config["web"]["port"])
else: else:
application.catchall = False application.catchall = False