|
5 | 5 | a place for adding routes that apply to both (e.g., robots.txt, should we |
6 | 6 | ever need that for access-control)." |
7 | 7 | (:require |
| 8 | + [clojure.edn :as edn] |
8 | 9 | [cmr.access-control.api.routes :as api-routes] |
9 | 10 | [cmr.access-control.site.routes :as site-routes] |
10 | 11 | [cmr.acl.core :as acl] |
|
13 | 14 | [cmr.common-app.site.pages :as common-pages] |
14 | 15 | [cmr.common.api.context :as context] |
15 | 16 | [cmr.common.api.errors :as api-errors] |
| 17 | + [cmr.common.log :refer (warnf)] |
16 | 18 | [compojure.core :refer [routes]] |
17 | 19 | [ring.middleware.keyword-params :as keyword-params] |
18 | 20 | [ring.middleware.nested-params :as nested-params] |
|
24 | 26 | (site-routes/build-routes system) |
25 | 27 | (common-pages/not-found))) |
26 | 28 |
|
| 29 | +(defn- parse-group-permission |
| 30 | + "Safely parse group-permission parameter, handling both parsed and string formats." |
| 31 | + [group-permission] |
| 32 | + (cond |
| 33 | + (nil? group-permission) nil |
| 34 | + (map? group-permission) group-permission |
| 35 | + (string? group-permission) |
| 36 | + (try |
| 37 | + (edn/read-string {:readers {}} group-permission) |
| 38 | + (catch Exception _e |
| 39 | + (warnf "Failed to parse group-permission parameter: %s." group-permission) |
| 40 | + nil)) |
| 41 | + :else |
| 42 | + (do |
| 43 | + (warnf "Unexpected group-permission format: %s." (type group-permission)) |
| 44 | + nil))) |
| 45 | + |
| 46 | +(defn normalize-acl-search-params |
| 47 | + "Normalize params to handle format changes from HTTP library updates." |
| 48 | + [params] |
| 49 | + (if-let [gp (:group-permission params)] |
| 50 | + (assoc params :group-permission (parse-group-permission gp)) |
| 51 | + params)) |
| 52 | + |
| 53 | +(defn wrap-parse-group-permission |
| 54 | + "Middleware to parse group-permission params that may come as strings." |
| 55 | + [handler] |
| 56 | + (fn [request] |
| 57 | + (let [params (:params request) |
| 58 | + normalized (normalize-acl-search-params params) |
| 59 | + request' (assoc request :params normalized)] |
| 60 | + (handler request')))) |
| 61 | + |
27 | 62 | (defn handlers [system] |
28 | 63 | (-> (build-routes system) |
29 | 64 | acl/add-authentication-handler |
30 | 65 | common-routes/add-request-id-response-handler |
| 66 | + wrap-parse-group-permission |
31 | 67 | req-log/log-ring-request ;; Must be after request id |
32 | 68 | (context/build-request-context-handler system) |
33 | 69 | keyword-params/wrap-keyword-params |
|
0 commit comments