summaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorkali kaneko (leap communications) <kali@leap.se>2021-11-12 20:18:41 +0100
committerkali kaneko (leap communications) <kali@leap.se>2021-11-23 21:51:25 +0100
commitb15c31bdf47c2db5d95049090a5fd099ae1c1e02 (patch)
treed906f59048dd218490467594358432df6b3a8494 /pkg
parentb3453bbea901ed02ce3b458883f2f8ab03afc161 (diff)
[feat] simple update check
Diffstat (limited to 'pkg')
-rw-r--r--pkg/config/version/checknewer.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/pkg/config/version/checknewer.go b/pkg/config/version/checknewer.go
new file mode 100644
index 0000000..4b89c34
--- /dev/null
+++ b/pkg/config/version/checknewer.go
@@ -0,0 +1,86 @@
+package version
+
+import (
+ "io/ioutil"
+ "log"
+ "net/http"
+ "os"
+ "runtime"
+ "strings"
+)
+
+const verURI = "https://downloads.leap.se/RiseupVPN/"
+
+// returns true if there's a newer version string published on the server
+// this needs to manually bump latest version for every platform in the
+// downloads server.
+// at the moment, we hardcode RiseupVPN in the path, assuming that all clients
+// stay in sync.
+func CanUpgrade() bool {
+ log.Println("Checking for updates...")
+ uri := verURI
+ switch runtime.GOOS {
+ case "windows":
+ uri += "windows"
+ case "linux":
+ uri += "linux"
+ case "osx":
+ uri += "osx"
+ }
+ uri += "/lastver"
+ resp, err := http.Get(uri)
+ if err != nil {
+ log.Println(err)
+ return false
+ }
+ defer resp.Body.Close()
+ verStr, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ log.Println(err)
+ return false
+ }
+ r := strings.TrimSpace(string(verStr))
+ if strings.Count(r, "\n") > 1 {
+ log.Println("No remote version found at " + uri)
+ return false
+ }
+ canUpgrade := versionOrdinal(r) > versionOrdinal(VERSION)
+ if os.Getenv("DEBUG") == "1" {
+ log.Println(">>> Remote version: " + r)
+ log.Println(">>> Current version: " + VERSION)
+ if canUpgrade {
+ log.Println("Newer version available")
+ }
+ }
+ return canUpgrade
+}
+
+// https://stackoverflow.com/a/18411978
+func versionOrdinal(version string) string {
+ const maxByte = 1<<8 - 1
+ vo := make([]byte, 0, len(version)+8)
+ j := -1
+ for i := 0; i < len(version); i++ {
+ b := version[i]
+ if '0' > b || b > '9' {
+ vo = append(vo, b)
+ j = -1
+ continue
+ }
+ if j == -1 {
+ vo = append(vo, 0x00)
+ j = len(vo) - 1
+ }
+ if vo[j] == 1 && vo[j+1] == '0' {
+ vo[j+1] = b
+ continue
+ }
+ if vo[j]+1 > maxByte {
+ log.Println("VersionOrdinal: invalid version")
+ return string(vo)
+ }
+ vo = append(vo, b)
+ vo[j]++
+ }
+ return string(vo)
+}