Skip to content

Commit 81ead7c

Browse files
authored
Support user secrets (#2126)
1 parent 09624aa commit 81ead7c

File tree

18 files changed

+251
-22
lines changed

18 files changed

+251
-22
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ ui-dependencies: ## Install UI dependencies
139139
.PHONY: lint
140140
lint: install-tools ## Lint code
141141
@echo "Running golangci-lint"
142-
golangci-lint run --timeout 10m
142+
golangci-lint run --timeout 15m
143143
@echo "Running zerolog linter"
144144
lint github.com/woodpecker-ci/woodpecker/cmd/agent
145145
lint github.com/woodpecker-ci/woodpecker/cmd/cli

cmd/server/docs/docs.go

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/api/org.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,15 @@ func GetOrgPermissions(c *gin.Context) {
9191
return
9292
}
9393

94-
if (org.IsUser && org.Name == user.Login) || user.Admin {
94+
if (org.IsUser && org.Name == user.Login) || (user.Admin && !org.IsUser) {
9595
c.JSON(http.StatusOK, &model.OrgPerm{
9696
Member: true,
9797
Admin: true,
9898
})
9999
return
100+
} else if org.IsUser {
101+
c.JSON(http.StatusOK, &model.OrgPerm{})
102+
return
100103
}
101104

102105
perm, err := server.Config.Services.Membership.Get(c, user, org.Name)

server/model/user.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ type User struct {
6464

6565
// Hash is a unique token used to sign tokens.
6666
Hash string `json:"-" xorm:"UNIQUE varchar(500) 'user_hash'"`
67+
68+
// OrgID is the of the user as model.Org.
69+
OrgID int64 `json:"org_id" xorm:"user_org_id"`
6770
} // @name User
6871

6972
// TableName return database table name for xorm

server/store/datastore/feed_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
)
2424

2525
func TestGetPipelineQueue(t *testing.T) {
26-
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline))
26+
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline), new(model.Org))
2727
defer closer()
2828

2929
user := &model.User{
@@ -64,7 +64,7 @@ func TestGetPipelineQueue(t *testing.T) {
6464
}
6565

6666
func TestUserFeed(t *testing.T) {
67-
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline))
67+
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline), new(model.Org))
6868
defer closer()
6969

7070
user := &model.User{
@@ -115,7 +115,7 @@ func TestUserFeed(t *testing.T) {
115115
}
116116

117117
func TestRepoListLatest(t *testing.T) {
118-
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline))
118+
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Pipeline), new(model.Org))
119119
defer closer()
120120

121121
user := &model.User{
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright 2022 Woodpecker Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package migration
16+
17+
import (
18+
"fmt"
19+
20+
"xorm.io/xorm"
21+
22+
"github.com/woodpecker-ci/woodpecker/server/model"
23+
)
24+
25+
var addOrgID = task{
26+
name: "add-org-id",
27+
required: true,
28+
fn: func(sess *xorm.Session) error {
29+
if err := sess.Sync(new(model.User)); err != nil {
30+
return fmt.Errorf("sync new models failed: %w", err)
31+
}
32+
33+
// get all users
34+
var users []*model.User
35+
if err := sess.Find(&users); err != nil {
36+
return fmt.Errorf("find all repos failed: %w", err)
37+
}
38+
39+
for _, user := range users {
40+
org := &model.Org{}
41+
has, err := sess.Where("name = ?", user.Login).Get(org)
42+
if err != nil {
43+
return fmt.Errorf("getting org failed: %w", err)
44+
} else if !has {
45+
org = &model.Org{
46+
Name: user.Login,
47+
IsUser: true,
48+
}
49+
if _, err := sess.Insert(org); err != nil {
50+
return fmt.Errorf("inserting org failed: %w", err)
51+
}
52+
}
53+
user.OrgID = org.ID
54+
if _, err := sess.Cols("user_org_id").Update(user); err != nil {
55+
return fmt.Errorf("updating user failed: %w", err)
56+
}
57+
}
58+
59+
return dropTableColumns(sess, "secrets", "secret_owner")
60+
},
61+
}

server/store/datastore/migration/migration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ var migrationTasks = []*task{
5454
&migrateLogs2LogEntries,
5555
&parentStepsToWorkflows,
5656
&addOrgs,
57+
&addOrgID,
5758
}
5859

5960
var allBeans = []interface{}{

server/store/datastore/org.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@ import (
1818
"strings"
1919

2020
"github.com/woodpecker-ci/woodpecker/server/model"
21+
"xorm.io/xorm"
2122
)
2223

2324
func (s storage) OrgCreate(org *model.Org) error {
25+
return s.orgCreate(org, s.engine.NewSession())
26+
}
27+
28+
func (s storage) orgCreate(org *model.Org, sess *xorm.Session) error {
2429
// sanitize
2530
org.Name = strings.ToLower(org.Name)
2631
// insert
27-
_, err := s.engine.Insert(org)
32+
_, err := sess.Insert(org)
2833
return err
2934
}
3035

server/store/datastore/repo_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func TestRepos(t *testing.T) {
140140
}
141141

142142
func TestRepoList(t *testing.T) {
143-
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm))
143+
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Org))
144144
defer closer()
145145

146146
user := &model.User{
@@ -196,7 +196,7 @@ func TestRepoList(t *testing.T) {
196196
}
197197

198198
func TestOwnedRepoList(t *testing.T) {
199-
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm))
199+
store, closer := newTestStore(t, new(model.Repo), new(model.User), new(model.Perm), new(model.Org))
200200
defer closer()
201201

202202
user := &model.User{

server/store/datastore/user.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,18 @@ func (s storage) GetUserCount() (int64, error) {
5353
}
5454

5555
func (s storage) CreateUser(user *model.User) error {
56+
sess := s.engine.NewSession()
57+
org := &model.Org{
58+
Name: user.Login,
59+
IsUser: true,
60+
}
61+
err := s.orgCreate(org, sess)
62+
if err != nil {
63+
return err
64+
}
65+
user.OrgID = org.ID
5666
// only Insert set auto created ID back to object
57-
_, err := s.engine.Insert(user)
67+
_, err = sess.Insert(user)
5868
return err
5969
}
6070

0 commit comments

Comments
 (0)