diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-28 12:27:06 +0200 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2019-04-29 08:41:30 +0200 |
commit | e9682162ac908e9b9d81f3378faf8b38d1baa630 (patch) | |
tree | 1c3e6059569376c72336ba09f06e9a5ee5e1e833 /updater/versions.go | |
parent | go.mod: use forked winio with no thirdparty deps (diff) | |
download | wireguard-windows-e9682162ac908e9b9d81f3378faf8b38d1baa630.tar.xz wireguard-windows-e9682162ac908e9b9d81f3378faf8b38d1baa630.zip |
updater: add initial skeleton
Diffstat (limited to 'updater/versions.go')
-rw-r--r-- | updater/versions.go | 85 |
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 +} |