summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsostler <sbostler@gmail.com>2009-11-23 00:18:13 -0500
committersostler <sbostler@gmail.com>2009-11-23 00:18:13 -0500
commit40a57a474294244832a6023a10592a38a6178b91 (patch)
treed54ed4c460428ad391a1ed4f39990d2e8d20f868 /src
parentf6f4074a5a49f50e8ace54e88d199fa7ad8868b7 (diff)
parent2c13339226f73621c9c539fbe93c8ac6333bbf48 (diff)
Registration
Diffstat (limited to 'src')
-rw-r--r--src/site.clj67
1 files changed, 63 insertions, 4 deletions
diff --git a/src/site.clj b/src/site.clj
index 8ca16d6..417130e 100644
--- a/src/site.clj
+++ b/src/site.clj
@@ -1,9 +1,20 @@
; site.clj
(ns pichat
- (:import java.lang.System)
+ (:import java.lang.System
+ org.apache.commons.codec.digest.DigestUtils)
(:use compojure
- clojure.contrib.json.write))
+ 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"}))
(defstruct user-struct :nick :last-seen)
(defstruct message-struct :nick :content :timestamp)
@@ -54,13 +65,59 @@
([] {"users" (sort (keys @users)) "messages" (new-messages)})
([since] {"users" (sort (keys @users)) "messages" (new-messages since)}))
+(defn do-select [query]
+ (with-connection db
+ (with-query-results rs [query]
+ (doall rs))))
+
+(defn retrieve-nick [nick]
+ (let [query (str "SELECT * FROM users WHERE nick = '" nick "'")]
+ (first (do-select query))))
+
+(defn authorize-nick-hash [nick hash]
+ (let [db-user (retrieve-nick nick)]
+ (and db-user (= (db-user :hash) hash))))
+
+(defn register [session params]
+ (let [nick (params :nick)
+ email (params :email)
+ hash (params :hash)]
+ (if (retrieve-nick nick)
+ (resp-error "NICK_TAKEN")
+ (with-connection db
+ (insert-values :users
+ [:nick :hash :email]
+ [nick hash email])
+ (resp-success "OK")))))
+
+(defn renamed-user-struct [old-nick nick]
+ (let [old-struct (@users old-nick)]
+ (if old-struct
+ (assoc old-struct :nick nick)
+ (struct user-struct nick (System/currentTimeMillis)))))
+
+(defn login [session params]
+ (let [old-nick (session :nick)
+ nick (params :nick)
+ hash (params :hash)
+ ts (params :ts)]
+ (if (authorize-nick-hash nick hash)
+ (dosync
+ (set-session {:nick nick :logged-in true})
+ (let [user-struct (renamed-user-struct old-nick nick)]
+ (alter users dissoc old-nick)
+ (alter users assoc nick user-struct)
+ [(session-assoc :nick nick :logged-in true)
+ (resp-success "OK")]))
+ (resp-error "BAD_LOGIN"))))
+
(defn init [session]
(let [new-nick (make-random-nick)]
(dosync
(alter users assoc new-nick
(struct user-struct new-nick (System/currentTimeMillis)))
[(session-assoc :nick new-nick)
- (resp-success (assoc (updates) :nick new-nick))])))
+ (resp-success (assoc (updates) :nick new-nick :loggedin false))])))
(defn refresh [nick]
(dosync
@@ -70,7 +127,6 @@
(resp-success (updates last-seen)))
(resp-error "UNKNOWN_USER"))))
-
(defn msg [session params]
(dosync
(let [nick (session :nick)
@@ -86,7 +142,10 @@
(GET "/static/*" (or (serve-file "static" (params :*))
:next))
(GET "/favicon.ico" (serve-file "static" "favicon.ico"))
+ (GET "/register" (serve-file "static" "register.html"))
+ (GET "/submit-registration" (register session params))
(GET "/init" (init (session :nick)))
+ (GET "/login" (login session params))
(GET "/refresh" (refresh (session :nick)))
(GET "/msg" (msg session params))
(ANY "*" [404 "Page not found"]))