Commit 27801164 authored by Lennard Sprong's avatar Lennard Sprong Committed by Tomas Vik (OOO back on 2026-08-31)
Browse files

fix(security_scanning): Hide reports for GitLab Free

parent fb8e878f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -5,7 +5,7 @@ import { ifVersionGte } from '../utils/if_version_gte';
import { GitLabPlatformForAccount, GitLabPlatformManager } from '../platform/gitlab_platform';
import { GetRequest } from '../platform/web_ide';

export const versionRequest: GetRequest<{ version: string }> = {
export const versionRequest: GetRequest<{ version: string; enterprise?: boolean }> = {
  type: 'rest',
  method: 'GET',
  path: '/version',
+20 −6
Original line number Diff line number Diff line
@@ -551,17 +551,15 @@ describe('gitlab_service', () => {
    const TEST_FEATURE_NAME = 'Test Feature Name';
    const TEST_NEXT_VERSION = '10.2.0';
    const TEST_PREV_VERSION = '10.1.1';
    const mock = jest.spyOn(GitLabService.prototype, 'getVersion');

    beforeAll(() => {
      mock.mockImplementation(() => Promise.resolve(TEST_CURRENT_VERSION));
    });
    const mock = jest.spyOn(GitLabService.prototype, 'getVersionAndEdition');

    afterAll(() => {
      mock.mockRestore();
    });

    it('rejects when current version is less than feature version', async () => {
      mock.mockImplementation(() => Promise.resolve({ version: TEST_CURRENT_VERSION }));

      const featureVersion = TEST_NEXT_VERSION;

      await expect(service.validateVersion(TEST_FEATURE_NAME, featureVersion)).rejects.toThrow(
@@ -569,11 +567,27 @@ describe('gitlab_service', () => {
      );
    });

    it('rejects when expecting Enterprise Edition', async () => {
      mock.mockImplementation(() =>
        Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: false }),
      );

      const featureVersion = TEST_PREV_VERSION;

      await expect(
        service.validateVersion(TEST_FEATURE_NAME, featureVersion, true),
      ).rejects.toThrow();
    });

    it('resolves when current version is gte than feature version', async () => {
      mock.mockImplementation(() =>
        Promise.resolve({ version: TEST_CURRENT_VERSION, enterprise: true }),
      );

      const featureVersion = TEST_PREV_VERSION;

      await expect(
        service.validateVersion(TEST_FEATURE_NAME, featureVersion),
        service.validateVersion(TEST_FEATURE_NAME, featureVersion, true),
      ).resolves.toBeUndefined();
    });
  });
+26 −8
Original line number Diff line number Diff line
@@ -158,6 +158,11 @@ const getTotalPages = (response: Response): number =>
const getCurrentPage = (query: Record<string, QueryValue>): number =>
  query.page && typeof query.page === 'number' ? query.page : 1;

interface VersionResponse {
  version: string;
  enterprise?: boolean;
}

export interface ValidationResponse {
  valid?: boolean;
  merged_yaml?: string;
@@ -236,20 +241,24 @@ export class GitLabService {
    return result.json() as Promise<T[]>;
  }

  async getVersion(): Promise<string | undefined> {
  async getVersionAndEdition(): Promise<VersionResponse | undefined> {
    try {
      const result = await this.#apiClient.fetch<{ version: string }>(
      const result = await this.#apiClient.fetch<VersionResponse>(
        '/version',
        {},
        'instance version',
      );
      return result.version;
      return result;
    } catch (e) {
      log.error(e);
      return undefined;
    }
  }

  async getVersion(): Promise<string | undefined> {
    return (await this.getVersionAndEdition())?.version;
  }

  // TODO: Remove this method and replace references to `GitLabService.fetchFromApi` with `ApiClient.fetchFromApi`
  fetchFromApi<T>(request: ApiRequest<T>): Promise<T> {
    return this.#apiClient.fetchFromApi(request);
@@ -649,16 +658,25 @@ export class GitLabService {
    );
  }

  async validateVersion(featureName: string, requiredVersion: string) {
    const currentVersion = await this.getVersion();
    await ifVersionGte(
      currentVersion,
  async validateVersion(
    featureName: string,
    requiredVersion: string,
    requireEnterprise: boolean = false,
  ) {
    const currentVersion = (await this.getVersionAndEdition())!;

    ifVersionGte(
      currentVersion.version,
      requiredVersion,
      () => undefined,
      () => {
        throw new UnsupportedVersionError(featureName, currentVersion!, requiredVersion);
        throw new UnsupportedVersionError(featureName, currentVersion.version, requiredVersion);
      },
    );

    if (requireEnterprise && currentVersion && !currentVersion.enterprise) {
      throw new Error(`${featureName} requires GitLab Enterprise.`);
    }
  }

  async getFirstUserByUsername(username: string): Promise<RestUser | undefined> {
+1 −1
Original line number Diff line number Diff line
@@ -204,6 +204,6 @@ describe('getAllSecurityReports', () => {
    await getAllSecurityReports(service, project, mr);
    expect(getLoggedMessage()).toEqual(testError);

    expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0');
    expect(service.validateVersion).toHaveBeenCalledWith('Security Findings', '16.1.0', true);
  });
});
+5 −1
Original line number Diff line number Diff line
@@ -55,7 +55,11 @@ export const getAllSecurityReports = async (
  mr: RestMr,
): Promise<GqlSecurityFindingReport | undefined> => {
  try {
    await gitlabService.validateVersion('Security Findings', REQUIRED_VERSIONS.SECURITY_FINDINGS);
    await gitlabService.validateVersion(
      'Security Findings',
      REQUIRED_VERSIONS.SECURITY_FINDINGS,
      true,
    );
  } catch (e) {
    log.warn(e);
    return undefined;
Loading