diff --git a/app/descr/grant.go b/app/descr/grant.go index 45b10ba..9425be6 100644 --- a/app/descr/grant.go +++ b/app/descr/grant.go @@ -33,6 +33,5 @@ type GrantShort struct { } const ( - operFileinfo = "opFileinfo" - operPutFile = "opPutFile" + GrantCreateAccount = "createAccount" ) diff --git a/app/handler/account.go b/app/handler/account.go index 2e40636..cb5c8d6 100644 --- a/app/handler/account.go +++ b/app/handler/account.go @@ -1,19 +1,41 @@ package handler import ( + "context" + "fmt" + "mstore/app/descr" "mstore/app/operator" "mstore/app/router" ) +func (hand *Handler) CheckGrant(ctx context.Context, accountID, grant, subject string) (bool, error) { + var err error + var res bool + + return res, err +} + // POST /v3/account/create 200 200 func (hand *Handler) CreateAccount(rctx *router.Context) { var err error - operatorID := descr.AnonymousID - params := &operator.CreateAccountParams{} err = rctx.BindJSON(params) + + operatorID, _ := rctx.GetString(userTag) + opEnable, err := hand.CheckGrant(rctx.Ctx, operatorID, descr.GrantCreateAccount, params.Username) + if err != nil { + err := fmt.Errorf("CreateAccount error: %v", err) + hand.SendError(rctx, err) + return + } + if !opEnable { + err := fmt.Errorf("CreateAccount not enabled for this user") + hand.SendError(rctx, err) + return + } + if err != nil { hand.SendError(rctx, err) return diff --git a/app/handler/authmw.go b/app/handler/authmw.go index 68f10b1..5f0d901 100644 --- a/app/handler/authmw.go +++ b/app/handler/authmw.go @@ -1,13 +1,18 @@ package handler import ( + "context" + "fmt" + + "mstore/app/descr" "mstore/app/router" "mstore/pkg/auxhttp" + "mstore/pkg/auxpwd" ) const ( authTag = "authpass" - userTag = "username" + userTag = "accountID" ) func (hand *Handler) AuthMiddleware(next router.Handler) router.Handler { @@ -15,10 +20,10 @@ func (hand *Handler) AuthMiddleware(next router.Handler) router.Handler { handlerFunc = func(rctx *router.Context) { hand.logg.Debugf("Call authorization middleware") - success, username, err := hand.CheckAccess(rctx) + success, accountID, err := hand.CheckAccess(rctx) if success && err == nil { rctx.SetBool(authTag, true) - rctx.SetString(userTag, username) + rctx.SetString(userTag, accountID) } if err != nil { hand.logg.Errorf("Authorization middleware error: %v", err) @@ -34,18 +39,39 @@ func (hand *Handler) CheckAccess(rctx *router.Context) (bool, string, error) { var success bool var username string var password string + var accountID string + + accountID = descr.AnonymousID authHeader := rctx.GetHeader("Authorization") if authHeader != "" { hand.logg.Debugf("Authorization header is %s", authHeader) username, password, err = auxhttp.ParseBasicAuth(authHeader) if err != nil { - return success, username, err + return success, accountID, err } hand.logg.Debugf("Authorization username is %s:%s", username, password) } + success = true // TODO: change to actual call - success = true - - return success, username, err + return success, accountID, err +} + +func (hand *Handler) ValidatePassword(ctx context.Context, username, password string) (bool, string, error) { + var err error + var accountID string + valid := false + + accountExists, accountDescr, err := hand.mdb.GetAccountByUsername(ctx, username) + if !accountExists { + err := fmt.Errorf("Account not exists") + return valid, accountID, err + } + if !auxpwd.PasswordMatch([]byte(password), accountDescr.Passhash) { + err := fmt.Errorf("Login data mismatch") + return valid, accountID, err + } + valid = true + accountID = accountDescr.ID + return valid, accountID, err } diff --git a/app/handler/handler.go b/app/handler/handler.go index 8b563b0..73c948f 100644 --- a/app/handler/handler.go +++ b/app/handler/handler.go @@ -11,6 +11,7 @@ package handler import ( "mstore/app/logger" + "mstore/app/maindb" "mstore/app/operator" "mstore/app/router" @@ -19,10 +20,12 @@ import ( type HandlerParams struct { Operator *operator.Operator + MainDB *maindb.Database } type Handler struct { oper *operator.Operator + mdb *maindb.Database logg *logger.Logger } @@ -30,6 +33,7 @@ func NewHandler(params *HandlerParams) (*Handler, error) { var err error hand := &Handler{ oper: params.Operator, + mdb: params.MainDB, } hand.logg = logger.NewLoggerWithSubject("handler") return hand, err diff --git a/app/operator/account.go b/app/operator/account.go index ed3bd83..93c9054 100644 --- a/app/operator/account.go +++ b/app/operator/account.go @@ -10,25 +10,6 @@ import ( "mstore/pkg/auxuuid" ) -func (oper *Operator) ValidatePassword(ctx context.Context, username, password string) (bool, string, error) { - var err error - var accountID string - valid := false - - accountExists, accountDescr, err := oper.mdb.GetAccountByUsername(ctx, username) - if !accountExists { - err := fmt.Errorf("Account not exists") - return valid, accountID, err - } - if !auxpwd.PasswordMatch([]byte(password), accountDescr.Passhash) { - err := fmt.Errorf("Login data mismatch") - return valid, accountID, err - } - valid = true - accountID = accountDescr.ID - return valid, accountID, err -} - type CreateAccountParams struct { Username string `json:"username"` Password string `json:"password"` diff --git a/app/server/server.go b/app/server/server.go index dedae35..d0055fe 100644 --- a/app/server/server.go +++ b/app/server/server.go @@ -8,26 +8,6 @@ * modifications are strictly prohibited. */ -/* - * Это произведение распространяется под лицензией Creative Commons - * Attribution-NonCommercial-NoDerivatives 4.0 International License - * - * Разрешается распространение, но запрещаются коммерческое использование - * и изменения данного произведения. - * - * Вы можете свободно делиться, то есть копировать, распространять и передавать - * другим лицам данное произведение при обязательном соблюдении следующих условий: - * - * Атрибуция: Вы должны атрибутировать произведение (указывать автора и источник) - * в порядке, предусмотренном автором или лицензиаром. - * - * Некоммерческое использование: Вы не можете использовать это произведение - * в коммерческих целях. - * - * Без производных произведений: Вы не можете изменять, преобразовывать или брать - * за основу это произведение. - */ - package server import ( @@ -182,6 +162,7 @@ func (srv *Server) Build() error { srv.logg.Infof("Creating handler") handlerParams := &handler.HandlerParams{ Operator: srv.oper, + MainDB: srv.mdb, } srv.hand, err = handler.NewHandler(handlerParams) if err != nil {