aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/updater/versions.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2019-04-28 12:27:06 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2019-04-29 08:41:30 +0200
commite9682162ac908e9b9d81f3378faf8b38d1baa630 (patch)
tree1c3e6059569376c72336ba09f06e9a5ee5e1e833 /updater/versions.go
parentgo.mod: use forked winio with no thirdparty deps (diff)
downloadwireguard-windows-e9682162ac908e9b9d81f3378faf8b38d1baa630.tar.xz
wireguard-windows-e9682162ac908e9b9d81f3378faf8b38d1baa630.zip
updater: add initial skeleton
Diffstat (limited to 'updater/versions.go')
-rw-r--r--updater/versions.go85
1 files changed, 85 insertions, 0 deletions
diff --git a/updater/versions.go b/updater/versions.go
new file mode 100644
index 00000000..a5b6c258
--- /dev/null
+++ b/updater/versions.go
@@ -0,0 +1,85 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package updater
+
+import (
+ "errors"
+ "fmt"
+ "golang.zx2c4.com/wireguard/windows/version"
+ "runtime"
+ "strconv"
+ "strings"
+)
+
+func versionNewerThanUs(candidate string) (bool, error) {
+ candidateParts := strings.Split(candidate, ".")
+ ourParts := strings.Split(version.WireGuardWindowsVersion, ".")
+ if len(candidateParts) == 0 || len(ourParts) == 0 {
+ return false, errors.New("Empty version")
+ }
+ l := len(candidateParts)
+ if len(ourParts) > l {
+ l = len(ourParts)
+ }
+ for i := 0; i < l; i++ {
+ var err error
+ cP, oP := uint64(0), uint64(0)
+ if i < len(candidateParts) {
+ if len(candidateParts[i]) == 0 {
+ return false, errors.New("Empty version part")
+ }
+ cP, err = strconv.ParseUint(candidateParts[i], 10, 16)
+ if err != nil {
+ return false, errors.New("Invalid version integer part")
+ }
+ }
+ if i < len(ourParts) {
+ if len(ourParts[i]) == 0 {
+ return false, errors.New("Empty version part")
+ }
+ oP, err = strconv.ParseUint(ourParts[i], 10, 16)
+ if err != nil {
+ return false, errors.New("Invalid version integer part")
+ }
+ }
+ if cP == oP {
+ continue
+ }
+ return cP > oP, nil
+ }
+ return false, nil
+}
+
+func findCandidate(candidates fileList) (*UpdateFound, error) {
+ var arch string
+ if runtime.GOARCH == "amd64" {
+ arch = "amd64"
+ } else if runtime.GOARCH == "386" {
+ arch = "x86"
+ } else if runtime.GOARCH == "arm64" {
+ arch = "arm64"
+ } else {
+ return nil, errors.New("Invalid GOARCH")
+ }
+ prefix := fmt.Sprintf(msiArchPrefix, arch)
+ suffix := msiSuffix
+ for name, hash := range candidates {
+ if strings.HasPrefix(name, prefix) && strings.HasSuffix(name, suffix) {
+ version := strings.TrimSuffix(strings.TrimPrefix(name, prefix), suffix)
+ if len(version) > 128 {
+ return nil, errors.New("Version length is too long")
+ }
+ newer, err := versionNewerThanUs(version)
+ if err != nil {
+ return nil, err
+ }
+ if newer {
+ return &UpdateFound{name, hash}, nil
+ }
+ }
+ }
+ return nil, nil
+}