arnaucube
arnaucube/slowlorisdbPublic Self-hosted repository
slowlorisdb/peer/peer.go
peer/peer.goRaw
  1package peer
  2
  3import (
  4	"bufio"
  5	"context"
  6	"crypto/rand"
  7	"fmt"
  8	"io"
  9	"os"
 10
 11	"github.com/libp2p/go-libp2p"
 12	crypto "github.com/libp2p/go-libp2p-crypto"
 13	inet "github.com/libp2p/go-libp2p-net"
 14	peerstore "github.com/libp2p/go-libp2p-peerstore"
 15	"github.com/multiformats/go-multiaddr"
 16	log "github.com/sirupsen/logrus"
 17)
 18
 19func handleStream(stream inet.Stream) {
 20	log.Info("Got a new stream!")
 21
 22	rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))
 23
 24	go readData(rw)
 25	go writeData(rw)
 26}
 27
 28func readData(rw *bufio.ReadWriter) {
 29	for {
 30		str, err := rw.ReadString('\n')
 31		if err != nil {
 32			log.Error("Error reading from buffer")
 33			panic(err)
 34		}
 35		if str == "" {
 36			return
 37		}
 38		if str != "\n" {
 39			fmt.Printf("\x1b[32m%s\x1b[0m> ", str)
 40		}
 41	}
 42}
 43
 44func writeData(rw *bufio.ReadWriter) {
 45	stdReader := bufio.NewReader(os.Stdin)
 46	for {
 47		fmt.Print("> ")
 48		sendData, err := stdReader.ReadString('\n')
 49		if err != nil {
 50			log.Error("Error reading from stdin")
 51			panic(err)
 52		}
 53
 54		_, err = rw.WriteString(fmt.Sprintf("%s\n", sendData))
 55		if err != nil {
 56			log.Error("Error writing to buffer")
 57			panic(err)
 58		}
 59		err = rw.Flush()
 60		if err != nil {
 61			log.Error("Error flushing buffer")
 62			panic(err)
 63		}
 64	}
 65}
 66
 67func Start(port int, dest string) error {
 68	var r io.Reader
 69	r = rand.Reader
 70
 71	prvKey, _, err := crypto.GenerateKeyPairWithReader(crypto.RSA, 2048, r)
 72	if err != nil {
 73		return err
 74	}
 75
 76	sourceMultiAddr, _ := multiaddr.NewMultiaddr(fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port))
 77
 78	host, err := libp2p.New(
 79		context.Background(),
 80		libp2p.ListenAddrs(sourceMultiAddr),
 81		libp2p.Identity(prvKey),
 82	)
 83	if err != nil {
 84		return err
 85	}
 86	if dest == "" {
 87		host.SetStreamHandler("/slowlorisdb/0.0.1", handleStream)
 88
 89		var port string
 90		for _, la := range host.Network().ListenAddresses() {
 91			if p, err := la.ValueForProtocol(multiaddr.P_TCP); err == nil {
 92				port = p
 93				break
 94			}
 95		}
 96
 97		if port == "" {
 98			panic("was not able to find actual local port")
 99		}
100
101		fmt.Printf("Run './slowlorisdb -d /ip4/127.0.0.1/tcp/%v/p2p/%s' on another console.\n", port, host.ID().Pretty())
102		fmt.Printf("\nWaiting for incoming connection\n\n")
103
104		// Hang forever
105		<-make(chan struct{})
106	} else {
107		fmt.Println("This node's multiaddresses:")
108		for _, la := range host.Addrs() {
109			fmt.Printf(" - %v\n", la)
110		}
111		fmt.Println()
112
113		maddr, err := multiaddr.NewMultiaddr(dest)
114		if err != nil {
115			log.Fatalln(err)
116		}
117
118		info, err := peerstore.InfoFromP2pAddr(maddr)
119		if err != nil {
120			log.Fatalln(err)
121		}
122
123		host.Peerstore().AddAddrs(info.ID, info.Addrs, peerstore.PermanentAddrTTL)
124
125		s, err := host.NewStream(context.Background(), info.ID, "/slowlorisdb/0.0.1")
126		if err != nil {
127			panic(err)
128		}
129
130		rw := bufio.NewReadWriter(bufio.NewReader(s), bufio.NewWriter(s))
131
132		go writeData(rw)
133		go readData(rw)
134
135		select {}
136	}
137	return nil
138}