2021-10-16 09:14:34 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-10-16 09:14:34 +03:00
2021-10-21 19:10:49 +03:00
package updatechecker
2021-10-16 09:14:34 +03:00
import (
2023-10-15 18:46:06 +03:00
"context"
2022-01-10 04:48:13 +03:00
"io"
2021-10-16 09:14:34 +03:00
"net/http"
2021-12-17 04:15:02 +03:00
"code.gitea.io/gitea/modules/json"
2021-10-16 09:14:34 +03:00
"code.gitea.io/gitea/modules/proxy"
"code.gitea.io/gitea/modules/setting"
2022-10-17 02:29:26 +03:00
"code.gitea.io/gitea/modules/system"
2021-10-16 09:14:34 +03:00
"github.com/hashicorp/go-version"
)
2021-10-21 19:10:49 +03:00
// CheckerState stores the remote version from the JSON endpoint
type CheckerState struct {
LatestVersion string
2021-10-16 09:14:34 +03:00
}
2021-10-21 19:10:49 +03:00
// Name returns the name of the state item for update checker
func ( r * CheckerState ) Name ( ) string {
return "update-checker"
2021-10-16 09:14:34 +03:00
}
// GiteaUpdateChecker returns error when new version of Gitea is available
func GiteaUpdateChecker ( httpEndpoint string ) error {
httpClient := & http . Client {
Transport : & http . Transport {
Proxy : proxy . Proxy ( ) ,
} ,
}
req , err := http . NewRequest ( "GET" , httpEndpoint , nil )
if err != nil {
return err
}
resp , err := httpClient . Do ( req )
if err != nil {
return err
}
defer resp . Body . Close ( )
2022-01-10 04:48:13 +03:00
body , err := io . ReadAll ( resp . Body )
2021-10-16 09:14:34 +03:00
if err != nil {
return err
}
2021-10-21 19:10:49 +03:00
type respType struct {
2021-10-16 09:14:34 +03:00
Latest struct {
Version string ` json:"version" `
} ` json:"latest" `
}
2021-10-21 19:10:49 +03:00
respData := respType { }
err = json . Unmarshal ( body , & respData )
2021-10-16 09:14:34 +03:00
if err != nil {
return err
}
2023-10-15 18:46:06 +03:00
return UpdateRemoteVersion ( req . Context ( ) , respData . Latest . Version )
2021-10-16 09:14:34 +03:00
}
// UpdateRemoteVersion updates the latest available version of Gitea
2023-10-15 18:46:06 +03:00
func UpdateRemoteVersion ( ctx context . Context , version string ) ( err error ) {
return system . AppState . Set ( ctx , & CheckerState { LatestVersion : version } )
2021-10-16 09:14:34 +03:00
}
2022-01-10 12:32:37 +03:00
// GetRemoteVersion returns the current remote version (or currently installed version if fail to fetch from DB)
2023-10-15 18:46:06 +03:00
func GetRemoteVersion ( ctx context . Context ) string {
2021-10-21 19:10:49 +03:00
item := new ( CheckerState )
2023-10-15 18:46:06 +03:00
if err := system . AppState . Get ( ctx , item ) ; err != nil {
2021-10-21 19:10:49 +03:00
return ""
2021-10-16 09:14:34 +03:00
}
2021-10-21 19:10:49 +03:00
return item . LatestVersion
2021-10-16 09:14:34 +03:00
}
// GetNeedUpdate returns true whether a newer version of Gitea is available
2023-10-15 18:46:06 +03:00
func GetNeedUpdate ( ctx context . Context ) bool {
2021-10-16 09:14:34 +03:00
curVer , err := version . NewVersion ( setting . AppVer )
if err != nil {
// return false to fail silently
return false
}
2023-10-15 18:46:06 +03:00
remoteVerStr := GetRemoteVersion ( ctx )
2021-10-21 19:10:49 +03:00
if remoteVerStr == "" {
// no remote version is known
return false
}
remoteVer , err := version . NewVersion ( remoteVerStr )
2021-10-16 09:14:34 +03:00
if err != nil {
// return false to fail silently
return false
}
return curVer . LessThan ( remoteVer )
}