From 23f6f5dfd4e47243f824e8bb94b24c1e176234f4 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Mon, 10 Mar 2025 16:26:18 -0700 Subject: [PATCH 01/12] chore(nix): add support for flakes --- .envrc | 1 + flake.lock | 27 +++++++++++++++++++++++++++ flake.nix | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 .envrc create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/.envrc b/.envrc new file mode 100644 index 000000000..3550a30f2 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..3104f340d --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1741445498, + "narHash": "sha256-F5Em0iv/CxkN5mZ9hRn3vPknpoWdcdCyR0e4WklHwiE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "52e3095f6d812b91b22fb7ad0bfc1ab416453634", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..ffed5545c --- /dev/null +++ b/flake.nix @@ -0,0 +1,35 @@ +{ + description = "Flake for github:Infisical/infisical repository."; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11"; + }; + + outputs = { self, nixpkgs }: { + devShells.aarch64-darwin.default = let + pkgs = nixpkgs.legacyPackages.aarch64-darwin; + in + pkgs.mkShell { + packages = with pkgs; [ + git + lazygit + + nodejs_20 + ]; + + shellHook = '' + # Define a writable directory for global npm packages + export NPM_CONFIG_PREFIX="$HOME/.npm-global" + export PATH="$NPM_CONFIG_PREFIX/bin:$PATH" + + # Ensure the directory exists + mkdir -p "$NPM_CONFIG_PREFIX" + + # Install Infisical CLI only if it's not already installed + if ! command -v infisical &>/dev/null; then + npm install -g @infisical/cli + fi + ''; + }; + }; +} From 17cf602a65b3c21a5fa6f9e05a22a7ab6642364f Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Mon, 10 Mar 2025 16:26:39 -0700 Subject: [PATCH 02/12] style: remove blank line --- backend/src/server/routes/v1/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/server/routes/v1/index.ts b/backend/src/server/routes/v1/index.ts index 087bd9afd..50fd33840 100644 --- a/backend/src/server/routes/v1/index.ts +++ b/backend/src/server/routes/v1/index.ts @@ -91,7 +91,6 @@ export const registerV1Routes = async (server: FastifyZodProvider) => { await projectRouter.register(registerProjectMembershipRouter); await projectRouter.register(registerSecretTagRouter); }, - { prefix: "/workspace" } ); From 5e4b478b74631040cdbe682c35f08a2b6502cdfe Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 08:17:07 -0700 Subject: [PATCH 03/12] refactor(nix): replace shell hook with infisical dependency --- flake.nix | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/flake.nix b/flake.nix index ffed5545c..3fd21f871 100644 --- a/flake.nix +++ b/flake.nix @@ -15,21 +15,8 @@ lazygit nodejs_20 + infisical ]; - - shellHook = '' - # Define a writable directory for global npm packages - export NPM_CONFIG_PREFIX="$HOME/.npm-global" - export PATH="$NPM_CONFIG_PREFIX/bin:$PATH" - - # Ensure the directory exists - mkdir -p "$NPM_CONFIG_PREFIX" - - # Install Infisical CLI only if it's not already installed - if ! command -v infisical &>/dev/null; then - npm install -g @infisical/cli - fi - ''; }; }; } From c9da8477c867ab0dca101b687690e1cfa0d73e97 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 08:54:15 -0700 Subject: [PATCH 04/12] chore(nix): add prettier to list of dependencies --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 3fd21f871..9d995a551 100644 --- a/flake.nix +++ b/flake.nix @@ -15,6 +15,7 @@ lazygit nodejs_20 + nodePackages.prettier infisical ]; }; From e7c512999e8312b85bb65a08cd54819cff09b2a0 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 13:30:45 -0700 Subject: [PATCH 05/12] feat(admin): add ability to view machine identities --- backend/src/server/routes/index.ts | 1 + backend/src/server/routes/v1/admin-router.ts | 39 +++++++- backend/src/services/identity/identity-dal.ts | 38 +++++++- .../super-admin/super-admin-service.ts | 19 +++- .../services/super-admin/super-admin-types.ts | 6 ++ frontend/src/hooks/api/admin/queries.ts | 29 +++++- frontend/src/hooks/api/admin/types.ts | 5 + .../pages/admin/OverviewPage/OverviewPage.tsx | 6 ++ .../OverviewPage/components/IdentityPanel.tsx | 95 +++++++++++++++++++ .../OverviewPage/components/UserPanel.tsx | 4 +- 10 files changed, 232 insertions(+), 10 deletions(-) create mode 100644 frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index efc1cb865..b9f47cb7e 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -635,6 +635,7 @@ export const registerRoutes = async ( }); const superAdminService = superAdminServiceFactory({ userDAL, + identityDAL, userAliasDAL, authService: loginService, serverCfgDAL: superAdminDAL, diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index b63550d2c..a1c433650 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -1,7 +1,7 @@ import DOMPurify from "isomorphic-dompurify"; import { z } from "zod"; -import { OrganizationsSchema, SuperAdminSchema, UsersSchema } from "@app/db/schemas"; +import { IdentitiesSchema, OrganizationsSchema, SuperAdminSchema, UsersSchema } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; import { BadRequestError } from "@app/lib/errors"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; @@ -154,6 +154,43 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { } }); + server.route({ + method: "GET", + url: "/identity-management/identities", + config: { + rateLimit: readLimit + }, + schema: { + querystring: z.object({ + searchTerm: z.string().default(""), + offset: z.coerce.number().default(0), + limit: z.coerce.number().max(100).default(20) + }), + response: { + 200: z.object({ + identities: IdentitiesSchema.pick({ + name: true, + id: true + }).array() + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async (req) => { + const identities = await server.services.superAdmin.getIdentities({ + ...req.query + }); + + return { + identities + }; + } + }); + server.route({ method: "GET", url: "/integrations/slack/config", diff --git a/backend/src/services/identity/identity-dal.ts b/backend/src/services/identity/identity-dal.ts index a74a84ce3..8b7fccab3 100644 --- a/backend/src/services/identity/identity-dal.ts +++ b/backend/src/services/identity/identity-dal.ts @@ -1,10 +1,42 @@ import { TDbClient } from "@app/db"; -import { TableName } from "@app/db/schemas"; -import { ormify } from "@app/lib/knex"; +import { TableName, TIdentities } from "@app/db/schemas"; +import { ormify, selectAllTableCols } from "@app/lib/knex"; +import { DatabaseError } from "@app/lib/errors"; export type TIdentityDALFactory = ReturnType; export const identityDALFactory = (db: TDbClient) => { const identityOrm = ormify(db, TableName.Identity); - return identityOrm; + + const getIdentitiesByFilter = async ({ + limit, + offset, + searchTerm, + sortBy + }: { + limit: number; + offset: number; + searchTerm: string; + sortBy?: keyof TIdentities; + }) => { + try { + let query = db.replicaNode()(TableName.Identity); + + if (searchTerm) { + query = query.where((qb) => { + void qb.whereILike("name", `%${searchTerm}%`); + }); + } + + if (sortBy) { + query = query.orderBy(sortBy); + } + + return await query.limit(limit).offset(offset).select(selectAllTableCols(TableName.Identity)); + } catch (error) { + throw new DatabaseError({ error, name: "Get identities by filter" }); + } + }; + + return { ...identityOrm, getIdentitiesByFilter }; }; diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index 8efdfd7f9..e8e01a44f 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -19,9 +19,11 @@ import { TUserDALFactory } from "../user/user-dal"; import { TUserAliasDALFactory } from "../user-alias/user-alias-dal"; import { UserAliasType } from "../user-alias/user-alias-types"; import { TSuperAdminDALFactory } from "./super-admin-dal"; -import { LoginMethod, TAdminGetUsersDTO, TAdminSignUpDTO } from "./super-admin-types"; +import { LoginMethod, TAdminGetIdentitiesDTO, TAdminGetUsersDTO, TAdminSignUpDTO } from "./super-admin-types"; +import { TIdentityDALFactory } from "@app/services/identity/identity-dal"; type TSuperAdminServiceFactoryDep = { + identityDAL: Pick; serverCfgDAL: TSuperAdminDALFactory; userDAL: TUserDALFactory; userAliasDAL: Pick; @@ -51,6 +53,7 @@ const ADMIN_CONFIG_DB_UUID = "00000000-0000-0000-0000-000000000000"; export const superAdminServiceFactory = ({ serverCfgDAL, userDAL, + identityDAL, userAliasDAL, authService, orgService, @@ -143,8 +146,8 @@ export const superAdminServiceFactory = ({ const canServerAdminAccessAfterApply = data.enabledLoginMethods.some((loginMethod) => - loginMethodToAuthMethod[loginMethod as LoginMethod].some( - (authMethod) => superAdminUser.authMethods?.includes(authMethod) + loginMethodToAuthMethod[loginMethod as LoginMethod].some((authMethod) => + superAdminUser.authMethods?.includes(authMethod) ) ) || isUserSamlAccessEnabled || @@ -292,6 +295,15 @@ export const superAdminServiceFactory = ({ return user; }; + const getIdentities = ({ offset, limit, searchTerm }: TAdminGetIdentitiesDTO) => { + return identityDAL.getIdentitiesByFilter({ + limit, + offset, + searchTerm, + sortBy: "name" + }); + }; + const grantServerAdminAccessToUser = async (userId: string) => { if (!licenseService.onPremFeatures?.instanceUserManagement) { throw new BadRequestError({ @@ -389,6 +401,7 @@ export const superAdminServiceFactory = ({ adminSignUp, getUsers, deleteUser, + getIdentities, getAdminSlackConfig, updateRootEncryptionStrategy, getConfiguredEncryptionStrategies, diff --git a/backend/src/services/super-admin/super-admin-types.ts b/backend/src/services/super-admin/super-admin-types.ts index d6de67e59..54a42c2ca 100644 --- a/backend/src/services/super-admin/super-admin-types.ts +++ b/backend/src/services/super-admin/super-admin-types.ts @@ -23,6 +23,12 @@ export type TAdminGetUsersDTO = { adminsOnly: boolean; }; +export type TAdminGetIdentitiesDTO = { + offset: number; + limit: number; + searchTerm: string; +}; + export enum LoginMethod { EMAIL = "email", GOOGLE = "google", diff --git a/frontend/src/hooks/api/admin/queries.ts b/frontend/src/hooks/api/admin/queries.ts index 12ae1cf64..7e2d60831 100644 --- a/frontend/src/hooks/api/admin/queries.ts +++ b/frontend/src/hooks/api/admin/queries.ts @@ -4,19 +4,24 @@ import { apiRequest } from "@app/config/request"; import { User } from "../types"; import { + AdminGetIdentitiesFilters, AdminGetUsersFilters, AdminSlackConfig, TGetServerRootKmsEncryptionDetails, TServerConfig } from "./types"; +import { Identity } from "@app/hooks/api/identities/types.ts"; export const adminStandaloneKeys = { - getUsers: "get-users" + getUsers: "get-users", + getIdentities: "get-identities" }; export const adminQueryKeys = { serverConfig: () => ["server-config"] as const, getUsers: (filters: AdminGetUsersFilters) => [adminStandaloneKeys.getUsers, { filters }] as const, + getIdentities: (filters: AdminGetIdentitiesFilters) => + [adminStandaloneKeys.getIdentities, { filters }] as const, getAdminSlackConfig: () => ["admin-slack-config"] as const, getServerEncryptionStrategies: () => ["server-encryption-strategies"] as const }; @@ -68,6 +73,28 @@ export const useAdminGetUsers = (filters: AdminGetUsersFilters) => { }); }; +export const useAdminGetIdentities = (filters: AdminGetIdentitiesFilters) => { + return useInfiniteQuery({ + initialPageParam: 0, + queryKey: adminQueryKeys.getIdentities(filters), + queryFn: async ({ pageParam }) => { + const { data } = await apiRequest.get<{ identities: Identity[] }>( + "/api/v1/admin/identity-management/identities", + { + params: { + ...filters, + offset: pageParam + } + } + ); + + return data.identities; + }, + getNextPageParam: (lastPage, pages) => + lastPage.length !== 0 ? pages.length * filters.limit : undefined + }); +}; + export const useGetAdminSlackConfig = () => { return useQuery({ queryKey: adminQueryKeys.getAdminSlackConfig(), diff --git a/frontend/src/hooks/api/admin/types.ts b/frontend/src/hooks/api/admin/types.ts index 80e3edc92..11f2cf44f 100644 --- a/frontend/src/hooks/api/admin/types.ts +++ b/frontend/src/hooks/api/admin/types.ts @@ -53,6 +53,11 @@ export type AdminGetUsersFilters = { adminsOnly: boolean; }; +export type AdminGetIdentitiesFilters = { + limit: number; + searchTerm: string; +}; + export type AdminSlackConfig = { clientId: string; clientSecret: string; diff --git a/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx b/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx index ad07b71ce..f48665653 100644 --- a/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx +++ b/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx @@ -34,6 +34,7 @@ import { EncryptionPanel } from "./components/EncryptionPanel"; import { IntegrationPanel } from "./components/IntegrationPanel"; import { RateLimitPanel } from "./components/RateLimitPanel"; import { UserPanel } from "./components/UserPanel"; +import { IdentityPanel } from "@app/pages/admin/OverviewPage/components/IdentityPanel.tsx"; enum TabSections { Settings = "settings", @@ -42,6 +43,7 @@ enum TabSections { RateLimit = "rate-limit", Integrations = "integrations", Users = "users", + Identities = "identities", Kmip = "kmip" } @@ -164,6 +166,7 @@ export const OverviewPage = () => { Rate Limit Integrations Users + Identities @@ -409,6 +412,9 @@ export const OverviewPage = () => { + + + )} diff --git a/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx new file mode 100644 index 000000000..4851db656 --- /dev/null +++ b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx @@ -0,0 +1,95 @@ +import { useState } from "react"; +import { faMagnifyingGlass, faServer } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { + Button, + EmptyState, + Input, + Table, + TableContainer, + TableSkeleton, + TBody, + Td, + Th, + THead, + Tr +} from "@app/components/v2"; +import { useDebounce } from "@app/hooks"; +import { useAdminGetIdentities } from "@app/hooks/api/admin/queries.ts"; + +const IdentityPanelTable = () => { + const [searchIdentityFilter, setSearchIdentityFilter] = useState(""); + const [debouncedSearchTerm] = useDebounce(searchIdentityFilter, 500); + + const { data, isPending, isFetchingNextPage, hasNextPage, fetchNextPage } = useAdminGetIdentities( + { + limit: 20, + searchTerm: debouncedSearchTerm + } + ); + + const isEmpty = !isPending && !data?.pages?.[0].length; + + return ( + <> +
+ setSearchIdentityFilter(e.target.value)} + leftIcon={} + placeholder="Search identities by name..." + className="flex-1" + /> +
+
+ + + + + + + + + + {isPending && } + {!isPending && + data?.pages?.map((identities) => + identities.map(({ name, authMethod, id }) => ( + + + + + )) + )} + +
NameAuth Method
{name} + {authMethod || None} +
+ {!isPending && isEmpty && } +
+ {!isEmpty && ( + + )} +
+ + ); +}; + +export const IdentityPanel = () => ( +
+
+

Identities

+
+ +
+); diff --git a/frontend/src/pages/admin/OverviewPage/components/UserPanel.tsx b/frontend/src/pages/admin/OverviewPage/components/UserPanel.tsx index 6654439de..0e5173188 100644 --- a/frontend/src/pages/admin/OverviewPage/components/UserPanel.tsx +++ b/frontend/src/pages/admin/OverviewPage/components/UserPanel.tsx @@ -61,12 +61,12 @@ const UserPanelTable = ({ const [adminsOnly, setAdminsOnly] = useState(false); const { user } = useUser(); const userId = user?.id || ""; - const [debounedSearchTerm] = useDebounce(searchUserFilter, 500); + const [debouncedSearchTerm] = useDebounce(searchUserFilter, 500); const { subscription } = useSubscription(); const { data, isPending, isFetchingNextPage, hasNextPage, fetchNextPage } = useAdminGetUsers({ limit: 20, - searchTerm: debounedSearchTerm, + searchTerm: debouncedSearchTerm, adminsOnly }); From 39b7a4a11117a98467df9750d85e7467ef112e92 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 13:31:23 -0700 Subject: [PATCH 06/12] chore(nix): add python312 to list of dependencies --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 9d995a551..094cfedc6 100644 --- a/flake.nix +++ b/flake.nix @@ -14,6 +14,7 @@ git lazygit + python312Full nodejs_20 nodePackages.prettier infisical From 627e17b3aee4a632881906282134deab639f7c8a Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 14:10:08 -0700 Subject: [PATCH 07/12] fix(admin): return back auth method from schema too --- backend/src/server/routes/v1/admin-router.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index a1c433650..bb62f2e1b 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -170,6 +170,7 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { 200: z.object({ identities: IdentitiesSchema.pick({ name: true, + authMethod: true, id: true }).array() }) From 1a06b3e1f59b63c5c9161a70f6fdf84408d9eee3 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 14:30:04 -0700 Subject: [PATCH 08/12] fix(admin): stop returning auth method on table --- backend/src/server/routes/v1/admin-router.ts | 1 - .../admin/OverviewPage/components/IdentityPanel.tsx | 10 +++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/backend/src/server/routes/v1/admin-router.ts b/backend/src/server/routes/v1/admin-router.ts index bb62f2e1b..a1c433650 100644 --- a/backend/src/server/routes/v1/admin-router.ts +++ b/backend/src/server/routes/v1/admin-router.ts @@ -170,7 +170,6 @@ export const registerAdminRouter = async (server: FastifyZodProvider) => { 200: z.object({ identities: IdentitiesSchema.pick({ name: true, - authMethod: true, id: true }).array() }) diff --git a/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx index 4851db656..3b89a011d 100644 --- a/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx +++ b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx @@ -47,20 +47,16 @@ const IdentityPanelTable = () => { - - + {isPending && } {!isPending && data?.pages?.map((identities) => - identities.map(({ name, authMethod, id }) => ( + identities.map(({ name, id }) => ( - - + )) )} From 3887ce800bb45ce71e1271e3bcfe1974b43a236d Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 14:34:14 -0700 Subject: [PATCH 09/12] refactor(admin): fix spelling for variable --- .../components/ServerAdminsPanel/ServerAdminsPanel.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/src/layouts/OrganizationLayout/components/ServerAdminsPanel/ServerAdminsPanel.tsx b/frontend/src/layouts/OrganizationLayout/components/ServerAdminsPanel/ServerAdminsPanel.tsx index c834daad8..82231c0e4 100644 --- a/frontend/src/layouts/OrganizationLayout/components/ServerAdminsPanel/ServerAdminsPanel.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/ServerAdminsPanel/ServerAdminsPanel.tsx @@ -19,17 +19,17 @@ import { useGetOrgUsers } from "@app/hooks/api"; export const ServerAdminsPanel = () => { const [searchUserFilter, setSearchUserFilter] = useState(""); - const [debounedSearchTerm] = useDebounce(searchUserFilter, 500); + const [debouncedSearchTerm] = useDebounce(searchUserFilter, 500); const { currentOrg } = useOrganization(); const { data: orgUsers, isPending } = useGetOrgUsers(currentOrg?.id || ""); const adminUsers = orgUsers?.filter((orgUser) => { const isSuperAdmin = orgUser.user.superAdmin; - const matchesSearch = debounedSearchTerm - ? orgUser.user.email?.toLowerCase().includes(debounedSearchTerm.toLowerCase()) || - orgUser.user.firstName?.toLowerCase().includes(debounedSearchTerm.toLowerCase()) || - orgUser.user.lastName?.toLowerCase().includes(debounedSearchTerm.toLowerCase()) + const matchesSearch = debouncedSearchTerm + ? orgUser.user.email?.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) || + orgUser.user.firstName?.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) || + orgUser.user.lastName?.toLowerCase().includes(debouncedSearchTerm.toLowerCase()) : true; return isSuperAdmin && matchesSearch; }); From 387780aa942a00c8ddebef431458f27eab6dc501 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 14:44:22 -0700 Subject: [PATCH 10/12] fix(lint): remove file extension from imports JetBrains accidentally added these when I ran the auto-complete. Weird. --- frontend/src/hooks/api/admin/queries.ts | 2 +- frontend/src/pages/admin/OverviewPage/OverviewPage.tsx | 2 +- .../src/pages/admin/OverviewPage/components/IdentityPanel.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/hooks/api/admin/queries.ts b/frontend/src/hooks/api/admin/queries.ts index 7e2d60831..496990abe 100644 --- a/frontend/src/hooks/api/admin/queries.ts +++ b/frontend/src/hooks/api/admin/queries.ts @@ -10,7 +10,7 @@ import { TGetServerRootKmsEncryptionDetails, TServerConfig } from "./types"; -import { Identity } from "@app/hooks/api/identities/types.ts"; +import { Identity } from "@app/hooks/api/identities/types"; export const adminStandaloneKeys = { getUsers: "get-users", diff --git a/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx b/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx index f48665653..776c5e20f 100644 --- a/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx +++ b/frontend/src/pages/admin/OverviewPage/OverviewPage.tsx @@ -34,7 +34,7 @@ import { EncryptionPanel } from "./components/EncryptionPanel"; import { IntegrationPanel } from "./components/IntegrationPanel"; import { RateLimitPanel } from "./components/RateLimitPanel"; import { UserPanel } from "./components/UserPanel"; -import { IdentityPanel } from "@app/pages/admin/OverviewPage/components/IdentityPanel.tsx"; +import { IdentityPanel } from "@app/pages/admin/OverviewPage/components/IdentityPanel"; enum TabSections { Settings = "settings", diff --git a/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx index 3b89a011d..ee2166a4e 100644 --- a/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx +++ b/frontend/src/pages/admin/OverviewPage/components/IdentityPanel.tsx @@ -16,7 +16,7 @@ import { Tr } from "@app/components/v2"; import { useDebounce } from "@app/hooks"; -import { useAdminGetIdentities } from "@app/hooks/api/admin/queries.ts"; +import { useAdminGetIdentities } from "@app/hooks/api/admin/queries"; const IdentityPanelTable = () => { const [searchIdentityFilter, setSearchIdentityFilter] = useState(""); From de5a4327457150638e84ed201a94b33cb5e1a8dd Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Tue, 11 Mar 2025 14:54:03 -0700 Subject: [PATCH 11/12] fix(lint): appease the linter There is a conflict between this and our Prettier configuration. --- backend/src/services/super-admin/super-admin-service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/services/super-admin/super-admin-service.ts b/backend/src/services/super-admin/super-admin-service.ts index e8e01a44f..ee3247632 100644 --- a/backend/src/services/super-admin/super-admin-service.ts +++ b/backend/src/services/super-admin/super-admin-service.ts @@ -146,8 +146,8 @@ export const superAdminServiceFactory = ({ const canServerAdminAccessAfterApply = data.enabledLoginMethods.some((loginMethod) => - loginMethodToAuthMethod[loginMethod as LoginMethod].some((authMethod) => - superAdminUser.authMethods?.includes(authMethod) + loginMethodToAuthMethod[loginMethod as LoginMethod].some( + (authMethod) => superAdminUser.authMethods?.includes(authMethod) ) ) || isUserSamlAccessEnabled || From 08bac83bcc75ae7b3d9758bddc0456e780e22d86 Mon Sep 17 00:00:00 2001 From: Mahyar Mirrashed Date: Wed, 12 Mar 2025 12:23:12 -0700 Subject: [PATCH 12/12] chore(nix): add comments linking to documentation --- .envrc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.envrc b/.envrc index 3550a30f2..ae4b4fb80 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,3 @@ +# Learn more at https://direnv.net +# We instruct direnv to use our Nix flake for a consistent development environment. use flake
NameAuth MethodName
{name} - {authMethod || None} - {name}