diff options
author | 6543 <6543@obermui.de> | 2020-02-09 15:33:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-09 14:33:03 +0000 |
commit | e273817154e98b7b675e43e97cd17f48a603cf9e (patch) | |
tree | 9f350c301a87d3dd57b4bdad954cf1c44185cb1a /models | |
parent | 74a4a1e17f99d147db9329718a5ecc87984b0ecd (diff) | |
download | gitea-e273817154e98b7b675e43e97cd17f48a603cf9e.tar.gz gitea-e273817154e98b7b675e43e97cd17f48a603cf9e.zip |
[API] Fix inconsistent label color format (#10129)
* update and use labelColorPattern
* add TestCases
* fix lint
* # optional for templates
* fix typo
* some more
* fix lint of **master**
Diffstat (limited to 'models')
-rw-r--r-- | models/issue_label.go | 80 | ||||
-rw-r--r-- | models/issue_label_test.go | 5 | ||||
-rw-r--r-- | models/user.go | 2 |
3 files changed, 52 insertions, 35 deletions
diff --git a/models/issue_label.go b/models/issue_label.go index abf0521cea..9e492dbec1 100644 --- a/models/issue_label.go +++ b/models/issue_label.go @@ -18,7 +18,34 @@ import ( "xorm.io/xorm" ) -var labelColorPattern = regexp.MustCompile("#([a-fA-F0-9]{6})") +// LabelColorPattern is a regexp witch can validate LabelColor +var LabelColorPattern = regexp.MustCompile("^#[0-9a-fA-F]{6}$") + +// Label represents a label of repository for issues. +type Label struct { + ID int64 `xorm:"pk autoincr"` + RepoID int64 `xorm:"INDEX"` + Name string + Description string + Color string `xorm:"VARCHAR(7)"` + NumIssues int + NumClosedIssues int + NumOpenIssues int `xorm:"-"` + IsChecked bool `xorm:"-"` + QueryString string `xorm:"-"` + IsSelected bool `xorm:"-"` + IsExcluded bool `xorm:"-"` +} + +// APIFormat converts a Label to the api.Label format +func (label *Label) APIFormat() *api.Label { + return &api.Label{ + ID: label.ID, + Name: label.Name, + Color: strings.TrimLeft(label.Color, "#"), + Description: label.Description, + } +} // GetLabelTemplateFile loads the label template file by given name, // then parses and returns a list of name-color pairs and optionally description. @@ -43,7 +70,11 @@ func GetLabelTemplateFile(name string) ([][3]string, error) { return nil, fmt.Errorf("line is malformed: %s", line) } - if !labelColorPattern.MatchString(fields[0]) { + color := strings.Trim(fields[0], " ") + if len(color) == 6 { + color = "#" + color + } + if !LabelColorPattern.MatchString(color) { return nil, fmt.Errorf("bad HTML color code in line: %s", line) } @@ -54,38 +85,12 @@ func GetLabelTemplateFile(name string) ([][3]string, error) { } fields[1] = strings.TrimSpace(fields[1]) - list = append(list, [3]string{fields[1], fields[0], description}) + list = append(list, [3]string{fields[1], color, description}) } return list, nil } -// Label represents a label of repository for issues. -type Label struct { - ID int64 `xorm:"pk autoincr"` - RepoID int64 `xorm:"INDEX"` - Name string - Description string - Color string `xorm:"VARCHAR(7)"` - NumIssues int - NumClosedIssues int - NumOpenIssues int `xorm:"-"` - IsChecked bool `xorm:"-"` - QueryString string `xorm:"-"` - IsSelected bool `xorm:"-"` - IsExcluded bool `xorm:"-"` -} - -// APIFormat converts a Label to the api.Label format -func (label *Label) APIFormat() *api.Label { - return &api.Label{ - ID: label.ID, - Name: label.Name, - Color: strings.TrimLeft(label.Color, "#"), - Description: label.Description, - } -} - // CalOpenIssues calculates the open issues of label. func (label *Label) CalOpenIssues() { label.NumOpenIssues = label.NumIssues - label.NumClosedIssues @@ -152,7 +157,7 @@ func LoadLabelsFormatted(labelTemplate string) (string, error) { return strings.Join(labels, ", "), err } -func initalizeLabels(e Engine, repoID int64, labelTemplate string) error { +func initializeLabels(e Engine, repoID int64, labelTemplate string) error { list, err := GetLabelTemplateFile(labelTemplate) if err != nil { return ErrIssueLabelTemplateLoad{labelTemplate, err} @@ -175,9 +180,9 @@ func initalizeLabels(e Engine, repoID int64, labelTemplate string) error { return nil } -// InitalizeLabels adds a label set to a repository using a template -func InitalizeLabels(ctx DBContext, repoID int64, labelTemplate string) error { - return initalizeLabels(ctx.e, repoID, labelTemplate) +// InitializeLabels adds a label set to a repository using a template +func InitializeLabels(ctx DBContext, repoID int64, labelTemplate string) error { + return initializeLabels(ctx.e, repoID, labelTemplate) } func newLabel(e Engine, label *Label) error { @@ -187,6 +192,9 @@ func newLabel(e Engine, label *Label) error { // NewLabel creates a new label for a repository func NewLabel(label *Label) error { + if !LabelColorPattern.MatchString(label.Color) { + return fmt.Errorf("bad color code: %s", label.Color) + } return newLabel(x, label) } @@ -198,6 +206,9 @@ func NewLabels(labels ...*Label) error { return err } for _, label := range labels { + if !LabelColorPattern.MatchString(label.Color) { + return fmt.Errorf("bad color code: %s", label.Color) + } if err := newLabel(sess, label); err != nil { return err } @@ -359,6 +370,9 @@ func updateLabel(e Engine, l *Label) error { // UpdateLabel updates label information. func UpdateLabel(l *Label) error { + if !LabelColorPattern.MatchString(l.Color) { + return fmt.Errorf("bad color code: %s", l.Color) + } return updateLabel(x, l) } diff --git a/models/issue_label_test.go b/models/issue_label_test.go index e0aaf82f76..d831792861 100644 --- a/models/issue_label_test.go +++ b/models/issue_label_test.go @@ -45,8 +45,11 @@ func TestNewLabels(t *testing.T) { assert.NoError(t, PrepareTestDatabase()) labels := []*Label{ {RepoID: 2, Name: "labelName2", Color: "#123456"}, - {RepoID: 3, Name: "labelName3", Color: "#234567"}, + {RepoID: 3, Name: "labelName3", Color: "#23456F"}, } + assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: ""})) + assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "123456"})) + assert.Error(t, NewLabel(&Label{RepoID: 3, Name: "invalid Color", Color: "#12345G"})) for _, label := range labels { AssertNotExistsBean(t, label) } diff --git a/models/user.go b/models/user.go index a68db6cf40..220a9f9a9a 100644 --- a/models/user.go +++ b/models/user.go @@ -1044,7 +1044,7 @@ func ChangeUserName(u *User, newUserName string) (err error) { } else if isExist { return ErrUserAlreadyExist{newUserName} } - + sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { |