Proto/secure.go

109 lines
2.0 KiB
Go
Raw Normal View History

2023-11-18 09:59:36 +00:00
package main
import (
"net"
"os"
"fmt"
"bufio"
"strings"
"strconv"
)
func largestOrder(msg string) string {
orders := strings.Split(msg, ",")
largest := 0
result := ""
for i := range orders {
l := orders[i]
parts := strings.Split(l, "x")
amount, err := strconv.Atoi(parts[0])
if err == nil && amount > largest {
largest = amount
result = l
}
}
return result
}
type SecureServer struct {
port uint16
}
func NewSecureServer(port uint16) *SecureServer {
return &SecureServer{
port,
}
}
type SecureSession struct{
con net.Conn
}
func NewSecureSession(con net.Conn) *SecureSession {
return &SecureSession{
con,
}
}
func (s *SecureServer) Run() {
addr := fmt.Sprintf("0.0.0.0:%d", s.port)
server, err := net.Listen("tcp", addr)
if err != nil {
fmt.Println("Error listening:", err.Error())
os.Exit(1)
}
defer server.Close()
fmt.Println("SecureServer waiting for client...")
for {
connection, err := server.Accept()
if err != nil {
fmt.Println("Error accepting: ", err.Error())
os.Exit(1)
}
fmt.Println("client connected")
s.processClient(connection)
}
}
func (s *SecureServer) processClient(con net.Conn) {
session := NewSecureSession( con)
go session.SecureReceiver()
}
func (s *SecureSession) setEncryption(r *bufio.Reader) error {
secdef, err := r.ReadBytes('\x00')
if err != nil { return err }
fmt.Printf("secdef: %s\n", secdef)
return nil
}
func (s *SecureSession) query(r *bufio.Reader) error {
msg, err := r.ReadString('\n')
if err != nil { return err }
msg = strings.TrimSpace(msg)
fmt.Printf("Q: %s", msg)
a := largestOrder(msg)
fmt.Printf("A: %s\n", a)
s.con.Write(append([]byte(a), []byte("\n")...))
return nil
}
func (s *SecureSession) close() {
fmt.Printf("close\n")
s.con.Close()
}
func (s *SecureSession) SecureReceiver() {
defer s.close()
r := bufio.NewReaderSize(s.con, 5000)
err := s.setEncryption(r)
for err == nil {
err = s.query(r)
}
}