summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/org/gnu/clojure/gnunet/identity.clj4
-rw-r--r--src/org/gnu/clojure/gnunet/peer.clj43
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)))