Add Tor .onion address support and unit test cases

This commit is contained in:
David Stainton 2015-08-29 19:48:07 +02:00
parent c13f11bbfe
commit ed310561bd
4 changed files with 19 additions and 0 deletions

View File

@ -1,6 +1,7 @@
package multiaddr
import (
"encoding/base32"
"encoding/binary"
"errors"
"fmt"
@ -165,6 +166,16 @@ func addressStringToBytes(p Protocol, s string) ([]byte, error) {
binary.BigEndian.PutUint16(b, uint16(i))
return b, nil
case P_TOR:
fields := strings.Split(s, ".onion")
if len(fields) != 2 {
return nil, fmt.Errorf("failed to parse ipfs addr: %s not a Tor .onion address.", s)
}
b, err := base32.StdEncoding.DecodeString(strings.ToUpper(fields[0]))
if err != nil {
return nil, fmt.Errorf("failed to parse ipfs addr: %s %s", s, err)
}
return b, nil
case P_IPFS: // ipfs
// the address is a varint prefixed multihash string representation
m, err := mh.FromB58String(s)

View File

@ -25,6 +25,8 @@ func TestConstructFails(t *testing.T) {
"/sctp",
"/udp/65536",
"/tcp/65536",
"/tor/9imaq4ygg2iegci7.onion",
"/tor/aaimaq4ygg2iegci7.onion",
"/udp/1234/sctp",
"/udp/1234/udt/1234",
"/udp/1234/utp/1234",
@ -49,6 +51,9 @@ func TestConstructSucceeds(t *testing.T) {
"/ip4/0.0.0.0",
"/ip6/::1",
"/ip6/2601:9:4f81:9700:803e:ca65:66e8:c21",
"/tor/timaq4ygg2iegci7.onion",
"/tor/timaq4ygg2iegci7.onion/tcp/1234",
"/tor/timaq4ygg2iegci7.onion/tcp/80/http",
"/udp/0",
"/tcp/0",
"/sctp/0",

View File

@ -5,6 +5,7 @@ code size name
33 16 dccp
41 128 ip6
132 16 sctp
133 10 tor
301 0 udt
302 0 utp
421 V ipfs

1 code code size name size name
5 33 33 16 dccp 16 dccp
6 41 41 128 ip6 128 ip6
7 132 132 16 sctp 16 sctp
8 133 10 tor
9 301 301 0 udt 0 udt
10 302 302 0 utp 0 utp
11 421 421 V ipfs V ipfs

View File

@ -25,6 +25,7 @@ const (
P_DCCP = 33
P_IP6 = 41
P_SCTP = 132
P_TOR = 133
P_UTP = 301
P_UDT = 302
P_IPFS = 421
@ -46,6 +47,7 @@ var Protocols = []Protocol{
Protocol{P_IP6, 128, "ip6", CodeToVarint(P_IP6)},
// these require varint:
Protocol{P_SCTP, 16, "sctp", CodeToVarint(P_SCTP)},
Protocol{P_TOR, 10, "tor", CodeToVarint(P_TOR)},
Protocol{P_UTP, 0, "utp", CodeToVarint(P_UTP)},
Protocol{P_UDT, 0, "udt", CodeToVarint(P_UDT)},
Protocol{P_HTTP, 0, "http", CodeToVarint(P_HTTP)},