From ed8fed5baab5f06beb5bc85b414dff58a119b7b3 Mon Sep 17 00:00:00 2001 From: Griffin Smith Date: Thu, 23 Jul 2020 19:59:15 -0400 Subject: feat(web/panettone): Redirect to original URI after login Once the user authenticates, redirect them to the original URI they were trying to get to Fixes: #7 Change-Id: Id7c8cbe3547923f6c4c5faed180ea8ea6528fddd Reviewed-on: https://cl.tvl.fyi/c/depot/+/1411 Tested-by: BuildkiteCI Reviewed-by: kanepyork --- web/panettone/default.nix | 1 + web/panettone/src/panettone.lisp | 25 ++++++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/web/panettone/default.nix b/web/panettone/default.nix index b954bcec67..2de000b7e8 100644 --- a/web/panettone/default.nix +++ b/web/panettone/default.nix @@ -6,6 +6,7 @@ depot.nix.buildLisp.program { deps = with depot.third_party.lisp; [ cl-prevalence cl-who + drakma defclass-std easy-routes hunchentoot diff --git a/web/panettone/src/panettone.lisp b/web/panettone/src/panettone.lisp index 026d47825f..c49dc63c6c 100644 --- a/web/panettone/src/panettone.lisp +++ b/web/panettone/src/panettone.lisp @@ -192,7 +192,7 @@ updated issue" (when message (who:htm (:div :class "alert" (who:esc message)))))) -(defun render/login (&optional message) +(defun render/login (&key message (original-uri "/")) (render (:div :class "login-form" @@ -203,6 +203,8 @@ updated issue" (render/alert message) (:form :method :post :action "/login" + (:input :type "hidden" :name "original-uri" + :value original-uri) (:div (:label :for "username" "Username") @@ -378,20 +380,25 @@ updated issue" (defun @auth (next) (if-let ((*user* (hunchentoot:session-value 'user))) (funcall next) - (hunchentoot:redirect "/login"))) - -(defroute login-form ("/login" :method :get) () + (hunchentoot:redirect + (format nil "/login?original-uri=~A" + (drakma:url-encode + (hunchentoot:request-uri*) + :utf-8))))) + +(defroute login-form ("/login" :method :get) + (original-uri) (if (hunchentoot:session-value 'user) - (hunchentoot:redirect "/") - (render/login))) + (hunchentoot:redirect (or original-uri "/")) + (render/login :original-uri original-uri))) (defroute submit-login ("/login" :method :post) - (&post username password) + (&post original-uri username password) (if-let ((user (authenticate-user username password))) (progn (setf (hunchentoot:session-value 'user) user) - (hunchentoot:redirect "/")) - (render/login "Invalid credentials"))) + (hunchentoot:redirect (or original-uri "/"))) + (render/login :message "Invalid credentials"))) (defroute index ("/" :decorators (@auth)) () (let ((issues (open-issues *p-system*))) -- cgit 1.4.1