diff --git a/Logger/Logger.go b/Logger/Logger.go index 9c8703b..53cd14b 100644 --- a/Logger/Logger.go +++ b/Logger/Logger.go @@ -1,7 +1,6 @@ package Logger import ( - "fmt" "os" log "github.com/sirupsen/logrus" @@ -9,7 +8,6 @@ import ( ) func Init() { - fmt.Println(viper.GetString("crimson_settings.log_file")) f, err := os.OpenFile(viper.GetString("crimson_settings.log_file"), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { log.Fatalf("error opening file: %v", err) diff --git a/Servers/RedconQ.go b/Servers/RedconQ.go index c5d1096..b9bc78d 100644 --- a/Servers/RedconQ.go +++ b/Servers/RedconQ.go @@ -36,7 +36,7 @@ func StartRedCon(addr string, cq *Structs.S_GOQ) { ConnContext := ConnContext{Auth: false, SelectDB: ""} conn.SetContext(ConnContext) remoteIp := strings.Split(conn.RemoteAddr(), ":")[0] - fmt.Println("Client connected from ", remoteIp) + log.Info("Client connected from ", remoteIp) if viper.GetString("RESP.ip_whitelist") == "*" { return true } else { @@ -47,7 +47,7 @@ func StartRedCon(addr string, cq *Structs.S_GOQ) { }, func(conn redcon.Conn, err error) { // This is called when the connection has been closed - // log.Printf("closed: %s, err: %v", conn.RemoteAddr(), err) + log.Printf("closed: %s, err: %v", conn.RemoteAddr(), err) }, ) diff --git a/Servers/http.go b/Servers/http.go index 9859b0f..f112021 100644 --- a/Servers/http.go +++ b/Servers/http.go @@ -3,16 +3,19 @@ package Servers import ( "errors" "fmt" + "log" "strconv" "strings" + "time" "ywadi/crimsonq/Defs" "ywadi/crimsonq/Structs" "ywadi/crimsonq/Utils" "github.com/gofiber/fiber/v2" - "github.com/gofiber/fiber/v2/middleware/basicauth" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/recover" + jwtware "github.com/gofiber/jwt/v3" + "github.com/golang-jwt/jwt/v4" "github.com/spf13/viper" ) @@ -29,17 +32,19 @@ type PostBody struct { Concurrency int `json:"concurrency" xml:"concurrency" form:"concurrency"` } +type PostAuthBody struct { + Username string `json"username" xml:"username" form:"username"` + Password string `json"password" xml:"password" form:"password"` +} + func HTTP_Start(cq *Structs.S_GOQ) { + fmt.Println("Starting Web Server.") app = fiber.New() + app.Post("/login", login) + app.Use(recover.New()) app.Use(cors.New()) - app.Use("/api/", basicauth.New(basicauth.Config{ - Users: map[string]string{ - viper.GetString("HTTP.username"): viper.GetString("HTTP.password"), - }, - })) - app.Use(func(c *fiber.Ctx) error { if viper.GetString("HTTP.ip_whitelist") != "*" { grant := Utils.SliceContains(viper.GetStringSlice("HTTP.ip_whitelist"), c.IP()) @@ -53,17 +58,21 @@ func HTTP_Start(cq *Structs.S_GOQ) { app.Static("/", "../WebUI/dist") + app.Use(jwtware.New(jwtware.Config{ + SigningKey: []byte("crimsonQ"), + })) + + app.Get("/checkToken", checkToken) + for k, v := range Commands { if v.HTTP_Method == Defs.HTTP_GET { route := "/api/" + strings.ReplaceAll(k, ".", "/") for _, av := range v.ArgsCmd { route = route + "/:" + av } - fmt.Println("|GET|" + route + "|" + strings.Join(v.ArgsCmd, " - ") + "|JSON|") app.Get(route, v.HTTP_Function) } else if v.HTTP_Method == Defs.HTTP_POST { route := "/api/" + strings.ReplaceAll(k, ".", "/") - fmt.Println("|POST|" + route + "|" + strings.Join(v.ArgsCmd, " - ") + "|JSON|") app.Post(route, v.HTTP_Function) } @@ -72,6 +81,46 @@ func HTTP_Start(cq *Structs.S_GOQ) { app.Listen(":" + viper.GetString("HTTP.port")) } +func checkToken(c *fiber.Ctx) error { + user := c.Locals("user").(*jwt.Token) + claims := user.Claims.(jwt.MapClaims) + name := claims["name"].(string) + return c.SendString("Welcome " + name) +} + +func login(c *fiber.Ctx) error { + bodyData := PostAuthBody{} + if err := c.BodyParser(&bodyData); err != nil { + log.Println(err) + return fiber.NewError(fiber.StatusBadRequest, Defs.ERRIncorrectArgs) + } + user := bodyData.Username + pass := bodyData.Password + + // Throws Unauthorized error + if user != viper.GetString("HTTP.username") || pass != viper.GetString("HTTP.password") { + return c.SendStatus(fiber.StatusUnauthorized) + } + + // Create the Claims + claims := jwt.MapClaims{ + "name": bodyData.Username, + "admin": true, + "exp": time.Now().Add(time.Hour * 72).Unix(), + } + + // Create token + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + + // Generate encoded token and send it as response. + t, err := token.SignedString([]byte("crimsonQ")) + if err != nil { + return c.SendStatus(fiber.StatusInternalServerError) + } + + return c.JSON(fiber.Map{"token": t}) +} + func HTTP_Ping(c *fiber.Ctx) error { return c.JSON("Pong! " + c.Params("messageString")) } @@ -108,7 +157,7 @@ func HTTP_ConsumerInfo(c *fiber.Ctx) error { func HTTP_Consumer_Create(c *fiber.Ctx) error { bodyData := PostBody{} if err := c.BodyParser(&bodyData); err != nil { - fmt.Println(err) + log.Println(err) return fiber.NewError(fiber.StatusBadRequest, Defs.ERRIncorrectArgs) } diff --git a/bin/cli/README.md b/bin/cli/README.md new file mode 100644 index 0000000..d2831a3 --- /dev/null +++ b/bin/cli/README.md @@ -0,0 +1 @@ +# This folder contains all possible builds for CrimsonQ-CLI \ No newline at end of file diff --git a/cmd/cmd b/cmd/cmd index 9e542b5..bd417a8 100755 Binary files a/cmd/cmd and b/cmd/cmd differ diff --git a/go.mod b/go.mod index dba5bc6..d60f572 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,10 @@ require ( github.com/cosiner/argv v0.1.0 // indirect github.com/dgraph-io/badger/v3 v3.2103.2 // indirect github.com/go-redis/redis/v8 v8.11.4 // indirect - github.com/gofiber/fiber/v2 v2.26.0 // indirect + github.com/gofiber/fiber/v2 v2.27.0 // indirect + github.com/gofiber/jwt/v3 v3.2.6 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang-jwt/jwt/v4 v4.3.0 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/peterh/liner v1.2.2 // indirect github.com/sirupsen/logrus v1.8.1 // indirect diff --git a/go.sum b/go.sum index 8d8c852..2ed9854 100644 --- a/go.sum +++ b/go.sum @@ -57,6 +57,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/brotli v1.0.2 h1:JKnhI/XQ75uFBTiuzXpzFrUriDPiZjlOSzh6wXogP0E= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -150,9 +152,17 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.26.0 h1:Awnfqp3fqbZzV3wZWMRJ6Xo2U8X0Ls68M7tXjx52NcM= github.com/gofiber/fiber/v2 v2.26.0/go.mod h1:7efVWcBOZi1PyMWznnbitjnARPA7nYZxmQXJVod0bo0= +github.com/gofiber/fiber/v2 v2.27.0 h1:u34t1nOea7zz4jcZDK7+ZMiG+MVFYrHqMhTdYQDiFA8= +github.com/gofiber/fiber/v2 v2.27.0/go.mod h1:0bPXdTu+jRqINrEq1T6mHeVBnE0lQd67PGu35jD3hLk= +github.com/gofiber/jwt/v3 v3.2.6 h1:GdaIWXZz+16cqRxUxHadSrH2ijvy3rQPv+d17blubFI= +github.com/gofiber/jwt/v3 v3.2.6/go.mod h1:1+DdDoQxoCDvjjNXhRS7N0atcHNKA1ANZVNqvbiVRrw= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog= +github.com/golang-jwt/jwt/v4 v4.3.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= @@ -279,6 +289,8 @@ github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/Vq github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.4 h1:0zhec2I8zGnjWcKyLl6i3gPqKANCCn5e9xmviEEeX6s= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.14.1 h1:hLQYb23E8/fO+1u53d02A97a8UnsddcvYzq4ERRU4ds= +github.com/klauspost/compress v1.14.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -419,6 +431,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.32.0 h1:keswgWzyKyNIIjz2a7JmCYHOOIkRp6HMx9oTV6QrZWY= github.com/valyala/fasthttp v1.32.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= +github.com/valyala/fasthttp v1.33.0 h1:mHBKd98J5NcXuBddgjvim1i3kWzlng1SzLhrnBOU9g8= +github.com/valyala/fasthttp v1.33.0/go.mod h1:KJRK/MXx0J+yd0c5hlR+s1tIHD72sniU8ZJjl97LIw4= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= @@ -454,6 +468,7 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -536,6 +551,9 @@ golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220111093109-d55c255bac03 h1:0FB83qp0AzVJm+0wcIlauAjJ+tNdh7jLuacRYCIVv7s= +golang.org/x/net v0.0.0-20220111093109-d55c255bac03/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -641,6 +659,8 @@ golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= +golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=