mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-17 11:36:22 +00:00
Merge remote-tracking branch 'forgejo/forgejo-privacy' into forgejo
This commit is contained in:
commit
2c496b31c2
|
@ -2182,6 +2182,7 @@ ROUTER = console
|
||||||
;ENABLE_SUCCESS_NOTICE = false
|
;ENABLE_SUCCESS_NOTICE = false
|
||||||
;SCHEDULE = @every 168h
|
;SCHEDULE = @every 168h
|
||||||
;HTTP_ENDPOINT = https://dl.gitea.io/gitea/version.json
|
;HTTP_ENDPOINT = https://dl.gitea.io/gitea/version.json
|
||||||
|
;DOMAIN_ENDPOINT = release.forgejo.org
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
|
|
|
@ -1029,6 +1029,7 @@ Default templates for project boards:
|
||||||
- `ENABLE_SUCCESS_NOTICE`: **true**: Set to false to switch off success notices.
|
- `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`.
|
- `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
|
- `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`)
|
#### Cron - Delete all old system notices from database (`cron.delete_old_system_notices`)
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,11 @@
|
||||||
package updatechecker
|
package updatechecker
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"code.gitea.io/gitea/modules/json"
|
"code.gitea.io/gitea/modules/json"
|
||||||
"code.gitea.io/gitea/modules/proxy"
|
"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
|
// 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{
|
httpClient := &http.Client{
|
||||||
Transport: &http.Transport{
|
Transport: &http.Transport{
|
||||||
Proxy: proxy.Proxy(),
|
Proxy: proxy.Proxy(),
|
||||||
|
@ -35,16 +82,16 @@ func GiteaUpdateChecker(httpEndpoint string) error {
|
||||||
|
|
||||||
req, err := http.NewRequest("GET", httpEndpoint, nil)
|
req, err := http.NewRequest("GET", httpEndpoint, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
resp, err := httpClient.Do(req)
|
resp, err := httpClient.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
type respType struct {
|
type respType struct {
|
||||||
|
@ -55,10 +102,9 @@ func GiteaUpdateChecker(httpEndpoint string) error {
|
||||||
respData := respType{}
|
respData := respType{}
|
||||||
err = json.Unmarshal(body, &respData)
|
err = json.Unmarshal(body, &respData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return "", err
|
||||||
}
|
}
|
||||||
|
return respData.Latest.Version, nil
|
||||||
return UpdateRemoteVersion(respData.Latest.Version)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateRemoteVersion updates the latest available version of Gitea
|
// UpdateRemoteVersion updates the latest available version of Gitea
|
||||||
|
|
16
modules/updatechecker/update_checker_test.go
Normal file
16
modules/updatechecker/update_checker_test.go
Normal file
|
@ -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)
|
||||||
|
}
|
|
@ -142,18 +142,20 @@ func registerDeleteOldActions() {
|
||||||
func registerUpdateGiteaChecker() {
|
func registerUpdateGiteaChecker() {
|
||||||
type UpdateCheckerConfig struct {
|
type UpdateCheckerConfig struct {
|
||||||
BaseConfig
|
BaseConfig
|
||||||
HTTPEndpoint string
|
HTTPEndpoint string
|
||||||
|
DomainEndpoint string
|
||||||
}
|
}
|
||||||
RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
|
RegisterTaskFatal("update_checker", &UpdateCheckerConfig{
|
||||||
BaseConfig: BaseConfig{
|
BaseConfig: BaseConfig{
|
||||||
Enabled: true,
|
Enabled: false,
|
||||||
RunAtStart: false,
|
RunAtStart: false,
|
||||||
Schedule: "@every 168h",
|
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 {
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
||||||
updateCheckerConfig := config.(*UpdateCheckerConfig)
|
updateCheckerConfig := config.(*UpdateCheckerConfig)
|
||||||
return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint)
|
return updatechecker.GiteaUpdateChecker(updateCheckerConfig.HTTPEndpoint, updateCheckerConfig.DomainEndpoint)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue