;;; -*- mode: Lisp; Syntax: Common-Lisp; -*- ;;; ;;; Copyright (c) 2009 by the authors. ;;; ;;; See LICENCE for details. (in-package :hu.dwim.presentation) ;;;;;; ;;; login/widget (def (component e) login/widget (component-messages/widget title/mixin command-bar/mixin) ()) (def layered-method make-command-bar-commands ((component login/widget) class prototype value) (optional-list* (make-login-command component class prototype value) ;; TODO: this would add a refresh-component command, uncomment when refresh-component is removed from widgets #+nil (call-next-layered-method) nil)) (def (layered-function e) make-login-command (component class prototype value)) (def method component-style-class ((self login/widget)) (string+ "content-border " (call-next-method))) ;;;;;; ;;; identifier-and-password-login/widget ;; TODO: this is kind separate from all the other components which is bad because it does not combine well with other features ;; needs refactoring, less direct manipulation and more generalism through inheritance ;; TODO rename to something that tells that this component works without sessions (def (component e) identifier-and-password-login/widget (login/widget) ((identifier nil) (password nil)) (:default-initargs :title (title/widget () #"login.title"))) (def (macro e) identifier-and-password-login/widget (&rest args &key &allow-other-keys) `(make-instance 'identifier-and-password-login/widget ,@args)) (def render-xhtml identifier-and-password-login/widget (bind (((:read-only-slots identifier password) -self-) (focused-field-id (if identifier "password-field" "identifier-field"))) (with-render-style/component (-self-) (render-title-for -self-) (render-component-messages-for -self-) "> "> >>) `js-onload(.focus ($ ,focused-field-id)))) (def layered-method make-login-command ((component identifier-and-password-login/widget) class prototype value) (command/widget (:default #t) (icon/widget login) (bind ((uri (make-uri-for-current-application +login-entry-point-path+))) (setf (hu.dwim.uri:query-parameter-value uri +user-action-query-parameter-name+) t) (hu.dwim.uri:copy-query-parameters (uri-of *request*) uri +continue-url-query-parameter-name+) uri))) (def (generic e) make-logout-command (application) (:method :before (application) (assert (eq *application* application))) (:method ((application application)) (command/widget (:ajax #f :send-client-state #f) (icon/widget logout) (make-action (logout *application* *session*) (decorate-session-cookie *application* (make-redirect-response-for-current-application)))))) ;;;;;; ;;; login-data/login/inspector (def (component e) login-data/login/inspector (t/name-value-list/inspector login/widget) ()) (def method component-style-class ((self login-data/login/inspector)) (string+ "content-border " (call-next-method))) (def render-xhtml login-data/login/inspector (with-render-style/component (-self-) (render-component-messages-for -self-) (render-content-for -self-) (render-command-bar-for -self-))) (def layered-method make-login-command ((component login-data/login/inspector) (class standard-class) (prototype login-data) (value login-data)) (when (authorize-operation *application* '(make-login-command)) (unless (is-logged-in? *session*) (command/widget (:default #t :ajax #f) (icon/widget login) (make-action (store-editing component) (handler-case (progn (login *application* *session* (component-value-of component)) (clear-root-component)) (error/authentication () (add-component-error-message component #"login.message.authentication-failed")))))))) ;;;;;; ;;; fake-identifier-and-password-login/widget (def (component e) fake-identifier-and-password-login/widget (standard/widget) ((identifier nil) (password nil) (comment nil)) (:documentation "Useful to render one-click logins in test mode")) (def (macro e) fake-identifier-and-password-login/widget (identifier password &optional comment) `(make-instance 'fake-identifier-and-password-login/widget :identifier ,identifier :password ,password :comment ,comment)) (def render-xhtml fake-identifier-and-password-login/widget (bind (((:read-only-slots identifier password comment) -self-) (uri (clone-request-uri))) (setf (hu.dwim.uri:query-parameter-value uri "identifier") identifier) (setf (hu.dwim.uri:query-parameter-value uri "password") password)
>)) ;;;;;; ;;; Icon (def (icon e) login) (def (icon e) logout) (def (icon e) cancel-impersonalization)
>>
>>