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(),