diff options
| author | sostler <sbostler@gmail.com> | 2009-11-23 00:18:13 -0500 |
|---|---|---|
| committer | sostler <sbostler@gmail.com> | 2009-11-23 00:18:13 -0500 |
| commit | 40a57a474294244832a6023a10592a38a6178b91 (patch) | |
| tree | d54ed4c460428ad391a1ed4f39990d2e8d20f868 /src | |
| parent | f6f4074a5a49f50e8ace54e88d199fa7ad8868b7 (diff) | |
| parent | 2c13339226f73621c9c539fbe93c8ac6333bbf48 (diff) | |
Registration
Diffstat (limited to 'src')
| -rw-r--r-- | src/site.clj | 67 |
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"])) |
