Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
5864db7
add property visibility state manager
madsrasmussen Mar 11, 2025
65b4571
implement in structure manager
madsrasmussen Mar 11, 2025
cef5981
filter properties based on visibility
madsrasmussen Mar 11, 2025
05bda4d
wip document type structure permissions
madsrasmussen Mar 11, 2025
b946255
rename
madsrasmussen Mar 11, 2025
ceb3564
register entity permission for document type property
madsrasmussen Mar 11, 2025
5281ded
add entity permission for media type property
madsrasmussen Mar 11, 2025
b68c7a0
pass fallback permissions to document granular permissions
madsrasmussen Mar 11, 2025
f5a4947
set as preset
madsrasmussen Mar 12, 2025
aca621c
Merge branch 'v15/bugfix/document-granular-permission-preset' into v1…
madsrasmussen Mar 12, 2025
715a785
clean up
madsrasmussen Mar 12, 2025
15da5a5
Merge branch 'v15/bugfix/document-granular-permission-preset' into v1…
madsrasmussen Mar 12, 2025
9f93a6a
wip document type property picker
madsrasmussen Mar 12, 2025
29b4cc6
add preset value
madsrasmussen Mar 12, 2025
eb113e0
Update input-document-type-structure-granular-user-permission.element.ts
madsrasmussen Mar 12, 2025
cb2e5bf
move files
madsrasmussen Mar 12, 2025
3eb7519
rename
madsrasmussen Mar 12, 2025
be467a3
Update input-document-value-granular-user-permission.element.ts
madsrasmussen Mar 12, 2025
3a74ec1
remove temp test
madsrasmussen Mar 12, 2025
e9bd236
Update manifests.ts
madsrasmussen Mar 12, 2025
398f83f
remove unused
madsrasmussen Mar 13, 2025
8fe8e1c
Update input-document-value-granular-user-permission.element.ts
madsrasmussen Mar 13, 2025
437f443
rename see permission + add write permission
madsrasmussen Mar 13, 2025
8e474d6
fix missing type
madsrasmussen Mar 13, 2025
66f2082
require property type unique
madsrasmussen Mar 13, 2025
c4e3b6d
add unique to property type
madsrasmussen Mar 13, 2025
de626ff
rename to property type
madsrasmussen Mar 13, 2025
ae34369
map to unique
madsrasmussen Mar 13, 2025
e7708f3
deprecate id on property type
madsrasmussen Mar 13, 2025
a398dcd
return unique from property picker
madsrasmussen Mar 13, 2025
cf8c8c0
more explicit naming
madsrasmussen Mar 13, 2025
7e4daa9
use type
madsrasmussen Mar 13, 2025
d5e6317
render detail
madsrasmussen Mar 13, 2025
7db7f48
Update input-document-value-granular-user-permission.element.ts
madsrasmussen Mar 14, 2025
4e94ad9
wip modal flow
madsrasmussen Mar 14, 2025
8e882c5
clean up
madsrasmussen Mar 14, 2025
038fd4b
add headlines
madsrasmussen Mar 14, 2025
526b09e
hide actions
madsrasmussen Mar 17, 2025
0f77ca2
pass preset value
madsrasmussen Mar 17, 2025
3dfa4af
add edit permission method
madsrasmussen Mar 17, 2025
2d666bf
include property in permission name
madsrasmussen Mar 17, 2025
9407697
add read and write managers
madsrasmussen Mar 17, 2025
235d942
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 17, 2025
38eccd7
implement read and write state managers
madsrasmussen Mar 17, 2025
5f63704
Update content-type-structure-manager.class.ts
madsrasmussen Mar 17, 2025
066d59e
enforce property permissions
madsrasmussen Mar 17, 2025
ecc05bc
Storage for granular permissions at property type level
kjac Mar 17, 2025
6e04afe
add guards
madsrasmussen Mar 17, 2025
84f5b28
make variant property version
madsrasmussen Mar 17, 2025
e7d2c3e
Rename server models to include "property"
kjac Mar 18, 2025
908240e
generate server types
madsrasmussen Mar 18, 2025
8129789
add permissionType to model
madsrasmussen Mar 18, 2025
86d7ace
add mappers to user group permission data
madsrasmussen Mar 18, 2025
ff477ee
add mapper to current user permission data
madsrasmussen Mar 18, 2025
f23c6c9
destroy
madsrasmussen Mar 18, 2025
7a306a9
clear state
madsrasmussen Mar 18, 2025
14080c7
use permission type for guard check
madsrasmussen Mar 18, 2025
2b843ee
add permission type
madsrasmussen Mar 18, 2025
d21a13d
require specific permission type
madsrasmussen Mar 18, 2025
8da6550
use correct schema type
madsrasmussen Mar 18, 2025
ac58500
add mappings
madsrasmussen Mar 18, 2025
6fe3b80
clean up
madsrasmussen Mar 18, 2025
d70a981
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 18, 2025
3b3832d
log errors
madsrasmussen Mar 18, 2025
b92ea05
fix mapping
madsrasmussen Mar 18, 2025
1a1c770
null check for icon
madsrasmussen Mar 18, 2025
d8f05e3
use fallback if there is no forDataModel
madsrasmussen Mar 18, 2025
7e9b347
add translations
madsrasmussen Mar 18, 2025
9c83a1e
sort group alphabetically
madsrasmussen Mar 18, 2025
3531dcc
add empty state for no verbs
madsrasmussen Mar 18, 2025
f5cb387
organize folders
madsrasmussen Mar 18, 2025
7ba643f
always require unique and variant id
madsrasmussen Mar 19, 2025
533b81d
Allow storing empty lists of verbs
kjac Mar 19, 2025
9eaa0da
pass variant id to all states
madsrasmussen Mar 19, 2025
b7dbef1
Merge branch 'v15/feature/property-visibility' of https://github.com/…
madsrasmussen Mar 19, 2025
bdf639f
Remove empty verbs
kjac Mar 19, 2025
c454334
Merge remote-tracking branch 'origin/v15/feature/property-visibility'…
kjac Mar 19, 2025
2969517
add alias to name
madsrasmussen Mar 19, 2025
4e2039f
prevent picking the same property type multiple times
madsrasmussen Mar 19, 2025
77ac3ff
fix lint errors
madsrasmussen Mar 19, 2025
fc5bd24
fix create state by observing variant options
madsrasmussen Mar 19, 2025
313577b
move to workspace context
madsrasmussen Mar 19, 2025
bd94afc
Update document-property-value-user-permission.workspace-context.ts
madsrasmussen Mar 19, 2025
12a97da
Update content-editor-properties.element.ts
madsrasmussen Mar 19, 2025
1235230
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 20, 2025
b321f7e
clean up
madsrasmussen Mar 20, 2025
0ecc361
Rename models (last time, promise!)
kjac Mar 20, 2025
94d36a1
Add migration for default document property value permissions
kjac Mar 20, 2025
3ca7ad0
generate new server models
madsrasmussen Mar 20, 2025
fe834aa
update after model changes
madsrasmussen Mar 20, 2025
ead5df1
Correct the default permission identifiers
kjac Mar 21, 2025
57f71fa
Add default permissions to newly created DBs
kjac Mar 21, 2025
6aca8ed
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 21, 2025
6e943f7
Add validation and clean-up
kjac Mar 21, 2025
9b7ffdf
rename to visibility state
madsrasmussen Mar 21, 2025
82968d1
rename to view
madsrasmussen Mar 23, 2025
2ca216c
add helpers
madsrasmussen Mar 23, 2025
fa8cd66
apply to blocks
madsrasmussen Mar 23, 2025
ece7788
Update document-property-value-user-permission.workspace-context.ts
madsrasmussen Mar 23, 2025
7b7ebc8
disable view and write state by default
madsrasmussen Mar 24, 2025
e56eb09
add tests for start and stopping a state
madsrasmussen Mar 24, 2025
df8b3cd
throw errors if adding to a state that is not running
madsrasmussen Mar 24, 2025
84f442b
export consts
madsrasmussen Mar 24, 2025
0476434
export consts
madsrasmussen Mar 24, 2025
87be7d2
fix circular
madsrasmussen Mar 24, 2025
44b0a78
fix circular
madsrasmussen Mar 24, 2025
d08eb3e
set the entity type when setting values
madsrasmussen Mar 24, 2025
b168797
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 24, 2025
60c6350
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 25, 2025
654f8b0
only apply for block in document values
madsrasmussen Mar 25, 2025
0172302
split logic
madsrasmussen Mar 25, 2025
2dab66e
start states for document blocks
madsrasmussen Mar 25, 2025
2714fed
only apply states when state is running
madsrasmussen Mar 25, 2025
85c86ff
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 25, 2025
6e16484
Fixed typos in test method names.
AndyButland Mar 25, 2025
7e3fac7
Merge branch 'v15/dev' into v15/feature/property-visibility
madsrasmussen Mar 25, 2025
5f6c274
add readonly type
nielslyngsoe Apr 1, 2025
cf331cb
Enforce: AllowEditInvariantFromNonDefault configuration (#18758)
madsrasmussen Apr 1, 2025
e6d9af5
Merge branch 'v15/dev' into v15/feature/property-visibility
nielslyngsoe Apr 1, 2025
9170c9f
remove unnecessary messages
nielslyngsoe Apr 1, 2025
03f53be
make sure to destroy consumer
nielslyngsoe Apr 1, 2025
571aa74
Thoughts as TODO
nielslyngsoe Apr 1, 2025
2e76637
use Entry type
nielslyngsoe Apr 1, 2025
b2fb403
use Entry type
nielslyngsoe Apr 1, 2025
e74b4c4
get rid of things not yet released
nielslyngsoe Apr 1, 2025
d191be7
clean up
nielslyngsoe Apr 1, 2025
4fe1943
use generic methods
nielslyngsoe Apr 1, 2025
361bfee
TODO comment
nielslyngsoe Apr 1, 2025
3ac7701
use generic observable
nielslyngsoe Apr 1, 2025
0a2cd49
catch if not found
nielslyngsoe Apr 1, 2025
92b18a4
move variant id out of property type
nielslyngsoe Apr 1, 2025
32aeef1
mega refactor temp commit
nielslyngsoe Apr 2, 2025
cf4a3e6
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 3, 2025
be89ad4
Guard Manager
nielslyngsoe Apr 3, 2025
c3ba692
set readOnly as a property on property editors
nielslyngsoe Apr 3, 2025
fc33f6a
further rename
nielslyngsoe Apr 3, 2025
d659638
remove property state managers
nielslyngsoe Apr 3, 2025
ce6433c
revert state manager
nielslyngsoe Apr 3, 2025
24ebc77
fix sorting rule
nielslyngsoe Apr 3, 2025
038f0c7
mega rename and correction
nielslyngsoe Apr 3, 2025
bd42b70
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 6, 2025
5468096
refactor properties elements
nielslyngsoe Apr 6, 2025
7c80b42
todo note
nielslyngsoe Apr 6, 2025
06764d9
clean up
nielslyngsoe Apr 6, 2025
c188b5b
impl
nielslyngsoe Apr 6, 2025
f033f8f
mega refactor moving permission guards to workspace
nielslyngsoe Apr 6, 2025
025c689
rename
nielslyngsoe Apr 7, 2025
4cd6ac7
type change
nielslyngsoe Apr 7, 2025
5d66e52
rearrange
nielslyngsoe Apr 7, 2025
e608bf8
correct import
nielslyngsoe Apr 7, 2025
0b995c5
fix tests
nielslyngsoe Apr 7, 2025
f442970
correct tests
nielslyngsoe Apr 7, 2025
b8e3288
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 7, 2025
6e4808b
reset viewGuards block
nielslyngsoe Apr 7, 2025
7090247
type correction
nielslyngsoe Apr 7, 2025
5a413a4
refactor read only for user permissions setting
nielslyngsoe Apr 7, 2025
943a859
todo note
nielslyngsoe Apr 7, 2025
be64ce6
align property element
nielslyngsoe Apr 7, 2025
516db2a
await promise
nielslyngsoe Apr 7, 2025
015b443
impl view guard property filtering
nielslyngsoe Apr 7, 2025
bcae981
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 9, 2025
f167524
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 9, 2025
52cfd09
correct const name
nielslyngsoe Apr 9, 2025
456e64f
fix fallback user permissions in mock data
nielslyngsoe Apr 9, 2025
3862041
correct property type id mock data
nielslyngsoe Apr 9, 2025
db4bd9b
toggle permissions example
nielslyngsoe Apr 9, 2025
eaa1182
complex permission
nielslyngsoe Apr 9, 2025
6b4ed57
Merge branch 'v15/dev' into v15/feature/property-visibility-refactor
nielslyngsoe Apr 10, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,12 @@
.WithDetail("The assigned media start node does not exists.")
.Build()),
UserGroupOperationStatus.DocumentPermissionKeyNotFound => NotFound(new ProblemDetailsBuilder()
.WithTitle("A document permission key not found")
.WithDetail("A assigned document permission not exists.")
.WithTitle("Document permission key not found")
.WithDetail("An assigned document permission does not reference an existing document.")
.Build()),
UserGroupOperationStatus.DocumentTypePermissionKeyNotFound => NotFound(new ProblemDetailsBuilder()
.WithTitle("Document type permission key not found")
.WithDetail("An assigned document type permission does not reference an existing document type.")

Check warning on line 62 in src/Umbraco.Cms.Api.Management/Controllers/UserGroup/UserGroupControllerBase.cs

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (v15/dev)

❌ Getting worse: Large Method

UserGroupOperationStatusResult increases from 75 to 79 lines of code, threshold = 70. Large functions with many lines of code are generally harder to understand and lower the code health. Avoid adding more lines to this function.
.Build()),
UserGroupOperationStatus.LanguageNotFound => NotFound(problemDetailsBuilder
.WithTitle("Language not found")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@ internal static IUmbracoBuilder AddUserGroups(this IUmbracoBuilder builder)
builder.Services.AddTransient<IUserGroupPresentationFactory, UserGroupPresentationFactory>();
builder.Services.AddSingleton<IPermissionPresentationFactory, PermissionPresentationFactory>();

builder.Services.AddSingleton<IPermissionMapper, DocumentPermissionMapper>();
builder.Services.AddSingleton<IPermissionPresentationMapper, DocumentPermissionMapper>();

builder.Services.AddSingleton<DocumentPermissionMapper>();
builder.Services.AddSingleton<IPermissionMapper>(x=>x.GetRequiredService<DocumentPermissionMapper>());
builder.Services.AddSingleton<IPermissionPresentationMapper>(x=>x.GetRequiredService<DocumentPermissionMapper>());
builder.Services.AddSingleton<IPermissionMapper, DocumentPropertyValuePermissionMapper>();
builder.Services.AddSingleton<IPermissionPresentationMapper, DocumentPropertyValuePermissionMapper>();

return builder;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
using Umbraco.Cms.Api.Management.ViewModels;
using Umbraco.Cms.Api.Management.ViewModels.UserGroup.Permissions;
using Umbraco.Cms.Core.Models.Membership.Permissions;
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
using Umbraco.Cms.Infrastructure.Persistence.Mappers;
using Umbraco.Extensions;

namespace Umbraco.Cms.Api.Management.Mapping.Permissions;

public class DocumentPropertyValuePermissionMapper : IPermissionPresentationMapper, IPermissionMapper
{
public string Context => DocumentPropertyValueGranularPermission.ContextType;

public IGranularPermission MapFromDto(UserGroup2GranularPermissionDto dto) =>
new DocumentPropertyValueGranularPermission()
{
Key = dto.UniqueId!.Value,
Permission = dto.Permission,
};

public Type PresentationModelToHandle => typeof(DocumentPropertyValuePermissionPresentationModel);

public IEnumerable<IPermissionPresentationModel> MapManyAsync(IEnumerable<IGranularPermission> granularPermissions)
{
var intermediate = granularPermissions.Where(p => p.Key.HasValue).Select(p =>
{
var parts = p.Permission.Split('|');
return parts.Length == 2 && Guid.TryParse(parts[0], out Guid propertyTypeId)
? new { DocumentTypeId = p.Key!.Value, PropertyTypeId = propertyTypeId, Verb = parts[1] }
: null;
})
.WhereNotNull()
.ToArray();

var intermediateByDocumentType = intermediate.GroupBy(x => x.DocumentTypeId);
foreach (var documentTypeGroup in intermediateByDocumentType)
{
foreach (var propertyTypeGroup in documentTypeGroup.GroupBy(x => x.PropertyTypeId))
{
yield return new DocumentPropertyValuePermissionPresentationModel
{
DocumentType = new ReferenceByIdModel(documentTypeGroup.Key),
PropertyType = new ReferenceByIdModel(propertyTypeGroup.Key),
Verbs = propertyTypeGroup
.Select(x => x.Verb)
.Where(verb => verb.IsNullOrWhiteSpace() is false)
.ToHashSet(),
};
}
}
}

public IEnumerable<IGranularPermission> MapToGranularPermissions(IPermissionPresentationModel permissionViewModel)
{
if (permissionViewModel is not DocumentPropertyValuePermissionPresentationModel documentTypePermissionPresentationModel)
{
yield break;
}

foreach (var verb in documentTypePermissionPresentationModel.Verbs.Distinct().DefaultIfEmpty(string.Empty))
{
yield return new DocumentPropertyValueGranularPermission
{
Key = documentTypePermissionPresentationModel.DocumentType.Id,
Permission = $"{documentTypePermissionPresentationModel.PropertyType.Id}|{verb}"
};
}
}
}
54 changes: 54 additions & 0 deletions src/Umbraco.Cms.Api.Management/OpenApi.json
Original file line number Diff line number Diff line change
Expand Up @@ -36405,6 +36405,9 @@
{
"$ref": "#/components/schemas/DocumentPermissionPresentationModel"
},
{
"$ref": "#/components/schemas/DocumentPropertyValuePermissionPresentationModel"
},
{
"$ref": "#/components/schemas/UnknownTypePermissionPresentationModel"
}
Expand Down Expand Up @@ -36693,6 +36696,9 @@
{
"$ref": "#/components/schemas/DocumentPermissionPresentationModel"
},
{
"$ref": "#/components/schemas/DocumentPropertyValuePermissionPresentationModel"
},
{
"$ref": "#/components/schemas/UnknownTypePermissionPresentationModel"
}
Expand Down Expand Up @@ -37568,6 +37574,48 @@
}
}
},
"DocumentPropertyValuePermissionPresentationModel": {
"required": [
"$type",
"documentType",
"propertyType",
"verbs"
],
"type": "object",
"properties": {
"$type": {
"type": "string"
},
"documentType": {
"oneOf": [
{
"$ref": "#/components/schemas/ReferenceByIdModel"
}
]
},
"propertyType": {
"oneOf": [
{
"$ref": "#/components/schemas/ReferenceByIdModel"
}
]
},
"verbs": {
"uniqueItems": true,
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false,
"discriminator": {
"propertyName": "$type",
"mapping": {
"DocumentPropertyValuePermissionPresentationModel": "#/components/schemas/DocumentPropertyValuePermissionPresentationModel"
}
}
},
"DocumentRecycleBinItemResponseModel": {
"required": [
"createDate",
Expand Down Expand Up @@ -46169,6 +46217,9 @@
{
"$ref": "#/components/schemas/DocumentPermissionPresentationModel"
},
{
"$ref": "#/components/schemas/DocumentPropertyValuePermissionPresentationModel"
},
{
"$ref": "#/components/schemas/UnknownTypePermissionPresentationModel"
}
Expand Down Expand Up @@ -46592,6 +46643,9 @@
{
"$ref": "#/components/schemas/DocumentPermissionPresentationModel"
},
{
"$ref": "#/components/schemas/DocumentPropertyValuePermissionPresentationModel"
},
{
"$ref": "#/components/schemas/UnknownTypePermissionPresentationModel"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Umbraco.Cms.Api.Management.ViewModels.UserGroup.Permissions;

public class DocumentPropertyValuePermissionPresentationModel : IPermissionPresentationModel
{
public required ReferenceByIdModel DocumentType { get; set; }

public required ReferenceByIdModel PropertyType { get; set; }

public required ISet<string> Verbs { get; set; }
}
29 changes: 29 additions & 0 deletions src/Umbraco.Core/Actions/ActionDocumentPropertyRead.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace Umbraco.Cms.Core.Actions;

public class ActionDocumentPropertyRead : IAction
{
/// <inheritdoc cref="IAction.ActionLetter" />
public const string ActionLetter = "Umb.Document.PropertyValue.Read";

/// <inheritdoc cref="IAction.ActionAlias" />
public const string ActionAlias = "documentpropertyread";

/// <inheritdoc/>
public string Letter => ActionLetter;

/// <inheritdoc/>
public string Alias => ActionAlias;

/// <inheritdoc />
public bool ShowInNotifier => false;

/// <inheritdoc />
public bool CanBePermissionAssigned => true;

/// <inheritdoc />
public string Icon => string.Empty;

/// <inheritdoc />
public string Category => Constants.Conventions.PermissionCategories.OtherCategory;
}

29 changes: 29 additions & 0 deletions src/Umbraco.Core/Actions/ActionDocumentPropertyWrite.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
namespace Umbraco.Cms.Core.Actions;

public class ActionDocumentPropertyWrite : IAction
{
/// <inheritdoc cref="IAction.ActionLetter" />
public const string ActionLetter = "Umb.Document.PropertyValue.Write";

/// <inheritdoc cref="IAction.ActionAlias" />
public const string ActionAlias = "documentpropertywrite";

/// <inheritdoc/>
public string Letter => ActionLetter;

/// <inheritdoc/>
public string Alias => ActionAlias;

/// <inheritdoc />
public bool ShowInNotifier => false;

/// <inheritdoc />
public bool CanBePermissionAssigned => true;

/// <inheritdoc />
public string Icon => string.Empty;

/// <inheritdoc />
public string Category => Constants.Conventions.PermissionCategories.OtherCategory;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
namespace Umbraco.Cms.Core.Models.Membership.Permissions;

public class DocumentPropertyValueGranularPermission : INodeGranularPermission
{
public const string ContextType = "DocumentTypeProperty";

public required Guid Key { get; set; }

public string Context => ContextType;

public required string Permission { get; set; }

protected bool Equals(DocumentPropertyValueGranularPermission other) => Key.Equals(other.Key) && Permission == other.Permission;

public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}

if (ReferenceEquals(this, obj))
{
return true;
}

if (obj.GetType() != GetType())
{
return false;
}

return Equals((DocumentPropertyValueGranularPermission)obj);
}

public override int GetHashCode() => HashCode.Combine(Key, Permission);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum UserGroupOperationStatus
MediaStartNodeKeyNotFound,
DocumentStartNodeKeyNotFound,
DocumentPermissionKeyNotFound,
DocumentTypePermissionKeyNotFound,
LanguageNotFound,
NameTooLong,
AliasTooLong,
Expand Down
22 changes: 14 additions & 8 deletions src/Umbraco.Core/Services/UserGroupService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -612,20 +612,26 @@ private UserGroupOperationStatus ValidateStartNodesExists(IUserGroup userGroup)

private UserGroupOperationStatus ValidateGranularPermissionsExists(IUserGroup userGroup)
{
IEnumerable<Guid> documentKeys = userGroup.GranularPermissions.Select(granularPermission =>
{
if (granularPermission is DocumentGranularPermission nodeGranularPermission)
{
return (Guid?)nodeGranularPermission.Key;
}
Guid[] documentKeys = userGroup.GranularPermissions
.OfType<DocumentGranularPermission>()
.Select(p => p.Key)
.ToArray();

return null;
}).Where(x => x.HasValue).Cast<Guid>().ToArray();
if (documentKeys.Any() && _entityService.Exists(documentKeys) is false)
{
return UserGroupOperationStatus.DocumentPermissionKeyNotFound;
}

Guid[] documentTypeKeys = userGroup.GranularPermissions
.OfType<DocumentPropertyValueGranularPermission>()
.Select(p => p.Key)
.ToArray();

if (documentTypeKeys.Any() && _entityService.Exists(documentTypeKeys) is false)
{
return UserGroupOperationStatus.DocumentTypePermissionKeyNotFound;
}

return UserGroupOperationStatus.Success;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,10 +195,10 @@ private void CreateUserGroup2PermissionData()
{
var userGroupKeyToPermissions = new Dictionary<Guid, IEnumerable<string>>()
{
[Constants.Security.AdminGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionAssignDomain.ActionLetter, ActionPublish.ActionLetter, ActionRights.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "7", "T"],
[Constants.Security.EditorGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionPublish.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "T"],
[Constants.Security.WriterGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionNotify.ActionLetter, ":" ],
[Constants.Security.TranslatorGroupKey] = [ActionUpdate.ActionLetter, ActionBrowse.ActionLetter],
[Constants.Security.AdminGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionAssignDomain.ActionLetter, ActionPublish.ActionLetter, ActionRights.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "7", "T", ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter],
[Constants.Security.EditorGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionDelete.ActionLetter, ActionMove.ActionLetter, ActionCopy.ActionLetter, ActionSort.ActionLetter, ActionRollback.ActionLetter, ActionProtect.ActionLetter, ActionPublish.ActionLetter, ActionUnpublish.ActionLetter, ActionBrowse.ActionLetter, ActionCreateBlueprintFromContent.ActionLetter, ActionNotify.ActionLetter, ":", "5", "T", ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter],
[Constants.Security.WriterGroupKey] = [ActionNew.ActionLetter, ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionNotify.ActionLetter, ":" , ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter],
[Constants.Security.TranslatorGroupKey] = [ActionUpdate.ActionLetter, ActionBrowse.ActionLetter, ActionDocumentPropertyRead.ActionLetter, ActionDocumentPropertyWrite.ActionLetter],
};

var i = 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ protected virtual void DefinePlan()

// To 15.4.0
To<V_15_4_0.UpdateDocumentUrlToPersistMultipleSegmentsPerDocument>("{A9E72794-4036-4563-B543-1717C73B8879}");
To<V_15_4_0.AddDocumentPropertyPermissions>("{D1568C33-A697-455F-8D16-48060CB954A1}");
To<V_15_4_0.AddRelationTypeForMembers>("{33D62294-D0DE-4A86-A830-991EB36B96DA}");
}
}
Loading
Loading