|
|
|
@ -37,10 +37,6 @@
|
|
|
|
|
:documentation "The session string encodes enough
|
|
|
|
|
data to safely retrieve this session. It is sent to the browser as a
|
|
|
|
|
cookie value or as a GET parameter.")
|
|
|
|
|
(user-agent :initarg :user-agent
|
|
|
|
|
:accessor pg-session-user-agent)
|
|
|
|
|
(remote-addr :initarg :remote-addr
|
|
|
|
|
:accessor pg-session-remote-addr)
|
|
|
|
|
(session-start :col-type bigint :initform (get-universal-time) :accessor pg-session-start)
|
|
|
|
|
(last-click :col-type bigint :initform (get-universal-time) :accessor pg-session-last-click
|
|
|
|
|
:documentation "The last time this session was used.")
|
|
|
|
@ -62,9 +58,7 @@ stored in the postmodern database."))
|
|
|
|
|
(loop for code across (md5:md5sum-string string)
|
|
|
|
|
do (format s "~2,'0x" code))))
|
|
|
|
|
|
|
|
|
|
(defun encode-session-string (id user-agent remote-addr start)
|
|
|
|
|
"Creates a uniquely encoded session string based on the values ID,
|
|
|
|
|
USER-AGENT, and START"
|
|
|
|
|
(defun encode-session-string (id start)
|
|
|
|
|
;; *PG-SESSION-SECRET* is used twice due to known theoretical
|
|
|
|
|
;; vulnerabilities of MD5 encoding
|
|
|
|
|
(md5-hex (concatenate 'string
|
|
|
|
@ -72,18 +66,12 @@ USER-AGENT, and START"
|
|
|
|
|
(md5-hex (format nil "~A~A~@[~A~]~@[~A~]~A"
|
|
|
|
|
*pg-session-secret*
|
|
|
|
|
id
|
|
|
|
|
(and hunchentoot:*use-user-agent-for-sessions*
|
|
|
|
|
user-agent)
|
|
|
|
|
(and hunchentoot:*use-remote-addr-for-sessions*
|
|
|
|
|
remote-addr)
|
|
|
|
|
start)))))
|
|
|
|
|
|
|
|
|
|
(defun stringify-session (session)
|
|
|
|
|
"Creates a string representing of the SESSION object SESSION. See
|
|
|
|
|
ENCODE-SESSION-STRING."
|
|
|
|
|
(encode-session-string (pg-session-id session)
|
|
|
|
|
(pg-session-user-agent session)
|
|
|
|
|
(pg-session-remote-addr session)
|
|
|
|
|
(pg-session-start session)))
|
|
|
|
|
|
|
|
|
|
(defun session-too-old-p (session)
|
|
|
|
@ -122,9 +110,7 @@ case the function will also send a session cookie to the browser."
|
|
|
|
|
(return-from pg-start-session session))
|
|
|
|
|
(setf session
|
|
|
|
|
(apply #'make-dao
|
|
|
|
|
(append `(,*session-type*
|
|
|
|
|
:user-agent ,(hunchentoot:user-agent hunchentoot:*request*)
|
|
|
|
|
:remote-addr ,(hunchentoot:real-remote-addr hunchentoot:*request*))
|
|
|
|
|
(append `(,*session-type*)
|
|
|
|
|
args)))
|
|
|
|
|
(setf (hunchentoot:session hunchentoot:*request*) session)
|
|
|
|
|
(setf (pg-session-string session) (stringify-session session))
|
|
|
|
@ -145,9 +131,6 @@ will not create a new one."
|
|
|
|
|
(hunchentoot:log-message* :info "Session with ID ~A too old" id))
|
|
|
|
|
(pg-remove-session session)
|
|
|
|
|
(setq session nil))
|
|
|
|
|
(when session
|
|
|
|
|
(setf (pg-session-user-agent session) (hunchentoot:user-agent request)
|
|
|
|
|
(pg-session-remote-addr session) (hunchentoot:real-remote-addr request)))
|
|
|
|
|
session))
|
|
|
|
|
|
|
|
|
|
(defmethod hunchentoot:session-verify ((request hunchentoot:request))
|
|
|
|
@ -168,17 +151,13 @@ will not create a new one."
|
|
|
|
|
(destructuring-bind (id-string session-string)
|
|
|
|
|
(cl-ppcre:split ":" session-identifier :limit 2)
|
|
|
|
|
(let* ((id (parse-integer id-string))
|
|
|
|
|
(session (get-stored-session id request))
|
|
|
|
|
(user-agent (hunchentoot:user-agent request))
|
|
|
|
|
(remote-addr (hunchentoot:remote-addr request)))
|
|
|
|
|
(session (get-stored-session id request)))
|
|
|
|
|
(cond
|
|
|
|
|
((and session
|
|
|
|
|
(string= session-string
|
|
|
|
|
(pg-session-string session))
|
|
|
|
|
(string= session-string
|
|
|
|
|
(encode-session-string id
|
|
|
|
|
user-agent
|
|
|
|
|
(hunchentoot:real-remote-addr request)
|
|
|
|
|
(pg-session-start session))))
|
|
|
|
|
;; the session key presented by the client is valid
|
|
|
|
|
(setf (pg-session-last-click session) (get-universal-time))
|
|
|
|
@ -215,11 +194,3 @@ SESSION \(the default is the current session) if it exists."
|
|
|
|
|
(,%symbol ,symbol))
|
|
|
|
|
(setf (slot-value ,%session ,%symbol) ,new-value)
|
|
|
|
|
(save-pg-session ,%session))))
|
|
|
|
|
|
|
|
|
|
;; (defun reset-sessions (&optional (acceptor *acceptor*))
|
|
|
|
|
;; "Removes ALL stored sessions of ACCEPTOR."
|
|
|
|
|
;; (with-session-lock-held ((session-db-lock acceptor))
|
|
|
|
|
;; (loop for (nil . session) in (session-db acceptor)
|
|
|
|
|
;; do (acceptor-remove-session acceptor session))
|
|
|
|
|
;; (setq *session-db* nil))
|
|
|
|
|
;; (values))
|
|
|
|
|