implement ipns publisher code
Jeromy committed
Sep 12, 2014 at 02:41 UTC
4c0f18cbbde4982ee5f47b8c885e510650bd689c
6 files changed
+95
-21
core/core.go
-2
@@ -238,5 +238,3 @@ func (n *IpfsNode) PinDagNode(nd *merkledag.Node) error {
238
u.DOut("Pinning node. Currently No-Op\n")
239
return nil
240
}
241
-
242
-func (n *IpfsNode) SetIpnsEntry() {}
namesys/entry.pb.go
+7
-7
@@ -9,7 +9,7 @@ It is generated from these files:
9
entry.proto
10
11
It has these top-level messages:
12
- InpsEntry
12
+ IpnsEntry
13
*/
14
package namesys
15
@@ -20,24 +20,24 @@ import math "math"
20
var _ = proto.Marshal
21
var _ = math.Inf
22
23
-type InpsEntry struct {
23
+type IpnsEntry struct {
24
Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"`
25
Signature []byte `protobuf:"bytes,2,req,name=signature" json:"signature,omitempty"`
26
XXX_unrecognized []byte `json:"-"`
27
}
28
29
-func (m *InpsEntry) Reset() { *m = InpsEntry{} }
30
-func (m *InpsEntry) String() string { return proto.CompactTextString(m) }
31
-func (*InpsEntry) ProtoMessage() {}
29
+func (m *IpnsEntry) Reset() { *m = IpnsEntry{} }
30
+func (m *IpnsEntry) String() string { return proto.CompactTextString(m) }
31
+func (*IpnsEntry) ProtoMessage() {}
32
33
-func (m *InpsEntry) GetValue() []byte {
33
+func (m *IpnsEntry) GetValue() []byte {
34
if m != nil {
35
return m.Value
36
}
37
return nil
38
}
39
40
-func (m *InpsEntry) GetSignature() []byte {
40
+func (m *IpnsEntry) GetSignature() []byte {
41
if m != nil {
42
return m.Signature
43
}
namesys/entry.proto
+1
-1
@@ -1,6 +1,6 @@
1
package namesys;
2
3
-message InpsEntry {
3
+message IpnsEntry {
4
required bytes value = 1;
5
required bytes signature = 2;
6
}
namesys/publisher.go
new
+64
@@ -0,0 +1,64 @@
1
+package namesys
2
+
3
+import (
4
+ "code.google.com/p/goprotobuf/proto"
5
+
6
+ ci "github.com/jbenet/go-ipfs/crypto"
7
+ mdag "github.com/jbenet/go-ipfs/merkledag"
8
+ routing "github.com/jbenet/go-ipfs/routing"
9
+ u "github.com/jbenet/go-ipfs/util"
10
+)
11
+
12
+type IpnsPublisher struct {
13
+ dag *mdag.DAGService
14
+ routing routing.IpfsRouting
15
+}
16
+
17
+// Publish accepts a keypair and a value,
18
+func (p *IpnsPublisher) Publish(k ci.PrivKey, value u.Key) error {
19
+ data, err := CreateEntryData(k, value)
20
+ if err != nil {
21
+ return err
22
+ }
23
+ pubkey := k.GetPublic()
24
+ pkbytes, err := pubkey.Bytes()
25
+ if err != nil {
26
+ return nil
27
+ }
28
+
29
+ nameb, err := u.Hash(pkbytes)
30
+ if err != nil {
31
+ return nil
32
+ }
33
+ namekey := u.Key(nameb).Pretty()
34
+
35
+ ipnskey, err := u.Hash([]byte("ipns:" + namekey))
36
+ if err != nil {
37
+ return err
38
+ }
39
+
40
+ // Store associated public key
41
+ err = p.routing.PutValue(u.Key(nameb), pkbytes)
42
+ if err != nil {
43
+ return err
44
+ }
45
+
46
+ // Store ipns entry at h("ipns:"+b58(h(pubkey)))
47
+ err = p.routing.PutValue(u.Key(ipnskey), data)
48
+ if err != nil {
49
+ return err
50
+ }
51
+
52
+ return nil
53
+}
54
+
55
+func CreateEntryData(pk ci.PrivKey, val u.Key) ([]byte, error) {
56
+ entry := new(IpnsEntry)
57
+ sig, err := pk.Sign([]byte(val))
58
+ if err != nil {
59
+ return nil, err
60
+ }
61
+ entry.Signature = sig
62
+ entry.Value = []byte(val)
63
+ return proto.Marshal(entry)
64
+}
namesys/resolver.go
+14
-1
@@ -1,6 +1,11 @@
1
package namesys
2
3
-import "strings"
3
+import (
4
+ "strings"
5
+
6
+ mdag "github.com/jbenet/go-ipfs/merkledag"
7
+ "github.com/jbenet/go-ipfs/routing"
8
+)
9
10
type MasterResolver struct {
11
dns *DNSResolver
@@ -8,6 +13,14 @@ type MasterResolver struct {
13
pro *ProquintResolver
14
}
15
16
+func NewMasterResolver(r routing.IpfsRouting, dag *mdag.DAGService) *MasterResolver {
17
+ mr := new(MasterResolver)
18
+ mr.dns = new(DNSResolver)
19
+ mr.pro = new(ProquintResolver)
20
+ mr.routing = NewRoutingResolver(r, dag)
21
+ return mr
22
+}
23
+
24
func (mr *MasterResolver) Resolve(name string) (string, error) {
25
if strings.Contains(name, ".") {
26
return mr.dns.Resolve(name)
namesys/routing.go
+9
-10
@@ -13,18 +13,17 @@ import (
13
mh "github.com/jbenet/go-multihash"
14
)
15
16
-// RoutingName is the de-serialized name structure that is stored (serialized)
17
-// in the routing system. Basically, a hash + a digital signature. (serialization can be
18
-// protobuf, or a simple binary format)
19
-type RoutingName struct {
20
- Hash u.Key
21
- Signature []byte
22
-}
23
-
16
// RoutingResolver implements NSResolver for the main IPFS SFS-like naming
17
type RoutingResolver struct {
18
routing routing.IpfsRouting
27
- dag mdag.DAGService
19
+ dag *mdag.DAGService
20
+}
21
+
22
+func NewRoutingResolver(route routing.IpfsRouting, dagservice *mdag.DAGService) *RoutingResolver {
23
+ return &RoutingResolver{
24
+ routing: route,
25
+ dag: dagservice,
26
+ }
27
}
28
29
func (r *RoutingResolver) Resolve(name string) (string, error) {
@@ -47,7 +46,7 @@ func (r *RoutingResolver) Resolve(name string) (string, error) {
46
return "", err
47
}
48
50
- entry := new(InpsEntry)
49
+ entry := new(IpnsEntry)
50
err = proto.Unmarshal(val, entry)
51
if err != nil {
52
return "", err