diff options
-rw-r--r-- | src/org/gnu/clojure/gnunet/identity.clj | 4 | ||||
-rw-r--r-- | src/org/gnu/clojure/gnunet/peer.clj | 43 |
2 files changed, 41 insertions, 6 deletions
diff --git a/src/org/gnu/clojure/gnunet/identity.clj b/src/org/gnu/clojure/gnunet/identity.clj index 9ddbef9..adece97 100644 --- a/src/org/gnu/clojure/gnunet/identity.clj +++ b/src/org/gnu/clojure/gnunet/identity.clj @@ -3,7 +3,7 @@ (defn generate-id "Generate the SHA-512 digest of the encoded public key." - [keypair] - (sha-512 (encode-rsa-public-key (.getPublic keypair)))) + [public-key] + (sha-512 (encode-rsa-public-key public-key))) (def id-size (count (sha-512 ()))) diff --git a/src/org/gnu/clojure/gnunet/peer.clj b/src/org/gnu/clojure/gnunet/peer.clj index cc3c7a5..0c3a0d6 100644 --- a/src/org/gnu/clojure/gnunet/peer.clj +++ b/src/org/gnu/clojure/gnunet/peer.clj @@ -1,14 +1,24 @@ (ns org.gnu.clojure.gnunet.peer - (:use (org.gnu.clojure.gnunet identity))) + (:use (org.gnu.clojure.gnunet identity)) + (:import java.util.Date)) (defstruct remote-peer :public-key - :id) + :id + :transports-agent) + +(defn new-remote-peer-from-hello + [hello] + (struct-map remote-peer + :public-key (:public-key hello) + :id (generate-id (:public-key hello)) + :transports-agent (agent (:transports hello)))) (def peer (apply create-struct (concat (keys (struct-map remote-peer)) (list - :private-key)))) + :private-key + :remote-peers-agent)))) (defstruct peer-options :keypair) @@ -16,5 +26,30 @@ (defn new-peer [options] (struct-map peer :public-key (.getPublic (:keypair options)) + :id (generate-id (.getPublic (:keypair options))) + :transports-agent (agent []) :private-key (.getPrivate (:keypair options)) - :id (generate-id (:keypair options)))) + :remote-peers-agent (agent {}))) + +(def filter-expired-transports + (partial filter #(< (:expiration %) (Date.)))) + +;; Event - Peer receives a HELLO message +(defn admit-hello! + [peer hello] + (letfn [(update-transports + [transports new-transports] + (filter-expired-transports (concat transports new-transports))) + (update-remote-peers + [remote-peers hello] + (let [id (vec (generate-id (:public-key hello))) + remote-peer (remote-peers id)] + (if remote-peer + (do + (send + (:transports-agent remote-peer) + update-transports + (:transports hello)) + remote-peers) + (assoc remote-peers id (new-remote-peer-from-hello hello)))))] + (send (:remote-peers-agent peer) update-remote-peers hello))) |