feat: add credentials for AWS and Azure are working nicely

This commit is contained in:
Pablo Lara
2024-10-31 18:27:28 +01:00
parent c81cb04bd0
commit 593bce5155
6 changed files with 90 additions and 77 deletions
+19 -8
View File
@@ -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: {
+3 -7
View File
@@ -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
View File
@@ -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"),
}
: {}),
});