diff --git a/Makefile b/Makefile index 0f93bcc87a..3e3baa6458 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,10 @@ IS_CI ?= false BUILD_NUMBER ?= $(BUILD_NUMBER:) BUILD_DATE = $(shell date -u) BUILD_HASH = $(shell git rev-parse HEAD) + +# Go tags +GOTAGS ?= $(GOTAGS:) + # If we don't set the build number it defaults to dev ifeq ($(BUILD_NUMBER),) BUILD_DATE := n/a @@ -41,6 +45,7 @@ endif ifeq ($(BUILD_NUMBER),dev) export MM_FEATUREFLAGS_GRAPHQL = true + GOTAGS += "testlicensekey" endif # Enterprise @@ -600,7 +605,7 @@ run-server: setup-go-work prepackaged-binaries validate-go-version start-docker @echo Running mattermost for development mkdir -p $(BUILD_WEBAPP_DIR)/dist/files - $(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) $(RUN_IN_BACKGROUND) + $(GO) run $(GOFLAGS) -tags $(GOTAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) $(RUN_IN_BACKGROUND) debug-server: start-docker ## Compile and start server using delve. mkdir -p $(BUILD_WEBAPP_DIR)/dist/files @@ -624,7 +629,7 @@ run-cli: start-docker ## Runs CLI. @echo Running mattermost for development @echo Example should be like 'make ARGS="-version" run-cli' - $(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) ${ARGS} + $(GO) run $(GOFLAGS) -tags $(GOTAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) ${ARGS} run-client: ## Runs the webapp. @echo Running mattermost client for development @@ -681,7 +686,7 @@ restart-client: | stop-client run-client ## Restarts the webapp. run-job-server: ## Runs the background job server. @echo Running job server for development - $(GO) run $(GOFLAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) jobserver & + $(GO) run $(GOFLAGS) -tags $(GOTAGS) -ldflags '$(LDFLAGS)' $(PLATFORM_FILES) jobserver & config-ldap: ## Configures LDAP. @echo Setting up configuration for local LDAP diff --git a/api4/license_test.go b/api4/license_test.go index dec711dfc1..12c3159087 100644 --- a/api4/license_test.go +++ b/api4/license_test.go @@ -10,7 +10,6 @@ import ( "testing" "time" - "github.com/mattermost/mattermost-server/v6/app/platform" "github.com/mattermost/mattermost-server/v6/einterfaces/mocks" "github.com/mattermost/mattermost-server/v6/model" "github.com/mattermost/mattermost-server/v6/utils" @@ -264,11 +263,11 @@ func TestRequestTrialLicense(t *testing.T) { licenseManagerMock := &mocks.LicenseInterface{} licenseManagerMock.On("CanStartTrial").Return(true, nil).Once() th.App.Srv().Platform().SetLicenseManager(licenseManagerMock) - + originalCwsUrl := *th.App.Srv().Config().CloudSettings.CWSURL + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.CloudSettings.CWSURL = testServer.URL }) defer func(requestTrialURL string) { - platform.RequestTrialURL = requestTrialURL - }(platform.RequestTrialURL) - platform.RequestTrialURL = testServer.URL + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.CloudSettings.CWSURL = requestTrialURL }) + }(originalCwsUrl) resp, err := th.SystemAdminClient.RequestTrialLicense(nUsers) CheckErrorID(t, err, "api.license.add_license.unique_users.app_error") @@ -295,10 +294,11 @@ func TestRequestTrialLicense(t *testing.T) { licenseManagerMock.On("CanStartTrial").Return(true, nil).Once() th.App.Srv().Platform().SetLicenseManager(licenseManagerMock) + originalCwsUrl := *th.App.Srv().Config().CloudSettings.CWSURL + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.CloudSettings.CWSURL = testServer.URL }) defer func(requestTrialURL string) { - platform.RequestTrialURL = requestTrialURL - }(platform.RequestTrialURL) - platform.RequestTrialURL = testServer.URL + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.CloudSettings.CWSURL = requestTrialURL }) + }(originalCwsUrl) resp, err := th.SystemAdminClient.RequestTrialLicense(nUsers) require.Error(t, err) diff --git a/app/license.go b/app/license.go index 61b4d2dc85..4b2c25330d 100644 --- a/app/license.go +++ b/app/license.go @@ -16,13 +16,9 @@ import ( ) const ( - LicenseEnv = "MM_LICENSE" - LicenseRenewalURL = "https://customers.mattermost.com/subscribe/renew" JWTDefaultTokenExpiration = 7 * 24 * time.Hour // 7 days of expiration ) -var RequestTrialURL = "https://customers.mattermost.com/api/v1/trials" - // ensure the license service wrapper implements `product.LicenseService` var _ product.LicenseService = (*licenseWrapper)(nil) diff --git a/app/platform/license.go b/app/platform/license.go index 05321cfe2a..09f21f8b39 100644 --- a/app/platform/license.go +++ b/app/platform/license.go @@ -23,14 +23,9 @@ import ( const ( LicenseEnv = "MM_LICENSE" - LicenseRenewalURL = "https://customers.mattermost.com/subscribe/renew" JWTDefaultTokenExpiration = 7 * 24 * time.Hour // 7 days of expiration ) -var ( - RequestTrialURL = "https://customers.mattermost.com/api/v1/trials" -) - // JWTClaims custom JWT claims with the needed information for the // renewal process type JWTClaims struct { @@ -302,7 +297,7 @@ func (ps *PlatformService) RequestTrialLicense(trialRequest *model.TrialLicenseR return model.NewAppError("RequestTrialLicense", "api.unmarshal_error", nil, "", http.StatusInternalServerError).Wrap(err) } - resp, err := http.Post(RequestTrialURL, "application/json", bytes.NewBuffer(trialRequestJSON)) + resp, err := http.Post(ps.getRequestTrialURL(), "application/json", bytes.NewBuffer(trialRequestJSON)) if err != nil { return model.NewAppError("RequestTrialLicense", "api.license.request_trial_license.app_error", nil, "", http.StatusBadRequest).Wrap(err) } @@ -379,6 +374,13 @@ func (ps *PlatformService) GenerateLicenseRenewalLink() (string, string, *model. if err != nil { return "", "", err } - renewalLink := LicenseRenewalURL + "?token=" + renewalToken - return renewalLink, renewalToken, nil + return fmt.Sprintf("%s?token=%s", ps.getLicenseRenewalURL(), renewalToken), renewalToken, nil +} + +func (ps *PlatformService) getLicenseRenewalURL() string { + return fmt.Sprintf("%s/subscribe/renew", *ps.Config().CloudSettings.CWSURL) +} + +func (ps *PlatformService) getRequestTrialURL() string { + return fmt.Sprintf("%s/api/v1/trials", *ps.Config().CloudSettings.CWSURL) } diff --git a/build/release.mk b/build/release.mk index 46b5c5fcb9..8e12b08f28 100644 --- a/build/release.mk +++ b/build/release.mk @@ -5,85 +5,85 @@ build-linux: build-linux-amd64 build-linux-arm64 build-linux-amd64: @echo Build Linux amd64 ifeq ($(BUILDER_GOOS_GOARCH),"linux_amd64") - env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... else mkdir -p $(GOBIN)/linux_amd64 - env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN)/linux_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN)/linux_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... endif build-linux-arm64: @echo Build Linux arm64 ifeq ($(BUILDER_GOOS_GOARCH),"linux_arm64") - env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... else mkdir -p $(GOBIN)/linux_arm64 - env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN)/linux_arm64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN)/linux_arm64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... endif build-osx: @echo Build OSX amd64 ifeq ($(BUILDER_GOOS_GOARCH),"darwin_amd64") - env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... else mkdir -p $(GOBIN)/darwin_amd64 - env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN)/darwin_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN)/darwin_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... endif @echo Build OSX arm64 ifeq ($(BUILDER_GOOS_GOARCH),"darwin_arm64") - env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... else mkdir -p $(GOBIN)/darwin_arm64 - env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN)/darwin_arm64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN)/darwin_arm64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... endif build-windows: @echo Build Windows amd64 ifeq ($(BUILDER_GOOS_GOARCH),"windows_amd64") - env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... else mkdir -p $(GOBIN)/windows_amd64 - env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN)/windows_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./... + env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN)/windows_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./... endif build-cmd-linux: @echo Build CMD Linux amd64 ifeq ($(BUILDER_GOOS_GOARCH),"linux_amd64") - env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... else mkdir -p $(GOBIN)/linux_amd64 - env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN)/linux_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=linux GOARCH=amd64 $(GO) build -o $(GOBIN)/linux_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... endif @echo Build CMD Linux arm64 ifeq ($(BUILDER_GOOS_GOARCH),"linux_arm64") - env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... else mkdir -p $(GOBIN)/linux_arm64 - env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN)/linux_arm64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=linux GOARCH=arm64 $(GO) build -o $(GOBIN)/linux_arm64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... endif build-cmd-osx: @echo Build CMD OSX amd64 ifeq ($(BUILDER_GOOS_GOARCH),"darwin_amd64") - env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... else mkdir -p $(GOBIN)/darwin_amd64 - env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN)/darwin_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=darwin GOARCH=amd64 $(GO) build -o $(GOBIN)/darwin_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... endif @echo Build CMD OSX arm64 ifeq ($(BUILDER_GOOS_GOARCH),"darwin_arm64") - env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... else mkdir -p $(GOBIN)/darwin_arm64 - env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN)/darwin_arm64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=darwin GOARCH=arm64 $(GO) build -o $(GOBIN)/darwin_arm64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... endif build-cmd-windows: @echo Build CMD Windows amd64 ifeq ($(BUILDER_GOOS_GOARCH),"windows_amd64") - env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN) $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... else mkdir -p $(GOBIN)/windows_amd64 - env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN)/windows_amd64 $(GOFLAGS) -trimpath -ldflags '$(LDFLAGS)' ./cmd/... + env GOOS=windows GOARCH=amd64 $(GO) build -o $(GOBIN)/windows_amd64 $(GOFLAGS) -trimpath -tags '$(GOTAGS)' -ldflags '$(LDFLAGS)' ./cmd/... endif build: setup-go-work build-linux build-windows build-osx diff --git a/model/config.go b/model/config.go index 330a6945cd..4324103ad7 100644 --- a/model/config.go +++ b/model/config.go @@ -241,7 +241,12 @@ const ( CloudSettingsDefaultCwsURL = "https://customers.mattermost.com" CloudSettingsDefaultCwsAPIURL = "https://portal.internal.prod.cloud.mattermost.com" - OpenidSettingsDefaultScope = "profile openid email" + // TODO: update to "https://portal.test.cloud.mattermost.com" when ready to use test license key + CloudSettingsDefaultCwsURLTest = "https://customers.mattermost.com" + // TODO: update to // "https://api.internal.test.cloud.mattermost.com" when ready to use test license key + CloudSettingsDefaultCwsAPIURLTest = "https://portal.internal.prod.cloud.mattermost.com" + + OpenidSettingsDefaultScope = "profile openid email" LocalModeSocketPath = "/var/tmp/mattermost_local.socket" ) @@ -2781,9 +2786,15 @@ type CloudSettings struct { func (s *CloudSettings) SetDefaults() { if s.CWSURL == nil { s.CWSURL = NewString(CloudSettingsDefaultCwsURL) + if !isProdLicensePublicKey { + s.CWSURL = NewString(CloudSettingsDefaultCwsURLTest) + } } if s.CWSAPIURL == nil { s.CWSAPIURL = NewString(CloudSettingsDefaultCwsAPIURL) + if !isProdLicensePublicKey { + s.CWSAPIURL = NewString(CloudSettingsDefaultCwsAPIURLTest) + } } } diff --git a/model/license_key.go b/model/license_key.go new file mode 100644 index 0000000000..a55fa1df07 --- /dev/null +++ b/model/license_key.go @@ -0,0 +1,7 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +//go:build !testlicensekey + +package model + +const isProdLicensePublicKey = true diff --git a/model/license_key_test_env.go b/model/license_key_test_env.go new file mode 100644 index 0000000000..189dcd40ee --- /dev/null +++ b/model/license_key_test_env.go @@ -0,0 +1,7 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +//go:build testlicensekey + +package model + +const isProdLicensePublicKey = false diff --git a/utils/license-public-key-test.txt b/utils/license-public-key-test.txt new file mode 100644 index 0000000000..23c8800db3 --- /dev/null +++ b/utils/license-public-key-test.txt @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZmShlU8Z8HdG0IWSZ8r +tSyzyxrXkJjsFUf0Ke7bm/TLtIggRdqOcUF3XEWqQk5RGD5vuq7Rlg1zZqMEBk8N +EZeRhkxyaZW8pLjxwuBUOnXfJew31+gsTNdKZzRjrvPumKr3EtkleuoxNdoatu4E +HrKmR/4Yi71EqAvkhk7ZjQFuF0osSWJMEEGGCSUYQnTEqUzcZSh1BhVpkIkeu8Kk +1wCtptODixvEujgqVe+SrE3UlZjBmPjC/CL+3cYmufpSNgcEJm2mwsdaXp2OPpfn +a0v85XL6i9ote2P+fLZ3wX9EoioHzgdgB7arOxY50QRJO7OyCqpKFKv6lRWTXuSt +hwIDAQAB +-----END PUBLIC KEY----- diff --git a/utils/license-public-key.txt b/utils/license-public-key.txt new file mode 100644 index 0000000000..23c8800db3 --- /dev/null +++ b/utils/license-public-key.txt @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZmShlU8Z8HdG0IWSZ8r +tSyzyxrXkJjsFUf0Ke7bm/TLtIggRdqOcUF3XEWqQk5RGD5vuq7Rlg1zZqMEBk8N +EZeRhkxyaZW8pLjxwuBUOnXfJew31+gsTNdKZzRjrvPumKr3EtkleuoxNdoatu4E +HrKmR/4Yi71EqAvkhk7ZjQFuF0osSWJMEEGGCSUYQnTEqUzcZSh1BhVpkIkeu8Kk +1wCtptODixvEujgqVe+SrE3UlZjBmPjC/CL+3cYmufpSNgcEJm2mwsdaXp2OPpfn +a0v85XL6i9ote2P+fLZ3wX9EoioHzgdgB7arOxY50QRJO7OyCqpKFKv6lRWTXuSt +hwIDAQAB +-----END PUBLIC KEY----- diff --git a/utils/license.go b/utils/license.go index 0c6b7dbe04..4d35fc0660 100644 --- a/utils/license.go +++ b/utils/license.go @@ -22,16 +22,6 @@ import ( "github.com/mattermost/mattermost-server/v6/utils/fileutils" ) -var publicKey []byte = []byte(`-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyZmShlU8Z8HdG0IWSZ8r -tSyzyxrXkJjsFUf0Ke7bm/TLtIggRdqOcUF3XEWqQk5RGD5vuq7Rlg1zZqMEBk8N -EZeRhkxyaZW8pLjxwuBUOnXfJew31+gsTNdKZzRjrvPumKr3EtkleuoxNdoatu4E -HrKmR/4Yi71EqAvkhk7ZjQFuF0osSWJMEEGGCSUYQnTEqUzcZSh1BhVpkIkeu8Kk -1wCtptODixvEujgqVe+SrE3UlZjBmPjC/CL+3cYmufpSNgcEJm2mwsdaXp2OPpfn -a0v85XL6i9ote2P+fLZ3wX9EoioHzgdgB7arOxY50QRJO7OyCqpKFKv6lRWTXuSt -hwIDAQAB ------END PUBLIC KEY-----`) - var LicenseValidator LicenseValidatorIface func init() { diff --git a/utils/license_public_key.go b/utils/license_public_key.go new file mode 100644 index 0000000000..9f589c2779 --- /dev/null +++ b/utils/license_public_key.go @@ -0,0 +1,10 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +//go:build !testlicensekey + +package utils + +import _ "embed" + +//go:embed license-public-key.txt +var publicKey []byte diff --git a/utils/license_public_key_test_env.go b/utils/license_public_key_test_env.go new file mode 100644 index 0000000000..8bbed6ebc6 --- /dev/null +++ b/utils/license_public_key_test_env.go @@ -0,0 +1,13 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +//go:build testlicensekey + +package utils + +import _ "embed" + +// TODO: license-public-key-test.txt currently has the contents of the prod public key. +// Change to the test public key when ready for dev images to use test license key. + +//go:embed license-public-key-test.txt +var publicKey []byte