From c3785f6602cd9e9f107a0292af3aaf7298b02390 Mon Sep 17 00:00:00 2001 From: George Shaw Date: Mon, 12 Feb 2018 13:29:23 -0600 Subject: [PATCH 1/5] fixed part of serving php.. post/get variables currently don't work though --- pkg/public/servehttp.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pkg/public/servehttp.go b/pkg/public/servehttp.go index 5d0067b..739ce1c 100644 --- a/pkg/public/servehttp.go +++ b/pkg/public/servehttp.go @@ -27,16 +27,20 @@ func (con *Controller) ServePHP(res http.ResponseWriter, path string) { line := s.Text() split++ - // Status will be first line + // Status will be first line, if it exists if status == 0 { m := reg.FindStringSubmatch(line) - - var err error - status, err = strconv.Atoi(m[1]) - if err != nil { + if len(m) == 0 { + // Status did not exist, so setting default status status = 200 + } else { + var err error + status, err = strconv.Atoi(m[1]) + if err != nil { + status = 200 + } + continue } - continue } // Blank line between headers and body @@ -47,7 +51,6 @@ func (con *Controller) ServePHP(res http.ResponseWriter, path string) { sep := strings.Index(line, ": ") res.Header().Add(line[:sep], line[sep+2:]) - continue } if err := s.Err(); err != nil { From 6cf4baa2bf8b00679dec564172f6b8190fbd7453 Mon Sep 17 00:00:00 2001 From: George Shaw Date: Mon, 12 Feb 2018 13:30:54 -0600 Subject: [PATCH 2/5] php-cgi into readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9a71df1..d65a0b6 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,7 @@ sudo ./gpanel - ssh-keygen command (already installed on most debian-based linux systems) - openssh-server installed (installation guide below) - golang (installation guide below) + - [php-cgi](http://us3.php.net/downloads.php) IF you want to be able to serve .php files - OSX - Currently there is no support for OSX, but it is planned for the future. ----------------------------------- From 0be665bd8bdd70b43d59cec053cf95324b8c11a1 Mon Sep 17 00:00:00 2001 From: George Shaw Date: Mon, 12 Feb 2018 13:53:42 -0600 Subject: [PATCH 3/5] refactored for autocert, TLS has been implemented --- gpanel.go | 6 +++++- pkg/api/bundle/create.go | 9 ++++++++- pkg/gpaccount/gpaccount.go | 11 ++++++++--- pkg/gpserver/bundles.go | 6 ++++-- pkg/gpserver/gpserver.go | 8 +++++--- pkg/public/public.go | 35 +++++++++++++++++++++++++++++++++-- 6 files changed, 63 insertions(+), 12 deletions(-) diff --git a/gpanel.go b/gpanel.go index b5d293a..8b75fea 100644 --- a/gpanel.go +++ b/gpanel.go @@ -15,7 +15,11 @@ func main() { const insecurePort = 2080 const securePort = 2443 - server := gpserver.New() + server, err := gpserver.New() + if err != nil { + log.Printf("\nA non-fatal error has occurred whilst starting the server: %v\n\n", err.Error()) + } + router := router.New(insecurePort, securePort) if router == nil { diff --git a/pkg/api/bundle/create.go b/pkg/api/bundle/create.go index 68813f9..c85f80f 100644 --- a/pkg/api/bundle/create.go +++ b/pkg/api/bundle/create.go @@ -138,7 +138,14 @@ func Create(res http.ResponseWriter, req *http.Request, logger *log.Logger, bund return false } - bundles[createBundleRequestData.Name] = gpaccount.New(newBundle+"/", createBundleRequestData.Name, databaseBundlePorts.Account, databaseBundlePorts.Public) + bundles[createBundleRequestData.Name], err = gpaccount.New(newBundle+"/", createBundleRequestData.Name, databaseBundlePorts.Account, databaseBundlePorts.Public) + + if err != nil { + logger.Println(req.URL.Path + "::" + err.Error()) + http.Error(res, err.Error(), http.StatusInternalServerError) + return false + } + _ = bundles[createBundleRequestData.Name].Start() _ = bundles[createBundleRequestData.Name].Public.Start() diff --git a/pkg/gpaccount/gpaccount.go b/pkg/gpaccount/gpaccount.go index d6142e8..eb87807 100644 --- a/pkg/gpaccount/gpaccount.go +++ b/pkg/gpaccount/gpaccount.go @@ -26,7 +26,7 @@ type Controller struct { } // New returns a new Controller reference. -func New(dir, name string, accPort, pubPort int) *Controller { +func New(dir, name string, accPort, pubPort int) (*Controller, error) { f, err := os.OpenFile(dir+"logs/account_errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { fmt.Println("error whilst trying to start server logging instance:", err.Error()) @@ -35,12 +35,17 @@ func New(dir, name string, accPort, pubPort int) *Controller { apiLogger := log.New(f, "API :: ", 3) accountLogger := log.New(f, "ACCOUNT :: ", 3) + pub, err := public.New("/home/"+name+"/", dir, name, pubPort) + if err != nil { + return nil, err + } + controller := Controller{ Directory: dir, DocumentRoot: "account/", Name: name, Port: accPort, - Public: public.New("/home/"+name+"/", dir, pubPort), + Public: pub, GracefulShutdownTimeout: 5 * time.Second, Status: 0, AccountLogger: accountLogger, @@ -55,5 +60,5 @@ func New(dir, name string, accPort, pubPort int) *Controller { MaxHeaderBytes: 0, } - return &controller + return &controller, nil } diff --git a/pkg/gpserver/bundles.go b/pkg/gpserver/bundles.go index c1d4a93..26ecc16 100644 --- a/pkg/gpserver/bundles.go +++ b/pkg/gpserver/bundles.go @@ -8,7 +8,8 @@ import ( "github.com/Ennovar/gPanel/pkg/gpaccount" ) -func (con *Controller) detectBundles() { +func (con *Controller) detectBundles() error { + var err error = nil bundles := make(map[string]*gpaccount.Controller) dirs, err := ioutil.ReadDir("bundles/") @@ -21,7 +22,7 @@ func (con *Controller) detectBundles() { dirPath := "bundles/" + dir.Name() + "/" err, accPort, pubPort := bundle.GetPorts(dirPath) - curBundle := gpaccount.New(dirPath, dir.Name(), accPort, pubPort) + curBundle, err := gpaccount.New(dirPath, dir.Name(), accPort, pubPort) err = curBundle.Start() err2 := curBundle.Public.Start() @@ -34,4 +35,5 @@ func (con *Controller) detectBundles() { } con.Bundles = bundles + return err } diff --git a/pkg/gpserver/gpserver.go b/pkg/gpserver/gpserver.go index dc62403..3ea8545 100644 --- a/pkg/gpserver/gpserver.go +++ b/pkg/gpserver/gpserver.go @@ -16,7 +16,9 @@ type Controller struct { APILogger *log.Logger } -func New() *Controller { +func New() (*Controller, error) { + var err error = nil + f, err := os.OpenFile("server/logs/server_errors.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error whilst trying to start server logging instance:%v", err.Error()) @@ -30,8 +32,8 @@ func New() *Controller { APILogger: log.New(f, "API :: ", 3), } - c.detectBundles() + err = c.detectBundles() c.setDefaults() - return &c + return &c, err } diff --git a/pkg/public/public.go b/pkg/public/public.go index c931a55..54fe02a 100644 --- a/pkg/public/public.go +++ b/pkg/public/public.go @@ -2,17 +2,22 @@ package public import ( + "crypto/tls" "log" "net/http" "os" "path/filepath" "strconv" "time" + + "github.com/Ennovar/gPanel/pkg/database" + "golang.org/x/crypto/acme/autocert" ) type Controller struct { Directory string AccountDirectory string + Name string Port int GracefulShutdownTimeout time.Duration Status int @@ -22,7 +27,7 @@ type Controller struct { } // New function returns a new PublicWeb type. -func New(dir, accountDir string, port int) *Controller { +func New(dir, accountDir, name string, port int) (*Controller, error) { ph, lh, err := getLogHandles(dir) if err != nil { log.Fatalf("Error trying to start logging instances within %v: %v", dir, err.Error()) @@ -31,6 +36,7 @@ func New(dir, accountDir string, port int) *Controller { controller := Controller{ Directory: dir, AccountDirectory: accountDir, + Name: name, Port: port, GracefulShutdownTimeout: 5 * time.Second, Status: 0, @@ -38,15 +44,40 @@ func New(dir, accountDir string, port int) *Controller { LoadTimeLogger: lh, } + _ = os.Mkdir("/home/"+controller.Name+"/tls-cache", 0666) + + ds, err := database.Open("server/" + database.DB_DOMAINS) + if err != nil { + return nil, err + } + defer ds.Close() + + domainMap, err := ds.ListDomains(name) + if err != nil { + return nil, err + } + + var domains []string + for k := range domainMap { + domains = append(domains, k) + } + + certManager := &autocert.Manager{ + Cache: autocert.DirCache("/home/" + name + "/tls-cache"), + Prompt: autocert.AcceptTOS, + HostPolicy: autocert.HostWhitelist(domains...), + } + controller.Server = http.Server{ Addr: "localhost:" + strconv.Itoa(controller.Port), Handler: &controller, ReadTimeout: 30 * time.Second, WriteTimeout: 30 * time.Second, MaxHeaderBytes: 0, + TLSConfig: &tls.Config{GetCertificate: certManager.GetCertificate}, } - return &controller + return &controller, nil } // Function getLogHandles returns the handle for the public logger, load logger, From c654beba541ee7043f355897a170a51d0a41d0b1 Mon Sep 17 00:00:00 2001 From: George Shaw Date: Mon, 12 Feb 2018 13:55:18 -0600 Subject: [PATCH 4/5] updating contributing doc features list --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5f29565..83dd51b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -93,8 +93,8 @@ Key: __Implemented__ | __*Implemented, but needs work*__ | *Unimplemented* | ~~R * Domains * __Configuration of domains__ * __Configuration of sub-domains__ - * *TLS/SSL certificate support* - * *Using LetsEncrypt (Certbot)* + * __TLS/SSL certificate support__ + * __Using LetsEncrypt (autocert)__ * __Multi-domain support__ * Remote Access * __SSH Access__ From 3e6ae139b61bbbec5ff5f9ea79b06a99ac5c6901 Mon Sep 17 00:00:00 2001 From: George Shaw Date: Mon, 12 Feb 2018 14:00:02 -0600 Subject: [PATCH 5/5] updated vendor with golang/dep --- Gopkg.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index c5399e7..2709ec5 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -16,7 +16,7 @@ [[projects]] branch = "master" name = "golang.org/x/crypto" - packages = ["bcrypt","blowfish"] + packages = ["acme","acme/autocert","bcrypt","blowfish"] revision = "2509b142fb2b797aa7587dad548f113b2c0f20ce" [[projects]] @@ -28,6 +28,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "e4b8a6fd1b416960accf57e305df9fb6c1c50fb9aecde348a0735eff39614d0d" + inputs-digest = "bc99bfe3269f7f4c24a0166bbfe5fd0cafdee6c803274787bff0ac01b8cb4ed6" solver-name = "gps-cdcl" solver-version = 1