From 40fcebbaae2953ca711e1732521f4876f581e9d0 Mon Sep 17 00:00:00 2001 From: 0xJacky Date: Mon, 13 Jun 2022 00:29:52 +0800 Subject: [PATCH] fix goroutine and memory leak --- server/router/middleware.go | 3 ++- server/router/routers.go | 2 ++ server/tool/cert.go | 37 +++++++++++++++++++------------------ 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/server/router/middleware.go b/server/router/middleware.go index 7c910e79..d2c7e700 100644 --- a/server/router/middleware.go +++ b/server/router/middleware.go @@ -59,7 +59,8 @@ type serverFileSystemType struct { } func (f serverFileSystemType) Exists(prefix string, _path string) bool { - _, err := f.Open(path.Join(prefix, _path)) + file, err := f.Open(path.Join(prefix, _path)) + defer file.Close() return err == nil } diff --git a/server/router/routers.go b/server/router/routers.go index b302ef51..567a7303 100644 --- a/server/router/routers.go +++ b/server/router/routers.go @@ -24,9 +24,11 @@ func InitRouter() *gin.Engine { accept := c.Request.Header.Get("Accept") if strings.Contains(accept, "text/html") { file, _ := mustFS("").Open("index.html") + defer file.Close() stat, _ := file.Stat() c.DataFromReader(http.StatusOK, stat.Size(), "text/html", bufio.NewReader(file), nil) + return } }) diff --git a/server/tool/cert.go b/server/tool/cert.go index e1a55572..76fe57aa 100644 --- a/server/tool/cert.go +++ b/server/tool/cert.go @@ -5,7 +5,6 @@ import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" - "crypto/tls" "crypto/x509" "github.com/0xJacky/Nginx-UI/server/model" "github.com/0xJacky/Nginx-UI/server/settings" @@ -15,9 +14,11 @@ import ( "github.com/go-acme/lego/v4/challenge/http01" "github.com/go-acme/lego/v4/lego" "github.com/go-acme/lego/v4/registration" + "github.com/pkg/errors" "io" "io/ioutil" "log" + "net" "net/http" "os" "path/filepath" @@ -70,15 +71,20 @@ func GetCertInfo(domain string) (key *x509.Certificate, err error) { var response *http.Response - ts := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + client := &http.Client{ + Transport: &http.Transport{ + DialContext: (&net.Dialer{ + Timeout: 5 * time.Second, + }).DialContext, + DisableKeepAlives: true, + }, + Timeout: 5 * time.Second, } - client := &http.Client{Transport: ts} - response, err = client.Get("https://" + domain) if err != nil { + err = errors.Wrap(err, "get cert info error") return } @@ -99,8 +105,7 @@ func IssueCert(domain string) error { // Create a user. New accounts need an email and private key to start. privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) if err != nil { - log.Println(err) - return err + return errors.Wrap(err, "issue cert generate key error") } myUser := MyUser{ @@ -118,8 +123,7 @@ func IssueCert(domain string) error { // A client facilitates communication with the CA server. client, err := lego.NewClient(config) if err != nil { - log.Println(err) - return err + return errors.Wrap(err, "issue cert new client error") } err = client.Challenge.SetHTTP01Provider( @@ -128,15 +132,14 @@ func IssueCert(domain string) error { ), ) if err != nil { - log.Println(err) - return err + return errors.Wrap(err, "issue cert challenge fail") } // New users will need to register reg, err := client.Registration.Register(registration.RegisterOptions{TermsOfServiceAgreed: true}) if err != nil { log.Println(err) - return err + return errors.Wrap(err, "issue cert register fail") } myUser.Registration = reg @@ -146,15 +149,13 @@ func IssueCert(domain string) error { } certificates, err := client.Certificate.Obtain(request) if err != nil { - log.Println(err) - return err + return errors.Wrap(err, "issue cert fail to obtain") } saveDir := nginx.GetNginxConfPath("ssl/" + domain) if _, err := os.Stat(saveDir); os.IsNotExist(err) { err = os.Mkdir(saveDir, 0755) if err != nil { - log.Println("fail to create", saveDir) - return err + return errors.Wrap(err, "issue cert fail to create") } } @@ -164,13 +165,13 @@ func IssueCert(domain string) error { certificates.Certificate, 0644) if err != nil { log.Println(err) - return err + return errors.Wrap(err, "issue cert write fullchain.cer fail") } err = ioutil.WriteFile(filepath.Join(saveDir, domain+".key"), certificates.PrivateKey, 0644) if err != nil { log.Println(err) - return err + return errors.Wrap(err, "issue cert write key fail") } nginx.ReloadNginx()