Add datagram sessions

This commit is contained in:
idk
2022-12-29 20:03:42 +00:00
parent 64cb1842d0
commit dc495c94f6
2 changed files with 78 additions and 0 deletions

View File

@ -10,6 +10,7 @@ import (
"net"
"os"
"path/filepath"
"strings"
"github.com/eyedeekay/i2pkeys"
"github.com/eyedeekay/sam3"
@ -20,6 +21,7 @@ import (
type Garlic struct {
*sam3.StreamListener
*sam3.StreamSession
*sam3.DatagramSession
i2pkeys.I2PKeys
*sam3.SAM
name string
@ -78,6 +80,23 @@ func (g Garlic) setupStreamSession() (*sam3.StreamSession, error) {
return g.StreamSession, nil
}
func (g Garlic) setupDatagramSession() (*sam3.DatagramSession, error) {
if g.DatagramSession == nil {
var err error
g.I2PKeys, err = g.Keys()
if err != nil {
return nil, fmt.Errorf("onramp setupDatagramSession: %v", err)
}
log.Println("Creating datagram session with keys:", g.I2PKeys.Address.Base32())
g.DatagramSession, err = g.SAM.NewDatagramSession(g.getName(), g.I2PKeys, g.getOptions(), 0)
if err != nil {
return nil, fmt.Errorf("onramp setupDatagramSession: %v", err)
}
return g.DatagramSession, nil
}
return g.DatagramSession, nil
}
// Listen returns a net.Listener for the Garlic structure's I2P keys.
func (g *Garlic) Listen() (net.Listener, error) {
var err error
@ -96,6 +115,18 @@ func (g *Garlic) Listen() (net.Listener, error) {
return g.StreamListener, nil
}
// ListenPacket returns a net.PacketConn for the Garlic structure's I2P keys.
func (g *Garlic) ListenPacket() (net.PacketConn, error) {
var err error
if g.SAM, err = g.samSession(); err != nil {
return nil, fmt.Errorf("onramp NewGarlic: %v", err)
}
if g.DatagramSession, err = g.setupDatagramSession(); err != nil {
return nil, fmt.Errorf("onramp Listen: %v", err)
}
return g.DatagramSession, nil
}
// ListenTLS returns a net.Listener for the Garlic structure's I2P keys,
// which also uses TLS either for additional encryption, authentication,
// or browser-compatibility.
@ -127,6 +158,9 @@ func (g *Garlic) ListenTLS() (net.Listener, error) {
// Dial returns a net.Conn for the Garlic structure's I2P keys.
func (g *Garlic) Dial(net, addr string) (net.Conn, error) {
if !strings.Contains(addr, ".i2p") {
return &NullConn{}, nil
}
var err error
if g.SAM, err = g.samSession(); err != nil {
return nil, fmt.Errorf("onramp NewGarlic: %v", err)

44
nullconn.go Normal file
View File

@ -0,0 +1,44 @@
package onramp
import (
"net"
"time"
)
type NullConn struct {
net.Conn
}
func (nc *NullConn) Read(b []byte) (n int, err error) {
return 0, nil
}
func (nc *NullConn) Write(b []byte) (n int, err error) {
return 0, nil
}
func (nc *NullConn) Close() error { return nil }
func (nc *NullConn) LocalAddr() net.Addr {
if nc.Conn != nil {
return nc.Conn.LocalAddr()
}
return &net.IPAddr{
IP: net.ParseIP("127.0.0.1"),
}
}
func (nc *NullConn) RemoteAddr() net.Addr {
if nc.Conn != nil {
return nc.Conn.RemoteAddr()
}
return &net.IPAddr{
IP: net.ParseIP("127.0.0.1"),
}
}
func (nc *NullConn) SetDeadline(t time.Time) error { return nil }
func (nc *NullConn) SetReadDeadline(t time.Time) error { return nil }
func (nc *NullConn) SetWriteDeadline(t time.Time) error { return nil }