summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsostler <sbostler@gmail.com>2010-04-12 04:24:16 -0400
committersostler <sbostler@gmail.com>2010-04-12 04:24:16 -0400
commitc87fa8b63e7715e59e9fe45b3004bfc8615ce5b9 (patch)
tree216071b4f8b2029d16cb8c924f0635906b44096f
parent5587ef8a9b45ba7c969df2643ab1baa2591e2be4 (diff)
Made usernames/roomnames case insensitive
-rw-r--r--src/site.clj29
-rwxr-xr-xsrc/utils.clj12
2 files changed, 26 insertions, 15 deletions
diff --git a/src/site.clj b/src/site.clj
index ebf2077..57f9bb1 100644
--- a/src/site.clj
+++ b/src/site.clj
@@ -94,6 +94,9 @@
;; Room handling
+(defn lookup-room [key]
+ (@rooms (lower-case key)))
+
(defn fetch-rooms []
(do-select ["SELECT * FROM ROOMS"]))
@@ -362,6 +365,7 @@
(defn profile [session profile-nick offset]
(if-let [user-info (fetch-nick profile-nick)]
(let [st (fetch-template "profile" session)
+ profile-nick (:nick user-info)
nick (session :nick)
logger (make-time-logger)
is-home (and nick (= nick profile-nick))
@@ -528,7 +532,7 @@
(dosync (ref-set (room :topic) nil)))
(defn validate-set-topic [session params]
- (let [room (@rooms (params :room))
+ (let [room (lookup-room (params :room))
topic (params :topic)
deadline (params :deadline)
maker (params :maker)]
@@ -542,7 +546,7 @@
(resp-success "OK")))))
(defn validate-end-topic [session params]
- (let [room (@rooms (params :room))]
+ (let [room (lookup-room (params :room))]
(cond (not (is-vip? :is_admin)) (resp-error "NOT_VIP")
(not room) (resp-error "INVALID_ROOM")
:else (do
@@ -552,12 +556,11 @@
;; Chat
(defn validate-room-access [room-key session]
- (let [room (@rooms room-key)]
+ (let [room (lookup-room room-key)]
(and room
(or (not (room :admin_only))
(is-vip? session)))))
-;; 3/20/10: add template so multiple chat urls for ryder
(defn chat [session room template]
(let [now (System/currentTimeMillis)
nick (session :nick)
@@ -580,9 +583,11 @@
(.setAttribute st "timestamp" now)
(.toString st)))
+
+
(defn validated-chat [session room-key template]
(if (validate-room-access room-key session)
- (chat session (@rooms room-key) template)
+ (chat session (lookup-room room-key) template)
(resp-error "UNKNOWN_ROOM")))
(defn refresh [session params room]
@@ -601,7 +606,7 @@
(defn validated-refresh [session params]
(let [room-key (params :room)
- room (@rooms room-key)]
+ room (lookup-room room-key)]
(if (validate-room-access room-key session)
(refresh session params room)
(resp-error "UNKNOWN_ROOM"))))
@@ -630,7 +635,7 @@
(let [user-id (session :user_id)
nick (session :nick)
room-key (params :room)
- room (@rooms room-key)
+ room (lookup-room room-key)
content (.trim (params :content))
now (new Date)]
(cond (not room) (resp-error "BAD_ROOM")
@@ -652,7 +657,7 @@
;; Browser
(defn browser [session]
- (let [room (@rooms "dumpfm")
+ (let [room (lookup-room "dumpfm")
now (System/currentTimeMillis)
nick (session :nick)
st (fetch-template "browser" session)]
@@ -703,7 +708,7 @@
(defn validated-log [session room-key offset params]
(if (validate-room-access room-key session)
- (log session (@rooms room-key) offset params)
+ (log session (lookup-room room-key) offset params)
(resp-error "UNKNOWN_ROOM")))
;; Tags
@@ -881,7 +886,7 @@
(cond (not nick) [200 "NOT_LOGGED_IN"]
(not image) [200 "INVALID_REQUEST"]
(not (validate-room-access room-key session)) [200 "UNKNOWN_ROOM"]
- :else (do-upload session image (@rooms room-key)))))
+ :else (do-upload session image (lookup-room room-key)))))
;; N.B. -- Upload responses aren't JSON-evaluated
(defn do-upload-avatar [session image]
@@ -1022,8 +1027,8 @@
(dosync
(doseq [room-db (fetch-rooms)]
- (alter rooms assoc (room-db :key)
- (build-room-map-from-db room-db))))
+ (alter rooms assoc (lower-case (room-db :key))
+ (build-room-map-from-db room-db))))
(defn start-server [port]
(run-server {:port port}
diff --git a/src/utils.clj b/src/utils.clj
index 3e77710..ea696e5 100755
--- a/src/utils.clj
+++ b/src/utils.clj
@@ -122,7 +122,10 @@
;; User authentication
-; TODO: move to user module
+; TODO: create user module
+
+(defn first-or-nil [l]
+ (if (empty? l) nil (first l)))
(def nick-regex #"^[A-Za-z0-9\-_∆˚†]*$")
@@ -136,8 +139,11 @@
(> (count (do-select [query (lower-case nick)])) 0)))
(defn fetch-nick [nick]
- (let [query "SELECT * FROM users WHERE nick = ? LIMIT 1"]
- (first (do-select [query nick]))))
+ (let [q1 "SELECT * FROM users WHERE nick = ? LIMIT 1"
+ ; ORDER BY ensures consistent retrieval of ambiguious names
+ q2 "SELECT * FROM users WHERE lower(nick) = ? ORDER BY nick LIMIT 1"]
+ (or (first-or-nil (do-select [q1 nick]))
+ (first-or-nil (do-select [q2 (lower-case nick)])))))
(defn authorize-nick-hash [nick hash]
(let [db-user (fetch-nick nick)]