aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/locale/locale_en-US.ini1
-rw-r--r--models/errors/token.go16
-rw-r--r--models/token.go18
-rw-r--r--routes/api/v1/user/app.go7
-rw-r--r--routes/user/setting.go7
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
}