From 3f6b84de3b5d4e4e831f7207a12525b9226568e8 Mon Sep 17 00:00:00 2001 From: Remy Date: Thu, 20 Jun 2024 16:32:47 +0200 Subject: [PATCH 01/14] fix(helm-charts): add nodeSelector and tolerations --- helm-charts/secrets-operator/templates/deployment.yaml | 4 +++- helm-charts/secrets-operator/values.yaml | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/helm-charts/secrets-operator/templates/deployment.yaml b/helm-charts/secrets-operator/templates/deployment.yaml index 2d27b4b5a..ec02df12d 100644 --- a/helm-charts/secrets-operator/templates/deployment.yaml +++ b/helm-charts/secrets-operator/templates/deployment.yaml @@ -82,4 +82,6 @@ spec: securityContext: runAsNonRoot: true serviceAccountName: {{ include "secrets-operator.fullname" . }}-controller-manager - terminationGracePeriodSeconds: 10 \ No newline at end of file + terminationGracePeriodSeconds: 10 + nodeSelector: {{ toYaml .Values.controllerManager.nodeSelector | nindent 8 }} + tolerations: {{ toYaml .Values.controllerManager.tolerations | nindent 8 }} \ No newline at end of file diff --git a/helm-charts/secrets-operator/values.yaml b/helm-charts/secrets-operator/values.yaml index 001ef4b10..4b35577e7 100644 --- a/helm-charts/secrets-operator/values.yaml +++ b/helm-charts/secrets-operator/values.yaml @@ -43,6 +43,8 @@ controllerManager: replicas: 1 serviceAccount: annotations: {} + nodeSelector: {} + tolerations: [] kubernetesClusterDomain: cluster.local metricsService: ports: From f95092e083db0c891f338885600373299751b431 Mon Sep 17 00:00:00 2001 From: Alfonso Hernandez Date: Sat, 6 Jul 2024 13:42:38 +0200 Subject: [PATCH 02/14] doc: Update how-to-create-a-feature.mdx `npm generate:component` should be `npm run generate:component` --- .../contributing/platform/backend/how-to-create-a-feature.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/contributing/platform/backend/how-to-create-a-feature.mdx b/docs/contributing/platform/backend/how-to-create-a-feature.mdx index e77313dab..8449eb501 100644 --- a/docs/contributing/platform/backend/how-to-create-a-feature.mdx +++ b/docs/contributing/platform/backend/how-to-create-a-feature.mdx @@ -49,8 +49,8 @@ Server-related logic is handled in `/src/server`. To connect the service layer t ## Writing API Routes -1. To create a route component, run `npm generate:component`. +1. To create a route component, run `npm run generate:component`. 2. Select option 3, type the router name in dash-case, and provide the version number. This will generate a router file in `src/server/routes/v/` 1. Implement your logic to connect with the service layer as needed. 2. Import the router component in the version folder's index.ts. For instance, if it's in v1, import it in `v1/index.ts`. - 3. Finally, register it under the appropriate prefix for access. \ No newline at end of file + 3. Finally, register it under the appropriate prefix for access. From 4e724d15f6fa52c843fb2a11343bd6bcb9796911 Mon Sep 17 00:00:00 2001 From: Vlad Matsiiako <78047717+vmatsiiako@users.noreply.github.com> Date: Sun, 7 Jul 2024 21:41:15 -0700 Subject: [PATCH 03/14] Update secret-sharing.mdx --- docs/documentation/platform/secret-sharing.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/platform/secret-sharing.mdx b/docs/documentation/platform/secret-sharing.mdx index 680751820..9c0821508 100644 --- a/docs/documentation/platform/secret-sharing.mdx +++ b/docs/documentation/platform/secret-sharing.mdx @@ -5,7 +5,7 @@ description: "Learn how to share time & view-count bound secrets securely with a --- Developers frequently need to share secrets with team members, contractors, or other third parties, which can be risky due to potential leaks or misuse. -Infisical offers a secure solution for sharing secrets over the internet in a time and view count bound manner. +Infisical offers a secure solution for sharing secrets over the internet in a time and view count bound manner. It is possible to share secrets without signing up via [share.infisical.com](https://share.infisical.com) or via Infisical Dashboard (which has more advanced funcitonality). With its zero-knowledge architecture, secrets shared via Infisical remain unreadable even to Infisical itself. From 6e15979672732e950bd044a8db969241c607b152 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Mon, 8 Jul 2024 15:04:08 +0800 Subject: [PATCH 04/14] feat: allow admins to delete users --- backend/src/server/routes/v1/user-router.ts | 70 +++++++++ backend/src/server/routes/v2/user-router.ts | 2 +- backend/src/services/user/user-service.ts | 11 +- frontend/src/hooks/api/users/index.tsx | 3 +- frontend/src/hooks/api/users/mutation.tsx | 14 ++ frontend/src/hooks/api/users/queries.tsx | 9 ++ .../admin/DashboardPage/DashboardPage.tsx | 8 +- .../views/admin/DashboardPage/UserPanel.tsx | 136 ++++++++++++++++++ 8 files changed, 247 insertions(+), 6 deletions(-) create mode 100644 frontend/src/views/admin/DashboardPage/UserPanel.tsx diff --git a/backend/src/server/routes/v1/user-router.ts b/backend/src/server/routes/v1/user-router.ts index d3c0db242..3510179c9 100644 --- a/backend/src/server/routes/v1/user-router.ts +++ b/backend/src/server/routes/v1/user-router.ts @@ -4,6 +4,7 @@ import { UserEncryptionKeysSchema, UsersSchema } from "@app/db/schemas"; import { getConfig } from "@app/lib/config/env"; import { logger } from "@app/lib/logger"; import { authRateLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { verifySuperAdmin } from "@app/server/plugins/auth/superAdmin"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -91,6 +92,75 @@ export const registerUserRouter = async (server: FastifyZodProvider) => { } }); + server.route({ + method: "GET", + url: "/list", + config: { + rateLimit: readLimit + }, + schema: { + response: { + 200: z.object({ + users: UsersSchema.pick({ + username: true, + firstName: true, + lastName: true, + email: true, + id: true + }).array() + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async () => { + const users = await server.services.user.listUsers(); + + return { + users + }; + } + }); + + server.route({ + method: "DELETE", + url: "/:userId", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + userId: z.string() + }), + response: { + 200: z.object({ + users: UsersSchema.pick({ + username: true, + firstName: true, + lastName: true, + email: true, + id: true + }) + }) + } + }, + onRequest: (req, res, done) => { + verifyAuth([AuthMode.JWT])(req, res, () => { + verifySuperAdmin(req, res, done); + }); + }, + handler: async (req) => { + const users = await server.services.user.deleteUser(req.params.userId); + + return { + users + }; + } + }); + server.route({ method: "GET", url: "/me/project-favorites", diff --git a/backend/src/server/routes/v2/user-router.ts b/backend/src/server/routes/v2/user-router.ts index 21dd32021..01c7eda6d 100644 --- a/backend/src/server/routes/v2/user-router.ts +++ b/backend/src/server/routes/v2/user-router.ts @@ -297,7 +297,7 @@ export const registerUserRouter = async (server: FastifyZodProvider) => { }, onRequest: verifyAuth([AuthMode.JWT]), handler: async (req) => { - const user = await server.services.user.deleteMe(req.permission.id); + const user = await server.services.user.deleteUser(req.permission.id); return { user }; } }); diff --git a/backend/src/services/user/user-service.ts b/backend/src/services/user/user-service.ts index 5f0106604..de10baf8f 100644 --- a/backend/src/services/user/user-service.ts +++ b/backend/src/services/user/user-service.ts @@ -201,7 +201,7 @@ export const userServiceFactory = ({ return user; }; - const deleteMe = async (userId: string) => { + const deleteUser = async (userId: string) => { const user = await userDAL.deleteById(userId); return user; }; @@ -295,19 +295,24 @@ export const userServiceFactory = ({ return updatedOrgMembership.projectFavorites; }; + const listUsers = async () => { + return userDAL.find({}); + }; + return { sendEmailVerificationCode, verifyEmailVerificationCode, toggleUserMfa, updateUserName, updateAuthMethods, - deleteMe, + deleteUser, getMe, createUserAction, getUserAction, unlockUser, getUserPrivateKey, getUserProjectFavorites, - updateUserProjectFavorites + updateUserProjectFavorites, + listUsers }; }; diff --git a/frontend/src/hooks/api/users/index.tsx b/frontend/src/hooks/api/users/index.tsx index a8ad89f4c..87cf7c78f 100644 --- a/frontend/src/hooks/api/users/index.tsx +++ b/frontend/src/hooks/api/users/index.tsx @@ -1,6 +1,7 @@ export { useAddUserToWsE2EE, useAddUserToWsNonE2EE, + useDeleteUser, useSendEmailVerificationCode, useVerifyEmailVerificationCode } from "./mutation"; @@ -10,7 +11,6 @@ export { useCreateAPIKey, useDeleteAPIKey, useDeleteOrgMembership, - useDeleteUser, useGetMyAPIKeys, useGetMyAPIKeysV2, useGetMyIp, @@ -19,6 +19,7 @@ export { useGetOrgUsers, useGetUser, useGetUserAction, + useListUsers, useLogoutUser, useRegisterUserAction, useRevokeMySessions, diff --git a/frontend/src/hooks/api/users/mutation.tsx b/frontend/src/hooks/api/users/mutation.tsx index 26e932ac6..9aed160da 100644 --- a/frontend/src/hooks/api/users/mutation.tsx +++ b/frontend/src/hooks/api/users/mutation.tsx @@ -112,3 +112,17 @@ export const useUpdateUserProjectFavorites = () => { } }); }; + +export const useDeleteUser = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async (userId: string) => { + await apiRequest.delete(`/api/v1/user/${userId}`); + + return {}; + }, + onSuccess: () => { + queryClient.invalidateQueries(userKeys.listUsers); + } + }); +}; diff --git a/frontend/src/hooks/api/users/queries.tsx b/frontend/src/hooks/api/users/queries.tsx index 1a49e8d7c..962961bc2 100644 --- a/frontend/src/hooks/api/users/queries.tsx +++ b/frontend/src/hooks/api/users/queries.tsx @@ -28,6 +28,7 @@ export const userKeys = { myAPIKeys: ["api-keys"] as const, myAPIKeysV2: ["api-keys-v2"] as const, mySessions: ["sessions"] as const, + listUsers: ["user-list"] as const, myOrganizationProjects: (orgId: string) => [{ orgId }, "organization-projects"] as const }; @@ -40,6 +41,14 @@ export const fetchUserDetails = async () => { export const useGetUser = () => useQuery(userKeys.getUser, fetchUserDetails); +export const fetchUsersList = async () => { + const { data } = await apiRequest.get<{ users: User[] }>("/api/v1/user/list"); + + return data.users; +}; + +export const useListUsers = () => useQuery(userKeys.listUsers, fetchUsersList); + export const useDeleteUser = () => { const queryClient = useQueryClient(); diff --git a/frontend/src/views/admin/DashboardPage/DashboardPage.tsx b/frontend/src/views/admin/DashboardPage/DashboardPage.tsx index 42d3cdc1b..715bb2e47 100644 --- a/frontend/src/views/admin/DashboardPage/DashboardPage.tsx +++ b/frontend/src/views/admin/DashboardPage/DashboardPage.tsx @@ -26,11 +26,13 @@ import { useGetOrganizations, useUpdateServerConfig } from "@app/hooks/api"; import { AuthPanel } from "./AuthPanel"; import { RateLimitPanel } from "./RateLimitPanel"; +import { UserPanel } from "./UserPanel"; enum TabSections { Settings = "settings", Auth = "auth", - RateLimit = "rate-limit" + RateLimit = "rate-limit", + Users = "users" } enum SignUpModes { @@ -135,6 +137,7 @@ export const AdminDashboardPage = () => { General Authentication Rate Limit + Users @@ -320,6 +323,9 @@ export const AdminDashboardPage = () => { + + + )} diff --git a/frontend/src/views/admin/DashboardPage/UserPanel.tsx b/frontend/src/views/admin/DashboardPage/UserPanel.tsx new file mode 100644 index 000000000..b79eb4981 --- /dev/null +++ b/frontend/src/views/admin/DashboardPage/UserPanel.tsx @@ -0,0 +1,136 @@ +import { useMemo, useState } from "react"; +import { faMagnifyingGlass, faUsers, faXmark } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { createNotification } from "@app/components/notifications"; +import { + DeleteActionModal, + EmptyState, + IconButton, + Input, + Table, + TableContainer, + TableSkeleton, + TBody, + Td, + Th, + THead, + Tr +} from "@app/components/v2"; +import { useUser } from "@app/context"; +import { usePopUp } from "@app/hooks"; +import { useDeleteUser, useListUsers } from "@app/hooks/api"; + +export const UserPanel = () => { + const [searchMemberFilter, setSearchMemberFilter] = useState(""); + const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ + "removeUser" + ] as const); + + const { user } = useUser(); + const userId = user?.id || ""; + const { data: users, isLoading } = useListUsers(); + const { mutateAsync: deleteUser } = useDeleteUser(); + + const filterdUsers = useMemo( + () => + users?.filter( + ({ firstName, lastName, username, email }) => + firstName?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || + lastName?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || + username?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || + email?.toLowerCase().includes(searchMemberFilter.toLowerCase()) + ), + [users, searchMemberFilter] + ); + + const handleRemoveUser = async () => { + const { id } = popUp?.removeUser?.data as { id: string; username: string }; + + try { + await deleteUser(id); + createNotification({ + type: "success", + text: "Successfully deleted user" + }); + } catch (err) { + createNotification({ + type: "error", + text: "Error deleting user" + }); + } + + handlePopUpClose("removeUser"); + }; + + return ( +
+
+

Users

+
+ setSearchMemberFilter(e.target.value)} + leftIcon={} + placeholder="Search members..." + /> + +
+ + + + + + + + + + {isLoading && } + {!isLoading && + filterdUsers?.map(({ username, email, firstName, lastName, id }) => { + const name = firstName || lastName ? `${firstName} ${lastName}` : "-"; + + return ( + + + + + + ); + })} + +
NameUsername +
{name}{email} + {userId !== id && ( +
+ handlePopUpOpen("removeUser", { username, id })} + > + + +
+ )} +
+ {!isLoading && filterdUsers?.length === 0 && ( + + )} +
+
+ handlePopUpToggle("removeUser", isOpen)} + onDeleteApproved={handleRemoveUser} + /> +
+ ); +}; From ccf0c3cd35b22281dbedb26396f265c878f60182 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Mon, 8 Jul 2024 15:09:32 +0800 Subject: [PATCH 05/14] misc: modified member to user --- .../views/admin/DashboardPage/UserPanel.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/src/views/admin/DashboardPage/UserPanel.tsx b/frontend/src/views/admin/DashboardPage/UserPanel.tsx index b79eb4981..e8ab6dfb4 100644 --- a/frontend/src/views/admin/DashboardPage/UserPanel.tsx +++ b/frontend/src/views/admin/DashboardPage/UserPanel.tsx @@ -22,7 +22,7 @@ import { usePopUp } from "@app/hooks"; import { useDeleteUser, useListUsers } from "@app/hooks/api"; export const UserPanel = () => { - const [searchMemberFilter, setSearchMemberFilter] = useState(""); + const [searchUserFilter, setSearchUserFilter] = useState(""); const { handlePopUpToggle, popUp, handlePopUpOpen, handlePopUpClose } = usePopUp([ "removeUser" ] as const); @@ -36,12 +36,12 @@ export const UserPanel = () => { () => users?.filter( ({ firstName, lastName, username, email }) => - firstName?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || - lastName?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || - username?.toLowerCase().includes(searchMemberFilter.toLowerCase()) || - email?.toLowerCase().includes(searchMemberFilter.toLowerCase()) + firstName?.toLowerCase().includes(searchUserFilter.toLowerCase()) || + lastName?.toLowerCase().includes(searchUserFilter.toLowerCase()) || + username?.toLowerCase().includes(searchUserFilter.toLowerCase()) || + email?.toLowerCase().includes(searchUserFilter.toLowerCase()) ), - [users, searchMemberFilter] + [users, searchUserFilter] ); const handleRemoveUser = async () => { @@ -69,10 +69,10 @@ export const UserPanel = () => {

Users

setSearchMemberFilter(e.target.value)} + value={searchUserFilter} + onChange={(e) => setSearchUserFilter(e.target.value)} leftIcon={} - placeholder="Search members..." + placeholder="Search users..." />
From f3a8fda254221c24d95a44d22405f9429e85229c Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Mon, 8 Jul 2024 15:16:10 +0800 Subject: [PATCH 06/14] misc: resolved conflict with existing method --- frontend/src/hooks/api/users/index.tsx | 1 + frontend/src/hooks/api/users/queries.tsx | 2 +- .../DeleteAccountSection/DeleteAccountSection.tsx | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/frontend/src/hooks/api/users/index.tsx b/frontend/src/hooks/api/users/index.tsx index 87cf7c78f..b7e8d6be3 100644 --- a/frontend/src/hooks/api/users/index.tsx +++ b/frontend/src/hooks/api/users/index.tsx @@ -10,6 +10,7 @@ export { useAddUserToOrg, useCreateAPIKey, useDeleteAPIKey, + useDeleteMe, useDeleteOrgMembership, useGetMyAPIKeys, useGetMyAPIKeysV2, diff --git a/frontend/src/hooks/api/users/queries.tsx b/frontend/src/hooks/api/users/queries.tsx index 962961bc2..bee58027c 100644 --- a/frontend/src/hooks/api/users/queries.tsx +++ b/frontend/src/hooks/api/users/queries.tsx @@ -49,7 +49,7 @@ export const fetchUsersList = async () => { export const useListUsers = () => useQuery(userKeys.listUsers, fetchUsersList); -export const useDeleteUser = () => { +export const useDeleteMe = () => { const queryClient = useQueryClient(); return useMutation({ diff --git a/frontend/src/views/Settings/PersonalSettingsPage/DeleteAccountSection/DeleteAccountSection.tsx b/frontend/src/views/Settings/PersonalSettingsPage/DeleteAccountSection/DeleteAccountSection.tsx index 49908eabc..fab1057ba 100644 --- a/frontend/src/views/Settings/PersonalSettingsPage/DeleteAccountSection/DeleteAccountSection.tsx +++ b/frontend/src/views/Settings/PersonalSettingsPage/DeleteAccountSection/DeleteAccountSection.tsx @@ -2,17 +2,17 @@ import { useRouter } from "next/router"; import { createNotification } from "@app/components/notifications"; import { Button, DeleteActionModal } from "@app/components/v2"; -import { useDeleteUser } from "@app/hooks/api"; +import { useDeleteMe } from "@app/hooks/api"; import { usePopUp } from "@app/hooks/usePopUp"; export const DeleteAccountSection = () => { const router = useRouter(); - + const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ "deleteAccount" ] as const); - const { mutateAsync: deleteUserMutateAsync, isLoading } = useDeleteUser(); + const { mutateAsync: deleteUserMutateAsync, isLoading } = useDeleteMe(); const handleDeleteAccountSubmit = async () => { try { From eeb2e89d1acd5f92c1131daa66768f65bf932f57 Mon Sep 17 00:00:00 2001 From: = Date: Mon, 8 Jul 2024 13:04:30 +0530 Subject: [PATCH 07/14] feat: banner on warning secret deletion in fly.io integration --- frontend/src/components/v2/Alert/Alert.tsx | 2 +- frontend/src/pages/integrations/flyio/create.tsx | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/v2/Alert/Alert.tsx b/frontend/src/components/v2/Alert/Alert.tsx index c43857da1..3d2dd6393 100644 --- a/frontend/src/components/v2/Alert/Alert.tsx +++ b/frontend/src/components/v2/Alert/Alert.tsx @@ -81,7 +81,7 @@ const AlertDescription = forwardRef< HTMLParagraphElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -
+
)); AlertDescription.displayName = "AlertDescription"; diff --git a/frontend/src/pages/integrations/flyio/create.tsx b/frontend/src/pages/integrations/flyio/create.tsx index baa92524a..e9747bc1b 100644 --- a/frontend/src/pages/integrations/flyio/create.tsx +++ b/frontend/src/pages/integrations/flyio/create.tsx @@ -15,6 +15,8 @@ import queryString from "query-string"; import { useCreateIntegration } from "@app/hooks/api"; import { + Alert, + AlertDescription, Button, Card, CardTitle, @@ -40,7 +42,7 @@ export default function FlyioCreateIntegrationPage() { const { data: integrationAuth, isLoading: isIntegrationAuthLoading } = useGetIntegrationAuthById( (integrationAuthId as string) ?? "" ); - const { data: integrationAuthApps, isLoading: isIntegrationAuthAppsLoading } = + const { data: integrationAuthApps = [], isLoading: isIntegrationAuthAppsLoading } = useGetIntegrationAuthApps({ integrationAuthId: (integrationAuthId as string) ?? "" }); @@ -130,6 +132,14 @@ export default function FlyioCreateIntegrationPage() {
+
+ + + All existing secrets of your connected flyio project will be permanently removed upon + integration. + + +
setSearchUserFilter(e.target.value)} + leftIcon={} + placeholder="Search users..." + /> +
+ + + + + + + + + + {isLoading && } + {!isLoading && + data?.pages?.map((users) => + users.map(({ username, email, firstName, lastName, id }) => { + const name = firstName || lastName ? `${firstName} ${lastName}` : "-"; - return ( - - - - - - ); - }) - )} - -
NameUsername +
{name}{email} - {userId !== id && ( -
- handlePopUpOpen("removeUser", { username, id })} - > - - -
- )} -
- {!isLoading && isEmpty && } -
- {!isEmpty && ( - - )} -
+ return ( + + {name} + {email} + + {userId !== id && ( +
+ handlePopUpOpen("removeUser", { username, id })} + > + + +
+ )} + + + ); + }) + )} + + + {!isLoading && isEmpty && } + + {!isEmpty && ( + + )} +
+ ); }; @@ -113,8 +120,6 @@ export const UserPanel = () => { "removeUser" ] as const); - const [searchUserFilter, setSearchUserFilter] = useState(""); - const { mutateAsync: deleteUser } = useAdminDeleteUser(); const handleRemoveUser = async () => { @@ -141,13 +146,7 @@ export const UserPanel = () => {

Users

- setSearchUserFilter(e.target.value)} - leftIcon={} - placeholder="Search users..." - /> - + Date: Mon, 8 Jul 2024 21:22:46 -0400 Subject: [PATCH 13/14] add nodeSelector and tolerations to manager --- helm-charts/secrets-operator/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm-charts/secrets-operator/Chart.yaml b/helm-charts/secrets-operator/Chart.yaml index 88fd68827..57d07cf74 100644 --- a/helm-charts/secrets-operator/Chart.yaml +++ b/helm-charts/secrets-operator/Chart.yaml @@ -13,9 +13,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.6.1 +version: v0.6.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "v0.6.1" +appVersion: "v0.6.2" From f66ef8b0665fe2df3155a854deb2f894f9c01977 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Mon, 8 Jul 2024 21:39:16 -0400 Subject: [PATCH 14/14] Update Chart.yaml --- helm-charts/secrets-operator/Chart.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/helm-charts/secrets-operator/Chart.yaml b/helm-charts/secrets-operator/Chart.yaml index 57d07cf74..0dc6a4eae 100644 --- a/helm-charts/secrets-operator/Chart.yaml +++ b/helm-charts/secrets-operator/Chart.yaml @@ -13,9 +13,9 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: v0.6.2 +version: v0.6.3 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "v0.6.2" +appVersion: "v0.6.3"