Skip to content

Commit f860a6d

Browse files
authored
Add system setting table with cache and also add cache supports for user setting (#18058)
1 parent 5d3dbff commit f860a6d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1117
-436
lines changed

contrib/pr/checkout.go

+1-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"fmt"
1515
"log"
1616
"net/http"
17-
"net/url"
1817
"os"
1918
"os/exec"
2019
"os/user"
@@ -62,11 +61,7 @@ func runPR() {
6261
}
6362
setting.AppWorkPath = curDir
6463
setting.StaticRootPath = curDir
65-
setting.GravatarSourceURL, err = url.Parse("https://secure.gravatar.com/avatar/")
66-
if err != nil {
67-
log.Fatalf("url.Parse: %v\n", err)
68-
}
69-
64+
setting.GravatarSource = "https://secure.gravatar.com/avatar/"
7065
setting.AppURL = "http://localhost:8080/"
7166
setting.HTTPPort = "8080"
7267
setting.SSH.Domain = "localhost"

models/admin/notice_test.go

-117
This file was deleted.

models/avatars/avatar.go

+11-4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"sync"
1414

1515
"code.gitea.io/gitea/models/db"
16+
system_model "code.gitea.io/gitea/models/system"
1617
"code.gitea.io/gitea/modules/base"
1718
"code.gitea.io/gitea/modules/cache"
1819
"code.gitea.io/gitea/modules/log"
@@ -72,7 +73,7 @@ func GetEmailForHash(md5Sum string) (string, error) {
7273
// LibravatarURL returns the URL for the given email. Slow due to the DNS lookup.
7374
// This function should only be called if a federated avatar service is enabled.
7475
func LibravatarURL(email string) (*url.URL, error) {
75-
urlStr, err := setting.LibravatarService.FromEmail(email)
76+
urlStr, err := system_model.LibravatarService.FromEmail(email)
7677
if err != nil {
7778
log.Error("LibravatarService.FromEmail(email=%s): error %v", email, err)
7879
return nil, err
@@ -149,8 +150,10 @@ func generateEmailAvatarLink(email string, size int, final bool) string {
149150
return DefaultAvatarLink()
150151
}
151152

153+
enableFederatedAvatar, _ := system_model.GetSetting(system_model.KeyPictureEnableFederatedAvatar)
154+
152155
var err error
153-
if setting.EnableFederatedAvatar && setting.LibravatarService != nil {
156+
if enableFederatedAvatar != nil && enableFederatedAvatar.GetValueBool() && system_model.LibravatarService != nil {
154157
emailHash := saveEmailHash(email)
155158
if final {
156159
// for final link, we can spend more time on slow external query
@@ -166,12 +169,16 @@ func generateEmailAvatarLink(email string, size int, final bool) string {
166169
urlStr += "?size=" + strconv.Itoa(size)
167170
}
168171
return urlStr
169-
} else if !setting.DisableGravatar {
172+
}
173+
174+
disableGravatar, _ := system_model.GetSetting(system_model.KeyPictureDisableGravatar)
175+
if disableGravatar != nil && !disableGravatar.GetValueBool() {
170176
// copy GravatarSourceURL, because we will modify its Path.
171-
avatarURLCopy := *setting.GravatarSourceURL
177+
avatarURLCopy := *system_model.GravatarSourceURL
172178
avatarURLCopy.Path = path.Join(avatarURLCopy.Path, HashEmail(email))
173179
return generateRecognizedAvatarURL(avatarURLCopy, size)
174180
}
181+
175182
return DefaultAvatarLink()
176183
}
177184

models/avatars/avatar_test.go

+18-14
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,57 @@
22
// Use of this source code is governed by a MIT-style
33
// license that can be found in the LICENSE file.
44

5-
package avatars
5+
package avatars_test
66

77
import (
8-
"net/url"
98
"testing"
109

10+
avatars_model "code.gitea.io/gitea/models/avatars"
11+
system_model "code.gitea.io/gitea/models/system"
1112
"code.gitea.io/gitea/modules/setting"
1213

1314
"github.com/stretchr/testify/assert"
1415
)
1516

1617
const gravatarSource = "https://secure.gravatar.com/avatar/"
1718

18-
func disableGravatar() {
19-
setting.EnableFederatedAvatar = false
20-
setting.LibravatarService = nil
21-
setting.DisableGravatar = true
19+
func disableGravatar(t *testing.T) {
20+
err := system_model.SetSettingNoVersion(system_model.KeyPictureEnableFederatedAvatar, "false")
21+
assert.NoError(t, err)
22+
err = system_model.SetSettingNoVersion(system_model.KeyPictureDisableGravatar, "true")
23+
assert.NoError(t, err)
24+
system_model.LibravatarService = nil
2225
}
2326

2427
func enableGravatar(t *testing.T) {
25-
setting.DisableGravatar = false
26-
var err error
27-
setting.GravatarSourceURL, err = url.Parse(gravatarSource)
28+
err := system_model.SetSettingNoVersion(system_model.KeyPictureDisableGravatar, "false")
29+
assert.NoError(t, err)
30+
setting.GravatarSource = gravatarSource
31+
err = system_model.Init()
2832
assert.NoError(t, err)
2933
}
3034

3135
func TestHashEmail(t *testing.T) {
3236
assert.Equal(t,
3337
"d41d8cd98f00b204e9800998ecf8427e",
34-
HashEmail(""),
38+
avatars_model.HashEmail(""),
3539
)
3640
assert.Equal(t,
3741
"353cbad9b58e69c96154ad99f92bedc7",
38-
HashEmail("[email protected]"),
42+
avatars_model.HashEmail("[email protected]"),
3943
)
4044
}
4145

4246
func TestSizedAvatarLink(t *testing.T) {
4347
setting.AppSubURL = "/testsuburl"
4448

45-
disableGravatar()
49+
disableGravatar(t)
4650
assert.Equal(t, "/testsuburl/assets/img/avatar_default.png",
47-
GenerateEmailAvatarFastLink("[email protected]", 100))
51+
avatars_model.GenerateEmailAvatarFastLink("[email protected]", 100))
4852

4953
enableGravatar(t)
5054
assert.Equal(t,
5155
"https://secure.gravatar.com/avatar/353cbad9b58e69c96154ad99f92bedc7?d=identicon&s=100",
52-
GenerateEmailAvatarFastLink("[email protected]", 100),
56+
avatars_model.GenerateEmailAvatarFastLink("[email protected]", 100),
5357
)
5458
}

models/admin/main_test.go renamed to models/avatars/main_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a MIT-style
33
// license that can be found in the LICENSE file.
44

5-
package admin_test
5+
package avatars_test
66

77
import (
88
"path/filepath"

models/fixtures/system_setting.yml

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
-
2+
id: 1
3+
setting_key: 'disable_gravatar'
4+
setting_value: 'false'
5+
version: 1
6+
created: 1653533198
7+
updated: 1653533198
8+
9+
-
10+
id: 2
11+
setting_key: 'enable_federated_avatar'
12+
setting_value: 'false'
13+
version: 1
14+
created: 1653533198
15+
updated: 1653533198

models/issues/issue.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ import (
1313
"strconv"
1414
"strings"
1515

16-
admin_model "code.gitea.io/gitea/models/admin"
1716
"code.gitea.io/gitea/models/db"
1817
"code.gitea.io/gitea/models/foreignreference"
1918
"code.gitea.io/gitea/models/organization"
2019
"code.gitea.io/gitea/models/perm"
2120
access_model "code.gitea.io/gitea/models/perm/access"
2221
project_model "code.gitea.io/gitea/models/project"
2322
repo_model "code.gitea.io/gitea/models/repo"
23+
system_model "code.gitea.io/gitea/models/system"
2424
"code.gitea.io/gitea/models/unit"
2525
user_model "code.gitea.io/gitea/models/user"
2626
"code.gitea.io/gitea/modules/base"
@@ -2470,7 +2470,7 @@ func DeleteOrphanedIssues() error {
24702470

24712471
// Remove issue attachment files.
24722472
for i := range attachmentPaths {
2473-
admin_model.RemoveAllWithNotice(db.DefaultContext, "Delete issue attachment", attachmentPaths[i])
2473+
system_model.RemoveAllWithNotice(db.DefaultContext, "Delete issue attachment", attachmentPaths[i])
24742474
}
24752475
return nil
24762476
}

models/main_test.go

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
user_model "code.gitea.io/gitea/models/user"
1515
"code.gitea.io/gitea/modules/setting"
1616

17+
_ "code.gitea.io/gitea/models/system"
18+
1719
"github.com/stretchr/testify/assert"
1820
)
1921

models/migrations/migrations.go

+2
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,8 @@ var migrations = []Migration{
415415
NewMigration("Alter gpg_key/public_key content TEXT fields to MEDIUMTEXT", alterPublicGPGKeyContentFieldsToMediumText),
416416
// v226 -> v227
417417
NewMigration("Conan and generic packages do not need to be semantically versioned", fixPackageSemverField),
418+
// v227 -> v228
419+
NewMigration("Create key/value table for system settings", createSystemSettingsTable),
418420
}
419421

420422
// GetCurrentDBVersion returns the current db version

models/migrations/v227.go

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// Copyright 2022 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package migrations
6+
7+
import (
8+
"fmt"
9+
"strconv"
10+
11+
"code.gitea.io/gitea/modules/setting"
12+
"code.gitea.io/gitea/modules/timeutil"
13+
14+
"xorm.io/xorm"
15+
)
16+
17+
type SystemSetting struct {
18+
ID int64 `xorm:"pk autoincr"`
19+
SettingKey string `xorm:"varchar(255) unique"` // ensure key is always lowercase
20+
SettingValue string `xorm:"text"`
21+
Version int `xorm:"version"` // prevent to override
22+
Created timeutil.TimeStamp `xorm:"created"`
23+
Updated timeutil.TimeStamp `xorm:"updated"`
24+
}
25+
26+
func insertSettingsIfNotExist(x *xorm.Engine, sysSettings []*SystemSetting) error {
27+
sess := x.NewSession()
28+
defer sess.Close()
29+
if err := sess.Begin(); err != nil {
30+
return err
31+
}
32+
for _, setting := range sysSettings {
33+
exist, err := sess.Table("system_setting").Where("setting_key=?", setting.SettingKey).Exist()
34+
if err != nil {
35+
return err
36+
}
37+
if !exist {
38+
if _, err := sess.Insert(setting); err != nil {
39+
return err
40+
}
41+
}
42+
}
43+
return sess.Commit()
44+
}
45+
46+
func createSystemSettingsTable(x *xorm.Engine) error {
47+
if err := x.Sync2(new(SystemSetting)); err != nil {
48+
return fmt.Errorf("sync2: %v", err)
49+
}
50+
51+
// migrate xx to database
52+
sysSettings := []*SystemSetting{
53+
{
54+
SettingKey: "picture.disable_gravatar",
55+
SettingValue: strconv.FormatBool(setting.DisableGravatar),
56+
},
57+
{
58+
SettingKey: "picture.enable_federated_avatar",
59+
SettingValue: strconv.FormatBool(setting.EnableFederatedAvatar),
60+
},
61+
}
62+
63+
return insertSettingsIfNotExist(x, sysSettings)
64+
}

0 commit comments

Comments
 (0)