diff --git a/ui/CHANGELOG.md b/ui/CHANGELOG.md index e77057779d..021f3e02f9 100644 --- a/ui/CHANGELOG.md +++ b/ui/CHANGELOG.md @@ -28,6 +28,10 @@ All notable changes to the **Prowler UI** are documented in this file. - Controlled `402` and `403` Server Action error messages for alert seed and mutation flows [(#11629)](https://github.com/prowler-cloud/prowler/pull/11629) +### 🔄 Changed + +- OCI provider setup no longer requires a region in the credentials form [(#11565)](https://github.com/prowler-cloud/prowler/pull/11565) + ### 🐞 Fixed - Attack Paths now shows distinct messages while a scan is queued, running, or building its graph — plus a separate "couldn't load scans" error — instead of always showing "No scans available" [(#11512)](https://github.com/prowler-cloud/prowler/pull/11512) diff --git a/ui/components/providers/workflow/forms/via-credentials/oraclecloud-credentials-form.tsx b/ui/components/providers/workflow/forms/via-credentials/oraclecloud-credentials-form.tsx index 56e5ca4afe..8457969612 100644 --- a/ui/components/providers/workflow/forms/via-credentials/oraclecloud-credentials-form.tsx +++ b/ui/components/providers/workflow/forms/via-credentials/oraclecloud-credentials-form.tsx @@ -48,16 +48,6 @@ export const OracleCloudCredentialsForm = ({ variant="bordered" isRequired /> - ({ + filterEmptyValues: (obj: Record) => + Object.fromEntries( + Object.entries(obj).filter(([, value]) => { + if (value === 0 || value === false) return true; + if (value === null || value === undefined) return false; + if (typeof value === "string" && value.trim() === "") return false; + if (Array.isArray(value) && value.length === 0) return false; + + return true; + }), + ), + getFormValue: (formData: FormData, field: string) => formData.get(field), +})); + +import { buildOracleCloudSecret } from "./build-credentials"; +import { ProviderCredentialFields } from "./provider-credential-fields"; + +describe("buildOracleCloudSecret", () => { + it("omits region filters for the basic credentials flow", () => { + const formData = new FormData(); + formData.set(ProviderCredentialFields.OCI_USER, "ocid1.user.oc1..example"); + formData.set(ProviderCredentialFields.OCI_FINGERPRINT, "fingerprint"); + formData.set(ProviderCredentialFields.OCI_KEY_CONTENT, "private-key"); + + const secret = buildOracleCloudSecret( + formData, + "ocid1.tenancy.oc1..example", + ); + + expect(secret).toMatchObject({ + user: "ocid1.user.oc1..example", + fingerprint: "fingerprint", + tenancy: "ocid1.tenancy.oc1..example", + }); + expect(secret).not.toHaveProperty("region"); + expect(secret).not.toHaveProperty("regions"); + }); +}); diff --git a/ui/lib/provider-credentials/build-credentials.ts b/ui/lib/provider-credentials/build-credentials.ts index ae8c26e02c..cc0385ddb6 100644 --- a/ui/lib/provider-credentials/build-credentials.ts +++ b/ui/lib/provider-credentials/build-credentials.ts @@ -385,10 +385,6 @@ export const buildOracleCloudSecret = ( [ProviderCredentialFields.OCI_TENANCY]: providerUid || getFormValue(formData, ProviderCredentialFields.OCI_TENANCY), - [ProviderCredentialFields.OCI_REGION]: getFormValue( - formData, - ProviderCredentialFields.OCI_REGION, - ), [ProviderCredentialFields.OCI_PASS_PHRASE]: getFormValue( formData, ProviderCredentialFields.OCI_PASS_PHRASE, diff --git a/ui/tests/providers/providers-page.ts b/ui/tests/providers/providers-page.ts index f618c59d97..59103220c0 100644 --- a/ui/tests/providers/providers-page.ts +++ b/ui/tests/providers/providers-page.ts @@ -224,7 +224,6 @@ export interface OCIProviderCredential { userId?: string; fingerprint?: string; keyContent?: string; - region?: string; } // AlibabaCloud credential options @@ -366,7 +365,6 @@ export class ProvidersPage extends BasePage { readonly ociUserIdInput: Locator; readonly ociFingerprintInput: Locator; readonly ociKeyContentInput: Locator; - readonly ociRegionInput: Locator; // AlibabaCloud provider form elements readonly alibabacloudAccountIdInput: Locator; @@ -510,7 +508,6 @@ export class ProvidersPage extends BasePage { this.ociKeyContentInput = page.getByRole("textbox", { name: /Private Key Content/i, }); - this.ociRegionInput = page.getByRole("textbox", { name: /Region/i }); // AlibabaCloud provider form inputs this.alibabacloudAccountIdInput = page.getByRole("textbox", { @@ -1300,9 +1297,6 @@ export class ProvidersPage extends BasePage { if (credentials.keyContent) { await this.ociKeyContentInput.fill(credentials.keyContent); } - if (credentials.region) { - await this.ociRegionInput.fill(credentials.region); - } } async verifyOCICredentialsPageLoaded(): Promise { @@ -1313,7 +1307,6 @@ export class ProvidersPage extends BasePage { await expect(this.ociUserIdInput).toBeVisible(); await expect(this.ociFingerprintInput).toBeVisible(); await expect(this.ociKeyContentInput).toBeVisible(); - await expect(this.ociRegionInput).toBeVisible(); } async verifyOCIUpdateCredentialsPageLoaded(): Promise { @@ -1324,7 +1317,6 @@ export class ProvidersPage extends BasePage { await expect(this.ociUserIdInput).toBeVisible(); await expect(this.ociFingerprintInput).toBeVisible(); await expect(this.ociKeyContentInput).toBeVisible(); - await expect(this.ociRegionInput).toBeVisible(); } async selectAlibabaCloudProvider(): Promise { diff --git a/ui/tests/providers/providers.spec.ts b/ui/tests/providers/providers.spec.ts index 4dc8f010ed..af9f4ca4b8 100644 --- a/ui/tests/providers/providers.spec.ts +++ b/ui/tests/providers/providers.spec.ts @@ -1029,12 +1029,10 @@ test.describe("Add Provider", () => { const userId = process.env.E2E_OCI_USER_ID ?? ""; const fingerprint = process.env.E2E_OCI_FINGERPRINT ?? ""; const keyContent = process.env.E2E_OCI_KEY_CONTENT ?? ""; - const region = process.env.E2E_OCI_REGION ?? ""; - // Setup before each test test.beforeEach(async ({ page }) => { test.skip( - !tenancyId || !userId || !fingerprint || !keyContent || !region, + !tenancyId || !userId || !fingerprint || !keyContent, "OCI E2E env vars are not set", ); providersPage = new ProvidersPage(page); @@ -1071,7 +1069,6 @@ test.describe("Add Provider", () => { userId: userId, fingerprint: fingerprint, keyContent: keyContent, - region: region, }; // Navigate to providers page @@ -1516,12 +1513,10 @@ test.describe("Update Provider Credentials", () => { const userId = process.env.E2E_OCI_USER_ID ?? ""; const fingerprint = process.env.E2E_OCI_FINGERPRINT ?? ""; const keyContent = process.env.E2E_OCI_KEY_CONTENT ?? ""; - const region = process.env.E2E_OCI_REGION ?? ""; - // Setup before each test test.beforeEach(async ({ page }) => { test.skip( - !tenancyId || !userId || !fingerprint || !keyContent || !region, + !tenancyId || !userId || !fingerprint || !keyContent, "OCI E2E env vars are not set", ); providersPage = new ProvidersPage(page); @@ -1543,7 +1538,6 @@ test.describe("Update Provider Credentials", () => { userId: userId, fingerprint: fingerprint, keyContent: keyContent, - region: region, }; // Navigate to providers page diff --git a/ui/types/components.ts b/ui/types/components.ts index 8488d0822b..7eb460b196 100644 --- a/ui/types/components.ts +++ b/ui/types/components.ts @@ -315,7 +315,6 @@ export type OCICredentials = { [ProviderCredentialFields.OCI_FINGERPRINT]: string; [ProviderCredentialFields.OCI_KEY_CONTENT]: string; [ProviderCredentialFields.OCI_TENANCY]: string; - [ProviderCredentialFields.OCI_REGION]: string; [ProviderCredentialFields.OCI_PASS_PHRASE]?: string; [ProviderCredentialFields.PROVIDER_ID]: string; }; diff --git a/ui/types/formSchemas.ts b/ui/types/formSchemas.ts index 15751c565c..48c896f92d 100644 --- a/ui/types/formSchemas.ts +++ b/ui/types/formSchemas.ts @@ -262,9 +262,6 @@ export const addCredentialsFormSchema = ( [ProviderCredentialFields.OCI_TENANCY]: z .string() .min(1, "Tenancy OCID is required"), - [ProviderCredentialFields.OCI_REGION]: z - .string() - .min(1, "Region is required"), [ProviderCredentialFields.OCI_PASS_PHRASE]: z .union([z.string(), z.literal("")]) .optional(),