diff --git a/src/modules/transfer/http/http_middleware.go b/src/modules/transfer/http/http_middleware.go deleted file mode 100644 index 5e250272..00000000 --- a/src/modules/transfer/http/http_middleware.go +++ /dev/null @@ -1,124 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - "strings" - - "github.com/gin-gonic/gin" - "github.com/toolkits/pkg/logger" - "github.com/toolkits/pkg/slice" - - "github.com/didi/nightingale/src/common/address" - "github.com/didi/nightingale/src/models" - "github.com/didi/nightingale/src/modules/rdb/config" -) - -func shouldBeLogin() gin.HandlerFunc { - return func(c *gin.Context) { - c.Set("username", mustUsername(c)) - c.Next() - } -} - -func shouldBeRoot() gin.HandlerFunc { - return func(c *gin.Context) { - username := mustUsername(c) - - user, err := models.UserGet("username=?", username) - dangerous(err) - - if user.IsRoot != 1 { - bomb("forbidden") - } - - c.Set("username", username) - c.Set("user", user) - c.Next() - } -} - -func shouldBeService() gin.HandlerFunc { - return func(c *gin.Context) { - remoteAddr := c.Request.RemoteAddr - idx := strings.LastIndex(remoteAddr, ":") - ip := "" - if idx > 0 { - ip = remoteAddr[0:idx] - } - - if ip == "127.0.0.1" { - c.Next() - return - } - - if ip != "" && slice.ContainsString(address.GetAddresses("rdb"), ip) { - c.Next() - return - } - - token := c.GetHeader("X-Srv-Token") - if token == "" { - c.AbortWithError(http.StatusForbidden, fmt.Errorf("X-Srv-Token is blank")) - return - } - - if !slice.ContainsString(config.Config.Tokens, token) { - c.AbortWithError(http.StatusForbidden, fmt.Errorf("X-Srv-Token[%s] invalid", token)) - return - } - - c.Next() - } -} - -func mustUsername(c *gin.Context) string { - username := cookieUsername(c) - if username == "" { - username = headerUsername(c) - } - - if username == "" { - bomb("unauthorized") - } - - return username -} - -func cookieUsername(c *gin.Context) string { - return models.UsernameByUUID(readCookieUser(c)) -} - -func headerUsername(c *gin.Context) string { - token := c.GetHeader("X-User-Token") - if token == "" { - return "" - } - - ut, err := models.UserTokenGet("token=?", token) - if err != nil { - logger.Warningf("UserTokenGet[%s] fail: %v", token, err) - return "" - } - - if ut == nil { - return "" - } - - return ut.Username -} - -// ------------ - -func readCookieUser(c *gin.Context) string { - uuid, err := c.Cookie(config.Config.HTTP.CookieName) - if err != nil { - return "" - } - - return uuid -} - -func writeCookieUser(c *gin.Context, uuid string) { - c.SetCookie(config.Config.HTTP.CookieName, uuid, 3600*24, "/", config.Config.HTTP.CookieDomain, false, true) -} diff --git a/src/modules/transfer/http/http_server.go b/src/modules/transfer/http/http_server.go index 1f9b080d..b26f3f6d 100644 --- a/src/modules/transfer/http/http_server.go +++ b/src/modules/transfer/http/http_server.go @@ -21,12 +21,9 @@ var srv = &http.Server{ MaxHeaderBytes: 1 << 20, } -var skipPaths = []string{"/api/rdb/auth/login"} - func Start() { c := config.Config - loggerMid := middleware.LoggerWithConfig(middleware.LoggerConfig{SkipPaths: skipPaths}) recoveryMid := middleware.Recovery() if strings.ToLower(c.HTTP.Mode) == "release" { @@ -35,7 +32,7 @@ func Start() { } r := gin.New() - r.Use(loggerMid, recoveryMid) + r.Use(recoveryMid) Config(r) diff --git a/src/modules/transfer/http/router_funcs.go b/src/modules/transfer/http/router_funcs.go index 99c906ec..b58f5f1a 100644 --- a/src/modules/transfer/http/router_funcs.go +++ b/src/modules/transfer/http/router_funcs.go @@ -1,13 +1,10 @@ package http import ( - "fmt" "strconv" "github.com/gin-gonic/gin" "github.com/toolkits/pkg/errors" - - "github.com/didi/nightingale/src/models" ) func dangerous(v interface{}) { @@ -131,151 +128,3 @@ func renderZeroPage(c *gin.Context) { "total": 0, }, nil) } - -// ------------ - -type idsForm struct { - Ids []int64 `json:"ids"` -} - -func checkPassword(passwd string) error { - indNum := [4]int{0, 0, 0, 0} - spCode := []byte{'!', '@', '#', '$', '%', '^', '&', '*', '_', '-', '~', '.', ',', '<', '>', '/', ';', ':', '|', '?', '+', '='} - - if len(passwd) < 6 { - return fmt.Errorf("password too short") - } - - passwdByte := []byte(passwd) - - for _, i := range passwdByte { - - if i >= 'A' && i <= 'Z' { - indNum[0] = 1 - continue - } - - if i >= 'a' && i <= 'z' { - indNum[1] = 1 - continue - } - - if i >= '0' && i <= '9' { - indNum[2] = 1 - continue - } - - has := false - for _, s := range spCode { - if i == s { - indNum[3] = 1 - has = true - break - } - } - - if !has { - return fmt.Errorf("character: %s not supported", string(i)) - } - - } - - codeCount := 0 - - for _, i := range indNum { - codeCount += i - } - - if codeCount < 4 { - return fmt.Errorf("password too simple") - } - - return nil -} - -// ------------ - -func loginUsername(c *gin.Context) string { - value, has := c.Get("username") - if !has { - bomb("unauthorized") - } - - if value == nil { - bomb("unauthorized") - } - - return value.(string) -} - -func loginUser(c *gin.Context) *models.User { - username := loginUsername(c) - - user, err := models.UserGet("username=?", username) - dangerous(err) - - if user == nil { - bomb("unauthorized") - } - - return user -} - -func loginRoot(c *gin.Context) *models.User { - value, has := c.Get("user") - if !has { - bomb("unauthorized") - } - - return value.(*models.User) -} - -func User(id int64) *models.User { - user, err := models.UserGet("id=?", id) - if err != nil { - bomb("cannot retrieve user[%d]: %v", id, err) - } - - if user == nil { - bomb("no such user[%d]", id) - } - - return user -} - -func Team(id int64) *models.Team { - team, err := models.TeamGet("id=?", id) - if err != nil { - bomb("cannot retrieve team[%d]: %v", id, err) - } - - if team == nil { - bomb("no such team[%d]", id) - } - - return team -} - -func Role(id int64) *models.Role { - role, err := models.RoleGet("id=?", id) - if err != nil { - bomb("cannot retrieve role[%d]: %v", id, err) - } - - if role == nil { - bomb("no such role[%d]", id) - } - - return role -} - -func Node(id int64) *models.Node { - node, err := models.NodeGet("id=?", id) - dangerous(err) - - if node == nil { - bomb("no such node[id:%d]", id) - } - - return node -} diff --git a/src/modules/transfer/http/routes/query_router.go b/src/modules/transfer/http/routes/query_router.go deleted file mode 100644 index cb516590..00000000 --- a/src/modules/transfer/http/routes/query_router.go +++ /dev/null @@ -1,157 +0,0 @@ -package routes - -import ( - "github.com/didi/nightingale/src/common/dataobj" - "github.com/didi/nightingale/src/modules/transfer/backend" - "github.com/didi/nightingale/src/toolkits/http/render" - "github.com/didi/nightingale/src/toolkits/stats" - - "github.com/gin-gonic/gin" - "github.com/toolkits/pkg/errors" - "github.com/toolkits/pkg/logger" -) - -func QueryData(c *gin.Context) { - stats.Counter.Set("data.api.qp10s", 1) - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - - var input []dataobj.QueryData - errors.Dangerous(c.ShouldBindJSON(&input)) - resp := dataSource.QueryData(input) - render.Data(c, resp, nil) -} - -func QueryDataForUI(c *gin.Context) { - stats.Counter.Set("data.ui.qp10s", 1) - var input dataobj.QueryDataForUI - var respData []*dataobj.QueryDataForUIResp - errors.Dangerous(c.ShouldBindJSON(&input)) - start := input.Start - end := input.End - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - resp := dataSource.QueryDataForUI(input) - for _, d := range resp { - data := &dataobj.QueryDataForUIResp{ - Start: d.Start, - End: d.End, - Endpoint: d.Endpoint, - Nid: d.Nid, - Counter: d.Counter, - DsType: d.DsType, - Step: d.Step, - Values: d.Values, - } - respData = append(respData, data) - } - - if len(input.Comparisons) > 1 { - for i := 1; i < len(input.Comparisons); i++ { - comparison := input.Comparisons[i] - input.Start = start - comparison - input.End = end - comparison - res := dataSource.QueryDataForUI(input) - for _, d := range res { - for j := range d.Values { - d.Values[j].Timestamp += comparison - } - - data := &dataobj.QueryDataForUIResp{ - Start: d.Start, - End: d.End, - Endpoint: d.Endpoint, - Nid: d.Nid, - Counter: d.Counter, - DsType: d.DsType, - Step: d.Step, - Values: d.Values, - Comparison: comparison, - } - respData = append(respData, data) - } - } - } - - render.Data(c, respData, nil) -} - -func GetMetrics(c *gin.Context) { - stats.Counter.Set("metric.qp10s", 1) - recv := dataobj.EndpointsRecv{} - errors.Dangerous(c.ShouldBindJSON(&recv)) - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - - resp := dataSource.QueryMetrics(recv) - - render.Data(c, resp, nil) -} - -func GetTagPairs(c *gin.Context) { - stats.Counter.Set("tag.qp10s", 1) - recv := dataobj.EndpointMetricRecv{} - errors.Dangerous(c.ShouldBindJSON(&recv)) - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - - resp := dataSource.QueryTagPairs(recv) - render.Data(c, resp, nil) -} - -func GetIndexByClude(c *gin.Context) { - stats.Counter.Set("xclude.qp10s", 1) - recvs := make([]dataobj.CludeRecv, 0) - errors.Dangerous(c.ShouldBindJSON(&recvs)) - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - - resp := dataSource.QueryIndexByClude(recvs) - render.Data(c, resp, nil) -} - -func GetIndexByFullTags(c *gin.Context) { - stats.Counter.Set("counter.qp10s", 1) - recvs := make([]dataobj.IndexByFullTagsRecv, 0) - errors.Dangerous(c.ShouldBindJSON(&recvs)) - - dataSource, err := backend.GetDataSourceFor("") - if err != nil { - logger.Warningf("could not find datasource") - render.Message(c, err) - return - } - - resp := dataSource.QueryIndexByFullTags(recvs) - render.Data(c, &listResp{List: resp, Count: len(resp)}, nil) -} - -type listResp struct { - List interface{} `json:"list"` - Count int `json:"count"` -} diff --git a/src/modules/transfer/transfer.go b/src/modules/transfer/transfer.go index 3248611e..82c4003b 100644 --- a/src/modules/transfer/transfer.go +++ b/src/modules/transfer/transfer.go @@ -64,9 +64,6 @@ func main() { go report.Init(cfg.Report, "rdb") go rpc.Start() - // r := gin.New() - // routes.Config(r) - // go http.Start(r, "transfer", cfg.Logger.Level) http.Start() cleanup()