fix(license): fixes for license service (#8121)

* fix(license): fixes for license service

* fix(license): fixes for license service

* fix(license): add code comments
This commit is contained in:
Vikrant Gupta 2025-06-02 17:09:19 +05:30 committed by GitHub
parent 5fb4206a99
commit 9d397d0867
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 26 additions and 12 deletions

View File

@ -3,9 +3,10 @@ package httplicensing
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"github.com/SigNoz/signoz/ee/query-service/constants"
"time" "time"
"github.com/SigNoz/signoz/ee/query-service/constants"
"github.com/SigNoz/signoz/ee/licensing/licensingstore/sqllicensingstore" "github.com/SigNoz/signoz/ee/licensing/licensingstore/sqllicensingstore"
"github.com/SigNoz/signoz/pkg/errors" "github.com/SigNoz/signoz/pkg/errors"
"github.com/SigNoz/signoz/pkg/factory" "github.com/SigNoz/signoz/pkg/factory"
@ -177,6 +178,11 @@ func (provider *provider) Refresh(ctx context.Context, organizationID valuer.UUI
return err return err
} }
err = provider.InitFeatures(ctx, activeLicense.Features)
if err != nil {
return err
}
return nil return nil
} }

View File

@ -28,6 +28,7 @@ import { QueryBuilderProvider } from 'providers/QueryBuilder';
import { Suspense, useCallback, useEffect, useState } from 'react'; import { Suspense, useCallback, useEffect, useState } from 'react';
import { Route, Router, Switch } from 'react-router-dom'; import { Route, Router, Switch } from 'react-router-dom';
import { CompatRouter } from 'react-router-dom-v5-compat'; import { CompatRouter } from 'react-router-dom-v5-compat';
import { LicenseStatus } from 'types/api/licensesV3/getActive';
import { Userpilot } from 'userpilot'; import { Userpilot } from 'userpilot';
import { extractDomain } from 'utils/app'; import { extractDomain } from 'utils/app';
@ -171,11 +172,13 @@ function App(): JSX.Element {
user && user &&
!!user.email !!user.email
) { ) {
// either the active API returns error with 404 or 501 and if it returns a terminated license means it's on basic plan
const isOnBasicPlan = const isOnBasicPlan =
activeLicenseFetchError && (activeLicenseFetchError &&
[StatusCodes.NOT_FOUND, StatusCodes.NOT_IMPLEMENTED].includes( [StatusCodes.NOT_FOUND, StatusCodes.NOT_IMPLEMENTED].includes(
activeLicenseFetchError?.getHttpStatusCode(), activeLicenseFetchError?.getHttpStatusCode(),
); )) ||
(activeLicense?.status && activeLicense.status === LicenseStatus.INVALID);
const isIdentifiedUser = getLocalStorageApi(LOCALSTORAGE.IS_IDENTIFIED_USER); const isIdentifiedUser = getLocalStorageApi(LOCALSTORAGE.IS_IDENTIFIED_USER);
if (isLoggedInState && user && user.id && user.email && !isIdentifiedUser) { if (isLoggedInState && user && user.id && user.email && !isIdentifiedUser) {
@ -190,6 +193,10 @@ function App(): JSX.Element {
updatedRoutes = updatedRoutes.filter( updatedRoutes = updatedRoutes.filter(
(route) => route?.path !== ROUTES.BILLING, (route) => route?.path !== ROUTES.BILLING,
); );
if (isEnterpriseSelfHostedUser) {
updatedRoutes.push(LIST_LICENSES);
}
} }
// always add support route for cloud users // always add support route for cloud users
updatedRoutes = [...updatedRoutes, SUPPORT_ROUTE]; updatedRoutes = [...updatedRoutes, SUPPORT_ROUTE];

View File

@ -26,6 +26,7 @@ import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import { useLocation } from 'react-router-dom'; import { useLocation } from 'react-router-dom';
import { AppState } from 'store/reducers'; import { AppState } from 'store/reducers';
import { LicenseStatus } from 'types/api/licensesV3/getActive';
import AppReducer from 'types/reducer/app'; import AppReducer from 'types/reducer/app';
import { USER_ROLES } from 'types/roles'; import { USER_ROLES } from 'types/roles';
import { checkVersionState } from 'utils/app'; import { checkVersionState } from 'utils/app';
@ -301,10 +302,11 @@ function SideNav(): JSX.Element {
} }
const isOnBasicPlan = const isOnBasicPlan =
activeLicenseFetchError && (activeLicenseFetchError &&
[StatusCodes.NOT_FOUND, StatusCodes.NOT_IMPLEMENTED].includes( [StatusCodes.NOT_FOUND, StatusCodes.NOT_IMPLEMENTED].includes(
activeLicenseFetchError?.getHttpStatusCode(), activeLicenseFetchError?.getHttpStatusCode(),
); )) ||
(activeLicense?.status && activeLicense.status === LicenseStatus.INVALID);
if (user.role !== USER_ROLES.ADMIN || isOnBasicPlan) { if (user.role !== USER_ROLES.ADMIN || isOnBasicPlan) {
updatedMenuItems = updatedMenuItems.filter( updatedMenuItems = updatedMenuItems.filter(
@ -353,6 +355,7 @@ function SideNav(): JSX.Element {
t, t,
user.role, user.role,
activeLicenseFetchError, activeLicenseFetchError,
activeLicense?.status,
]); ]);
return ( return (

View File

@ -6,6 +6,7 @@ export enum LicenseEvent {
export enum LicenseStatus { export enum LicenseStatus {
SUSPENDED = 'SUSPENDED', SUSPENDED = 'SUSPENDED',
VALID = 'VALID', VALID = 'VALID',
INVALID = 'INVALID',
} }
export enum LicenseState { export enum LicenseState {

View File

@ -87,9 +87,6 @@ func GetActiveLicenseFromStorableLicenses(storableLicenses []*StorableLicense, o
return nil, err return nil, err
} }
if license.Status == "INVALID" {
continue
}
if activeLicense == nil && if activeLicense == nil &&
(license.ValidFrom != 0) && (license.ValidFrom != 0) &&
(license.ValidUntil == -1 || license.ValidUntil > time.Now().Unix()) { (license.ValidUntil == -1 || license.ValidUntil > time.Now().Unix()) {