From 751a416a3556b0d3711034a798944e57dda230d4 Mon Sep 17 00:00:00 2001 From: gentee Date: Tue, 9 Feb 2021 18:42:52 +0500 Subject: [PATCH 01/11] Added users folder --- assets.go | 36 ++++++++++++++++---------------- auth.go | 17 +++++++++------ const.go | 2 +- languages.go | 5 +++-- main.go | 4 +++- make.g | 2 +- server.go | 6 ------ storage.go | 2 +- users.go | 56 ++++++++++++++++++++------------------------------ users/users.go | 44 +++++++++++++++++++++++++++++++++++++++ 10 files changed, 104 insertions(+), 70 deletions(-) create mode 100644 users/users.go diff --git a/assets.go b/assets.go index 72186c4..55f2e67 100644 --- a/assets.go +++ b/assets.go @@ -261,7 +261,7 @@ JV7py2vJu7m/d2d7v5e345zJTZF2KxDrqbkOqCTiUhlbFuRWw0fp31VMk52358eFKzO4NAhQ6PHUgDAH name: "test-email.yaml", local: "../eonza-assets/init/test-email.yaml", size: 1808, - modtime: 1611833026, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5SVzW4bNxDH73qKweogG9CHIdQuulgvirZGjaI9We3VoHZHEmsuuSVn1apJADvnPEWe IAhgQAgS+xWoNwrI/fCuYDi2Tsvh8P+bGQ5HBom4XJqwByBZhiEQGhphxrjoARAngSEM+pdusz/oAeSM @@ -348,7 +348,7 @@ AP//hvfjquAKAAA= name: "test-sql.yaml", local: "../eonza-assets/init/test-sql.yaml", size: 8167, - modtime: 1612346845, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/+xZ627byhH+r6cYUD6gfA5l6xInKE8UQ7GV1o0juZIcNAiChCJHMhGKS+8u7ahpgLZA f+Ut+gRp0aD5kz6D/EbFLi8iaVKyfGmK9BiwvRruznxz1X4SQ85td8L0EoBrTFEHjoxX2alTAuA2d1AH @@ -453,7 +453,7 @@ tE/XQkH677E/AQAA///sgBH0LQYAAA== name: "tests.yaml", local: "../eonza-assets/init/tests.yaml", size: 1303, - modtime: 1612347246, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5SUsY7bMAyGdz8F4QyefEOHDtoKdC6KQ4GOARvTiQpa8km0767bpWM7delrFAUO6NZX sN/oIMkJ4uQQwJvym/x+UmTkSUSbrVcZgMGGFAh58RmAaGFSUKzWQV8VGUCLsgvKTYyJUkV+E4PCISps @@ -503,7 +503,7 @@ tM82Mx9MOQ2LZxN+0W+K7kKpvfSrPgALfqQPVkG/0nuG+2FqPdavaUQnNEp3k3J5V97PLL39lN683tMf name: "en.yaml", local: "../eonza-assets/languages/en.yaml", size: 6802, - modtime: 1612235943, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/4xYW2/cuJJ+568oBPCZGWDtvOsl8PhyYqxvx+0kGCz2gS1Vq7mmSIWXvsyvX3xFSi0n 2csTqz6WSIpkVX1FvfYhNXSJRum1z0XJSek2Ge9iQ5dFEGDHRd+x0l3XDl1Dl11HmhzvqfXDoF1HyVPa @@ -560,7 +560,7 @@ OUsVo+lpce7+YSd/2sJ3waXYADqvWLH77wAAAP//suoXjJIaAAA= name: "ru.yaml", local: "../eonza-assets/languages/ru.yaml", size: 10906, - modtime: 1612235960, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5xaX28bSXJ/708xMGDcHRDL73rxQ3BAgGyQzSV5CvLQmmmSAw1nxj0zlHRPImWvvJDO yvr2skL2ZNnnS+7pEIoSLYoUqa9Q/Y2Cquqef6R82XvZtbqre6qrq371q2rKnUTn2x5cmkOYmkOYwNiM @@ -1609,7 +1609,7 @@ fwcAAP//svXImgcDAAA= name: "send-email.yaml", local: "../eonza-assets/scripts/send-email.yaml", size: 1157, - modtime: 1611837311, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5xTwWrbQBS871cM9iE22CntoYeF9FBoQiGtCw69NMXI1laRkbTqahUIacBxr+kP9FBo vyCEupjWcX7h7R+VXUmx5QQCuazNvLfzZt6sMqF1mAQZZ0DixYIjE4nfFbEXRgzQoY4Ex1ZzYIvNLQak @@ -1745,7 +1745,7 @@ AAA= name: "smtp-server.yaml", local: "../eonza-assets/scripts/smtp-server.yaml", size: 1141, - modtime: 1611833439, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5yTvWobQRDH+32KQSpsQyRDPlwspErrQOBMmhDM+jSRLuztXvZDwZDCcpcqZaq8gwgR KAH7GebeKOzHXe4cXNgqdMtvdv8zO/sfi85Vamk5A1CiRg62ds3MolmjYQCuchI5HEzPQ3R6wAAa4VaB @@ -1793,7 +1793,7 @@ sJ57xLSIHPL/1dvVTb31uiYV0hVJvspOfsl32Y/b8QvGrfyUw/h53EJ+yw7yR47yI5/HT3KUg+wvwTdi name: "sql-close.yaml", local: "../eonza-assets/scripts/sql-close.yaml", size: 424, - modtime: 1612364787, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/2SPv0ozQRTF+3mKA1vk+5BEsLCYNq2N+ABhMnvZLExmNvNHECzUVntfw8KFIMRnuPtG MjMBE+x2z2/u/Z0bKMbedkEKwKotSYSdmWvjAgkg9tGQxKxZZdbMBDCouMnJIsTW9Ovmslm0Kqq1CpW3 @@ -1807,7 +1807,7 @@ zwce+cB7Hk+3/R0R2rUk8XghkH+L6l+97r8QPwEAAP//wd+UaqgBAAA= name: "sql-connection.yaml", local: "../eonza-assets/scripts/sql-connection.yaml", size: 1287, - modtime: 1612346632, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5yUz4oTTRTF9/UUl8livg9NBAUXBa7GZRRDliJDJX3pNFSqOlXVkYALs3A1C7dufYNR JjiCmWe4/UZSf7rTnckIukmac+rce7rzS1t0rlC55QxAiSVysCs5nGulcO4KrRiAK5xEDueDS39gcM4A @@ -1825,7 +1825,7 @@ ieOoNkgGpwNtyiTAYu6AYHTjAwxei9N0Mj78EP/5c48P9PzP2O8AAAD///jPas4HBQAA name: "sql-exec.yaml", local: "../eonza-assets/scripts/sql-exec.yaml", size: 809, - modtime: 1612346664, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/4ySsW7UQBCG+32KX3dFbHE5BBIUK6VMg4JQdJSWoj17uDha7/p2x6cgREMbKp6EggIB Ca+w90Zodw+woxRprPE/M9/M/FpPzK3ZeCkAozqS8Ft9TNdUC4Bb1iRxNL+IqfmRAHrFl1FZem50u54/ @@ -1842,7 +1842,7 @@ AAD//4Addl0pAwAA name: "sql-query.yaml", local: "../eonza-assets/scripts/sql-query.yaml", size: 896, - modtime: 1612346678, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5RSTYsTQRS8968oksPOYDaioIeGPcleJCIhexwInZlndpZO96Q/BhcR1KuevPg3vCmI u3+h5x/JdCebSbzoZeip6lf1Xr225Fyt1pYzQIkNcditPN96MrcMcLWTxHE2Xvbc+IwBjXDXPTK1rpL1 @@ -1859,7 +1859,7 @@ FvNZzCNLT3Py8NImUWpyWFg+Yn8CAAD//3DYIlmAAwAA name: "sql-row.yaml", local: "../eonza-assets/scripts/sql-row.yaml", size: 885, - modtime: 1612346695, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5SSv27bPBTFdz7FgT3Ewuf4Qwu0A4FMRZbCRZEoowCDlm4dBTQpk5SCoCjQZM7euW+Q rUGH9hWoNypIOrGUqV0E8Vze3/1zaMm5Wm0sZ4ASW+KwO3ls9DUDXO0kcRxNVyEyPWJAI9xlUBbWVbJe @@ -1876,7 +1876,7 @@ lhXqS6Hys+W5vp6lNzl/fmLzCJofnMom7E8AAAD//wNCZ2F1AwAA name: "sql-value.yaml", local: "../eonza-assets/scripts/sql-value.yaml", size: 903, - modtime: 1612346725, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/5SSv2rcQBDG+32Kj7vCEjlfSCApFlwFN8EhGJlUgmNPmpxl9nZ1uyOBCYEkTZr0fg03 Jm6cvMLqjYJWdz6dSZE0YvXNzm/+fOuJuTIrLwVg1Jok/EYft0o3JACuWJPE0XTRx6ZHAqgVX/bK3HOp @@ -6154,7 +6154,7 @@ pkwzv14p5QLGWkwn5HwBFM6rGZaYLoC+eOGarWXjUliDKv9c05uKw7+AMYULmMNXHcuMwmt600OZaVHK name: "dyncomp.tpl", local: "../eonza-assets/themes/default/templates/dyncomp.tpl", size: 13852, - modtime: 1612244101, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/+w6bW/juNHf/Ssmep6s5FtLdnbvVbZ817sWaIHrdYFbFCiCfKAl2mZXolSRdpIm/u/F kHqzRDpxdvdQoJcPsU1yhvPOmSEXIi5ZIUHeFzRyJL2T0ztf0qxIiaQOsCRyYj/e0vjDKr9zliMAgMW+ @@ -6387,7 +6387,7 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", size: 26694, - modtime: 1611920962, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/9R9bZfbtrHwd/2KWba2pKwo7Tpum0darp9epz73JU1yrt3m9OzRaSASlLBLAbwEJK3q 6L/fgzcSICGt1nZv23zIisBgMG+YGQxA+ubi2x/efvjLj3+AlVgXt70b+wej7BZ6ADdrLBCkK1RxLJJo @@ -6592,7 +6592,7 @@ AP//ZTn8v04GAAA= name: "pro.tpl", local: "../eonza-assets/themes/default/templates/pro.tpl", size: 3285, - modtime: 1612019873, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/9xWz5Pbtg6++6/AKk/Pdp5p2VkneSNZmnba7vTYQ6fnUCJscUKJLElpvbPx/94hJduS 12l+TE/NJRYIfAA+fAR3awrNlQX7pDANLB5sdCAWKyWoxQA4SwOlZZBNALYtKWRtKa9Rg7FPAtOgogfy @@ -6621,7 +6621,7 @@ lpyGfUwml2f8rwAAAP//T1+tsdUMAAA= name: "script.tpl", local: "../eonza-assets/themes/default/templates/script.tpl", size: 14354, - modtime: 1611830040, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/9Q7f2/buJL/+1NMtOvI3kS2kxbFO9nyvvfaLV4P3bZoerdYGAaWlmibG4nUkpQTX+rv fiCpH9QPO0n3FofXArVIzgxnhjPDGZKdnb35+PrLr59+gq1M4nlvVvxgFM2hBzBLsEQQbhEXWAZOJtfe @@ -6697,7 +6697,7 @@ VRmoakHrOiwCgW/iTdFdhDEfHMcK64w34IpYXlnIoXfo2Y9TZmPzf8JmY/1///43AAD//wA8NGwSOAAA name: "settings.tpl", local: "../eonza-assets/themes/default/templates/settings.tpl", size: 9958, - modtime: 1611918708, + modtime: 1612438635, compressed: ` H4sIAAAAAAAC/9w5S48iu9V7fsXp+j4uhURB98xopFR3kUizyZVGySJXkaJWK2OqDuC0sSu2eYXLf49s 15NyQc9rk94A9nm/j/tJpZLmGvQxxyTQeNCzQ6RxkzOiMQCaJYFCrSlfqWA+AHjaRangmlCOEpQ+MkyC diff --git a/auth.go b/auth.go index 7f13bd0..8d2c551 100644 --- a/auth.go +++ b/auth.go @@ -5,17 +5,25 @@ package main import ( - "eonza/lib" "net" "net/http" "strings" "time" + "eonza/lib" + "eonza/users" + "github.com/dgrijalva/jwt-go" "github.com/labstack/echo/v4" "golang.org/x/crypto/bcrypt" ) +type Auth struct { + echo.Context + User *users.User + Lang string +} + type Claims struct { Counter int64 Username string @@ -156,10 +164,7 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { c.Request().URL.Path = `install` } // TODO: JWT user - var user *User - for _, user = range storage.Users { - break - } + user := users.Users[users.RootID] lang := LangDefCode if IsScript { lang = scriptTask.Header.Lang @@ -170,7 +175,7 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { } auth := &Auth{ Context: c, - User: user, + User: &user, Lang: lang, } err = next(auth) diff --git a/const.go b/const.go index 942bb09..832c301 100644 --- a/const.go +++ b/const.go @@ -6,7 +6,7 @@ package main const ( // Version of the application - Version = "1.12.0" + Version = "1.13.0" // DefPort is the default web-server port DefPort = 3234 // DefTheme is the default web-server theme diff --git a/languages.go b/languages.go index 039bcd6..854f86e 100644 --- a/languages.go +++ b/languages.go @@ -6,6 +6,7 @@ package main import ( es "eonza/script" + "eonza/users" "fmt" "strings" @@ -43,7 +44,7 @@ func InitLang() { } } -func GetLangCode(user *User) (ret string) { +func GetLangCode(user *users.User) (ret string) { if user == nil && IsScript { return scriptTask.Header.Lang } @@ -53,7 +54,7 @@ func GetLangCode(user *User) (ret string) { return LangDefCode } -func GetLangId(user *User) (ret int) { +func GetLangId(user *users.User) (ret int) { if user == nil && IsScript { return langsId[scriptTask.Header.Lang] } diff --git a/main.go b/main.go index 0dd5906..caf3efe 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,7 @@ import ( "time" "eonza/script" + "eonza/users" "github.com/kataras/golog" "github.com/labstack/echo/v4" @@ -98,7 +99,8 @@ func main() { return } hideConsole() - LoadUsers() + users.InitRoot(storage.Settings.PasswordHash) + LoadUsersSettings() defer CloseLog() if err := LoadCustomAsset(cfg.AssetsDir, cfg.HTTP.Theme); err != nil { golog.Fatal(err) diff --git a/make.g b/make.g index 9380520..72bb170 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/server.go b/server.go index f4dfdff..0c37854 100644 --- a/server.go +++ b/server.go @@ -37,12 +37,6 @@ type Response struct { Error string `json:"error,omitempty"` } -type Auth struct { - echo.Context - User *User - Lang string -} - var ( ErrNotFound = errors.New(`Not found`) IsScript bool // true, if web-server for the script diff --git a/storage.go b/storage.go index fa5e0cd..db70669 100644 --- a/storage.go +++ b/storage.go @@ -50,7 +50,7 @@ type Storage struct { Settings Settings Trial Trial PassCounter int64 - Users map[uint32]*User + Users map[uint32]*User // Deprecated Scripts map[string]*Script } diff --git a/users.go b/users.go index 7c6b60b..bfec6e2 100644 --- a/users.go +++ b/users.go @@ -6,14 +6,15 @@ package main import ( "encoding/hex" - "eonza/lib" - es "eonza/script" "fmt" "hash/crc32" "io/ioutil" - "os" "path/filepath" + "eonza/lib" + es "eonza/script" + "eonza/users" + "github.com/labstack/echo/v4" "gopkg.in/yaml.v2" ) @@ -38,7 +39,7 @@ type UserSettings struct { } // User stores user's parameters -type User struct { +type User struct { // Deprecated ID uint32 Nickname string PublicKey []byte @@ -48,34 +49,24 @@ var ( userSettings = make(map[uint32]UserSettings) ) -func LoadUsers() error { +func LoadUsersSettings() error { var err error - for _, item := range storage.Users { - userSettings[item.ID] = UserSettings{ - ID: item.ID, - Lang: appInfo.Lang, + for _, item := range users.Users { + var ( + data []byte + user UserSettings + ) + user.Lang = appInfo.Lang + data, err = ioutil.ReadFile(filepath.Join(cfg.Users.Dir, item.Nickname+UserExt)) + if err == nil { + if err = yaml.Unmarshal(data, &user); err != nil { + return err + } } + user.ID = item.ID + userSettings[user.ID] = user } - - err = filepath.Walk(cfg.Users.Dir, func(path string, info os.FileInfo, err error) error { - var data []byte - if err != nil { - return err - } - if info.IsDir() || filepath.Ext(path) != UserExt { - return nil - } - var user UserSettings - data, err = ioutil.ReadFile(path) - if err = yaml.Unmarshal(data, &user); err != nil { - return err - } - if _, ok := storage.Users[user.ID]; ok { - userSettings[user.ID] = user - } - return err - }) - return err + return nil } func NewUser(nickname string) (uint32, error) { @@ -193,12 +184,9 @@ func SaveUser(id uint32) error { return err } return ioutil.WriteFile(filepath.Join(cfg.Users.Dir, - storage.Users[id].Nickname+UserExt), data, 0777 /*os.ModePerm*/) + users.Users[id].Nickname+UserExt), data, 0777 /*os.ModePerm*/) } func RootUserSettings() UserSettings { - for _, user := range storage.Users { - return userSettings[user.ID] - } - return UserSettings{Lang: LangDefCode} + return userSettings[users.RootID] } diff --git a/users/users.go b/users/users.go new file mode 100644 index 0000000..9188b9a --- /dev/null +++ b/users/users.go @@ -0,0 +1,44 @@ +// 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 users + +const ( + RootUser = `root` + RootID = 0 // Don't change. Must be zero + RootRole = `admin` +) + +type Role struct { + ID uint32 + Name string + Allow string + Disallow string + // Scripts int + Tasks int + Notifications int + // Settings int + // Pro int +} + +type User struct { + ID uint32 + Nickname string + PasswordHash []byte + Role uint32 +} + +var ( + Users map[uint32]User + Roles []Role +) + +func InitRoot(psw []byte) { + Roles = []Role{ + {ID: RootID, Name: RootRole}, + } + Users = map[uint32]User{ + RootID: {ID: RootID, Nickname: RootUser, PasswordHash: psw, Role: RootID}, + } +} From 2d5a3794ec189fb358f1e7e6de2ed92e8a8c83ee Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 11 Feb 2021 08:57:14 +0500 Subject: [PATCH 02/11] Refactored auth --- assets.go | 437 ++++++++++++++++++++++++++----------------------- auth.go | 63 ++++--- config.go | 28 ++-- users.go | 35 ---- users/users.go | 45 ++++- 5 files changed, 318 insertions(+), 290 deletions(-) diff --git a/assets.go b/assets.go index 55f2e67..f843f39 100644 --- a/assets.go +++ b/assets.go @@ -502,136 +502,136 @@ tM82Mx9MOQ2LZxN+0W+K7kKpvfSrPgALfqQPVkG/0nuG+2FqPdavaUQnNEp3k3J5V97PLL39lN683tMf "/eonza-assets/languages/en.yaml": { name: "en.yaml", local: "../eonza-assets/languages/en.yaml", - size: 6802, - modtime: 1612438635, + size: 6852, + modtime: 1612958361, compressed: ` -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 `, }, "/eonza-assets/languages/ru.yaml": { name: "ru.yaml", local: "../eonza-assets/languages/ru.yaml", - size: 10906, - modtime: 1612438635, + size: 11007, + modtime: 1612958374, compressed: ` -H4sIAAAAAAAC/5xaX28bSXJ/708xMGDcHRDL73rxQ3BAgGyQzSV5CvLQmmmSAw1nxj0zlHRPImWvvJDO -yvr2skL2ZNnnS+7pEIoSLYoUqa9Q/Y2Cquqef6R82XvZtbqre6qrq371q2rKnUTn2x5cmkOYmkOYwNiM -zKmQO0mB4+89eDCHsIJrcwhjuId7mArp52ESZ9sefA9TuDNDM4IJzMwZzQzUtgf/AXMzghlMYGlO4E7I -IPD7Aa1YwRWMSX5kTj1Ywgom5si89WAOK7iHMSzhxhx5MPHMEObmEGbwYEa4RUcONm0x8eAcbuGKVFzS -F6coHqKaMrJLHmAFC1jiIpjCwpyyIGowxiPQMe9gDjMhg0Gm8jyMu3jIDzT/BmZoI7f/xmVRN9Fh3uuT -ARZwDSvU3ozgXsgYT38uZBwnuUTFtj34DqZmCA+wQKvThmfr9h57ZujByozQFubEjMwJ3HswM0PzGlZw -Q/rcs/Vu0IIe3MACdxrDxIzYpnQZtzA238AMZvYj5hv8vhniDQiZplHoS3ezl2T3BazgMx2ablf7PXu9 -5tC8puulHXEu29324CNtPEZjVa6U7cZqb/OkRwZYoEbkBzDFmyvyxO8pf5fM2DiCOaYF87qlJuS4cxh7 -5Be8z4KVhjuxo5Xc3eDhO0We0yX8Fy15wB2EL2NfocO8x0ujPcbC78m4q6KkixdIzs7XeuaRTVnMfY4U -30n2tz34E0xhDlewgrkZ8kSRBjJXVhunuvXideWnwk+iSKaZIuux9NIckf5uSkbR+qwHEzOk9f0+HfI9 -XJlv7ZY4VHPvcmqTS/tJP5Va5Qcp6vAHDEXPDMk3J+7U5ozEwkiRNfGyHtB3zJn1DTubsIeUEe3BlTmB -hWeOKAim5g2en4K+2oSiDo0yhuWW8JOYoxoV/0Sus7LQ4ydxlpQqLMmrF2SnOA/jojL6DeHAZza78JP0 -wK55qL5VTnWqUz3UVSF7Pc0Qe55mwtcy66mAjrdwICZ8fZDmSVfLtEefcOd20W1eseKFTmWW7SU6IBNP -YW6O6EbuPHiAMX0UTxLIMMKNfkcheUPmx0tYiUDmckeSm3wHY7g1J4gBFgvNa2Gd7nsKorEI1E7RtU6+ -gDHckO8HqjOQERnqB/KEY+eGqMbKM0dwT5ocswHMWxGoyE/iTqgR8d6ZE5RhP5zil//GM8d4XA+BisJ3 -BFOUQd0WJXqbE7hBRC7B9c4zv6E/KbTM6Ofm5Bcv8GOKjvGpvh6Hw36YK81IDbd2sxLmUSLzdZjmf72S -5jcU9aNGRkKV0nLnumP/7Gn2M0JoTjrmFG7NEUzNyAwRNSYe3JhDcwTXMDOvG3vC2Lz2fv40+4UIVOZT -dD7QRtbncDhPZd7b9uB/rNEmFg1hbFEsCDO5Q36LNzyHhXlrjs13sMQZFcvmBB/xObxrDogg2YujRAY2 -BD4S6h4zdrcCYGtrqxTParIcR0GRUghhZCxbMRYcxLIf+uScM/Q6uK+hPAKqCsKcrnZKN0K0orEFCoS5 -6j8mZHVtuhSMaV2iW6tW5lCo2E+CMO46KGFvobthPFNxrvbzMliHCGVLzD/4rWt0GiRFjGJCxQO1H2Y5 -Q+2c7v1zGVlmSLE+ZQ7FTiLUy4JYyweLsiuhtFb9HUIY9GAMfY+i8TMuwD/KTGTO6DqdA/OflA8ssFcU -pu545mQLv9IJVYRfuSSQnFpPrhOzEx4zZ5iozFnl1Su4MmfEMer86p627assk112oxVJfluBywqukN8g -LbiCOUxxQRz6u7HsK6cKhpC7c97dqkHGfMSMWseJLuJWcD7NNiiPWHqLAUTJaA5jdBVUH3dJUrVhE74E -dNk7gpwliWoKLneWMY6lkTxIsz3OWOhGNs0TZakA/sySPBuEU3apiUdA9RlmeL3e15E86OqkiAPcWauX -7bv6affC6GUNvYZgf8G4ucx2CXsdu0IoN29I8xU7zcIFM1UIK4/5KjH+QxeMnPSRUVyRAcbmLWa/NjCu -YOJ9wRzevz0d/LtQ+35UBMpC1jldJZvT0k1MZEQmcYbCBskn7Xm9RfqjIp+3hNoPbb5glk0DPz3ZUXa7 -wz8pRNfYvTl5QTvLSJV1WIv8j6z/z3Fv/gQTJ3SPW8ItKgvQ2fbDPImdG/5A8IHQ9cYev7JyWV8tzBEl -9Gk9BGdC7adcsXxgW9nK49ROMOlszTnSqfZTLir/jOCIJkf0FB0ZIluIlZ9ve0/gwkHYtTnyiK0hCs+4 -QDOn5LtY+LTLoRXceb9M4l/LLT4hRayz9/YT+gwBZT0KO3KAlZlCEF4vFdFdSoz+IwX04jlcuny6OQBw -kQ2cc7hHZV/xSvxcGKnaXojYM2RkXEHOXQUBM9EJ4zDrcWog2npcZnqeoqPUbxKBppNEARGeUkc71FCo -ZAQz0Ul0N8kZhHAz9p9Zg1++QKk+aY3a3dOmuo/ckrljlTdesYQ5IQmGxyfVuu2yXMXbojhA0CXfxU+7 -S20wcQ4VV6RX+bHOjZ7Q97JKR7YseU8tqZgz0Sli3xbZfzRHsIS5zd1uImvOwEx0Vaw05d2qWOpGyQ4W -FujNvyUCc0VJtewd8KVZVMcsKnoqSi0o38PKfGtORS8MSny1YYRDuZYH1XBVEs94VywDKEhH5DVT0Quz -PNEH7SpU9BK69N8Sl59wG0H0ElLauubQlr7437Ho5f2IGczf/cs/fOVRXiAaI8IOVljN2gqmIuyUIYL1 -hy3ZncNvjo+wGyeanfEaIZ6UrfO2sG9h4pxqPQYJHszDPFLNmbVkIMKYsD7TPuEx38GkYjzNBsmdbZCI -MO4ktPXSuXHJ68K4pzTB/gUh24IgqaZxHOauRLpggsu+gOCFWNyomkQYD2QUBo5SbSqqKO0zx1pStwDP -6jACiZ/dgyP3gsg+l/kn7erQSj5awm3eP5JxVxNW/S+WjWSjCQf5IV3okTk0Q3NCggVTOCspIpnlrk9z -CavSYEhBN3VnXNIyQ1uijam9EoW+7Gql+ipG0/8IM/MNqX0LM4oDNi8F+TW1yt6UJo5CX8WZKnS07fXy -PM22nz/f29vbUpQgEt19rovnQeJnz63kFvq+iNiRP9raaoWHofbOj/gN/HfVTXhHobmCG6rbMCauCc3n -jS5DlHRDBJt3FvFmOBKpATWTPjlLwBIdk/bAgyddbrK+cxxB9FVcbHvwexJ9K5g2cynyHq6YL22AOyya -RD+J816tQXBP93dmjumi+8lAYYlGx76huK56RWTNW5KhWu1RiXp+EbG0zd4PlIJdwRarrutvvifswvss -q7CjRtMmVvleorkvNKUYi9WAMtuFhcFrLGMENxBbjV8c9XthtLGtPLHKu5bt27UGMy6vJfELUmrFpLCV -z1HSpdwLCwiNijtWe7YEvbAB1O5hoEjZK6gJ1Tvcsdrjw3+P0YQkDR64ClhWH2UeMLTm288tYH/k4DNH -xJ6nLVPDVNQrKswHMCFsw2u5F3HC8IJKJLGq/cHq/g7/JbPdWqOK+Bu3kYfO6DU84rmZ16iqprhN2Km1 -mT9RWFDb2rU98VxFf4cM8SeKzwWsRNLphH4ooyzMubHxivxqVkvHZM0xRpJIdre9f/x7YQu397Xe+SkN -7uhkL1O6PUchTtzQHMEtc3uRpPyMkErN/Rj67IoqvxoT4LOPKexGuKEgEn4OP8K5SIo8LXJbllhWyISH -oAXGIhkovaf5cJe2qiDTUR6r2EE713KxhGq6DThW1vb4QsM9lVr2Va50xpSydY7apV/WEk4qs1w1Ui9H -pe1OXdo+dSrzXOnYnv33tvQaP1p6ldieKp3Z55tL6/MtowvkChGh46XlD6lOulr2+4yZ7Wqq1RNCaQq4 -r3WC0F0FFk98Oa2kOnk2UDoLk5izystCZRb4MA3Y2BBa+SrOCZgvbKdpwhWyC41vq54MShc6s7hqe8Gk -lXtKY96AFzoXWnW0suWDezzgS9Cqq/btFtfmiFjRoSMq67Ym8b7M/d629yvV/eW+97e02QN1hyupvgzj -POxzBNprp3Q8tZ1NLuvNGcomA8UPdp+aDV+qg1tVmHkttErDLCuaTSL3NuLoxJXDVBSPpK9sQXNvsYPP -/rIINRVOf+Zy+cF2SDb1QmAltMqKKB9I1wy8JYOdchPRhpgF/GmjbzGmg2YFGQTv/Lb2iuOUyYmyXxLk -O9JOM9SZapWwPJ5hWmKXWZv3qpKblM/kwJrMvLb25H1wQmbu6a0161GPa+6eX0/gjuTta8hGcX4BeUty -X+h685tOrR/5HSy3PPjvenN9uL7/FK5h9UJkSmq/F4QERef2qY9OXW+DbCyleakrvR9d69K6OREZxlqY -H/BLLF3eA+HT0ubfU5GpiPoVxNGuqD2cqQjJcDlmn/DwXGfMjD2iTiPCk1f8Qg5jkam8hqTNVuB6/hS1 -F7qLtWe5Tfa3g1lzFI9J47lyjau/UGQ7om5jzr6Zsq/RTvTa1X7KG1OGwj/vKnBzPYsZFom13pO9KxsW -hGXr9V2mIv7JwAVB1b3rqC25hKi+XW8s3LR5IPmVvcYijRIZbLq4V1Wjxr6do/rX1Ky/ZYt/8Tp6RW7J -9TsqourvKFkYdyNlXwzec//TrUdyzsylqsGz8NeqfMvCLHwost0wLdNZEy2ypNC+8pPANjw3lbzZy8jH -tPTP//RVs9PmgD3Lpc7rRS2aDMdyHVICbr0NVWhstS97srgsL8gHqZU7QmVFlgdhnGKtU3r9DXoLQhgr -OmEihJJRuOOW1+UYga+opbdAAsYmw8DKk7T5wNfowD5YpDi0PyH4f/aaXtC+zgBr72VfMkGxk9ls0kpN -rR7BhpRCmTArUtsa+QgLasJf8VMB3uwNLfjMfldkqYqDWjaupx47q9bniWkLJPR9GcuurTlm9hl+RC37 -Q44BtP+xQPAIY5nTXpd1VBC54r7pH5iTmhPRfhyjAamVJP63pKLuixFgGca7kky4ftAFxUTF33It4yxy -1aajvOxJdHN9jovLx66KhAJ5kG17T1jKvCHoe5oxT8H/80v7nUeQUf+5Dh3Eo7SPvHTerGK2nvD2fEGs -3IwbCT9toyaW0s3Vfo4hHun4iIHUodzhbHjZ9jI7HwfEEi/XeQ3lMOJ+czMkWa5vN4m2Kt2BXOtDN9es -4E5Y5rzd5N2DUO1xQ+8jdU+pfv9iO6+Id+NkLy4yW5xPiXlMbIFUY8ybnhCf7osiZh528cgDYKtEL9Ku -loFKdVKzhX3fwcT0tU5EmWZ+qOUQDskizRP7Y4zzx34d8LDeSqvX/FSU/OuvvhJ45LadNx3zTOzJMC8f -Gv6TQtr+4qjx5oA3WSVp26Vv/wYM93INKYyhmzIY96SOq7KLehEWez/Xaog9pXZrTaolHbOi4geKf1Y4 -xnO6F/qyiccDXG3R/DOH+y0RO96QLBP4mqydqUvXS+K2fDVXX1E1SNvybuaZVpytG+t4aINWNP4MM3td -vPylVVveTpSy/A5RSqG3POsWYW23Vi+mFG2Ml9Iluyzl7EglsW7hNdM2ck4phqPP7DCLCvF/AQAA///b -0b1pmioAAA== +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 `, }, @@ -6386,8 +6386,8 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== "/eonza-assets/themes/default/templates/index.tpl": { name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", - size: 26694, - modtime: 1612438635, + size: 26835, + modtime: 1612931242, compressed: ` H4sIAAAAAAAC/9R9bZfbtrHwd/2KWba2pKwo7Tpum0darp9epz73JU1yrt3m9OzRaSASlLBLAbwEJK3q 6L/fgzcSICGt1nZv23zIisBgMG+YGQxA+ubi2x/efvjLj3+AlVgXt70b+wej7BZ6ADdrLBCkK1RxLJJo @@ -6462,42 +6462,43 @@ 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 -iW4m5h91meh/Laj3vwEAAP//BZuIB0ZoAAA= +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 +AA== `, }, @@ -6534,34 +6535,34 @@ TNx05YjdXTtLFep45G82RjfrD7Ze600HeNT/wIvcfwDv7wAAAP//+8FPUhwMAAA= "/eonza-assets/themes/default/templates/login.tpl": { name: "login.tpl", local: "../eonza-assets/themes/default/templates/login.tpl", - size: 3681, - modtime: 1608125964, + size: 3719, + modtime: 1612948300, compressed: ` -H4sIAAAAAAAC/5RX3Y7buBW+91OcMBjYk4ykmc1OE2gst0WyvVqgC2xaoBgMClo8kpihSIKk/LNZv3tB -irIle7ab+MYkz//hx4/U8tWnf378/J9ffoLGtWI1Ww5/SNkKZgDLFh2FsqHGoitI56rkA1kdBZK2WJAN -x61WxhEolXQoXUG2nLmmYLjhJSZhcsMld5yKxJZUYHGX3vZ+HHcCV4+PkP5d6/Szn8HT0zLr172G4PIZ -DIqC8FJJAo3BqiBZRTd+nvJSEXB7jQXhLa0x2yVBr8//ZGwbZVzZOfg+L2dO3F6gbRDd0UNpbbbp0PFq -n7ZcpqW132hVKenoFq1q8TstUcnf6En/VZIEk16jcU7bPMs6i+k4RKnazKBAatFmm/v0Nr17F7xRIYKv -i5BJspotswCG2XKt2H41WzK+Ac6gAEK1JuDjx99yk1CtxwteF4K/gjTI68blcHd7e/UAjFst6D6HSuDu -4UtnffuSCJ8cSpQOzQMVvJYJd9ja49rJffitaflcG9VJlpRKKJPD67IsH8gxjZBEzKGlux6MOfzl9lbv -Hlouh4V3937hBXdVVT2slWFocrjTO7BKcAavKaWjXDRljMs6hx8MtnBnsB0Jh2K/uda45PUTxg2WjiuZ -Q6lE18pRbQAwGo4r/f/9/eOQLTU1l8laOafavpppvCVva7CmLEgWzonNhKpV8uOHVMuaDOFjT3/8oHcP -cePDeOpqlK/HaWL5bxhjDs1///79kJPAysOnz+jx8UQXni0Y30xcXyxsEoc7l1QcBZtAaJO0innca2rt -VhlGIqsd5xP1nGqNkgVyCJyyvYO/wryiCe5xDvkwTKygtpmTM7gC5D3JHC19WsFuiHdmI+jaZ3c1iK+m -YtU5wSWys87/ENA8VW24Z2YCk8W/lYKXz7GqIa0CXoXB2H61zMY9PGsuFWhc5E80RhkCm8T7GKars0Zc -cbmhgjNtt1eTjYu+JvrLTbJ2EgIoCqINb6nZk5h7QWy3brkjqyuhai6vvI+1k1MPFPKeHQ1apwxquyXg -qKn9tfbfBoUmJ5YIeHNK53CX3veAu6qUqZXz6S4zemKXCdBewGHkxChZ2tJw7eIB+hIujkD9XyxZLbNe -+rLa8X75E1W648q+oDhormYziVv4d4eLryHT6DuHuOwnUQThrrQ5fD3W5Bf8YQ1An99kGfz+ux/+uqnn -UelwEwaH6/4fRQ7z11TreT9n1NEcqNafqKP9UouuUWwS5xn3vxhVorUL3KB01yNZyKOCXpA+4/6jYghF -AXfvztX8zzXcpj1GFtfT++NwnMWkAWDQHBddweJVcDOcwmkcg64zcnbpNdiEAwAFVFRYPIp8Yx1UyrS+ -D1CE9v8jTsd5DiqpRbc4scQNTBM66gcALM7b0LfY04yybn5zJu2M36SMap6FM3Sh0G/akMqZ8HAKnroG -5cKg1UpahGIFX8d8Exo5SFPvtO/O5bYJdMBiVz5Rh+c7B8B8Qz7zFhcsrePoGt7CPbzxj4xbyN7AvcUS -3mQXtt477jQ3aP1LJg4LAm+BpU796/PHX53hsn4hqiq71sOuVOqZo7duqG04C8bT0jiDt0AevGAI5uea -uqbIyLnnLZdMbVODrdrgTx7aP3PrUKJZzJ9xz9RWDpt+OhwX+WVZ9CNUSf2zAQqYZ/Pz+qMwNSgUZYvr -kfwAKCyebcgEyM50OJF6LCuBqVD14qXdnb144o65D4QRyUB10iEbHcBYEWXsO9sSPZaq1Z1DNuaX0zXg -A03vRI8ObbCCAh4f05+prJ+eLsinVyhgjnJ+Cd9oPp//Ad2cWAOO7/Xtdpv2D3tl6syjJnh5C0CYKm0W -U06GI5/6jzVyzmCH2eF6Nqs6GR6NA8+eioxRTwmHmz7v2el07IcgOcxHZBC2Mx8x2WF2mI3vmCx+JWT9 -h+TsfwEAAP//D3J6AGEOAAA= +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 `, }, @@ -6591,29 +6592,47 @@ AP//ZTn8v04GAAA= "/eonza-assets/themes/default/templates/pro.tpl": { name: "pro.tpl", local: "../eonza-assets/themes/default/templates/pro.tpl", - size: 3285, - modtime: 1612438635, + size: 8110, + modtime: 1612958789, compressed: ` -H4sIAAAAAAAC/9xWz5Pbtg6++6/AKk/Pdp5p2VkneSNZmnba7vTYQ6fnUCJscUKJLElpvbPx/94hJduS -12l+TE/NJRYIfAA+fAR3awrNlQX7pDANLB5sdCAWKyWoxQA4SwOlZZBNALYtKWRtKa9Rg7FPAtOgogfy -yJktY1iv3mzUISmR70sbr1erMFGUMV7viZUqhs1KHRIPBLC9I6QlVkqRUw0Ma4OwE9SmVjfYuXi3luS2 -hkIKqV0dvKL6KYBCUGPSoDqQNwHEjBuaC2RpcFeUtN4jC+CHQvDiYxoY2mJwwesxeSFrELizYCoqRLaj -xDluo+4o+2+dG5WEzhZeaol8MX390bl6QnpTSyzNDbSkkgxFGliaB6NWLM2zcI81aipCj0DzARzNTf/F -eAstMaV89ChpugpOfPfsQkFFMXMcA4H16p06zBPZot4J+UieYtpYmQTg4Txaz5iyZNPVtG0JFahPczdN -UaAxwTktLSxvMQAnCJCNFbxGloXGUtuYMIawc/BteKBbqKi11BfMu5ugp+kyREWkdgMMhon68V5ncl31 -nOS0+LjXsqkZ8VgxvHp4ePj5l/cn/cWw1lglkEvNUBNNGW9M/H91SOAUsHn79sd3mwS6eXWOMazVAYwU -nMGr+/eb95uH5DzRbXmfhVZzKty4w21U3p+PFLSE79LAHy/dOWTpKsi2efb87I2MPh2P2yjPtpEahaEw -6Pw6aKxZeO3VXQnf+qG7sMRqWpud1FVcyxov6neZZ+t58LKcNIVVcH2vPOvaerdwJPfvSLv6TNr1zbRS -3ci6jRhvz5drsAj2GrG+rIEn8hYeS26REFdXkIWN2mvKUGn5GURnPe+ybLKNui2YTSbb869C1sbCb1pC -Cs8+/LQWY5i+UlpOF97KqKWzee/i/mm0ja4HBh9L8xhWi5Gtuw8x7KgwOD7ydMTwfBybdSPQxFfQXc4/ -G66RxdBS0SCkGdzddT8/fYJpeDoPp4sXsS3Vg7DnU/2K2j+oXlo0duZP5x0Ur1sqOPOmcApXFQ4+j5OB -oUJbSjaq3etEUT2/6oceuDQjy3KPdvYhoopHnpjow/9c3NjHlljPNBol3WviOnnRKd/B2WPp5rb0K2p+ -w9UPoeRm+R8tpXV+ldnfDE5uxnYkvjg6Tm4m8V1BCmN8b70d0EnnRURnHg/kiqaC2qKc+dIdSS977Lq6 -RA0mGr3uXtjZNWOO2DsP1T/BtygdnkMK7qkfc3cc5HwdnT/cO+wzRq8/M52ixOLjTx3ybDZ3fd0QkZLm -pCKD1vJ6bz4sOhipLJe1+XcoSsiCunaWGoWkbOaInn9pGn4H/SPCmSeD2fXi6f8rZKUa67bUmZ7Tc3gt -qX4JueeF2tk0PPmZcLoY3JllIZvaLuB+da52vHbcsUu4a+rCkTLKY6zUuCxkVXE7mzaKUYu/cytwuoBp -qLT7kyqczpNJFP1dyK8olI9otHBvznQwwbEOB4tMaXlW4YXpL2nuG/T2vVq7obOxxr5xAX31ghsI7qvF -lpyGfUwml2f8rwAAAP//T1+tsdUMAAA= +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 +puVhH6ed0/35PwEAAP//6KGSCq4fAAA= `, }, diff --git a/auth.go b/auth.go index 8d2c551..38c4ca6 100644 --- a/auth.go +++ b/auth.go @@ -25,8 +25,8 @@ type Auth struct { } type Claims struct { - Counter int64 - Username string + Counter int64 + UserID uint32 jwt.StandardClaims } @@ -64,8 +64,8 @@ func accessIP(curIP, originalIP string) bool { func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) (err error) { var ( - access string - isAccess bool + access string + isAccess, ok bool ) ip := c.RealIP() if len(cfg.Whitelist) > 0 { @@ -114,6 +114,8 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { mutex.Lock() defer mutex.Unlock() + userID := uint32(users.RootID) + if len(storage.Settings.PasswordHash) > 0 && (url == `/` || strings.HasPrefix(url, `/api`) || strings.HasPrefix(url, `/ws`) || strings.HasPrefix(url, `/task`)) { hashid := getCookie(c, "hashid") @@ -149,6 +151,7 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { if err == nil { if claims.Counter == storage.PassCounter { valid = token.Valid + userID = claims.UserID } } } @@ -163,8 +166,10 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { if firstRun && url == `/` { c.Request().URL.Path = `install` } - // TODO: JWT user - user := users.Users[users.RootID] + var user users.User + if user, ok = users.Users[userID]; !ok { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } lang := LangDefCode if IsScript { lang = scriptTask.Header.Lang @@ -192,28 +197,34 @@ func clearSessions() { } func loginHandle(c echo.Context) error { - var response ResponseLogin - - err := bcrypt.CompareHashAndPassword(storage.Settings.PasswordHash, []byte(c.FormValue("password"))) - if err == nil { - expirationTime := time.Now().Add(30 * 24 * time.Hour) - claims := &Claims{ - Counter: storage.PassCounter, - Username: `root`, - StandardClaims: jwt.StandardClaims{ - ExpiresAt: expirationTime.Unix(), - }, - } - var token string - tok := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - token, err = tok.SignedString([]byte(cfg.HTTP.JWTKey + sessionKey)) + var ( + response ResponseLogin + err error + ) + + for _, user := range users.Users { + err = bcrypt.CompareHashAndPassword(user.PasswordHash, []byte(c.FormValue("password"))) if err == nil { - response.ID = lib.UniqueName(12) - clearSessions() - sessions[response.ID] = session{ - Token: token, - Created: time.Now(), + expirationTime := time.Now().Add(30 * 24 * time.Hour) + claims := &Claims{ + Counter: storage.PassCounter, + UserID: user.ID, + StandardClaims: jwt.StandardClaims{ + ExpiresAt: expirationTime.Unix(), + }, + } + var token string + tok := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + token, err = tok.SignedString([]byte(cfg.HTTP.JWTKey + sessionKey)) + if err == nil { + response.ID = lib.UniqueName(12) + clearSessions() + sessions[response.ID] = session{ + Token: token, + Created: time.Now(), + } } + break } } if err != nil { diff --git a/config.go b/config.go index abb497f..19ec38b 100644 --- a/config.go +++ b/config.go @@ -6,6 +6,7 @@ package main import ( "eonza/lib" + "eonza/users" "io/ioutil" "os" "path" @@ -183,21 +184,20 @@ func Install() { if err != nil { golog.Fatal(err) } - var userid uint32 - if userid, err = NewUser(`root`); err != nil { - golog.Fatal(err) + users.InitRoot(nil) + userSettings[users.RootID] = UserSettings{ + ID: users.RootID, + Lang: appInfo.Lang, + Favs: []Fav{ + {Name: `welcome`}, + {Name: `tests`}, + {Name: `Tools`, IsFolder: true, Children: []Fav{ + {Name: `copy-files`}, + {Name: `create-archive`}, + }}, + }, } - rootSettings := userSettings[userid] - rootSettings.Favs = []Fav{ - {Name: `welcome`}, - {Name: `tests`}, - {Name: `Tools`, IsFolder: true, Children: []Fav{ - {Name: `copy-files`}, - {Name: `create-archive`}, - }}, - } - userSettings[userid] = rootSettings - if err = SaveUser(userid); err != nil { + if err = SaveUser(users.RootID); err != nil { golog.Fatal(err) } if err = SaveStorage(); err != nil { diff --git a/users.go b/users.go index bfec6e2..605b9db 100644 --- a/users.go +++ b/users.go @@ -5,13 +5,9 @@ package main import ( - "encoding/hex" - "fmt" - "hash/crc32" "io/ioutil" "path/filepath" - "eonza/lib" es "eonza/script" "eonza/users" @@ -69,37 +65,6 @@ func LoadUsersSettings() error { return nil } -func NewUser(nickname string) (uint32, error) { - user := User{ - Nickname: nickname, - } - if !lib.ValidateSysName(nickname) { - return 0, fmt.Errorf(Lang(DefLang, `invalidfield`), Lang(DefLang, `nickname`)) - } - for _, item := range storage.Users { - if item.Nickname == nickname { - return 0, fmt.Errorf(Lang(DefLang, `errnickname`), nickname) - } - - } - private, public, err := lib.GenerateKeys() - if err != nil { - return 0, err - } - user.PublicKey = public - user.ID = crc32.ChecksumIEEE(private) - if err = ioutil.WriteFile(filepath.Join(cfg.Users.Dir, user.Nickname+`.key`), - []byte(hex.EncodeToString(private)), 0777 /*os.ModePerm*/); err != nil { - return 0, err - } - storage.Users[user.ID] = &user - userSettings[user.ID] = UserSettings{ - ID: user.ID, - Lang: appInfo.Lang, - } - return user.ID, nil -} - // AddHistoryEditor adds the history item to the user's settings func AddHistoryEditor(id uint32, name string) error { var ( diff --git a/users/users.go b/users/users.go index 9188b9a..ac6dbb9 100644 --- a/users/users.go +++ b/users/users.go @@ -11,13 +11,13 @@ const ( ) type Role struct { - ID uint32 - Name string - Allow string - Disallow string + ID uint32 `json:"id"` + Name string `json:"name"` + Allow string `json:"allow"` + Tasks int `json:"tasks"` + Notifications int `json:"notifications"` + // Disallow string // Scripts int - Tasks int - Notifications int // Settings int // Pro int } @@ -42,3 +42,36 @@ func InitRoot(psw []byte) { RootID: {ID: RootID, Nickname: RootUser, PasswordHash: psw, Role: RootID}, } } + +/* +func NewUser(nickname string) (uint32, error) { + user := User{ + Nickname: nickname, + } + if !lib.ValidateSysName(nickname) { + return 0, fmt.Errorf(Lang(DefLang, `invalidfield`), Lang(DefLang, `nickname`)) + } + for _, item := range storage.Users { + if item.Nickname == nickname { + return 0, fmt.Errorf(Lang(DefLang, `errnickname`), nickname) + } + + } + private, public, err := lib.GenerateKeys() + if err != nil { + return 0, err + } + user.PublicKey = public + user.ID = crc32.ChecksumIEEE(private) + if err = ioutil.WriteFile(filepath.Join(cfg.Users.Dir, user.Nickname+`.key`), + []byte(hex.EncodeToString(private)), 0777 os.ModePerm); err != nil { + return 0, err + } + storage.Users[user.ID] = &user + userSettings[user.ID] = UserSettings{ + ID: user.ID, + Lang: appInfo.Lang, + } + return user.ID, nil +} +*/ From 36553b098d602933db3ac118f37deb7f7787f9ab Mon Sep 17 00:00:00 2001 From: gentee Date: Fri, 12 Feb 2021 09:19:43 +0500 Subject: [PATCH 03/11] Refactored auth --- assets.go | 82 ++++++++++++++++++++++++++------------------------ auth.go | 12 +++++--- config.go | 8 ++--- main.go | 4 +-- make.g | 2 +- notpro.go | 24 ++++++++++++++- pro.go | 12 +++++++- server.go | 1 + users.go | 11 +++++-- users/users.go | 27 +++++++++++------ 10 files changed, 115 insertions(+), 68 deletions(-) diff --git a/assets.go b/assets.go index f843f39..9ae8ede 100644 --- a/assets.go +++ b/assets.go @@ -6592,47 +6592,49 @@ AP//ZTn8v04GAAA= "/eonza-assets/themes/default/templates/pro.tpl": { name: "pro.tpl", local: "../eonza-assets/themes/default/templates/pro.tpl", - size: 8110, - modtime: 1612958789, + size: 8815, + modtime: 1613017778, compressed: ` -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 -puVhH6ed0/35PwEAAP//6KGSCq4fAAA= +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 `, }, diff --git a/auth.go b/auth.go index 38c4ca6..6c1cac6 100644 --- a/auth.go +++ b/auth.go @@ -18,11 +18,13 @@ import ( "golang.org/x/crypto/bcrypt" ) -type Auth struct { +/*type Auth struct { echo.Context User *users.User Lang string -} +}*/ + +type Auth = users.Auth type Claims struct { Counter int64 @@ -114,7 +116,7 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { mutex.Lock() defer mutex.Unlock() - userID := uint32(users.RootID) + userID := uint32(users.XRootID) if len(storage.Settings.PasswordHash) > 0 && (url == `/` || strings.HasPrefix(url, `/api`) || strings.HasPrefix(url, `/ws`) || strings.HasPrefix(url, `/task`)) { @@ -167,7 +169,7 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { c.Request().URL.Path = `install` } var user users.User - if user, ok = users.Users[userID]; !ok { + if user, ok = GetUser(userID); !ok { return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") } lang := LangDefCode @@ -202,7 +204,7 @@ func loginHandle(c echo.Context) error { err error ) - for _, user := range users.Users { + for _, user := range GetUsers() { err = bcrypt.CompareHashAndPassword(user.PasswordHash, []byte(c.FormValue("password"))) if err == nil { expirationTime := time.Now().Add(30 * 24 * time.Hour) diff --git a/config.go b/config.go index 19ec38b..ac3a4ba 100644 --- a/config.go +++ b/config.go @@ -184,9 +184,9 @@ func Install() { if err != nil { golog.Fatal(err) } - users.InitRoot(nil) - userSettings[users.RootID] = UserSettings{ - ID: users.RootID, + users.InitUsers(nil) + userSettings[users.XRootID] = UserSettings{ + ID: users.XRootID, Lang: appInfo.Lang, Favs: []Fav{ {Name: `welcome`}, @@ -197,7 +197,7 @@ func Install() { }}, }, } - if err = SaveUser(users.RootID); err != nil { + if err = SaveUser(users.XRootID); err != nil { golog.Fatal(err) } if err = SaveStorage(); err != nil { diff --git a/main.go b/main.go index caf3efe..55a6586 100644 --- a/main.go +++ b/main.go @@ -14,7 +14,6 @@ import ( "time" "eonza/script" - "eonza/users" "github.com/kataras/golog" "github.com/labstack/echo/v4" @@ -99,7 +98,7 @@ func main() { return } hideConsole() - users.InitRoot(storage.Settings.PasswordHash) + ProInit(storage.Settings.PasswordHash) LoadUsersSettings() defer CloseLog() if err := LoadCustomAsset(cfg.AssetsDir, cfg.HTTP.Theme); err != nil { @@ -108,7 +107,6 @@ func main() { LoadNotifications() InitScripts() CreateSysTray() - ProInit() RunCron() e = RunServer(WebSettings{ Port: cfg.HTTP.Port, diff --git a/make.g b/make.g index 72bb170..9380520 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/notpro.go b/notpro.go index 403754e..142ffda 100644 --- a/notpro.go +++ b/notpro.go @@ -7,6 +7,7 @@ package main import ( + "eonza/users" "fmt" "github.com/labstack/echo/v4" @@ -14,7 +15,25 @@ import ( const Pro = false -func ProInit() { +var ( + Users map[uint32]users.User + Roles map[uint32]users.Role +) + +func ProInit(psw []byte) { + Roles, Users = users.InitUsers(psw) +} + +func GetUser(id uint32) (user users.User, ok bool) { + user, ok = Users[id] + return +} + +func GetUsers() []users.User { + user := Users[users.XRootID] + return []users.User{ + user, + } } func SetActive(active bool) error { @@ -24,3 +43,6 @@ func SetActive(active bool) error { func proSettingsHandle(c echo.Context) error { return jsonError(c, fmt.Errorf(`Unsupported`)) } + +func ProApi(e *echo.Echo) { +} diff --git a/pro.go b/pro.go index 6a7ad56..06a17b7 100644 --- a/pro.go +++ b/pro.go @@ -7,6 +7,7 @@ package main import ( + "eonza/users" "net/http" pro "github.com/gentee/eonza-pro" @@ -27,8 +28,13 @@ func SetActive(active bool) error { return pro.SetActive(active) } -func ProInit() { +func GetUser(id uint32) (user users.User, ok bool) { + return pro.GetUser(id) +} + +func ProInit(psw []byte) { pro.LoadPro(storage.Trial.Mode > 0) + } func proSettingsHandle(c echo.Context) error { @@ -38,3 +44,7 @@ func proSettingsHandle(c echo.Context) error { response.Trial = storage.Trial return c.JSON(http.StatusOK, &response) } + +func ProApi(e *echo.Echo) { + pro.ProApi(e) +} diff --git a/server.go b/server.go index 0c37854..e389646 100644 --- a/server.go +++ b/server.go @@ -271,6 +271,7 @@ func RunServer(options WebSettings) *echo.Echo { e.POST("/api/settings", saveSettingsHandle) e.POST("/api/setpsw", setPasswordHandle) e.POST("/api/favs", saveFavsHandle) + ProApi(e) } go func() { if IsScript { diff --git a/users.go b/users.go index 605b9db..67c5918 100644 --- a/users.go +++ b/users.go @@ -5,6 +5,7 @@ package main import ( + "fmt" "io/ioutil" "path/filepath" @@ -47,7 +48,7 @@ var ( func LoadUsersSettings() error { var err error - for _, item := range users.Users { + for _, item := range GetUsers() { var ( data []byte user UserSettings @@ -148,10 +149,14 @@ func SaveUser(id uint32) error { if err != nil { return err } + user, ok := GetUser(id) + if !ok { + return fmt.Errorf(`Access denied`) + } return ioutil.WriteFile(filepath.Join(cfg.Users.Dir, - users.Users[id].Nickname+UserExt), data, 0777 /*os.ModePerm*/) + user.Nickname+UserExt), data, 0777 /*os.ModePerm*/) } func RootUserSettings() UserSettings { - return userSettings[users.RootID] + return userSettings[users.XRootID] } diff --git a/users/users.go b/users/users.go index ac6dbb9..a35bc80 100644 --- a/users/users.go +++ b/users/users.go @@ -4,10 +4,15 @@ package users +import ( + echo "github.com/labstack/echo/v4" +) + const ( RootUser = `root` - RootID = 0 // Don't change. Must be zero RootRole = `admin` + XRootID = 1 + XAdminID = 1 ) type Role struct { @@ -29,18 +34,20 @@ type User struct { Role uint32 } -var ( - Users map[uint32]User - Roles []Role -) +type Auth struct { + echo.Context + User *User + Lang string +} -func InitRoot(psw []byte) { - Roles = []Role{ - {ID: RootID, Name: RootRole}, +func InitUsers(psw []byte) (map[uint32]Role, map[uint32]User) { + Roles := map[uint32]Role{ + XAdminID: {ID: XAdminID, Name: RootRole}, } - Users = map[uint32]User{ - RootID: {ID: RootID, Nickname: RootUser, PasswordHash: psw, Role: RootID}, + Users := map[uint32]User{ + XRootID: {ID: XRootID, Nickname: RootUser, PasswordHash: psw, Role: XAdminID}, } + return Roles, Users } /* From 75771944ae16cb7bccf36b28d73211271e95a2f5 Mon Sep 17 00:00:00 2001 From: gentee Date: Fri, 12 Feb 2021 11:00:43 +0500 Subject: [PATCH 04/11] Fixed set Password --- auth.go | 7 ++++++- config.go | 2 +- main.go | 1 + notpro.go | 8 ++++++++ pro.go | 4 ++++ settings.go | 21 ++++++++++++++------- 6 files changed, 34 insertions(+), 9 deletions(-) diff --git a/auth.go b/auth.go index 6c1cac6..32566c2 100644 --- a/auth.go +++ b/auth.go @@ -116,7 +116,12 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { mutex.Lock() defer mutex.Unlock() - userID := uint32(users.XRootID) + var userID uint32 + if IsScript { + userID = scriptTask.Header.UserID + } else { + userID = uint32(users.XRootID) + } if len(storage.Settings.PasswordHash) > 0 && (url == `/` || strings.HasPrefix(url, `/api`) || strings.HasPrefix(url, `/ws`) || strings.HasPrefix(url, `/task`)) { diff --git a/config.go b/config.go index ac3a4ba..e7456c7 100644 --- a/config.go +++ b/config.go @@ -184,7 +184,7 @@ func Install() { if err != nil { golog.Fatal(err) } - users.InitUsers(nil) + ProInit(nil) userSettings[users.XRootID] = UserSettings{ ID: users.XRootID, Lang: appInfo.Lang, diff --git a/main.go b/main.go index 55a6586..2456e88 100644 --- a/main.go +++ b/main.go @@ -65,6 +65,7 @@ func main() { if err = LoadCustomAsset(scriptTask.Header.AssetsDir, scriptTask.Header.HTTP.Theme); err != nil { golog.Fatal(err) } + ProInit(nil) e = RunServer(WebSettings{ Port: scriptTask.Header.HTTP.Port, Open: scriptTask.Header.HTTP.Open, diff --git a/notpro.go b/notpro.go index 142ffda..b97f66a 100644 --- a/notpro.go +++ b/notpro.go @@ -40,6 +40,14 @@ func SetActive(active bool) error { return nil } +func SetUserPassword(id uint32, hash []byte) error { + if user, ok := GetUser(id); ok { + user.PasswordHash = hash + Users[id] = user + } + return nil +} + func proSettingsHandle(c echo.Context) error { return jsonError(c, fmt.Errorf(`Unsupported`)) } diff --git a/pro.go b/pro.go index 06a17b7..a126a88 100644 --- a/pro.go +++ b/pro.go @@ -32,6 +32,10 @@ func GetUser(id uint32) (user users.User, ok bool) { return pro.GetUser(id) } +func SetUserPassword(id uint32, hash []byte) error { + return pro.SetUserPassword(id, hash) +} + func ProInit(psw []byte) { pro.LoadPro(storage.Trial.Mode > 0) diff --git a/settings.go b/settings.go index 971c28d..37cf58a 100644 --- a/settings.go +++ b/settings.go @@ -5,6 +5,7 @@ package main import ( + "eonza/users" "net/http" "github.com/labstack/echo/v4" @@ -62,16 +63,17 @@ func setPasswordHandle(c echo.Context) error { err error hash []byte ) + user := c.(*Auth).User if cfg.playground { - return jsonError(c, Lang(GetLangId(c.(*Auth).User), `errplaypsw`)) + return jsonError(c, Lang(GetLangId(user), `errplaypsw`)) } if err = c.Bind(&psw); err != nil { return jsonError(c, err) } - if len(storage.Settings.PasswordHash) > 0 { - err = bcrypt.CompareHashAndPassword(storage.Settings.PasswordHash, []byte(psw.CurPassword)) + if len(user.PasswordHash) > 0 { + err = bcrypt.CompareHashAndPassword(user.PasswordHash, []byte(psw.CurPassword)) if err != nil { - return jsonError(c, Lang(GetLangId(c.(*Auth).User), `invalidpsw`)) + return jsonError(c, Lang(GetLangId(user), `invalidpsw`)) } } if len(psw.Password) > 0 { @@ -80,11 +82,16 @@ func setPasswordHandle(c echo.Context) error { return jsonError(c, err) } } - storage.Settings.PasswordHash = hash - storage.PassCounter++ - if err = SaveStorage(); err != nil { + if err = SetUserPassword(user.ID, hash); err != nil { return jsonError(c, err) } + if user.ID == users.XRootID { + storage.Settings.PasswordHash = hash + storage.PassCounter++ + if err = SaveStorage(); err != nil { + return jsonError(c, err) + } + } return jsonSuccess(c) } From 525913692c985698f89d5ec677181b3b39e00cc9 Mon Sep 17 00:00:00 2001 From: gentee Date: Fri, 12 Feb 2021 19:26:17 +0500 Subject: [PATCH 05/11] Refactored auth --- api.go | 6 +++++- auth.go | 5 +++++ make.g | 2 +- pro.go | 7 +++++-- script/encoding.go | 3 +++ storage.go | 3 ++- users/users.go | 4 ++-- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/api.go b/api.go index bdcb519..b94529c 100644 --- a/api.go +++ b/api.go @@ -133,6 +133,7 @@ func runHandle(c echo.Context) error { title = val } } + user := c.(*Auth).User header := script.Header{ Name: name, Title: title, @@ -142,7 +143,10 @@ func runHandle(c echo.Context) error { Console: console, IsPlayground: cfg.playground, IP: c.RealIP(), - UserID: c.(*Auth).User.ID, + UserID: user.ID, + RoleID: user.RoleID, + PasswordHash: user.PasswordHash, + IsPro: storage.Trial.Mode > TrialOff, Constants: storage.Settings.Constants, Lang: langCode, TaskID: lib.RndNum(), diff --git a/auth.go b/auth.go index 32566c2..0e2c9de 100644 --- a/auth.go +++ b/auth.go @@ -29,6 +29,7 @@ type Auth = users.Auth type Claims struct { Counter int64 UserID uint32 + RoleID uint32 jwt.StandardClaims } @@ -177,6 +178,9 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { if user, ok = GetUser(userID); !ok { return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") } + if IsScript && userID != scriptTask.Header.UserID && user.RoleID != users.XAdminID { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } lang := LangDefCode if IsScript { lang = scriptTask.Header.Lang @@ -216,6 +220,7 @@ func loginHandle(c echo.Context) error { claims := &Claims{ Counter: storage.PassCounter, UserID: user.ID, + RoleID: user.RoleID, StandardClaims: jwt.StandardClaims{ ExpiresAt: expirationTime.Unix(), }, diff --git a/make.g b/make.g index 9380520..72bb170 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/pro.go b/pro.go index a126a88..3e6f64d 100644 --- a/pro.go +++ b/pro.go @@ -32,13 +32,16 @@ func GetUser(id uint32) (user users.User, ok bool) { return pro.GetUser(id) } +func GetUsers() []users.User { + return pro.GetUsers() +} + func SetUserPassword(id uint32, hash []byte) error { return pro.SetUserPassword(id, hash) } func ProInit(psw []byte) { - pro.LoadPro(storage.Trial.Mode > 0) - + pro.LoadPro(storage.Trial.Mode > TrialOff, psw, cfg.path) } func proSettingsHandle(c echo.Context) error { diff --git a/script/encoding.go b/script/encoding.go index a6d707c..2de077f 100644 --- a/script/encoding.go +++ b/script/encoding.go @@ -28,6 +28,9 @@ type Header struct { Constants map[string]string Lang string UserID uint32 + RoleID uint32 + PasswordHash []byte + IsPro bool IP string TaskID uint32 ServerPort int diff --git a/storage.go b/storage.go index db70669..22f49fe 100644 --- a/storage.go +++ b/storage.go @@ -25,6 +25,7 @@ const ( TrialDisabled = -1 TrialOff = 0 TrialOn = 1 + Licensed = 2 ) type Trial struct { @@ -101,7 +102,7 @@ func LoadStorage(psw string) { if err := zr.Close(); err != nil { golog.Fatal(err) } - if storage.Trial.Mode >= TrialOff && storage.Trial.Count > TrialDays { + if storage.Trial.Mode < Licensed && storage.Trial.Count > TrialDays { storage.Trial.Mode = TrialDisabled } if !storage.Settings.NotAskPassword { diff --git a/users/users.go b/users/users.go index a35bc80..d308306 100644 --- a/users/users.go +++ b/users/users.go @@ -31,7 +31,7 @@ type User struct { ID uint32 Nickname string PasswordHash []byte - Role uint32 + RoleID uint32 } type Auth struct { @@ -45,7 +45,7 @@ func InitUsers(psw []byte) (map[uint32]Role, map[uint32]User) { XAdminID: {ID: XAdminID, Name: RootRole}, } Users := map[uint32]User{ - XRootID: {ID: XRootID, Nickname: RootUser, PasswordHash: psw, Role: XAdminID}, + XRootID: {ID: XRootID, Nickname: RootUser, PasswordHash: psw, RoleID: XAdminID}, } return Roles, Users } From 1bdab185a48036683dd26ba37ed4e65623681acc Mon Sep 17 00:00:00 2001 From: gentee Date: Sat, 13 Feb 2021 20:49:41 +0500 Subject: [PATCH 06/11] Fixed Notifications with password --- api.go | 5 +- auth.go | 134 +++++++++++++++++++++++++-------------------- config.go | 2 +- main.go | 3 +- make.g | 2 +- notpro.go | 23 ++++++-- pro.go | 8 ++- script/encoding.go | 6 +- server.go | 12 +++- task.go | 2 +- taskmanager.go | 2 +- users/users.go | 8 ++- 12 files changed, 124 insertions(+), 83 deletions(-) diff --git a/api.go b/api.go index b94529c..e6f6b59 100644 --- a/api.go +++ b/api.go @@ -143,9 +143,8 @@ func runHandle(c echo.Context) error { Console: console, IsPlayground: cfg.playground, IP: c.RealIP(), - UserID: user.ID, - RoleID: user.RoleID, - PasswordHash: user.PasswordHash, + User: *user, + ClaimKey: cfg.HTTP.JWTKey + sessionKey, IsPro: storage.Trial.Mode > TrialOff, Constants: storage.Settings.Constants, Lang: langCode, diff --git a/auth.go b/auth.go index 0e2c9de..ea3f4f4 100644 --- a/auth.go +++ b/auth.go @@ -27,7 +27,7 @@ import ( type Auth = users.Auth type Claims struct { - Counter int64 + Counter uint32 UserID uint32 RoleID uint32 jwt.StandardClaims @@ -117,74 +117,88 @@ func AuthHandle(next echo.HandlerFunc) echo.HandlerFunc { mutex.Lock() defer mutex.Unlock() - var userID uint32 + var ( + userID uint32 + user users.User + valid bool + ) + lang := LangDefCode + claims := &Claims{} if IsScript { - userID = scriptTask.Header.UserID + user = scriptTask.Header.User + if len(user.PasswordHash) > 0 { + jwtData := getCookie(c, "jwt") + if len(jwtData) > 0 { + token, err := jwt.ParseWithClaims(jwtData, claims, + func(token *jwt.Token) (interface{}, error) { + return []byte(scriptTask.Header.ClaimKey), nil + }) + if err == nil { + if (claims.UserID == user.ID && claims.Counter == user.PassCounter) || + claims.RoleID == users.XAdminID { + valid = token.Valid + } + } + } + if !valid { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } + } + lang = scriptTask.Header.Lang } else { userID = uint32(users.XRootID) - } - - if len(storage.Settings.PasswordHash) > 0 && (url == `/` || strings.HasPrefix(url, `/api`) || - strings.HasPrefix(url, `/ws`) || strings.HasPrefix(url, `/task`)) { - hashid := getCookie(c, "hashid") - jwtData := getCookie(c, "jwt") - if len(hashid) > 0 { - if item, ok := sessions[hashid]; ok { + if len(storage.Settings.PasswordHash) > 0 && (url == `/` || strings.HasPrefix(url, `/api`) || + strings.HasPrefix(url, `/ws`) || strings.HasPrefix(url, `/task`)) { + hashid := getCookie(c, "hashid") + jwtData := getCookie(c, "jwt") + if len(hashid) > 0 { + if item, ok := sessions[hashid]; ok { + c.SetCookie(&http.Cookie{ + Name: "jwt", + Value: item.Token, + Expires: time.Now().Add(30 * 24 * time.Hour), + HttpOnly: true, + }) + jwtData = item.Token + delete(sessions, hashid) + } c.SetCookie(&http.Cookie{ - Name: "jwt", - Value: item.Token, - Expires: time.Now().Add(30 * 24 * time.Hour), - HttpOnly: true, + Name: "hashid", + Value: "", + Path: "/", + Expires: time.Unix(0, 0), }) - jwtData = item.Token - delete(sessions, hashid) } - c.SetCookie(&http.Cookie{ - Name: "hashid", - Value: "", - Path: "/", - Expires: time.Unix(0, 0), - }) - } - var valid bool - if len(jwtData) > 0 { - claims := &Claims{} - token, err := jwt.ParseWithClaims(jwtData, claims, - func(token *jwt.Token) (interface{}, error) { - /* if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - */ - return []byte(cfg.HTTP.JWTKey + sessionKey), nil - }) - if err == nil { - if claims.Counter == storage.PassCounter { - valid = token.Valid - userID = claims.UserID + if len(jwtData) > 0 { + token, err := jwt.ParseWithClaims(jwtData, claims, + func(token *jwt.Token) (interface{}, error) { + /* if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { + return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) + */ + return []byte(cfg.HTTP.JWTKey + sessionKey), nil + }) + if err == nil { + if user, ok = GetUser(claims.UserID); ok && claims.Counter == user.PassCounter { + valid = token.Valid + userID = claims.UserID + } } } - } - if !valid { - if url == `/` { - c.Request().URL.Path = `login` - } else if url != `/api/login` && url != `/api/taskstatus` && url != `/api/sys` { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + if !valid { + if url == `/` { + c.Request().URL.Path = `login` + } else if url != `/api/login` && url != `/api/taskstatus` && url != `/api/sys` && + url != `/api/notification` { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } } } - } - if firstRun && url == `/` { - c.Request().URL.Path = `install` - } - var user users.User - if user, ok = GetUser(userID); !ok { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") - } - if IsScript && userID != scriptTask.Header.UserID && user.RoleID != users.XAdminID { - return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") - } - lang := LangDefCode - if IsScript { - lang = scriptTask.Header.Lang - } else { + if firstRun && url == `/` { + c.Request().URL.Path = `install` + } + if user, ok = GetUser(userID); !ok { + return echo.NewHTTPError(http.StatusUnauthorized, "Unauthorized") + } if u, ok := userSettings[user.ID]; ok { lang = u.Lang } @@ -218,7 +232,7 @@ func loginHandle(c echo.Context) error { if err == nil { expirationTime := time.Now().Add(30 * 24 * time.Hour) claims := &Claims{ - Counter: storage.PassCounter, + Counter: user.PassCounter, UserID: user.ID, RoleID: user.RoleID, StandardClaims: jwt.StandardClaims{ diff --git a/config.go b/config.go index e7456c7..a444878 100644 --- a/config.go +++ b/config.go @@ -184,7 +184,7 @@ func Install() { if err != nil { golog.Fatal(err) } - ProInit(nil) + ProInit(nil, 0) userSettings[users.XRootID] = UserSettings{ ID: users.XRootID, Lang: appInfo.Lang, diff --git a/main.go b/main.go index 2456e88..6d0aa74 100644 --- a/main.go +++ b/main.go @@ -65,7 +65,6 @@ func main() { if err = LoadCustomAsset(scriptTask.Header.AssetsDir, scriptTask.Header.HTTP.Theme); err != nil { golog.Fatal(err) } - ProInit(nil) e = RunServer(WebSettings{ Port: scriptTask.Header.HTTP.Port, Open: scriptTask.Header.HTTP.Open, @@ -99,7 +98,7 @@ func main() { return } hideConsole() - ProInit(storage.Settings.PasswordHash) + ProInit(storage.Settings.PasswordHash, uint32(storage.PassCounter)) LoadUsersSettings() defer CloseLog() if err := LoadCustomAsset(cfg.AssetsDir, cfg.HTTP.Theme); err != nil { diff --git a/make.g b/make.g index 72bb170..9380520 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/notpro.go b/notpro.go index b97f66a..360b185 100644 --- a/notpro.go +++ b/notpro.go @@ -9,6 +9,7 @@ package main import ( "eonza/users" "fmt" + "sync" "github.com/labstack/echo/v4" ) @@ -16,12 +17,13 @@ import ( const Pro = false var ( - Users map[uint32]users.User - Roles map[uint32]users.Role + Users map[uint32]users.User + Roles map[uint32]users.Role + proMutex = &sync.Mutex{} ) -func ProInit(psw []byte) { - Roles, Users = users.InitUsers(psw) +func ProInit(psw []byte, counter uint32) { + Roles, Users = users.InitUsers(psw, counter) } func GetUser(id uint32) (user users.User, ok bool) { @@ -41,13 +43,26 @@ func SetActive(active bool) error { } func SetUserPassword(id uint32, hash []byte) error { + proMutex.Lock() + defer proMutex.Unlock() if user, ok := GetUser(id); ok { + user.PassCounter++ user.PasswordHash = hash Users[id] = user } return nil } +func IncPassCounter(id uint32) error { + proMutex.Lock() + defer proMutex.Unlock() + if user, ok := GetUser(id); ok { + user.PassCounter++ + Users[id] = user + } + return nil +} + func proSettingsHandle(c echo.Context) error { return jsonError(c, fmt.Errorf(`Unsupported`)) } diff --git a/pro.go b/pro.go index 3e6f64d..5cf4736 100644 --- a/pro.go +++ b/pro.go @@ -40,8 +40,12 @@ func SetUserPassword(id uint32, hash []byte) error { return pro.SetUserPassword(id, hash) } -func ProInit(psw []byte) { - pro.LoadPro(storage.Trial.Mode > TrialOff, psw, cfg.path) +func IncPassCounter(id uint32) error { + return pro.IncPassCounter(id) +} + +func ProInit(psw []byte, counter uint32) { + pro.LoadPro(storage.Trial.Mode > TrialOff, psw, counter, cfg.path) } func proSettingsHandle(c echo.Context) error { diff --git a/script/encoding.go b/script/encoding.go index 2de077f..f635a18 100644 --- a/script/encoding.go +++ b/script/encoding.go @@ -11,6 +11,7 @@ import ( "os/exec" "eonza/lib" + "eonza/users" "github.com/gentee/gentee" ) @@ -27,9 +28,8 @@ type Header struct { SourceCode []byte Constants map[string]string Lang string - UserID uint32 - RoleID uint32 - PasswordHash []byte + User users.User + ClaimKey string IsPro bool IP string TaskID uint32 diff --git a/server.go b/server.go index e389646..5a5f5bc 100644 --- a/server.go +++ b/server.go @@ -14,6 +14,7 @@ import ( "time" "eonza/lib" + "eonza/users" "github.com/kataras/golog" "github.com/labstack/echo/v4" @@ -178,10 +179,17 @@ func fileHandle(c echo.Context) error { } func logoutHandle(c echo.Context) error { - storage.PassCounter++ - if err := SaveStorage(); err != nil { + var err error + user := c.(*Auth).User + if err = IncPassCounter(user.ID); err != nil { return jsonError(c, err) } + if user.ID == users.XRootID { + storage.PassCounter++ + if err = SaveStorage(); err != nil { + return jsonError(c, err) + } + } return c.JSON(http.StatusOK, Response{Success: true}) } diff --git a/task.go b/task.go index 0982272..24847da 100644 --- a/task.go +++ b/task.go @@ -183,7 +183,7 @@ func initTask() script.Settings { task = Task{ ID: scriptTask.Header.TaskID, - UserID: scriptTask.Header.UserID, + UserID: scriptTask.Header.User.ID, Status: TaskActive, Name: scriptTask.Header.Name, StartTime: time.Now().Unix(), diff --git a/taskmanager.go b/taskmanager.go index 9729c0f..c0d7471 100644 --- a/taskmanager.go +++ b/taskmanager.go @@ -138,7 +138,7 @@ func NewTask(header script.Header) (err error) { Status: TaskActive, Name: header.Name, StartTime: time.Now().Unix(), - UserID: header.UserID, + UserID: header.User.ID, Port: header.HTTP.Port, } if err = SaveTrace(&task); err != nil { diff --git a/users/users.go b/users/users.go index d308306..0442bd2 100644 --- a/users/users.go +++ b/users/users.go @@ -29,9 +29,10 @@ type Role struct { type User struct { ID uint32 + RoleID uint32 + PassCounter uint32 Nickname string PasswordHash []byte - RoleID uint32 } type Auth struct { @@ -40,12 +41,13 @@ type Auth struct { Lang string } -func InitUsers(psw []byte) (map[uint32]Role, map[uint32]User) { +func InitUsers(psw []byte, counter uint32) (map[uint32]Role, map[uint32]User) { Roles := map[uint32]Role{ XAdminID: {ID: XAdminID, Name: RootRole}, } Users := map[uint32]User{ - XRootID: {ID: XRootID, Nickname: RootUser, PasswordHash: psw, RoleID: XAdminID}, + XRootID: {ID: XRootID, Nickname: RootUser, PasswordHash: psw, RoleID: XAdminID, + PassCounter: counter}, } return Roles, Users } From 0a346e86651b0de7b833cdbdb1c50d07b5c5bdb2 Mon Sep 17 00:00:00 2001 From: gentee Date: Mon, 15 Feb 2021 14:59:42 +0500 Subject: [PATCH 07/11] Added users to pro --- assets.go | 340 +++++++++++++++++++++++++------------------------ make.g | 2 +- users/users.go | 10 +- 3 files changed, 182 insertions(+), 170 deletions(-) diff --git a/assets.go b/assets.go index 9ae8ede..d1d0e00 100644 --- a/assets.go +++ b/assets.go @@ -502,136 +502,137 @@ tM82Mx9MOQ2LZxN+0W+K7kKpvfSrPgALfqQPVkG/0nuG+2FqPdavaUQnNEp3k3J5V97PLL39lN683tMf "/eonza-assets/languages/en.yaml": { name: "en.yaml", local: "../eonza-assets/languages/en.yaml", - size: 6852, - modtime: 1612958361, + size: 6876, + modtime: 1613378846, compressed: ` -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 +3BoAAA== `, }, "/eonza-assets/languages/ru.yaml": { name: "ru.yaml", local: "../eonza-assets/languages/ru.yaml", - size: 11007, - modtime: 1612958374, + size: 11038, + modtime: 1613378856, compressed: ` -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 `, }, @@ -6592,49 +6593,60 @@ AP//ZTn8v04GAAA= "/eonza-assets/themes/default/templates/pro.tpl": { name: "pro.tpl", local: "../eonza-assets/themes/default/templates/pro.tpl", - size: 8815, - modtime: 1613017778, + size: 15629, + modtime: 1613382420, compressed: ` -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 +ynvs/wUAAP///mVBOw09AAA= `, }, diff --git a/make.g b/make.g index 9380520..72bb170 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/users/users.go b/users/users.go index 0442bd2..4199cca 100644 --- a/users/users.go +++ b/users/users.go @@ -28,11 +28,11 @@ type Role struct { } type User struct { - ID uint32 - RoleID uint32 - PassCounter uint32 - Nickname string - PasswordHash []byte + ID uint32 `json:"id"` + RoleID uint32 `json:"roleid"` + PassCounter uint32 `json:"-"` + Nickname string `json:"nickname"` + PasswordHash []byte `json:"-"` } type Auth struct { From be58605f10b5b830842427b00ca4642638c3f4c1 Mon Sep 17 00:00:00 2001 From: gentee Date: Tue, 16 Feb 2021 11:15:01 +0500 Subject: [PATCH 08/11] Added Hex Encdoing script --- assets.go | 362 ++++++++++++++++++++++++++------------------- deflists.go | 29 ++++ go.mod | 2 +- make.g | 2 +- render.go | 2 + script/embedded.go | 1 + script/text.go | 42 ++++++ 7 files changed, 286 insertions(+), 154 deletions(-) create mode 100644 deflists.go create mode 100644 script/text.go diff --git a/assets.go b/assets.go index d1d0e00..7f077f1 100644 --- a/assets.go +++ b/assets.go @@ -686,6 +686,24 @@ HZfWnGd/s8mFsdRlI0ABNdn2wzb9bO4qDR8UYJvK0hVZjf8KCM4Hp8E+kGpzny86rf6c9kopn9eaJGHI `, }, + "/eonza-assets/scripts/convert-text.yaml": { + name: "convert-text.yaml", + local: "../eonza-assets/scripts/convert-text.yaml", + size: 1060, + modtime: 1613454369, + compressed: ` +H4sIAAAAAAAC/6xTzYoTQRC+z1N8JIfdlSSCgkiDJxEfYBevS+9MTTLQ6Rm7e6KCh2xEPCh4FR/Ac1g2 +GrKbPEP1G0nPTMaJP6Dgrfm+qq+qvqq25Fymx1ZEgJZTEohzPSPjho5eughwmVMkcNQ/D3T/KAIK6SYB +GVmXqOyif7c/CsEVl5CNq+jwqBCVjxXNSAk8iIBSm1ILOFNSBExIFb9UDKCSeixgyqiQRk6tiIZNdzNp +wqPb2KjBqmruVUEC9yIgL1yW62owwNDzMjOUNJX3atbEByNaE3dU7v+skunMZVIJlC4dPqygVMmxFegl +lMpSuVE8kWYqC9trayRkD30MwH+vYsiWys2kOXCmRf/Bm2B9xZCu+fN6p4/rLSFsCRfkXhBpJFmakiHt +QDrOk3BJbY4TOJNmTA5PGq6m6ob3cmf10oFgvsBpXpqYuhmmPGiDP/OOt3zFKz/3C177Oe/4ipd+4T/A +L3jFG3/pF+BbXvFXvvZv4Oe85G98w2v/jrf+Pd/yGrzhHV+3+RteBrjbPH/hFd/wqlL/+JuE7jh/2VZn +Uv7kL/3bSnP7pwJxnpDA62EEWGdgyOHR3rlg3PFTcs+kOe41X6B3Mgg3PaiO7iQCshR32iOAwGkd30KD +oBkCSVn6wTdyDfs9AAD//4vS/1wkBAAA +`, + }, + "/eonza-assets/scripts/copy-file.yaml": { name: "copy-file.yaml", local: "../eonza-assets/scripts/copy-file.yaml", @@ -1231,6 +1249,25 @@ a/4K+vebo1rWBWk8I35u/Gi4yAM8nc9niXAUvB2P1a8AAAD//53d9+s3AgAA `, }, + "/eonza-assets/scripts/hex-encoding.yaml": { + name: "hex-encoding.yaml", + local: "../eonza-assets/scripts/hex-encoding.yaml", + size: 1209, + modtime: 1613453401, + compressed: ` +H4sIAAAAAAAC/4RTwW4TMRC9+yuemkNbREsBiYOliBPQO4Jr5WYniaVdb/B6o1TiUFKpICHBFfEFHEPV +iLRS8g3jP0L2bpdNGpU9rd6befPm2S7IOW0GhRSAURlJDGlyQKaXJ9oMBOC0S0lit3MS6M6uAEbKDQNy +WLgk1aedJ53Du4bIJ1T0Ykf4iUiaD1IaUyrxQgClsaWRcLYkAQwpHd2bGsBUmYGELcVIWZUVUhzUDsfK +hp+2ucMai9Pc2YgkngkgHzmdm7gcYOlDqS0l9eQ7ta27ru1T6T3f1NNGO61SiZ2jnQhUddq4inaU1ZUH +LWWXD2kSZcM3VmlJ/xTahX2bZ9tKn+401i0VZerGyq5F0aBrYYQ0ox0ylamT6piOaaIS6ulMpU0UUCZB +Qk0uQBOIxCvTxmuXEq9tnoVTbMQKZ4OUy3F65qioyivfxzTZkImp1CKxPPTdVxOALdfs8y+e+09+ykue +8bW/5Jmf8tyf88J/5iWveA6+5RVf88Kf84qveMZLXgR4Ab7m+XZ2c2n+ySte8lWQ9lOe+Ute+O8bEfAP +/gP/5T+GbhDoOO42eLgC/+YZ3/ip/7oZ0kPm6sji0DuFoPawAX/hv7UM+AvRyxOS+CgQMkZhe+jiDbn3 +yu7Vj2q/5lw2EoDuN/fkJSQCim7g996ZY5rsFba3HzooLQiypgNxWvYbUvfxqLmn6HZxhNZ1Rrf1xt9W +XhrycZDcF38DAAD//ydlGcy5BAAA +`, + }, + "/eonza-assets/scripts/httprequest.yaml": { name: "httprequest.yaml", local: "../eonza-assets/scripts/httprequest.yaml", @@ -1681,31 +1718,35 @@ TYlcN6t5dwxXFNu9aeP0y46A/cvpMLnXyHf5en0gwT+au+aeN/zEz/zI2+a+eUDzvfmWnr/4qXkA/+YN "/eonza-assets/scripts/set-variable.yaml": { name: "set-variable.yaml", local: "../eonza-assets/scripts/set-variable.yaml", - size: 3746, - modtime: 1609913836, + size: 4466, + modtime: 1613454179, compressed: ` -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 +dCeghQYbt/d3AAAA//9TyrPVchEAAA== `, }, @@ -6096,6 +6137,18 @@ cgu1+aUqv/5SHcKnB8B9tdxxXbQj+Lsx/NIudLJp6/t/AwAA//+x5qu0CxMAAA== `, }, + "/eonza-assets/themes/default/templates/deflists.tpl": { + name: "deflists.tpl", + local: "../eonza-assets/themes/default/templates/deflists.tpl", + size: 158, + modtime: 1613406562, + compressed: ` +H4sIAAAAAAAC/zSOsQrCQBBE+/2K+YAQ+xCtbASxEptjiiNZ5SA5JbfahPy7HK7d4zEPpi/Dkl52kBCW +mB+K9qj3cypWSBmeuRhGF9hjFQAIob3EWckOwYW3J9O5kKslm7Srw2slssEnTu+fulUit8ZbzSMplD9t +0u/81TcAAP//XY7JN54AAAA= +`, + }, + "/eonza-assets/themes/default/templates/dialogs.tpl": { name: "dialogs.tpl", local: "../eonza-assets/themes/default/templates/dialogs.tpl", @@ -6154,60 +6207,62 @@ pkwzv14p5QLGWkwn5HwBFM6rGZaYLoC+eOGarWXjUliDKv9c05uKw7+AMYULmMNXHcuMwmt600OZaVHK "/eonza-assets/themes/default/templates/dyncomp.tpl": { name: "dyncomp.tpl", local: "../eonza-assets/themes/default/templates/dyncomp.tpl", - size: 13852, - modtime: 1612438635, + size: 14008, + modtime: 1613454418, compressed: ` -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 +/5tJA5W4NgAA `, }, @@ -6387,8 +6442,8 @@ R9VBnCPRfL6JnY9CYbgIw7n9rrOwQHFxvlX+PwAA//9gxnsIdCIAAA== "/eonza-assets/themes/default/templates/index.tpl": { name: "index.tpl", local: "../eonza-assets/themes/default/templates/index.tpl", - size: 26835, - modtime: 1612931242, + size: 26861, + modtime: 1613401142, compressed: ` H4sIAAAAAAAC/9R9bZfbtrHwd/2KWba2pKwo7Tpum0darp9epz73JU1yrt3m9OzRaSASlLBLAbwEJK3q 6L/fgzcSICGt1nZv23zIisBgMG+YGQxA+ubi2x/efvjLj3+AlVgXt70b+wej7BZ6ADdrLBCkK1RxLJJo @@ -6427,79 +6482,79 @@ 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 -AA== +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 +y9pL7WgAAA== `, }, @@ -11496,6 +11551,7 @@ var _escDirs = map[string][]os.FileInfo{ _escData["/eonza-assets/scripts/assertions.yaml"], _escData["/eonza-assets/scripts/bash.yaml"], _escData["/eonza-assets/scripts/chdir.yaml"], + _escData["/eonza-assets/scripts/convert-text.yaml"], _escData["/eonza-assets/scripts/copy-file.yaml"], _escData["/eonza-assets/scripts/copy-files.yaml"], _escData["/eonza-assets/scripts/copy-to-clipboard.yaml"], @@ -11525,6 +11581,7 @@ var _escDirs = map[string][]os.FileInfo{ _escData["/eonza-assets/scripts/form.yaml"], _escData["/eonza-assets/scripts/get-clipboard.yaml"], _escData["/eonza-assets/scripts/get-webpage.yaml"], + _escData["/eonza-assets/scripts/hex-encoding.yaml"], _escData["/eonza-assets/scripts/httprequest.yaml"], _escData["/eonza-assets/scripts/if.eonza.yaml"], _escData["/eonza-assets/scripts/join-text.yaml"], @@ -11602,6 +11659,7 @@ var _escDirs = map[string][]os.FileInfo{ "../eonza-assets/themes/default/templates": { _escData["/eonza-assets/themes/default/templates/card.tpl"], _escData["/eonza-assets/themes/default/templates/cardlist.tpl"], + _escData["/eonza-assets/themes/default/templates/deflists.tpl"], _escData["/eonza-assets/themes/default/templates/dialogs.tpl"], _escData["/eonza-assets/themes/default/templates/dyncomp.tpl"], _escData["/eonza-assets/themes/default/templates/editor.tpl"], diff --git a/deflists.go b/deflists.go new file mode 100644 index 0000000..68402c5 --- /dev/null +++ b/deflists.go @@ -0,0 +1,29 @@ +// Copyright 2020 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 "html/template" + +type DefItem struct { + Title string + Value string +} + +type DefList struct { + Name template.JS + Items []DefItem +} + +var ( + defaultList = []DefList{ + { + Name: `charmaps`, + Items: []DefItem{ + {`utf-8`, `utf-8`}, + {`windows-1251`, `windows-1251`}, + }, + }, + } +) diff --git a/go.mod b/go.mod index 57535cc..f9882da 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( 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/text v0.3.4 // indirect + golang.org/x/text v0.3.4 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 ) diff --git a/make.g b/make.g index 72bb170..9380520 100755 --- a/make.g +++ b/make.g @@ -10,7 +10,7 @@ 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 "tray pro" -ldflags "-s -w -X main.VerType=%{vertype} -X main.CompileDate=%{Format(`YYYY-MM-DD`,Now())}" + $ go install -tags "tray" -ldflags "-s -w -X main.VerType=%{vertype} -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())}" $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza-dev/eonza $ cp ${GOPATH}/bin/eonza /home/ak/app/eonza/eonza diff --git a/render.go b/render.go index 8a18d05..253250e 100644 --- a/render.go +++ b/render.go @@ -36,6 +36,7 @@ type Render struct { Nfy *NfyResponse Update VerUpdate Pro bool + DefLists []DefList // ProSettings ProSettings // Port int /* Params map[string]string @@ -182,6 +183,7 @@ func RenderPage(c echo.Context, url string) (string, error) { render.Update = nfyData.Update render.Update.Notify = GetNewVersion(GetLangCode(c.(*Auth).User)) render.Pro = Pro + render.DefLists = defaultList data = render } diff --git a/script/embedded.go b/script/embedded.go index 394cd3b..b1291c5 100644 --- a/script/embedded.go +++ b/script/embedded.go @@ -157,6 +157,7 @@ var ( {Prototype: `SQLQuery(str,str,arr.str,str)`, Object: SQLQuery}, {Prototype: `SQLRow(str,str,arr.str,str)`, Object: SQLRow}, {Prototype: `SQLValue(str,str,arr.str,str)`, Object: SQLValue}, + {Prototype: `ConvertText(str,str,str) str`, Object: ConvertText}, // For gentee {Prototype: `YamlToMap(str) map`, Object: YamlToMap}, // {Prototype: `Subbuf(buf,int,int) buf`, Object: Subbuf}, diff --git a/script/text.go b/script/text.go new file mode 100644 index 0000000..c8dea59 --- /dev/null +++ b/script/text.go @@ -0,0 +1,42 @@ +// 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 script + +import ( + "bytes" + "fmt" + "io/ioutil" + "strings" + + "golang.org/x/text/encoding/ianaindex" + "golang.org/x/text/transform" +) + +func ConvertText(source, from, to string) (string, error) { + var b bytes.Buffer + if from != `utf-8` { + e, err := ianaindex.IANA.Encoding(from) + if err != nil { + return ``, err + } + toutf8 := transform.NewReader(strings.NewReader(source), e.NewDecoder()) + decBytes, _ := ioutil.ReadAll(toutf8) + source = string(decBytes) + } + fmt.Printf("FROM: %s\n", source) + if to != `utf-8` { + e, err := ianaindex.IANA.Encoding(to) + if err != nil { + return ``, err + } + toutf := transform.NewWriter(&b, e.NewEncoder()) + toutf.Write([]byte(source)) + toutf.Close() + source = b.String() + } + fmt.Printf("TO: %s\n", source) + + return source, nil +} From 092b37b57eaff174576d16217156d6c226f000bb Mon Sep 17 00:00:00 2001 From: gentee Date: Wed, 17 Feb 2021 16:03:26 +0500 Subject: [PATCH 09/11] Added Convert Text script --- assets.go | 126 ++++++++++++++++++++++++++++----------------- deflists.go | 18 ++++++- script/embedded.go | 13 +++++ script/text.go | 3 -- 4 files changed, 108 insertions(+), 52 deletions(-) diff --git a/assets.go b/assets.go index 7f077f1..6554d2d 100644 --- a/assets.go +++ b/assets.go @@ -385,32 +385,44 @@ IYiGnOcfAAA= "/eonza-assets/init/test-texts.yaml": { name: "test-texts.yaml", local: "../eonza-assets/init/test-texts.yaml", - size: 4199, - modtime: 1611291182, + size: 7226, + modtime: 1613559688, compressed: ` -H4sIAAAAAAAC/6RX227bRhO+11MMSBiyElO/Do7iEDB+oIekAdKmaIP2xoC9IofSoiSX3V26dhwDsXOZ -AnmEFn2CtGgAN23jV1i+UbHLg0mJciLHN6Z2d77ZOX0zK1BKGs+E2wGISYQuSBTSkXgkRQdAUhmiC117 -X2/a3Q5AQuRcr/T1QWGWfBSeOaQ/zErIZiEeYujCpJMQTiLhdpxCgU95A9mn3MjI4wRdGHUkR7w6LVjK -PXQ85mMHgCUYuyB5qn8ckjBFc3OA/fwOn3IkEoHGVFISQkBDFEBiHwIW+siFOauxXOhuTJl/vKE1e3Ma -+hxjDVXq9VKeX7SpB2CfBh6LfRe6tx6g/I7wTcun3OrB7i4MusWhQ8LrxpagIZs5LJVJKluAC4c9evxg -/+FX9x8XqzoShV00nuUW9fv9GqhA6RwSTsk0xDZYKmT57UCQxp4LJEkw9nUkiw0dVk4i16hzZJQU63Uj -KmgXLGuFfvHeCxQIXVuH/X/anL48kt3qHoeEuxDII7lCIqQxijYRs7FCCKNEHrcJmY1FoWdOdQrgCQoJ -EQpBZlhbVr9mL7Kz7Ey9VRfqL8jO1Rv1NjvLzpsKvJAm2qX1xDIp6rQnV1lcZU20V8GiVJ7QzyrVQnJg -qax+B4wDBRrDsN8fDgaDAZzUTAGgAVDYGN41Kbywp/9YKuH2Llh7sdXYOwUMBV4j8IjG6MLeCT2FXdg7 -gf9v0o07RsvWQd2xB1twIH6gSYJ+tdSDUyO5qBROO8tf33Mq8T4NcbOsSZ1CVm9LX6VXHfu22JRHkqXS -WrEbGPajT9HagluNE9qu3Tz7lz07Wnbssh+29k7orZH+9wUebX5DYp9Fn6TB5nDQ6+lV46Jx7qIK6uDJ -nHIfqMRIe4pxOqMxCfOFHhjQ0z1e99S1rjGlsuScloOmPPRBy+p9HOPMiVjimsi/06CZPCo1PZodnEqy -qYSEM8apnEcufPlZiaMFctGunVtplxXPUaShNEWpEXO2uGGTCWkyZYT7a3QTlhw7kjleQ7RpUc70Xbvk -jAYBzFBeK1w1HH1ouIagF6L2SWHtEtRofaiAhKIVa1zDIkIgl5TF7+8YXpS4gD+mJKwSKGayqQeuCL/h -vgUqHn4M6LANcXQzxBqFVFDjKh0DxpF4c0cnqaNzeiEPG2kuK1MrZ2teWJGINOgji58SI9BI9PWDYPLV -Glg3sLe4YfOOq9vd4t3KqisZ22NprOk8J66HsSyXenAbhr1O6/xVh2ybvYp6vJ8HAzSHa6avBhATBrCN -Irt7s+DVOepDwrfEvD4V+vsDo1if/hbZuGtrvbbd57bdj6tcLxxXDFfrzCNlcPJuUwan/K0jU65oxWbB -Mk3sKl4L5jYiVhnW0mIKk4qsy7Fi/KnZSrTJpf9baWmVuqVaWMr7Cr9QatfeBfX+syaeNR6OdiZDq9MY -lYthZW2wOzs7DSSTyOuijPzxxJ/sDKbeZDsY3d2ejrcDbxLcI9ujAZkO7tUVFP39ukJZ2XobVWPGkjWq -BjlnvMZ7bX33c41p1Fw9VDHEalKvyzSn9JAU7+eSxYoxwQy4Ghw8FkUk9kWxS7kLXxM5N9OjfkUXr9N8 -O9dthB14UrzDedqAVr+pN/qxoS6y5+qd+kO9Vv+qC/UG9IMke64u1GV2rjdA/an+zl5B9ly9Vr+rd9l5 -9hKys9p7Rb1T/9TupX7JXmTn2c+loLpUr9WlfuUYmWWl2av6tcuLgWM+cxXZy85/AQAA///aMAMfZxAA -AA== +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 `, }, @@ -656,6 +668,23 @@ VBTuHC+MdypXGBhCeLZw8pWJPoQFUWE80EZF8RLOFi+jrayQJowHYylZFPdhJKSBUR9GI4/dQk541qzT `, }, + "/eonza-assets/scripts/base64-encoding.yaml": { + name: "base64-encoding.yaml", + local: "../eonza-assets/scripts/base64-encoding.yaml", + size: 1078, + modtime: 1613531275, + compressed: ` +H4sIAAAAAAAC/5xTTWsbMRC961c87EPsUrvpB6EItoVC2x/Qptcge8eOQNZuJa2h0EPoodfe+ytCiMEU +4t8w+4+KVuvNOjg9dE/ivTdv3oy0nkLQdumlAKxakcRMeTp7NSE7L3JtlwIIOhiSOBleRMXwRAClCpcR +mfqQGz0bPhtO9wUNn5OfNxXx0CCmWBpak5E4E0BlXWUlgqtIAJdkymONI26UXUq4SpTKqZWXYtLmXCsX +D/180xZrGoZvJUm8EEBRBl3YZkTA0ddKO8rb5nu3o+MejJT8Xj7001YHrYzE4HTQAEmnbUh0oFWrnPSc +Q5GmbZzjt1amonuTvnbhitUj6ueDbgBHvjJhrdzBQjr0YCVxp00osinaRbqvd02XbhdQNkdO3WKAbiMS +720fv8/YuWRvcP75w+R1EqSQLXVYu9+FTPpYmHQCcNWxgPyHd3zL2/qKd3zD13zHW96At+Bb3hxnH+bn +37zjO77hTX1V/+Dr+idv61//M82/+j0+27zISeK7AHxw8G6ODB8pfFFu1L7iccuFVSkAveju5S0kIoos +8qNzmyxH3s3HsYiMJ8hW0XKzatHxeoEn3cNAluEUvfeDrPdrfUqJOvJpdB2LvwEAAP//+htSTTYEAAA= +`, + }, + "/eonza-assets/scripts/bash.yaml": { name: "bash.yaml", local: "../eonza-assets/scripts/bash.yaml", @@ -689,18 +718,18 @@ HZfWnGd/s8mFsdRlI0ABNdn2wzb9bO4qDR8UYJvK0hVZjf8KCM4Hp8E+kGpzny86rf6c9kopn9eaJGHI "/eonza-assets/scripts/convert-text.yaml": { name: "convert-text.yaml", local: "../eonza-assets/scripts/convert-text.yaml", - size: 1060, - modtime: 1613454369, + size: 1073, + modtime: 1613555006, compressed: ` -H4sIAAAAAAAC/6xTzYoTQRC+z1N8JIfdlSSCgkiDJxEfYBevS+9MTTLQ6Rm7e6KCh2xEPCh4FR/Ac1g2 -GrKbPEP1G0nPTMaJP6Dgrfm+qq+qvqq25Fymx1ZEgJZTEohzPSPjho5eughwmVMkcNQ/D3T/KAIK6SYB -GVmXqOyif7c/CsEVl5CNq+jwqBCVjxXNSAk8iIBSm1ILOFNSBExIFb9UDKCSeixgyqiQRk6tiIZNdzNp -wqPb2KjBqmruVUEC9yIgL1yW62owwNDzMjOUNJX3atbEByNaE3dU7v+skunMZVIJlC4dPqygVMmxFegl -lMpSuVE8kWYqC9trayRkD30MwH+vYsiWys2kOXCmRf/Bm2B9xZCu+fN6p4/rLSFsCRfkXhBpJFmakiHt -QDrOk3BJbY4TOJNmTA5PGq6m6ob3cmf10oFgvsBpXpqYuhmmPGiDP/OOt3zFKz/3C177Oe/4ipd+4T/A -L3jFG3/pF+BbXvFXvvZv4Oe85G98w2v/jrf+Pd/yGrzhHV+3+RteBrjbPH/hFd/wqlL/+JuE7jh/2VZn -Uv7kL/3bSnP7pwJxnpDA62EEWGdgyOHR3rlg3PFTcs+kOe41X6B3Mgg3PaiO7iQCshR32iOAwGkd30KD -oBkCSVn6wTdyDfs9AAD//4vS/1wkBAAA +H4sIAAAAAAAC/6xSzWoUTRTd91McMoskHzPziYJIQRQU8QES3CaV7juThkp1W3V7NOAiGREXCm7FB3Ad +QkZD/p7h1htJdfe0Pf6AC3fFuXXPuffc44k5t1OvEsDqQ1JICzsjxyOmV5wAnLMhhfXBbiwP1hOg1HwQ +kbHnzOT7g/8H4/i5rmXk0/p3fNSIKaaGZmQU7idAZV1lFdhVlAAHZMpfFCNotJ0quCoptdOHXiWjdrqZ +dvHRH2zcYrUaH5WkcDcBipLzwtaLAY5eVLmjrFVesnmXrqzoXdpjufczS25zzrVRqHgyelBDE6OnXmEt +o4muDI/TA+0OdenXOo2M/KqPEfjnKo58ZXim3YozHbriTTS31iLbKO42V3vS3AHxDtgnfklkkeWTCTmy +DLJpkcWsdD2ssKPdlBhP21pTakZa0u00ZwWivQrbReVS6ne4amUM+Sy3ciNnsgjHYS4X4Vhu5UxOwzx8 +QJjLQi7DSZhDrmUhX+U8vEE4llP5JldyEd7JTXgv13IBuZRbOe/6L+U0wv3h5Yss5EoWNfvH3zT01/nL +sXqbyqdwEt7WnDd/EkiLjBRejxLAs4MjxtbSuWjcxqMN71JsbWGvjsPeEM+In2u30aZ+cwk8PmLyHbo5 +jOEe1unbTIB8gv+6NOAh7kBhuyHq4GGUj5/JePpRbynb6vcAAAD//0uk0wwxBAAA `, }, @@ -1252,19 +1281,19 @@ a/4K+vebo1rWBWk8I35u/Gi4yAM8nc9niXAUvB2P1a8AAAD//53d9+s3AgAA "/eonza-assets/scripts/hex-encoding.yaml": { name: "hex-encoding.yaml", local: "../eonza-assets/scripts/hex-encoding.yaml", - size: 1209, - modtime: 1613453401, + size: 1214, + modtime: 1613554620, compressed: ` -H4sIAAAAAAAC/4RTwW4TMRC9+yuemkNbREsBiYOliBPQO4Jr5WYniaVdb/B6o1TiUFKpICHBFfEFHEPV -iLRS8g3jP0L2bpdNGpU9rd6befPm2S7IOW0GhRSAURlJDGlyQKaXJ9oMBOC0S0lit3MS6M6uAEbKDQNy -WLgk1aedJ53Du4bIJ1T0Ykf4iUiaD1IaUyrxQgClsaWRcLYkAQwpHd2bGsBUmYGELcVIWZUVUhzUDsfK -hp+2ucMai9Pc2YgkngkgHzmdm7gcYOlDqS0l9eQ7ta27ru1T6T3f1NNGO61SiZ2jnQhUddq4inaU1ZUH -LWWXD2kSZcM3VmlJ/xTahX2bZ9tKn+401i0VZerGyq5F0aBrYYQ0ox0ylamT6piOaaIS6ulMpU0UUCZB -Qk0uQBOIxCvTxmuXEq9tnoVTbMQKZ4OUy3F65qioyivfxzTZkImp1CKxPPTdVxOALdfs8y+e+09+ykue -8bW/5Jmf8tyf88J/5iWveA6+5RVf88Kf84qveMZLXgR4Ab7m+XZ2c2n+ySte8lWQ9lOe+Ute+O8bEfAP -/gP/5T+GbhDoOO42eLgC/+YZ3/ip/7oZ0kPm6sji0DuFoPawAX/hv7UM+AvRyxOS+CgQMkZhe+jiDbn3 -yu7Vj2q/5lw2EoDuN/fkJSQCim7g996ZY5rsFba3HzooLQiypgNxWvYbUvfxqLmn6HZxhNZ1Rrf1xt9W -XhrycZDcF38DAAD//ydlGcy5BAAA +H4sIAAAAAAAC/4RTUWsTTRR9n19xaB6afnytVcGHgSAIat9FX8s0e5MM7M7G2dmQgg81hSoI+ir+Ah9j +aTAtJL/hzj+Smd2um7TUfVrOuffcc8/MFOScNsNCCsCojCRGNN0n088TbYYCcNqlJLHbOQ50Z1cAY+VG +ATkoXJLqk86jzsFtQ+QTKvqxI/xEJM2HKU0olXgmgNLY0kg4W5IARpSO70wNYKrMUMKWYqysygop9muH +E2XDT9vcQY3Fae50TBJPBJCPnc5NXA6w9L7UlpJ68q3avbtu7FPpPd3W00Y7rVKJncOdCFR12riKdpTV +lfstZZePaBplwzdRaUl/FdqFA5tn95U+3mmsWyrK1E2U3YiiQTfCCGlGO2QqU8fVMR3RVCXU15lKmyig +TIKEmlyAJhCJl6aN1y4lXtk8C6fYiBXOBimX4+TUUVGVV76PaLolE1OpRWJ56LurJgBbbtjnn7zwH/2M +VzznK3/Bcz/jhT/jpf/EK17zAnzDa77ipT/jNV/ynFe8DPASfMWL+9ntpfkHr3nFl0Haz3juL3jpv21F +wN/5N/znfxi6RqDjuJvg4RL8i+d87Wf+y3ZID5mrI4tDbxWC2sMG/Ln/2jLgz0U/T0jig0DIGIXto4fX +5N4p+yIcRLd+WXt1gcvGAtCD5rI8h0RA0Qt89605omm3sP290EFpQZA1HYiTctCQeoD/msuKXg+HaN1p +9FoP/U001G3I/4PknvgTAAD//4Vs9jK+BAAA `, }, @@ -11549,6 +11578,7 @@ var _escDirs = map[string][]os.FileInfo{ "../eonza-assets/scripts": { _escData["/eonza-assets/scripts/assertions.yaml"], + _escData["/eonza-assets/scripts/base64-encoding.yaml"], _escData["/eonza-assets/scripts/bash.yaml"], _escData["/eonza-assets/scripts/chdir.yaml"], _escData["/eonza-assets/scripts/convert-text.yaml"], diff --git a/deflists.go b/deflists.go index 68402c5..08cfca2 100644 --- a/deflists.go +++ b/deflists.go @@ -22,7 +22,23 @@ var ( Name: `charmaps`, Items: []DefItem{ {`utf-8`, `utf-8`}, - {`windows-1251`, `windows-1251`}, + {`Big5 (Chinese - traditional)`, `Big5`}, + {`cp437 (IBM PC US)`, `cp437`}, + {`cp866 (MS-DOS Cyrillic Russian)`, `cp866`}, + {`EUC-KR (Korean)`, `EUC-KR`}, + {`GBK (Chinese - simplified)`, `GBK`}, + {"KOI8-R", "KOI8-R"}, + {"KOI8-U", "KOI8-U"}, + {`Shift JIS (Japanese)`, `Shift_JIS`}, + {`windows-1250 (Central European)`, `windows-1250`}, + {`windows-1251 (Cyrillic)`, `windows-1251`}, + {`windows-1252 (Western European)`, `windows-1252`}, + {`windows-1253 (Greek)`, `windows-1253`}, + {`windows-1254 (Turkish)`, `windows-1254`}, + {`windows-1255 (Hebrew)`, `windows-1255`}, + {`windows-1256 (Arabic)`, `windows-1256`}, + {`windows-1257 (Baltic)`, `windows-1257`}, + {`windows-1258 (Vietnamese)`, `windows-1258`}, }, }, } diff --git a/script/embedded.go b/script/embedded.go index b1291c5..06ca15d 100644 --- a/script/embedded.go +++ b/script/embedded.go @@ -147,6 +147,7 @@ var ( {Prototype: `SetVar(str,obj)`, Object: SetVarObj}, {Prototype: `GetVar(str) str`, Object: GetVar}, {Prototype: `GetVarBool(str) bool`, Object: GetVarBool}, + {Prototype: `GetVarBytes(str) str`, Object: GetVarBytes}, {Prototype: `GetVarInt(str) int`, Object: GetVarInt}, {Prototype: `GetVarObj(str) obj`, Object: GetVarObj}, {Prototype: `SendNotification(str)`, Object: SendNotification}, @@ -307,6 +308,18 @@ func GetVar(name string) (ret string, err error) { if IsVar(name) != 0 { id := len(dataScript.Vars) - 1 ret, err = Macro(dataScript.Vars[id][name]) + } else if strings.ContainsAny(name, `[.`) { + var found bool + if ret, found = ReplaceObj(name); !found { + ret = `` + } + } + return +} + +func GetVarBytes(name string) (ret string, err error) { + if IsVar(name) != 0 { + ret = dataScript.Vars[len(dataScript.Vars)-1][name] } return } diff --git a/script/text.go b/script/text.go index c8dea59..8986db4 100644 --- a/script/text.go +++ b/script/text.go @@ -6,7 +6,6 @@ package script import ( "bytes" - "fmt" "io/ioutil" "strings" @@ -25,7 +24,6 @@ func ConvertText(source, from, to string) (string, error) { decBytes, _ := ioutil.ReadAll(toutf8) source = string(decBytes) } - fmt.Printf("FROM: %s\n", source) if to != `utf-8` { e, err := ianaindex.IANA.Encoding(to) if err != nil { @@ -36,7 +34,6 @@ func ConvertText(source, from, to string) (string, error) { toutf.Close() source = b.String() } - fmt.Printf("TO: %s\n", source) return source, nil } From e2747863be7a8ac6bde56f678db431c8558cacf7 Mon Sep 17 00:00:00 2001 From: gentee Date: Thu, 18 Feb 2021 11:30:22 +0500 Subject: [PATCH 10/11] Added Parse YAML script --- assets.go | 156 +++++++++++++++++++++++++-------------------- script/embedded.go | 1 + script/gentee.go | 68 ++++++++++++++++++++ 3 files changed, 157 insertions(+), 68 deletions(-) diff --git a/assets.go b/assets.go index 6554d2d..33f8565 100644 --- a/assets.go +++ b/assets.go @@ -282,65 +282,67 @@ d2M/7a7t1t6XV9+WrY9W0l8DAAD//4J53ooQBwAA "/eonza-assets/init/test-files.yaml": { name: "test-files.yaml", local: "../eonza-assets/init/test-files.yaml", - size: 8139, - modtime: 1609913836, + size: 8199, + modtime: 1613628593, compressed: ` -H4sIAAAAAAAC/+RZbYsjxxH+rl9RGcWWFK9mJa106x1YzDmO44RcCLcm+RCFo6enZtUwb+7u0d76bsG+ -JB+CA/4JgZCvgUvIwcUmd39h9I9C97z1SCPti9gjEMHdznR3VT1db11dI1BKFp0LpwMQkRAdkCjk0GcB -ig6AZDJAB3rdJ2qy2+sAJEQu1IitFgo95KGgepF60CNBfB7gEgMHHnQSwkkonM6wEOAx3uDsMa5p5GWC -Dkw6kiPWq0WccopDGnvYAViSIEUNFuBJLvYMJSi4QCJP8dZ0Qq9QRA703nNj7/I9JYIuWOBxjBSDSgDK -4ZJwRtygIDOFAARMyPJ5mM858HxYjKjf5wsmgAkgIBYxlyDxaf6fbSzK/r56kb2B1Yvs1epr9Zj9M3uT -vYLV19mb7E32j9WfslfZf7LX2auaakm4k/Ncl690DwkR4iLmXnN9Ii6M3V1wJpX2IhEH2LI7BdOBzxU7 -bXMQlLNECtu2DS405bnV1smfMJ/GkedA70c/RflrwvuWx7g1gNNTGPU6FSzT8m2Kv1bvfhpRB0iSYOQp -D6z2rL3LAYyjL8lQqaWYqZ3ZWF5or9ctfe5esGiL2fJpE4oeVTpex1JivD9ASup4ZLssaiDKh989HJG6 -YIwXElK3zVDvAE1pLRvppsG8arCCVCDt9qocxXxb+99agqpxDIGGSa5wfMqEFKUgHX3WyCrfY+mATwKx -5iSW1TEi3HDqtoQWohDkvE0xNBXSlZFw4NlVMcRoHDnwRYpCsjgaUsZp5aEc1WoHQnHuyqiRMAzDQL4j -Gx5jGC8RmNSZmMaRZFGKH5mGQ85jXulqazIpU0kuOM8mVhSXSsjTujWezqxrQf1MQpgKqTQLLubD6P3A -BOVhgBKH7QmuPO0MP6ySIkdS0ZlUJc2mo+TZuEgCJokaypf0ulWi6OYJ1PDGLadinGDkgOTpliPyx3Fy -Ce/Do3iJNz8XG9u7Vi2HNE4ue3cnV67T2/dUbsNjxI0aKuKm1SDrMkyjlLTdwypf9DazxV0415AvmFzE -qQS8B94iDtFWJcm1wP0dEeqziAQOWEdl4LGISaaHxvmQ6UmGM8TJ5XD97Ku46gJSNrRcW475OmYdEGSJ -ar6aEZy2hcv9yiRLlExXFnm0NaDsMOX/BKp1JzAqcqQy5pdDwb7EHfG6gYqjSAOpo8tj5hkUL7c6qFfg -aU8A6rdgHpIkCS4dsNSOKm8rNRAvkesg2IVvPyyHe4NZ46ewNZPHHuG8heP2qL5vJaz55P+lDvZ2hAqg -uFPYbDMGO49ijg4czvuT+eDwenS9eolEHmnKuVeTcqQpF2yJhibKPXBtqW1qvq0fRXhh2NK4U21Bn1/A -++OB+reuXgNam4KvxWDfQXNz8ZHW+ty+ne5uA7DdvhXsHz4bX90Bed/+YPDbuf18Ln6Hldp3oW/WpBt3 -D11zPq8OJ8K5umBU737MgUkMgUXwGIn3CeP9R4TyuG+1wbUGA3hmtFf0bQU+ONU87F+SsD4Gr6qns5jL -Pkc5qEeKmwZX9aR1AD+PWaRWHIB1YA0Gdzkj22OzcVCG+/Nt2KzJnBrciRDI1c2uzZ+Q81Cc5zUJvK+z -T2t1re+u+EVKgkpvGxfV+qo6rm6zRdntMbv26DvwG2/wC/dj2MLPY/yu7Gab7Og++KpMd6DKtTKP6Rf9 -UJSWB0aJCf3JoAlC+/PNe6hV/w/Go0cfG3fEqs/ppj64cKr+9h9jgkT2rbrvqduRQnIWnc/5PLIOxqPR -oITkqrB8TCIvDj9O/f50NBqVUzroVcSPbXs8GjUjWtMpedYvWIQwf8aunJv0T+eRVfK/6qyx+gyf9mso -MwWlwikkL1picFq1IPKBiuFv1PH+KQuwn08cgNu2l9msuZeHuvvUTldizG/jWy7jimq4IGLREsYkOI85 -k4vQgUefzFpKplxkW82ez4TezOzRRJRfJnLbCW5Ie/iTs+Fk9qDMJhFVJGa3ESN6PZyyi62mEnHRbWnN -bIFSZkaDYU24cxMeFlirxlpdXVVDLZgxojeBfa/W8pA2DXajHP9pHtxQRPdeKb7EmCPprnVZap9qU4eJ -rkUVu/pghiZCb9bsh6057RYppsOa5XTdqGs4cuEJuzBtesEWDzQRVd5ntp6r2nZDnIf0Wmn7qFjxry9P -LVr2kN5G0NlnD0sl39CcYkEmswdNiza8emdX3XTbbQ306dQlxJ/6k6MpehP3eOp6YzKbIjmaHk1Pjl2z -vV451y1lzKbHxyfEpccnYzIbT07ozB/P/JH3YDQ6pu746MQ/OaFk+qFPcDo+OfmQTiaEHE3oMR2NJqOp -32l89Ks1cksYvW65gW6vbVumNRut77YWdkvb++aG2fzcoSAbLardXze2fcI0ZeaN/7OUUhSiE5DiS3bZ -f1wvbwTQOAxJ5IlimnEHfkXkQp/euorx48DDvGf9JJevqYc6gyoynjZ4Z3/NCxJY/SF7mf07+15VJqtv -Vn9Ulcl3q6+y19nbvFwxRGZ/Wf1+9WL1Z8j+lX2/+hayt9nL7G32Xfa6LnBer77SRc5LVdWsvjURVTKH -kP0tl7r6pvPfAAAA//8qF8HCyx8AAA== +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 `, }, "/eonza-assets/init/test-json.yaml": { name: "test-json.yaml", local: "../eonza-assets/init/test-json.yaml", - size: 2784, - modtime: 1607779636, + size: 3502, + modtime: 1613629559, compressed: ` -H4sIAAAAAAAC/7xWwW7jNhC96ysG0qJqUVu7TrpdgKf00sMe2mC7N60OTDSxGVCkTI4cOWn+vSAly5Sc -plYKbBAkNId6b/TmDccWiYRaWxYBKF4hA0JLy3urVQRAgiQy+IqW4PNff/4BP8AXXGMbAdScNgzSJHPn -bZJGAFKvJe5QMvg1IoPIomWPaZGWO24Ev5FoI4Adlw16TgApLHWrZbfPYLvdJplKLN5qVSYZJWgtWkwy -m5RYYrMR7tc/47AMA93QGOLrRljYPqABYYHDDs0epFZrIGwpGz1qxFooLsfPu2PhKWpPCNAgcINQ7a9Q -q0eeabMGrsrjxq2uQgy/eTbKXjfmX3AqLqQdxDWuIkuDteS3OBHXxxj8+O3h55+u/N9vmf/XR+sdlwzS -/N3T6nnZXr17unjOFFKR9nHbSPKcrcFOgB03He2LWdwJVU5S4FIyuOPS4lkZDYwG6U4YO2X1Gp5HSqaZ -z/kaHbcWDQmtph5GYyq7ZvC7UGXHVp94+7aqGeC26Z0GoDSFwsDBE6ETwrIfBMk/FPMhQ6A0GaBWRZLO -BTva+BTv4g14k9cM0C7/P5pBp1d+OVuySc/5rPJV0eV09N9LTRdWXeEDg6OPAbQsGawshfHPeqPC8G/S -X7GBD4WqG5pLm+YJtZT0zdxjp34vDc9dh3E87YnOy7a5sRQ01ZDbcIEOt30tBS37GzTMsEQpKj80VJ+B -O8Tg72Wfgbu1++Ww4H4i9R8qtJavJwm4Fx/I77VQr3EvTq62w+x4Ge8/e/7LUIw39ns/qq4Po+r6MKpy -um6pyMZ2rufCj/TrvezyfFOvulwXwi460EVYjmASH7SrubF4+C4xHkuD+tVe39xHAcVghicAiI3WFDOI -3290he8biyZe9HH3EwtVYhsz+DDavRMSbcwgfwp2R1GHWe3dKqOWRpjDOSse3bmLj79cTsLPi1eBnTZn -wH6aohb9xvN3dN9R2LCKviqZE3/+qDmIOrZch+gLk/cffO2Swm/Ot2J88fFTfJJz7hmKfFVkTufonwAA -AP//hvfjquAKAAA= +H4sIAAAAAAAC/6xWzW7jNhC++ykG0qJuUUuJ46YBeMpeelj0J9jupdD6wEQTmwFFyiTl2Jvm0H2nvkfz +RgUpSqZkJ7WSCkEszVDfDL/5OCONxjCx0GQEIGiBBAxqk9xpKUYAhhmOBD6hNvDh999+hW/gIy5wMwIo +qVkSGMepXa/j8QiAywXHNXICP46MQiSjxGNqNMmaKkavOeoRwJryCl1MAM60qe+S2k5gtVrFqYg13kiR +x6mJUWvUGKc6zjHHasnsn3vHYikCsjJdiE9LpmF1jwqYBgprVFvgUizA4MaknVcVWzBBefd9uyxcZTZ7 +AVAhUIVQbC9Rii80lWoBVOQ7w40sQgxnPBplKyv1DE5BGdctucpWJFFYcnqDPXKdj8C3n++//+7S/f+c +uh/vLdeUExhn7x6mj8nm8t3D2WMq0MzH3q8rblzMjcKagDVVddiDWdwykfdSoJwTuKVc41EZtREVmlum +dD+q4/C4oEZVw2O+FI5qjcowKfoaRqUKvSDwExN5Ha3c0/ZNURLAVeWVBiCkCYmBRhOhEsKyN4Rkp/Ph +kCHQOG6hpvN4PBRsJ+N9vLNX4PW2GaDN3o6m0PKVzQZT1jtzLqtsOq9z2unv0KELqy7wnsBOxwCS5wSm +2oT+D3IpQvd77lpsoEMmysoMDTvOYrMxsT/MHnvsbONw3VXox/0zUWtZV9faBIeqza1toG23Lzkzie+g +YYY5cla4oSF8BnYRgT8Tn4Ht2v62vaFuIvmHArWmi14CduNt8DvJxEuxJ3utrZkdh/H+88x/bIvxyvPu +R9VVM6qumlGVmauNmaddOZdD4Tv8eS3bPF91Vm2uE6YnNegkLEcwiRvuSqo0Nt8S3bHUsl9s5fXdKAjR +iuEBACIlpYkIRCdLWeBJpVFFE++3V8REjpuIwGnHess46ohA9hBYO16LWWztXWo2poPZrtPsi113dv7D +rOd+nLwIbLk5Avaijzr3hsfj1ee+yizPTCxeL8Edu2EpXWlSW4Hh86Zhtqu7GtFVJ/MProDx3BmH6zE6 +O7+I9nLOXIR5Np2nluyeHre04M/r0Xp3nwFdRVoqOlo8efr6z99Pfz19bXJwuyFw6h9dHmRX5sRZGn4S ++ym648hdNt++5Jq3GlkdWn+Rzs6bNi5lGQa12+OS5r53Hy2tP97/8vP/Ka2WrLBenu43qKzHoldag+u1 +1jy+XW3p7Dw6sIG+5IYi29Icwk1dNdO6gqN/AwAA//9p4WjCrg0AAA== `, }, @@ -949,15 +951,16 @@ BAAA "/eonza-assets/scripts/delete-file.yml": { name: "delete-file.yml", local: "../eonza-assets/scripts/delete-file.yml", - size: 475, - modtime: 1607779636, + size: 700, + modtime: 1613624131, compressed: ` -H4sIAAAAAAAC/3SQQUozQRSE9+8URWaR/18kgrjqtXgALyBj5iUZ6Okeu3sCARcxcSm5hBfIIsJoQK/w -+kbSk1kMorvmq6JeVXsOoTQLrwgwecUKBWsOPJmXmgkIZdCsMM7uzjzhbExAwX7Wcz/rSJ2HpcIom/pQ -6PI+u8imye2zEUDAknX9Mz0xnZuFgmsI0HahecVa4YqAxrjGKATXMNW5yyuvaNKXTLeG7aYJdC3CumaF -SwJsHUprumWA44emdFz0eelop7A564N5CtfdGzfnkp2YxvY4eWAduKrDGnOrC3YEuOaXJHmVoxzkJG3c -xhfEZznIu5yGqX9YIG1ikK+4i09xG3dxDzlKGzfyJh9xK59xI23c08wWrPA4IeCWK7vif+kz/tN3AAAA -///5m4zI2wEAAA== +H4sIAAAAAAAC/3SRT47TMBTG9z7Fx0SagkQLQqy8Bg4AB0Chee1YuHawnRGVWLQpGyQ0V2DBBUZoKhVG +lCu8dyPkJC3l3876+cvvfc+JlJJx86gV4MoFaVRkKdF4ZiwpIJlkSWNUvOx5xsVIARXF6cDjtCN1mS40 +zopJTJU1r4oHxSSnY3EGKOCCbP2nPTNburlGaBRg/dzSJVmNxwpoXGicRgoNqboM5SJqNR5K5lmn7SYZ +dC3SsiaNRwrwdTLedZsBgd40JlA1+A4e7+yS3pqYflv1SE+MD7NF5bKdkVzvPXkWjSfdGc/65brL/EgD +zhn4AFrUaYmZtxWFPnacp/HitalhZn248hTdKOHQMDT/GMqf+Yav+ZZ30spHyHu+5q98e1rgPxHwLjPw +D9nIWlrZyBX4hney4i1/k5b3suKdXP3Vkj/JiveH73rtffBW1p3w14DvvIWsZSMf8qW0/EU2vJVWTX1F +Gu/GCnnboxrn57jzNJ/yI97Nf/UeNAKlJjgFPKeFvxy4+hkAAP//MpXhdrwCAAA= `, }, @@ -1491,16 +1494,32 @@ GBU5tX0P0vcdiu8AAAD///mGejLtAQAA "/eonza-assets/scripts/parse-json.yaml": { name: "parse-json.yaml", local: "../eonza-assets/scripts/parse-json.yaml", - size: 594, - modtime: 1607779636, + size: 600, + modtime: 1613629739, + compressed: ` +H4sIAAAAAAAC/4SRvW4UMRSFez/FUaZIIpFFUFC4pkpBkIJoo7s7V5OJHHvwz0h0K1KCaGl5hOFnFAoC +r3D9RsieJNogJLrRPZ7vfL4OHGNvu6AVYOmSNQbygY8ugrMKiH00rLHfnJWw2VdAy2FTJ+WjTgaK5xp7 +zSrE1vTr5nGzYrtxbW+7Zg9QgHGd4ZGNxjMFnLMZ/uopI0O20/BJAcn6ZDWiT6wG8nQZtDq69RvJJH6g +VhgtRaoy8e3AGk8U4IbYO1tvBnh+k3rP7S30DuY5JBNH8rvA1f10h/j0P8RiXxO2S362LOpluSaKIqID +YSTf09rwcuZOXeP49OQFnlOkJVj0lp9LpACfHoDlk0zyLW/zlVzLj/wuf1ha5Cvkt8x5K7P8lFlu5CZf +5Y//7JPvMtUD72Xe7ZXPMsm1/JIveStTZVeJjWtZ45Tja/IH91t6hOPg7Ct3sr44qK9zeKj+BAAA///r +iTC8WAIAAA== +`, + }, + + "/eonza-assets/scripts/parse-yaml.yaml": { + name: "parse-yaml.yaml", + local: "../eonza-assets/scripts/parse-yaml.yaml", + size: 598, + modtime: 1613629731, compressed: ` -H4sIAAAAAAAC/4SRvW7UQBDH+32Kv+IiiUQOQUGxNVUKghREG82dR46jza7ZD0t0J1KCaGl5BPNhhYLA -K8y+EfL67nQnIaWz5z/7m9/OBo6xtU3QCrB0yxod+cBnN8FZBcQ2GtY4rq6msDpWQM1hVSrTR6l0FK81 -jqpFiLVpl9XTasF25erWNtURoADjGsM9G40XCrhm02m4ju3mx5BtNHxSQLI+WY3oE6uOPN0Grc42Zj2Z -xAdSk2VNkYpGfN+xxjMFuC62zpY7AZ7fpdZzvYFuYZ5DMrEnvw9c7Kp7xOePECf7krCd86t5Ra+nRWJS -RHQg9ORbWhqee7bqGueXF6/wkiLNwaw3H54iBfh0AJYvMsiPvM53ci+/8of8aZ4i3yF/ZcxrGeW3jPIg -D/kuf/7vPPkpQ2n4KOP+XPkqg9zLH/mW1zIUdpFYuZo1Ljm+JX+y29ITnAdn37iL5c1JeZ3TU/UvAAD/ -/9APaP1SAgAA +H4sIAAAAAAAC/4RRvWrjQBDu9ykGVNiGs4+74ortDq684w4uBFyZsTXICquVsloJ3Jm4TEibNo+g/Ain +iJNXmH2jsCvbcQIh3fJ98/3MbEnWpjoppQDQmJGEAk1JwwVmSgDY1CqS0Ismnox6AqBAO/fIqLSxSqfR +12hEepbHqU4CH1M5Cwr/CIjKE0U1KQk/BEClTaUlWFORAJiTKt5lekihTiSYShRoMCulGG7b1aiC7rWY +V8VoMUTZRUESvgmAvLBprsNeAIZOq9RQvI3dmRkqK2VrNIeGoz164Pj9E0ffNzCkO37SneGfXwx8RbA5 +INRoUpwq6ma6Ft3M+Oef3x26W0gGDH6hRQFgqjfGfMUN37mlW/GaH9yZu+hS+Bb4mVu35JYfueUNb9zK +XR7m8TU3vOYnvnFLboL0w3C+5yZ4nHMrZnlMEv6TPUbT31/pC4wxU0f53+lJP/zOYCBeAgAA///zxZ7X +VgIAAA== `, }, @@ -11623,6 +11642,7 @@ var _escDirs = map[string][]os.FileInfo{ _escData["/eonza-assets/scripts/notification.yaml"], _escData["/eonza-assets/scripts/open.yaml"], _escData["/eonza-assets/scripts/parse-json.yaml"], + _escData["/eonza-assets/scripts/parse-yaml.yaml"], _escData["/eonza-assets/scripts/read-console.yaml"], _escData["/eonza-assets/scripts/read-file.yml"], _escData["/eonza-assets/scripts/regex-find.yaml"], diff --git a/script/embedded.go b/script/embedded.go index 06ca15d..19fec99 100644 --- a/script/embedded.go +++ b/script/embedded.go @@ -162,6 +162,7 @@ var ( // For gentee {Prototype: `YamlToMap(str) map`, Object: YamlToMap}, // {Prototype: `Subbuf(buf,int,int) buf`, Object: Subbuf}, + {Prototype: `YamlToObj(str) obj`, Object: YamlToObj}, {Prototype: `CopyName(str) str`, Object: CopyName}, {Prototype: `CloseLines(handle)`, Object: CloseLines}, {Prototype: `GetLine(handle) str`, Object: GetLine}, diff --git a/script/gentee.go b/script/gentee.go index 12f7708..c3f1568 100644 --- a/script/gentee.go +++ b/script/gentee.go @@ -95,6 +95,74 @@ func ScanLines(flines *FileLines) int64 { return 0 } +func ifaceToObj(val interface{}) (*core.Obj, error) { + ret := core.NewObj() + switch v := val.(type) { + case bool: + ret.Data = v + case string: + ret.Data = v + case int: + ret.Data = v + case int64: + ret.Data = v + case float64: + ret.Data = v + case []interface{}: + data := core.NewArray() + data.Data = make([]interface{}, len(v)) + for i, item := range v { + iobj, err := ifaceToObj(item) + if err != nil { + return nil, err + } + data.Data[i] = iobj + } + ret.Data = data + case map[string]interface{}: + var i int + data := core.NewMap() + data.Keys = make([]string, len(v)) + for key, vi := range v { + data.Keys[i] = key + iobj, err := ifaceToObj(vi) + if err != nil { + return nil, err + } + data.Data[key] = iobj + i++ + } + ret.Data = data + case map[interface{}]interface{}: + var i int + data := core.NewMap() + data.Keys = make([]string, len(v)) + for key, vi := range v { + ikey := fmt.Sprint(key) + data.Keys[i] = ikey + iobj, err := ifaceToObj(vi) + if err != nil { + return nil, err + } + data.Data[ikey] = iobj + i++ + } + ret.Data = data + default: + return nil, fmt.Errorf("unsupported object type %T", val) + } + return ret, nil +} + +// YamlToObj converts json to object +func YamlToObj(input string) (ret *core.Obj, err error) { + var v interface{} + if err = yaml.Unmarshal([]byte(input), &v); err != nil { + return + } + return ifaceToObj(v) +} + /* // Subbuf(buf, int, int) buf func Subbuf(buf *core.Buffer, off int64, size int64) (*core.Buffer, error) { From 0f30f7f8fa6c4b20a1eb13ca2eaf75a3173d2e65 Mon Sep 17 00:00:00 2001 From: gentee Date: Fri, 19 Feb 2021 09:20:53 +0500 Subject: [PATCH 11/11] Updated json test --- assets.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/assets.go b/assets.go index 33f8565..d5d8b8e 100644 --- a/assets.go +++ b/assets.go @@ -324,25 +324,26 @@ Xn1hipyXuqpZfW0jKmX2If17JnX1Vet/AQAA//8D/DygByAAAA== "/eonza-assets/init/test-json.yaml": { name: "test-json.yaml", local: "../eonza-assets/init/test-json.yaml", - size: 3502, - modtime: 1613629559, + size: 3773, + modtime: 1613631151, compressed: ` -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 `, },