main.go (1179B)
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 "os" 8 "os/signal" 9 "path/filepath" 10 "regexp" 11 "syscall" 12 13 "github.com/mitchellh/go-finger" 14 ) 15 16 var profile_folder = "profiles" 17 18 var validUser = regexp.MustCompile(`^[a-zA-Z0-9_-]*$`) 19 20 func handler(ctx context.Context, w io.Writer, q *finger.Query) { 21 text := "" 22 filename := "" 23 24 if !validUser.MatchString(q.Username) { 25 w.Write([]byte("ERR:\nInvalid username!")) 26 return 27 } 28 29 if q.Username == "" { 30 filename = "root" 31 } else { 32 filename = filepath.Join(profile_folder, q.Username) 33 } 34 35 b, err := os.ReadFile(filename) 36 if err != nil { 37 text = "ERR:\nNo such user!" 38 } else { 39 text = "MSG:\n" + string(b) 40 } 41 42 fmt.Fprint(w, text) 43 44 if q.Username == "" { 45 fmt.Println("Requested root") 46 } else { 47 fmt.Printf("Requested username: %s\n", q.Username) 48 } 49 } 50 51 func main() { 52 fmt.Print("\x1b[?1049h") 53 54 sig := make(chan os.Signal, 1) 55 signal.Notify(sig, os.Interrupt, syscall.SIGTERM) 56 57 go func() { 58 <-sig 59 60 fmt.Println("\nShutting down...") 61 fmt.Print("\x1b[?1049l") 62 os.Exit(0) 63 }() 64 65 fmt.Print("Flick Finger Server is running on 0.0.0.0\n") 66 finger.Serve(finger.HandlerFunc(handler)) 67 }