1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
/* SPDX-License-Identifier: MIT
*
* Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
*/
package updater
import (
"errors"
"fmt"
"strconv"
"strings"
"golang.zx2c4.com/wireguard/windows/version"
)
func versionNewerThanUs(candidate string) (bool, error) {
candidateParts := strings.Split(candidate, ".")
ourParts := strings.Split(version.Number, ".")
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) {
arch, err := findArch()
if err != nil {
return nil, err
}
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
}
|