Skip to content

Commit 5eda0f0

Browse files
1gtmtamalsaha
andauthored
[cherry-pick] Update license verifier (#108) (#110)
/cherry-pick Signed-off-by: Tamal Saha <tamal@appscode.com> Co-authored-by: Tamal Saha <tamal@appscode.com>
1 parent f32fe64 commit 5eda0f0

File tree

7 files changed

+63
-68
lines changed

7 files changed

+63
-68
lines changed

go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.18
44

55
require (
66
github.com/spf13/cobra v1.7.0
7-
go.bytebuilders.dev/license-verifier/kubernetes v0.12.0
7+
go.bytebuilders.dev/license-verifier/kubernetes v0.13.2
88
gomodules.xyz/flags v0.1.3
99
gomodules.xyz/go-sh v0.1.0
1010
gomodules.xyz/logs v0.0.6
@@ -18,6 +18,8 @@ require (
1818
stash.appscode.dev/apimachinery v0.30.0
1919
)
2020

21+
require github.com/cespare/xxhash/v2 v2.2.0 // indirect
22+
2123
require (
2224
cloud.google.com/go v0.97.0 // indirect
2325
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
@@ -60,7 +62,7 @@ require (
6062
github.com/yudai/gojsondiff v1.0.0 // indirect
6163
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
6264
go.bytebuilders.dev/license-proxyserver v0.0.3 // indirect
63-
go.bytebuilders.dev/license-verifier v0.13.0 // indirect
65+
go.bytebuilders.dev/license-verifier v0.13.2 // indirect
6466
golang.org/x/crypto v0.9.0 // indirect
6567
golang.org/x/net v0.10.0 // indirect
6668
golang.org/x/oauth2 v0.5.0 // indirect

go.sum

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
8282
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
8383
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
8484
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
85-
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
8685
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
87-
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
86+
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
87+
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
8888
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
8989
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
9090
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
@@ -401,10 +401,10 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
401401
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
402402
go.bytebuilders.dev/license-proxyserver v0.0.3 h1:vAFMBWfrlmFKNspjBm2KfPXnxYnC17xLwZiHmVzUmzs=
403403
go.bytebuilders.dev/license-proxyserver v0.0.3/go.mod h1:iMJbPzDf2R2EJOZwRi7ziEr5DBMfT9Cm75/XfPb/QnU=
404-
go.bytebuilders.dev/license-verifier v0.13.0 h1:VyI8XydrZbzClSk45rPcjz9dVhyL0EfpWW4T08SXMGo=
405-
go.bytebuilders.dev/license-verifier v0.13.0/go.mod h1:PTTlWgokzoisBezn2zt+JeGkhTJZ0flvLzdhHVBy86M=
406-
go.bytebuilders.dev/license-verifier/kubernetes v0.12.0 h1:YJ/JWjeJgDOHzgI/RYMn60x+R7KpZ+3Nu8BHJLghYc8=
407-
go.bytebuilders.dev/license-verifier/kubernetes v0.12.0/go.mod h1:XJUtMI5o0QQyaor1SAqL/2YTYU9LxYM6/Q8X8o/750w=
404+
go.bytebuilders.dev/license-verifier v0.13.2 h1:wV1ynl+GR+zKb3dh19WEzuC0uzTdiSGgVg9G78Nh4XU=
405+
go.bytebuilders.dev/license-verifier v0.13.2/go.mod h1:PTTlWgokzoisBezn2zt+JeGkhTJZ0flvLzdhHVBy86M=
406+
go.bytebuilders.dev/license-verifier/kubernetes v0.13.2 h1:ZIPTce9sAR9/GaPvQtkbOTXGE1Nyyv0GcMqnInUaqxM=
407+
go.bytebuilders.dev/license-verifier/kubernetes v0.13.2/go.mod h1:xiM7bX84LNWQPJRC/m9rQASuCclJSsDdf2qFdafrz1k=
408408
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
409409
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
410410
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=

vendor/go.bytebuilders.dev/license-verifier/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ COMPRESS ?= no
2121

2222
# Produce CRDs that work back to Kubernetes 1.11 (no version conversion)
2323
CRD_OPTIONS ?= "crd:maxDescLen=0,generateEmbeddedObjectMeta=true,allowDangerousTypes=true"
24-
CODE_GENERATOR_IMAGE ?= appscode/gengo:release-1.25
24+
CODE_GENERATOR_IMAGE ?= ghcr.io/appscode/gengo:release-1.25
2525
API_GROUPS ?= licenses:v1alpha1
2626

2727
# Where to push the docker image.

vendor/go.bytebuilders.dev/license-verifier/info/lib.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,14 @@ func HostedEndpoint(u string) (bool, error) {
138138
if err != nil {
139139
return false, err
140140
}
141-
host := u2.Hostname()
142-
return host == prodDomain ||
143-
host == qaDomain ||
144-
strings.HasSuffix(host, "."+prodDomain) ||
145-
strings.HasSuffix(host, "."+qaDomain), nil
141+
return HostedDomain(u2.Hostname()), nil
146142
}
147143

148144
func HostedDomain(d string) bool {
149-
return d == prodDomain || d == qaDomain
145+
return d == prodDomain ||
146+
d == qaDomain ||
147+
strings.HasSuffix(d, "."+prodDomain) ||
148+
strings.HasSuffix(d, "."+qaDomain)
150149
}
151150

152151
func LoadLicenseCA() ([]byte, error) {

vendor/go.bytebuilders.dev/license-verifier/kubernetes/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ ARCH := $(if $(GOARCH),$(GOARCH),$(shell go env GOARCH))
6464
BASEIMAGE_PROD ?= gcr.io/distroless/static
6565
BASEIMAGE_DBG ?= debian:stretch
6666

67-
GO_VERSION ?= 1.19
68-
BUILD_IMAGE ?= appscode/golang-dev:$(GO_VERSION)
67+
GO_VERSION ?= 1.20
68+
BUILD_IMAGE ?= ghcr.io/appscode/golang-dev:$(GO_VERSION)
6969

7070
OUTBIN = bin/$(OS)_$(ARCH)/$(BIN)
7171
ifeq ($(OS),windows)

vendor/go.bytebuilders.dev/license-verifier/kubernetes/lib.go

Lines changed: 41 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import (
2020
"context"
2121
"encoding/json"
2222
"fmt"
23-
"io/ioutil"
23+
"io"
2424
"net/http"
2525
"net/url"
2626
"os"
@@ -62,17 +62,17 @@ const (
6262
)
6363

6464
type LicenseEnforcer struct {
65-
opts verifier.VerifyOptions
66-
config *rest.Config
67-
kc kubernetes.Interface
68-
getLicense func() ([]byte, error)
65+
licenseFile string
66+
opts verifier.VerifyOptions
67+
config *rest.Config
68+
kc kubernetes.Interface
6969
}
7070

7171
// NewLicenseEnforcer returns a newly created license enforcer
7272
func NewLicenseEnforcer(config *rest.Config, licenseFile string) (*LicenseEnforcer, error) {
7373
le := LicenseEnforcer{
74-
getLicense: getLicense(config, licenseFile),
75-
config: config,
74+
config: config,
75+
licenseFile: licenseFile,
7676
opts: verifier.VerifyOptions{
7777
Features: info.ProductName,
7878
},
@@ -97,30 +97,38 @@ func MustLicenseEnforcer(config *rest.Config, licenseFile string) *LicenseEnforc
9797
return le
9898
}
9999

100-
func getLicense(cfg *rest.Config, licenseFile string) func() ([]byte, error) {
101-
return func() ([]byte, error) {
102-
licenseBytes, err := ioutil.ReadFile(licenseFile)
103-
if errors.Is(err, os.ErrNotExist) {
104-
req := proxyserver.LicenseRequest{
105-
TypeMeta: metav1.TypeMeta{},
106-
Request: &proxyserver.LicenseRequestRequest{
107-
Features: info.Features(),
108-
},
109-
}
110-
pc, err := proxyclient.NewForConfig(cfg)
111-
if err != nil {
112-
return nil, errors.Wrap(err, "failed create client for license-proxyserver")
113-
}
114-
resp, err := pc.ProxyserverV1alpha1().LicenseRequests().Create(context.TODO(), &req, metav1.CreateOptions{})
115-
if err != nil {
116-
return nil, errors.Wrap(err, "failed to read license")
117-
}
118-
licenseBytes = []byte(resp.Response.License)
119-
} else if err != nil {
100+
func (le *LicenseEnforcer) getLicense() ([]byte, error) {
101+
licenseBytes, err := os.ReadFile(le.licenseFile)
102+
if errors.Is(err, os.ErrNotExist) || (err == nil && le.invalidLicense(licenseBytes)) {
103+
req := proxyserver.LicenseRequest{
104+
TypeMeta: metav1.TypeMeta{},
105+
Request: &proxyserver.LicenseRequestRequest{
106+
Features: info.Features(),
107+
},
108+
}
109+
pc, err := proxyclient.NewForConfig(le.config)
110+
if err != nil {
111+
return nil, errors.Wrap(err, "failed create client for license-proxyserver")
112+
}
113+
resp, err := pc.ProxyserverV1alpha1().LicenseRequests().Create(context.TODO(), &req, metav1.CreateOptions{})
114+
if err != nil {
120115
return nil, errors.Wrap(err, "failed to read license")
121116
}
122-
return licenseBytes, nil
117+
licenseBytes = []byte(resp.Response.License)
118+
} else if err != nil {
119+
return nil, errors.Wrap(err, "failed to read license")
123120
}
121+
return licenseBytes, nil
122+
}
123+
124+
func (le *LicenseEnforcer) invalidLicense(license []byte) bool {
125+
le.opts.License = license
126+
// We don't want to acquire license from license-proxyserver is the license file
127+
// contains a valid license for a different product.
128+
// We want to acquire license-proxyserver is a previously valid license has not expired.
129+
// So, we don't check features in the license found is license file.
130+
l, err := verifier.ParseLicense(le.opts.ParserOptions)
131+
return sets.NewString(l.Features...).HasAny(info.ParseFeatures(le.opts.Features)...) && err != nil
124132
}
125133

126134
func (le *LicenseEnforcer) createClients() (err error) {
@@ -136,22 +144,13 @@ func (le *LicenseEnforcer) acquireLicense() (err error) {
136144
}
137145

138146
func (le *LicenseEnforcer) readClusterUID() (err error) {
147+
if le.opts.ClusterUID != "" {
148+
return
149+
}
139150
le.opts.ClusterUID, err = clusterid.ClusterUID(le.kc.CoreV1().Namespaces())
140151
return err
141152
}
142153

143-
func (le *LicenseEnforcer) podName() (string, error) {
144-
if name, ok := os.LookupEnv("MY_POD_NAME"); ok {
145-
return name, nil
146-
}
147-
148-
if meta.PossiblyInCluster() {
149-
// Read current pod name
150-
return os.Hostname()
151-
}
152-
return "", errors.New("failed to detect pod name")
153-
}
154-
155154
func (le *LicenseEnforcer) handleLicenseVerificationFailure(licenseErr error) error {
156155
// Send interrupt so that all go-routines shut-down gracefully
157156
// https://pracucci.com/graceful-shutdown-of-kubernetes-pods.html
@@ -170,10 +169,6 @@ func (le *LicenseEnforcer) handleLicenseVerificationFailure(licenseErr error) er
170169
// Log licenseInfo verification failure
171170
klog.Errorln("Failed to verify license. Reason: ", licenseErr.Error())
172171

173-
podName, err := le.podName()
174-
if err != nil {
175-
return err
176-
}
177172
// Read the namespace of current pod
178173
namespace := meta.PodNamespace()
179174

@@ -183,7 +178,7 @@ func (le *LicenseEnforcer) handleLicenseVerificationFailure(licenseErr error) er
183178
le.config,
184179
core.SchemeGroupVersion.WithResource(core.ResourcePods.String()),
185180
namespace,
186-
podName,
181+
meta.PodName(),
187182
)
188183
if err != nil {
189184
return err
@@ -297,9 +292,6 @@ func verifyLicensePeriodically(le *LicenseEnforcer, licenseFile string, stopCh <
297292
return false, nil
298293
}
299294

300-
if _, err := os.Stat(licenseFile); os.IsNotExist(err) {
301-
return errors.New("license file is missing")
302-
}
303295
return wait.PollImmediateUntil(licenseCheckInterval, fn, stopCh)
304296
}
305297

@@ -382,7 +374,7 @@ func CheckLicenseEndpoint(config *rest.Config, apiServiceName string, features [
382374
}
383375
defer resp.Body.Close()
384376

385-
data, err := ioutil.ReadAll(resp.Body)
377+
data, err := io.ReadAll(resp.Body)
386378
if err != nil {
387379
return err
388380
}

vendor/modules.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ github.com/PuerkitoBio/purell
2929
# github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2
3030
## explicit
3131
github.com/armon/circbuf
32+
# github.com/cespare/xxhash/v2 v2.2.0
33+
## explicit; go 1.11
3234
# github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0
3335
## explicit
3436
github.com/codegangsta/inject
@@ -148,13 +150,13 @@ go.bytebuilders.dev/license-proxyserver/apis/proxyserver/v1alpha1
148150
go.bytebuilders.dev/license-proxyserver/client/clientset/versioned
149151
go.bytebuilders.dev/license-proxyserver/client/clientset/versioned/scheme
150152
go.bytebuilders.dev/license-proxyserver/client/clientset/versioned/typed/proxyserver/v1alpha1
151-
# go.bytebuilders.dev/license-verifier v0.13.0
153+
# go.bytebuilders.dev/license-verifier v0.13.2
152154
## explicit; go 1.18
153155
go.bytebuilders.dev/license-verifier
154156
go.bytebuilders.dev/license-verifier/apis/licenses
155157
go.bytebuilders.dev/license-verifier/apis/licenses/v1alpha1
156158
go.bytebuilders.dev/license-verifier/info
157-
# go.bytebuilders.dev/license-verifier/kubernetes v0.12.0
159+
# go.bytebuilders.dev/license-verifier/kubernetes v0.13.2
158160
## explicit; go 1.18
159161
go.bytebuilders.dev/license-verifier/kubernetes
160162
# golang.org/x/crypto v0.9.0

0 commit comments

Comments
 (0)