aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoïc Dachary2023-03-13 00:55:33 +0100
committerLoïc Dachary2023-03-13 00:55:33 +0100
commitc43ad74240e72ce57a5000fa134292732602acf7 (patch)
treebb682cd55e05450b8ade38341d10fb93757fa1a3
parent6f3665bcf228da3339d3f42038aa402f9e621544 (diff)
parentfb3a37fbfc73d35e3ba8d793b6051aeddcbb0634 (diff)
Merge remote-tracking branch 'forgejo/forgejo-privacy' into forgejo
-rw-r--r--custom/conf/app.example.ini1
-rw-r--r--docs/content/doc/advanced/config-cheat-sheet.en-us.md1
-rw-r--r--modules/updatechecker/update_checker.go60
-rw-r--r--modules/updatechecker/update_checker_test.go16
-rw-r--r--services/cron/tasks_extended.go10
5 files changed, 77 insertions, 11 deletions
diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 3fcc80888..82ce64ce0 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -2222,6 +2222,7 @@ ROUTER = console
;ENABLE_SUCCESS_NOTICE = false
;SCHEDULE = @every 168h
;HTTP_ENDPOINT = https://dl.gitea.io/gitea/version.json
+;DOMAIN_ENDPOINT = release.forgejo.org
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/docs/content/doc/advanced/config-cheat-sheet.en-us.md b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
index 7d5d1692c..6d8ca188a 100644
--- a/docs/content/doc/advanced/config-cheat-sheet.en-us.md
+++ b/docs/content/doc/advanced/config-cheat-sheet.en-us.md
@@ -1053,6 +1053,7 @@ Default templates for project boards:
- `ENABLE_SUCCESS_NOTICE`: **true**: Set to false to switch off success notices.
- `SCHEDULE`: **@every 168h**: Cron syntax for scheduling a work, e.g. `@every 168h`.
- `HTTP_ENDPOINT`: **https://dl.gitea.io/gitea/version.json**: the endpoint that Gitea will check for newer versions
+- `DOMAIN_ENDPOINT`: **release.forgejo.org**: the domain that, if specified, Gitea will check for newer versions. This is preferred over `HTTP_ENDPOINT`.
#### Cron - Delete all old system notices from database ('cron.delete_old_system_notices')
diff --git a/modules/updatechecker/update_checker.go b/modules/updatechecker/update_checker.go
index bc3f93aad..d3008ab12 100644
--- a/modules/updatechecker/update_checker.go
+++ b/modules/updatechecker/update_checker.go
@@ -4,8 +4,11 @@
package updatechecker
import (
+ "errors"
"io"
+ "net"
"net/http"
+ "strings"
"code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/proxy"
@@ -26,7 +29,51 @@ func (r *CheckerState) Name() string {
}
// GiteaUpdateChecker returns error when new version of Gitea is available
-func GiteaUpdateChecker(httpEndpoint string) error {
+func GiteaUpdateChecker(httpEndpoint, domainEndpoint string) error {
+ var version string
+ var err error
+ if domainEndpoint != "" {
+ version, err = getVersionDNS(domainEndpoint)
+ } else {
+ version, err = getVersionHTTP(httpEndpoint)
+ }
+
+ if err != nil {
+ return err
+ }
+
+ return UpdateRemoteVersion(version)
+}
+
+// getVersionDNS will request the TXT records for the domain. If a record starts
+// with "forgejo_versions=" everything after that will be used as the latest
+// version available.
+func getVersionDNS(domainEndpoint string) (version string, err error) {
+ records, err := net.LookupTXT(domainEndpoint)
+ if err != nil {
+ return "", err
+ }
+
+ if len(records) == 0 {
+ return "", errors.New("no TXT records were found")
+ }
+
+ for _, record := range records {
+ if strings.HasPrefix(record, "forgejo_versions=") {
+ // Get all supported versions, separated by a comma.
+ supportedVersions := strings.Split(strings.TrimPrefix(record, "forgejo_versions="), ",")
+ // For now always return the latest supported version.
+ return supportedVersions[len(supportedVersions)-1], nil
+ }
+ }
+
+ return "", errors.New("there is no TXT record with a valid value")
+}
+
+// getVersionHTTP will make an HTTP request to the endpoint, and the returned
+// content is JSON. The "latest.version" path's value will be used as the latest
+// version available.
+func getVersionHTTP(httpEndpoint string) (version string, err error) {
httpClient := &http.Client{
Transport: &http.Transport{
Proxy: proxy.Proxy(),
@@ -35,16 +82,16 @@ func GiteaUpdateChecker(httpEndpoint string) error {
req, err := http.NewRequest("GET", httpEndpoint, nil)
if err != nil {
- return err
+ return "", err
}
resp, err := httpClient.Do(req)
if err != nil {
- return err
+ return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
- return err
+ return "", err
}
type respType struct {
@@ -55,10 +102,9 @@ func GiteaUpdateChecker(httpEndpoint string) error {
respData := respType{}
err = json.Unmarshal(body, &respData)
if err != nil {
- return err
+ return "", err
}
-
- return UpdateRemoteVersion(respData.Latest.Version)
+ return respData.Latest.Version, nil
}
// UpdateRemoteVersion updates the latest available version of Gitea
diff --git a/modules/updatechecker/update_checker_test.go b/modules/updatechecker/update_checker_test.go
new file mode 100644
index 000000000..301afd95e
--- /dev/null
+++ b/modules/updatechecker/update_checker_test.go
@@ -0,0 +1,16 @@
+// Copyright 2023 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package updatechecker
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestDNSUpdate(t *testing.T) {
+ version, err := getVersionDNS("release.forgejo.org")
+ assert.NoError(t, err)
+ assert.NotEmpty(t, version)
+}
diff --git a/services/cron/tasks_extended.go b/services/cron/tasks_extended.go
index 3e0dbd132..39568ff7e 100644
--- a/services/cron/tasks_extended.go
+++ b/services/cron/tasks_extended.go
@@ -142,18 +142,20 @@ func registerDeleteOldActions() {
func registerUpdateGiteaChecker() {
type UpdateCheckerConfig struct {
BaseConfig
- HTTPEndpoint string
+ HTTPEndpoint string
+ DomainEndpoint string
}
RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
BaseConfig: BaseConfig{
- Enabled: true,
+ Enabled: false,
RunAtStart: false,
Schedule: "@every 168h",
},
- HTTPEndpoint: "https://dl.gitea.io/gitea/version.json",
+ HTTPEndpoint: "https://dl.gitea.io/gitea/version.json",
+ DomainEndpoint: "release.forgejo.org",
}, func(ctx context.Context, _ *user_model.User, config Config) error {
updateCheckerConfig := config.(*UpdateCheckerConfig)
- return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint)
+ return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint, updateCheckerConfig.DomainEndpoint)
})
}