kopia lustrzana https://github.com/dsblank/activitypub
Login, username, password, and logout implemented
rodzic
1f95a14f9f
commit
4270c865b5
|
@ -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.")
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
tornado
|
||||
passlib
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
Ładowanie…
Reference in New Issue