2018-03-28 22:12:19 +00:00
|
|
|
#!/usr/bin/env python3
|
2018-03-22 01:23:31 +00:00
|
|
|
import bottle
|
|
|
|
from bottle import get, post, redirect, request, response, view
|
2018-03-24 15:26:35 +00:00
|
|
|
from config import config
|
2018-03-28 15:36:35 +00:00
|
|
|
from db import db
|
2018-03-24 15:26:35 +00:00
|
|
|
import logging
|
2018-03-23 01:28:00 +00:00
|
|
|
import tweepy
|
|
|
|
import sendmail
|
2018-03-28 15:36:35 +00:00
|
|
|
from session import SessionPlugin
|
2018-03-23 01:28:00 +00:00
|
|
|
import smtplib
|
|
|
|
from mastodon import Mastodon
|
2018-03-24 15:26:35 +00:00
|
|
|
|
|
|
|
|
2018-03-22 01:23:31 +00:00
|
|
|
@get('/')
|
|
|
|
@view('template/propaganda.tpl')
|
|
|
|
def propaganda():
|
2018-03-22 10:22:28 +00:00
|
|
|
pass
|
2018-03-22 01:23:31 +00:00
|
|
|
|
2018-03-23 01:28:00 +00:00
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@post('/register')
|
2018-03-22 01:23:31 +00:00
|
|
|
@view('template/register.tpl')
|
2018-03-28 15:36:35 +00:00
|
|
|
def register_post():
|
2018-03-22 01:23:31 +00:00
|
|
|
email = request.forms.get('email', '')
|
|
|
|
password = request.forms.get('pass', '')
|
|
|
|
password_repeat = request.forms.get('pass-repeat', '')
|
|
|
|
if password != password_repeat:
|
|
|
|
return dict(error='Passwords do not match.')
|
|
|
|
if db.by_email(email):
|
|
|
|
return dict(error='Email address already in use.')
|
|
|
|
# send confirmation mail
|
2018-03-28 15:36:35 +00:00
|
|
|
confirm_link = request.url + "/../confirm/" + db.user_token(email, password)
|
2018-03-24 15:26:35 +00:00
|
|
|
send_confirmation_mail(confirm_link, email)
|
2018-03-22 10:22:28 +00:00
|
|
|
return dict(info='Confirmation mail sent.')
|
2018-03-22 01:23:31 +00:00
|
|
|
|
|
|
|
|
2018-03-24 15:26:35 +00:00
|
|
|
def send_confirmation_mail(confirm_link, email):
|
|
|
|
m = sendmail.Mailer()
|
2018-03-23 01:28:00 +00:00
|
|
|
try:
|
2018-03-24 15:26:35 +00:00
|
|
|
m.send("Complete your registration here: " + confirm_link, email,
|
|
|
|
"[Ticketfrei] Confirm your account")
|
2018-03-23 01:28:00 +00:00
|
|
|
except smtplib.SMTPRecipientsRefused:
|
|
|
|
return "Please enter a valid E-Mail address."
|
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@get('/confirm/<token>')
|
2018-03-22 01:23:31 +00:00
|
|
|
@view('template/propaganda.tpl')
|
2018-03-28 15:36:35 +00:00
|
|
|
def confirm(token):
|
2018-03-22 01:23:31 +00:00
|
|
|
# create db-entry
|
2018-03-28 15:36:35 +00:00
|
|
|
if db.confirm(token):
|
2018-03-22 10:22:28 +00:00
|
|
|
# :todo show info "Account creation successful."
|
2018-03-22 01:23:31 +00:00
|
|
|
return redirect('/settings')
|
2018-03-28 15:36:35 +00:00
|
|
|
return dict(error='Email confirmation failed.')
|
2018-03-22 01:23:31 +00:00
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@post('/login')
|
2018-03-22 01:23:31 +00:00
|
|
|
@view('template/login.tpl')
|
2018-03-28 15:36:35 +00:00
|
|
|
def login_post():
|
2018-03-22 01:23:31 +00:00
|
|
|
# check login
|
2018-03-28 15:36:35 +00:00
|
|
|
if db.by_email(request.forms.get('email', '')) \
|
|
|
|
.check_password(request.forms.get('pass', '')):
|
2018-03-22 01:23:31 +00:00
|
|
|
return redirect('/settings')
|
|
|
|
return dict(error='Authentication failed.')
|
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@get('/settings')
|
2018-03-22 01:23:31 +00:00
|
|
|
@view('template/settings.tpl')
|
|
|
|
def settings(user):
|
|
|
|
return user.state()
|
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@get('/api/state')
|
2018-03-22 01:23:31 +00:00
|
|
|
def api_enable(user):
|
|
|
|
return user.state()
|
|
|
|
|
|
|
|
|
|
|
|
@get('/static/<filename:path>')
|
|
|
|
def static(filename):
|
|
|
|
return bottle.static_file(filename, root='static')
|
|
|
|
|
2018-03-23 01:28:00 +00:00
|
|
|
|
2018-03-22 10:22:28 +00:00
|
|
|
@get('/logout/')
|
|
|
|
def logout():
|
|
|
|
# clear auth cookie
|
|
|
|
response.set_cookie('uid', '', expires=0, path="/")
|
|
|
|
# :todo show info "Logout successful."
|
|
|
|
return redirect('/')
|
|
|
|
|
2018-03-22 01:23:31 +00:00
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@get('/login/twitter')
|
2018-03-23 01:28:00 +00:00
|
|
|
def login_twitter(user):
|
|
|
|
"""
|
|
|
|
Starts the twitter OAuth authentication process.
|
|
|
|
:return: redirect to twitter.
|
|
|
|
"""
|
2018-03-24 15:26:35 +00:00
|
|
|
consumer_key = config["tapp"]["consumer_key"]
|
|
|
|
consumer_secret = config["tapp"]["consumer_secret"]
|
|
|
|
callback_url = request.get_header('host') + "/login/twitter/callback"
|
2018-03-23 01:28:00 +00:00
|
|
|
auth = tweepy.OAuthHandler(consumer_key, consumer_secret, callback_url)
|
|
|
|
try:
|
|
|
|
redirect_url = auth.get_authorization_url()
|
|
|
|
except tweepy.TweepError:
|
2018-03-24 15:26:35 +00:00
|
|
|
logger.error('Twitter OAuth Error: Failed to get request token.',
|
|
|
|
exc_info=True)
|
2018-03-23 12:14:06 +00:00
|
|
|
return dict(error="Failed to get request token.")
|
2018-03-23 01:28:00 +00:00
|
|
|
user.save_request_token(auth.request_token)
|
|
|
|
return bottle.redirect(redirect_url)
|
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@get('/login/twitter/callback')
|
2018-03-23 01:28:00 +00:00
|
|
|
def twitter_callback(user):
|
|
|
|
"""
|
|
|
|
Gets the callback
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
# twitter passes the verifier/oauth token secret in a GET request.
|
2018-03-24 15:26:35 +00:00
|
|
|
verifier = request.query('oauth_verifier')
|
2018-03-25 15:50:28 +00:00
|
|
|
consumer_key = config["twitter"]["consumer_key"]
|
|
|
|
consumer_secret = config["twitter"]["consumer_secret"]
|
2018-03-23 01:28:00 +00:00
|
|
|
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
|
|
|
|
request_token = user.get_request_token
|
|
|
|
auth.request_token = {"oauth_token": request_token,
|
|
|
|
"oauth_token_secret": verifier}
|
|
|
|
auth.get_access_token(verifier)
|
|
|
|
user.save_twitter_token(auth.access_token, auth.access_token_secret)
|
|
|
|
return bottle.redirect("/settings")
|
|
|
|
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
@post('/login/mastodon')
|
2018-03-23 01:28:00 +00:00
|
|
|
def login_mastodon(user):
|
|
|
|
"""
|
|
|
|
Starts the mastodon OAuth authentication process.
|
|
|
|
:return: redirect to twitter.
|
|
|
|
"""
|
|
|
|
# get app tokens
|
2018-03-24 15:26:35 +00:00
|
|
|
instance_url = request.forms.get('instance_url')
|
|
|
|
masto_email = request.forms.get('email')
|
2018-03-23 12:14:06 +00:00
|
|
|
print(masto_email)
|
2018-03-24 15:26:35 +00:00
|
|
|
masto_pass = request.forms.get('pass')
|
2018-03-23 12:14:06 +00:00
|
|
|
print(masto_pass)
|
2018-03-23 01:28:00 +00:00
|
|
|
client_id, client_secret = user.get_mastodon_app_keys(instance_url)
|
2018-03-24 15:26:35 +00:00
|
|
|
m = Mastodon(client_id=client_id, client_secret=client_secret,
|
|
|
|
api_base_url=instance_url)
|
2018-03-23 01:28:00 +00:00
|
|
|
try:
|
|
|
|
access_token = m.log_in(masto_email, masto_pass)
|
|
|
|
user.save_masto_token(access_token, instance_url)
|
2018-03-24 15:26:35 +00:00
|
|
|
return dict(
|
|
|
|
info='Thanks for supporting decentralized social networks!'
|
|
|
|
)
|
2018-03-23 01:28:00 +00:00
|
|
|
except:
|
2018-03-24 15:26:35 +00:00
|
|
|
logger.error('Login to Mastodon failed.', exc_info=True)
|
2018-03-23 01:28:00 +00:00
|
|
|
return dict(error='Login to Mastodon failed.')
|
|
|
|
|
|
|
|
|
2018-03-28 21:33:04 +00:00
|
|
|
logpath = config['logging']['logpath']
|
|
|
|
logger = logging.getLogger()
|
|
|
|
fh = logging.FileHandler(logpath)
|
|
|
|
fh.setLevel(logging.DEBUG)
|
|
|
|
logger.addHandler(fh)
|
|
|
|
|
2018-03-28 15:36:35 +00:00
|
|
|
application = bottle.default_app()
|
|
|
|
bottle.install(SessionPlugin('/'))
|
|
|
|
|
2018-03-24 14:02:11 +00:00
|
|
|
if __name__ == '__main__':
|
|
|
|
# testing only
|
|
|
|
bottle.run(host='localhost', port=8080)
|