Skip to content

Commit 1414774

Browse files
committed
Migrated to pedestal and pedestal-route
1 parent acdf672 commit 1414774

File tree

10 files changed

+358
-299
lines changed

10 files changed

+358
-299
lines changed

deps.edn

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
{:deps
2-
{org.clojure/clojure {:mvn/version "1.10.1-beta2"}
3-
com.stuartsierra/component {:mvn/version "0.4.0"}
4-
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"}
5-
ring/ring-core {:mvn/version "1.6.3"}
6-
org.immutant/web {:mvn/version "2.1.10"}
7-
compojure {:mvn/version "1.6.1"}
8-
rum {:mvn/version "0.11.3"}
9-
com.cognitect/transit-clj {:mvn/version "0.8.313"}
10-
clj-http {:mvn/version "3.9.1"}
11-
cheshire {:mvn/version "5.8.1"} ; for clj-http :as :json
12-
cljs-drag-n-drop {:mvn/version "0.1.0"}
13-
com.cognitect/transit-cljs {:mvn/version "0.8.256"}}
2+
{org.clojure/clojure {:mvn/version "1.10.1-beta2"}
3+
com.stuartsierra/component {:mvn/version "0.4.0"}
4+
ring/ring-core {:mvn/version "1.6.3"}
5+
org.immutant/web {:mvn/version "2.1.10"}
6+
io.pedestal/pedestal.service {:mvn/version "0.5.5" :exclusions [cheshire/cheshire]}
7+
io.pedestal/pedestal.route {:mvn/version "0.5.5"}
8+
io.pedestal/pedestal.immutant {:mvn/version "0.5.5" :exclusions [javax.servlet/javax.servlet-api]}
9+
rum {:mvn/version "0.11.3"}
10+
com.cognitect/transit-clj {:mvn/version "0.8.313"}
11+
org.clojure/data.xml {:mvn/version "0.2.0-alpha6"}
12+
clj-http {:mvn/version "3.9.1"}
13+
cheshire {:mvn/version "5.8.1"} ; for clj-http :as :json
14+
cljs-drag-n-drop {:mvn/version "0.1.0"}
15+
com.cognitect/transit-cljs {:mvn/version "0.8.256"}}
1416
:paths ["src" "resources"]
1517
:aliases
1618
{:dev {:jvm-opts ["-ea" "--add-opens" "java.base/sun.nio.ch=ALL-UNNAMED"]
@@ -21,5 +23,4 @@
2123
:uberjar {:extra-paths ["target/uberjar"]}
2224
:package {:extra-paths ["package"]
2325
:extra-deps {org.clojure/clojurescript {:mvn/version "1.10.520"}
24-
uberdeps {:mvn/version "0.1.0"}}}
25-
}}
26+
uberdeps {:mvn/version "0.1.0"}}}}}

dev.cljs.edn

Lines changed: 0 additions & 6 deletions
This file was deleted.

dev/grumpy/figwheel.clj

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,26 @@
44
[cljs.stacktrace]
55
[figwheel.main.api :as fig]))
66

7-
(defrecord Figwheel [opts]
7+
8+
(defrecord Figwheel []
89
component/Lifecycle
910
(start [this]
10-
(println "[Figwheel] Starting figwheel build" (:build opts))
11-
(fig/start {:mode :serve
12-
:rebel-readline false
13-
:cljs-devtools false
14-
:helpful-classpaths false
15-
:open-url false}
16-
(:build opts))
11+
(println "[Figwheel] Starting figwheel build")
12+
(fig/start
13+
{:mode :serve
14+
:rebel-readline false
15+
:cljs-devtools false
16+
:helpful-classpaths false
17+
:open-url false}
18+
{:id "dev"
19+
:config {:watch-dirs ["src"]
20+
:css-dirs ["resources/static"]}
21+
:options {:main 'grumpy.editor
22+
:output-to "target/resources/static/editor.js"
23+
:output-dir "target/resources/static/editor"
24+
:asset-path "/static/editor"}})
1725
this)
1826
(stop [this]
19-
(println "[Figwheel] Stopping figwheel build" (:build opts))
20-
(fig/stop (:build opts))
27+
(println "[Figwheel] Stopping figwheel build")
28+
(fig/stop "dev")
2129
this))

dev/user.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848

4949
(reset! *figwheel
50-
(component/start (figwheel/map->Figwheel {:opts {:build "dev"}})))
50+
(component/start (figwheel/->Figwheel)))
5151

5252

5353
(reset)

resources/static/authors.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ body.dragover { background-color: #F0FCF0; }
3030
.autosave-clean { border: 1px solid #ccc; background: #ccc; }
3131
.autosave-dirty { border: 1px solid #aaa; background: #fff; }
3232
.autosave-saving { border: 1px solid #aaa; background: #eee; }
33-
.autosave-error { border: 1px solid #aaa; background: #c33; }
33+
.autosave-error { border: 1px solid #c33; background: #c33; }
3434

3535
.edit-post_picture { min-height: 60px; position: relative; }
3636
.edit-post_picture-empty { background-image: url("/static/upload.svg"); background-color: #999; background-repeat: no-repeat; background-position: center center; opacity: 0.2; }

src/grumpy/auth.clj

Lines changed: 122 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22
(:require
33
[rum.core :as rum]
44
[clojure.set :as set]
5-
[grumpy.core :as grumpy]
5+
[clojure.string :as str]
66
[clojure.java.io :as io]
7-
[compojure.core :as compojure]
87
[clojure.java.shell :as shell]
8+
[io.pedestal.http.route :as route]
99
[ring.middleware.session :as session]
10-
[ring.middleware.session.cookie :as session.cookie])
10+
[io.pedestal.interceptor :as interceptor]
11+
[io.pedestal.http.body-params :as body-params]
12+
[ring.middleware.session.cookie :as session.cookie]
13+
[io.pedestal.http.ring-middlewares :as middlewares]
14+
[grumpy.core :as grumpy]
15+
[grumpy.routes :as routes])
1116
(:import
1217
[java.security SecureRandom]))
1318

@@ -67,45 +72,54 @@
6772
(:value token)))))
6873

6974

70-
(defn- expire-session [handler]
71-
(fn [req]
72-
(let [created (:created (:session req))]
73-
(if (and (some? created)
74-
(> (grumpy/age created) session-ttl-ms))
75-
(handler (dissoc req :session))
76-
(handler req)))))
77-
78-
79-
(defn force-user [handler]
80-
(fn [req]
81-
(if-some [u grumpy/forced-user]
82-
(some-> req
83-
(assoc-in [:session :user] u)
84-
(handler)
85-
(assoc :cookies { "grumpy_user" { :value u }}
86-
:session { :user u
87-
:created (grumpy/now) }))
88-
(handler req))))
75+
(def expire-session
76+
{:name ::expire-session
77+
:enter
78+
(fn [ctx]
79+
(let [created (-> ctx :request :session :created)]
80+
(if (and (some? created)
81+
(> (grumpy/age created) session-ttl-ms))
82+
(update ctx :request dissoc :session)
83+
ctx)))})
84+
85+
86+
(def force-user
87+
{:name ::force-user
88+
:enter
89+
(fn [ctx]
90+
(if-some [u grumpy/forced-user]
91+
(assoc-in ctx [:request :session :user] u)
92+
ctx))
93+
:leave
94+
(fn [ctx]
95+
(if-some [u grumpy/forced-user]
96+
(update ctx :response assoc :cookies {"grumpy_user" {:value u}}
97+
:session {:user u
98+
:created (grumpy/now)})
99+
ctx))})
89100

90101

91-
(defn wrap-session [handler]
92-
(-> handler
93-
(expire-session)
94-
(force-user)
95-
(session/wrap-session
96-
{ :store (session.cookie/cookie-store { :key cookie-secret })
97-
:cookie-name "grumpy_session"
98-
:cookie-attrs { :http-only true
99-
:secure (not grumpy/dev?) }})))
102+
(def session
103+
(middlewares/session
104+
{:store (session.cookie/cookie-store {:key cookie-secret})
105+
:cookie-name "grumpy_session"
106+
:cookie-attrs {:http-only true
107+
:secure (not grumpy/dev?)}}))
108+
109+
110+
(def populate-session [session force-user expire-session])
100111

101112

102113
(defn user [req]
103114
(get-in req [:session :user]))
104115

105116

106-
(defn check-session [req]
107-
(when (nil? (user req))
108-
(grumpy/redirect "/forbidden" { :redirect-url (:uri req) })))
117+
(def require-user
118+
{:name ::require-user
119+
:enter (fn [{req :request :as ctx}]
120+
(if (nil? (user req))
121+
(assoc ctx :response (grumpy/redirect "/forbidden" {:redirect-url (:uri req)}))
122+
ctx))})
109123

110124

111125
(rum/defc email-sent-page [message]
@@ -116,72 +130,78 @@
116130

117131

118132
(rum/defc forbidden-page [redirect-url email]
119-
(grumpy/page { :title "Log in"
120-
:styles ["authors.css"] }
133+
(grumpy/page {:title "Log in"
134+
:styles ["authors.css"]}
121135
[:form.forbidden
122-
{ :action "/send-email"
123-
:method "post" }
124-
[:.form_row
125-
[:input { :type "text"
126-
:name "email"
127-
:placeholder "E-mail"
128-
:autofocus true
129-
:value email }]
130-
[:input { :type "hidden" :name "redirect-url" :value redirect-url }]]
131-
[:.form_row
132-
[:button "Send email"]]]))
133-
134-
135-
(compojure/defroutes routes
136-
(compojure/GET "/forbidden" [:as req]
137-
(let [redirect-url (get (:params req) "redirect-url")
138-
user (get-in (:cookies req) ["grumpy_user" :value])
139-
email (:email (grumpy/author-by :user user))]
140-
(grumpy/html-response (forbidden-page redirect-url email))))
141-
142-
(compojure/GET "/authenticate" [:as req] ;; ?email=...&token=...&redirect-url=...
143-
(let [email (get (:params req) "email")
144-
user (:user (grumpy/author-by :email email))
145-
token (get (:params req) "token")
146-
redirect-url (get (:params req) "redirect-url")]
147-
(if (= token (get-token email))
148-
(do
149-
(swap! *tokens dissoc email)
150-
(assoc
151-
(grumpy/redirect redirect-url)
152-
:cookies { "grumpy_user" { :value user }}
153-
:session { :user user
154-
:created (grumpy/now) }))
155-
{ :status 403
156-
:body "403 Bad token" })))
157-
158-
(compojure/GET "/logout" [:as req]
159-
(assoc
160-
(grumpy/redirect "/")
161-
:session nil))
162-
163-
(compojure/POST "/send-email" [:as req]
164-
(let [params (:params req)
165-
email (get params "email")
166-
user (:user (grumpy/author-by :email email))]
167-
(cond
168-
(nil? (grumpy/author-by :email email))
169-
(grumpy/redirect "/email-sent" { :message (str "You aren't the author, " email) })
170-
(some? (get-token email))
171-
(grumpy/redirect "/email-sent" { :message (str "Emailed link is still valid, " user) })
172-
:else
173-
(let [token (gen-token)
174-
redirect-url (get params "redirect-url")
175-
link (grumpy/url (str grumpy/hostname "/authenticate")
176-
{ :email email
177-
:token token
178-
:redirect-url redirect-url })]
179-
(swap! *tokens assoc email { :value token :created (grumpy/now) })
180-
(send-email!
181-
{ :to email
182-
:subject (str "Log into Grumpy " (grumpy/format-date (grumpy/now)))
183-
:body (str "<html><div style='text-align: center;'><a href=\"" link "\" style='display: inline-block; font-size: 16px; padding: 0.5em 1.75em; background: #c3c; color: white; text-decoration: none; border-radius: 4px;'>Login now!</a></div></html>") })
184-
(grumpy/redirect "/email-sent" { :message (str "Check your email, " user) })))))
185-
186-
(compojure/GET "/email-sent" [:as req]
187-
(grumpy/html-response (email-sent-page (get-in req [:params "message"])))))
136+
{:action "/send-email"
137+
:method "post" }
138+
[:.form_row
139+
[:input {:type "text"
140+
:name "email"
141+
:placeholder "E-mail"
142+
:autofocus true
143+
:value email}]
144+
[:input {:type "hidden" :name "redirect-url" :value redirect-url}]]
145+
[:.form_row
146+
[:button "Send email"]]]))
147+
148+
149+
(defn handle-forbidden [{:keys [query-params cookies]}]
150+
(let [user (get-in cookies ["grumpy_user" :value])
151+
email (:email (grumpy/author-by :user user))]
152+
(grumpy/html-response (forbidden-page (:redirect-url query-params) email))))
153+
154+
155+
(defn handle-send-email [{:keys [form-params] :as req}]
156+
(let [email (:email form-params)
157+
user (:user (grumpy/author-by :email email))]
158+
(cond
159+
(nil? (grumpy/author-by :email email))
160+
(grumpy/redirect "/email-sent" {:message (str "You aren't the author, " email)})
161+
162+
(some? (get-token email))
163+
(grumpy/redirect "/email-sent" {:message (str "Emailed link is still valid, " user)})
164+
165+
:else
166+
(let [token (gen-token)
167+
redirect-url (:redirect-url form-params)
168+
link (grumpy/url (str grumpy/hostname "/authenticate")
169+
{:email email
170+
:token token
171+
:redirect-url redirect-url})]
172+
(swap! *tokens assoc email { :value token :created (grumpy/now) })
173+
(send-email!
174+
{:to email
175+
:subject (str "Log into Grumpy " (grumpy/format-date (grumpy/now)))
176+
:body (str "<html><div style='text-align: center;'><a href=\"" link "\" style='display: inline-block; font-size: 16px; padding: 0.5em 1.75em; background: #c3c; color: white; text-decoration: none; border-radius: 4px;'>Login now!</a></div></html>")})
177+
(grumpy/redirect "/email-sent" {:message (str "Check your email, " user)})))))
178+
179+
180+
(defn handle-email-sent [{:keys [query-params]}]
181+
(grumpy/html-response (email-sent-page (:message query-params))))
182+
183+
184+
(defn handle-authenticate [{:keys [query-params]}] ;; ?email=...&token=...&redirect-url=...
185+
(let [email (:email query-params)
186+
user (:user (grumpy/author-by :email email))
187+
redirect-url (if (str/blank? (:redirect-url query-params))
188+
"/"
189+
(:redirect-url query-params))]
190+
(if (= (:token query-params) (get-token email))
191+
(do
192+
(swap! *tokens dissoc email)
193+
(assoc (grumpy/redirect redirect-url)
194+
:cookies {"grumpy_user" {:value user}}
195+
:session {:user user
196+
:created (grumpy/now)}))
197+
{:status 403
198+
:body "403 Bad token"})))
199+
200+
201+
(def routes
202+
(routes/expand
203+
[:get "/forbidden" populate-session route/query-params `handle-forbidden]
204+
[:post "/send-email" populate-session (body-params/body-params) `handle-send-email]
205+
[:get "/email-sent" populate-session route/query-params `handle-email-sent]
206+
[:get "/authenticate" populate-session route/query-params `handle-authenticate]
207+
[:get "/logout" populate-session (fn [_] (assoc (grumpy/redirect "/") :session nil))]))

0 commit comments

Comments
 (0)