diff options
Diffstat (limited to 'src/clj/nicktodo/middleware.clj')
-rw-r--r-- | src/clj/nicktodo/middleware.clj | 49 |
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)) |