Skip to content

Commit c0acddc

Browse files
authored
Merge pull request #5786 from opsmill/pog-stable-to-develop-20250219
Merge stable into develop with resolved conflicts and updated tests.
2 parents cacbea1 + 6375f2e commit c0acddc

28 files changed

+458
-38
lines changed

CHANGELOG.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,28 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang
1111

1212
<!-- towncrier release notes start -->
1313

14+
## [Infrahub - v1.1.7](https://github.com/opsmill/infrahub/tree/infrahub-v1.1.7) - 2025-02-18
15+
16+
### Added
17+
18+
- Data diffs are loaded in sequential batches for faster performance with large changes.
19+
- The diff tree and diff list can now be scrolled independently.
20+
21+
### Changed
22+
23+
- Modified node mutation events to not send metadata properties as part of the mutation payload. The reason is that the property lookup was time consuming. This information will return again in Infrahub 1.2 with a completely updated format. ([#5664](https://github.com/opsmill/infrahub/issues/5664))
24+
25+
### Fixed
26+
27+
- Fix nodes remaining in the database after a create mutation fails when using pools. ([#4303](https://github.com/opsmill/infrahub/issues/4303))
28+
- Modify the query for the current tasks, ensuring the correct determination of the merge button state. ([#5565](https://github.com/opsmill/infrahub/issues/5565))
29+
- Fix Docker `task-manager-db` PostgreSQL health check test by adding database and user parameters. ([#5739](https://github.com/opsmill/infrahub/issues/5739))
30+
- Fixed issue causing a gap in menu sidebar when text is too long.
31+
- Prevent avatar from being cut off in menu sidebar.
32+
- Enforce permission checks when using relationship add or delete mutation.
33+
- Enhance the data integrity checks UI to enable navigation from the check to the diff view.
34+
- Improved performance when updating an existing diff.
35+
1436
## [Infrahub - v1.1.6](https://github.com/opsmill/infrahub/tree/infrahub-v1.1.6) - 2025-01-30
1537

1638
### Artifact improvements

backend/infrahub/graphql/mutations/relationship.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@
77
from infrahub_sdk.utils import compare_lists
88

99
from infrahub import config
10+
from infrahub.core.account import GlobalPermission, ObjectPermission
1011
from infrahub.core.changelog.models import NodeChangelog
11-
from infrahub.core.constants import InfrahubKind, MutationAction, RelationshipCardinality
12+
from infrahub.core.constants import (
13+
InfrahubKind,
14+
MutationAction,
15+
PermissionAction,
16+
PermissionDecision,
17+
RelationshipCardinality,
18+
)
1219
from infrahub.core.manager import NodeManager
1320
from infrahub.core.query.node import NodeGetKindQuery
1421
from infrahub.core.query.relationship import (
@@ -21,6 +28,7 @@
2128
from infrahub.events.group_action import GroupMemberAddedEvent, GroupMemberRemovedEvent
2229
from infrahub.events.models import EventNode
2330
from infrahub.exceptions import NodeNotFoundError, ValidationError
31+
from infrahub.permissions import get_global_permission_for_kind
2432

2533
from ..types import RelatedNodeInput
2634

@@ -51,7 +59,7 @@ class RelationshipNodesInput(InputObjectType):
5159

5260
class RelationshipMixin:
5361
@classmethod
54-
async def mutate( # noqa: PLR0915
62+
async def mutate( # noqa: PLR0915, C901
5563
cls,
5664
root: dict, # noqa: ARG003
5765
info: GraphQLResolveInfo,
@@ -98,6 +106,32 @@ async def mutate( # noqa: PLR0915
98106
db=graphql_context.db, ids=node_ids, fields={"display_label": None}, branch=graphql_context.branch
99107
)
100108

109+
if graphql_context.account_session:
110+
impacted_schemas = {node.get_schema() for node in [source] + list(nodes.values())}
111+
required_permissions: list[GlobalPermission | ObjectPermission] = []
112+
decision = (
113+
PermissionDecision.ALLOW_DEFAULT.value
114+
if graphql_context.branch.is_default
115+
else PermissionDecision.ALLOW_OTHER.value
116+
)
117+
118+
for impacted_schema in impacted_schemas:
119+
global_action = get_global_permission_for_kind(schema=impacted_schema)
120+
121+
if global_action:
122+
required_permissions.append(GlobalPermission(action=global_action, decision=decision))
123+
else:
124+
required_permissions.append(
125+
ObjectPermission(
126+
namespace=impacted_schema.namespace,
127+
name=impacted_schema.name,
128+
action=PermissionAction.UPDATE.value,
129+
decision=decision,
130+
)
131+
)
132+
133+
graphql_context.active_permissions.raise_for_permissions(permissions=required_permissions)
134+
101135
_, _, in_list2 = compare_lists(list1=list(nodes.keys()), list2=node_ids)
102136
if in_list2:
103137
for node_id in in_list2:

backend/infrahub/permissions/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
from infrahub.permissions.local_backend import LocalPermissionBackend
33
from infrahub.permissions.manager import PermissionManager
44
from infrahub.permissions.report import report_schema_permissions
5-
from infrahub.permissions.types import AssignedPermissions
5+
from infrahub.permissions.types import AssignedPermissions, get_global_permission_for_kind
66

77
__all__ = [
88
"AssignedPermissions",
99
"LocalPermissionBackend",
1010
"PermissionBackend",
1111
"PermissionManager",
12+
"get_global_permission_for_kind",
1213
"report_schema_permissions",
1314
]

backend/infrahub/permissions/types.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
from typing import TYPE_CHECKING, TypedDict
44

5+
from infrahub.core.constants import GlobalPermissions, InfrahubKind
6+
from infrahub.core.schema import NodeSchema
7+
58
if TYPE_CHECKING:
69
from infrahub.core.account import GlobalPermission, ObjectPermission
10+
from infrahub.core.schema import MainSchemaTypes
711
from infrahub.permissions.constants import BranchRelativePermissionDecision
812

913

@@ -18,3 +22,25 @@ class KindPermissions(TypedDict):
1822
delete: BranchRelativePermissionDecision
1923
update: BranchRelativePermissionDecision
2024
view: BranchRelativePermissionDecision
25+
26+
27+
def get_global_permission_for_kind(schema: MainSchemaTypes) -> GlobalPermissions | None:
28+
kind_permission_map = {
29+
InfrahubKind.GENERICACCOUNT: GlobalPermissions.MANAGE_ACCOUNTS,
30+
InfrahubKind.ACCOUNTGROUP: GlobalPermissions.MANAGE_ACCOUNTS,
31+
InfrahubKind.ACCOUNTROLE: GlobalPermissions.MANAGE_ACCOUNTS,
32+
InfrahubKind.BASEPERMISSION: GlobalPermissions.MANAGE_PERMISSIONS,
33+
InfrahubKind.GENERICREPOSITORY: GlobalPermissions.MANAGE_REPOSITORIES,
34+
}
35+
36+
if schema.kind in kind_permission_map:
37+
return kind_permission_map[schema.kind]
38+
39+
if isinstance(schema, NodeSchema):
40+
for base in schema.inherit_from:
41+
try:
42+
return kind_permission_map[base]
43+
except KeyError:
44+
continue
45+
46+
return None

0 commit comments

Comments
 (0)