From 2e480b9ea610c173877dd18d4c99d61a216ac55a Mon Sep 17 00:00:00 2001 From: gentee Date: Mon, 26 Apr 2021 08:29:29 +0500 Subject: [PATCH 1/9] Fixed CheckUpdates bug --- assets.go | 68 ++++++++++++++++++++++++------------------------ notifications.go | 4 +-- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/assets.go b/assets.go index 95157c2..6195979 100644 --- a/assets.go +++ b/assets.go @@ -604,7 +604,7 @@ DB+TtWKf8kQuLFkqC83+vXhmX9gjkneBFU/sgX1FuXtp3xQ/e+reFE+LH73DtPSbPbC/0LLj8rU9gJLn name: "en.yaml", local: "../eonza-assets/languages/en.yaml", size: 8689, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/4xZW4/cuI5+168gGsiZGaC6A+yjX4JOXyY9p2/TVT3BwWIfVDZdpS1ZcnSpy/z6BUn5 Ukn27D6J/ETLskSRH2W99iFVcE2N0mufRclJ6brGGCu45lbpOhnvWGeBgb1OKAhJAg0AKt00dddUcN00 @@ -673,7 +673,7 @@ dMDODYeYPbMT6MysnH0xmgjk5TmBPHukuKw8wspZ93hIf+T7OVgp6eRZkseO7+pPsTgDR9ORf4jR8L9p name: "ru.yaml", local: "../eonza-assets/languages/ru.yaml", size: 13877, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/5x73W4bSXb/fT1FQ4Axu4AsA/9L3Rh/BIskyASZnSRXQS5K3UWyoWZ3uz9Iaa5Eyh57 IK209s5mhJ2RZY9ns1eLpSjRokiReoVTbxScc6r6i5Qnk5uxWHWquup8n9+pkTtRkm07cKEPYKIPYAwj @@ -2293,7 +2293,7 @@ zy5J09x8zk12fhb3kgwvdPb44GYRNdv7lk7EnwAAAP//u4hwZocDAAA= name: "try.yaml", local: "../eonza-assets/scripts/try.yaml", size: 1626, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/5STQWsjNxTH7/MpHhpCErDjboK37Xg3sJSkvfTU0Eu1bOQZeSw6IxlJ481gDLuBQpeW 9thb+xWSFNOQUvcrvPlG5Wlsx9nuHuKDR+896f//6Uly0nulc5dEAFqUMgFv6wjAK1/IBHbjV5SNdyOA @@ -6661,7 +6661,7 @@ oF5CK0TLV9/aaGYa2x+K2NxWbZxBv7da6JA1iriL9jVF74v61yEfVF03gzJN9WHz0NSS5kq4voRnroab name: "editor.tpl", local: "../eonza-assets/themes/default/templates/editor.tpl", size: 25536, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/+w87XLjNpL/9RQwNwqlRJTtySR3R5nKXiV3tXeV2k1VUqm60uomEAnJWFMAF4RkKx69 +xU+SIIgQFPjuWy2KvNjLBGNRncD3egv6q5MGS444KcCJQFHT/z6KeJoX+SQowDgLAlQhjllwXIEwN0x @@ -6756,33 +6756,33 @@ wZwyq5BMzSWlEOv35f4vAAD//6u+VGfAYwAA "/eonza-assets/themes/default/templates/help.tpl": { name: "help.tpl", local: "../eonza-assets/themes/default/templates/help.tpl", - size: 4057, - modtime: 1619273187, - compressed: ` -H4sIAAAAAAAC/7xWX4/bOA5/z6fgqOc6wY3zZ6bXAk7suUNboH29u97LILjKthJrR5a0kpxJdprvvpD8 -N4nTxXYX24eORVI//kiRDFc6VVQaMAdJImTI3sz2gSGFZNgQBDSLUE6YRPEIYLULUsENppwo0ObASIQK -vA+eaWbyEBbzuzdyv8wJ3eYmXMzn3lLiLKN8GxghQ7i/k3uH45AMTjTsgkJkhEXI4KRWderY2xCSJTh9 -8lazSnJhgRNRmlN1fdD1KaM72AU6F8/OSxTNUcO9ZgopZunY8oUAFvO3cj9Zih1RGyaeg0OISyOWLTmH -lzKsdYTkIXiLYuiTwowo04WlyzQlWqM6ve0xo7qgWtOEkS4maOMVVcQOLP4OPNVEKaEa+PowDP7y4tTH -4wByG8JqFySGQyqYUBFKWEmCrSIHBBlWTxCK0jDKSRYhRp/ITbRA8M+U0fSpEkRj93+0gAeYQwiLCeqS -A03WbY0FRmGuN0IVIRecLFG82gU0FRx0gRmLNzgweVkkOiil5WtV8WueaLn0rA+XnsTw+AeJB1eYBw31 -YDFBf5R6Jp75OfmM6mv8LThWBDfVVZjgDnVv3dQGAluQwVaJZ2A4saq2biyEh2LXATXauYdgQwnLOlhS -YMrQQDff/WMu90vU+Pho7WDsCWmo4Jh5k85PhXnlLaSiBVaHLt+a8KwNJvbs8SIdFiW/7/XZHRTGNpun -SymFsi2f35+Yy3iFIVdkY6OgzIjw8XH6Lymnjvl6/fCfMvmJpCb6KPgvGMVOvJrheJWoE6AGpb7+WeuS -rNcIDFZbYiL0/4RhbpkrIqlVeg5FxqNmRMwyumtmUfd5MYgWPzSI4DRJd225HII3KK5J/5caRtbr1Sy/ -O8tp7GHOhcH2FYeS6O2I0lYXwiqxcP+rzhYsiWHlirzh7Z44hFfv3r1bOt/vRSEpIx+wcd6rjug7qJJA -NxEqZTblwtDNwRZ5bgp2Iot7qbu4e9MZwuvXYE8Ma5PmJH0iGYq9UhqRYWOf5jrK5bX25MGKxi8vZxZ2 -dtJLYo+PdAPkZ5h+0URN/y0Y+fwBFuv1lT743ixpm8R5/CJtDOMJgvaRcbBAfd8AnjMtnanXD7RuqcdH -wrP1+kQjzztHGyX4tusgTypbeKVi3kDhV8qq7GfN1QvQ90IelK1rqIuyFazXZz3Xv9hR6br/HjW8GE0J -1+QKMUZTvFWEFISbU3qjc36n0wXFnthsaEox09SVzeV0Oc9RHdUnURCJt4Mj4sJkOGVtRdk3azcsy7la -zuLRaNV+pYJrA58IkxDBi7vfrGsh+K/ssubfOnGGDQ7BCj5ggytZQUwuMh3WNwH603g8acUAdANjk1M9 -tb9XcBPBHL59Aydp7Pvm9h/eU6FPJFMptBl/nWFJZ82tr7fwYjFDaOFvoVGGpx5uwf0+1VL3fZycejA5 -4WNFtBRcE4jiM05NKI3F1GZl6lahyYCpS6f1Va9WEIFRJblu11gN4A9eUsSUil+ojqNB9HphvMaie58I -5sPaJpMQge+fmJwnMsUmzcd1PJdp/O2snOTjMgPHyXJ0Hu7xtv7ozzuqU5zm5Ox5BoprS8zYd7Vlq18b -H/4O45ub+j48gP/gviJL1ocQfB8mf035/E0JYaxdobeDl5d/QnWUMjuvvN/zwpdEK2ott/p16j+FKLkh -WQibkqd2fTgZF9oIRaapKApqxn71c+S2EP8WfM8OIc/vBT1k/smNLvC9UrGLC45sv0rsm04afsflaNTQ -aidey6/Kaku2Gj7zpvTqHgthg5kmjbSu9DNpLfP9RtDNrU5Wj6xOUMos7KWq3rD6FgDVNhPCibC3e/St -264xOAmBl4xVeRgdR91vxq8BAAD//y1LNNvZDwAA + size: 3972, + modtime: 1619407468, + compressed: ` +H4sIAAAAAAAC/7xWXW/bNhe+9684YV9VNt7IH0nXArKlbGgLtLfbupvAWCmJtrhQJEdSjr3U/30g9W07 +HdYNy0UsHh4+5zmf5EqnikoD5iBJhAzZm9k+MKSQDBuCgGYRygmTKB4BrHZBKrjBlBMF2hwYiVCB98Ej +zUwewmJ+80rulzmh29yEi/ncW0qcZZRvAyNkCLc3cu9wHJLBiYZdUIiMsAgZnNRb3XbsbQjJEpw+eKtZ +JTnTwIkozXC7Xuh6ldEd7AKdi0dnJYrmqOFeM4UUs3Rs+UIAi/lruZ8sxY6oDROPwSHEpRHLlpzDSxnW +OkLyELxGMfRJYUaU6dzSZZoSrVEd3naZUV1QrWnCSOcTtP6KymMHFn8FnmqilFANfL24DP705LaPxwvI +rQurXZAYDqlgQkUoYSUJtoocEGRYPUAoSsMoJ1mEGH0gV9ECwfcpo+lDJYjG7n+0gDuYQwiLCeqCA03U +bY0FRmGuN0IVIRecLFG82gU0FRx0gRmLNzgweVkkOiil5Wu34pc80XLpWRsuPInh8TcSD55hHjTUg8UE +/VPqmXjkp+Qzqp/jb8GxIriprsIEN6jLdVMbCGxBBlslHoHhxG61dWMhPBS7DqjRTi0EG0pY1sGSAlOG +LnTzzXdzuV+ixsZ7qwdjT0hDBcfMm3R2KsxnciEVLbA6dPHWhGetM7Fnl2fhsCj5ba/PbqAwttk8XUop +lG35/HagLuMVhlyRjfWCMiPC+/vpD1JOHfP1+u6nMvmNpCZ6L/gfGMVOvJrheJWoAVCDUh//qHVJ1msE +BqstMRH6NWGYW+aKSGo3PYci41EzImYZ3TWzqPs8G0SLbxpEMAzSTVsuh+AVimvSP1PDyHq9muU3JzGN +Pcy5MNhm8VIQvR1R2u6FsEos3C/V2oIlMaxckTe8XYpDePHmzZuls/1WFJIy8g4bZ73qiL6BKgh0E6FS +ZlMuDN0cbJHnpmADWdwL3dnZq04RXr4Eu2JYmzQn6QPJUOyV0ogMG5ua51HOj7UrD1Y0fno60bCzk54T +u7+nGyC/w/STJmr6o2Dk4ztYrNfP9MHXZknbJM7iJ2l9GE8QtEnGwQL1bQN4TrV0ql7f0bql7u8Jz9br +wY48SfpbIQ/KliDU9dMK1uuT9ugf1EYJvrV91zXqLarbx2M0JVyTUjHvQvMwmuKtIqQg3FQNNKvhRqf8 +hoMAxZ7YbGhKMdPUZfh8EHTEBq38QRRE4u3Fbj5TGXBqKbXJt+FtH0OWc/WOikejVfuVCq4NfCBMQgRP +7nzzsgrBf2HfVf61E2fY4BCs4B02uJIVxOQi02F9EqA/OMeTVgxANzA2OdVTe7XAVQRz+PIFnKTR76vb +P7ynQg8kUym0GX+eYUlnzanP1/BkMUNo4a+h2QyHFq7BXSW11H0fJ0MLJid8rIiWgmsCUXzCqXGl0Zja +qEzdq2VyQdWF09qqX0EQgVEleV6v0bqAf/GQIqZU/GzrOLqIXr/tnmPR5SeC+eXdJpIQge8PVE4DmWKT +5uPan/Mw/nVUBvE4j8Bxshydunu8rj/6o4nqFKc5OUnPheLaEjP2XW3Z6tfGh//D+OqqPg934N+5r8iS +9SEE34fJf1M+/1NCGKtX6O3Fw8t/oTpKmZ1W3t/J8DnRilrLrc5O/VOIkhuShbApeWpv+sG40EYoMk1F +UVAz9qubwz0Y/GvwPTuEPL/n9CX1D250ge+Vip0dcGT7VWJzOmn4HZejUUOrnXgtvyqqLdlq+Myb0qt7 +LIQNZpo00rrST6S1zPcbQTe3Olk9sjpBKbOwF6r6MdTXAKgeHiEMhL1nQl+77RqDkxB4yVgVh9Fx1N0Z +fwYAAP//tpOPtYQPAAA= `, }, @@ -6841,7 +6841,7 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", size: 28867, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/9Q9f3fjtpH/61OM2e5KikXJ3jhtTjKdy22673qXJnndTfP6/PwaiAQl2BTAEpBkdVff /R5+kQAJyfJmc23zRywCg8H8wmAwGHKvz775/vW7v/7wB1iKVXHTu7Z/MMpuoAdwvcICQbpEFcciidYi @@ -7057,7 +7057,7 @@ PS1GH/YRneVOoi3sN15EeNzv3ccczIcgWFX7dQ2v0ngtVzbrJe63C2Iw3xzw/wEAAP//JM5oyrgGAAA= name: "pro.tpl", local: "../eonza-assets/themes/default/templates/pro.tpl", size: 33201, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/+w9a2/rtpKfN7+C0V3XNo5l53H6gGJ5W/S226K9t0V7eoFFEGxoiba5kUWVpB17Xf/3 BV96UrKcOGdzTvspsjgcDufFmSGpjFlAccIB3ybIdzja8NHG5WiZRJAjB+DQdxJKnMkZAOO1G5CYQxwj @@ -7151,7 +7151,7 @@ PZBg7VoYnw+urXs6OWmlxy3+LCcsnlLnODPLHTDS29+cZTfu/y8AAP//8ro2qbGBAAA= name: "scheduler.tpl", local: "../eonza-assets/themes/default/templates/scheduler.tpl", size: 17258, - modtime: 1619273187, + modtime: 1619273382, compressed: ` H4sIAAAAAAAC/+w7aY/bRrLf9Stq+J5CKSPqGNsveBpRCRAYSD68tx9i7GIhDNYtsiS13Ty22aI0q+i/ L7qb96XR2ON1jCQfRuyuqq6r6yK9iBxOQwHiMUTbEHgUk6Ml0AsZEWgAdW0jcnbo7hlyY9kDWMSWE/iC diff --git a/notifications.go b/notifications.go index 64cb725..4ab9814 100644 --- a/notifications.go +++ b/notifications.go @@ -317,7 +317,7 @@ func removeNfyHandle(c echo.Context) error { } func GetNewVersion(lang string) (ret string) { - if len(nfyData.Update.Version) > 0 { + if len(nfyData.Update.Version) > 0 && nfyData.Update.Version != Version { var ( lid int pref string @@ -346,7 +346,7 @@ func CheckUpdates() error { if body, err := io.ReadAll(resp.Body); err == nil { var upd VerUpdate if err = json.Unmarshal(body, &upd); err == nil { - if len(upd.Version) > 0 && upd.Version != Version { + if len(upd.Version) > 0 && upd.Version != nfyData.Update.Version { nfyData.Update.Version = upd.Version nfyData.Update.Changelog = upd.Changelog nfyData.Update.Downloads = upd.Downloads From a0d30e29ab2139bb10eaad794a07c7908d100817 Mon Sep 17 00:00:00 2001 From: gentee Date: Wed, 28 Apr 2021 20:18:34 +0500 Subject: [PATCH 2/9] Refactored http.host --- api.go | 96 +---------------- auth.go | 4 +- config.go | 13 +++ console.go | 41 +++----- const.go | 2 +- go.mod | 31 +++--- go.sum | 80 +++++++------- lib/lib.go | 45 ++++++-- localhost.go | 250 ++++++++++++++++++++++++++++++++++++++++++++ main.go | 10 +- make.g | 6 +- notifications.go | 29 ----- run.go | 19 ++-- script/messaging.go | 52 +++------ server.go | 83 ++++++++------- task.go | 31 ++---- taskmanager.go | 25 ++--- tray.go | 2 +- 18 files changed, 464 insertions(+), 355 deletions(-) create mode 100644 localhost.go diff --git a/api.go b/api.go index dd15029..a8888d8 100644 --- a/api.go +++ b/api.go @@ -145,100 +145,10 @@ func runHandle(c echo.Context) error { return c.JSON(http.StatusOK, RunResponse{Success: true, Port: rs.Port, ID: rs.ID}) } -func runScriptHandle(c echo.Context) error { - var ( - postScript es.PostScript - err error - ) - if err = c.Bind(&postScript); err != nil { - return jsonError(c, err) - } - if !strings.HasPrefix(c.Request().Host, Localhost+`:`) && tasks[postScript.TaskID] == nil { - return echo.NewHTTPError(http.StatusForbidden, "Access denied") - } - rs := RunScript{ - Name: postScript.Script, - Open: !postScript.Silent, - Console: false, - Data: postScript.Data, - User: users.User{ - ID: postScript.TaskID, - Nickname: GetTaskName(postScript.TaskID), - RoleID: users.ScriptsID, - }, - Role: users.Role{ - ID: users.ScriptsID, - Name: users.ScriptsRole, - }, - IP: c.RealIP(), - } - if err := systemRun(&rs); err != nil { - return jsonError(c, err) - } - return c.JSON(http.StatusOK, RunResponse{Success: true, Port: rs.Port, ID: rs.ID}) -} - func pingHandle(c echo.Context) error { return c.HTML(http.StatusOK, Success) } -func taskStatusHandle(c echo.Context) error { - var ( - taskStatus TaskStatus - err error - finish string - ) - if !strings.HasPrefix(c.Request().Host, Localhost+`:`) { - return echo.NewHTTPError(http.StatusForbidden, "Access denied") - } - - if err = c.Bind(&taskStatus); err != nil { - return jsonError(c, err) - } - if taskStatus.Time != 0 { - finish = time.Unix(taskStatus.Time, 0).Format(TimeFormat) - } - cmd := WsCmd{ - TaskID: taskStatus.TaskID, - Cmd: WcStatus, - Status: taskStatus.Status, - Message: taskStatus.Message, - Time: finish, - } - if taskStatus.Status == TaskActive { - task := tasks[taskStatus.TaskID] - cmd.Task = &Task{ - ID: task.ID, - Status: task.Status, - Name: task.Name, - StartTime: task.StartTime, - FinishTime: task.FinishTime, - UserID: task.UserID, - RoleID: task.RoleID, - Port: task.Port, - } - } - - for id, client := range clients { - err := client.Conn.WriteJSON(cmd) - if err != nil { - client.Conn.Close() - delete(clients, id) - } - } - if ptask := tasks[taskStatus.TaskID]; ptask != nil { - ptask.Status = taskStatus.Status - if taskStatus.Status >= TaskFinished { - ptask.Message = taskStatus.Message - ptask.FinishTime = taskStatus.Time - if err = SaveTrace(ptask); err != nil { - return jsonError(c, err) - } - } - } - return jsonSuccess(c) -} - func sysTaskHandle(c echo.Context) error { var ( err error @@ -257,12 +167,8 @@ func sysTaskHandle(c echo.Context) error { if user.RoleID != users.XAdminID && user.ID != item.UserID { return jsonError(c, fmt.Errorf(`Access denied`)) } - url := fmt.Sprintf("http://%s:%d/sys?cmd=%s&taskid=%d", Localhost, item.Port, cmd, taskid) go func() { - resp, err := http.Get(url) - if err == nil { - resp.Body.Close() - } + lib.LocalGet(item.LocalPort, fmt.Sprintf("sys?cmd=%s&taskid=%d", cmd, taskid)) }() break } diff --git a/auth.go b/auth.go index 17bdcc1..dac3ffc 100644 --- a/auth.go +++ b/auth.go @@ -208,8 +208,8 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { if !valid { if url == `/` { c.Request().URL.Path = `login` - } else if url != `/api/login` && url != `/api/taskstatus` && url != `/api/sys` && - url != `/api/notification` && url != `/api/runscript` && url != `/api/event` && + } else if url != `/api/login` && /*url != `/api/taskstatus` &&*/ url != `/api/sys` && + /*url != `/api/notification` && url != `/api/runscript` && url != `/api/event` &&*/ url != `/api/randid` { return AccessDenied(http.StatusUnauthorized) } diff --git a/config.go b/config.go index 1373e5a..089b35d 100644 --- a/config.go +++ b/config.go @@ -131,9 +131,22 @@ func LoadConfig() { if cfg.HTTP.Port == 0 { cfg.HTTP.Port = DefPort } + if cfg.HTTP.LocalPort == 0 { + if cfg.HTTP.LocalPort, err = getPort(); err != nil { + golog.Fatal(err) + } + } if len(cfg.HTTP.Theme) == 0 { cfg.HTTP.Theme = DefTheme } + if cfg.HTTP.Host != Localhost { + if len(cfg.HTTP.Cert) == 0 { + golog.Fatal(`Specify the path to the certificate pem file in config file`) + } + if len(cfg.HTTP.Priv) == 0 { + golog.Fatal(`Specify the path to the private key pem file in config file`) + } + } switch cfg.HTTP.Access { case AccessHost: case AccessPrivate: diff --git a/console.go b/console.go index 804c7e6..75e3a82 100644 --- a/console.go +++ b/console.go @@ -6,32 +6,16 @@ package main import ( "encoding/json" + "eonza/lib" "fmt" - "io" - "net/http" "os" "path/filepath" + "strconv" "strings" - - "github.com/gentee/gentee/core" ) -func request(url string) ([]byte, error) { - var ( - res *http.Response - err error - ) - buf := core.NewBuffer() - res, err = http.Get(fmt.Sprintf(`http://%s:%s`, Localhost, url)) - if err == nil { - buf.Data, err = io.ReadAll(res.Body) - res.Body.Close() - } - return buf.Data, err -} - func CheckConsole() bool { - port := fmt.Sprint(DefPort) + port := DefPort appname, err := os.Executable() if err != nil { fmt.Println(err) @@ -46,17 +30,18 @@ func CheckConsole() bool { fmt.Printf("Usage: %s \r\n", appname) return true } - answer, _ := request(fmt.Sprintf("%s/ping", port)) - if string(answer) != Success { - if port = os.Getenv(`EZPORT`); len(port) > 0 { - answer, _ = request(fmt.Sprintf("%s/ping", port)) + if !pingHost(port) { + if ezport := os.Getenv(`EZPORT`); len(ezport) > 0 { + if uport, err := strconv.ParseUint(ezport, 10, 32); err == nil { + port = int(uport) + if !pingHost(port) { + return output("eonza has not been run or listens to custom port") + } + } } } - if string(answer) != Success { - return output("eonza has not been run or listens to custom port") - } - answer, err = request(fmt.Sprintf("%s/api/run?name=%s&silent=true&console=true", - port, os.Args[1])) + answer, err := lib.LocalGet(port, fmt.Sprintf("api/run?name=%s&silent=true&console=true", + os.Args[1])) if err != nil { return output(err) } diff --git a/const.go b/const.go index b5245e3..db8217e 100644 --- a/const.go +++ b/const.go @@ -6,7 +6,7 @@ package main const ( // Version of the application - Version = "1.17.0" + Version = "1.18.0" // DefPort is the default web-server port DefPort = 3234 // DefTheme is the default web-server theme diff --git a/go.mod b/go.mod index b5ae716..931fb8a 100644 --- a/go.mod +++ b/go.mod @@ -3,32 +3,31 @@ module eonza go 1.15 require ( - github.com/alecthomas/chroma v0.8.2 + github.com/alecthomas/chroma v0.9.1 github.com/alecthomas/colour v0.1.0 // indirect - github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2 // indirect - github.com/atotto/clipboard v0.1.2 + github.com/alecthomas/repr v0.0.0-20210301060118-828286944d6a // indirect + github.com/atotto/clipboard v0.1.4 github.com/dgrijalva/jwt-go v3.2.0+incompatible - github.com/dlclark/regexp2 v1.4.0 // indirect github.com/gentee/eonza-pro v0.0.0-00010101000000-000000000000 github.com/gentee/gentee v1.20.0 github.com/gentee/systray v1.3.1 - github.com/go-sql-driver/mysql v1.5.0 + github.com/go-sql-driver/mysql v1.6.0 github.com/gorilla/websocket v1.4.2 - github.com/kataras/golog v0.1.6 + github.com/kataras/golog v0.1.7 github.com/kr/text v0.2.0 // indirect - github.com/labstack/echo/v4 v4.1.17 - github.com/lib/pq v1.9.0 + github.com/labstack/echo/v4 v4.2.2 + github.com/lib/pq v1.10.1 github.com/mattn/go-colorable v0.1.8 // indirect github.com/pquerna/otp v1.3.0 // indirect github.com/robfig/cron/v3 v3.0.1 - github.com/sergi/go-diff v1.1.0 // indirect - github.com/xhit/go-simple-mail/v2 v2.7.0 - github.com/yuin/goldmark v1.3.0 - github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 - golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 - golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect - golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e - golang.org/x/text v0.3.4 + github.com/sergi/go-diff v1.2.0 // indirect + github.com/xhit/go-simple-mail/v2 v2.8.1 + github.com/yuin/goldmark v1.3.5 + github.com/yuin/goldmark-highlighting v0.0.0-20210428103930-3a9678dbb86c + golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b + golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect + golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 + golang.org/x/text v0.3.6 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index c7298ad..a02d772 100644 --- a/go.sum +++ b/go.sum @@ -4,9 +4,8 @@ github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkK github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/chroma v0.7.2-0.20200305040604-4f3623dce67a/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= -github.com/alecthomas/chroma v0.8.2 h1:x3zkuE2lUk/RIekyAJ3XRqSCP4zwWDfcw/YJCuCAACg= -github.com/alecthomas/chroma v0.8.2/go.mod h1:sko8vR34/90zvl5QdcUdvzL3J8NKjAUx9va9jPuFNoM= -github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= +github.com/alecthomas/chroma v0.9.1 h1:cBmvQqRImzR5aWqdMxYZByND4S7BCS/g0svZb28h0Dc= +github.com/alecthomas/chroma v0.9.1/go.mod h1:eMuEnpA18XbG/WhOWtCzJHS7WqEtDAI+HxdwoW0nVSk= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/colour v0.1.0 h1:nOE9rJm6dsZ66RGWYSFrXw461ZIt9A6+nHgL7FRrDUk= github.com/alecthomas/colour v0.1.0/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= @@ -14,27 +13,23 @@ github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYU github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.4/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE= github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= -github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= -github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2 h1:G5TeG64Ox4OWq2YwlsxS7nOedU8vbGgNRTRDAjGvDCk= -github.com/alecthomas/repr v0.0.0-20201120212035-bb82daffcca2/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= -github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY= -github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/alecthomas/repr v0.0.0-20210301060118-828286944d6a h1:GY6ZI5mOHoiQ+g2ETFQGYu6fNgc6bCe4b4kr8tSrhpg= +github.com/alecthomas/repr v0.0.0-20210301060118-828286944d6a/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= -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/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= @@ -42,8 +37,8 @@ github.com/gentee/gentee v1.20.0 h1:t2UMhmKeNPsJSKxFAj3G6MnJ3D4H0Nhao8vRbwoiPZo= github.com/gentee/gentee v1.20.0/go.mod h1:Qyf1jQ8a/yUyPEHrl1RTHKNSTJ923lsPnghIawrdDN4= github.com/gentee/systray v1.3.1 h1:yLHp4v3WYXhdqlfeG32qzNNtqsO5YODwJwTefW4yewk= github.com/gentee/systray v1.3.1/go.mod h1:vj38v/It1PQHccJKl+18Fh0T0Eitrij3ASRSkte6LWQ= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= @@ -54,29 +49,27 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/kataras/golog v0.1.6 h1:jEqEQCm+4B4M4/CgzrEWNj9iUST0hGZXDqAPMVnxWMw= github.com/kataras/golog v0.1.6/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= +github.com/kataras/golog v0.1.7 h1:0TY5tHn5L5DlRIikepcaRR/6oInIr9AiWsxzt0vvlBE= +github.com/kataras/golog v0.1.7/go.mod h1:jOSQ+C5fUqsNSwurB/oAHq1IFSb0KI3l6GMa7xB6dZA= github.com/kataras/pio v0.0.10 h1:b0qtPUqOpM2O+bqa5wr2O6dN4cQNwSmFd6HQqgVae0g= github.com/kataras/pio v0.0.10/go.mod h1:gS3ui9xSD+lAUpbYnjOGiQyY7sUMJO+EHpiRzhtZ5no= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo= -github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= +github.com/labstack/echo/v4 v4.2.2 h1:bq2fdZCionY1jck8rzUpQEu2YSmI8QbX6LHrCa60IVs= +github.com/labstack/echo/v4 v4.2.2/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo= +github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -96,40 +89,37 @@ github.com/pquerna/otp v1.3.0 h1:oJV/SkzR33anKXwQU3Of42rL4wbrffP4uvUf1SvS5Xs= github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/xhit/go-simple-mail/v2 v2.7.0 h1:nOF6n3uVuw80SSVugR9Mm9pju+sKSwhZRoDXCMteb24= -github.com/xhit/go-simple-mail/v2 v2.7.0/go.mod h1:kA1XbQfCI4JxQ9ccSN6VFyIEkkugOm7YiPkA5hKiQn4= -github.com/yuin/goldmark v1.1.22 h1:0e0f6Zee9SAQ5yOZGNMWaOxqVvcc/9/kUWu/Kl91Jk8= +github.com/xhit/go-simple-mail/v2 v2.8.1 h1:40ZWoTbU6eTq170ulrELSlCMCzKuce+JeKLwo6Qzk1E= +github.com/xhit/go-simple-mail/v2 v2.8.1/go.mod h1:kA1XbQfCI4JxQ9ccSN6VFyIEkkugOm7YiPkA5hKiQn4= github.com/yuin/goldmark v1.1.22/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.0 h1:DRvEHivhJ1fQhZbpmttnonfC674RycyZGE/5IJzDKgg= -github.com/yuin/goldmark v1.3.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691 h1:VWSxtAiQNh3zgHJpdpkpVYjTPqRE3P6UZCOPa1nRDio= -github.com/yuin/goldmark-highlighting v0.0.0-20200307114337-60d527fdb691/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo= +github.com/yuin/goldmark v1.3.5 h1:dPmz1Snjq0kmkz159iL7S6WzdahUTHnHB5M56WFVifs= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark-highlighting v0.0.0-20210428103930-3a9678dbb86c h1:jWgTIWI8agIoW5c8gWBO/dZ68/tKYdKp9pxqSUKVW5Y= +github.com/yuin/goldmark-highlighting v0.0.0-20210428103930-3a9678dbb86c/go.mod h1:YLF3kDffRfUH/bTxOxHhV6lxwIB3Vfj91rEwNMS9MXo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 h1:3wPMTskHO3+O6jqTEXyFcsnuxMQOqYSaHsDxcbUXpqA= -golang.org/x/crypto v0.0.0-20201217014255-9d1352758620/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201216054612-986b41b23924 h1:QsnDpLLOKwHBBDa8nDws4DYNc/ryVW2vCpxCs09d4PY= -golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -139,22 +129,22 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6 h1:DvY3Zkh7KabQE/kfzMvYvKirSiguP9Q/veMtkYyf0o8= golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887 h1:dXfMednGJh/SUUFjTLsWJz3P+TQt9qnR11GgeI3vWKs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= diff --git a/lib/lib.go b/lib/lib.go index 5aa3499..0665536 100644 --- a/lib/lib.go +++ b/lib/lib.go @@ -6,10 +6,13 @@ package lib import ( "archive/zip" + "bytes" + "encoding/json" "fmt" "io" "math/rand" "net" + "net/http" "os" "os/exec" "path/filepath" @@ -23,12 +26,15 @@ import ( // HTTPConfig stores web-server settings type HTTPConfig struct { - Host string `yaml:"host"` // if empty, then localhost - Port int `yaml:"port"` // if empty, then DefPort - Open bool `yaml:"open"` // if true then host is opened - Theme string `yaml:"theme"` // theme of web interface. if it is empty - DefTheme - Access string `yaml:"access"` // Access level - localhost, private - DefAccess == localhost - JWTKey string `yaml:"jwtkey"` // Secret key for JWT token + Host string `yaml:"host"` // if empty, then localhost + Port int `yaml:"port"` // if empty, then DefPort + LocalPort int `yaml:"localport"` // if empty, then define automatically + Open bool `yaml:"open"` // if true then host is opened + Theme string `yaml:"theme"` // theme of web interface. if it is empty - DefTheme + Access string `yaml:"access"` // Access level - localhost, private - DefAccess == localhost + JWTKey string `yaml:"jwtkey"` // Secret key for JWT token + Cert string `yaml:"cert"` // cert pem file + Priv string `yaml:"priv"` // private key pem file } // PlaygroundConfig stores the config of playgroundmode @@ -227,3 +233,30 @@ func IsPrivate(host, ipaddr string) bool { } return isPrivate() } + +func LocalGet(port int, url string) (body []byte, err error) { + var ( + res *http.Response + ) + res, err = http.Get(fmt.Sprintf(`http://localhost:%d/%s`, port, url)) + if err == nil { + body, err = io.ReadAll(res.Body) + res.Body.Close() + } + return +} + +func LocalPost(port int, url string, data interface{}) (body []byte, err error) { + var resp *http.Response + + jsonValue, err := json.Marshal(data) + if err == nil { + resp, err = http.Post(fmt.Sprintf("http://localhost:%d/%s", port, url), + "application/json", bytes.NewBuffer(jsonValue)) + if err == nil { + body, err = io.ReadAll(resp.Body) + resp.Body.Close() + } + } + return +} diff --git a/localhost.go b/localhost.go new file mode 100644 index 0000000..1b03fb2 --- /dev/null +++ b/localhost.go @@ -0,0 +1,250 @@ +// Copyright 2021 Alexey Krivonogov. All rights reserved. +// Use of this source code is governed by a MIT license +// that can be found in the LICENSE file. + +package main + +import ( + "eonza/lib" + "eonza/users" + "fmt" + "io" + "net/http" + "strings" + "time" + + es "eonza/script" + + "github.com/kataras/golog" + "github.com/labstack/echo/v4" + md "github.com/labstack/echo/v4/middleware" +) + +func LocalAuthHandle(next echo.HandlerFunc) echo.HandlerFunc { + return func(c echo.Context) (err error) { + var ( + ok bool + userID uint32 + user users.User + ) + ip := c.RealIP() + host := c.Request().Host + if offPort := strings.LastIndex(c.Request().Host, `:`); offPort > 0 { + host = host[:offPort] + } + if !lib.IsLocalhost(host, ip) { + return AccessDenied(http.StatusForbidden) + } + lang := LangDefCode + if IsScript { + user = scriptTask.Header.User + lang = scriptTask.Header.Lang + } else { + userID = uint32(users.XRootID) + if user, ok = GetUser(userID); !ok { + return AccessDenied(http.StatusUnauthorized) + } + if u, ok := userSettings[user.ID]; ok { + lang = u.Lang + } + } + auth := &Auth{ + Context: c, + User: &user, + Lang: lang, + } + err = next(auth) + return + } +} + +func taskStatusHandle(c echo.Context) error { + var ( + taskStatus TaskStatus + err error + finish string + ) + if err = c.Bind(&taskStatus); err != nil { + return jsonError(c, err) + } + if taskStatus.Time != 0 { + finish = time.Unix(taskStatus.Time, 0).Format(TimeFormat) + } + cmd := WsCmd{ + TaskID: taskStatus.TaskID, + Cmd: WcStatus, + Status: taskStatus.Status, + Message: taskStatus.Message, + Time: finish, + } + if taskStatus.Status == TaskActive { + task := tasks[taskStatus.TaskID] + cmd.Task = &Task{ + ID: task.ID, + Status: task.Status, + Name: task.Name, + StartTime: task.StartTime, + FinishTime: task.FinishTime, + UserID: task.UserID, + RoleID: task.RoleID, + Port: task.Port, + } + } + + for id, client := range clients { + err := client.Conn.WriteJSON(cmd) + if err != nil { + client.Conn.Close() + delete(clients, id) + } + } + if ptask := tasks[taskStatus.TaskID]; ptask != nil { + ptask.Status = taskStatus.Status + if taskStatus.Status >= TaskFinished { + ptask.Message = taskStatus.Message + ptask.FinishTime = taskStatus.Time + if err = SaveTrace(ptask); err != nil { + return jsonError(c, err) + } + } + } + return jsonSuccess(c) +} + +func notificationHandle(c echo.Context) error { + var ( + postNfy es.PostNfy + err error + ) + if err = c.Bind(&postNfy); err != nil { + return jsonError(c, err) + } + nfy := Notification{ + Text: postNfy.Text, + UserID: users.XRootID, + RoleID: users.XAdminID, + Script: postNfy.Script, + } + if ptask, ok := tasks[postNfy.TaskID]; ok { + nfy.UserID = ptask.UserID + nfy.RoleID = ptask.RoleID + } + if err = NewNotification(&nfy); err != nil { + return jsonError(c, err) + } + return jsonSuccess(c) +} + +func runScriptHandle(c echo.Context) error { + var ( + postScript es.PostScript + err error + ) + if err = c.Bind(&postScript); err != nil { + return jsonError(c, err) + } + if tasks[postScript.TaskID] == nil { + return echo.NewHTTPError(http.StatusForbidden, "Access denied") + } + rs := RunScript{ + Name: postScript.Script, + Open: !postScript.Silent, + Console: false, + Data: postScript.Data, + User: users.User{ + ID: postScript.TaskID, + Nickname: GetTaskName(postScript.TaskID), + RoleID: users.ScriptsID, + }, + Role: users.Role{ + ID: users.ScriptsID, + Name: users.ScriptsRole, + }, + IP: c.RealIP(), + } + if err := systemRun(&rs); err != nil { + return jsonError(c, err) + } + return c.JSON(http.StatusOK, RunResponse{Success: true, Port: rs.Port, ID: rs.ID}) +} + +func RunLocalServer(port int) *echo.Echo { + e := echo.New() + + e.HideBanner = true + e.Use(LocalAuthHandle) + e.Use(Logger) + e.Use(md.Recover()) + + e.GET("/ping", pingHandle) + if IsScript { + e.GET("/info", infoHandle) + e.GET("/sys", sysHandle) + } else { + e.GET("/api/run", runHandle) + e.GET("/api/randid", randidHandle) + e.POST("/api/event", eventHandle) + e.POST("/api/notification", notificationHandle) + e.POST("/api/taskstatus", taskStatusHandle) + e.POST("/api/runscript", runScriptHandle) + } + /* e.GET("/", indexHandle) + + e.GET("/js/*", fileHandle) + e.GET("/css/*", fileHandle) + e.GET("/images/*", fileHandle) + e.GET("/webfonts/*", fileHandle) + e.GET("/favicon.ico", fileHandle) + e.POST("/tools/md", markdownHandle) + if IsScript { + e.GET("/ws", wsTaskHandle) // + + e.GET("/info", infoHandle) // + + e.POST("/stdin", stdinHandle) // + + e.POST("/form", formHandle) // + + } else { + e.GET("/ws", wsMainHandle) + e.GET("/task/:id", showTaskHandle) // + + e.GET("/api/compile", compileHandle) // + + e.GET("/api/exit", exitHandle) // + + e.GET("/api/export", exportHandle) // + + e.GET("/api/reload", reloadHandle) // + + e.GET("/api/logout", logoutHandle) + e.GET("/api/script", getScriptHandle) // + + e.GET("/api/list", listScriptHandle) // + + e.GET("/api/listrun", listRunHandle) // + + e.GET("/api/notifications", nfyHandle) // + + e.GET("/api/tasks", tasksHandle) // + + e.GET("/api/timers", timersHandle) // + + e.GET("/api/events", eventsHandle) // + + e.GET("/api/prosettings", proSettingsHandle) // + + e.GET("/api/remove/:id", removeTaskHandle) // + + e.GET("/api/removenfy/:id", removeNfyHandle) // + + e.GET("/api/removetimer/:id", removeTimerHandle) // + + e.GET("/api/removeevent/:id", removeEventHandle) // + + e.GET("/api/sys", sysTaskHandle) // + e.GET("/api/settings", settingsHandle) // + + e.GET("/api/latest", latestVerHandle) // + e.GET("/api/trial/:id", trialHandle) // + + e.POST("/api/install", installHandle) // + + e.POST("/api/login", loginHandle) + e.POST("/api/script", saveScriptHandle) // + + e.POST("/api/delete", deleteScriptHandle) // + + e.POST("/api/import", importHandle) // + + e.POST("/api/settings", saveSettingsHandle) // + + e.POST("/api/setpsw", setPasswordHandle) // + e.POST("/api/timer", saveTimerHandle) // + + e.POST("/api/saveevent", saveEventHandle) // + + e.POST("/api/favs", saveFavsHandle) + e.POST("/api/feedback", feedbackHandle) // + + ProApi(e) + }*/ + go func() { + if IsScript { + e.Logger.SetOutput(io.Discard) + } + if err := e.Start(fmt.Sprintf(":%d", port)); err != nil && !isShutdown { + golog.Fatal(err) + } + }() + return e +} diff --git a/main.go b/main.go index 6d0aa74..b1b95a4 100644 --- a/main.go +++ b/main.go @@ -65,10 +65,7 @@ func main() { if err = LoadCustomAsset(scriptTask.Header.AssetsDir, scriptTask.Header.HTTP.Theme); err != nil { golog.Fatal(err) } - e = RunServer(WebSettings{ - Port: scriptTask.Header.HTTP.Port, - Open: scriptTask.Header.HTTP.Open, - }) + e = RunServer(*scriptTask.Header.HTTP) go func() { start := time.Now() settings := initTask() @@ -108,10 +105,7 @@ func main() { InitScripts() CreateSysTray() RunCron() - e = RunServer(WebSettings{ - Port: cfg.HTTP.Port, - Open: cfg.HTTP.Open, - }) + e = RunServer(cfg.HTTP) } signal.Notify(stopchan, os.Kill, os.Interrupt, syscall.SIGTERM) <-stopchan diff --git a/make.g b/make.g index 2d5f4d5..d5cc02f 100755 --- a/make.g +++ b/make.g @@ -10,9 +10,9 @@ run { $ /home/ak/go/bin/esc -ignore "\.git|LICENSE|README.md" -o assets.go ../eonza-assets // $ go install -ldflags "-s -w" -tags "eonza standard" -// $ go install -tags "pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" -// $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza.com/eonza -// return + $ go install -tags "pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza.com/eonza + return $ go install -tags "tray pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" // $ go install -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" diff --git a/notifications.go b/notifications.go index 4ab9814..8cbd5af 100644 --- a/notifications.go +++ b/notifications.go @@ -20,8 +20,6 @@ import ( "sync" "time" - es "eonza/script" - "github.com/kataras/golog" "github.com/labstack/echo/v4" ) @@ -242,33 +240,6 @@ func nfyHandle(c echo.Context) error { return c.JSON(http.StatusOK, resp) } -func notificationHandle(c echo.Context) error { - var ( - postNfy es.PostNfy - err error - ) - if !strings.HasPrefix(c.Request().Host, Localhost+`:`) { - return echo.NewHTTPError(http.StatusForbidden, "Access denied") - } - if err = c.Bind(&postNfy); err != nil { - return jsonError(c, err) - } - nfy := Notification{ - Text: postNfy.Text, - UserID: users.XRootID, - RoleID: users.XAdminID, - Script: postNfy.Script, - } - if ptask, ok := tasks[postNfy.TaskID]; ok { - nfy.UserID = ptask.UserID - nfy.RoleID = ptask.RoleID - } - if err = NewNotification(&nfy); err != nil { - return jsonError(c, err) - } - return jsonSuccess(c) -} - func removeNfyHandle(c echo.Context) error { id, _ := strconv.ParseUint(c.Param("id"), 10, 64) isAccess := func(item *Notification) bool { diff --git a/run.go b/run.go index 2ee8f7c..d03703c 100644 --- a/run.go +++ b/run.go @@ -39,6 +39,10 @@ func systemRun(rs *RunScript) error { if err != nil { return err } + localPort, err := getPort() + if err != nil { + return err + } if rs.Role.ID >= users.ResRoleID { utemp, _ := GetUser(users.XRootID) langCode = GetLangCode(&utemp) @@ -82,13 +86,16 @@ func systemRun(rs *RunScript) error { SecureConsts: SecureConstants(), Lang: langCode, TaskID: lib.RndNum(), - ServerPort: cfg.HTTP.Port, + ServerPort: cfg.HTTP.LocalPort, HTTP: &lib.HTTPConfig{ - Host: cfg.HTTP.Host, - Port: port, - Open: rs.Open, - Theme: cfg.HTTP.Theme, - Access: cfg.HTTP.Access, + Host: cfg.HTTP.Host, + Port: port, + LocalPort: localPort, + Open: rs.Open, + Theme: cfg.HTTP.Theme, + Access: cfg.HTTP.Access, + Cert: cfg.HTTP.Cert, + Priv: cfg.HTTP.Priv, }, } if header.IsPlayground { diff --git a/script/messaging.go b/script/messaging.go index e454e7f..8aa4734 100644 --- a/script/messaging.go +++ b/script/messaging.go @@ -5,11 +5,9 @@ package script import ( - "bytes" "encoding/json" + "eonza/lib" "fmt" - "io" - "net/http" "strconv" "strings" "time" @@ -99,53 +97,33 @@ func SendEmail(smtpserv *core.Obj, emailobj *core.Obj) error { return err } -func SendNotification(msg string) error { - jsonValue, err := json.Marshal(PostNfy{ +func SendNotification(msg string) (err error) { + if _, err = lib.LocalPost(scriptTask.Header.ServerPort, `api/notification`, PostNfy{ TaskID: scriptTask.Header.TaskID, Text: msg, Script: scriptTask.Header.Name, - }) - if err == nil { - resp, err := http.Post(fmt.Sprintf("http://localhost:%d/api/notification", - scriptTask.Header.ServerPort), "application/json", bytes.NewBuffer(jsonValue)) - if err != nil { - golog.Error(err) - } else { - resp.Body.Close() - } - } else { - return err + }); err != nil { + golog.Error(err) } - return nil + return } -func RunScript(script, data string, silent int64) error { - jsonValue, err := json.Marshal(PostScript{ +func RunScript(script, data string, silent int64) (err error) { + var body []byte + if body, err = lib.LocalPost(scriptTask.Header.ServerPort, `api/runscript`, PostScript{ TaskID: scriptTask.Header.TaskID, Script: script, Data: data, UserID: scriptTask.Header.User.ID, RoleID: scriptTask.Header.Role.ID, Silent: silent != 0, - }) - var ( - resp *http.Response - body []byte - ) - if err == nil { - resp, err = http.Post(fmt.Sprintf("http://localhost:%d/api/runscript", - scriptTask.Header.ServerPort), "application/json", bytes.NewBuffer(jsonValue)) - if err == nil { - if body, err = io.ReadAll(resp.Body); err == nil { - var answer Response - if err = json.Unmarshal(body, &answer); err == nil { - if !answer.Success && len(answer.Error) > 0 { - err = fmt.Errorf(answer.Error) - } - } + }); err == nil { + var answer Response + if err = json.Unmarshal(body, &answer); err == nil { + if !answer.Success && len(answer.Error) > 0 { + err = fmt.Errorf(answer.Error) } - resp.Body.Close() } } - return err + return } diff --git a/server.go b/server.go index e2db8b8..9839af9 100644 --- a/server.go +++ b/server.go @@ -11,6 +11,7 @@ import ( "io" "net/http" "os" + "strings" "time" "eonza/lib" @@ -26,12 +27,6 @@ const ( XRealIP = "X-Real-IP" ) -// WebSettings contains web-server parameters -type WebSettings struct { - Port int - Open bool // if true then webpage is opened -} - type Response struct { Success bool `json:"success"` // Message string `json:"message,omitempty"` @@ -247,7 +242,11 @@ func markdownHandle(c echo.Context) error { return c.JSON(http.StatusOK, DataResponse{Data: ret}) } -func RunServer(options WebSettings) *echo.Echo { +func allowOrigin(origin string) (bool, error) { + return strings.HasPrefix(origin, `https://`+cfg.HTTP.Host), nil +} + +func RunServer(options lib.HTTPConfig) *echo.Echo { InitLang() InitTemplates() e := echo.New() @@ -256,11 +255,12 @@ func RunServer(options WebSettings) *echo.Echo { e.Use(AuthHandle) e.Use(Logger) e.Use(md.Recover()) - /* e.Use(md.CORSWithConfig(md.CORSConfig{ - AllowOrigins: []string{"*"}, - AllowMethods: []string{http.MethodGet}, - }))}*/ - + if !IsScript && options.Host != Localhost { + e.Use(md.CORSWithConfig(md.CORSConfig{ + AllowOriginFunc: allowOrigin, + AllowMethods: []string{http.MethodGet}, + })) + } //e.HTTPErrorHandler = customHTTPErrorHandler e.GET("/", indexHandle) @@ -273,9 +273,9 @@ func RunServer(options WebSettings) *echo.Echo { e.GET("/favicon.ico", fileHandle) e.POST("/tools/md", markdownHandle) if IsScript { - e.GET("/ws", wsTaskHandle) // + - e.GET("/sys", sysHandle) // - e.GET("/info", infoHandle) // + + e.GET("/ws", wsTaskHandle) // + + e.GET("/sys", sysHandle) // + // e.GET("/info", infoHandle) // + e.POST("/stdin", stdinHandle) // + e.POST("/form", formHandle) // + } else { @@ -306,33 +306,43 @@ func RunServer(options WebSettings) *echo.Echo { e.GET("/api/trial/:id", trialHandle) // + e.POST("/api/install", installHandle) // + e.POST("/api/login", loginHandle) - e.POST("/api/script", saveScriptHandle) // + - e.POST("/api/delete", deleteScriptHandle) // + - e.POST("/api/taskstatus", taskStatusHandle) // - e.POST("/api/import", importHandle) // + - e.POST("/api/notification", notificationHandle) // - e.POST("/api/runscript", runScriptHandle) // - e.POST("/api/settings", saveSettingsHandle) // + - e.POST("/api/setpsw", setPasswordHandle) // - e.POST("/api/timer", saveTimerHandle) // + - e.POST("/api/saveevent", saveEventHandle) // + - e.POST("/api/event", eventHandle) // + + e.POST("/api/script", saveScriptHandle) // + + e.POST("/api/delete", deleteScriptHandle) // + + // e.POST("/api/taskstatus", taskStatusHandle) // + e.POST("/api/import", importHandle) // + + // e.POST("/api/notification", notificationHandle) // + //e.POST("/api/runscript", runScriptHandle) // + e.POST("/api/settings", saveSettingsHandle) // + + e.POST("/api/setpsw", setPasswordHandle) // + e.POST("/api/timer", saveTimerHandle) // + + e.POST("/api/saveevent", saveEventHandle) // + + e.POST("/api/event", eventHandle) // + e.POST("/api/favs", saveFavsHandle) e.POST("/api/feedback", feedbackHandle) // + ProApi(e) } + RunLocalServer(options.LocalPort) go func() { if IsScript { e.Logger.SetOutput(io.Discard) } - if err := e.Start(fmt.Sprintf(":%d", options.Port)); err != nil && !isShutdown { - if IsScript { - setStatus(TaskFailed, err) + if options.Host == Localhost { + if err := e.Start(fmt.Sprintf(":%d", options.Port)); err != nil && !isShutdown { + if IsScript { + setStatus(TaskFailed, err) + } + if cfg.HTTP.Access != AccessHost && pingHost(options.Port) { + lib.Open(fmt.Sprintf("http://%s:%d", Localhost, options.Port)) + } + golog.Fatal(err) } - if cfg.HTTP.Access != AccessHost && pingHost(options.Port) { - lib.Open(fmt.Sprintf("http://%s:%d", Localhost, options.Port)) + } else { + if err := e.StartTLS(fmt.Sprintf(":%d", options.Port), options.Cert, options.Priv); err != nil && !isShutdown { + if IsScript { + setStatus(TaskFailed, err) + } + golog.Fatal(err) } - golog.Fatal(err) } }() if options.Open { @@ -347,13 +357,6 @@ func RunServer(options WebSettings) *echo.Echo { } func pingHost(port int) bool { - var ( - body []byte - ) - resp, err := http.Get(fmt.Sprintf("http://%s:%d/ping", Localhost, port)) - if err == nil { - body, _ = io.ReadAll(resp.Body) - resp.Body.Close() - } + body, _ := lib.LocalGet(port, `ping`) return string(body) == Success } diff --git a/task.go b/task.go index 1b6a683..f273770 100644 --- a/task.go +++ b/task.go @@ -5,7 +5,6 @@ package main import ( - "bytes" "encoding/json" "eonza/lib" "eonza/script" @@ -193,6 +192,7 @@ func initTask() script.Settings { Name: scriptTask.Header.Name, StartTime: time.Now().Unix(), Port: scriptTask.Header.HTTP.Port, + LocalPort: scriptTask.Header.HTTP.LocalPort, } createFile := func(ext string) *os.File { @@ -375,6 +375,7 @@ func initTask() script.Settings { (*glob)[`os`] = runtime.GOOS (*glob)[`isconsole`] = fmt.Sprint(scriptTask.Header.Console) (*glob)[`port`] = fmt.Sprint(scriptTask.Header.HTTP.Port) + (*glob)[`localport`] = fmt.Sprint(scriptTask.Header.HTTP.LocalPort) (*glob)[`n`] = "\n" (*glob)[`r`] = "\r" (*glob)[`t`] = "\t" @@ -434,20 +435,14 @@ func infoHandle(c echo.Context) error { func sendCmdStatus(status int, timeStamp int64, message string) { taskTrace(timeStamp, status, message) - jsonValue, err := json.Marshal(TaskStatus{ - TaskID: task.ID, - Status: status, - Message: message, - Time: timeStamp, - }) - if err == nil { - resp, err := http.Post(fmt.Sprintf("http://%s:%d/api/taskstatus", Localhost, - scriptTask.Header.ServerPort), "application/json", bytes.NewBuffer(jsonValue)) - if err != nil { - golog.Error(err) - } else { - resp.Body.Close() - } + if _, err := lib.LocalPost(scriptTask.Header.ServerPort, `api/taskstatus`, + TaskStatus{ + TaskID: task.ID, + Status: status, + Message: message, + Time: timeStamp, + }); err != nil { + golog.Error(err) } var finish string task.Status = status @@ -472,12 +467,6 @@ func sysHandle(c echo.Context) error { if uint32(id) != task.ID { return jsonError(c, fmt.Errorf(`wrong task id`)) } - if !strings.HasPrefix(c.Request().Host, Localhost+`:`) { - return echo.NewHTTPError(http.StatusForbidden, "Access denied") - } - /* if err := taskAccess(c); err != nil { - return jsonError(c, err) - }*/ if cmd == gentee.SysTerminate { go func() { setStatus(TaskTerminated) diff --git a/taskmanager.go b/taskmanager.go index d4f3f30..6c8497a 100644 --- a/taskmanager.go +++ b/taskmanager.go @@ -12,7 +12,6 @@ import ( "eonza/script" "eonza/users" "fmt" - "io" "net" "net/http" "os" @@ -47,6 +46,7 @@ type Task struct { UserID uint32 `json:"userid"` RoleID uint32 `json:"roleid"` Port int `json:"port"` + LocalPort int `json:"localport"` Message string `json:"message,omitempty"` SourceCode string `json:"sourcecode,omitempty"` } @@ -73,6 +73,7 @@ func taskTrace(unixTime int64, status int, message string) { func SaveTrace(task *Task) (err error) { if task.Status >= TaskFinished { freePort(task.Port) + freePort(task.LocalPort) } _, err = traceFile.Write([]byte(fmt.Sprintf("%s\r\n", task.String()))) if len(tasks) > int(TasksLimit*1.2) { @@ -155,6 +156,7 @@ func NewTask(header script.Header) (err error) { UserID: header.User.ID, RoleID: header.User.RoleID, Port: header.HTTP.Port, + LocalPort: header.HTTP.LocalPort, } if err = SaveTrace(&task); err != nil { return @@ -241,17 +243,13 @@ func InitTaskManager() (err error) { } for key, item := range tasks { if item.Status < TaskFinished { - url := fmt.Sprintf("http://%s:%d", Localhost, item.Port) - resp, err := http.Get(url + `/info`) active := false + body, err := lib.LocalGet(item.LocalPort, `info`) if err == nil { - if body, err := io.ReadAll(resp.Body); err == nil { - var task Task - if err = json.Unmarshal(body, &task); err == nil && task.ID == item.ID { - active = true - tasks[key].Status = task.Status - } - resp.Body.Close() + var task Task + if err = json.Unmarshal(body, &task); err == nil && task.ID == item.ID { + active = true + tasks[key].Status = task.Status } } if !active { @@ -268,13 +266,6 @@ func CloseTaskManager() { traceFile.Close() } -func usePort(port int) { - i := port - cfg.HTTP.Port - 1 - if i < PortsPool { - ports[i] = true - } -} - func freePort(port int) { i := port - cfg.HTTP.Port - 1 if i < PortsPool { diff --git a/tray.go b/tray.go index 943ec2a..9615c43 100644 --- a/tray.go +++ b/tray.go @@ -86,7 +86,7 @@ func TrayReady() { case menuItem = <-chanFav: _, name := menuItem.Name() if len(name) > 0 { - _, err := request(fmt.Sprintf("%d/api/run?name=%s", cfg.HTTP.Port, name)) + _, err := lib.LocalGet(cfg.HTTP.Port, fmt.Sprintf("api/run?name=%s", name)) if err != nil { golog.Error(err) } From e4a90483f2737f5f30266401622778f02ad5149d Mon Sep 17 00:00:00 2001 From: gentee Date: Wed, 28 Apr 2021 20:43:59 +0500 Subject: [PATCH 3/9] Removed CDN from config --- config.go | 3 +-- run.go | 6 +++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config.go b/config.go index 089b35d..93cbe23 100644 --- a/config.go +++ b/config.go @@ -44,8 +44,7 @@ type Config struct { Playground lib.PlaygroundConfig `yaml:"playground"` // Playground settings Whitelist []string `yaml:"whitelist,omitempty"` // Whitelist of IP-addresses // undocumented fields - PortShift int64 `yaml:"portshift,omitempty"` // shift of the port - CDN string `yaml:"cdn,omitempty"` // url for static files in task + PortShift int64 `yaml:"portshift,omitempty"` // shift of the port path string // path to cfg file develop bool diff --git a/run.go b/run.go index d03703c..9b6509d 100644 --- a/run.go +++ b/run.go @@ -68,12 +68,16 @@ func systemRun(rs *RunScript) error { title = val } } + var cdn string + if cfg.HTTP.Host != Localhost { + cdn = fmt.Sprintf(`https://%s:%d`, cfg.HTTP.Host, cfg.HTTP.Port) + } header := script.Header{ Name: rs.Name, Title: title, AssetsDir: cfg.AssetsDir, LogDir: cfg.Log.Dir, - CDN: cfg.CDN, + CDN: cdn, Data: rs.Data, Console: rs.Console, IsPlayground: cfg.playground, From 3084b80c125291f700389d8f95fd5a11dbbe81dd Mon Sep 17 00:00:00 2001 From: gentee Date: Wed, 28 Apr 2021 20:46:46 +0500 Subject: [PATCH 4/9] Removed PortShift --- config.go | 2 -- render.go | 2 -- 2 files changed, 4 deletions(-) diff --git a/config.go b/config.go index 93cbe23..314d3f6 100644 --- a/config.go +++ b/config.go @@ -43,8 +43,6 @@ type Config struct { HTTP lib.HTTPConfig `yaml:"http"` // Web-server settings Playground lib.PlaygroundConfig `yaml:"playground"` // Playground settings Whitelist []string `yaml:"whitelist,omitempty"` // Whitelist of IP-addresses - // undocumented fields - PortShift int64 `yaml:"portshift,omitempty"` // shift of the port path string // path to cfg file develop bool diff --git a/render.go b/render.go index c5c5923..35b2916 100644 --- a/render.go +++ b/render.go @@ -32,7 +32,6 @@ type Render struct { Lang string Login bool Localhost bool - PortShift int64 Favs []Fav Nfy *NfyResponse // Update VerUpdate @@ -188,7 +187,6 @@ func RenderPage(c echo.Context, url string) (string, error) { render.Login = len(storage.Settings.PasswordHash) > 0 render.Localhost = cfg.HTTP.Host == Localhost - render.PortShift = cfg.PortShift render.Favs = userSettings[user.ID].Favs render.Nfy = NfyList(false, user.ID, user.RoleID) // render.Update = nfyData.Update From 525f3e9eaf683550966a589829b0741d103a0939 Mon Sep 17 00:00:00 2001 From: gentee Date: Wed, 28 Apr 2021 21:07:48 +0500 Subject: [PATCH 5/9] Removed access from config --- api.go | 3 - assets.go | 284 ++++++++++++++++++++++++++--------------------------- auth.go | 16 +-- config.go | 13 --- lib/lib.go | 1 - run.go | 1 - server.go | 2 +- 7 files changed, 146 insertions(+), 174 deletions(-) diff --git a/api.go b/api.go index a8888d8..64655f3 100644 --- a/api.go +++ b/api.go @@ -158,9 +158,6 @@ func sysTaskHandle(c echo.Context) error { if taskid, err = strconv.ParseUint(c.QueryParam(`taskid`), 10, 32); err != nil { return jsonError(c, err) } - /*if !strings.HasPrefix(c.Request().Host, Localhost+`:`) { - return echo.NewHTTPError(http.StatusForbidden, "Access denied") - }*/ user := c.(*Auth).User for _, item := range tasks { if item.ID == uint32(taskid) { diff --git a/assets.go b/assets.go index 6195979..7be7779 100644 --- a/assets.go +++ b/assets.go @@ -6840,126 +6840,126 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== "/eonza-assets/themes/default/templates/index.tpl": { name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", - size: 28867, - modtime: 1619273382, - compressed: ` -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 + size: 28808, + modtime: 1619624749, + compressed: ` +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 `, }, @@ -7361,28 +7361,28 @@ PCpysF7V6go73ywrBclmt9vHPT+pS77DmcN0o+R8ujHKrwAAAP//68wRS+YEAAA= "/eonza-assets/themes/default/templates/tasks.tpl": { name: "tasks.tpl", local: "../eonza-assets/themes/default/templates/tasks.tpl", - size: 3347, - modtime: 1616471833, - compressed: ` -H4sIAAAAAAAC/8xWTY/bNhO++1fMq8SRjF1Zm+BtD15bCdCi6KGHosmlWAQNlxyviFCkQI68Ngz994LU -x0q2GyTbHOoAWX48z8wzQ85Qa8etrAjoUOEmItxTtk8Jy0oxwgik2ETE3GcX5TOA9S7lRhOTGi04Oijc -RAXKh4JWr29u5rcVE0Lqh5RMtYL/31T720ADWAu5OyFwpnjiWZDCTbVf3Jod2q0yj+lhBawm03MB1sTu -FQJXzDkv515hBByVchXjUj9sopsB69E2X1MBu3Rr7CaShCVIDQUy4aL8ePQLTbPOqMjXGdkJsSf5kD1J -SUcj0x4j8uPRby81KzHYESPAaL92aJvmXTezRp2jPXwIS3DUhDbKfZYLWQ2wDlDu0zdQHtLXsDWa0seQ -xvTeKAHVPv0hGvArbpQPwhGj2v3kJ3dBQ7vwcYT055128BEENhtw9IvU0hUo4C3EL3587f/FsIL4xXa7 -jXsj+fHYcn6TjiZufLRtJPmFsPssOWKWLiamR2yDjMuQtauYHhJk0zeTwwqoXSq50dAFWVlZMnuIwJVM -KXjHleSfN9FO4mMSvEmxiPItS/GAXr7n5uvMuzmzfOYbdqkrzOM0lWtw9L52FWqB4pnyKlY7nOoLS99H -YTjsfyvRoqvLU42KHf5DEgltKTWjE5UkS3TfR2Y+KZtXryBskhGonp3W0uy+UfC0UMY9bp2F5tn15EzI -Xejq2ait57N11j4J+Wy27kfcaEfwwT8EsIHjDKB/Inw/CA9EfD0DEIzYKkTtfmbE/FKJVBjhVoEF4A6O -lyLhpbgGKRbdqv8ppMCEDVAh3fKlNYaWD0jebSLFYkDKLST/89AxHcAi1VYPC80wYntp3DDzJpNPGatk -5g7uLS/F5uWRl6J55U1KP5Oi+fTkbkkF6sSiq4x2CJt84rWV0+8ufQaWaK2xixOY/40CQ2tL93CReHvG -OwltGl4zksoZ8SIJZrzQc3+th85Fcx3+tO1lfBqB1x3V+4PrKi+c2JjYFf0XmH8ExBnxqRTPuK1abvRW -2vJPdAnEc0emaq/iPL6GZDGE9uToQ28x+Jo4C8197Odrb9rFezY5imaEPG36Qx84veSVseRde3wYX8Hd -3fJ3Y+l9Ibf08eOAfpRamMelqVAn3VgZzkgavaysIcONgiuIsyyGKzhFFMaR/0jxiJUHeGfXEP91r5j+ -HA/XrAFUDkcix27jzOvM4quuBV3iT69EaFjjdI/LLxRfHIqvRQblTyn/Uq19VZ19e4X9Y9twZCwuuSlL -SUlcV4IRfmhbHUyN+s/Ep3QMsTyjGMN/3JRVTSj6nunNr2Bba+7PNVnAsRPdSfSXDpeh646slKbWhCLp -83MxHEkK42uI555dMs0e0M77o73E+BVVFQi1VZc4oyCVYSLkK/EZaWbN7WzWB/H0Rgz6upD6wwzf6yu4 -8+Xfl77vBMwSivtDP6PazYOesNMO2y9GP550zHjOgm9PmHU7ba01s2b07P0dAAD//+NhAGETDQAA + size: 3306, + modtime: 1619624769, + compressed: ` +H4sIAAAAAAAC/8xWTY/bOBK9+1fUKnEkIy2rE+zuwS0rAXYxmMOcJrkMgmDCJsstIhQpkCW3DUP/fUDq +oyXbCZJMDuMAaYl8r+pVFauo3HErawI61riNCA+UHVLCqlaMMAIpthEx99lFxQIg36fcaGJSowVHR4Xb +qET5UNLm1e3t8q5mQkj9kJKpN/Dv2/pwF2gAuZD7MwJniieeBSnc1ofVndmj3SnzmB43wBoyAxcgJ3av +ELhiznk59woj4KiUqxmX+mEb3Y5Yj7ZFTiXs052x20gSViA1lMiEi4rTyS+0bZ5RWeQZ2RlxIPmQPUlJ +RxPTHiOK08lvrzWrMNgRE8Bkv3Fo2/Zt/2aNukR7+BiW4KgJbVT4LJeyHmE9oDqkr6E6pq9gZzSljyGN +6b1RAupD+p9oxG+4UT4IR4wa9z//8iFo6BY+TpC+3mkPn0BguwVHv0gtXYkC3kD87L+v/L8YNhA/2+12 +8WCkOJ06zm/S0cyNj7aLpLgS9pAlR8zS1cQMiF2QcR2Su5rpMUE2fT0rVkDtU8mNhj7I2sqK2WMErmJK +wVuuJP+8jfYSH5PgTYpVVOxYikf08j23yDPv5sLyhW/Yp640j/NU5uDoXeNq1ALFD8qrWeNwri8s/RyF +odh/V6JF11TnGhU7/oMkEtpKakZnKklW6H6OzGLWNi9eQNgkI1D9cFors/9OwfNGmc64PAvDs5/JmZD7 +MNWzyVgvFnnWXQnFYpEPT9xoR/DeXwSwhdMCYLgi/DwIF0R8swAQjNgmRO3+z4j5pQqpNMJtAgvAHR2v +RMIrcQNSrPpV/1NIgQlboFK69XNrDK0fkLzbRIrViJQ7SP7loVM6gEVqrB4X2vGJHaRx45s3mXzKWC0z +d3RveCW2z0+8Eu0Lb1L6NynaT0/u1lSiTiy62miHsC1mXjs5w+7aZ2CN1hq7OoP53yQwtLZyD1eJdxe8 +s9Dm4bUTqZwRL5Ngxgu99Nd56F20N+FPN16m1Qi8vlTvjq7vvFCxKbFv+q8wfw+IC+JTK15wO7Xc6J20 +1R/oEoiXjkzdHcVlfAPJagztydH7wWLwNXMWhvvUz7eetKvnbFaKdoI8H/rjHJiyH6UW5nFtatRJ/6wM +ZySNXtfWkOFGwUuIsyyGl3COKI0j/9nhERsPCD5rY+kG4j/vFdOf4/H0tIDK4Rd8x5mnZvHLfrJc488r +HebQNIvTrgo9FYee6pBB/lMmv9ZC39Q+3984X5wGjozFNTdVJSmJm1owwvfdBIO5Uf/195SOMZYf6LHw +HzdV3RCKYRR68xvYNZr74iYrOPWie4n+LOE6DNOJlco0mlAkQ36uhiNJYXwD8dKzK6bZA9rlUNprjF9R +1YHQWHWNMwlSGSZCvhKfkXbR3i0WQxBPo3/U14c0FDN8hm/gg+/qoaN9gzNLKO6Pwxs1bhn0hJ3usfsQ +9M+zQRgvWfDtCYt+52OX+kU7uc3+CgAA///zYITz6gwAAA== `, }, diff --git a/auth.go b/auth.go index dac3ffc..a0cef02 100644 --- a/auth.go +++ b/auth.go @@ -87,7 +87,6 @@ func accessIP(curIP, originalIP string) bool { func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) (err error) { var ( - access string isAccess, ok bool ) ip := c.RealIP() @@ -115,20 +114,11 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { host = host[:offPort] } if IsScript { - access = scriptTask.Header.HTTP.Access + isAccess = host == scriptTask.Header.HTTP.Host && accessIP(ip, scriptTask.Header.IP) } else { - access = cfg.HTTP.Access + isAccess = host == cfg.HTTP.Host } - if access == AccessPrivate { - isAccess = lib.IsPrivate(host, ip) - } else if access == AccessHost { - if IsScript { - isAccess = (host == scriptTask.Header.HTTP.Host && accessIP(ip, scriptTask.Header.IP)) || - host == Localhost - } else { - isAccess = host == cfg.HTTP.Host || host == Localhost - } - } else { + if isAccess && host == Localhost { isAccess = lib.IsLocalhost(host, ip) } if !isAccess { diff --git a/config.go b/config.go index 314d3f6..16ba261 100644 --- a/config.go +++ b/config.go @@ -49,12 +49,6 @@ type Config struct { playground bool } -const ( - AccessLocalhost = Localhost - AccessPrivate = `private` - AccessHost = `host` -) - var ( cfg = Config{ Version: GetVersion(), @@ -68,7 +62,6 @@ var ( Port: DefPort, Open: true, Theme: `default`, - Access: AccessLocalhost, JWTKey: lib.UniqueName(12), }, } @@ -144,12 +137,6 @@ func LoadConfig() { golog.Fatal(`Specify the path to the private key pem file in config file`) } } - switch cfg.HTTP.Access { - case AccessHost: - case AccessPrivate: - default: - cfg.HTTP.Access = AccessLocalhost - } cfg.develop = cfg.Mode == ModeDevelop cfg.playground = cfg.Mode == ModePlayground if cfg.playground { diff --git a/lib/lib.go b/lib/lib.go index 0665536..70e3d3d 100644 --- a/lib/lib.go +++ b/lib/lib.go @@ -31,7 +31,6 @@ type HTTPConfig struct { LocalPort int `yaml:"localport"` // if empty, then define automatically Open bool `yaml:"open"` // if true then host is opened Theme string `yaml:"theme"` // theme of web interface. if it is empty - DefTheme - Access string `yaml:"access"` // Access level - localhost, private - DefAccess == localhost JWTKey string `yaml:"jwtkey"` // Secret key for JWT token Cert string `yaml:"cert"` // cert pem file Priv string `yaml:"priv"` // private key pem file diff --git a/run.go b/run.go index 9b6509d..260c6c6 100644 --- a/run.go +++ b/run.go @@ -97,7 +97,6 @@ func systemRun(rs *RunScript) error { LocalPort: localPort, Open: rs.Open, Theme: cfg.HTTP.Theme, - Access: cfg.HTTP.Access, Cert: cfg.HTTP.Cert, Priv: cfg.HTTP.Priv, }, diff --git a/server.go b/server.go index 9839af9..8de3a85 100644 --- a/server.go +++ b/server.go @@ -331,7 +331,7 @@ func RunServer(options lib.HTTPConfig) *echo.Echo { if IsScript { setStatus(TaskFailed, err) } - if cfg.HTTP.Access != AccessHost && pingHost(options.Port) { + if pingHost(options.Port) { lib.Open(fmt.Sprintf("http://%s:%d", Localhost, options.Port)) } golog.Fatal(err) From 544a46184795eda187edf0066ebb17e776683cbf Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 29 Apr 2021 15:26:32 +0500 Subject: [PATCH 6/9] Fixed eventHandle --- scheduler.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scheduler.go b/scheduler.go index c59be56..b6df60e 100644 --- a/scheduler.go +++ b/scheduler.go @@ -57,10 +57,10 @@ type Event struct { } type EventData struct { - Name string `json:"name"` - Data string `json:"data"` - Rand string `json:"rand"` - Sign string `json:"sign"` + Name string `json:"name" form:"name"` + Data string `json:"data" form:"data"` + Rand string `json:"rand" form:"rand"` + Sign string `json:"sign" form:"sign"` } type EventsResponse struct { From 14dfb32449198b890bf4cd12b0039414072fb222 Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 29 Apr 2021 15:57:07 +0500 Subject: [PATCH 7/9] Fixed task manager --- api.go | 5 ++++- assets.go | 44 ++++++++++++++++++++++---------------------- localhost.go | 50 -------------------------------------------------- make.g | 4 ++-- taskmanager.go | 16 +--------------- 5 files changed, 29 insertions(+), 90 deletions(-) diff --git a/api.go b/api.go index 64655f3..da30dfe 100644 --- a/api.go +++ b/api.go @@ -19,6 +19,7 @@ import ( "eonza/users" "github.com/gentee/gentee" + "github.com/kataras/golog" "github.com/labstack/echo/v4" ) @@ -241,8 +242,10 @@ func removeTaskHandle(c echo.Context) error { return jsonError(c, fmt.Errorf(`Access denied`)) } } - delete(tasks, uint32(idTask)) RemoveTask(uint32(idTask)) + if errSave := SaveTasks(); errSave != nil { + golog.Error(errSave) + } return tasksHandle(c) } diff --git a/assets.go b/assets.go index 7be7779..b96e687 100644 --- a/assets.go +++ b/assets.go @@ -6840,8 +6840,8 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== "/eonza-assets/themes/default/templates/index.tpl": { name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", - size: 28808, - modtime: 1619624749, + size: 28842, + modtime: 1619693442, compressed: ` H4sIAAAAAAAC/9R9f3fjthHg//oUY7a7kmJRsjdOm5NM53Kb7rvepUleN2len59fA5GgBJsCWAKSrO7q u9/DLxIgIVl2Ntc2f8QiMBjML8wMBiD3+uyb79/++Pcf/gRLsSpuetf2D0bZDfQArldYIEiXqOJYJNFa @@ -6940,26 +6940,26 @@ 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 `, }, diff --git a/localhost.go b/localhost.go index 1b03fb2..fe071cd 100644 --- a/localhost.go +++ b/localhost.go @@ -188,56 +188,6 @@ func RunLocalServer(port int) *echo.Echo { e.POST("/api/taskstatus", taskStatusHandle) e.POST("/api/runscript", runScriptHandle) } - /* e.GET("/", indexHandle) - - e.GET("/js/*", fileHandle) - e.GET("/css/*", fileHandle) - e.GET("/images/*", fileHandle) - e.GET("/webfonts/*", fileHandle) - e.GET("/favicon.ico", fileHandle) - e.POST("/tools/md", markdownHandle) - if IsScript { - e.GET("/ws", wsTaskHandle) // + - e.GET("/info", infoHandle) // + - e.POST("/stdin", stdinHandle) // + - e.POST("/form", formHandle) // + - } else { - e.GET("/ws", wsMainHandle) - e.GET("/task/:id", showTaskHandle) // + - e.GET("/api/compile", compileHandle) // + - e.GET("/api/exit", exitHandle) // + - e.GET("/api/export", exportHandle) // + - e.GET("/api/reload", reloadHandle) // + - e.GET("/api/logout", logoutHandle) - e.GET("/api/script", getScriptHandle) // + - e.GET("/api/list", listScriptHandle) // + - e.GET("/api/listrun", listRunHandle) // + - e.GET("/api/notifications", nfyHandle) // + - e.GET("/api/tasks", tasksHandle) // + - e.GET("/api/timers", timersHandle) // + - e.GET("/api/events", eventsHandle) // + - e.GET("/api/prosettings", proSettingsHandle) // + - e.GET("/api/remove/:id", removeTaskHandle) // + - e.GET("/api/removenfy/:id", removeNfyHandle) // + - e.GET("/api/removetimer/:id", removeTimerHandle) // + - e.GET("/api/removeevent/:id", removeEventHandle) // + - e.GET("/api/sys", sysTaskHandle) // - e.GET("/api/settings", settingsHandle) // + - e.GET("/api/latest", latestVerHandle) // - e.GET("/api/trial/:id", trialHandle) // + - e.POST("/api/install", installHandle) // + - e.POST("/api/login", loginHandle) - e.POST("/api/script", saveScriptHandle) // + - e.POST("/api/delete", deleteScriptHandle) // + - e.POST("/api/import", importHandle) // + - e.POST("/api/settings", saveSettingsHandle) // + - e.POST("/api/setpsw", setPasswordHandle) // - e.POST("/api/timer", saveTimerHandle) // + - e.POST("/api/saveevent", saveEventHandle) // + - e.POST("/api/favs", saveFavsHandle) - e.POST("/api/feedback", feedbackHandle) // + - ProApi(e) - }*/ go func() { if IsScript { e.Logger.SetOutput(io.Discard) diff --git a/make.g b/make.g index d5cc02f..06ca7ec 100755 --- a/make.g +++ b/make.g @@ -10,9 +10,9 @@ run { $ /home/ak/go/bin/esc -ignore "\.git|LICENSE|README.md" -o assets.go ../eonza-assets // $ go install -ldflags "-s -w" -tags "eonza standard" - $ go install -tags "pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" +/* $ go install -tags "pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza.com/eonza - return + return*/ $ go install -tags "tray pro" -ldflags "-s -w -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" // $ go install -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" diff --git a/taskmanager.go b/taskmanager.go index 6c8497a..b725b16 100644 --- a/taskmanager.go +++ b/taskmanager.go @@ -85,23 +85,10 @@ func SaveTrace(task *Task) (err error) { } func RemoveTask(id uint32) { + delete(tasks, id) for _, ext := range append(TaskExt, `zip`) { os.Remove(filepath.Join(cfg.Log.Dir, fmt.Sprintf("%08x.%s", id, ext))) } - /* if err := filepath.Walk(cfg.Log.Dir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.IsDir() { - return nil - } - if strings.HasPrefix(info.Name(), pref) { - os.Remove(path) - } - return nil - }); err != nil { - golog.Error(err) - }*/ } func GetTaskName(id uint32) (ret string) { @@ -126,7 +113,6 @@ func ListTasks() []*Task { }) if len(ret) > TasksLimit { for i := TasksLimit; i < len(ret); i++ { - delete(tasks, ret[i].ID) RemoveTask(ret[i].ID) } ret = ret[:TasksLimit] From ec43671ac109435ace94fbdd386b4f02efe3fab6 Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 29 Apr 2021 16:16:00 +0500 Subject: [PATCH 8/9] Read PEM to cache --- assets.go | 44 ++++++++++++++++++++++---------------------- config.go | 11 +++++++++-- lib/lib.go | 16 ++++++++-------- 3 files changed, 39 insertions(+), 32 deletions(-) diff --git a/assets.go b/assets.go index b96e687..9eb2349 100644 --- a/assets.go +++ b/assets.go @@ -6840,8 +6840,8 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== "/eonza-assets/themes/default/templates/index.tpl": { name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", - size: 28842, - modtime: 1619693442, + size: 28830, + modtime: 1619694627, compressed: ` H4sIAAAAAAAC/9R9f3fjthHg//oUY7a7kmJRsjdOm5NM53Kb7rvepUleN2len59fA5GgBJsCWAKSrO7q u9/DLxIgIVl2Ntc2f8QiMBjML8wMBiD3+uyb79/++Pcf/gRLsSpuetf2D0bZDfQArldYIEiXqOJYJNFa @@ -6940,26 +6940,26 @@ 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 `, }, diff --git a/config.go b/config.go index 16ba261..815aaef 100644 --- a/config.go +++ b/config.go @@ -7,6 +7,7 @@ package main import ( "eonza/lib" "eonza/users" + "fmt" "os" "path" "path/filepath" @@ -130,12 +131,18 @@ func LoadConfig() { cfg.HTTP.Theme = DefTheme } if cfg.HTTP.Host != Localhost { - if len(cfg.HTTP.Cert) == 0 { + if cfg.HTTP.Cert == nil { golog.Fatal(`Specify the path to the certificate pem file in config file`) } - if len(cfg.HTTP.Priv) == 0 { + if cfg.HTTP.Priv == nil { golog.Fatal(`Specify the path to the private key pem file in config file`) } + if cfg.HTTP.Cert, err = os.ReadFile(fmt.Sprint(cfg.HTTP.Cert)); err != nil { + golog.Fatal(err) + } + if cfg.HTTP.Priv, err = os.ReadFile(fmt.Sprint(cfg.HTTP.Priv)); err != nil { + golog.Fatal(err) + } } cfg.develop = cfg.Mode == ModeDevelop cfg.playground = cfg.Mode == ModePlayground diff --git a/lib/lib.go b/lib/lib.go index 70e3d3d..2835715 100644 --- a/lib/lib.go +++ b/lib/lib.go @@ -26,14 +26,14 @@ import ( // HTTPConfig stores web-server settings type HTTPConfig struct { - Host string `yaml:"host"` // if empty, then localhost - Port int `yaml:"port"` // if empty, then DefPort - LocalPort int `yaml:"localport"` // if empty, then define automatically - Open bool `yaml:"open"` // if true then host is opened - Theme string `yaml:"theme"` // theme of web interface. if it is empty - DefTheme - JWTKey string `yaml:"jwtkey"` // Secret key for JWT token - Cert string `yaml:"cert"` // cert pem file - Priv string `yaml:"priv"` // private key pem file + Host string `yaml:"host"` // if empty, then localhost + Port int `yaml:"port"` // if empty, then DefPort + LocalPort int `yaml:"localport"` // if empty, then define automatically + Open bool `yaml:"open"` // if true then host is opened + Theme string `yaml:"theme"` // theme of web interface. if it is empty - DefTheme + JWTKey string `yaml:"jwtkey"` // Secret key for JWT token + Cert interface{} `yaml:"cert"` // cert pem file + Priv interface{} `yaml:"priv"` // private key pem file } // PlaygroundConfig stores the config of playgroundmode From 94f8d43761d943acf8d1094b2ee78103d4708dc2 Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 29 Apr 2021 17:13:32 +0500 Subject: [PATCH 9/9] Fixed config --- assets.go | 86 +++++++++++++++++++++++++++---------------------------- config.go | 2 ++ 2 files changed, 45 insertions(+), 43 deletions(-) diff --git a/assets.go b/assets.go index 9eb2349..e2970c5 100644 --- a/assets.go +++ b/assets.go @@ -431,49 +431,49 @@ IYiGnOcfAAA= "/eonza-assets/init/test-texts.yaml": { name: "test-texts.yaml", local: "../eonza-assets/init/test-texts.yaml", - size: 8530, - modtime: 1615266510, - compressed: ` -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 -AAA= + size: 8755, + modtime: 1619695504, + compressed: ` +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 `, }, diff --git a/config.go b/config.go index 815aaef..ea728c2 100644 --- a/config.go +++ b/config.go @@ -64,6 +64,8 @@ var ( Open: true, Theme: `default`, JWTKey: lib.UniqueName(12), + Cert: ``, + Priv: ``, }, } firstRun bool