golang.zx2c4.com/wireguard/windows@v0.5.4-0.20230123132234-dcc0eb72a04b/updater/versions.go (about) 1 /* SPDX-License-Identifier: MIT 2 * 3 * Copyright (C) 2019-2022 WireGuard LLC. All Rights Reserved. 4 */ 5 6 package updater 7 8 import ( 9 "errors" 10 "fmt" 11 "strconv" 12 "strings" 13 14 "golang.zx2c4.com/wireguard/windows/version" 15 ) 16 17 func versionNewerThanUs(candidate string) (bool, error) { 18 candidateParts := strings.Split(candidate, ".") 19 ourParts := strings.Split(version.Number, ".") 20 if len(candidateParts) == 0 || len(ourParts) == 0 { 21 return false, errors.New("Empty version") 22 } 23 l := len(candidateParts) 24 if len(ourParts) > l { 25 l = len(ourParts) 26 } 27 for i := 0; i < l; i++ { 28 var err error 29 cP, oP := uint64(0), uint64(0) 30 if i < len(candidateParts) { 31 if len(candidateParts[i]) == 0 { 32 return false, errors.New("Empty version part") 33 } 34 cP, err = strconv.ParseUint(candidateParts[i], 10, 16) 35 if err != nil { 36 return false, errors.New("Invalid version integer part") 37 } 38 } 39 if i < len(ourParts) { 40 if len(ourParts[i]) == 0 { 41 return false, errors.New("Empty version part") 42 } 43 oP, err = strconv.ParseUint(ourParts[i], 10, 16) 44 if err != nil { 45 return false, errors.New("Invalid version integer part") 46 } 47 } 48 if cP == oP { 49 continue 50 } 51 return cP > oP, nil 52 } 53 return false, nil 54 } 55 56 func findCandidate(candidates fileList) (*UpdateFound, error) { 57 prefix := fmt.Sprintf(msiArchPrefix, version.Arch()) 58 suffix := msiSuffix 59 for name, hash := range candidates { 60 if strings.HasPrefix(name, prefix) && strings.HasSuffix(name, suffix) { 61 version := strings.TrimSuffix(strings.TrimPrefix(name, prefix), suffix) 62 if len(version) > 128 { 63 return nil, errors.New("Version length is too long") 64 } 65 newer, err := versionNewerThanUs(version) 66 if err != nil { 67 return nil, err 68 } 69 if newer { 70 return &UpdateFound{name, hash}, nil 71 } 72 } 73 } 74 return nil, nil 75 }