From bdde8c49065eaec1bbbe61b03a85ddd359a4fd24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 3 Oct 2022 15:59:27 +0300 Subject: [PATCH] Add partner addres validation Now service exit when: - Domain name instead IP address used as an argument with `-d` key. - Port number greater than 65535 IPv4 max port numbers (unsigned 16 bit int) - When an endpoint specified by IP:port argument --- Makefile | 12 ++++++++++++ src/client_server/validators.go | 14 +++++++++++++- src/main.go | 15 ++++++--------- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 0b82deb..cae4bc0 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,17 @@ run: go run src/main.go -p 5053 -d "127.0.0.1:5059" +test-ip: + go run src/main.go -p 5053 -d "127.0.0.1:5059,localhost:5059" + +test-port: + go run src/main.go -p 5053 -d "127.0.0.1:5059,127.0.0.1:as" + +test-port-max: + go run src/main.go -p 5053 -d "127.0.0.1:5059,127.0.0.1:65537" + +test-port-endpoint: + go run src/main.go -p 5053 -d "127.0.0.1:9001/bid_request" + build: go build -o bin/simple-choose-ad src/main.go diff --git a/src/client_server/validators.go b/src/client_server/validators.go index d1befd0..a5f9077 100644 --- a/src/client_server/validators.go +++ b/src/client_server/validators.go @@ -10,6 +10,8 @@ import ( "strings" ) +const MAX_PORT_NUM = 65535 + // Returns false if ipv4 `correct`. func wrongIPAddresFormat(ipv4 string) bool { re, err := regexp.Compile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`) @@ -24,6 +26,8 @@ func throwHTTPError(err_text string, code int, w *http.ResponseWriter) { log.Printf("Error: %d %v\n", code, err_text) } +// Wait string in format "10.10.10.10:8080", where `10.10.10.10` IPv4, +// and `8080` port. If ip or port has wrong format, returns error. func ParsePartnersAddress(ipAndPort string) (string, int64, error) { var err error iap := strings.Split(ipAndPort, ":") @@ -33,6 +37,14 @@ func ParsePartnersAddress(ipAndPort string) (string, int64, error) { err = errors.New(fmt.Sprintf("Wrong ip address format in partner ip: %v", ip)) } - port, _ := strconv.ParseInt(iap[1], 10, 32) + port, e := strconv.ParseInt(iap[1], 10, 32) + if e != nil { + err = errors.New(fmt.Sprintf("Wrong port format in partner ip: %v", e)) + } + + if port > MAX_PORT_NUM { + err = errors.New(fmt.Sprintf("Wrong port in partner ip: grater than %v", MAX_PORT_NUM)) + } + return ip, port, err } diff --git a/src/main.go b/src/main.go index 70652d8..a0dbd6b 100644 --- a/src/main.go +++ b/src/main.go @@ -1,16 +1,14 @@ /* Usage: - sample-choose-ad [flags] + sample-choose-ad [flags] The flags are: - -p - Listening port - -d - Adversment partners list in format ip_p1:port,ip_p2:port2...ip_p10:port - - + -p + Listening port + -d + Adversment partners list in format ip_p1:port,ip_p2:port2...ip_p10:port */ package main @@ -49,8 +47,7 @@ func main() { ip, port, err := clientserver.ParsePartnersAddress(p) if err != nil { - log.Println(err) - continue + log.Fatalln(err) } partners = append(partners, customtypes.PartnersAddress{