internal/core/startup/license.go (80 lines of code) (raw):
/*
* Copyright 2021-2024 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package startup
import (
"errors"
"fmt"
"log"
"os"
"strings"
"github.com/JetBrains/qodana-cli/internal/cloud"
"github.com/JetBrains/qodana-cli/internal/platform/product"
"github.com/JetBrains/qodana-cli/internal/platform/qdenv"
)
func SetupLicenseAndProjectHash(prod product.Product, endpoints *cloud.QdApiEndpoints, token string) {
var licenseData cloud.LicenseData
if token != "" {
licenseData = endpoints.GetLicenseData(token)
if licenseData.ProjectIdHash != "" {
err := os.Setenv(qdenv.QodanaProjectIdHash, licenseData.ProjectIdHash)
if err != nil {
log.Fatal(err)
}
}
if licenseData.OrganisationIdHash != "" {
err := os.Setenv(qdenv.QodanaOrganisationIdHash, licenseData.OrganisationIdHash)
if err != nil {
log.Fatal(err)
}
}
}
_, exists := os.LookupEnv(qdenv.QodanaLicense)
if exists {
return
}
// community versions works without any license and can't check any license
if !prod.Analyzer.GetLinter().IsPaid {
return
}
// eap version works with eap's license dependent on build date
if prod.IsEap {
if token == "" {
fmt.Printf(cloud.EapWarnTokenMessage, endpoints.RootEndpoint.Url)
fmt.Println()
fmt.Println()
}
return
}
// usual builds should have token and LicenseData for execution
if token == "" {
log.Fatalf(cloud.EmptyTokenMessage, endpoints.RootEndpoint.Url)
}
licenseDataResponse, err := endpoints.RequestLicenseData(token)
if errors.Is(err, cloud.ErrTokenDeclined) {
log.Fatalf("License request: %v\n%s", err, cloud.DeclinedTokenErrorMessage)
}
if err != nil {
errMessage := fmt.Sprintf(cloud.GeneralLicenseErrorMessage, endpoints.RootEndpoint.Url)
log.Fatalf("License request: %v\n%s", err, errMessage)
}
licenseData = cloud.DeserializeLicenseData(licenseDataResponse)
if strings.ToLower(licenseData.LicensePlan) == "community" {
log.Fatalf(
"Your Qodana Cloud organization has Community license that doesn’t support \"%s\" linter, "+
"please try one of the community linters instead: %s or obtain Ultimate "+
"or Ultimate Plus license. Read more about licenses and plans at "+
"https://www.jetbrains.com/help/qodana/pricing.html#pricing-linters-licenses.",
prod.GetProductNameFromCode(),
allCommunityNames(),
)
}
if licenseData.LicenseKey == "" {
log.Fatalf("License key should not be empty\n")
}
err = os.Setenv(qdenv.QodanaLicense, licenseData.LicenseKey)
if err != nil {
log.Fatal(err)
}
}
func allCommunityNames() string {
var nameList []string
for _, linter := range product.AllSupportedFreeLinters {
nameList = append(nameList, "\""+linter.PresentableName+"\"")
}
return strings.Join(nameList, ", ")
}