diff options
-rw-r--r-- | conf/locale/locale_en-US.ini | 1 | ||||
-rw-r--r-- | models/errors/token.go | 16 | ||||
-rw-r--r-- | models/token.go | 18 | ||||
-rw-r--r-- | routes/api/v1/user/app.go | 7 | ||||
-rw-r--r-- | routes/user/setting.go | 7 |
5 files changed, 44 insertions, 5 deletions
diff --git a/conf/locale/locale_en-US.ini b/conf/locale/locale_en-US.ini index 7b558d75..59c2d33b 100644 --- a/conf/locale/locale_en-US.ini +++ b/conf/locale/locale_en-US.ini @@ -374,6 +374,7 @@ delete_token = Delete access_token_deletion = Personal Access Token Deletion access_token_deletion_desc = Delete this personal access token will remove all related accesses of application. Do you want to continue? delete_token_success = Personal access token has been removed successfully! Don't forget to update your application as well. +token_name_exists = Token with same name already exists. orgs.none = You are not a member of any organizations. orgs.leave_title = Leave organization diff --git a/models/errors/token.go b/models/errors/token.go new file mode 100644 index 00000000..d6a4577a --- /dev/null +++ b/models/errors/token.go @@ -0,0 +1,16 @@ +package errors + +import "fmt" + +type AccessTokenNameAlreadyExist struct { + Name string +} + +func IsAccessTokenNameAlreadyExist(err error) bool { + _, ok := err.(AccessTokenNameAlreadyExist) + return ok +} + +func (err AccessTokenNameAlreadyExist) Error() string { + return fmt.Sprintf("access token already exist [name: %s]", err.Name) +} diff --git a/models/token.go b/models/token.go index 7e1dc166..b757c7d7 100644 --- a/models/token.go +++ b/models/token.go @@ -5,12 +5,13 @@ package models import ( + "fmt" "time" "github.com/go-xorm/xorm" - gouuid "github.com/satori/go.uuid" - + "github.com/gogs/gogs/models/errors" "github.com/gogs/gogs/pkg/tool" + gouuid "github.com/satori/go.uuid" ) // AccessToken represents a personal access token. @@ -47,10 +48,21 @@ func (t *AccessToken) AfterSet(colName string, _ xorm.Cell) { } } +func isAccessTokenNameExist(uid int64, name string) (bool, error) { + return x.Where("uid=?", uid).And("name=?", name).Get(&AccessToken{}) +} + // NewAccessToken creates new access token. func NewAccessToken(t *AccessToken) error { t.Sha1 = tool.SHA1(gouuid.NewV4().String()) - _, err := x.Insert(t) + has, err := isAccessTokenNameExist(t.UID, t.Name) + if err != nil { + return fmt.Errorf("IsAccessTokenNameExists: %v", err) + } else if has { + return errors.AccessTokenNameAlreadyExist{t.Name} + } + + _, err = x.Insert(t) return err } diff --git a/routes/api/v1/user/app.go b/routes/api/v1/user/app.go index 864ede54..dcc3fca5 100644 --- a/routes/api/v1/user/app.go +++ b/routes/api/v1/user/app.go @@ -10,6 +10,7 @@ import ( api "github.com/gogs/go-gogs-client" "github.com/gogs/gogs/models" + "github.com/gogs/gogs/models/errors" "github.com/gogs/gogs/pkg/context" ) @@ -33,7 +34,11 @@ func CreateAccessToken(c *context.APIContext, form api.CreateAccessTokenOption) Name: form.Name, } if err := models.NewAccessToken(t); err != nil { - c.ServerError("NewAccessToken", err) + if errors.IsAccessTokenNameAlreadyExist(err) { + c.Error(http.StatusUnprocessableEntity, "", err) + } else { + c.ServerError("NewAccessToken", err) + } return } c.JSON(http.StatusCreated, &api.AccessToken{t.Name, t.Sha1}) diff --git a/routes/user/setting.go b/routes/user/setting.go index 2391fb98..e9d8182d 100644 --- a/routes/user/setting.go +++ b/routes/user/setting.go @@ -607,7 +607,12 @@ func SettingsApplicationsPost(c *context.Context, f form.NewAccessToken) { Name: f.Name, } if err := models.NewAccessToken(t); err != nil { - c.ServerError("NewAccessToken", err) + if errors.IsAccessTokenNameAlreadyExist(err) { + c.Flash.Error(c.Tr("settings.token_name_exists")) + c.SubURLRedirect("/user/settings/applications") + } else { + c.ServerError("NewAccessToken", err) + } return } |