From 70b1b8c8267008b9cf0406fbc4dfeb86bd2e924b Mon Sep 17 00:00:00 2001 From: daru Date: Sat, 30 Oct 2021 15:05:59 +0200 Subject: [PATCH 1/2] Code clean up + update modules --- README.md | 18 +++++------ auth/auth.go | 4 +-- auth/toml.go | 2 +- dns/dns.go | 90 ++++++++++++++++++++++++++-------------------------- go.mod | 14 ++++---- go.sum | 27 +++++++++------- main.go | 7 ++-- web/web.go | 86 ++++++++++++++++++++++++------------------------- 8 files changed, 127 insertions(+), 121 deletions(-) diff --git a/README.md b/README.md index 412e41b..dbab940 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ go run main.go Bullding: ```sh -go build main.go +go build ``` ## Config -`conf.toml` by default +Default `conf.toml` ```toml [DNS] Port = 5353 # DNS server port @@ -27,7 +27,7 @@ SocketFileMode = 420 # File mode for HTTP unix socket in decimal (420 = ``` ## Users -`auth.toml` by default +Default `auth.toml` ```toml [someusername] # user name of the user Password = '1234' # password of the user @@ -39,17 +39,17 @@ Domains = ["subdomain.example.com."] # domains the user can register, suffix wi ## Flags ### --enable-debug-mode -Will output all registered records on the index page of the HTTP server. -Type: `bool` +Will output all registered records on the index page of the HTTP server. +Type: `bool` Default: `false` ### --config-file -Will define what config file should be used. -Type: `string` +Will define what config file should be used. +Type: `string` Default: `conf.toml` ### --auth-file -Will define what file should be used to define users that can log in. -Type: `string` +Will define what file should be used to define users that can log in. +Type: `string` Default: `auth.toml` diff --git a/auth/auth.go b/auth/auth.go index 32de358..74554e4 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -23,7 +23,7 @@ type user struct { domains map[string]string } -var parsedUsers map[string]user = map[string]user{} +var parsedUsers map[string]user = make(map[string]user) func (user user) Authenticate(password string) (bool, error) { return argon2pw.CompareHashWithPassword(user.password, password) @@ -40,7 +40,7 @@ func (selfUser *userRaw) Tidy() (user, error) { } // Create a map => faster access times - parsedDomains := map[string]string{} + parsedDomains := make(map[string]string) for _, domain := range selfUser.Domains { parsedDomains[domain] = domain } diff --git a/auth/toml.go b/auth/toml.go index 89b9c8d..1e4e693 100644 --- a/auth/toml.go +++ b/auth/toml.go @@ -14,7 +14,7 @@ func loadAuthFile(authFilePath string) (map[string]*userRaw, error) { if err != nil { color.Errorln(err.Error()) color.Warnln("Creating new authentication file") - return writeAuthFile(authFilePath, map[string]*userRaw{}) + return writeAuthFile(authFilePath, make(map[string]*userRaw)) } var users map[string]*userRaw diff --git a/dns/dns.go b/dns/dns.go index 53b6398..bf18788 100644 --- a/dns/dns.go +++ b/dns/dns.go @@ -19,51 +19,7 @@ type domain struct { Ipv6 map[string]string } -var domains = []*domain{} - -func parseQuery(m *dns.Msg, currentDomain *domain) { - for _, q := range m.Question { - switch q.Qtype { - case dns.TypeA: - log.Printf("Query for A record of %s\n", q.Name) - currentDomain.Mutv4.RLock() - ip := currentDomain.Ipv4[q.Name] - currentDomain.Mutv4.RUnlock() - if ip != "" { - rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip)) - if err == nil { - m.Answer = append(m.Answer, rr) - } - } - case dns.TypeAAAA: - log.Printf("Query for AAAA record of %s\n", q.Name) - currentDomain.Mutv6.RLock() - ip := currentDomain.Ipv6[q.Name] - currentDomain.Mutv6.RUnlock() - if ip != "" { - rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip)) - if err == nil { - m.Answer = append(m.Answer, rr) - } - } - } - } -} - -func handleDnsRequest(currentDomain *domain) func(w dns.ResponseWriter, r *dns.Msg) { - return func(w dns.ResponseWriter, r *dns.Msg) { - m := new(dns.Msg) - m.SetReply(r) - m.Compress = false - - switch r.Opcode { - case dns.OpcodeQuery: - parseQuery(m, currentDomain) - } - - w.WriteMsg(m) - } -} +var domains []*domain = make([]*domain, 0) func Init() { for _, currentDomain := range config.Config.DNS.Domains { @@ -125,3 +81,47 @@ func UpdateIpv4(domain string, ipv4 string) (err error) { func Get() []*domain { return domains } + +func parseQuery(m *dns.Msg, currentDomain *domain) { + for _, q := range m.Question { + switch q.Qtype { + case dns.TypeA: + log.Printf("Query for A record of %s\n", q.Name) + currentDomain.Mutv4.RLock() + ip := currentDomain.Ipv4[q.Name] + currentDomain.Mutv4.RUnlock() + if ip != "" { + rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip)) + if err == nil { + m.Answer = append(m.Answer, rr) + } + } + case dns.TypeAAAA: + log.Printf("Query for AAAA record of %s\n", q.Name) + currentDomain.Mutv6.RLock() + ip := currentDomain.Ipv6[q.Name] + currentDomain.Mutv6.RUnlock() + if ip != "" { + rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip)) + if err == nil { + m.Answer = append(m.Answer, rr) + } + } + } + } +} + +func handleDnsRequest(currentDomain *domain) func(w dns.ResponseWriter, r *dns.Msg) { + return func(w dns.ResponseWriter, r *dns.Msg) { + m := new(dns.Msg) + m.SetReply(r) + m.Compress = false + + switch r.Opcode { + case dns.OpcodeQuery: + parseQuery(m, currentDomain) + } + + w.WriteMsg(m) + } +} diff --git a/go.mod b/go.mod index 50875a5..a92159d 100644 --- a/go.mod +++ b/go.mod @@ -4,20 +4,20 @@ go 1.17 require ( github.com/fasthttp/router v1.4.4 - github.com/gookit/color v1.4.2 + github.com/gookit/color v1.5.0 github.com/miekg/dns v1.1.43 - github.com/pelletier/go-toml/v2 v2.0.0-beta.3 + github.com/pelletier/go-toml/v2 v2.0.0-beta.4 github.com/raja/argon2pw v1.0.1 github.com/valyala/fasthttp v1.31.0 ) require ( - github.com/andybalholm/brotli v1.0.2 // indirect - github.com/klauspost/compress v1.13.4 // indirect + github.com/andybalholm/brotli v1.0.3 // indirect + github.com/klauspost/compress v1.13.6 // indirect github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect - golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect - golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect - golang.org/x/sys v0.0.0-20211015200801-69063c4bb744 // indirect + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect + golang.org/x/net v0.0.0-20211029224645-99673261e6eb // indirect + golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8 // indirect ) diff --git a/go.sum b/go.sum index 87f87ba..b6e6534 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,21 @@ -github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fasthttp/router v1.4.4 h1:Z025tHFTjDp6T6QMBjloyGL6KV5wtakW365K/7KiE1c= github.com/fasthttp/router v1.4.4/go.mod h1:TiyF2kc+mogKcTxqkhUbiXpwklouv5dN58A0ZUo8J6s= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= -github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= -github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= +github.com/gookit/color v1.5.0 h1:1Opow3+BWDwqor78DcJkJCIwnkviFi+rrOANki9BUFw= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/pelletier/go-toml/v2 v2.0.0-beta.3 h1:PNCTU4naEJ8mKal97P3A2qDU74QRQGlv4FXiL1XDqi4= -github.com/pelletier/go-toml/v2 v2.0.0-beta.3/go.mod h1:aNseLYu/uKskg0zpr/kbr2z8yGuWtotWf/0BpGIAL2Y= +github.com/pelletier/go-toml/v2 v2.0.0-beta.4 h1:GCs8ebsDtEH3RiO78+BvhHqj65d/I6tjESitJZc07Rc= +github.com/pelletier/go-toml/v2 v2.0.0-beta.4/go.mod h1:ke6xncR3W76Ba8xnVxkrZG0js6Rd2BsQEAYrfgJ6eQA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/raja/argon2pw v1.0.1 h1:RIUM12+uQdj5/cWQLlEmZDD8xj5kQN1X9kTK0xfXjGQ= @@ -21,7 +23,7 @@ github.com/raja/argon2pw v1.0.1/go.mod h1:idX/fPqwjX31YMTF2iIpEpNApV2YbQhSFr4iIh github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4 h1:ocK/D6lCgLji37Z2so4xhMl46se1ntReQQCUIU4BWI8= github.com/savsgio/gotils v0.0.0-20210921075833-21a6215cb0e4/go.mod h1:oejLrk1Y/5zOF+c/aHtXqn3TFlzzbAgPWg8zBiAHDas= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942 h1:t0lM6y/M5IiUZyvbBTcngso8SZEZICH7is9B6g/obVU= github.com/stretchr/testify v1.7.1-0.20210427113832-6241f9ab9942/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= @@ -31,11 +33,13 @@ github.com/valyala/fasthttp v1.31.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb h1:pirldcYWx7rx7kE5r+9WsOXPXK0+WH5+uZ7uPmJ44uM= +golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -43,8 +47,9 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744 h1:KzbpndAYEM+4oHRp9JmB2ewj0NHHxO3Z0g7Gus2O1kk= -golang.org/x/sys v0.0.0-20211015200801-69063c4bb744/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8 h1:M69LAlWZCshgp0QSzyDcSsSIejIEeuaCVpmwcKwyLMk= +golang.org/x/sys v0.0.0-20211029165221-6e7872819dc8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/main.go b/main.go index 1531622..ad7a2c5 100644 --- a/main.go +++ b/main.go @@ -12,8 +12,9 @@ import ( ) var ( - configFile = flag.String("config-file", "conf.toml", "Path to configuration file") - authFile = flag.String("auth-file", "auth.toml", "Path to authentication file") + configFile = flag.String("config-file", "conf.toml", "Path to configuration file") + authFile = flag.String("auth-file", "auth.toml", "Path to authentication file") + enableDebugMode = flag.Bool("enable-debug-mode", false, "Enables debug mode, will output a list of all registered records on the index page of the HTTP server") ) type dnsResult struct { @@ -30,7 +31,7 @@ func main() { } dns.Init() - web.Init() + web.Init(*enableDebugMode) err = auth.Init(*authFile) if err != nil { log.Fatalf("Failed to initialize authentication module: %s\n", err.Error()) diff --git a/web/web.go b/web/web.go index b421957..a430772 100644 --- a/web/web.go +++ b/web/web.go @@ -1,7 +1,6 @@ package web import ( - "flag" "fmt" "io/fs" "log" @@ -13,10 +12,51 @@ import ( "github.com/valyala/fasthttp" ) -var enableDebugMode *bool = flag.Bool("enable-debug-mode", false, "Enables debug mode, will output a list of ") +var ( + enableDebugMode bool + r *router.Router + ipv4Param = []byte("ipv4") + ipv6Param = []byte("ipv6") + userParam = []byte("user") + passwordParam = []byte("password") +) + +func Init(debugMode bool) { + enableDebugMode = debugMode + r = router.New() + r.GET("/", index) + r.GET("/update/{domain}/v4", authenticatedRequest(updateV4)) + r.GET("/update/{domain}/v6", authenticatedRequest(updateV6)) +} + +func RunSocket() error { + httpConfig := config.Config.HTTP + if httpConfig.Socket != "" { + log.Printf("Starting HTTP socket in %s with permission %d\n", httpConfig.Socket, httpConfig.SocketFileMode) + err := fasthttp.ListenAndServeUNIX(httpConfig.Socket, fs.FileMode(httpConfig.SocketFileMode), r.Handler) + if err != nil { + return err + } + } + + return nil +} + +func RunHTTP() error { + httpConfig := config.Config.HTTP + if httpConfig.Host != "" { + log.Printf("Starting HTTP server on %s:%d\n", httpConfig.Host, httpConfig.Port) + err := fasthttp.ListenAndServe(fmt.Sprintf("%s:%d", httpConfig.Host, httpConfig.Port), r.Handler) + if err != nil { + return err + } + } + + return nil +} func index(ctx *fasthttp.RequestCtx) { - if !*enableDebugMode { + if !enableDebugMode { ctx.WriteString("Working") } else { domains := dns.Get() @@ -43,11 +83,6 @@ func index(ctx *fasthttp.RequestCtx) { } } -var ipv4Param = []byte("ipv4") -var ipv6Param = []byte("ipv6") -var userParam = []byte("user") -var passwordParam = []byte("password") - func updateV4(ctx *fasthttp.RequestCtx) { domain := ctx.UserValue("domain").(string) ipv4 := string(ctx.QueryArgs().PeekBytes(ipv4Param)) @@ -128,38 +163,3 @@ func authenticatedRequest(request func(ctx *fasthttp.RequestCtx)) func(ctx *fast request(ctx) } } - -var r *router.Router - -func Init() { - r = router.New() - r.GET("/", index) - r.GET("/update/{domain}/v4", authenticatedRequest(updateV4)) - r.GET("/update/{domain}/v6", authenticatedRequest(updateV6)) -} - -func RunSocket() error { - httpConfig := config.Config.HTTP - if httpConfig.Socket != "" { - log.Printf("Starting HTTP socket in %s with permission %d\n", httpConfig.Socket, httpConfig.SocketFileMode) - err := fasthttp.ListenAndServeUNIX(httpConfig.Socket, fs.FileMode(httpConfig.SocketFileMode), r.Handler) - if err != nil { - return err - } - } - - return nil -} - -func RunHTTP() error { - httpConfig := config.Config.HTTP - if httpConfig.Host != "" { - log.Printf("Starting HTTP server on %s:%d\n", httpConfig.Host, httpConfig.Port) - err := fasthttp.ListenAndServe(fmt.Sprintf("%s:%d", httpConfig.Host, httpConfig.Port), r.Handler) - if err != nil { - return err - } - } - - return nil -} From 077de80f64058aa321ee44819ac15f96d18a70d3 Mon Sep 17 00:00:00 2001 From: ultrasn0w <10564498+ultrasn0w@users.noreply.github.com> Date: Sat, 30 Oct 2021 15:25:43 +0200 Subject: [PATCH 2/2] Restore newlines --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index dbab940..e3e149c 100644 --- a/README.md +++ b/README.md @@ -39,17 +39,17 @@ Domains = ["subdomain.example.com."] # domains the user can register, suffix wi ## Flags ### --enable-debug-mode -Will output all registered records on the index page of the HTTP server. -Type: `bool` +Will output all registered records on the index page of the HTTP server. +Type: `bool` Default: `false` ### --config-file -Will define what config file should be used. -Type: `string` +Will define what config file should be used. +Type: `string` Default: `conf.toml` ### --auth-file -Will define what file should be used to define users that can log in. -Type: `string` +Will define what file should be used to define users that can log in. +Type: `string` Default: `auth.toml`