From e9682162ac908e9b9d81f3378faf8b38d1baa630 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Sun, 28 Apr 2019 12:27:06 +0200 Subject: updater: add initial skeleton --- updater/versions.go | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 updater/versions.go (limited to 'updater/versions.go') 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 +} -- cgit v1.2.3-59-g8ed1b