package router
import (
"fleetmanager/api/controller/user"
"fleetmanager/api/errors"
model_user "fleetmanager/api/model/user"
"fleetmanager/api/response"
"fleetmanager/db/dao"
"github.com/beego/beego/v2/server/web"
"net/http"
"github.com/beego/beego/v2/server/web/context"
)
func initCommon() {
web.InsertFilter("/v1/:project_id/user/swr-organization", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/aliases*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/builds", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/builds/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/image-builds", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/fleets", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/fleets/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/fleets/:fleet_id/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/monitor-fleets", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/monitor-fleets/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/fleets/:fleet_id/scaling-policies", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/fleets/:fleet_id/scaling-policies/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/lts-access-config", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/lts-transfer", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/lts-log-group", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/lts-transfer", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/resource-specification", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/resource-specification/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/event", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/event/*", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/topic", web.BeforeExec, filterReadOnlyUser)
web.InsertFilter("/v1/:project_id/topic/subscriptions/*", web.BeforeExec, filterReadOnlyUser)
}
func filterReadOnlyUser(ctx *context.Context) {
token := ctx.Input.Header("Auth-token")
claim, err := user.ParseToken(token)
if err != nil {
response.Error(ctx.Input.Context, http.StatusUnauthorized,
errors.NewErrorF(errors.Unauthorized, "Parse token error"))
return
}
if ctx.Input.Method() == "GET" {
return
}
userinfo, err := dao.GetUser().Get(dao.Filters{"id": claim.UserId})
if err != nil {
response.Error(ctx.Input.Context, http.StatusBadRequest,
errors.NewErrorF(errors.InvalidUserinfo, "user does not exist"))
return
}
if userinfo.UserType < model_user.Sub_Admin {
response.Error(ctx.Input.Context, http.StatusForbidden,
errors.NewErrorF(errors.NoPermission, "current user is read-only user!"))
return
}
}