Handle post and redirect after "login"
This commit is contained in:
parent
fbf0495c82
commit
6d02c01751
|
@ -10,7 +10,11 @@ url_prefix = /board
|
||||||
# when it is behind a reverse proxy
|
# when it is behind a reverse proxy
|
||||||
# ssl controls whether cookies set the Secure attribute, meaning they are only
|
# ssl controls whether cookies set the Secure attribute, meaning they are only
|
||||||
# sent over an encrypted connection
|
# sent over an encrypted connection
|
||||||
ssl = True
|
ssl = yes
|
||||||
|
# The host and port where Buranun is accessible
|
||||||
|
# outside_port can be left empty if you're using port 80 (no ssl) or 443 (ssh)
|
||||||
|
outside_host = ahti-saarelainen.zgrep.org
|
||||||
|
outside_port =
|
||||||
|
|
||||||
[site]
|
[site]
|
||||||
# This is the site name displayed on e.g. the index page
|
# This is the site name displayed on e.g. the index page
|
||||||
|
|
|
@ -2,7 +2,7 @@ import configparser
|
||||||
|
|
||||||
def load(filename):
|
def load(filename):
|
||||||
"""Populate the config variables"""
|
"""Populate the config variables"""
|
||||||
global port, ssl, url_prefix
|
global port, ssl, url_prefix, outside_host, outside_port
|
||||||
global site_name
|
global site_name
|
||||||
global database_file
|
global database_file
|
||||||
|
|
||||||
|
@ -10,8 +10,10 @@ def load(filename):
|
||||||
config.read(filename)
|
config.read(filename)
|
||||||
|
|
||||||
port = int(config['server']['port'])
|
port = int(config['server']['port'])
|
||||||
ssl = bool(config['server']['ssl'])
|
ssl = {'yes': True, 'no': False}[config['server']['ssl']]
|
||||||
url_prefix = config['server']['url_prefix']
|
url_prefix = config['server']['url_prefix']
|
||||||
|
outside_host = config['server']['outside_host']
|
||||||
|
outside_port = config['server']['outside_port']
|
||||||
|
|
||||||
site_name = config['site']['name']
|
site_name = config['site']['name']
|
||||||
|
|
||||||
|
|
52
server.py
52
server.py
|
@ -11,22 +11,28 @@ class HTTPRequestHandler(http.server.BaseHTTPRequestHandler):
|
||||||
#protocol_version = 'HTTP/1.1'
|
#protocol_version = 'HTTP/1.1'
|
||||||
protocol_version = 'HTTP/1.0'
|
protocol_version = 'HTTP/1.0'
|
||||||
|
|
||||||
def __send_html(self, html, *, status_code = 200):
|
def __redirect(self, path = '/', buranun_session = None):
|
||||||
encoded = html.encode('utf-8')
|
# Construct the URL to redirect to
|
||||||
|
protocol = 'https' if config.ssl else 'http'
|
||||||
|
host_port = config.outside_host if config.outside_port == '' else '%s:%s' % (config.outside_host, config.outside_port)
|
||||||
|
url = '%s://%s%s%s' % (protocol, host_port, config.url_prefix, path)
|
||||||
|
|
||||||
|
encoded = url.encode('utf-8')
|
||||||
length = len(encoded)
|
length = len(encoded)
|
||||||
|
|
||||||
|
self.send_response(303)
|
||||||
|
self.send_header('Location', url)
|
||||||
|
self.send_header('Content-Type', 'text/plain; charset=utf-8')
|
||||||
|
self.send_header('Content-Length', length)
|
||||||
|
|
||||||
# TODO: Make this more sensical
|
# TODO: Make this more sensical
|
||||||
sent_cookies = http.cookies.SimpleCookie()
|
sent_cookies = http.cookies.SimpleCookie()
|
||||||
sent_cookies['buranun_session'] = 'dihutenosa'
|
sent_cookies['buranun_session'] = buranun_session
|
||||||
sent_cookies['buranun_session']['path'] = config.url_prefix if config.url_prefix != '' else '/'
|
sent_cookies['buranun_session']['path'] = config.url_prefix if config.url_prefix != '' else '/'
|
||||||
sent_cookies['buranun_session']['max-age'] = 60
|
sent_cookies['buranun_session']['max-age'] = 60
|
||||||
sent_cookies['buranun_session']['secure'] = config.ssl
|
sent_cookies['buranun_session']['secure'] = config.ssl
|
||||||
sent_cookies['buranun_session']['httponly'] = True
|
sent_cookies['buranun_session']['httponly'] = True
|
||||||
|
|
||||||
self.send_response(status_code)
|
|
||||||
self.send_header('Content-Type', 'text/html; charset=utf-8')
|
|
||||||
self.send_header('Content-Length', length)
|
|
||||||
|
|
||||||
# Since http.cookies doesn't play nicely with http.server we need to do this manually
|
# Since http.cookies doesn't play nicely with http.server we need to do this manually
|
||||||
self.flush_headers()
|
self.flush_headers()
|
||||||
self.wfile.write(sent_cookies.output().encode('utf-8') + b'\r\n')
|
self.wfile.write(sent_cookies.output().encode('utf-8') + b'\r\n')
|
||||||
|
@ -35,11 +41,43 @@ class HTTPRequestHandler(http.server.BaseHTTPRequestHandler):
|
||||||
|
|
||||||
self.wfile.write(encoded)
|
self.wfile.write(encoded)
|
||||||
|
|
||||||
|
def __send_html(self, html, *, status_code = 200):
|
||||||
|
encoded = html.encode('utf-8')
|
||||||
|
length = len(encoded)
|
||||||
|
|
||||||
|
self.send_response(status_code)
|
||||||
|
self.send_header('Content-Type', 'text/html; charset=utf-8')
|
||||||
|
self.send_header('Content-Length', length)
|
||||||
|
|
||||||
|
self.end_headers()
|
||||||
|
|
||||||
|
self.wfile.write(encoded)
|
||||||
|
|
||||||
def __send_404(self, path):
|
def __send_404(self, path):
|
||||||
html = generate_html.error_404(path)
|
html = generate_html.error_404(path)
|
||||||
self.__send_html(html, status_code = 404)
|
self.__send_html(html, status_code = 404)
|
||||||
|
|
||||||
|
def do_POST(self):
|
||||||
|
path = urllib.parse.unquote(self.path)
|
||||||
|
|
||||||
|
path_components = [component for component in path.split('/') if component != '']
|
||||||
|
|
||||||
|
# Read the POST data
|
||||||
|
post_data_length = int(self.headers['Content-Length'])
|
||||||
|
post_data = bytearray()
|
||||||
|
while len(post_data) < post_data_length:
|
||||||
|
data = self.rfile.read(post_data_length - len(post_data))
|
||||||
|
post_data.extend(data)
|
||||||
|
|
||||||
|
post_keys = urllib.parse.parse_qs(post_data.decode('utf-8'), keep_blank_values = True)
|
||||||
|
|
||||||
|
if len(path_components) == 1 and path_components[0] == 'login':
|
||||||
|
print(post_keys['username'], post_keys['password'])
|
||||||
|
self.__redirect(buranun_session = 'dihutenosa')
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.__send_404(path)
|
||||||
|
|
||||||
def do_GET(self):
|
def do_GET(self):
|
||||||
# TODO: Do something with the session
|
# TODO: Do something with the session
|
||||||
cookies_string = self.headers['cookie']
|
cookies_string = self.headers['cookie']
|
||||||
|
|
Loading…
Reference in New Issue