Login, username, password, and logout implemented

master
Douglas Blank 2018-04-22 23:02:35 -04:00
rodzic 1f95a14f9f
commit 4270c865b5
5 zmienionych plików z 124 dodań i 8 usunięć

Wyświetl plik

@ -2,15 +2,25 @@ import logging
import os
import tornado.web
import tornado.log
from tornado.options import define, options, parse_command_line
from passlib.hash import sha256_crypt as crypt
from .handlers import (MessageNewHandler, MessageUpdatesHandler,
MainHandler, MessageBuffer)
MainHandler, MessageBuffer, LoginHandler,
LogoutHandler)
define("port", default=8888, help="run on the given port", type=int)
define("debug", default=False, help="run in debug mode", type=bool)
define("directory", default=".", help="location of templates and static", type=str)
APPLICATION_NAME = "ActivityPub"
### To change the URLs each handler serves, you'll need to edit:
### 1. This code
### 2. The static/chat.js code
### 3. The template/*.html code
class ActivityPubApplocation(tornado.web.Application):
"""
"""
@ -18,16 +28,39 @@ class ActivityPubApplocation(tornado.web.Application):
self.message_buffer = MessageBuffer()
super().__init__(*args, **kwargs)
def get_user_data(self, getusername):
return {
"password": crypt.hash(getusername),
}
def make_url(path, handler, kwargs=None, name=None):
#kwargs["options"] = options
return tornado.web.url(path, handler, kwargs, name)
def make_app():
parse_command_line()
if options.debug:
import tornado.autoreload
log = logging.getLogger()
log.setLevel(logging.DEBUG)
tornado.log.logging.info("Debug mode...")
template_directory = os.path.join(options.directory, 'templates')
tornado.log.logging.info(template_directory)
for dirpath, dirnames, filenames in os.walk(template_directory):
for filename in filenames:
template_filename = os.path.join(dirpath, filename)
tornado.log.logging.info(" watching: " + os.path.relpath(template_filename))
tornado.autoreload.watch(template_filename)
app = ActivityPubApplocation(
[
(r"/", MainHandler),
(r"/a/message/new", MessageNewHandler),
(r"/a/message/updates", MessageUpdatesHandler),
make_url(r"/", MainHandler, name="home"),
make_url(r'/login', LoginHandler, name="login"),
make_url(r'/logout', LogoutHandler, name="logout"),
make_url(r"/a/message/new", MessageNewHandler),
make_url(r"/a/message/updates", MessageUpdatesHandler),
],
cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
login_url = "/login",
template_path=os.path.join(os.path.dirname(options.directory), "templates"),
static_path=os.path.join(os.path.dirname(options.directory), "static"),
xsrf_cookies=True,
@ -38,4 +71,9 @@ def make_app():
def main():
app = make_app()
app.listen(options.port)
tornado.ioloop.IOLoop.current().start()
tornado.log.logging.info("Starting...")
try:
tornado.ioloop.IOLoop.current().start()
except KeyboardInterrupt:
tornado.log.logging.info("Shutting down...")
tornado.log.logging.info("Stopped.")

Wyświetl plik

@ -2,8 +2,39 @@ import uuid
import logging
import tornado.escape
import tornado.web
import tornado.log
from tornado.concurrent import Future
from tornado import gen
from passlib.hash import sha256_crypt as crypt
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
user = self.get_secure_cookie("user")
if isinstance(user, bytes):
user = user.decode()
return user
class LoginHandler(BaseHandler):
def get(self):
self.render('login.html')
def post(self):
getusername = self.get_argument("username")
getpassword = self.get_argument("password")
user_data = self.application.get_user_data(getusername)
tornado.log.logging.info("user_data[password]=%s", user_data["password"])
tornado.log.logging.info("getpassword=%s", getpassword)
if user_data and user_data["password"] and crypt.verify(getpassword, user_data["password"]):
self.set_secure_cookie("user", self.get_argument("username"))
self.redirect(self.get_argument("next", self.reverse_url("home")))
else:
self.redirect(self.reverse_url("login"))
class LogoutHandler(BaseHandler):
def get(self):
self.clear_cookie("user")
self.redirect(self.get_argument("next", self.reverse_url("home")))
class MessageBuffer(object):
def __init__(self):
@ -43,11 +74,13 @@ class MessageBuffer(object):
if len(self.cache) > self.cache_size:
self.cache = self.cache[-self.cache_size:]
class MainHandler(tornado.web.RequestHandler):
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render("index.html", messages=self.application.message_buffer.cache)
class MessageNewHandler(tornado.web.RequestHandler):
class MessageNewHandler(BaseHandler):
@tornado.web.authenticated
def post(self):
message = {
"id": str(uuid.uuid4()),
@ -64,7 +97,8 @@ class MessageNewHandler(tornado.web.RequestHandler):
self.write(message)
self.application.message_buffer.new_messages([message])
class MessageUpdatesHandler(tornado.web.RequestHandler):
class MessageUpdatesHandler(BaseHandler):
@tornado.web.authenticated
@gen.coroutine
def post(self):
cursor = self.get_argument("cursor", None)

2
requirements.txt 100644
Wyświetl plik

@ -0,0 +1,2 @@
tornado
passlib

Wyświetl plik

@ -22,6 +22,9 @@
<input type="hidden" name="next" value="{{ request.path }}">
{% module xsrf_form_html() %}
</td>
<td>
<a href="/logout">Logout</a>
</td>
</tr>
</table>
</form>

Wyświetl plik

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Tornado Chat Demo</title>
<link rel="stylesheet" href="{{ static_url("chat.css") }}" type="text/css">
</head>
<body>
<h2>{{_("User Login")}}</h2>
<p id="description">{{_("Enter your login ID and password below.")}}</p>
<form method="POST" action="/login">{% module xsrf_form_html() %}
<table>
<tr>
<td align="right">
<label for="id_username">{{_("Username")}}: </label>
</td>
<td>
<input class="get_focus" type="text" name="username" />
</td>
</tr>
<tr>
<td align="right">
<label for="id_password">{{_("Password")}}: </label>
</td>
<td>
<input type="password" name="password" />
</td>
</tr>
<tr>
<td>
</td>
<td>
<p><input type="submit" value="Login" style="width: 155px;"/></p>
</td>
</tr>
</table>
</form>
</body>
</html>