Authorize user in Workspaces.get

This commit is contained in:
richard-dds 2018-08-21 10:36:22 -04:00
parent ee17ca6633
commit 7d165e45d3
3 changed files with 23 additions and 18 deletions

View File

@ -1,7 +1,7 @@
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
from atst.database import db from atst.database import db
from atst.domain.exceptions import NotFoundError from atst.domain.exceptions import NotFoundError, UnauthorizedError
from atst.models.workspace import Workspace from atst.models.workspace import Workspace
from atst.models.workspace_role import WorkspaceRole from atst.models.workspace_role import WorkspaceRole
from atst.domain.roles import Roles from atst.domain.roles import Roles
@ -27,12 +27,15 @@ class Workspaces(object):
return workspace return workspace
@classmethod @classmethod
def get(cls, workspace_id): def get(cls, user, workspace_id):
try: try:
workspace = db.session.query(Workspace).filter_by(id=workspace_id).one() workspace = db.session.query(Workspace).filter_by(id=workspace_id).one()
except NoResultFound: except NoResultFound:
raise NotFoundError("workspace") raise NotFoundError("workspace")
if user not in workspace.users:
raise UnauthorizedError(user, "get workspace")
return workspace return workspace
@classmethod @classmethod

View File

@ -19,3 +19,7 @@ class Workspace(Base, TimestampsMixin):
@property @property
def owner(self): def owner(self):
return self.request.creator return self.request.creator
@property
def users(self):
return set(role.user for role in self.roles)

View File

@ -1,9 +1,8 @@
import pytest import pytest
from uuid import uuid4 from uuid import uuid4
from atst.domain.exceptions import NotFoundError from atst.domain.exceptions import NotFoundError, UnauthorizedError
from atst.domain.workspaces import Workspaces from atst.domain.workspaces import Workspaces
from atst.domain.workspace_users import WorkspaceUsers
from tests.factories import WorkspaceFactory, RequestFactory, UserFactory from tests.factories import WorkspaceFactory, RequestFactory, UserFactory
@ -21,15 +20,9 @@ def test_default_workspace_name_is_request_id():
assert workspace.name == str(request.id) assert workspace.name == str(request.id)
def test_can_get_workspace(): def test_get_nonexistent_workspace_raises():
workspace = WorkspaceFactory.create()
found = Workspaces.get(workspace.id)
assert workspace == found
def test_nonexistent_workspace_raises():
with pytest.raises(NotFoundError): with pytest.raises(NotFoundError):
Workspaces.get(uuid4()) Workspaces.get(UserFactory.build(), uuid4())
def test_can_get_workspace_by_request(): def test_can_get_workspace_by_request():
@ -42,8 +35,7 @@ def test_creating_workspace_adds_owner():
user = UserFactory.create() user = UserFactory.create()
request = RequestFactory.create(creator=user) request = RequestFactory.create(creator=user)
workspace = Workspaces.create(request) workspace = Workspaces.create(request)
workspace_user = WorkspaceUsers.get(workspace.id, user.id) assert workspace.roles[0].user == user
assert workspace_user.workspace_role
def test_workspace_has_timestamps(): def test_workspace_has_timestamps():
@ -52,7 +44,13 @@ def test_workspace_has_timestamps():
assert workspace.time_created == workspace.time_updated assert workspace.time_created == workspace.time_updated
def test_workspace_has_roles(): def test_workspaces_get_ensures_user_is_in_workspace():
request = RequestFactory.create() owner = UserFactory.create()
workspace = Workspaces.create(request) outside_user = UserFactory.create()
assert workspace.roles[0].user == request.creator workspace = Workspaces.create(RequestFactory.create(creator=owner))
workspace_ = Workspaces.get(owner, workspace.id)
assert workspace_ == workspace
with pytest.raises(UnauthorizedError):
Workspaces.get(outside_user, workspace.id)