]> git.ipfire.org Git - ipfire.org.git/commitdiff
people: Ask user to authenticate for Discourse when not logged in
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 22 Oct 2019 15:18:16 +0000 (16:18 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 22 Oct 2019 15:18:16 +0000 (16:18 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/backend/accounts.py
src/web/auth.py
src/web/people.py

index 86a9bd24d8a02f89f1dddc9e53ac35ee760aec8e..2bb87c76cdcc77ea90c81bedd74bbb9376c05cec 100644 (file)
@@ -176,6 +176,14 @@ class Accounts(Object):
 
                return score >= 50
 
+       def auth(self, username, password):
+               # Find account
+               account = self.backend.accounts.find_account(username)
+
+               # Check credentials
+               if account and account.check_password(password):
+                       return account
+
        # Registration
 
        def register(self, uid, email, first_name, last_name):
index d2872695bbc2e74ab2e687bed41945bb2bc0feda..b969a6710ed1b725f7f83ee428aba1b792c2bb09 100644 (file)
@@ -15,18 +15,6 @@ class CacheMixin(object):
 
 
 class AuthenticationMixin(CacheMixin):
-       def authenticate(self, username, password):
-               # Find account
-               account = self.backend.accounts.find_account(username)
-               if not account:
-                       raise tornado.web.HTTPError(401, "Unknown user: %s" % username)
-
-               # Check credentials
-               if not account.check_password(password):
-                       raise tornado.web.HTTPError(401, "Invalid password for %s" % account)
-
-               return self.login(account)
-
        def login(self, account):
                # User has logged in, create a session
                session_id, session_expires = self.backend.accounts.create_session(
@@ -63,8 +51,14 @@ class LoginHandler(AuthenticationMixin, base.BaseHandler):
                username = self.get_argument("username")
                password = self.get_argument("password")
 
+               # Find user
+               account = self.backend.accounts.auth(username, password)
+               if not account:
+                       raise tornado.web.HTTPError(401, "Unknown user or invalid password: %s" % username)
+
+               # Create session
                with self.db.transaction():
-                       self.authenticate(username, password)
+                       self.login(account)
 
                # Determine the page we should redirect to
                next = self.get_argument("next", None)
index 69dcf4e84c23cacb0b84bf7ce41be4e387e2ac65..4c82cb869cf1d22443fa0872bb167fe875db38f7 100644 (file)
@@ -427,12 +427,27 @@ class SSODiscourse(auth.CacheMixin, base.BaseHandler):
                params = self._get_discourse_params()
 
                # Redirect back if user is already logged in
-               if self.current_user:
-                       return self._redirect_user_to_discourse(self.current_user, **params)
+               #if self.current_user:
+               #       return self._redirect_user_to_discourse(self.current_user, **params)
 
                # Otherwise the user needs to authenticate
-               # XXX
-               raise tornado.web.HTTPError(401)
+               self.render("auth/login.html", next=None)
+
+       @base.ratelimit(minutes=24*60, requests=100)
+       def post(self):
+               params = self._get_discourse_params()
+
+               # Get credentials
+               username = self.get_argument("username")
+               password = self.get_argument("password")
+
+               # Check credentials
+               account = self.accounts.auth(username, password)
+               if not account:
+                       raise tornado.web.HTTPError(401, "Unknown user or invalid password: %s" % username)
+
+               # If the user has been authenticated, we will redirect to Discourse
+               self._redirect_user_to_discourse(account, **params)
 
 
 class NewAccountsModule(ui_modules.UIModule):