From f155a13929991453052ebd9e1b9b79424ffb74db Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 13 Sep 2024 16:59:47 +0530 Subject: [PATCH 1/3] fix: adding new session cookie name --- apiserver/plane/settings/common.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index 0ce0a6dcb4..007d8cecff 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -265,7 +265,7 @@ if AMQP_URL: CELERY_BROKER_URL = AMQP_URL else: CELERY_BROKER_URL = f"amqp://{RABBITMQ_USER}:{RABBITMQ_PASSWORD}@{RABBITMQ_HOST}:{RABBITMQ_PORT}/{RABBITMQ_VHOST}" - + CELERY_TIMEZONE = TIME_ZONE CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" @@ -336,14 +336,14 @@ SESSION_COOKIE_SECURE = secure_origins SESSION_COOKIE_HTTPONLY = True SESSION_ENGINE = "plane.db.models.session" SESSION_COOKIE_AGE = os.environ.get("SESSION_COOKIE_AGE", 604800) -SESSION_COOKIE_NAME = "plane-session-id" +SESSION_COOKIE_NAME = os.environ.get("SESSION_COOKIE_NAME", "session-id") SESSION_COOKIE_DOMAIN = os.environ.get("COOKIE_DOMAIN", None) SESSION_SAVE_EVERY_REQUEST = ( os.environ.get("SESSION_SAVE_EVERY_REQUEST", "0") == "1" ) # Admin Cookie -ADMIN_SESSION_COOKIE_NAME = "plane-admin-session-id" +ADMIN_SESSION_COOKIE_NAME = "admin-session-id" ADMIN_SESSION_COOKIE_AGE = os.environ.get("ADMIN_SESSION_COOKIE_AGE", 3600) # CSRF cookies From c14d20c2e05df5a90d5b047c5f616c4faae4447f Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:03:06 +0530 Subject: [PATCH 2/3] fix: workspace settings access validation updated (#5606) --- .../(projects)/settings/layout.tsx | 39 ++++++++++----- web/ce/constants/workspace.ts | 4 +- .../components/workspace/sidebar/dropdown.tsx | 47 +++++++++++-------- 3 files changed, 57 insertions(+), 33 deletions(-) diff --git a/web/app/[workspaceSlug]/(projects)/settings/layout.tsx b/web/app/[workspaceSlug]/(projects)/settings/layout.tsx index 79acb3ef9b..6e947c4877 100644 --- a/web/app/[workspaceSlug]/(projects)/settings/layout.tsx +++ b/web/app/[workspaceSlug]/(projects)/settings/layout.tsx @@ -1,34 +1,51 @@ "use client"; -import { ReactNode } from "react"; +import { FC, ReactNode } from "react"; +import { observer } from "mobx-react"; // components import { AppHeader } from "@/components/core"; // local components import { WorkspaceSettingHeader } from "./header"; import { MobileWorkspaceSettingsTabs } from "./mobile-header-tabs"; import { WorkspaceSettingsSidebar } from "./sidebar"; +import { NotAuthorizedView } from "@/components/auth-screens"; +import { useUserPermissions } from "@/hooks/store"; +import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions"; export interface IWorkspaceSettingLayout { children: ReactNode; } -export default function WorkspaceSettingLayout(props: IWorkspaceSettingLayout) { +const WorkspaceSettingLayout: FC = observer((props) => { const { children } = props; + const { workspaceUserInfo, allowPermissions } = useUserPermissions(); + + // derived values + const isWorkspaceAdmin = allowPermissions([EUserPermissions.ADMIN], EUserPermissionsLevel.WORKSPACE); + return ( <> } />
-
- -
-
-
- {children} -
-
+ {workspaceUserInfo && !isWorkspaceAdmin ? ( + + ) : ( + <> +
+ +
+
+
+ {children} +
+
+ + )}
); -} +}); + +export default WorkspaceSettingLayout; diff --git a/web/ce/constants/workspace.ts b/web/ce/constants/workspace.ts index 51b876cfe2..b976111b55 100644 --- a/web/ce/constants/workspace.ts +++ b/web/ce/constants/workspace.ts @@ -9,7 +9,7 @@ export const WORKSPACE_SETTINGS = { key: "general", label: "General", href: `/settings`, - access: [EUserPermissions.ADMIN, EUserPermissions.MEMBER, EUserPermissions.GUEST], + access: [EUserPermissions.ADMIN], highlight: (pathname: string, baseUrl: string) => pathname === `${baseUrl}/settings/`, Icon: SettingIcon, }, @@ -17,7 +17,7 @@ export const WORKSPACE_SETTINGS = { key: "members", label: "Members", href: `/settings/members`, - access: [EUserPermissions.ADMIN, EUserPermissions.MEMBER], + access: [EUserPermissions.ADMIN], highlight: (pathname: string, baseUrl: string) => pathname === `${baseUrl}/settings/members/`, Icon: SettingIcon, }, diff --git a/web/core/components/workspace/sidebar/dropdown.tsx b/web/core/components/workspace/sidebar/dropdown.tsx index a4d8f572bf..60d2bf7525 100644 --- a/web/core/components/workspace/sidebar/dropdown.tsx +++ b/web/core/components/workspace/sidebar/dropdown.tsx @@ -15,7 +15,8 @@ import { IWorkspace } from "@plane/types"; import { Avatar, Loader, TOAST_TYPE, setToast } from "@plane/ui"; import { GOD_MODE_URL, cn } from "@/helpers/common.helper"; // hooks -import { useAppTheme, useUser, useUserProfile, useWorkspace } from "@/hooks/store"; +import { useAppTheme, useUser, useUserPermissions, useUserProfile, useWorkspace } from "@/hooks/store"; +import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions"; import { WorkspaceLogo } from "../logo"; // Static Data @@ -25,12 +26,14 @@ const userLinks = (workspaceSlug: string) => [ name: "Workspace invites", href: "/invitations", icon: Mails, + access: [EUserPermissions.ADMIN, EUserPermissions.MEMBER, EUserPermissions.GUEST], }, { key: "settings", name: "Workspace settings", href: `/${workspaceSlug}/settings`, icon: Settings, + access: [EUserPermissions.ADMIN], }, ]; @@ -46,6 +49,7 @@ export const SidebarDropdown = observer(() => { signOut, } = useUser(); const { updateUserProfile } = useUserProfile(); + const { allowPermissions } = useUserPermissions(); const isUserInstanceAdmin = false; const { currentWorkspace: activeWorkspace, workspaces } = useWorkspace(); @@ -168,7 +172,7 @@ export const SidebarDropdown = observer(() => { alt="Workspace Logo" /> ) : ( - workspace?.name?.charAt(0) ?? "..." + (workspace?.name?.charAt(0) ?? "...") )}
{ Create workspace - {userLinks(workspaceSlug?.toString() ?? "").map((link, index) => ( - { - if (index > 0) handleItemClick(); - }} - > - - - {link.name} - - - ))} + {userLinks(workspaceSlug?.toString() ?? "").map( + (link, index) => + allowPermissions(link.access, EUserPermissionsLevel.WORKSPACE) && ( + { + if (index > 0) handleItemClick(); + }} + > + + + {link.name} + + + ) + )}
Date: Mon, 16 Sep 2024 14:14:52 +0530 Subject: [PATCH 3/3] fix: build error --- web/app/[workspaceSlug]/(projects)/settings/layout.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/web/app/[workspaceSlug]/(projects)/settings/layout.tsx b/web/app/[workspaceSlug]/(projects)/settings/layout.tsx index 0367b39a5d..d0763358f3 100644 --- a/web/app/[workspaceSlug]/(projects)/settings/layout.tsx +++ b/web/app/[workspaceSlug]/(projects)/settings/layout.tsx @@ -3,16 +3,16 @@ import { FC, ReactNode } from "react"; import { observer } from "mobx-react"; // components -import { AppHeader } from "@/components/core"; // plane web components // import { LicenseSeatsBanner } from "@/plane-web/components/license"; // local components +import { NotAuthorizedView } from "@/components/auth-screens"; +import { AppHeader } from "@/components/core"; +import { useUserPermissions } from "@/hooks/store"; +import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions"; import { WorkspaceSettingHeader } from "./header"; import { MobileWorkspaceSettingsTabs } from "./mobile-header-tabs"; import { WorkspaceSettingsSidebar } from "./sidebar"; -import { NotAuthorizedView } from "@/components/auth-screens"; -import { useUserPermissions } from "@/hooks/store"; -import { EUserPermissions, EUserPermissionsLevel } from "@/plane-web/constants/user-permissions"; export interface IWorkspaceSettingLayout { children: ReactNode;