import urllib.parse
from . import base
+from . import ui_modules
class AuthenticationMixin(object):
def login(self, account):
self.clear_cookie("session_id")
-class LoginHandler(AuthenticationMixin, base.BaseHandler):
+class LoginHandler(base.AnalyticsMixin, AuthenticationMixin, base.BaseHandler):
def get(self):
next = self.get_argument("next", None)
self.redirect("/")
-class RegisterHandler(base.BaseHandler):
+class JoinHandler(base.AnalyticsMixin, base.BaseHandler):
def get(self):
# Redirect logged in users away
if self.current_user:
self.redirect("/")
return
- self.render("auth/register.html")
+ self.render("auth/join.html")
@base.ratelimit(minutes=15, requests=5)
async def post(self):
# Register account
try:
with self.db.transaction():
- self.backend.accounts.register(uid, email,
+ self.backend.accounts.join(uid, email,
first_name=first_name, last_name=last_name,
country_code=self.current_country_code)
except ValueError as e:
raise tornado.web.HTTPError(400, "%s" % e) from e
- self.render("auth/register-success.html")
+ self.render("auth/join-success.html")
class ActivateHandler(AuthenticationMixin, base.BaseHandler):
self.redirect("/")
+class WellKnownChangePasswordHandler(base.BaseHandler):
+ @tornado.web.authenticated
+ def get(self):
+ """
+ Implements https://web.dev/articles/change-password-url
+ """
+ self.redirect("/users/%s/passwd" % self.current_user.uid)
+
+
class SSODiscourse(base.BaseHandler):
@base.ratelimit(minutes=24*60, requests=100)
@tornado.web.authenticated
self.redirect("%s?%s" % (params.get("return_sso_url"), qs))
+class PasswordModule(ui_modules.UIModule):
+ def render(self, account=None):
+ return self.render_string("auth/modules/password.html", account=account)
+
+ def javascript_files(self):
+ return "js/zxcvbn.js"
+
+ def embedded_javascript(self):
+ return self.render_string("auth/modules/password.js")
+
+
class APICheckUID(base.APIHandler):
@base.ratelimit(minutes=1, requests=100)
def get(self):