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  }