Skip to content

Commit 01db43b

Browse files
legendacEdouardDem
andauthored
fix: filter user attached policy accesses on pull (#207)
* fix: exclude user-attached accesses from public policy detection * fix: filter user-attached accesses from policy dump and add e2e coverage * fix: cast filtered policy items to include sync ID and exclude ignored fields * chore: run format * fix: add null user field to policy roles across multiple collections * fix: include user field in policy roles for consistency across collections * fix: run linter * chore: run format --------- Co-authored-by: Edouard Demotes <e.demotes@gmail.com>
1 parent 67138b4 commit 01db43b

23 files changed

Lines changed: 107 additions & 5 deletions

File tree

packages/cli/src/lib/services/collections/policies/data-client.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ export class PoliciesDataClient extends DataClient<DirectusPolicy> {
4141
// When role-policy attachments sync is disabled, omit the roles fields
4242
// entirely from the dump so they are neither tracked nor diffed.
4343
// See https://github.com/tractr/directus-sync/issues/199
44+
// Include roles.user so we can detect and skip user-attached accesses.
4445
const extraFields = this.config.shouldSyncPolicyRoles()
45-
? ['*', 'roles.role', 'roles.sort']
46+
? ['*', 'roles.role', 'roles.user', 'roles.sort']
4647
: ['*'];
4748
return readPolicies(
4849
deepmerge<Query<BaseDirectusPolicy>>(query, {

packages/cli/src/lib/services/collections/policies/data-mapper.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { DataMapper, Field, IdMappers } from '../base';
1+
import { DataMapper, Field, IdMappers, WithSyncIdAndWithoutId } from '../base';
22
import { Container, Service } from 'typedi';
33
import { LoggerService } from '../../logger';
44
import { POLICIES_COLLECTION } from './constants';
5-
import { DirectusPolicy } from './interfaces';
5+
import { DirectusPolicy, DirectusPolicyAccess } from './interfaces';
66
import { RolesIdMapperClient } from '../roles';
77
import { ConfigService } from '../../config';
88

@@ -27,4 +27,20 @@ export class PoliciesDataMapper extends DataMapper<DirectusPolicy> {
2727
this.idMappers = {};
2828
}
2929
}
30+
31+
async mapIdsToSyncIdAndRemoveIgnoredFields(
32+
items: WithSyncIdAndWithoutId<DirectusPolicy>[],
33+
): Promise<WithSyncIdAndWithoutId<DirectusPolicy>[]> {
34+
const filtered = items.map((item) =>
35+
Array.isArray(item.roles)
36+
? ({
37+
...item,
38+
roles: (item.roles as Partial<DirectusPolicyAccess>[]).filter(
39+
(a) => !(a.role === null && a.user != null),
40+
),
41+
} as WithSyncIdAndWithoutId<DirectusPolicy>)
42+
: item,
43+
);
44+
return super.mapIdsToSyncIdAndRemoveIgnoredFields(filtered);
45+
}
3046
}

packages/cli/src/lib/services/collections/policies/id-mapper-client.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@ export class PoliciesIdMapperClient extends IdMapperClient {
120120
filter: {
121121
_and: [
122122
{ roles: { role: { _null: true } } },
123+
// Exclude user-attached accesses (role=null, user=uuid) so they
124+
// are not mistaken for the public policy access (role=null, user=null).
125+
{ roles: { user: { _null: true } } },
123126
{
124127
_or: [
125128
{ roles: { sort: { _eq: 1 } } },

packages/e2e/dumps/sources/default-updated/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/dependencies-operations-reversed/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/dependencies-operations/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/dependencies-settings-default-folder/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/dependencies-settings-default-role/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/empty-collections/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

packages/e2e/dumps/sources/group-and-field-names-conflict/collections/policies.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"roles": [
1111
{
1212
"role": "_sync_default_admin_role",
13+
"user": null,
1314
"sort": null
1415
}
1516
],
@@ -26,6 +27,7 @@
2627
"roles": [
2728
{
2829
"role": null,
30+
"user": null,
2931
"sort": 1
3032
}
3133
],

0 commit comments

Comments
 (0)