summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorScott Ostler <sostler@deathmachine.local>2010-02-23 10:00:55 -0500
committerScott Ostler <sostler@deathmachine.local>2010-02-23 10:00:55 -0500
commitaf3d49a9c3092f600e62a66cc78a462ef9a70e7e (patch)
tree6f6e2f7576eea87c7d45fa4d8a63a835c253ac22 /src
parent8a981f390c286cb9c5935290e7846df903148278 (diff)
parent2b6c2cef9a3398dbafb1f6cfbc0323c0b83e2053 (diff)
Merge
Diffstat (limited to 'src')
-rwxr-xr-xsrc/cookie_login.clj2
-rwxr-xr-xsrc/site.clj44
-rwxr-xr-xsrc/utils.clj75
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