mirror of
				https://github.com/sigcn/pg.git
				synced 2025-10-31 21:52:33 +08:00 
			
		
		
		
	pgcli: add share/download subcommand for file sharing
This commit is contained in:
		
							
								
								
									
										196
									
								
								cmd/pgcli/download/download.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								cmd/pgcli/download/download.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | ||||
| package download | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"crypto/rand" | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/binary" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log/slog" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"path" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/share/pubnet" | ||||
| 	"github.com/rkonfj/peerguard/peer" | ||||
| 	"github.com/schollz/progressbar/v3" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"github.com/xtaci/kcp-go/v5" | ||||
| ) | ||||
|  | ||||
| var Cmd *cobra.Command | ||||
|  | ||||
| func init() { | ||||
| 	Cmd = &cobra.Command{ | ||||
| 		Use:   "download", | ||||
| 		Short: "Download shared file from peer", | ||||
| 		Args:  cobra.ExactArgs(1), | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			verbose, err := cmd.Flags().GetInt("verbose") | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			slog.SetLogLoggerLevel(slog.Level(verbose)) | ||||
| 			var pubnet pubnet.PublicNetwork | ||||
|  | ||||
| 			pubnet.Server, err = cmd.Flags().GetString("server") | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if len(pubnet.Server) == 0 { | ||||
| 				pubnet.Server = os.Getenv("PEERMAP_SERVER") | ||||
| 				if len(pubnet.Server) == 0 { | ||||
| 					return errors.New("unknown peermap server") | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			pubnet.Name, err = cmd.Flags().GetString("pubnet") | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			resourceURL, err := url.Parse(args[0]) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("invalid URL: %w", err) | ||||
| 			} | ||||
|  | ||||
| 			dir, filename := path.Split(resourceURL.Path) | ||||
| 			index, err := strconv.ParseInt(strings.Trim(dir, "/"), 10, 16) | ||||
| 			if err != nil { | ||||
| 				return fmt.Errorf("invalid URL: %w", err) | ||||
| 			} | ||||
| 			ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) | ||||
| 			defer cancel() | ||||
| 			return requestFile(ctx, pubnet, resourceURL.Host, uint16(index), filename) | ||||
| 		}, | ||||
| 	} | ||||
| 	Cmd.Flags().StringP("server", "s", "", "peermap server") | ||||
| 	Cmd.Flags().StringP("pubnet", "n", "public", "peermap public network") | ||||
| 	Cmd.Flags().IntP("verbose", "V", int(slog.LevelError), "log level") | ||||
| } | ||||
|  | ||||
| func requestFile(ctx context.Context, pubnet pubnet.PublicNetwork, peerID string, index uint16, filename string) error { | ||||
| 	packetConn, err := pubnet.ListenPacket(29879) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("listen p2p packet failed: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	var convid uint32 | ||||
| 	binary.Read(rand.Reader, binary.LittleEndian, &convid) | ||||
| 	conn, err := kcp.NewConn3(convid, peer.ID(peerID), nil, 10, 3, packetConn) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("dial kcp server failed: %w", err) | ||||
| 	} | ||||
| 	defer conn.Close() | ||||
| 	conn.SetStreamMode(true) | ||||
| 	conn.SetNoDelay(1, 10, 2, 1) | ||||
| 	conn.SetWindowSize(1024, 1024) | ||||
|  | ||||
| 	f, err := os.Create(filename) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	defer f.Close() | ||||
|  | ||||
| 	_, err = conn.Write(buildGet(uint16(index))) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	header := make([]byte, 5) | ||||
| 	_, err = io.ReadFull(conn, header) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	switch header[0] { | ||||
| 	case 0: | ||||
| 	case 1: | ||||
| 		return errors.New("bad request") | ||||
| 	case 2: | ||||
| 		return errors.New("file not found") | ||||
| 	default: | ||||
| 		return errors.New("invalid protocol header") | ||||
| 	} | ||||
|  | ||||
| 	fileSize := binary.BigEndian.Uint32(header[1:]) | ||||
| 	bar := progressbar.NewOptions64( | ||||
| 		int64(fileSize), | ||||
| 		progressbar.OptionSetDescription("downloading"), | ||||
| 		progressbar.OptionSetWriter(os.Stderr), | ||||
| 		progressbar.OptionShowBytes(true), | ||||
| 		progressbar.OptionSetWidth(10), | ||||
| 		progressbar.OptionThrottle(10*time.Millisecond), | ||||
| 		progressbar.OptionShowCount(), | ||||
| 		progressbar.OptionOnCompletion(func() { | ||||
| 			fmt.Fprint(os.Stderr, "\n") | ||||
| 		}), | ||||
| 		progressbar.OptionSetTheme(progressbar.Theme{ | ||||
| 			Saucer:        "=", | ||||
| 			SaucerHead:    ">", | ||||
| 			SaucerPadding: " ", | ||||
| 			BarStart:      "[", | ||||
| 			BarEnd:        "]", | ||||
| 		}), | ||||
| 		progressbar.OptionSpinnerType(14), | ||||
| 		progressbar.OptionFullWidth(), | ||||
| 		progressbar.OptionSetRenderBlankState(true), | ||||
| 	) | ||||
| 	go func() { // watch exit program event | ||||
| 		<-ctx.Done() | ||||
| 		conn.Write(buildClose()) | ||||
| 		conn.Close() | ||||
| 	}() | ||||
| 	defer conn.Write(buildClose()) | ||||
|  | ||||
| 	sha256Checksum := sha256.New() | ||||
|  | ||||
| 	_, err = io.Copy(io.MultiWriter(f, bar, sha256Checksum), &downloader{r: conn, finished: bar.IsFinished}) | ||||
| 	if err != nil && !errors.Is(err, io.EOF) { | ||||
| 		return fmt.Errorf("download file falied: %w", err) | ||||
| 	} | ||||
| 	conn.Write(buildChecksum()) | ||||
| 	checksum := make([]byte, 32) | ||||
| 	if _, err = io.ReadFull(conn, checksum); err != nil { | ||||
| 		return fmt.Errorf("read checksum failed: %w", err) | ||||
| 	} | ||||
| 	if !bytes.Equal(checksum, sha256Checksum.Sum(nil)) { | ||||
| 		return fmt.Errorf("download file failed: checksum mismatched") | ||||
| 	} | ||||
| 	fmt.Printf("sha256: %x\n", checksum) | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type downloader struct { | ||||
| 	r        io.Reader | ||||
| 	finished func() bool | ||||
| } | ||||
|  | ||||
| func (d *downloader) Read(p []byte) (n int, err error) { | ||||
| 	if d.finished() { | ||||
| 		return 0, io.EOF | ||||
| 	} | ||||
| 	return d.r.Read(p) | ||||
| } | ||||
|  | ||||
| func buildGet(index uint16) []byte { | ||||
| 	var header []byte | ||||
| 	header = append(header, 0, 0) | ||||
| 	header = append(header, binary.BigEndian.AppendUint16(nil, index)...) | ||||
| 	return header | ||||
| } | ||||
|  | ||||
| func buildClose() []byte { | ||||
| 	return []byte{1} | ||||
| } | ||||
|  | ||||
| func buildChecksum() []byte { | ||||
| 	return []byte{2} | ||||
| } | ||||
| @@ -5,7 +5,9 @@ import ( | ||||
| 	"log/slog" | ||||
|  | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/curve25519" | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/download" | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/secret" | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/share" | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/vpn" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| @@ -34,6 +36,8 @@ func main() { | ||||
| 	cmd.AddCommand(vpn.Cmd) | ||||
| 	cmd.AddCommand(secret.Cmd) | ||||
| 	cmd.AddCommand(curve25519.Cmd) | ||||
| 	cmd.AddCommand(share.Cmd) | ||||
| 	cmd.AddCommand(download.Cmd) | ||||
|  | ||||
| 	cmd.PersistentFlags().IntP("verbose", "V", 0, "logger verbosity level") | ||||
| 	cmd.Execute() | ||||
|   | ||||
							
								
								
									
										130
									
								
								cmd/pgcli/share/filemanager.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								cmd/pgcli/share/filemanager.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,130 @@ | ||||
| package share | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/sha256" | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"log/slog" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"os/user" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/schollz/progressbar/v3" | ||||
| ) | ||||
|  | ||||
| type FileManager struct { | ||||
| 	mutex sync.RWMutex | ||||
| 	index int | ||||
| 	files map[int]string | ||||
| } | ||||
|  | ||||
| func (fm *FileManager) Add(file string) (int, error) { | ||||
| 	fm.mutex.Lock() | ||||
| 	defer fm.mutex.Unlock() | ||||
| 	absPath, err := filepath.Abs(file) | ||||
| 	if err != nil { | ||||
| 		return -1, err | ||||
| 	} | ||||
| 	if relPath, ok := strings.CutPrefix(file, "~"); ok { | ||||
| 		curUser, err := user.Current() | ||||
| 		if err != nil { | ||||
| 			return -1, err | ||||
| 		} | ||||
| 		absPath = filepath.Join(curUser.HomeDir, relPath) | ||||
| 	} | ||||
| 	fm.files[fm.index] = absPath | ||||
| 	fm.index++ | ||||
| 	return fm.index - 1, nil | ||||
| } | ||||
|  | ||||
| func (fm *FileManager) Open(index int) (*os.File, error) { | ||||
| 	fm.mutex.RLock() | ||||
| 	defer fm.mutex.RUnlock() | ||||
| 	if absPath, ok := fm.files[index]; ok { | ||||
| 		return os.Open(absPath) | ||||
| 	} | ||||
| 	return nil, os.ErrNotExist | ||||
| } | ||||
|  | ||||
| func (fm *FileManager) HandleRequest(peerID string, conn net.Conn) { | ||||
| 	header := make([]byte, 4) | ||||
| 	_, err := io.ReadFull(conn, header) | ||||
| 	if err != nil || !bytes.Equal(header[:2], []byte{0, 0}) { | ||||
| 		conn.Write(buildErr(1)) | ||||
| 		slog.Error("Magic not verified, closing connection...") | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	index := binary.BigEndian.Uint16(header[2:]) | ||||
| 	f, err := fm.Open(int(index)) | ||||
| 	if err != nil { | ||||
| 		conn.Write(buildErr(2)) | ||||
| 		slog.Error("Open file failed", "err", err) | ||||
| 		return | ||||
| 	} | ||||
| 	defer f.Close() | ||||
|  | ||||
| 	stat, err := f.Stat() | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	conn.Write(buildOK(stat.Size())) | ||||
|  | ||||
| 	go func() { | ||||
| 		header := make([]byte, 1) | ||||
| 		io.ReadFull(conn, header) | ||||
| 		switch header[0] { | ||||
| 		case 1: | ||||
| 			conn.Close() | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	bar := progressbar.NewOptions64( | ||||
| 		stat.Size(), | ||||
| 		progressbar.OptionSetDescription(fmt.Sprintf("%s:%s", peerID, stat.Name())), | ||||
| 		progressbar.OptionSetWriter(os.Stderr), | ||||
| 		progressbar.OptionShowBytes(true), | ||||
| 		progressbar.OptionSetWidth(10), | ||||
| 		progressbar.OptionThrottle(10*time.Millisecond), | ||||
| 		progressbar.OptionShowCount(), | ||||
| 		progressbar.OptionOnCompletion(func() { | ||||
| 			fmt.Fprint(os.Stderr, "\n") | ||||
| 		}), | ||||
| 		progressbar.OptionSetTheme(progressbar.Theme{ | ||||
| 			Saucer:        "=", | ||||
| 			SaucerHead:    ">", | ||||
| 			SaucerPadding: " ", | ||||
| 			BarStart:      "[", | ||||
| 			BarEnd:        "]", | ||||
| 		}), | ||||
| 		progressbar.OptionSpinnerType(14), | ||||
| 		progressbar.OptionFullWidth(), | ||||
| 		progressbar.OptionSetRenderBlankState(true), | ||||
| 	) | ||||
|  | ||||
| 	sha256Checksum := sha256.New() | ||||
| 	_, err = io.Copy(io.MultiWriter(conn, bar, sha256Checksum), f) | ||||
| 	if err != nil { | ||||
| 		slog.Info("Copy file failed", "err", err) | ||||
| 	} | ||||
| 	conn.Write(sha256Checksum.Sum(nil)) | ||||
| } | ||||
|  | ||||
| func buildOK(fileSize int64) []byte { | ||||
| 	pkt := make([]byte, 5) | ||||
| 	copy(pkt[1:], binary.BigEndian.AppendUint32(nil, uint32(fileSize))) | ||||
| 	return pkt | ||||
| } | ||||
|  | ||||
| func buildErr(code byte) []byte { | ||||
| 	pkt := make([]byte, 5) | ||||
| 	pkt[0] = code | ||||
| 	return pkt | ||||
| } | ||||
							
								
								
									
										41
									
								
								cmd/pgcli/share/pubnet/pubnet.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								cmd/pgcli/share/pubnet/pubnet.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package pubnet | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	"net/url" | ||||
|  | ||||
| 	"github.com/rkonfj/peerguard/p2p" | ||||
| 	"github.com/rkonfj/peerguard/peer" | ||||
| 	"github.com/rkonfj/peerguard/peer/peermap" | ||||
| ) | ||||
|  | ||||
| type PublicNetwork struct { | ||||
| 	Name       string | ||||
| 	Server     string | ||||
| 	PrivateKey string | ||||
| } | ||||
|  | ||||
| func (pn *PublicNetwork) ListenPacket(udpPort int) (net.PacketConn, error) { | ||||
| 	pmapURL, err := url.Parse(pn.Server) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("invalid peermap URL: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	pmap, err := peermap.New(pmapURL, &peer.NetworkSecret{ | ||||
| 		Network: pn.Name, | ||||
| 		Secret:  pn.Name, | ||||
| 	}) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("create peermap failed: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	return p2p.ListenPacket(pmap, pn.secureOption(), p2p.ListenUDPPort(udpPort)) | ||||
| } | ||||
|  | ||||
| func (pn *PublicNetwork) secureOption() p2p.Option { | ||||
| 	if len(pn.PrivateKey) > 0 { | ||||
| 		return p2p.ListenPeerCurve25519(pn.PrivateKey) | ||||
| 	} | ||||
| 	return p2p.ListenPeerSecure() | ||||
| } | ||||
							
								
								
									
										108
									
								
								cmd/pgcli/share/share.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								cmd/pgcli/share/share.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| package share | ||||
|  | ||||
| import ( | ||||
| 	"context" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"log/slog" | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"path/filepath" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"github.com/rkonfj/peerguard/cmd/pgcli/share/pubnet" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"github.com/xtaci/kcp-go/v5" | ||||
| ) | ||||
|  | ||||
| var Cmd *cobra.Command | ||||
|  | ||||
| func init() { | ||||
| 	Cmd = &cobra.Command{ | ||||
| 		Use:   "share", | ||||
| 		Short: "Share files to peers", | ||||
| 		Args:  cobra.MinimumNArgs(1), | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			verbose, err := cmd.Flags().GetInt("verbose") | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			slog.SetLogLoggerLevel(slog.Level(verbose)) | ||||
|  | ||||
| 			var pubnet pubnet.PublicNetwork | ||||
|  | ||||
| 			if pubnet.Server, err = cmd.Flags().GetString("server"); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if len(pubnet.Server) == 0 { | ||||
| 				pubnet.Server = os.Getenv("PEERMAP_SERVER") | ||||
| 				if len(pubnet.Server) == 0 { | ||||
| 					return errors.New("unknown peermap server") | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			pubnet.PrivateKey, err = cmd.Flags().GetString("key") | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			if pubnet.Name, err = cmd.Flags().GetString("pubnet"); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
|  | ||||
| 			ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) | ||||
| 			defer cancel() | ||||
| 			return serve(ctx, pubnet, args) | ||||
| 		}, | ||||
| 	} | ||||
| 	Cmd.Flags().StringP("server", "s", "", "peermap server") | ||||
| 	Cmd.Flags().StringP("pubnet", "n", "public", "peermap public network") | ||||
| 	Cmd.Flags().String("key", "", "curve25519 private key in base58 format (default generate a new one)") | ||||
| 	Cmd.Flags().IntP("verbose", "V", int(slog.LevelError), "log level") | ||||
| } | ||||
|  | ||||
| func serve(ctx context.Context, pubnet pubnet.PublicNetwork, files []string) error { | ||||
| 	packetConn, err := pubnet.ListenPacket(29878) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("listen p2p packet failed: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	fm := FileManager{files: map[int]string{}} | ||||
| 	for _, file := range files { | ||||
| 		if index, err := fm.Add(file); err != nil { | ||||
| 			slog.Warn("AddFile", "path", file, "err", err) | ||||
| 		} else { | ||||
| 			fmt.Printf("ShareURL: pg://%s/%d/%s\n", packetConn.LocalAddr(), index, filepath.Base(file)) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	listener, err := kcp.ServeConn(nil, 10, 3, packetConn) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("listen kcp failed: %w", err) | ||||
| 	} | ||||
|  | ||||
| 	go func() { | ||||
| 		<-ctx.Done() | ||||
| 		listener.Close() | ||||
| 	}() | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-ctx.Done(): | ||||
| 			return nil | ||||
| 		default: | ||||
| 		} | ||||
| 		conn, err := listener.AcceptKCP() | ||||
| 		if err != nil { | ||||
| 			slog.Debug("Accept failed", "err", err) | ||||
| 			continue | ||||
| 		} | ||||
| 		conn.SetStreamMode(true) | ||||
| 		conn.SetNoDelay(1, 10, 2, 1) | ||||
| 		conn.SetWindowSize(1024, 1024) | ||||
| 		go func() { | ||||
| 			<-ctx.Done() | ||||
| 			conn.Close() | ||||
| 		}() | ||||
| 		fm.HandleRequest(conn.RemoteAddr().String(), conn) | ||||
| 	} | ||||
| } | ||||
| @@ -38,7 +38,7 @@ func init() { | ||||
| 	Cmd.Flags().String("tun", "pg0", "tun name") | ||||
| 	Cmd.Flags().Int("mtu", 1428, "mtu") | ||||
|  | ||||
| 	Cmd.Flags().String("key", "", "curve25519 private key in base64-url format (default generate a new one)") | ||||
| 	Cmd.Flags().String("key", "", "curve25519 private key in base58 format (default generate a new one)") | ||||
| 	Cmd.Flags().String("secret-file", "", "p2p network secret file (default ~/.peerguard_network_secret.json)") | ||||
|  | ||||
| 	Cmd.Flags().StringP("server", "s", "", "peermap server") | ||||
|   | ||||
							
								
								
									
										24
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								go.mod
									
									
									
									
									
								
							| @@ -8,17 +8,19 @@ require ( | ||||
| 	github.com/manifoldco/promptui v0.9.0 | ||||
| 	github.com/mdp/qrterminal/v3 v3.2.0 | ||||
| 	github.com/orcaman/concurrent-map/v2 v2.0.1 | ||||
| 	github.com/schollz/progressbar/v3 v3.14.2 | ||||
| 	github.com/spf13/cobra v1.8.0 | ||||
| 	github.com/vishvananda/netlink v1.2.1-beta.2 | ||||
| 	golang.org/x/crypto v0.18.0 | ||||
| 	golang.org/x/net v0.20.0 | ||||
| 	golang.org/x/oauth2 v0.16.0 | ||||
| 	golang.org/x/sys v0.16.0 | ||||
| 	github.com/xtaci/kcp-go/v5 v5.6.8 | ||||
| 	golang.org/x/crypto v0.19.0 | ||||
| 	golang.org/x/net v0.21.0 | ||||
| 	golang.org/x/oauth2 v0.17.0 | ||||
| 	golang.org/x/sys v0.19.0 | ||||
| 	golang.org/x/time v0.5.0 | ||||
| 	golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 | ||||
| 	gopkg.in/yaml.v2 v2.4.0 | ||||
| 	storj.io/common v0.0.0-20240425113201-9815a85cbc32 | ||||
| 	tailscale.com v1.56.1 | ||||
|  | ||||
| ) | ||||
|  | ||||
| require ( | ||||
| @@ -26,11 +28,19 @@ require ( | ||||
| 	github.com/go-jose/go-jose/v3 v3.0.1 // indirect | ||||
| 	github.com/golang/protobuf v1.5.3 // indirect | ||||
| 	github.com/inconshreveable/mousetrap v1.1.0 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.6 // indirect | ||||
| 	github.com/klauspost/reedsolomon v1.12.0 // indirect | ||||
| 	github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/rivo/uniseg v0.4.7 // indirect | ||||
| 	github.com/spf13/pflag v1.0.5 // indirect | ||||
| 	github.com/templexxx/cpu v0.1.0 // indirect | ||||
| 	github.com/templexxx/xorsimd v0.4.2 // indirect | ||||
| 	github.com/tjfoc/gmsm v1.4.1 // indirect | ||||
| 	github.com/vishvananda/netns v0.0.4 // indirect | ||||
| 	golang.org/x/term v0.16.0 // indirect | ||||
| 	golang.org/x/term v0.19.0 // indirect | ||||
| 	golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect | ||||
| 	google.golang.org/appengine v1.6.8 // indirect | ||||
| 	google.golang.org/protobuf v1.31.0 // indirect | ||||
| 	google.golang.org/protobuf v1.32.0 // indirect | ||||
| 	rsc.io/qr v0.2.0 // indirect | ||||
| ) | ||||
|   | ||||
							
								
								
									
										125
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										125
									
								
								go.sum
									
									
									
									
									
								
							| @@ -1,23 +1,47 @@ | ||||
| cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= | ||||
| github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= | ||||
| github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= | ||||
| github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||
| github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo= | ||||
| github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= | ||||
| github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||
| github.com/go-jose/go-jose/v3 v3.0.1 h1:pWmKFVtt+Jl0vBZTIpz/eAKwsm6LkIxDVVbFHKkchhA= | ||||
| github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= | ||||
| github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= | ||||
| github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= | ||||
| github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= | ||||
| github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | ||||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= | ||||
| github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= | ||||
| @@ -26,60 +50,107 @@ github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/ | ||||
| github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= | ||||
| github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= | ||||
| github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= | ||||
| github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= | ||||
| github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= | ||||
| github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| github.com/klauspost/reedsolomon v1.12.0 h1:I5FEp3xSwVCcEh3F5A7dofEfhXdF/bWhQWPH+XwBFno= | ||||
| github.com/klauspost/reedsolomon v1.12.0/go.mod h1:EPLZJeh4l27pUGC3aXOjheaoh1I9yut7xTURiW3LQ9Y= | ||||
| github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= | ||||
| github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= | ||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||
| github.com/mdp/qrterminal/v3 v3.2.0 h1:qteQMXO3oyTK4IHwj2mWsKYYRBOp1Pj2WRYFYYNTCdk= | ||||
| github.com/mdp/qrterminal/v3 v3.2.0/go.mod h1:XGGuua4Lefrl7TLEsSONiD+UEjQXJZ4mPzF+gWYIJkk= | ||||
| github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= | ||||
| github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= | ||||
| github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c= | ||||
| github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= | ||||
| github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= | ||||
| github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= | ||||
| github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||
| github.com/schollz/progressbar/v3 v3.14.2 h1:EducH6uNLIWsr560zSV1KrTeUb/wZGAHqyMFIEa99ks= | ||||
| github.com/schollz/progressbar/v3 v3.14.2/go.mod h1:aQAZQnhF4JGFtRJiw/eobaXpsqpVQAftEQ+hLGXaRc4= | ||||
| github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= | ||||
| github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= | ||||
| github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/templexxx/cpu v0.1.0 h1:wVM+WIJP2nYaxVxqgHPD4wGA2aJ9rvrQRV8CvFzNb40= | ||||
| github.com/templexxx/cpu v0.1.0/go.mod h1:w7Tb+7qgcAlIyX4NhLuDKt78AHA5SzPmq0Wj6HiEnnk= | ||||
| github.com/templexxx/xorsimd v0.4.2 h1:ocZZ+Nvu65LGHmCLZ7OoCtg8Fx8jnHKK37SjvngUoVI= | ||||
| github.com/templexxx/xorsimd v0.4.2/go.mod h1:HgwaPoDREdi6OnULpSfxhzaiiSUY4Fi3JPn1wpt28NI= | ||||
| github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= | ||||
| github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= | ||||
| github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= | ||||
| github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= | ||||
| github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= | ||||
| github.com/vishvananda/netns v0.0.4 h1:Oeaw1EM2JMxD51g9uhtC0D7erkIjgmj8+JZc26m1YX8= | ||||
| github.com/vishvananda/netns v0.0.4/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= | ||||
| github.com/xtaci/kcp-go/v5 v5.6.8 h1:jlI/0jAyjoOjT/SaGB58s4bQMJiNS41A2RKzR6TMWeI= | ||||
| github.com/xtaci/kcp-go/v5 v5.6.8/go.mod h1:oE9j2NVqAkuKO5o8ByKGch3vgVX3BNf8zqP8JiGq0bM= | ||||
| github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae h1:J0GxkO96kL4WF+AIT3M4mfUVinOCPgf2uUWYFUzN0sM= | ||||
| github.com/xtaci/lossyconn v0.0.0-20190602105132-8df528c0c9ae/go.mod h1:gXtu8J62kEgmN++bm9BVICuT/e8yiLI2KFobd/TRFsE= | ||||
| github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= | ||||
| golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= | ||||
| golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= | ||||
| golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= | ||||
| golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= | ||||
| golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||
| golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= | ||||
| golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= | ||||
| golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= | ||||
| golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= | ||||
| golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= | ||||
| golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= | ||||
| golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= | ||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= | ||||
| golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= | ||||
| golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= | ||||
| golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE= | ||||
| golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= | ||||
| golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= | ||||
| golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= | ||||
| golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= | ||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= | ||||
| @@ -87,6 +158,10 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= | ||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||
| golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| @@ -95,12 +170,26 @@ golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeu | ||||
| golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= | ||||
| golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 h1:/jFs0duh4rdb8uIfPMv78iAJGcPKDeqAFnaLBropIC4= | ||||
| golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173/go.mod h1:tkCQ4FQXmpAgYVh++1cq16/dH4QJtmvpRv19DWGAHSA= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= | ||||
| google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= | ||||
| google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= | ||||
| google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= | ||||
| google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= | ||||
| google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= | ||||
| google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= | ||||
| google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= | ||||
| google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= | ||||
| google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= | ||||
| google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= | ||||
| google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||
| google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||
| google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= | ||||
| google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||
| google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= | ||||
| google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | ||||
| @@ -110,7 +199,11 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gvisor.dev/gvisor v0.0.0-20230928000133-4fe30062272c h1:bYb98Ra11fJ8F2xFbZx0zg2VQ28lYqC1JxfaaF53xqY= | ||||
| gvisor.dev/gvisor v0.0.0-20230928000133-4fe30062272c/go.mod h1:AVgIgHMwK63XvmAzWG9vLQ41YnVHN0du0tEC46fI7yY= | ||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| rsc.io/qr v0.2.0 h1:6vBLea5/NRMVTz8V66gipeLycZMl/+UlFmk8DvqQ6WY= | ||||
| rsc.io/qr v0.2.0/go.mod h1:IF+uZjkb9fqyeF/4tlBoynqmQxUoPfWEKh921coOuXs= | ||||
| storj.io/common v0.0.0-20240425113201-9815a85cbc32 h1:Py/vvWBasKRGG8pO1M89idDEW3LWdU5o/w83xwUNNgU= | ||||
| storj.io/common v0.0.0-20240425113201-9815a85cbc32/go.mod h1:MFl009RHY4tIqySVNy/6EmgRw2q60d26h9N/nb7JxGU= | ||||
| tailscale.com v1.56.1 h1:V3HBDJai3u7xo22Xlv7ioqKNZQdxOJebLYCNqCXVwZg= | ||||
| tailscale.com v1.56.1/go.mod h1:XQk6fCN8oMJ+qbCmW+2WS/VM3jTA9nIHT6O19t0hZeQ= | ||||
|   | ||||
| @@ -3,7 +3,6 @@ package p2p | ||||
| import ( | ||||
| 	"context" | ||||
| 	"crypto/rand" | ||||
| 	"encoding/base64" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| @@ -17,6 +16,7 @@ import ( | ||||
| 	"github.com/rkonfj/peerguard/lru" | ||||
| 	"github.com/rkonfj/peerguard/peer" | ||||
| 	"github.com/rkonfj/peerguard/peer/peermap" | ||||
| 	"storj.io/common/base58" | ||||
| ) | ||||
|  | ||||
| type PacketBroadcaster interface { | ||||
| @@ -242,12 +242,12 @@ func (c *PeerPacketConn) runControlEventLoop(wsConn *disco.WSConn, udpConn *disc | ||||
|  | ||||
| // ListenPacket listen the p2p network for read/write packets | ||||
| func ListenPacket(peermap *peermap.Peermap, opts ...Option) (*PeerPacketConn, error) { | ||||
| 	id := make([]byte, 32) | ||||
| 	id := make([]byte, 16) | ||||
| 	rand.Read(id) | ||||
| 	cfg := Config{ | ||||
| 		UDPPort:         29877, | ||||
| 		KeepAlivePeriod: 10 * time.Second, | ||||
| 		PeerID:          peer.ID(base64.URLEncoding.EncodeToString(id)), | ||||
| 		PeerID:          peer.ID(base58.Encode(id)), | ||||
| 	} | ||||
| 	for _, opt := range opts { | ||||
| 		if err := opt(&cfg); err != nil { | ||||
|   | ||||
| @@ -2,10 +2,9 @@ package secure | ||||
|  | ||||
| import ( | ||||
| 	"crypto/rand" | ||||
| 	"encoding/base64" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"golang.org/x/crypto/curve25519" | ||||
| 	"storj.io/common/base58" | ||||
| ) | ||||
|  | ||||
| type PrivateKey struct { | ||||
| @@ -14,14 +13,11 @@ type PrivateKey struct { | ||||
| } | ||||
|  | ||||
| func (key *PrivateKey) String() string { | ||||
| 	return base64.URLEncoding.EncodeToString(key.b) | ||||
| 	return base58.Encode(key.b) | ||||
| } | ||||
|  | ||||
| func (key *PrivateKey) SharedKey(pubKey string) ([]byte, error) { | ||||
| 	b, err := base64.URLEncoding.DecodeString(pubKey) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("invalid publicKey format: %w", err) | ||||
| 	} | ||||
| 	b := base58.Decode(pubKey) | ||||
| 	secret, err := curve25519.X25519(key.b, b) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @@ -34,7 +30,7 @@ type PublicKey struct { | ||||
| } | ||||
|  | ||||
| func (key *PublicKey) String() string { | ||||
| 	return base64.URLEncoding.EncodeToString(key.b) | ||||
| 	return base58.Encode(key.b) | ||||
| } | ||||
|  | ||||
| func GenerateCurve25519() (*PrivateKey, error) { | ||||
| @@ -54,10 +50,7 @@ func GenerateCurve25519() (*PrivateKey, error) { | ||||
| } | ||||
|  | ||||
| func Curve25519PrivateKey(privateKey string) (*PrivateKey, error) { | ||||
| 	priv, err := base64.URLEncoding.DecodeString(privateKey) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("invalid privateKey format: %w", err) | ||||
| 	} | ||||
| 	priv := base58.Decode(privateKey) | ||||
| 	var pub [32]byte | ||||
| 	curve25519.ScalarBaseMult(&pub, (*[32]byte)(priv)) | ||||
| 	return &PrivateKey{b: priv, PublicKey: PublicKey{b: pub[:]}}, nil | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 rkonfj
					rkonfj