diff --git a/simple-colluder/main.go b/simple-colluder/main.go index 27c0947..3ce8da6 100644 --- a/simple-colluder/main.go +++ b/simple-colluder/main.go @@ -3,15 +3,19 @@ package main import ( "flag" "fmt" + "io/ioutil" "log" "net" "os" "path/filepath" + "strings" "time" "github.com/eyedeekay/onramp" ) +var myaddr string + func main() { name := flag.String("name", "", "name of node") flag.Parse() @@ -23,22 +27,17 @@ func main() { if err != nil { log.Fatal(err) } + myaddr = listener.Addr().String() log.Println(listener.Addr().String()) - os.WriteFile(filepath.Join("i2pkeys","colluder-"+*name+".public"), []byte(listener.Addr().String()), 0644) + os.WriteFile(filepath.Join("i2pkeys", "colluder-"+*name+".public"), []byte(listener.Addr().String()), 0644) for { conn, err := listener.Accept() if err != nil { log.Print(err) } + appendLineToFile(listener.Addr().String(), conn.RemoteAddr().String()+"\n") go func() { log.Println("Accepted connection on: \n\t", listener.Addr().String(), "\nAccepted From: \n\t", conn.RemoteAddr().String()) - os.Create(listener.Addr().String()) - file, err := os.OpenFile(listener.Addr().String(), os.O_APPEND, 0644) - if err != nil { - log.Print(err) - } - file.Write([]byte(conn.RemoteAddr().String()+"\n")) - file.Close() handleRequest(conn) }() } @@ -46,8 +45,55 @@ func main() { func handleRequest(conn net.Conn) { time := time.Now().Format(time.ANSIC) - responseStr := fmt.Sprintf("HTTP/1.1 200 OK\r, Content-Length: 12\r\n\r\nYour base32 is: %v. Received time: %v\r\n", conn.RemoteAddr().String(), time) - log.Println(responseStr) + found, err := findInB32Files(conn.RemoteAddr().String()) + if err != nil { + log.Println(err) + } + responseStr := fmt.Sprintf("HTTP/1.1 200 OK\r, Content-Length: 12\r\n\r\nYour base32 is: %v. Received time: %v\r\n %v\n", conn.RemoteAddr().String(), time, found) conn.Write([]byte(responseStr)) conn.Close() } + +func appendLineToFile(filename string, line string) error { + f, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) + if err != nil { + return err + } + _, err = f.WriteString(line) + if err != nil { + return err + } + return f.Close() +} + +func listAllB32Files() []string { + files, err := ioutil.ReadDir("./") + if err != nil { + log.Fatal(err) + } + var b32files []string + for _, file := range files { + if strings.HasSuffix(file.Name(), ".b32.i2p") { + b32files = append(b32files, file.Name()) + } + } + return b32files +} + +func findInB32Files(query string) (string, error) { + b32Files := listAllB32Files() + rval := "" + for _, file := range b32Files { + if file == myaddr { + continue + } + content, err := ioutil.ReadFile(file) + if err != nil { + return "Colluder encountered a problem", nil + } + if strings.Contains(string(content), query) { + rval = "My friend " + filepath.Base(file) + "also saw you recently\n" + } + } + return rval, nil +}