summaryrefslogtreecommitdiff
path: root/src/clj/nicktodo/middleware.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/clj/nicktodo/middleware.clj')
-rw-r--r--src/clj/nicktodo/middleware.clj49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/clj/nicktodo/middleware.clj b/src/clj/nicktodo/middleware.clj
new file mode 100644
index 0000000..760114b
--- /dev/null
+++ b/src/clj/nicktodo/middleware.clj
@@ -0,0 +1,49 @@
+(ns nicktodo.middleware
+ (:require
+ [nicktodo.env :refer [defaults]]
+ [clojure.tools.logging :as log]
+ [nicktodo.layout :refer [error-page]]
+ [ring.middleware.anti-forgery :refer [wrap-anti-forgery]]
+ [nicktodo.middleware.formats :as formats]
+ [muuntaja.middleware :refer [wrap-format wrap-params]]
+ [nicktodo.config :refer [env]]
+ [ring.middleware.flash :refer [wrap-flash]]
+ [ring.adapter.undertow.middleware.session :refer [wrap-session]]
+ [ring.middleware.defaults :refer [site-defaults wrap-defaults]])
+ )
+
+(defn wrap-internal-error [handler]
+ (fn [req]
+ (try
+ (handler req)
+ (catch Throwable t
+ (log/error t (.getMessage t))
+ (error-page {:status 500
+ :title "Something very bad has happened!"
+ :message "We've dispatched a team of highly trained gnomes to take care of the problem."})))))
+
+(defn wrap-csrf [handler]
+ (wrap-anti-forgery
+ handler
+ {:error-response
+ (error-page
+ {:status 403
+ :title "Invalid anti-forgery token"})}))
+
+
+(defn wrap-formats [handler]
+ (let [wrapped (-> handler wrap-params (wrap-format formats/instance))]
+ (fn [request]
+ ;; disable wrap-formats for websockets
+ ;; since they're not compatible with this middleware
+ ((if (:websocket? request) handler wrapped) request))))
+
+(defn wrap-base [handler]
+ (-> ((:middleware defaults) handler)
+ wrap-flash
+ (wrap-session {:cookie-attrs {:http-only true}})
+ (wrap-defaults
+ (-> site-defaults
+ (assoc-in [:security :anti-forgery] false)
+ (dissoc :session)))
+ wrap-internal-error))