diff --git a/cmd/user_data.go b/cmd/user_data.go index 020c4894..dfae76d7 100644 --- a/cmd/user_data.go +++ b/cmd/user_data.go @@ -268,6 +268,19 @@ var UserData = &cli.Command{ }, }, }, + { + Name: "user-session-revoke", + Usage: "Revoke the specified user session", + Action: bindAction(revokeUserToken), + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "token", + Aliases: []string{"t"}, + Required: false, + Usage: "Specific token content", + }, + }, + }, { Name: "user-session-clear", Usage: "Clear user all sessions", @@ -732,6 +745,26 @@ func createNewUserToken(c *core.CliContext) error { return nil } +func revokeUserToken(c *core.CliContext) error { + _, err := initializeSystem(c) + + if err != nil { + return err + } + + token := c.String("token") + err = clis.UserData.RevokeUserToken(c, token) + + if err != nil { + log.CliErrorf(c, "[user_data.revokeUserToken] error occurs when revoking user token") + return err + } + + log.CliInfof(c, "[user_data.revokeUserToken] the specified user token has been revoked successfully") + + return nil +} + func clearUserTokens(c *core.CliContext) error { _, err := initializeSystem(c) diff --git a/pkg/cli/user_data.go b/pkg/cli/user_data.go index 267187ff..3de53d0f 100644 --- a/pkg/cli/user_data.go +++ b/pkg/cli/user_data.go @@ -445,6 +445,39 @@ func (l *UserDataCli) CreateNewUserToken(c *core.CliContext, username string, to return tokenRecord, token, nil } +// RevokeUserToken revokes the specified token of the user +func (l *UserDataCli) RevokeUserToken(c *core.CliContext, token string) error { + _, claims, err := l.tokens.ParseToken(c, token) + + if err != nil { + log.CliErrorf(c, "[user_data.RevokeUserToken] failed to parse token, because %s", err.Error()) + return err + } + + userTokenId, err := utils.StringToInt64(claims.UserTokenId) + + if err != nil { + log.CliErrorf(c, "[user_data.RevokeUserToken] failed to get user token id, because %s", err.Error()) + return err + } + + tokenRecord := &models.TokenRecord{ + Uid: claims.Uid, + UserTokenId: userTokenId, + CreatedUnixTime: claims.IssuedAt, + } + + tokenId := l.tokens.GenerateTokenId(tokenRecord) + err = l.tokens.DeleteToken(c, tokenRecord) + + if err != nil { + log.Errorf(c, "[user_data.RevokeUserToken] failed to revoke token \"id:%s\" for user \"uid:%d\", because %s", tokenId, claims.Uid, err.Error()) + return err + } + + return nil +} + // ClearUserTokens clears all tokens of the specified user func (l *UserDataCli) ClearUserTokens(c *core.CliContext, username string) error { if username == "" {