This commit is contained in:
Christian Mueller
2014-01-25 20:33:42 +01:00
parent 925e01a95b
commit 6cc030e855
4 changed files with 77 additions and 42 deletions
+41 -36
View File
@@ -45,11 +45,13 @@
([success message & params]
(assoc (create-response success) :message (apply format message params))))
(defn- get-path [noteID & description]
(let [[year month day title] (split noteID #" ")]
(if description
(str domain "/" (storage/create-short-url noteID {:year year :month month :day day :title title}))
(apply str (interpose "/" [domain year month day (ring.util.codec/url-encode title)])))))
(defn- get-path [token & [description]]
(if (= :url description)
(str domain "/" token)
(let [[year month day title] (split token #" ")]
(if description
(str domain "/" (storage/create-short-url token {:year year :month month :day day :title title}))
(apply str (interpose "/" [domain year month day (ring.util.codec/url-encode title)]))))))
(let [md5Instance (java.security.MessageDigest/getInstance "MD5")]
(defn get-signature
@@ -66,42 +68,45 @@
{:note note
:title (derive-title note)
:longURL (get-path noteID)
:shortURL (get-path noteID :short)
:shortURL (get-path noteID :id)
:statistics (storage/get-note-statistics noteID)
:status (create-response true)
:publisher (storage/get-publisher noteID)})
(create-response false "noteID '%s' unknown" noteID)))
(defn post-note
([note pid signature] (post-note note pid signature nil))
([note pid signature password]
;(log "post-note: %s" {:pid pid :signature signature :password password :note note})
(let [errors (filter identity
[(when-not (storage/valid-publisher? pid) "pid invalid")
(when-not (= signature (get-signature pid (storage/get-psk pid) note))
"signature invalid")
(when (blank? note) "note is empty")])]
(if (empty? errors)
(let [[year month day] (get-date)
untrimmed-line (filter #(or (= \- %) (Character/isLetterOrDigit %))
(-> note split-lines first (sreplace " " "-") lower-case))
trim (fn [s] (apply str (drop-while #(= \- %) s)))
title-uncut (-> untrimmed-line trim reverse trim reverse)
max-length (get-setting :max-title-length #(Integer/parseInt %) 80)
proposed-title (apply str (take max-length title-uncut))
date [year month day]
title (first (drop-while #(storage/note-exists? (build-key date %))
(cons proposed-title
(map #(str proposed-title "-" (+ 2 %)) (range)))))
noteID (build-key date title)
short-url (storage/create-short-url noteID {:year year :month month :day day :title title})]
(do
(storage/add-note noteID note pid password)
{:noteID noteID
:longURL (get-path noteID)
:shortURL (get-path noteID :short)
:status (create-response true)}))
{:status (create-response false (first errors))}))))
([note pid signature] (post-note note pid signature {}))
([note pid signature opts]
;(log "post-note: %s" {:pid pid :signature signature :password password :note note})
(let [errors (filter identity
[(when-not (storage/valid-publisher? pid) "pid invalid")
(when-not (= signature (get-signature pid (storage/get-psk pid) note))
"signature invalid")
(when (blank? note) "note is empty")])]
(if (empty? errors)
(let [[year month day] (map str (get-date))
password (opts :password)
params (opts :params {})
untrimmed-line (filter #(or (= \- %) (Character/isLetterOrDigit %))
(-> note split-lines first (sreplace " " "-") lower-case))
trim (fn [s] (apply str (drop-while #(= \- %) s)))
title-uncut (-> untrimmed-line trim reverse trim reverse)
max-length (get-setting :max-title-length #(Integer/parseInt %) 80)
proposed-title (apply str (take max-length title-uncut))
date [year month day]
title (first (drop-while #(storage/note-exists? (build-key date %))
(cons proposed-title
(map #(str proposed-title "-" (+ 2 %)) (range)))))
noteID (build-key date title)
new-params (assoc params :year year :month month :day day :title title)
short-url (storage/create-short-url noteID new-params)]
(do
(storage/add-note noteID note pid password)
{:noteID noteID
:longURL (get-path noteID)
:shortURL (get-path short-url :url)
:status (create-response true)}))
{:status (create-response false (first errors))}))))
(defn update-note [noteID note pid signature password]
@@ -116,6 +121,6 @@
(do
(storage/edit-note noteID note)
{:longURL (get-path noteID)
:shortURL (get-path noteID :short)
:shortURL (get-path noteID :id)
:status (create-response true)})
{:status (create-response false (first errors))})))
+9 -3
View File
@@ -158,7 +158,7 @@
(let [pid "NoteHub"
psk (storage/get-psk pid)]
(if (storage/valid-publisher? pid)
(let [resp (api/post-note note pid (api/get-signature pid psk note) password)]
(let [resp (api/post-note note pid (api/get-signature pid psk note) {:password password})]
(if (and
(storage/invalidate-session session)
(get-in resp [:status :success]))
@@ -188,8 +188,14 @@
(defpage [:get "/api/note"] {:keys [version noteID]}
(generate-string (api/get-note noteID)))
(defpage [:post "/api/note"] {:keys [version note pid signature password]}
(generate-string (api/post-note note pid signature password)))
(defpage [:post "/api/note"] {:keys [version note pid signature password] :as params}
(generate-string
(api/post-note
note
pid
signature
{:params (dissoc params :version :note :pid :signature :password)
:password password})))
(defpage [:put "/api/note"] {:keys [version noteID note pid signature password]}
(generate-string (api/update-note noteID note pid signature password)))