mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-24 04:51:51 +00:00
feat: add credentials for AWS and Azure are working nicely
This commit is contained in:
@@ -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: {
|
||||
|
||||
@@ -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 (
|
||||
<>
|
||||
<Header title="Scan Overview" icon="solar:pie-chart-2-outline" />
|
||||
<Spacer y={4} />
|
||||
<Spacer y={10} />
|
||||
<div className="grid grid-cols-12 gap-4">
|
||||
<Spacer y={14} />
|
||||
{/* <div className="grid grid-cols-12 gap-4">
|
||||
<CustomBox
|
||||
preTitle={"Findings by Status"}
|
||||
className="col-span-12 md:col-span-8 xl:col-span-5"
|
||||
@@ -30,7 +26,7 @@ export default function Home() {
|
||||
>
|
||||
<AttackSurface />
|
||||
</CustomBox>
|
||||
</div>
|
||||
</div> */}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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<typeof addCredentialsFormSchema>
|
||||
>;
|
||||
|
||||
// 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<CredentialsFormSchema>({
|
||||
const form = useForm<FormType>({
|
||||
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<typeof formSchema>) => {
|
||||
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"
|
||||
>
|
||||
<input type="hidden" name="providerId" value={providerId} />
|
||||
<input type="hidden" name="providerType" value={providerType} />
|
||||
|
||||
{providerType === "aws" && (
|
||||
<AWScredentialsForm
|
||||
control={form.control as Control<AWSCredentials>}
|
||||
control={form.control as unknown as Control<AWSCredentials>}
|
||||
/>
|
||||
)}
|
||||
{providerType === "azure" && (
|
||||
<AzureCredentialsForm
|
||||
control={form.control as Control<AzureCredentials>}
|
||||
control={form.control as unknown as Control<AzureCredentials>}
|
||||
/>
|
||||
)}
|
||||
|
||||
<span className="text-sm text-default-500">Name (Optional)</span>
|
||||
<CustomInput
|
||||
control={form.control}
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
import { Control, FieldErrors } from "react-hook-form";
|
||||
import { Control } from "react-hook-form";
|
||||
|
||||
import { CustomInput } from "@/components/ui/custom";
|
||||
import { AWSCredentials } from "@/types";
|
||||
|
||||
import { AWSCredentials } from "../../../../../types";
|
||||
|
||||
interface AWScredentialsFormProps {
|
||||
export const AWScredentialsForm = ({
|
||||
control,
|
||||
}: {
|
||||
control: Control<AWSCredentials>;
|
||||
}
|
||||
|
||||
export const AWScredentialsForm = ({ control }: AWScredentialsFormProps) => {
|
||||
}) => {
|
||||
return (
|
||||
<>
|
||||
<div className="text-left">
|
||||
@@ -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<AWSCredentials>)
|
||||
.aws_access_key_id
|
||||
}
|
||||
isInvalid={!!control._formState.errors.aws_access_key_id}
|
||||
/>
|
||||
<CustomInput
|
||||
control={control}
|
||||
@@ -42,10 +38,7 @@ export const AWScredentialsForm = ({ control }: AWScredentialsFormProps) => {
|
||||
placeholder="Enter the AWS Secret Access Key"
|
||||
variant="bordered"
|
||||
isRequired
|
||||
isInvalid={
|
||||
!!(control._formState.errors as FieldErrors<AWSCredentials>)
|
||||
.aws_secret_access_key
|
||||
}
|
||||
isInvalid={!!control._formState.errors.aws_secret_access_key}
|
||||
/>
|
||||
<CustomInput
|
||||
control={control}
|
||||
@@ -55,11 +48,8 @@ export const AWScredentialsForm = ({ control }: AWScredentialsFormProps) => {
|
||||
labelPlacement="inside"
|
||||
placeholder="Enter the AWS Session Token"
|
||||
variant="bordered"
|
||||
isRequired
|
||||
isInvalid={
|
||||
!!(control._formState.errors as FieldErrors<AWSCredentials>)
|
||||
.aws_session_token
|
||||
}
|
||||
isRequired={false}
|
||||
isInvalid={!!control._formState.errors.aws_session_token}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -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<AzureCredentials>;
|
||||
}
|
||||
import { AzureCredentials } from "@/types";
|
||||
|
||||
export const AzureCredentialsForm = ({
|
||||
control,
|
||||
}: AzureCredentialsFormProps) => {
|
||||
}: {
|
||||
control: Control<AzureCredentials>;
|
||||
}) => {
|
||||
return (
|
||||
<>
|
||||
<div className="text-left">
|
||||
@@ -30,10 +27,7 @@ export const AzureCredentialsForm = ({
|
||||
placeholder="Enter the Client ID"
|
||||
variant="bordered"
|
||||
isRequired
|
||||
isInvalid={
|
||||
!!(control._formState.errors as FieldErrors<AzureCredentials>)
|
||||
.client_id
|
||||
}
|
||||
isInvalid={!!control._formState.errors.client_id}
|
||||
/>
|
||||
<CustomInput
|
||||
control={control}
|
||||
@@ -44,10 +38,7 @@ export const AzureCredentialsForm = ({
|
||||
placeholder="Enter the Client Secret"
|
||||
variant="bordered"
|
||||
isRequired
|
||||
isInvalid={
|
||||
!!(control._formState.errors as FieldErrors<AzureCredentials>)
|
||||
.client_secret
|
||||
}
|
||||
isInvalid={!!control._formState.errors.client_secret}
|
||||
/>
|
||||
<CustomInput
|
||||
control={control}
|
||||
@@ -58,10 +49,7 @@ export const AzureCredentialsForm = ({
|
||||
placeholder="Enter the Tenant ID"
|
||||
variant="bordered"
|
||||
isRequired
|
||||
isInvalid={
|
||||
!!(control._formState.errors as FieldErrors<AzureCredentials>)
|
||||
.tenant_id
|
||||
}
|
||||
isInvalid={!!control._formState.errors.tenant_id}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
|
||||
+14
-9
@@ -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"),
|
||||
}
|
||||
: {}),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user