blob: d3fa2cc0eae9e77395a32f0f2945a946a0e4d72c (
plain)
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
|
(ns pics.handler.upload
(:require [clojure.string :as cstr]
[dotenv :as env]
[ring.util.response :as ruresp]
[clojure.java.io :as cjio]))
(def ^:private name-chars "abcdefghijklmnopqrstuvwxyz")
(defn gen-random-name []
(->> (map (fn [_] (rand-nth name-chars))
(range 10))
vec
(apply str)))
(defn save-image [multipart-params name]
(cjio/copy (get-in multipart-params ["image" :tempfile])
(cjio/file (str "./img/" name "." (-> multipart-params
(get-in ["image" :content-type])
(cstr/split #"\/")
second)))))
(defn authorized? [multipart-params]
(let [auth-keys-str (env/env "AUTH_KEYS")
auth-keys (delay (cstr/split auth-keys-str #","))]
(and (not (cstr/blank? auth-keys-str))
(some #(= % (get multipart-params "auth-key")) @auth-keys))))
(defn handle [req]
(let [multipart-params (:multipart-params req)
name (gen-random-name)]
(if (authorized? multipart-params)
(do (save-image multipart-params name)
(ruresp/response (str "http://" (:server-name req)
(when (not= (:server-port req) 80)
(str ":" (:server-port req)))
"/" name)))
(-> (ruresp/response "Forbidden.")
(ruresp/status 403)))))
|