Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7d820eeaaa | ||
![]() |
ac54a46ded | ||
![]() |
22a3e9f3a7 | ||
![]() |
b7ce5c1061 | ||
![]() |
7729762ce9 | ||
![]() |
13bf63f35a | ||
![]() |
91fc13b151 | ||
![]() |
7cf9e8b61e | ||
![]() |
c7d6848930 | ||
![]() |
eabd2d94f6 | ||
![]() |
76924e5961 | ||
![]() |
027983674b | ||
![]() |
7521a7862a |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -22,3 +22,4 @@ _testmain.go
|
|||||||
*.exe
|
*.exe
|
||||||
itp-golang-github-eyedeekay-gosam.txt
|
itp-golang-github-eyedeekay-gosam.txt
|
||||||
.pc
|
.pc
|
||||||
|
deb/
|
||||||
|
24
Makefile
Normal file
24
Makefile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
USER_GH=eyedeekay
|
||||||
|
VERSION=0.32.25
|
||||||
|
packagename=gosam
|
||||||
|
|
||||||
|
echo:
|
||||||
|
@echo "type make version to do release $(VERSION)"
|
||||||
|
|
||||||
|
version:
|
||||||
|
gothub release -s $(GITHUB_TOKEN) -u $(USER_GH) -r $(packagename) -t v$(VERSION) -d "version $(VERSION)"
|
||||||
|
|
||||||
|
del:
|
||||||
|
gothub delete -s $(GITHUB_TOKEN) -u $(USER_GH) -r $(packagename) -t v$(VERSION)
|
||||||
|
|
||||||
|
tar:
|
||||||
|
tar --exclude .git \
|
||||||
|
--exclude .go \
|
||||||
|
--exclude bin \
|
||||||
|
--exclude examples \
|
||||||
|
-cJvf ../$(packagename)_$(VERSION).orig.tar.xz .
|
||||||
|
|
||||||
|
link:
|
||||||
|
rm -f ../goSam
|
||||||
|
ln -sf . ../goSam
|
@@ -11,6 +11,7 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
// A Client represents a single Connection to the SAM bridge
|
// A Client represents a single Connection to the SAM bridge
|
||||||
@@ -38,6 +39,7 @@ type Client struct {
|
|||||||
|
|
||||||
dontPublishLease bool
|
dontPublishLease bool
|
||||||
encryptLease bool
|
encryptLease bool
|
||||||
|
leaseSetEncType string
|
||||||
|
|
||||||
reduceIdle bool
|
reduceIdle bool
|
||||||
reduceIdleTime uint
|
reduceIdleTime uint
|
||||||
@@ -52,6 +54,7 @@ type Client struct {
|
|||||||
//NEVER, EVER modify lastaddr or id yourself. They are used internally only.
|
//NEVER, EVER modify lastaddr or id yourself. They are used internally only.
|
||||||
lastaddr string
|
lastaddr string
|
||||||
id int32
|
id int32
|
||||||
|
ml sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
var SAMsigTypes = []string{
|
var SAMsigTypes = []string{
|
||||||
@@ -137,6 +140,7 @@ func NewClientFromOptions(opts ...func(*Client) error) (*Client, error) {
|
|||||||
c.id = 0
|
c.id = 0
|
||||||
c.lastaddr = "invalid"
|
c.lastaddr = "invalid"
|
||||||
c.destination = ""
|
c.destination = ""
|
||||||
|
c.leaseSetEncType = "4,0"
|
||||||
for _, o := range opts {
|
for _, o := range opts {
|
||||||
if err := o(&c); err != nil {
|
if err := o(&c); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@@ -27,3 +27,12 @@ func TestClientHello(t *testing.T) {
|
|||||||
t.Log(client.Base32())
|
t.Log(client.Base32())
|
||||||
teardown(t)
|
teardown(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestNewDestination(t *testing.T) {
|
||||||
|
setup(t)
|
||||||
|
t.Log(client.Base32())
|
||||||
|
if _, err := client.NewDestination(SAMsigTypes[3]); err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
teardown(t)
|
||||||
|
}
|
||||||
|
12
debian/changelog
vendored
12
debian/changelog
vendored
@@ -1,3 +1,15 @@
|
|||||||
|
golang-github-eyedeekay-gosam (0.32.24) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* Improve the mutex thingy
|
||||||
|
|
||||||
|
-- idk <hankhill19580@gmail.com> Tue, 25 Aug 2020 04:52:11 -0500
|
||||||
|
|
||||||
|
golang-github-eyedeekay-gosam (0.32.23) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* Protect Dial with a mutex to fix a lookup bug
|
||||||
|
|
||||||
|
-- idk <hankhill19580@gmail.com> Tue, 25 Aug 2020 10:29:26 -0500
|
||||||
|
|
||||||
golang-github-eyedeekay-gosam (0.3.2.1) bionic; urgency=medium
|
golang-github-eyedeekay-gosam (0.3.2.1) bionic; urgency=medium
|
||||||
|
|
||||||
* Get rid of the debug directory, just move it into the source
|
* Get rid of the debug directory, just move it into the source
|
||||||
|
3
debian/control
vendored
3
debian/control
vendored
@@ -6,7 +6,8 @@ Uploaders: idk <hankhill19580@gmail.com>
|
|||||||
Build-Depends: debhelper (>= 11),
|
Build-Depends: debhelper (>= 11),
|
||||||
dh-golang,
|
dh-golang,
|
||||||
golang-any,
|
golang-any,
|
||||||
i2pd | i2p
|
i2pd | i2p,
|
||||||
|
git,
|
||||||
Standards-Version: 4.2.1
|
Standards-Version: 4.2.1
|
||||||
Homepage: https://github.com/eyedeekay/gosam
|
Homepage: https://github.com/eyedeekay/gosam
|
||||||
Vcs-Browser: https:/github.com/eyedeekay/gosam
|
Vcs-Browser: https:/github.com/eyedeekay/gosam
|
||||||
|
7
dial.go
7
dial.go
@@ -30,16 +30,21 @@ func (c *Client) DialContext(ctx context.Context, network, addr string) (net.Con
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Client) dialCheck(addr string) (int32, bool) {
|
func (c *Client) dialCheck(addr string) (int32, bool) {
|
||||||
if c.lastaddr == "invalid" {
|
if c.lastaddr == "invalid" {
|
||||||
fmt.Println("Preparing to dial new address.")
|
fmt.Println("Preparing to dial new address.")
|
||||||
return c.NewID(), true
|
return c.NewID(), true
|
||||||
|
} else if c.lastaddr != addr {
|
||||||
|
fmt.Println("Preparing to dial next new address.")
|
||||||
|
return c.NewID(), true
|
||||||
}
|
}
|
||||||
return c.id, false
|
return c.id, false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial implements the net.Dial function and can be used for http.Transport
|
// Dial implements the net.Dial function and can be used for http.Transport
|
||||||
func (c *Client) Dial(network, addr string) (net.Conn, error) {
|
func (c *Client) Dial(network, addr string) (net.Conn, error) {
|
||||||
|
c.ml.Lock()
|
||||||
|
defer c.ml.Unlock()
|
||||||
portIdx := strings.Index(addr, ":")
|
portIdx := strings.Index(addr, ":")
|
||||||
if portIdx >= 0 {
|
if portIdx >= 0 {
|
||||||
addr = addr[:portIdx]
|
addr = addr[:portIdx]
|
||||||
|
3
go.sum
Normal file
3
go.sum
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
github.com/eyedeekay/ramp v0.0.0-20190429201811-305b382042ab/go.mod h1:h7mvUAMgZ/rtRDUOkvKTK+8LnDMeUhJSoa5EPdB51fc=
|
||||||
|
github.com/eyedeekay/sam3 v0.32.2 h1:xODDY5nBVg0oK7KaYk7ofkXFoHPsmI1umhSv1TZlS7s=
|
||||||
|
github.com/eyedeekay/sam3 v0.32.2/go.mod h1:Y3igFVzN4ybqkkpfUWULGhw7WRp8lieq0ORXbLBbcZM=
|
35
i2pkeys.go
Normal file
35
i2pkeys.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package goSam
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/eyedeekay/sam3/i2pkeys"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewDestination generates a new I2P destination, creating the underlying
|
||||||
|
// public/private keys in the process. The public key can be used to send messages
|
||||||
|
// to the destination, while the private key can be used to reply to messages
|
||||||
|
func (c *Client) NewDestination(sigType ...string) (i2pkeys.I2PKeys, error) {
|
||||||
|
var (
|
||||||
|
sigtmp string
|
||||||
|
keys i2pkeys.I2PKeys
|
||||||
|
)
|
||||||
|
if len(sigType) > 0 {
|
||||||
|
sigtmp = sigType[0]
|
||||||
|
}
|
||||||
|
r, err := c.sendCmd(
|
||||||
|
"DEST GENERATE %s\n",
|
||||||
|
sigtmp,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return keys, err
|
||||||
|
}
|
||||||
|
var pub, priv string
|
||||||
|
if priv = r.Pairs["PRIV"]; priv == "" {
|
||||||
|
return keys, errors.New("failed to generate private destination key")
|
||||||
|
}
|
||||||
|
if pub = r.Pairs["PUB"]; pub == "" {
|
||||||
|
return keys, errors.New("failed to generate public destination key")
|
||||||
|
}
|
||||||
|
return i2pkeys.NewKeys(i2pkeys.I2PAddr(pub), priv), nil
|
||||||
|
}
|
@@ -22,8 +22,8 @@ func TestClientLookupInvalid(t *testing.T) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
t.Fatalf("client.Lookup() should return a ReplyError")
|
t.Fatalf("client.Lookup() should return a ReplyError")
|
||||||
}
|
}
|
||||||
if repErr.Result != ResultInvalidKey {
|
if repErr.Result != ResultKeyNotFound {
|
||||||
t.Errorf("client.Lookup() should throw an ResultKeyNotFound error.\nGot:%+v\n", repErr)
|
t.Errorf("client.Lookup() should throw an ResultKeyNotFound error.\nGot:%+v%s%s\n", repErr, "!=", ResultKeyNotFound)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,5 +46,5 @@ func ExampleClient_Lookup() {
|
|||||||
|
|
||||||
// Output:
|
// Output:
|
||||||
//Address of zzz.i2p:
|
//Address of zzz.i2p:
|
||||||
//GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3uSzpWS0EHmrlfoLr5uGGd9ZHwwCIcgfOATaPRMUEQxiK9q48PS0V3EXXO4-YLT0vIfk4xO~XqZpn8~PW1kFe2mQMHd7oO89yCk-3yizRG3UyFtI7-mO~eCI6-m1spYoigStgoupnC3G85gJkqEjMm49gUjbhfWKWI-6NwTj0ZnAAAA
|
//GKapJ8koUcBj~jmQzHsTYxDg2tpfWj0xjQTzd8BhfC9c3OS5fwPBNajgF-eOD6eCjFTqTlorlh7Hnd8kXj1qblUGXT-tDoR9~YV8dmXl51cJn9MVTRrEqRWSJVXbUUz9t5Po6Xa247Vr0sJn27R4KoKP8QVj1GuH6dB3b6wTPbOamC3dkO18vkQkfZWUdRMDXk0d8AdjB0E0864nOT~J9Fpnd2pQE5uoFT6P0DqtQR2jsFvf9ME61aqLvKPPWpkgdn4z6Zkm-NJOcDz2Nv8Si7hli94E9SghMYRsdjU-knObKvxiagn84FIwcOpepxuG~kFXdD5NfsH0v6Uri3usE3XWD7Pw6P8qVYF39jUIq4OiNMwPnNYzy2N4mDMQdsdHO3LUVh~DEppOy9AAmEoHDjjJxt2BFBbGxfdpZCpENkwvmZeYUyNCCzASqTOOlNzdpne8cuesn3NDXIpNnqEE6Oe5Qm5YOJykrX~Vx~cFFT3QzDGkIjjxlFBsjUJyYkFjBQAEAAcAAA==
|
||||||
}
|
}
|
||||||
|
17
options.go
17
options.go
@@ -275,6 +275,14 @@ func SetEncrypt(b bool) func(*Client) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//SetLeaseSetEncType tells the router to use an encrypted leaseset
|
||||||
|
func SetLeaseSetEncType(b string) func(*Client) error {
|
||||||
|
return func(c *Client) error {
|
||||||
|
c.leaseSetEncType = b
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//SetReduceIdle sets the created tunnels to be reduced during extended idle time to avoid excessive resource usage
|
//SetReduceIdle sets the created tunnels to be reduced during extended idle time to avoid excessive resource usage
|
||||||
func SetReduceIdle(b bool) func(*Client) error {
|
func SetReduceIdle(b bool) func(*Client) error {
|
||||||
return func(c *Client) error {
|
return func(c *Client) error {
|
||||||
@@ -426,6 +434,13 @@ func (c *Client) encryptlease() string {
|
|||||||
return " i2cp.encryptLeaseSet=false "
|
return " i2cp.encryptLeaseSet=false "
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) leasesetenctype() string {
|
||||||
|
if c.encryptLease {
|
||||||
|
return fmt.Sprintf(" i2cp.leaseSetEncType=%s ", c.leaseSetEncType)
|
||||||
|
}
|
||||||
|
return " i2cp.leaseSetEncType=4,0 "
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Client) dontpublishlease() string {
|
func (c *Client) dontpublishlease() string {
|
||||||
if c.dontPublishLease {
|
if c.dontPublishLease {
|
||||||
return " i2cp.dontPublishLeaseSet=true "
|
return " i2cp.dontPublishLeaseSet=true "
|
||||||
@@ -478,6 +493,7 @@ func (c *Client) allOptions() string {
|
|||||||
c.outbackups() +
|
c.outbackups() +
|
||||||
c.dontpublishlease() +
|
c.dontpublishlease() +
|
||||||
c.encryptlease() +
|
c.encryptlease() +
|
||||||
|
c.leasesetenctype() +
|
||||||
c.reduceonidle() +
|
c.reduceonidle() +
|
||||||
c.reduceidletime() +
|
c.reduceidletime() +
|
||||||
c.reduceidlecount() +
|
c.reduceidlecount() +
|
||||||
@@ -498,6 +514,7 @@ func (c *Client) Print() string {
|
|||||||
c.outbackups() +
|
c.outbackups() +
|
||||||
c.dontpublishlease() +
|
c.dontpublishlease() +
|
||||||
c.encryptlease() +
|
c.encryptlease() +
|
||||||
|
c.leasesetenctype() +
|
||||||
c.reduceonidle() +
|
c.reduceonidle() +
|
||||||
c.reduceidletime() +
|
c.reduceidletime() +
|
||||||
c.reduceidlecount() +
|
c.reduceidlecount() +
|
||||||
|
Reference in New Issue
Block a user