starting on intro broadcaster
This commit is contained in:
@@ -15,20 +15,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
eng *relay.Engine
|
eng *relay.Engine
|
||||||
p2p []string
|
engineP2P []string
|
||||||
rpc []string
|
engineRPC []string
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
pf := relayCmd.PersistentFlags()
|
pf := relayCmd.PersistentFlags()
|
||||||
pf.StringSliceVarP(&p2p, "p2p-relay", "P",
|
pf.StringSliceVarP(&engineP2P, "engineP2P-relay", "P",
|
||||||
[]string{"127.0.0.1:8337", "::1:8337"},
|
[]string{"127.0.0.1:8337", "::1:8337"},
|
||||||
"address/ports for IPv4 and v6 listeners")
|
"address/ports for IPv4 and v6 listeners")
|
||||||
pf.StringSliceVarP(&rpc, "relay-control", "r",
|
pf.StringSliceVarP(&engineRPC, "relay-control", "r",
|
||||||
[]string{"127.0.0.1:8339", "::1:8339"},
|
[]string{"127.0.0.1:8339", "::1:8339"},
|
||||||
"address/ports for IPv4 and v6 listeners")
|
"address/ports for IPv4 and v6 listeners")
|
||||||
viper.BindPFlag("p2p-relay", seedCmd.PersistentFlags().Lookup("p2p-relay"))
|
viper.BindPFlag("engineP2P-relay", seedCmd.PersistentFlags().Lookup("engineP2P-relay"))
|
||||||
viper.BindPFlag("relay-control", seedCmd.PersistentFlags().Lookup(
|
viper.BindPFlag("relay-control", seedCmd.PersistentFlags().Lookup(
|
||||||
"relay-control"))
|
"relay-control"))
|
||||||
rootCmd.AddCommand(relayCmd)
|
rootCmd.AddCommand(relayCmd)
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ package main
|
|||||||
import "github.com/spf13/cobra"
|
import "github.com/spf13/cobra"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rootCmd.AddCommand(seedCommand)
|
rootCmd.AddCommand(seedCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
var seedCommand = &cobra.Command{
|
var seedCmd = &cobra.Command{
|
||||||
Use: "seed",
|
Use: "seed",
|
||||||
Short: "run and manage your seed node",
|
Short: "run and manage your seed node",
|
||||||
Long: `run and manage your seed node`,
|
Long: `run and manage your seed node`,
|
||||||
|
|||||||
@@ -5,14 +5,14 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
//// Init flags belonging to the seed package
|
// // Init flags belonging to the seed package
|
||||||
//seed.InitFlags(seedServeCommand)
|
// seed.InitFlags(seedServeCommand)
|
||||||
//
|
//
|
||||||
//// Init flags belonging to the rpc package
|
// // Init flags belonging to the rpc package
|
||||||
//rpc.InitFlags(seedServeCommand)
|
// rpc.InitFlags(seedServeCommand)
|
||||||
|
|
||||||
seedCommand.AddCommand(seedRPCCmd)
|
seedCmd.AddCommand(seedRPCCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
var seedRPCCmd = &cobra.Command{
|
var seedRPCCmd = &cobra.Command{
|
||||||
@@ -20,6 +20,6 @@ var seedRPCCmd = &cobra.Command{
|
|||||||
Short: "A list of commands for interacting with a seed",
|
Short: "A list of commands for interacting with a seed",
|
||||||
Long: `A list of commands for interacting with a seed.`,
|
Long: `A list of commands for interacting with a seed.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,18 +2,20 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"git-indra.lan/indra-labs/indra"
|
"os"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/interrupt"
|
"time"
|
||||||
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/seed"
|
|
||||||
"github.com/multiformats/go-multiaddr"
|
"github.com/multiformats/go-multiaddr"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
"github.com/tutorialedge/go-grpc-tutorial/chat"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"os"
|
|
||||||
"time"
|
"git-indra.lan/indra-labs/indra"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/interrupt"
|
||||||
|
log2 "git-indra.lan/indra-labs/indra/pkg/proc/log"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/rpc"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/seed"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -21,14 +23,14 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|
||||||
// Init flags belonging to the seed package
|
// Init flags belonging to the seed package
|
||||||
seed.InitFlags(seedServeCommand)
|
seed.InitFlags(seedServeCommand)
|
||||||
|
|
||||||
// Init flags belonging to the rpc package
|
// Init flags belonging to the rpc package
|
||||||
rpc.InitFlags(seedServeCommand)
|
rpc.InitFlags(seedServeCommand)
|
||||||
|
|
||||||
seedCommand.AddCommand(seedServeCommand)
|
seedCmd.AddCommand(seedServeCommand)
|
||||||
}
|
}
|
||||||
|
|
||||||
var seedServeCommand = &cobra.Command{
|
var seedServeCommand = &cobra.Command{
|
||||||
@@ -36,93 +38,93 @@ var seedServeCommand = &cobra.Command{
|
|||||||
Short: "Serves an instance of the seed node",
|
Short: "Serves an instance of the seed node",
|
||||||
Long: `Serves an instance of the seed node.`,
|
Long: `Serves an instance of the seed node.`,
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
log.I.Ln("-- ", log2.App, "("+viper.GetString("network")+") -", indra.SemVer, "- Network Freedom. --")
|
log.I.Ln("-- ", log2.App, "("+viper.GetString("network")+") -", indra.SemVer, "- Network Freedom. --")
|
||||||
|
|
||||||
log.I.Ln("running seed")
|
log.I.Ln("running seed")
|
||||||
|
|
||||||
var ctx context.Context
|
var ctx context.Context
|
||||||
var cancel context.CancelFunc
|
var cancel context.CancelFunc
|
||||||
|
|
||||||
ctx, cancel = context.WithCancel(context.Background())
|
ctx, cancel = context.WithCancel(context.Background())
|
||||||
|
|
||||||
interrupt.AddHandler(cancel)
|
interrupt.AddHandler(cancel)
|
||||||
|
|
||||||
//
|
//
|
||||||
// RPC
|
// RPC
|
||||||
//
|
//
|
||||||
|
|
||||||
rpc.RunWith(ctx, func(srv *grpc.Server) {
|
rpc.RunWith(ctx, func(srv *grpc.Server) {
|
||||||
chat.RegisterChatServiceServer(srv, &chat.Server{})
|
chat.RegisterChatServiceServer(srv, &chat.Server{})
|
||||||
})
|
})
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-rpc.CantStart():
|
case <-rpc.CantStart():
|
||||||
|
|
||||||
log.I.Ln("issues starting the rpc server")
|
log.I.Ln("issues starting the rpc server")
|
||||||
log.I.Ln("attempting a graceful shutdown")
|
log.I.Ln("attempting a graceful shutdown")
|
||||||
|
|
||||||
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
|
ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second)
|
||||||
|
|
||||||
rpc.Shutdown(ctx)
|
rpc.Shutdown(ctx)
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
|
|
||||||
log.I.Ln("can't shutdown gracefully, exiting.")
|
log.I.Ln("can't shutdown gracefully, exiting.")
|
||||||
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
log.I.Ln("graceful shutdown complete")
|
log.I.Ln("graceful shutdown complete")
|
||||||
|
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
case <-rpc.IsReady():
|
case <-rpc.IsReady():
|
||||||
|
|
||||||
log.I.Ln("rpc server is ready")
|
log.I.Ln("rpc server is ready")
|
||||||
}
|
}
|
||||||
|
|
||||||
rpc.Run(ctx)
|
rpc.Run(ctx)
|
||||||
|
|
||||||
//
|
//
|
||||||
// P2P
|
// P2P
|
||||||
//
|
//
|
||||||
|
|
||||||
var config = seed.DefaultConfig
|
var config = seed.DefaultConfig
|
||||||
|
|
||||||
config.SetNetwork(viper.GetString("network"))
|
config.SetNetwork(viper.GetString("network"))
|
||||||
|
|
||||||
if config.PrivKey, err = seed.GetOrGeneratePrivKey(viper.GetString("key")); check(err) {
|
if config.PrivKey, err = seed.GetOrGeneratePrivKey(viper.GetString("key")); check(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, listener := range viper.GetStringSlice("listen") {
|
for _, listener := range viper.GetStringSlice("listen") {
|
||||||
config.ListenAddresses = append(config.ListenAddresses, multiaddr.StringCast(listener))
|
config.ListenAddresses = append(config.ListenAddresses, multiaddr.StringCast(listener))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, seed := range viper.GetStringSlice("seed") {
|
for _, seed := range viper.GetStringSlice("seed") {
|
||||||
config.SeedAddresses = append(config.SeedAddresses, multiaddr.StringCast(seed))
|
config.SeedAddresses = append(config.SeedAddresses, multiaddr.StringCast(seed))
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, connector := range viper.GetStringSlice("connect") {
|
for _, connector := range viper.GetStringSlice("connect") {
|
||||||
config.ConnectAddresses = append(config.ConnectAddresses, multiaddr.StringCast(connector))
|
config.ConnectAddresses = append(config.ConnectAddresses, multiaddr.StringCast(connector))
|
||||||
}
|
}
|
||||||
|
|
||||||
var srv *seed.Server
|
var srv *seed.Server
|
||||||
|
|
||||||
if srv, err = seed.New(config); check(err) {
|
if srv, err = seed.New(config); check(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = srv.Serve(); check(err) {
|
if err = srv.Serve(); check(err) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.I.Ln("-- fin --")
|
log.I.Ln("-- fin --")
|
||||||
|
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,12 +7,13 @@ import (
|
|||||||
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/magicbytes"
|
"git-indra.lan/indra-labs/indra/pkg/messages/magicbytes"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/splice"
|
"git-indra.lan/indra-labs/indra/pkg/splice"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/types"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MagicString = "in"
|
MagicString = "in"
|
||||||
AddrLen = net.IPv6len + 2
|
AddrLen = net.IPv6len + 3
|
||||||
Len = magicbytes.Len + pub.KeyLen + AddrLen
|
Len = magicbytes.Len + pub.KeyLen + AddrLen
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,21 +21,20 @@ var (
|
|||||||
Magic = slice.Bytes(MagicString)
|
Magic = slice.Bytes(MagicString)
|
||||||
)
|
)
|
||||||
|
|
||||||
type IntroductionMessage struct {
|
type Layer struct {
|
||||||
*pub.Key
|
*pub.Key
|
||||||
*netip.AddrPort
|
*netip.AddrPort
|
||||||
}
|
}
|
||||||
|
|
||||||
func Encode(im *IntroductionMessage) (o slice.Bytes) {
|
func (im *Layer) Insert(o types.Onion) {}
|
||||||
b, c := make(slice.Bytes, Len), slice.NewCursor()
|
func (im *Layer) Len() int { return Len }
|
||||||
|
|
||||||
|
func (im *Layer) Encode(b slice.Bytes, c *slice.Cursor) {
|
||||||
splice.Splice(b, c).Magic(Magic).Pubkey(im.Key).AddrPort(im.AddrPort)
|
splice.Splice(b, c).Magic(Magic).Pubkey(im.Key).AddrPort(im.AddrPort)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func Decode(b slice.Bytes) (o *IntroductionMessage) {
|
func (im *Layer) Decode(b slice.Bytes, c *slice.Cursor) (e error) {
|
||||||
o = &IntroductionMessage{}
|
splice.Splice(b, c).ReadPubkey(&im.Key).ReadAddrPort(&im.AddrPort)
|
||||||
c := slice.NewCursor()
|
|
||||||
c.Inc(magicbytes.Len)
|
|
||||||
splice.Splice(b, c).ReadPubkey(&o.Key).ReadAddrPort(&o.AddrPort)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ func (p handlemessages) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
typesList := []string{"balance", "confirm", "crypt", "delay", "dxresponse",
|
typesList := []string{"balance", "confirm", "crypt", "delay", "dxresponse",
|
||||||
"exit", "forward", "getbalance", "hiddenservice", "reverse",
|
"exit", "forward", "getbalance", "hiddenservice", "intro", "reverse",
|
||||||
"response", "session"}
|
"response", "session"}
|
||||||
sort.Strings(typesList)
|
sort.Strings(typesList)
|
||||||
tpl := `package relay
|
tpl := `package relay
|
||||||
@@ -41,19 +41,20 @@ import (
|
|||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
|
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
|
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
|
"git-indra.lan/indra-labs/indra/pkg/messages/delay"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/dxresponse"
|
"git-indra.lan/indra-labs/indra/pkg/messages/dxresponse"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
|
"git-indra.lan/indra-labs/indra/pkg/messages/exit"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
|
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/hiddenservice"
|
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/magicbytes"
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/response"
|
"git-indra.lan/indra-labs/indra/pkg/messages/magicbytes"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
|
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/session"
|
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/session"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/types"
|
"git-indra.lan/indra-labs/indra/pkg/types"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||||
)
|
)
|
||||||
@@ -100,6 +101,7 @@ func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
|
|||||||
{"forward", true},
|
{"forward", true},
|
||||||
{"getbalance", true},
|
{"getbalance", true},
|
||||||
{"hiddenservice", true},
|
{"hiddenservice", true},
|
||||||
|
{"intro", false},
|
||||||
{"reverse", false},
|
{"reverse", false},
|
||||||
{"response", true},
|
{"response", true},
|
||||||
{"session", true},
|
{"session", true},
|
||||||
@@ -111,17 +113,18 @@ func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
|
|||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/balance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/confirm"
|
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/crypt"
|
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/delay"
|
"git-indra.lan/indra-labs/indra/pkg/messages/delay"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/exit"
|
"git-indra.lan/indra-labs/indra/pkg/messages/exit"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/forward"
|
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/getbalance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/hiddenservice"
|
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/response"
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/reverse"
|
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/onion/session"
|
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/session"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/types"
|
"git-indra.lan/indra-labs/indra/pkg/types"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package relay
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/session"
|
"git-indra.lan/indra-labs/indra/pkg/messages/session"
|
||||||
@@ -19,8 +20,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (eng *Engine) handleMessage(b slice.Bytes, prev types.Onion) {
|
func (eng *Engine) handleMessage(b slice.Bytes, prev types.Onion) {
|
||||||
log.T.F("%v handling received message %v", eng.GetLocalNodeAddress(),
|
log.T.F("%v handling received message", eng.GetLocalNodeAddress())
|
||||||
prev == nil)
|
|
||||||
var on1 types.Onion
|
var on1 types.Onion
|
||||||
var e error
|
var e error
|
||||||
c := slice.NewCursor()
|
c := slice.NewCursor()
|
||||||
@@ -80,6 +80,9 @@ func (eng *Engine) handleMessage(b slice.Bytes, prev types.Onion) {
|
|||||||
}
|
}
|
||||||
log.T.C(recLog(on, b, eng))
|
log.T.C(recLog(on, b, eng))
|
||||||
eng.hiddenservice(on, b, c, prev)
|
eng.hiddenservice(on, b, c, prev)
|
||||||
|
case *intro.Layer:
|
||||||
|
log.T.C(recLog(on, b, eng))
|
||||||
|
eng.intro(on, b, c, prev)
|
||||||
case *response.Layer:
|
case *response.Layer:
|
||||||
if prev == nil {
|
if prev == nil {
|
||||||
log.E.Ln(reflect.TypeOf(on), "requests from outside? absurd!")
|
log.E.Ln(reflect.TypeOf(on), "requests from outside? absurd!")
|
||||||
|
|||||||
@@ -11,8 +11,7 @@ func (eng *Engine) hiddenservice(hs *hiddenservice.Layer, b slice.Bytes,
|
|||||||
|
|
||||||
log.D.F("%s adding introduction for key %x", eng.GetLocalNodeAddress(),
|
log.D.F("%s adding introduction for key %x", eng.GetLocalNodeAddress(),
|
||||||
hs.Identity.ToBytes())
|
hs.Identity.ToBytes())
|
||||||
hsk := hs.Identity.ToBytes()
|
eng.Introductions.AddIntro(hs.Identity, b[*c:])
|
||||||
eng.Introductions.AddIntro(hsk, b[*c:])
|
|
||||||
log.I.Ln("stored new introduction, starting broadcast")
|
log.I.Ln("stored new introduction, starting broadcast")
|
||||||
go eng.hiddenserviceBroadcaster(hsk)
|
go eng.hiddenserviceBroadcaster(hs.Identity)
|
||||||
}
|
}
|
||||||
|
|||||||
13
pkg/relay/handler-intro.go
Normal file
13
pkg/relay/handler-intro.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package relay
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/types"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (eng *Engine) intro(intr *intro.Layer, b slice.Bytes,
|
||||||
|
c *slice.Cursor, prev types.Onion) {
|
||||||
|
|
||||||
|
log.D.S(intr)
|
||||||
|
}
|
||||||
51
pkg/relay/hiddenservice-broadcast.go
Normal file
51
pkg/relay/hiddenservice-broadcast.go
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package relay
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/cybriq/qu"
|
||||||
|
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/util/cryptorand"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/util/slice"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Referrers map[pub.Bytes][]pub.Bytes
|
||||||
|
|
||||||
|
func (eng *Engine) hiddenserviceBroadcaster(hsk *pub.Key) {
|
||||||
|
log.D.F("propagating hidden service introduction for %x", hsk.ToBytes())
|
||||||
|
done := qu.T()
|
||||||
|
me := eng.GetLocalNodeAddress()
|
||||||
|
intr := &intro.Layer{
|
||||||
|
Key: hsk, AddrPort: me,
|
||||||
|
}
|
||||||
|
msg := make(slice.Bytes, intro.Len)
|
||||||
|
c := slice.NewCursor()
|
||||||
|
intr.Encode(msg, c)
|
||||||
|
nPeers := eng.NodesLen()
|
||||||
|
peerIndices := make([]int, nPeers)
|
||||||
|
for i := 0; i < nPeers; i++ {
|
||||||
|
peerIndices[i] = i
|
||||||
|
}
|
||||||
|
cryptorand.Shuffle(nPeers, func(i, j int) {
|
||||||
|
peerIndices[i], peerIndices[j] = peerIndices[j], peerIndices[i]
|
||||||
|
})
|
||||||
|
// Since relays will also gossip this information, we will start a ticker
|
||||||
|
// that sends out the hidden service introduction once a second until it
|
||||||
|
// runs out of known relays to gossip to.
|
||||||
|
ticker := time.NewTicker(time.Second)
|
||||||
|
var cursor int
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-eng.C.Wait():
|
||||||
|
return
|
||||||
|
case <-done:
|
||||||
|
return
|
||||||
|
case <-ticker.C:
|
||||||
|
n := eng.FindNodeByIndex(peerIndices[cursor])
|
||||||
|
n.Transport.Send(msg)
|
||||||
|
cursor++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package relay
|
|
||||||
|
|
||||||
import "git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
|
||||||
|
|
||||||
type Referrers map[pub.Bytes][]pub.Bytes
|
|
||||||
|
|
||||||
func (eng *Engine) hiddenserviceBroadcaster(hsk pub.Bytes) {
|
|
||||||
log.D.Ln("propagating hidden service introduction for %x", hsk)
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-eng.C.Wait():
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -41,9 +41,10 @@ func (in *Introductions) Find(key pub.Bytes) (header slice.Bytes) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (in *Introductions) AddIntro(key pub.Bytes, header slice.Bytes) {
|
func (in *Introductions) AddIntro(pk *pub.Key, header slice.Bytes) {
|
||||||
in.Lock()
|
in.Lock()
|
||||||
var ok bool
|
var ok bool
|
||||||
|
key := pk.ToBytes()
|
||||||
if _, ok = in.Intros[key]; ok {
|
if _, ok = in.Intros[key]; ok {
|
||||||
log.D.Ln("entry already exists for key %x", key)
|
log.D.Ln("entry already exists for key %x", key)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package relay
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
|
"git-indra.lan/indra-labs/lnd/lnd/lnwire"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
|
"git-indra.lan/indra-labs/indra/pkg/crypto/key/prv"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
"git-indra.lan/indra-labs/indra/pkg/crypto/key/pub"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
|
"git-indra.lan/indra-labs/indra/pkg/crypto/nonce"
|
||||||
@@ -44,7 +44,7 @@ func (sm *SessionManager) SetLocalNodeAddress(addr *netip.AddrPort) {
|
|||||||
|
|
||||||
func (sm *SessionManager) SendFromLocalNode(port uint16,
|
func (sm *SessionManager) SendFromLocalNode(port uint16,
|
||||||
b slice.Bytes) (e error) {
|
b slice.Bytes) (e error) {
|
||||||
|
|
||||||
sm.Lock()
|
sm.Lock()
|
||||||
defer sm.Unlock()
|
defer sm.Unlock()
|
||||||
return sm.GetLocalNode().SendTo(port, b)
|
return sm.GetLocalNode().SendTo(port, b)
|
||||||
@@ -96,6 +96,11 @@ func (sm *SessionManager) AddNodes(nn ...*Node) {
|
|||||||
defer sm.Unlock()
|
defer sm.Unlock()
|
||||||
sm.nodes = append(sm.nodes, nn...)
|
sm.nodes = append(sm.nodes, nn...)
|
||||||
}
|
}
|
||||||
|
func (sm *SessionManager) FindNodeByIndex(i int) (no *Node) {
|
||||||
|
sm.Lock()
|
||||||
|
defer sm.Unlock()
|
||||||
|
return sm.nodes[i]
|
||||||
|
}
|
||||||
|
|
||||||
// FindNodeByID searches for a Node by ID.
|
// FindNodeByID searches for a Node by ID.
|
||||||
func (sm *SessionManager) FindNodeByID(i nonce.ID) (no *Node) {
|
func (sm *SessionManager) FindNodeByID(i nonce.ID) (no *Node) {
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package relay
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/davecgh/go-spew/spew"
|
"github.com/davecgh/go-spew/spew"
|
||||||
|
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/balance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
"git-indra.lan/indra-labs/indra/pkg/messages/confirm"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
"git-indra.lan/indra-labs/indra/pkg/messages/crypt"
|
||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
"git-indra.lan/indra-labs/indra/pkg/messages/forward"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
"git-indra.lan/indra-labs/indra/pkg/messages/getbalance"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
"git-indra.lan/indra-labs/indra/pkg/messages/hiddenservice"
|
||||||
|
"git-indra.lan/indra-labs/indra/pkg/messages/intro"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/magicbytes"
|
"git-indra.lan/indra-labs/indra/pkg/messages/magicbytes"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
"git-indra.lan/indra-labs/indra/pkg/messages/response"
|
||||||
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
"git-indra.lan/indra-labs/indra/pkg/messages/reverse"
|
||||||
@@ -69,6 +70,11 @@ func Peel(b slice.Bytes, c *slice.Cursor) (on types.Onion, e error) {
|
|||||||
if e = on.Decode(b, c); check(e) {
|
if e = on.Decode(b, c); check(e) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
case intro.MagicString:
|
||||||
|
on = &intro.Layer{}
|
||||||
|
if e = on.Decode(b, c); check(e) {
|
||||||
|
return
|
||||||
|
}
|
||||||
case response.MagicString:
|
case response.MagicString:
|
||||||
on = &response.Layer{}
|
on = &response.Layer{}
|
||||||
if e = on.Decode(b, c); check(e) {
|
if e = on.Decode(b, c); check(e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user