Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions apps/api/plane/app/permissions/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,31 @@ def _wrapped_view(instance, request, *args, **kwargs):
).exists():
return view_func(instance, request, *args, **kwargs)
else:
if ProjectMember.objects.filter(
is_user_has_allowed_role = ProjectMember.objects.filter(
member=request.user,
workspace__slug=kwargs["slug"],
project_id=kwargs["project_id"],
role__in=allowed_role_values,
is_active=True,
).exists():
).exists()

is_user_part_of_project = ProjectMember.objects.filter(
member=request.user,
workspace__slug=kwargs["slug"],
project_id=kwargs["project_id"],
is_active=True,
).exists()

is_user_workspace_admin = WorkspaceMember.objects.filter(
member=request.user,
workspace__slug=kwargs["slug"],
role=ROLE.ADMIN.value,
is_active=True,
).exists()

if is_user_has_allowed_role:
return view_func(instance, request, *args, **kwargs)
elif is_user_part_of_project and is_user_workspace_admin:
return view_func(instance, request, *args, **kwargs)

# Return permission denied if no conditions are met
Expand Down
20 changes: 18 additions & 2 deletions apps/api/plane/app/permissions/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,31 @@ def has_permission(self, request, view):
is_active=True,
).exists()

## Only Project Admins can update project attributes
return ProjectMember.objects.filter(
is_project_admin = ProjectMember.objects.filter(
workspace__slug=view.workspace_slug,
member=request.user,
role=Admin,
project_id=view.project_id,
is_active=True,
).exists()

is_project_member = ProjectMember.objects.filter(
workspace__slug=view.workspace_slug,
member=request.user,
project_id=view.project_id,
is_active=True,
).exists()

is_user_workspace_admin = WorkspaceMember.objects.filter(
member=request.user,
workspace__slug=view.workspace_slug,
role=Admin,
is_active=True,
).exists()

## Only project admins or workspace admin who is part of the project can access
return is_project_admin or (is_project_member and is_user_workspace_admin)


class ProjectMemberPermission(BasePermission):
def has_permission(self, request, view):
Expand Down
14 changes: 10 additions & 4 deletions apps/api/plane/app/views/project/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
import json

# Django imports
from django.db import IntegrityError
from django.db.models import Exists, F, OuterRef, Prefetch, Q, Subquery
from django.core.serializers.json import DjangoJSONEncoder

# Third Party imports
from rest_framework.response import Response
from rest_framework import serializers, status
from rest_framework import status
from rest_framework.permissions import AllowAny

# Module imports
Expand Down Expand Up @@ -341,13 +340,20 @@ def create(self, request, slug):

def partial_update(self, request, slug, pk=None):
# try:
if not ProjectMember.objects.filter(
is_workspace_admin = WorkspaceMember.objects.filter(
member=request.user, workspace__slug=slug, is_active=True, role=20
).exists()

is_project_admin = ProjectMember.objects.filter(
member=request.user,
workspace__slug=slug,
project_id=pk,
role=20,
is_active=True,
).exists():
).exists()

# Return error for if the user is neither workspace admin nor project admin
if not is_project_admin and not is_workspace_admin:
return Response(
{"error": "You don't have the required permissions."},
status=status.HTTP_403_FORBIDDEN,
Expand Down
8 changes: 7 additions & 1 deletion apps/web/core/store/user/base-permissions.store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,13 @@ export abstract class BaseUserPermissionStore implements IBaseUserPermissionStor
*/
protected getProjectRole = computedFn((workspaceSlug: string, projectId: string): EUserPermissions | undefined => {
if (!workspaceSlug || !projectId) return undefined;
return this.workspaceProjectsPermissions?.[workspaceSlug]?.[projectId] || undefined;
const projectRole = this.workspaceProjectsPermissions?.[workspaceSlug]?.[projectId];
console.log("projectRole", projectRole);
if (!projectRole) return undefined;
const workspaceRole = this.workspaceUserInfo?.[workspaceSlug]?.role;
console.log("workspaceRole", workspaceRole);
if (workspaceRole === EUserWorkspaceRoles.ADMIN) return EUserPermissions.ADMIN;
else return projectRole;
});

/**
Expand Down
Loading