/
handlers.clj
107 lines (94 loc) · 2.98 KB
/
handlers.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
(ns cerber.handlers
(:require [cerber
[error :as error]
[form :as form]]
[cerber.oauth2
[authorization :as auth]
[context :as ctx]]
[cerber.stores.session
:refer
[create-session
extend-session
find-session
revoke-session
update-session]]
[ring.middleware
[anti-forgery :refer [wrap-anti-forgery]]
[format :refer [wrap-restful-format]]
[session :refer [wrap-session]]]
[ring.middleware.session.store :refer [SessionStore]]
[failjure.core :as f]))
(deftype RingCustomizedStore []
SessionStore
(read-session [_ key]
(when-let [session (find-session key)]
(:content (extend-session session))))
(write-session [_ key data]
(:sid
(if key
(when-let [session (find-session key)]
(update-session (assoc session :content data)))
(create-session data))))
(delete-session [_ key]
(revoke-session (find-session key))
nil))
(defonce session-store (RingCustomizedStore.))
(defn wrap-errors [handler]
(fn [req]
(let [response (handler req)]
(if-let [error (:error response)]
(if (= (:code response) 302)
(error/error->redirect response req)
(error/error->edn response req))
response))))
(defn wrap-context [handler redirect-on-error?]
(fn [req]
(let [result (or (and (-> req :session :login)
(ctx/user-authenticated? req))
(ctx/bearer-valid? req))]
(if (f/failed? result)
(if redirect-on-error?
result
(handler req))
(handler result)))))
(defn wrap-maybe-authorized [handler]
(-> handler
(wrap-context false)
(wrap-session {:store session-store})))
(defn wrap-authorized [handler]
(-> handler
(wrap-context true)
(wrap-errors)
(wrap-session {:store session-store})))
(defn login-form-handler [req]
(-> form/render-login-form
(wrap-anti-forgery)
(wrap-session {:store session-store})))
(defn login-submit-handler [req]
(-> form/handle-login-submit
(wrap-anti-forgery)
(wrap-session {:store session-store})))
(defn logout-handler [req]
(-> auth/unauthorize!
(wrap-context false)
(wrap-errors)
(wrap-session {:store session-store})))
(defn authorization-handler [req]
(-> auth/authorize!
(wrap-errors)
(wrap-session {:store session-store})
(wrap-restful-format :formats [:json-kw])))
(defn client-approve-handler [req]
(-> auth/approve!
(wrap-errors)
(wrap-anti-forgery)
(wrap-session {:store session-store})
(wrap-restful-format :formats [:json-kw])))
(defn client-refuse-handler [req]
(-> auth/refuse!
(wrap-errors)
(wrap-restful-format :formats [:json-kw])))
(defn token-handler [req]
(-> auth/issue-token!
(wrap-errors)
(wrap-restful-format :formats [:json-kw])))