summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/site.clj81
1 files changed, 42 insertions, 39 deletions
diff --git a/src/site.clj b/src/site.clj
index 4ba5981..c36f1ae 100755
--- a/src/site.clj
+++ b/src/site.clj
@@ -7,7 +7,8 @@
org.apache.commons.codec.digest.DigestUtils
javax.servlet.http.Cookie
org.antlr.stringtemplate.StringTemplateGroup)
- (:use clojure.contrib.str-utils
+ (:use clojure.xml
+ clojure.contrib.str-utils
clojure.contrib.duck-streams
clojure.contrib.json.write
clojure.contrib.sql
@@ -24,6 +25,10 @@
:user "postgres"
:password "root"}))
+(def *run-flusher* true)
+(def *flusher-sleep-ms* 4000)
+(def *user-timeout-ms* 15000)
+
(def template-group (new StringTemplateGroup "dumpfm" "template"))
(.setRefreshInterval template-group 3)
@@ -35,24 +40,19 @@
(System/currentTimeMillis)))
(def rooms (ref {}))
-
-(def run-flusher true)
-(def flusher-sleep-ms 4000)
-(def user-timeout-ms 15000)
-
(def flusher (agent nil))
(defn flush! [x]
- (when run-flusher
+ (when *run-flusher*
(send-off *agent* #'flush!))
(doseq [[rid room] @rooms]
(dosync
(let [users (room :users)
now (System/currentTimeMillis)
- alive? (fn [[n u]] (> (u :last-seen) (- now user-timeout-ms)))]
+ alive? (fn [[n u]] (> (u :last-seen) (- now *user-timeout-ms*)))]
(ref-set users
(into {} (filter alive? @users))))))
- (. Thread (sleep flusher-sleep-ms))
+ (. Thread (sleep *flusher-sleep-ms*))
x)
;; Configuration
@@ -69,6 +69,9 @@
;; Utils
+(defn ms-in-future [ms]
+ (+ ms (System/currentTimeMillis)))
+
(defn swap [f]
(fn [& more] (apply f (reverse more))))
@@ -170,7 +173,7 @@
"messages" (map process-message-for-json
(new-messages room since))})
-(def dumps-per-page 20)
+(def *dumps-per-page* 20)
(defn maybe-parse-int [s f]
(if s (Integer/parseInt s) f))
@@ -193,7 +196,7 @@
"WHERE room_id = ? AND m.user_id = u.user_id "
(if image-only "AND m.is_image = true " "")
"ORDER BY created_on DESC "
- "LIMIT " dumps-per-page " OFFSET ?")]
+ "LIMIT " *dumps-per-page* " OFFSET ?")]
(do-select [query room-id offset]))))
(defn count-messages-by-nick [nick image-only]
@@ -213,9 +216,18 @@
"AND r.room_id = m.room_id AND r.admin_only = false "
(if image-only "AND m.is_image = true " "")
"ORDER BY created_on DESC "
- "LIMIT " dumps-per-page " OFFSET ?")]
+ "LIMIT " *dumps-per-page* " OFFSET ?")]
(do-select [query nick offset]))))
+(defn build-room-map-from-db [room-db]
+ {:admin_only (room-db :admin_only)
+ :room_id (room-db :room_id)
+ :key (room-db :key)
+ :name (room-db :name)
+ :description (room-db :description)
+ :users (ref {})
+ :messages (ref (fetch-messages-by-room (room-db :room_id) false))})
+
;; Templates
(defn fetch-template [template-name session]
@@ -243,10 +255,10 @@
;; login-token functions
-(defn is-logged-in?
+(defn logged-in?
"Test whether user is logged in by presence of nick key in session."
- [session]
- (contains? session :nick))
+ [request]
+ (contains? (request :session) :nick))
(defn encode-login-token [nick hash expiry]
(let [token-hash (sha1-hash hash expiry)]
@@ -268,11 +280,11 @@
db-info)))))
(defn make-login-token
- [{nick :nick hash :hash} expiry]
- (let [expiration (+ (System/currentTimeMillis) expiry)]
- (set-cookie *default-login-token-key* (encode-login-token nick
- hash
- expiration)
+ [{nick :nick hash :hash}]
+ (let [expiration (ms-in-future *login-token-expiry*)]
+ (set-cookie *login-token-key* (encode-login-token nick
+ hash
+ expiration)
:expires (gmt-string (new Date expiration)))))
;; Landing
@@ -288,8 +300,8 @@
db-user (authorize-nick-hash nick hash)
remember-me (= (params :rememberme) "yes")
login-cookie (if remember-me
- (make-login-token db-user *default-login-token-expiry*)
- (clear-login-token *default-login-token-key*))]
+ (make-login-token db-user *login-token-expiry*)
+ (clear-login-token *login-token-key*))]
(if db-user
[(session-assoc-from-db db-user)
login-cookie
@@ -298,7 +310,7 @@
(defn logout [session]
[(session-dissoc :nick :user_id :is_admin :avatar)
- (clear-login-token *default-login-token-key*)
+ (clear-login-token *login-token-key*)
(redirect-to "/")])
;; Registration
@@ -327,7 +339,7 @@
is-home (and nick (= nick profile-nick))
has-avatar (non-empty-string? (user-info :avatar))
offset (maybe-parse-int offset 0)
- dump-offset (* offset dumps-per-page)
+ dump-offset (* offset *dumps-per-page*)
dumps (fetch-messages-by-nick profile-nick true dump-offset)
dump-count (count-messages-by-nick profile-nick true)
st (fetch-template "profile" session)]
@@ -339,7 +351,7 @@
(if (non-empty-string? v) (escape-html v)))))
(.setAttribute st "dumps"
(to-array (map process-message-for-output dumps)))
- (if (< (+ dump-offset dumps-per-page) dump-count)
+ (if (< (+ dump-offset *dumps-per-page*) dump-count)
(.setAttribute st "next" (inc offset)))
(if (not= offset 0)
(.setAttribute st "prev" (max (dec offset) 0)))
@@ -491,13 +503,13 @@
(defn log [session room offset params]
(let [st (fetch-template "log" session)
offset (maybe-parse-int offset 0)
- dump-offset (* offset dumps-per-page)
+ dump-offset (* offset *dumps-per-page*)
image-only (and (not (room :admin_only))
(not= (params :show) "all"))
dumps (to-array (map process-message-for-output
(fetch-messages-by-room (room :room_id) image-only dump-offset)))
dump-count (count-messages-by-room (room :room_id) image-only)]
- (if (< (+ dump-offset dumps-per-page) dump-count)
+ (if (< (+ dump-offset *dumps-per-page*) dump-count)
(.setAttribute st "next" (inc offset)))
(if (not= offset 0)
(.setAttribute st "prev" (max (dec offset) 0)))
@@ -613,15 +625,12 @@
"zip" "application/zip"})
(decorate static
- (with-mimetypes))
+ (with-mimetypes {:mimetypes mimetypes}))
(decorate pichat
- (with-cookie-login {:is-logged-in? is-logged-in?
- :token-maker make-login-token
- :token-reader read-login-token})
(with-mimetypes {:mimetypes mimetypes})
+ (with-cookie-login (comp not logged-in?) make-login-token read-login-token)
(with-session {:type :memory, :expires (* 60 60)}))
-
(decorate multipart
(with-mimetypes {:mimetypes mimetypes})
@@ -633,13 +642,7 @@
(dosync
(doseq [room-db (fetch-rooms)]
(alter rooms assoc (room-db :key)
- {:admin_only (room-db :admin_only)
- :room_id (room-db :room_id)
- :key (room-db :key)
- :name (room-db :name)
- :description (room-db :description)
- :users (ref {})
- :messages (ref (fetch-messages-by-room (room-db :room_id) false))})))
+ (build-room-map-from-db room-db))))
(run-server {:port 8080}
"/static/*" (servlet static)