diff options
Diffstat (limited to 'src')
| -rwxr-xr-x | src/cookie_login.clj | 2 | ||||
| -rwxr-xr-x | src/site.clj | 44 | ||||
| -rwxr-xr-x | src/utils.clj | 75 |
3 files changed, 82 insertions, 39 deletions
diff --git a/src/cookie_login.clj b/src/cookie_login.clj index ce41c66..e507876 100755 --- a/src/cookie_login.clj +++ b/src/cookie_login.clj @@ -38,7 +38,7 @@ "Middleware to support automatic cookie login. Must be placed after the with-session middleware. - Must be given three arguments: +Must be given three arguments: - process-login-token? Function to apply to request map to determine whether to process login token or not. If a false value is returned, diff --git a/src/site.clj b/src/site.clj index 7b75b71..2936f13 100755 --- a/src/site.clj +++ b/src/site.clj @@ -14,17 +14,7 @@ clojure.contrib.sql compojure cookie-login - image-utils - )) - -(let [db-host "localhost" - db-port 5432 - db-name "dumpfm"] - (def db {:classname "org.postgresql.Driver" - :subprotocol "postgresql" - :subname (str "//" db-host ":" db-port "/" db-name) - :user "postgres" - :password "root"})) + utils)) (def *run-flusher* true) (def *flusher-sleep-ms* 4000) @@ -80,12 +70,6 @@ (def formatter (new SimpleDateFormat "h:mm EEE M/d")) -(defn resp-error [message] - {:status 400 :headers {} :body message}) - -(defn resp-success [message] - {:status 200 :headers {} :body (json-str message)}) - (defn non-empty-string? [s] (and s (> (count s) 0))) @@ -104,19 +88,6 @@ (.setTimeZone df (TimeZone/getTimeZone "GMT")) (.format df dt)))) -;; Database - -(defn do-select [query] - (with-connection db - (with-query-results rs query - (doall rs)))) - -(defn do-count [query] - ((first (with-connection db - (with-query-results rs query - (doall rs)))) - :count)) - ;; User authentication (def nick-regex #"^[A-Za-z0-9\-_∆˚†]*$") @@ -274,13 +245,9 @@ (try [(aget x 0) (Long/parseLong (aget x 1)) (aget x 2)] (catch NumberFormatException _ nil)))) + (defn read-login-token [token] - (if-let [[nick expiry token-hash] (parse-login-token token)] - (if (>= expiry (System/currentTimeMillis)) - (let [db-info (fetch-nick nick) - computed-hash (sha1-hash (db-info :hash) expiry)] - (if (= token-hash computed-hash) - db-info))))) + nil) (defn make-login-token [{nick :nick hash :hash}] @@ -303,7 +270,7 @@ db-user (authorize-nick-hash nick hash) remember-me (= (params :rememberme) "yes") login-cookie (if remember-me - (make-login-token db-user *login-token-expiry*) + (make-login-token db-user) (clear-login-token *login-token-key*))] (if db-user [(session-assoc-from-db db-user) @@ -642,6 +609,7 @@ (-> request :route-params :room) (-> request :route-params :offset) params)) + (GET "/stats" (validated-stats session params)) ;; TODO: validate POST Referrer headers for POSTs (POST "/msg" (validated-msg session params)) (POST "/submit-registration" (register session params)) @@ -696,4 +664,4 @@ "/upload/*" (servlet multipart) "/*" (servlet pichat)) -(send-off flusher flush!)
\ No newline at end of file +(send-off flusher flush!) diff --git a/src/utils.clj b/src/utils.clj new file mode 100755 index 0000000..3ffd54b --- /dev/null +++ b/src/utils.clj @@ -0,0 +1,75 @@ +(ns utils + (:import java.text.SimpleDateFormat + java.util.Date) + (:use clojure.contrib.json.write + clojure.contrib.sql)) + +(let [db-host "localhost" + db-port 5432 + db-name "dumpfm"] + (def db {:classname "org.postgresql.Driver" + :subprotocol "postgresql" + :subname (str "//" db-host ":" db-port "/" db-name) + :user "postgres" + :password "root"})) + +;; JSON responses + +(def yyyy-mm-dd-formatter (new SimpleDateFormat "yyyy-MM-dd")) + +(defmethod print-json Date + [d] + (print-json (.format yyyy-mm-dd-formatter d))) + +(defn resp-error [message] + {:status 400 :headers {} :body message}) + +(defn resp-success [message] + {:status 200 :headers {} :body (json-str message)}) + +;; Database + +(defn do-select [query] + (with-connection db + (with-query-results rs query + (doall rs)))) + +(defn do-count [query] + ((first (with-connection db + (with-query-results rs query + (doall rs)))) + :count)) + + +;; Stats + +(defn msg-stats [ts] + (let [qry (str "SELECT created_on::date, count(*) FROM messages " + "GROUP BY created_on::date " + "ORDER BY created_on::date")] + (do-select [qry]))) + +(defn new-user-stats [ts] + (let [qry (str "SELECT created_on::date, count(*) FROM users " + "GROUP BY created_on::date " + "ORDER BY created_on::date")] + (do-select [qry]))) + +(defn msgs-per-user-stats [ts] + true) + +(def *stat-map* {"msgs" msg-stats + "new users" new-user-stats + "msgs per user" msgs-per-user-stats}) + +(defn stats [session params] + (let [stat (params :stat) + ts (params :timescale)] + (if-let [f (*stat-map* stat)] + (resp-success (f ts)) + (resp-error "UNKNOWN STAT")))) + +(defn validated-stats [session params] + (if (session :is_admin) + (stats session params) + (resp-error "BAD_REQUEST")))
\ No newline at end of file |
