diff --git a/actions/providers/providers.ts b/actions/providers/providers.ts index 842dec1f59..f0fe26b0d5 100644 --- a/actions/providers/providers.ts +++ b/actions/providers/providers.ts @@ -148,27 +148,38 @@ export const addProvider = async (formData: FormData) => { }; } }; + export const addCredentialsProvider = async (formData: FormData) => { const session = await auth(); const keyServer = process.env.API_BASE_URL; const url = new URL(`${keyServer}/providers/secrets`); - const aws_access_key_id = formData.get("aws_access_key_id"); - const aws_secret_access_key = formData.get("aws_secret_access_key"); - const aws_session_token = formData.get("aws_session_token"); const secretName = formData.get("secretName"); const providerId = formData.get("providerId"); + const providerType = formData.get("providerType"); + + let secret = {}; + + if (providerType === "aws") { + secret = { + aws_access_key_id: formData.get("aws_access_key_id"), + aws_secret_access_key: formData.get("aws_secret_access_key"), + aws_session_token: formData.get("aws_session_token") || undefined, + }; + } else if (providerType === "azure") { + secret = { + client_id: formData.get("client_id"), + client_secret: formData.get("client_secret"), + tenant_id: formData.get("tenant_id"), + }; + } const bodyData = { data: { type: "ProviderSecret", attributes: { secret_type: "static", - secret: { - aws_access_key_id: aws_access_key_id, - aws_secret_access_key: aws_secret_access_key, - aws_session_token: aws_session_token, - }, + secret, name: secretName, }, relationships: { diff --git a/app/(prowler)/page.tsx b/app/(prowler)/page.tsx index 261ca1c00f..335b53b4f4 100644 --- a/app/(prowler)/page.tsx +++ b/app/(prowler)/page.tsx @@ -1,17 +1,13 @@ import { Spacer } from "@nextui-org/react"; -import { SeverityChart, StatusChart } from "@/components/charts"; -import { AttackSurface } from "@/components/overview"; import { Header } from "@/components/ui"; -import { CustomBox } from "@/components/ui/custom"; export default function Home() { return ( <>
- - -
+ + {/*
-
+
*/} ); } diff --git a/components/providers/workflow/forms/via-credentials-form.tsx b/components/providers/workflow/forms/via-credentials-form.tsx index cbdf12c760..c406e0574a 100644 --- a/components/providers/workflow/forms/via-credentials-form.tsx +++ b/components/providers/workflow/forms/via-credentials-form.tsx @@ -10,17 +10,19 @@ import { addCredentialsProvider } from "@/actions/providers/providers"; import { useToast } from "@/components/ui"; import { CustomButton, CustomInput } from "@/components/ui/custom"; import { Form } from "@/components/ui/form"; +import { addCredentialsFormSchema, ApiError, AzureCredentials } from "@/types"; +import { AWSCredentials } from "@/types"; -import { - addCredentialsFormSchema, - ApiError, - AWSCredentials, - AzureCredentials, - CredentialsFormSchema, -} from "../../../../types"; import { AWScredentialsForm } from "./via-credentials/aws-credentials-form"; import { AzureCredentialsForm } from "./via-credentials/azure-credentials-form"; +type CredentialsFormSchema = z.infer< + ReturnType +>; + +// Add this type intersection to include all fields +type FormType = CredentialsFormSchema & AWSCredentials & AzureCredentials; + export const ViaCredentialsForm = ({ searchParams, }: { @@ -31,14 +33,14 @@ export const ViaCredentialsForm = ({ const providerType = searchParams.provider; const providerId = searchParams.id; - const formSchema = addCredentialsFormSchema(providerType); - const form = useForm({ + const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { secretName: "", providerId, + providerType, ...(providerType === "aws" ? { aws_access_key_id: "", @@ -63,7 +65,8 @@ export const ViaCredentialsForm = ({ const isLoading = form.formState.isSubmitting; - const onSubmitClient = async (values: z.infer) => { + const onSubmitClient = async (values: FormType) => { + console.log("via credentials form", values); const formData = new FormData(); Object.entries(values).forEach( @@ -94,6 +97,24 @@ export const ViaCredentialsForm = ({ message: errorMessage, }); break; + case "/data/attributes/secret/client_id": + form.setError("client_id", { + type: "server", + message: errorMessage, + }); + break; + case "/data/attributes/secret/client_secret": + form.setError("client_secret", { + type: "server", + message: errorMessage, + }); + break; + case "/data/attributes/secret/tenant_id": + form.setError("tenant_id", { + type: "server", + message: errorMessage, + }); + break; case "/data/attributes/name": form.setError("secretName", { type: "server", @@ -109,7 +130,7 @@ export const ViaCredentialsForm = ({ } }); } else { - router.push("/providers/test-connection"); + router.push(`/providers/test-connection?id=${providerId}`); } }; @@ -120,17 +141,19 @@ export const ViaCredentialsForm = ({ className="flex flex-col space-y-4" > + {providerType === "aws" && ( } + control={form.control as unknown as Control} /> )} {providerType === "azure" && ( } + control={form.control as unknown as Control} /> )} + Name (Optional) ; -} - -export const AWScredentialsForm = ({ control }: AWScredentialsFormProps) => { +}) => { return ( <>
@@ -28,10 +27,7 @@ export const AWScredentialsForm = ({ control }: AWScredentialsFormProps) => { placeholder="Enter the AWS Access Key ID" variant="bordered" isRequired - isInvalid={ - !!(control._formState.errors as FieldErrors) - .aws_access_key_id - } + isInvalid={!!control._formState.errors.aws_access_key_id} /> { placeholder="Enter the AWS Secret Access Key" variant="bordered" isRequired - isInvalid={ - !!(control._formState.errors as FieldErrors) - .aws_secret_access_key - } + isInvalid={!!control._formState.errors.aws_secret_access_key} /> { labelPlacement="inside" placeholder="Enter the AWS Session Token" variant="bordered" - isRequired - isInvalid={ - !!(control._formState.errors as FieldErrors) - .aws_session_token - } + isRequired={false} + isInvalid={!!control._formState.errors.aws_session_token} /> ); diff --git a/components/providers/workflow/forms/via-credentials/azure-credentials-form.tsx b/components/providers/workflow/forms/via-credentials/azure-credentials-form.tsx index b9d3046635..87b9fb6b66 100644 --- a/components/providers/workflow/forms/via-credentials/azure-credentials-form.tsx +++ b/components/providers/workflow/forms/via-credentials/azure-credentials-form.tsx @@ -1,16 +1,13 @@ -import { Control, FieldErrors } from "react-hook-form"; +import { Control } from "react-hook-form"; import { CustomInput } from "@/components/ui/custom"; - -import { AzureCredentials } from "../../../../../types"; - -interface AzureCredentialsFormProps { - control: Control; -} +import { AzureCredentials } from "@/types"; export const AzureCredentialsForm = ({ control, -}: AzureCredentialsFormProps) => { +}: { + control: Control; +}) => { return ( <>
@@ -30,10 +27,7 @@ export const AzureCredentialsForm = ({ placeholder="Enter the Client ID" variant="bordered" isRequired - isInvalid={ - !!(control._formState.errors as FieldErrors) - .client_id - } + isInvalid={!!control._formState.errors.client_id} /> ) - .client_secret - } + isInvalid={!!control._formState.errors.client_secret} /> ) - .tenant_id - } + isInvalid={!!control._formState.errors.tenant_id} /> ); diff --git a/types/formSchemas.ts b/types/formSchemas.ts index 5297692124..bffffbaf0f 100644 --- a/types/formSchemas.ts +++ b/types/formSchemas.ts @@ -72,23 +72,28 @@ export const addCredentialsFormSchema = (providerType: string) => z.object({ secretName: z.string().optional(), providerId: z.string(), + providerType: z.string(), ...(providerType === "aws" ? { - aws_access_key_id: z.string(), - aws_secret_access_key: z.string(), - aws_session_token: z.string(), + aws_access_key_id: z + .string() + .nonempty("AWS Access Key ID is required"), + aws_secret_access_key: z + .string() + .nonempty("AWS Secret Access Key is required"), + aws_session_token: z.string().optional(), } : providerType === "azure" ? { - client_id: z.string(), - client_secret: z.string(), - tenant_id: z.string(), + client_id: z.string().nonempty("Client ID is required"), + client_secret: z.string().nonempty("Client Secret is required"), + tenant_id: z.string().nonempty("Tenant ID is required"), } : providerType === "gcp" ? { - client_id: z.string(), - client_secret: z.string(), - refresh_token: z.string(), + client_id: z.string().nonempty("Client ID is required"), + client_secret: z.string().nonempty("Client Secret is required"), + refresh_token: z.string().nonempty("Refresh Token is required"), } : {}), });