PageRenderTime 21ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/src/capra/account.clj

http://github.com/weavejester/capra
Clojure | 71 lines | 60 code | 11 blank | 0 comment | 2 complexity | 0ead9deac46c1b241b64345cf363a3f4 MD5 | raw file
  1. (ns capra.account
  2. "Access and manage accounts on a Capra server."
  3. (:refer-clojure :exclude [get list])
  4. (:use capra.base64)
  5. (:use capra.http-client)
  6. (:use capra.io-utils)
  7. (:use capra.util)
  8. (:use capra.system)
  9. (:import java.io.File))
  10. (def key-file
  11. (File. *capra-home* "account.keys"))
  12. (def account-keys
  13. (atom (or (read-file key-file) {})))
  14. (defn get-key
  15. "Get the key for an account or throw an exception if none exist."
  16. [account-name]
  17. (or (@account-keys account-name)
  18. (throwf "No registered passkey for account.")))
  19. (defn save-key!
  20. "Add a new account name and key to account-keys."
  21. [account-name passkey]
  22. (swap! account-keys assoc account-name passkey)
  23. (write-file key-file @account-keys))
  24. (defn- assoc-package
  25. "Assoc a package with a map, using the package name as the key."
  26. [package-map package]
  27. (let [package (dissoc package :account :href)]
  28. (assoc package-map (package :name) package)))
  29. (defn- format-packages
  30. "Turn a list of packages into a map of packages."
  31. [packages]
  32. (reduce assoc-package {} packages))
  33. (defn list
  34. "List all Capra accounts on server."
  35. []
  36. (set (map :name (http-get *source*))))
  37. (defn get
  38. "Get a Capra account by name."
  39. [name]
  40. (if-let [account (http-get (str *source* "/" name))]
  41. (update-in account [:packages] format-packages)))
  42. (defn create
  43. "Create a new Capra account from a map of values."
  44. [account]
  45. (doto (http-connect "POST" *source*)
  46. (send-data account)))
  47. (defn register
  48. "Register a new Capra account with a random passkey. The passkey is saved to
  49. account-keys, and automatically used when updating or creating private data."
  50. [name email]
  51. (let [passkey (base64-encode (random-bytes 24))]
  52. (create {:name name, :passkey passkey, :email email})
  53. (save-key! name passkey)))
  54. (defn put
  55. "Update an existing Capra account."
  56. [account]
  57. (let [name (account :name)]
  58. (doto (http-connect "PUT" (str *source* "/" name))
  59. (basic-auth name (get-key name))
  60. (send-data account))))