Skip to content

Commit 0cc1f3c

Browse files
authored
Bugfix on ACLs (#1242)
1 parent fae1430 commit 0cc1f3c

File tree

4 files changed

+23
-11
lines changed

4 files changed

+23
-11
lines changed

core/schemas/dfiq.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from core import database_arango
1515
from core.helpers import now
16-
from core.schemas import audit, indicator
16+
from core.schemas import audit, indicator, rbac
1717
from core.schemas.model import YetiAclModel, YetiModel
1818

1919
LATEST_SUPPORTED_DFIQ_VERSION = "1.1.0"
@@ -88,6 +88,7 @@ def read_from_data_directory(
8888
if not dfiq_object.uuid:
8989
dfiq_object.uuid = str(uuid.uuid4())
9090
dfiq_object = dfiq_object.save()
91+
rbac.set_acls(dfiq_object)
9192
dfiq_addition.dfiq.append(dfiq_object)
9293
audit.log_timeline(user, dfiq_object, old=db_dfiq)
9394
total_added += 1

core/schemas/model.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,19 @@ def __init__(self, **data):
9696
def acls(self):
9797
return self._acls
9898

99-
def get_acls(self) -> None:
99+
def get_acls(self, direct=False) -> None:
100100
"""Returns the permissions assigned to a user.
101101
Args:
102102
user: The user to check permissions for.
103103
"""
104104
vertices, paths, total = self.neighbors(
105-
graph="acls", direction="inbound", max_hops=2
105+
graph="acls", direction="inbound", max_hops=1 if direct else 2
106106
)
107107
for path in paths:
108+
source = path[-1].source # inbound, so source is last.
108109
for edge in path:
109110
if edge.target == self.extended_id:
110-
identity = vertices[edge.source]
111+
identity = vertices[source]
111112
if identity.root_type == "rbacgroup":
112113
self._acls[identity.name] = edge
113114
if identity.root_type == "user":

core/web/apiv2/rbac.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,8 @@ def get_acl_details(httpreq: Request, type: str, id: str):
6262
if not db_entity:
6363
raise HTTPException(status_code=404, detail=f"{type} {id} not found")
6464

65-
return db_entity.acl
65+
db_entity.get_acls(direct=True)
66+
return db_entity
6667

6768

6869
@router.post("/{type}/{id}/update-members")

tests/schemas/rbac.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ def setUp(self) -> None:
1111
database_arango.RBAC_ENABLED = True
1212

1313
self.yeti_user = user.User(username="yeti", admin=True).save()
14-
self.user1 = user.User(username="test1").save()
15-
self.user2 = user.User(username="test2").save()
16-
self.group1 = rbac.Group(name="test1").save()
17-
self.group2 = rbac.Group(name="test2").save()
18-
self.entity1 = entity.Malware(name="test1").save()
19-
self.entity2 = entity.Malware(name="test2").save()
14+
self.user1 = user.User(username="user1").save()
15+
self.user2 = user.User(username="user2").save()
16+
self.group1 = rbac.Group(name="group1").save()
17+
self.group2 = rbac.Group(name="group2").save()
18+
self.entity1 = entity.Malware(name="malware1").save()
19+
self.entity2 = entity.Malware(name="malware2").save()
2020
self.observable1 = observable.Hostname(value="test.com").save()
2121
self.observable1.link_to(self.entity1, "test", description="test")
2222

@@ -115,3 +115,12 @@ def test_neighbors_filter_when_passing_username(self):
115115
vertices, edges, total = self.observable1.neighbors(user=self.user1)
116116
self.assertEqual(total, 1)
117117
self.assertEqual(len(vertices), 1)
118+
119+
def test_get_acls(self):
120+
"""Test that get_acls() returns the correct ACLs"""
121+
self.user1.link_to_acl(self.group1, roles.Role.OWNER)
122+
self.group1.link_to_acl(self.entity1, roles.Role.OWNER)
123+
self.entity1.get_acls()
124+
self.assertEqual(len(self.entity1._acls), 2)
125+
self.assertIn(self.group1.name, self.entity1._acls)
126+
self.assertIn(self.user1.username, self.entity1._acls)

0 commit comments

Comments
 (0)