Merge pull request #4924 from Infisical/machine-identity-labeling

improvement(frontend): text "identity" -> "machine identity"
This commit is contained in:
Scott Wilson
2025-11-24 17:08:08 -08:00
committed by GitHub
24 changed files with 158 additions and 147 deletions
@@ -29,7 +29,7 @@ export const ResourceOverviewPage = () => {
Users Users
</Tab> </Tab>
<Tab variant="instance" value="tab-identities"> <Tab variant="instance" value="tab-identities">
Identities Machine Identities
</Tab> </Tab>
</TabList> </TabList>
<TabPanel value="tab-organizations"> <TabPanel value="tab-organizations">
@@ -90,7 +90,7 @@ const IdentityPanelTable = ({
value={searchIdentityFilter} value={searchIdentityFilter}
onChange={(e) => setSearchIdentityFilter(e.target.value)} onChange={(e) => setSearchIdentityFilter(e.target.value)}
leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />} leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />}
placeholder="Search identities by name..." placeholder="Search machine identities by name..."
className="flex-1" className="flex-1"
/> />
</div> </div>
@@ -58,7 +58,7 @@ export const AccessManagementPage = () => {
}, },
{ {
key: OrgAccessControlTabSections.Identities, key: OrgAccessControlTabSections.Identities,
label: "Identities", label: "Machine Identities",
isHidden: permission.cannot( isHidden: permission.cannot(
OrgPermissionIdentityActions.Read, OrgPermissionIdentityActions.Read,
OrgPermissionSubjects.Identity OrgPermissionSubjects.Identity
@@ -84,7 +84,7 @@ export const AccessManagementPage = () => {
<PageHeader <PageHeader
scope={isSubOrganization ? "namespace" : "org"} scope={isSubOrganization ? "namespace" : "org"}
title="Access Control" title="Access Control"
description="Manage fine-grained access for users, groups, roles, and identities within your organization resources." description="Manage fine-grained access for users, groups, roles, and machine identities within your organization resources."
/> />
{!currentOrg.shouldUseNewPrivilegeSystem && ( {!currentOrg.shouldUseNewPrivilegeSystem && (
<div className="mt-4 mb-4 flex flex-col rounded-r border-l-2 border-l-primary bg-mineshaft-300/5 px-4 py-2.5"> <div className="mt-4 mb-4 flex flex-col rounded-r border-l-2 border-l-primary bg-mineshaft-300/5 px-4 py-2.5">
@@ -154,7 +154,9 @@ export const IdentityAuthTemplateModal = ({ popUp, handlePopUpToggle }: Props) =
onOpenChange={handleClose} onOpenChange={handleClose}
> >
<ModalContent <ModalContent
title={isEdit ? "Edit Identity Auth Template" : "Create Identity Auth Template"} title={
isEdit ? "Edit Machine Identity Auth Template" : "Create Machine Identity Auth Template"
}
subTitle={ subTitle={
isEdit ? "Update the authentication template" : "Create a new authentication template" isEdit ? "Update the authentication template" : "Create a new authentication template"
} }
@@ -73,7 +73,7 @@ export const IdentitySection = withPermission(
}); });
createNotification({ createNotification({
text: "Successfully deleted identity", text: "Successfully deleted machine identity",
type: "success" type: "success"
}); });
@@ -99,7 +99,7 @@ export const IdentitySection = withPermission(
<div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="mb-4 flex flex-wrap items-center justify-between gap-2"> <div className="mb-4 flex flex-wrap items-center justify-between gap-2">
<div className="flex flex-1 items-center gap-x-2"> <div className="flex flex-1 items-center gap-x-2">
<p className="text-xl font-medium text-mineshaft-100">Identities</p> <p className="text-xl font-medium text-mineshaft-100">Machine Identities</p>
<DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/machine-identities" /> <DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/machine-identities" />
</div> </div>
<div className="flex items-center"> <div className="flex items-center">
@@ -116,7 +116,7 @@ export const IdentitySection = withPermission(
if (!isMoreIdentitiesAllowed && !isEnterprise) { if (!isMoreIdentitiesAllowed && !isEnterprise) {
handlePopUpOpen("upgradePlan", { handlePopUpOpen("upgradePlan", {
description: description:
"You can add more identities if you upgrade your Infisical Pro plan." "You can add more machine identities if you upgrade your Infisical Pro plan."
}); });
return; return;
} }
@@ -129,7 +129,7 @@ export const IdentitySection = withPermission(
}} }}
isDisabled={!isAllowed} isDisabled={!isAllowed}
> >
Create Identity Add Machine Identity
</Button> </Button>
)} )}
</OrgPermissionCan> </OrgPermissionCan>
@@ -141,7 +141,9 @@ export const IdentitySection = withPermission(
<div className="mt-4 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="mt-4 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="mb-4 flex flex-wrap items-center justify-between gap-2"> <div className="mb-4 flex flex-wrap items-center justify-between gap-2">
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<p className="text-xl font-medium text-mineshaft-100">Identity Auth Templates</p> <p className="text-xl font-medium text-mineshaft-100">
Machine Identity Auth Templates
</p>
<DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/auth-templates" /> <DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/auth-templates" />
</div> </div>
<OrgPermissionCan <OrgPermissionCan
@@ -150,14 +152,14 @@ export const IdentitySection = withPermission(
> >
{(isAllowed) => ( {(isAllowed) => (
<Button <Button
colorSchema="secondary" variant="outline_bg"
type="submit" type="submit"
leftIcon={<FontAwesomeIcon icon={faPlus} />} leftIcon={<FontAwesomeIcon icon={faPlus} />}
onClick={() => { onClick={() => {
if (subscription && !subscription.machineIdentityAuthTemplates) { if (subscription && !subscription.machineIdentityAuthTemplates) {
handlePopUpOpen("upgradePlan", { handlePopUpOpen("upgradePlan", {
isEnterpriseFeature: true, isEnterpriseFeature: true,
text: "Your current plan does not include access to creating Identity Auth Templates. To unlock this feature, please upgrade to Infisical Enterprise plan." text: "Your current plan does not include access to creating Machine Identity Auth Templates. To unlock this feature, please upgrade to Infisical Enterprise plan."
}); });
return; return;
} }
@@ -197,9 +199,11 @@ export const IdentitySection = withPermission(
> >
<ModalContent <ModalContent
bodyClassName="overflow-visible" bodyClassName="overflow-visible"
title="Add Identity" title="Add Machine Identity"
subTitle={ subTitle={
isSubOrganization ? "Create a new identity or assign an existing identity" : undefined isSubOrganization
? "Create a new machine identity or assign an existing one"
: undefined
} }
> >
<AnimatePresence mode="wait"> <AnimatePresence mode="wait">
@@ -224,11 +228,11 @@ export const IdentitySection = withPermission(
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<PlusIcon size="1rem" /> <PlusIcon size="1rem" />
<div>Create New Identity</div> <div>Create Machine Identity</div>
</div> </div>
<div className="mt-2 text-xs text-mineshaft-300"> <div className="mt-2 text-xs text-mineshaft-300">
Create a new machine identity specifically for this sub-organization. This Create a new machine identity specifically for this sub-organization. This
identity will be managed at the sub-organization level. machine identity will be managed at the sub-organization level.
</div> </div>
</div> </div>
<div <div
@@ -244,11 +248,11 @@ export const IdentitySection = withPermission(
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<LinkIcon size="1rem" /> <LinkIcon size="1rem" />
<div>Assign Existing Identity</div> <div>Assign Existing Machine Identity</div>
</div> </div>
<div className="mt-2 text-xs text-mineshaft-300"> <div className="mt-2 text-xs text-mineshaft-300">
Assign an existing identity from your parent organization. The identity will Assign an existing machine identity from your parent organization. The machine
continue to be managed at its original scope. identity will continue to be managed at its original scope.
</div> </div>
</div> </div>
</motion.div> </motion.div>
@@ -152,7 +152,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
}); });
createNotification({ createNotification({
text: "Successfully updated identity role", text: "Successfully updated machine identity role",
type: "success" type: "success"
}); });
}; };
@@ -178,7 +178,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<IconButton <IconButton
ariaLabel="Filter Identities" ariaLabel="Filter Machine Identities"
variant="plain" variant="plain"
size="sm" size="sm"
className={twMerge( className={twMerge(
@@ -200,7 +200,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
</DropdownSubMenuTrigger> </DropdownSubMenuTrigger>
<DropdownSubMenuContent className="max-h-80 thin-scrollbar overflow-y-auto rounded-l-none"> <DropdownSubMenuContent className="max-h-80 thin-scrollbar overflow-y-auto rounded-l-none">
<DropdownMenuLabel className="sticky top-0 bg-mineshaft-900"> <DropdownMenuLabel className="sticky top-0 bg-mineshaft-900">
Apply Roles to Filter Identities Filter Machine Identities by Role
</DropdownMenuLabel> </DropdownMenuLabel>
{roles?.map(({ id, slug, name }) => ( {roles?.map(({ id, slug, name }) => (
<DropdownMenuItem <DropdownMenuItem
@@ -229,7 +229,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
value={search} value={search}
onChange={(e) => setSearch(e.target.value)} onChange={(e) => setSearch(e.target.value)}
leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />} leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />}
placeholder="Search identities by name..." placeholder="Search machine identities by name..."
/> />
</div> </div>
<TableContainer> <TableContainer>
@@ -407,7 +407,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
}} }}
isDisabled={!isAllowed} isDisabled={!isAllowed}
> >
Edit Identity {isSubOrgIdentity ? "" : "Membership"} Edit Machine Identity {isSubOrgIdentity ? "" : "Membership"}
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</OrgPermissionCan> </OrgPermissionCan>
@@ -428,7 +428,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
icon={<FontAwesomeIcon icon={faTrash} />} icon={<FontAwesomeIcon icon={faTrash} />}
> >
{isSubOrgIdentity {isSubOrgIdentity
? "Delete Identity" ? "Delete Machine Identity"
: "Remove From Sub-Organization"} : "Remove From Sub-Organization"}
</DropdownMenuItem> </DropdownMenuItem>
)} )}
@@ -455,8 +455,8 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => {
<EmptyState <EmptyState
title={ title={
debouncedSearch.trim().length > 0 || filter.roles?.length > 0 debouncedSearch.trim().length > 0 || filter.roles?.length > 0
? "No identities match search filter" ? "No machine identities match search filter"
: "No identities have been created in this organization" : "No machine identities have been created in this organization"
} }
icon={faServer} icon={faServer}
/> />
@@ -78,11 +78,11 @@ export const OrgIdentityLinkForm = ({ onClose }: Props) => {
control={control} control={control}
name="identity" name="identity"
render={({ field: { onChange, value }, fieldState: { error } }) => ( render={({ field: { onChange, value }, fieldState: { error } }) => (
<FormControl label="Identity" errorText={error?.message} isError={Boolean(error)}> <FormControl label="Machine Identity" errorText={error?.message} isError={Boolean(error)}>
<FilterableSelect <FilterableSelect
value={value} value={value}
onChange={onChange} onChange={onChange}
placeholder="Select identity..." placeholder="Select machine identity..."
// onInputChange={setSearchValue} // onInputChange={setSearchValue}
options={rootOrgIdentities} options={rootOrgIdentities}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
@@ -164,7 +164,7 @@ export const OrgIdentityModal = ({ popUp, handlePopUpToggle }: Props) => {
} }
createNotification({ createNotification({
text: `Successfully ${popUp?.identity?.data ? "updated" : "created"} identity`, text: `Successfully ${popUp?.identity?.data ? "updated" : "created"} machine identity`,
type: "success" type: "success"
}); });
@@ -55,7 +55,7 @@ const Page = () => {
}); });
createNotification({ createNotification({
text: "Successfully deleted identity", text: "Successfully deleted machine identity",
type: "success" type: "success"
}); });
@@ -82,11 +82,11 @@ const Page = () => {
className="mb-4 flex items-center gap-x-2 text-sm text-mineshaft-400" className="mb-4 flex items-center gap-x-2 text-sm text-mineshaft-400"
> >
<FontAwesomeIcon icon={faChevronLeft} /> <FontAwesomeIcon icon={faChevronLeft} />
Identities Machine Identities
</Link> </Link>
<PageHeader <PageHeader
scope={isSubOrganization ? "namespace" : "org"} scope={isSubOrganization ? "namespace" : "org"}
description={`${isSubOrganization ? "Sub-" : ""}Organization Identity`} description={`${isSubOrganization ? "Sub-" : ""}Organization Machine Identity`}
title={data.identity.name} title={data.identity.name}
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
@@ -111,7 +111,7 @@ const Page = () => {
}) })
} }
> >
Unlink Identity Unlink Machine Identity
</Button> </Button>
)} )}
</OrgPermissionCan> </OrgPermissionCan>
@@ -142,7 +142,7 @@ const Page = () => {
> >
<ModalContent <ModalContent
bodyClassName="overflow-visible" bodyClassName="overflow-visible"
title={`${popUp?.identity?.data ? "Update" : "Create"} Identity`} title={`${popUp?.identity?.data ? "Update" : "Create"} Machine Identity`}
> >
<OrgIdentityModal popUp={popUp} handlePopUpToggle={handlePopUpToggle} /> <OrgIdentityModal popUp={popUp} handlePopUpToggle={handlePopUpToggle} />
</ModalContent> </ModalContent>
@@ -45,7 +45,7 @@ export const IdentityDetailsSection = ({ identityId, handlePopUpOpen, isOrgIdent
return data ? ( return data ? (
<div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="flex items-center justify-between border-b border-mineshaft-400 pb-4"> <div className="flex items-center justify-between border-b border-mineshaft-400 pb-4">
<h3 className="text-lg font-medium text-mineshaft-100">Identity Details</h3> <h3 className="text-lg font-medium text-mineshaft-100">Details</h3>
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<Button <Button
@@ -86,7 +86,7 @@ export const IdentityDetailsSection = ({ identityId, handlePopUpOpen, isOrgIdent
}} }}
disabled={!isAllowed} disabled={!isAllowed}
> >
{isOrgIdentity ? "Edit Identity" : "Edit Identity Role"} {isOrgIdentity ? "Edit Machine Identity" : "Edit Machine Identity Role"}
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</OrgPermissionCan> </OrgPermissionCan>
@@ -110,7 +110,7 @@ export const IdentityDetailsSection = ({ identityId, handlePopUpOpen, isOrgIdent
icon={<FontAwesomeIcon icon={faTrash} />} icon={<FontAwesomeIcon icon={faTrash} />}
disabled={!isAllowed} disabled={!isAllowed}
> >
{!isOrgIdentity ? "Remove From Sub-Organization" : "Delete Identity"} {!isOrgIdentity ? "Remove From Sub-Organization" : "Delete Machine Identity"}
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</OrgPermissionCan> </OrgPermissionCan>
@@ -119,7 +119,7 @@ export const IdentityDetailsSection = ({ identityId, handlePopUpOpen, isOrgIdent
</div> </div>
<div className="pt-4"> <div className="pt-4">
<div className="mb-4"> <div className="mb-4">
<p className="text-sm font-medium text-mineshaft-300">Identity ID</p> <p className="text-sm font-medium text-mineshaft-300">Machine Identity ID</p>
<div className="group flex align-top"> <div className="group flex align-top">
<p className="text-sm text-mineshaft-300">{data.identity.id}</p> <p className="text-sm text-mineshaft-300">{data.identity.id}</p>
<div className="opacity-0 transition-opacity duration-300 group-hover:opacity-100"> <div className="opacity-0 transition-opacity duration-300 group-hover:opacity-100">
@@ -167,7 +167,7 @@ export const IdentityAddToProjectModal = ({ identityId, popUp, handlePopUpToggle
handlePopUpToggle("addIdentityToProject", isOpen); handlePopUpToggle("addIdentityToProject", isOpen);
}} }}
> >
<ModalContent bodyClassName="overflow-visible" title="Add Identity to Project"> <ModalContent bodyClassName="overflow-visible" title="Add Machine Identity to Project">
<Content identityId={identityId} handlePopUpToggle={handlePopUpToggle} /> <Content identityId={identityId} handlePopUpToggle={handlePopUpToggle} />
</ModalContent> </ModalContent>
</Modal> </Modal>
@@ -151,7 +151,7 @@ export const IdentityProjectsTable = ({ identityId, handlePopUpOpen }: Props) =>
title={ title={
projectMemberships.length projectMemberships.length
? "No projects match search..." ? "No projects match search..."
: "This identity has not been assigned to any projects" : "This machine identity has not been assigned to any projects"
} }
icon={projectMemberships.length ? faSearch : faFolder} icon={projectMemberships.length ? faSearch : faFolder}
/> />
@@ -55,10 +55,10 @@ const formSchemaWithIdentity = baseFormSchema.extend({
id: z.string(), id: z.string(),
name: z.string() name: z.string()
}, },
{ required_error: "Identity is required" } { required_error: "Machine identity is required" }
) )
.nullable() .nullable()
.refine((val) => val !== null, { message: "Identity is required" }) .refine((val) => val !== null, { message: "Machine identity is required" })
}); });
const formSchemaWithToken = baseFormSchema.extend({ const formSchemaWithToken = baseFormSchema.extend({
@@ -275,8 +275,8 @@ export const GatewayCliDeploymentMethod = () => {
{canCreateToken && autogenerateToken ? ( {canCreateToken && autogenerateToken ? (
<> <>
<FormLabel <FormLabel
label="Identity" label="Machine Identity"
tooltipText="The identity that your gateway will use for authentication." tooltipText="The machine identity that your gateway will use for authentication."
className="mt-4" className="mt-4"
/> />
<FilterableSelect <FilterableSelect
@@ -290,7 +290,7 @@ export const GatewayCliDeploymentMethod = () => {
) )
} }
isLoading={isIdentitiesLoading} isLoading={isIdentitiesLoading}
placeholder="Select identity..." placeholder="Select machine identity..."
options={identityMembershipOrgs.map((membership) => membership.identity)} options={identityMembershipOrgs.map((membership) => membership.identity)}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -300,14 +300,14 @@ export const GatewayCliDeploymentMethod = () => {
) : ( ) : (
<> <>
<FormLabel <FormLabel
label="Identity Token" label="Machine Identity Token"
tooltipText="The identity token that your gateway will use for authentication." tooltipText="The machine identity token that your gateway will use for authentication."
className="mt-4" className="mt-4"
/> />
<Input <Input
value={identityToken} value={identityToken}
onChange={(e) => setIdentityToken(e.target.value)} onChange={(e) => setIdentityToken(e.target.value)}
placeholder="Enter identity token..." placeholder="Enter machine identity token..."
isError={Boolean(errors.identityToken)} isError={Boolean(errors.identityToken)}
/> />
{errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>} {errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>}
@@ -325,15 +325,15 @@ export const GatewayCliDeploymentMethod = () => {
className="mr-2" className="mr-2"
> >
<div className="flex items-center"> <div className="flex items-center">
<span>Automatically enable token auth and generate a token for identity</span> <span>Automatically enable token auth and generate a token for machine identity</span>
<Tooltip <Tooltip
className="max-w-md" className="max-w-md"
content={ content={
<> <>
Token authentication will be automatically enabled for the selected identity if Token authentication will be automatically enabled for the selected machine
it isn&apos;t already configured. By default, it will be configured to allow all identity if it isn&apos;t already configured. By default, it will be configured
IP addresses with a token TTL of 30 days. You can manage these settings in to allow all IP addresses with a token TTL of 30 days. You can manage these
Access Control. settings in Access Control.
<br /> <br />
<br />A token will automatically be generated to be used with the CLI command. <br />A token will automatically be generated to be used with the CLI command.
</> </>
@@ -55,10 +55,10 @@ const formSchemaWithIdentity = baseFormSchema.extend({
id: z.string(), id: z.string(),
name: z.string() name: z.string()
}, },
{ required_error: "Identity is required" } { required_error: "Machine identity is required" }
) )
.nullable() .nullable()
.refine((val) => val !== null, { message: "Identity is required" }) .refine((val) => val !== null, { message: "Machine identity is required" })
}); });
const formSchemaWithToken = baseFormSchema.extend({ const formSchemaWithToken = baseFormSchema.extend({
@@ -297,8 +297,8 @@ export const GatewayCliSystemdDeploymentMethod = () => {
{canCreateToken && autogenerateToken ? ( {canCreateToken && autogenerateToken ? (
<> <>
<FormLabel <FormLabel
label="Identity" label="Machine Identity"
tooltipText="The identity that your gateway will use for authentication." tooltipText="The machine identity that your gateway will use for authentication."
className="mt-4" className="mt-4"
/> />
<FilterableSelect <FilterableSelect
@@ -312,7 +312,7 @@ export const GatewayCliSystemdDeploymentMethod = () => {
) )
} }
isLoading={isIdentitiesLoading} isLoading={isIdentitiesLoading}
placeholder="Select identity..." placeholder="Select machine identity..."
options={identityMembershipOrgs.map((membership) => membership.identity)} options={identityMembershipOrgs.map((membership) => membership.identity)}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -322,14 +322,14 @@ export const GatewayCliSystemdDeploymentMethod = () => {
) : ( ) : (
<> <>
<FormLabel <FormLabel
label="Identity Token" label="Machine Identity Token"
tooltipText="The identity token that your gateway will use for authentication." tooltipText="The machine identity token that your gateway will use for authentication."
className="mt-4" className="mt-4"
/> />
<Input <Input
value={identityToken} value={identityToken}
onChange={(e) => setIdentityToken(e.target.value)} onChange={(e) => setIdentityToken(e.target.value)}
placeholder="Enter identity token..." placeholder="Enter machine identity token..."
isError={Boolean(errors.identityToken)} isError={Boolean(errors.identityToken)}
/> />
{errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>} {errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>}
@@ -347,15 +347,15 @@ export const GatewayCliSystemdDeploymentMethod = () => {
className="mr-2" className="mr-2"
> >
<div className="flex items-center"> <div className="flex items-center">
<span>Automatically enable token auth and generate a token for identity</span> <span>Automatically enable token auth and generate a token for machine identity</span>
<Tooltip <Tooltip
className="max-w-md" className="max-w-md"
content={ content={
<> <>
Token authentication will be automatically enabled for the selected identity if Token authentication will be automatically enabled for the selected machine
it isn&apos;t already configured. By default, it will be configured to allow all identity if it isn&apos;t already configured. By default, it will be configured
IP addresses with a token TTL of 30 days. You can manage these settings in to allow all IP addresses with a token TTL of 30 days. You can manage these
Access Control. settings in Access Control.
<br /> <br />
<br />A token will automatically be generated to be used with the CLI command. <br />A token will automatically be generated to be used with the CLI command.
</> </>
@@ -41,10 +41,10 @@ const formSchemaWithIdentity = baseFormSchema.extend({
id: z.string(), id: z.string(),
name: z.string() name: z.string()
}, },
{ required_error: "Identity is required" } { required_error: "Machine identity is required" }
) )
.nullable() .nullable()
.refine((val) => val !== null, { message: "Identity is required" }) .refine((val) => val !== null, { message: "Machine identity is required" })
}); });
const formSchemaWithToken = baseFormSchema.extend({ const formSchemaWithToken = baseFormSchema.extend({
@@ -229,8 +229,8 @@ export const RelayCliDeploymentMethod = () => {
{canCreateToken && autogenerateToken ? ( {canCreateToken && autogenerateToken ? (
<> <>
<FormLabel <FormLabel
label="Identity" label="Machine Identity"
tooltipText="The identity that your relay will use for authentication." tooltipText="The machine identity that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<FilterableSelect <FilterableSelect
@@ -244,7 +244,7 @@ export const RelayCliDeploymentMethod = () => {
) )
} }
isLoading={isIdentitiesLoading} isLoading={isIdentitiesLoading}
placeholder="Select identity..." placeholder="Select machine identity..."
options={identityMembershipOrgs.map((membership) => membership.identity)} options={identityMembershipOrgs.map((membership) => membership.identity)}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -254,14 +254,14 @@ export const RelayCliDeploymentMethod = () => {
) : ( ) : (
<> <>
<FormLabel <FormLabel
label="Identity Token" label="Machine Identity Token"
tooltipText="The identity token that your relay will use for authentication." tooltipText="The machine identity token that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<Input <Input
value={identityToken} value={identityToken}
onChange={(e) => setIdentityToken(e.target.value)} onChange={(e) => setIdentityToken(e.target.value)}
placeholder="Enter identity token..." placeholder="Enter machine identity token..."
isError={Boolean(errors.identityToken)} isError={Boolean(errors.identityToken)}
/> />
{errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>} {errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>}
@@ -279,15 +279,15 @@ export const RelayCliDeploymentMethod = () => {
className="mr-2" className="mr-2"
> >
<div className="flex items-center"> <div className="flex items-center">
<span>Automatically enable token auth and generate a token for identity</span> <span>Automatically enable token auth and generate a token for machine identity</span>
<Tooltip <Tooltip
className="max-w-md" className="max-w-md"
content={ content={
<> <>
Token authentication will be automatically enabled for the selected identity if Token authentication will be automatically enabled for the selected machine
it isn&apos;t already configured. By default, it will be configured to allow all identity if it isn&apos;t already configured. By default, it will be configured
IP addresses with a token TTL of 30 days. You can manage these settings in to allow all IP addresses with a token TTL of 30 days. You can manage these
Access Control. settings in Access Control.
<br /> <br />
<br />A token will automatically be generated to be used with the CLI command. <br />A token will automatically be generated to be used with the CLI command.
</> </>
@@ -41,10 +41,10 @@ const formSchemaWithIdentity = baseFormSchema.extend({
id: z.string(), id: z.string(),
name: z.string() name: z.string()
}, },
{ required_error: "Identity is required" } { required_error: "Machine identity is required" }
) )
.nullable() .nullable()
.refine((val) => val !== null, { message: "Identity is required" }) .refine((val) => val !== null, { message: "Machine identity is required" })
}); });
const formSchemaWithToken = baseFormSchema.extend({ const formSchemaWithToken = baseFormSchema.extend({
@@ -270,8 +270,8 @@ export const RelayCliSystemdDeploymentMethod = () => {
{canCreateToken && autogenerateToken ? ( {canCreateToken && autogenerateToken ? (
<> <>
<FormLabel <FormLabel
label="Identity" label="Machine Identity"
tooltipText="The identity that your relay will use for authentication." tooltipText="The machine identity that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<FilterableSelect <FilterableSelect
@@ -285,7 +285,7 @@ export const RelayCliSystemdDeploymentMethod = () => {
) )
} }
isLoading={isIdentitiesLoading} isLoading={isIdentitiesLoading}
placeholder="Select identity..." placeholder="Select machine identity..."
options={identityMembershipOrgs.map((membership) => membership.identity)} options={identityMembershipOrgs.map((membership) => membership.identity)}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -295,14 +295,14 @@ export const RelayCliSystemdDeploymentMethod = () => {
) : ( ) : (
<> <>
<FormLabel <FormLabel
label="Identity Token" label="Machine Identity Token"
tooltipText="The identity token that your relay will use for authentication." tooltipText="The machine identity token that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<Input <Input
value={identityToken} value={identityToken}
onChange={(e) => setIdentityToken(e.target.value)} onChange={(e) => setIdentityToken(e.target.value)}
placeholder="Enter identity token..." placeholder="Enter machine identity token..."
isError={Boolean(errors.identityToken)} isError={Boolean(errors.identityToken)}
/> />
{errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>} {errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>}
@@ -320,15 +320,15 @@ export const RelayCliSystemdDeploymentMethod = () => {
className="mr-2" className="mr-2"
> >
<div className="flex items-center"> <div className="flex items-center">
<span>Automatically enable token auth and generate a token for identity</span> <span>Automatically enable token auth and generate a token for machine identity</span>
<Tooltip <Tooltip
className="max-w-md" className="max-w-md"
content={ content={
<> <>
Token authentication will be automatically enabled for the selected identity if Token authentication will be automatically enabled for the selected machine
it isn&apos;t already configured. By default, it will be configured to allow all identity if it isn&apos;t already configured. By default, it will be configured
IP addresses with a token TTL of 30 days. You can manage these settings in to allow all IP addresses with a token TTL of 30 days. You can manage these
Access Control. settings in Access Control.
<br /> <br />
<br />A token will automatically be generated to be used with the CLI command. <br />A token will automatically be generated to be used with the CLI command.
</> </>
@@ -42,10 +42,10 @@ const formSchemaWithIdentity = baseFormSchema.extend({
id: z.string(), id: z.string(),
name: z.string() name: z.string()
}, },
{ required_error: "Identity is required" } { required_error: "Machine identity is required" }
) )
.nullable() .nullable()
.refine((val) => val !== null, { message: "Identity is required" }) .refine((val) => val !== null, { message: "Machine identity is required" })
}); });
const formSchemaWithToken = baseFormSchema.extend({ const formSchemaWithToken = baseFormSchema.extend({
@@ -349,8 +349,8 @@ resource "aws_eip_association" "eip_assoc" {
{canCreateToken && autogenerateToken ? ( {canCreateToken && autogenerateToken ? (
<> <>
<FormLabel <FormLabel
label="Identity" label="Machine Identity"
tooltipText="The identity that your relay will use for authentication." tooltipText="The machine identity that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<FilterableSelect <FilterableSelect
@@ -364,7 +364,7 @@ resource "aws_eip_association" "eip_assoc" {
) )
} }
isLoading={isIdentitiesLoading} isLoading={isIdentitiesLoading}
placeholder="Select identity..." placeholder="Select machine identity..."
options={identityMembershipOrgs.map((membership) => membership.identity)} options={identityMembershipOrgs.map((membership) => membership.identity)}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -374,14 +374,14 @@ resource "aws_eip_association" "eip_assoc" {
) : ( ) : (
<> <>
<FormLabel <FormLabel
label="Identity Token" label="Machine Identity Token"
tooltipText="The identity token that your relay will use for authentication." tooltipText="The machine identity token that your relay will use for authentication."
className="mt-4" className="mt-4"
/> />
<Input <Input
value={identityToken} value={identityToken}
onChange={(e) => setIdentityToken(e.target.value)} onChange={(e) => setIdentityToken(e.target.value)}
placeholder="Enter identity token..." placeholder="Enter machine identity token..."
isError={Boolean(errors.identityToken)} isError={Boolean(errors.identityToken)}
/> />
{errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>} {errors.identityToken && <p className="mt-1 text-sm text-red">{errors.identityToken}</p>}
@@ -399,15 +399,15 @@ resource "aws_eip_association" "eip_assoc" {
className="mr-2" className="mr-2"
> >
<div className="flex items-center"> <div className="flex items-center">
<span>Automatically enable token auth and generate a token for identity</span> <span>Automatically enable token auth and generate a token for machine identity</span>
<Tooltip <Tooltip
className="max-w-md" className="max-w-md"
content={ content={
<> <>
Token authentication will be automatically enabled for the selected identity if Token authentication will be automatically enabled for the selected machine
it isn&apos;t already configured. By default, it will be configured to allow all identity if it isn&apos;t already configured. By default, it will be configured
IP addresses with a token TTL of 30 days. You can manage these settings in to allow all IP addresses with a token TTL of 30 days. You can manage these
Access Control. settings in Access Control.
<br /> <br />
<br />A token will automatically be generated to be used with the CLI command. <br />A token will automatically be generated to be used with the CLI command.
</> </>
@@ -44,7 +44,7 @@ const Page = () => {
<PageHeader <PageHeader
scope={currentProject.type} scope={currentProject.type}
title="Access Control" title="Access Control"
description="Manage fine-grained access for users, groups, roles, and identities within your project resources." description="Manage fine-grained access for users, groups, roles, and machine identities within your project resources."
/> />
<Tabs orientation="vertical" value={selectedTab} onValueChange={updateSelectedTab}> <Tabs orientation="vertical" value={selectedTab} onValueChange={updateSelectedTab}>
<TabList> <TabList>
@@ -55,7 +55,7 @@ const Page = () => {
Groups Groups
</Tab> </Tab>
<Tab variant="project" value={ProjectAccessControlTabs.Identities}> <Tab variant="project" value={ProjectAccessControlTabs.Identities}>
Identities Machine Identities
</Tab> </Tab>
{isSecretManager && ( {isSecretManager && (
<Tab variant="project" value={ProjectAccessControlTabs.ServiceTokens}> <Tab variant="project" value={ProjectAccessControlTabs.ServiceTokens}>
@@ -158,7 +158,7 @@ export const IdentityTab = withProjectPermission(
}); });
createNotification({ createNotification({
text: "Successfully deleted project identity", text: "Successfully deleted project machine identity",
type: "success" type: "success"
}); });
} else { } else {
@@ -168,7 +168,7 @@ export const IdentityTab = withProjectPermission(
}); });
createNotification({ createNotification({
text: "Successfully removed identity from project", text: "Successfully removed machine identity from project",
type: "success" type: "success"
}); });
} }
@@ -197,7 +197,7 @@ export const IdentityTab = withProjectPermission(
<div className="mb-6 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="mb-6 rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="mb-4 flex items-center justify-between"> <div className="mb-4 flex items-center justify-between">
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<p className="text-xl font-medium text-mineshaft-100">Identities</p> <p className="text-xl font-medium text-mineshaft-100">Machine Identities</p>
<DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/machine-identities" /> <DocumentationLinkBadge href="https://infisical.com/docs/documentation/platform/identities/machine-identities" />
</div> </div>
<div className="flex items-center"> <div className="flex items-center">
@@ -212,7 +212,7 @@ export const IdentityTab = withProjectPermission(
onClick={() => handlePopUpOpen("createIdentity")} onClick={() => handlePopUpOpen("createIdentity")}
isDisabled={!isAllowed} isDisabled={!isAllowed}
> >
Create Identity Add Machine Identity
</Button> </Button>
)} )}
</ProjectPermissionCan> </ProjectPermissionCan>
@@ -223,7 +223,7 @@ export const IdentityTab = withProjectPermission(
value={search} value={search}
onChange={(e) => setSearch(e.target.value)} onChange={(e) => setSearch(e.target.value)}
leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />} leftIcon={<FontAwesomeIcon icon={faMagnifyingGlass} />}
placeholder="Search identities by name..." placeholder="Search machine identities by name..."
/> />
<TableContainer> <TableContainer>
<Table> <Table>
@@ -454,7 +454,9 @@ export const IdentityTab = withProjectPermission(
}); });
}} }}
> >
{identityProjectId ? "Delete Identity" : "Remove From Project"} {identityProjectId
? "Delete Machine Identity"
: "Remove From Project"}
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</ProjectPermissionCan> </ProjectPermissionCan>
@@ -474,7 +476,7 @@ export const IdentityTab = withProjectPermission(
<Td colSpan={3}> <Td colSpan={3}>
<Blur <Blur
className="w-min" className="w-min"
tooltipText="You do not have permission to read this identity." tooltipText="You do not have permission to view this machine identity."
/> />
</Td> </Td>
</Tr> </Tr>
@@ -497,8 +499,8 @@ export const IdentityTab = withProjectPermission(
<EmptyState <EmptyState
title={ title={
debouncedSearch.trim().length > 0 debouncedSearch.trim().length > 0
? "No identities match search filter" ? "No machine identities match search filter"
: "No identities have been added to this project" : "No machine identities have been added to this project"
} }
icon={faServer} icon={faServer}
/> />
@@ -513,8 +515,8 @@ export const IdentityTab = withProjectPermission(
> >
<ModalContent <ModalContent
bodyClassName="overflow-visible" bodyClassName="overflow-visible"
title="Add Project Identity" title="Add Project Machine Identity"
subTitle="Create a new identity or assign an existing identity" subTitle="Create a new machine identity or assign an existing one"
> >
<AnimatePresence mode="wait"> <AnimatePresence mode="wait">
{wizardStep === WizardSteps.SelectAction && ( {wizardStep === WizardSteps.SelectAction && (
@@ -538,11 +540,11 @@ export const IdentityTab = withProjectPermission(
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<PlusIcon size="1rem" /> <PlusIcon size="1rem" />
<div>Create New Identity</div> <div>Create Machine Identity</div>
</div> </div>
<div className="mt-2 text-xs text-mineshaft-300"> <div className="mt-2 text-xs text-mineshaft-300">
Create a new machine identity specifically for this project. This identity Create a new machine identity specifically for this project. This machine
will be managed at the project-level. identity will be managed at the project-level.
</div> </div>
</div> </div>
<div <div
@@ -558,11 +560,11 @@ export const IdentityTab = withProjectPermission(
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<LinkIcon size="1rem" /> <LinkIcon size="1rem" />
<div>Assign Existing Identity</div> <div>Assign Existing Machine Identity</div>
</div> </div>
<div className="mt-2 text-xs text-mineshaft-300"> <div className="mt-2 text-xs text-mineshaft-300">
Assign an existing identity from your organization. The identity will continue Assign an existing machine identity from your organization. The machine
to be managed at its original scope. identity will continue to be managed at its original scope.
</div> </div>
</div> </div>
</motion.div> </motion.div>
@@ -138,7 +138,7 @@ export const ProjectIdentityModal = ({ onClose, identity }: ContentProps) => {
} }
createNotification({ createNotification({
text: `Successfully ${isUpdate ? "updated" : "created"} project identity`, text: `Successfully ${isUpdate ? "updated" : "created"} project machine identity`,
type: "success" type: "success"
}); });
@@ -148,7 +148,7 @@ export const ProjectIdentityModal = ({ onClose, identity }: ContentProps) => {
const error = err as any; const error = err as any;
const text = const text =
error?.response?.data?.message ?? error?.response?.data?.message ??
`Failed to ${isUpdate ? "update" : "create"} project identity`; `Failed to ${isUpdate ? "update" : "create"} project machine identity`;
createNotification({ createNotification({
text, text,
@@ -83,7 +83,7 @@ export const ProjectLinkIdentityModal = ({ handlePopUpToggle }: Props) => {
}); });
createNotification({ createNotification({
text: "Successfully added identity to project", text: "Successfully added machine identity to project",
type: "success" type: "success"
}); });
@@ -114,11 +114,11 @@ export const ProjectLinkIdentityModal = ({ handlePopUpToggle }: Props) => {
control={control} control={control}
name="identity" name="identity"
render={({ field: { onChange, value }, fieldState: { error } }) => ( render={({ field: { onChange, value }, fieldState: { error } }) => (
<FormControl label="Identity" errorText={error?.message} isError={Boolean(error)}> <FormControl label="Machine Identity" errorText={error?.message} isError={Boolean(error)}>
<FilterableSelect <FilterableSelect
value={value} value={value}
onChange={onChange} onChange={onChange}
placeholder="Select identity..." placeholder="Select machine identity..."
// onInputChange={setSearchValue} // onInputChange={setSearchValue}
options={filteredIdentityMembershipOrgs.map((membership) => ({ options={filteredIdentityMembershipOrgs.map((membership) => ({
name: membership.name, name: membership.name,
@@ -92,7 +92,7 @@ const Page = () => {
onSuccess: () => { onSuccess: () => {
createNotification({ createNotification({
type: "success", type: "success",
text: "Identity privilege assumption has started" text: "Machine identity privilege assumption has started"
}); });
const url = `${getProjectHomePage(currentProject.type, currentProject.environments)}${isSubOrganization && isNonScopedIdentity ? `?subOrganization=${currentOrg.slug}` : ""}`; const url = `${getProjectHomePage(currentProject.type, currentProject.environments)}${isSubOrganization && isNonScopedIdentity ? `?subOrganization=${currentOrg.slug}` : ""}`;
window.location.assign( window.location.assign(
@@ -109,7 +109,7 @@ const Page = () => {
projectId projectId
}); });
createNotification({ createNotification({
text: "Successfully removed identity from project", text: "Successfully removed machine identity from project",
type: "success" type: "success"
}); });
handlePopUpClose("deleteIdentity"); handlePopUpClose("deleteIdentity");
@@ -149,12 +149,12 @@ const Page = () => {
className="mb-4 flex items-center gap-x-2 text-sm text-mineshaft-400" className="mb-4 flex items-center gap-x-2 text-sm text-mineshaft-400"
> >
<FontAwesomeIcon icon={faChevronLeft} /> <FontAwesomeIcon icon={faChevronLeft} />
Identities Machine Identities
</Link> </Link>
<PageHeader <PageHeader
scope={currentProject.type} scope={currentProject.type}
title={identityMembershipDetails?.identity?.name} title={identityMembershipDetails?.identity?.name}
description={`Identity ${isProjectIdentity ? "created" : "added"} on ${identityMembershipDetails?.createdAt && formatRelative(new Date(identityMembershipDetails?.createdAt || ""), new Date())}`} description={`Machine identity ${isProjectIdentity ? "created" : "added"} on ${identityMembershipDetails?.createdAt && formatRelative(new Date(identityMembershipDetails?.createdAt || ""), new Date())}`}
className={!isProjectIdentity ? "mb-4" : undefined} className={!isProjectIdentity ? "mb-4" : undefined}
> >
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
@@ -177,7 +177,7 @@ const Page = () => {
identityId: identityMembershipDetails?.identity.id identityId: identityMembershipDetails?.identity.id
})} })}
renderTooltip renderTooltip
allowedLabel="Assume privileges of the user" allowedLabel="Assume privileges of the machine identity"
passThrough={false} passThrough={false}
> >
{(isAllowed) => ( {(isAllowed) => (
@@ -209,7 +209,7 @@ const Page = () => {
isLoading={isDeletingIdentity} isLoading={isDeletingIdentity}
onClick={() => handlePopUpOpen("deleteIdentity")} onClick={() => handlePopUpOpen("deleteIdentity")}
> >
Remove Identity Remove Machine Identity
</Button> </Button>
)} )}
</ProjectPermissionCan> </ProjectPermissionCan>
@@ -219,7 +219,7 @@ const Page = () => {
{!isProjectIdentity && ( {!isProjectIdentity && (
<Alert hideTitle iconClassName="text-info" className="mb-4 border-info/50 bg-info/10"> <Alert hideTitle iconClassName="text-info" className="mb-4 border-info/50 bg-info/10">
<AlertDescription> <AlertDescription>
This identity is managed by your organization.{" "} This machine identity is managed by your organization.{" "}
<OrgPermissionCan <OrgPermissionCan
I={OrgPermissionIdentityActions.Read} I={OrgPermissionIdentityActions.Read}
an={OrgPermissionSubjects.Identity} an={OrgPermissionSubjects.Identity}
@@ -234,7 +234,7 @@ const Page = () => {
}} }}
> >
<span className="cursor-pointer text-info underline underline-offset-2"> <span className="cursor-pointer text-info underline underline-offset-2">
Click here to manage identity. Click here to manage machine identity.
</span> </span>
</Link> </Link>
) : null ) : null
@@ -286,15 +286,15 @@ const Page = () => {
<ConfirmActionModal <ConfirmActionModal
isOpen={popUp.assumePrivileges.isOpen} isOpen={popUp.assumePrivileges.isOpen}
confirmKey="assume" confirmKey="assume"
title="Do you want to assume privileges of this identity?" title="Do you want to assume privileges of this machine identity?"
subTitle="This will set your privileges to those of the identity for the next hour." subTitle="This will set your privileges to those of the machine identity for the next hour."
onChange={(isOpen) => handlePopUpToggle("assumePrivileges", isOpen)} onChange={(isOpen) => handlePopUpToggle("assumePrivileges", isOpen)}
onConfirmed={handleAssumePrivileges} onConfirmed={handleAssumePrivileges}
buttonText="Confirm" buttonText="Confirm"
/> />
</> </>
) : ( ) : (
<EmptyState title="Error: Unable to find the identity." className="py-12" /> <EmptyState title="Error: Unable to find the machine identity." className="py-12" />
)} )}
</div> </div>
); );
@@ -235,7 +235,10 @@ export const IdentityProjectAdditionalPrivilegeSection = ({ identityMembershipDe
</TBody> </TBody>
</Table> </Table>
{!isPending && !identityProjectPrivileges?.length && ( {!isPending && !identityProjectPrivileges?.length && (
<EmptyState title="This identity has no additional privileges" icon={faFolder} /> <EmptyState
title="This machine identity has no additional privileges"
icon={faFolder}
/>
)} )}
</TableContainer> </TableContainer>
</div> </div>
@@ -69,7 +69,7 @@ export const ProjectIdentityDetailsSection = ({ identity, isOrgIdentity, members
} catch { } catch {
createNotification({ createNotification({
type: "error", type: "error",
text: "Failed to delete project identity" text: "Failed to delete project machine identity"
}); });
} }
}; };
@@ -77,7 +77,7 @@ export const ProjectIdentityDetailsSection = ({ identity, isOrgIdentity, members
return ( return (
<div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4"> <div className="rounded-lg border border-mineshaft-600 bg-mineshaft-900 p-4">
<div className="flex items-center justify-between border-b border-mineshaft-400 pb-4"> <div className="flex items-center justify-between border-b border-mineshaft-400 pb-4">
<h3 className="text-lg font-medium text-mineshaft-100">Identity Details</h3> <h3 className="text-lg font-medium text-mineshaft-100">Details</h3>
<DropdownMenu> <DropdownMenu>
{!isOrgIdentity && ( {!isOrgIdentity && (
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
@@ -114,7 +114,7 @@ export const ProjectIdentityDetailsSection = ({ identity, isOrgIdentity, members
}} }}
disabled={!isAllowed} disabled={!isAllowed}
> >
Edit Identity Edit Machine Identity
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</ProjectPermissionCan> </ProjectPermissionCan>
@@ -137,7 +137,7 @@ export const ProjectIdentityDetailsSection = ({ identity, isOrgIdentity, members
icon={<FontAwesomeIcon icon={faTrash} />} icon={<FontAwesomeIcon icon={faTrash} />}
disabled={!isAllowed} disabled={!isAllowed}
> >
Delete Identity Delete Machine Identity
</DropdownMenuItem> </DropdownMenuItem>
)} )}
</ProjectPermissionCan> </ProjectPermissionCan>
@@ -146,7 +146,7 @@ export const ProjectIdentityDetailsSection = ({ identity, isOrgIdentity, members
</div> </div>
<div className="pt-4"> <div className="pt-4">
<div className="mb-4"> <div className="mb-4">
<p className="text-sm font-medium text-mineshaft-300">Identity ID</p> <p className="text-sm font-medium text-mineshaft-300">Machine Identity ID</p>
<div className="group flex align-top"> <div className="group flex align-top">
<p className="text-sm break-all text-mineshaft-300">{identity.id}</p> <p className="text-sm break-all text-mineshaft-300">{identity.id}</p>
<div className="opacity-0 transition-opacity duration-300 group-hover:opacity-100"> <div className="opacity-0 transition-opacity duration-300 group-hover:opacity-100">