Fixes brought to the process of validating permissions (#1406)

* Fixed call to ValidatePermissions under TranslateBrowsePath service

* Fixed adding default permission values to the metadata under GetPermissionMetadata method
This commit is contained in:
Suciu Mircea Adrian
2021-05-20 17:01:52 +03:00
committed by GitHub
parent 6d232726b4
commit 2dfedef0bd
2 changed files with 57 additions and 43 deletions
@@ -1139,47 +1139,7 @@ namespace Opc.Ua.Server
metadata.UserRolePermissions = new RolePermissionTypeCollection(ExtensionObject.ToList<RolePermissionType>(values[12]));
}
// check if NamespaceMetadata is defined for NamespaceUri
string namespaceUri = Server.NamespaceUris.GetString(target.NodeId.NamespaceIndex);
NamespaceMetadataState namespaceMetadataState = Server.NodeManager.ConfigurationNodeManager.GetNamespaceMetadataState(namespaceUri);
if (namespaceMetadataState != null)
{
List<object> namespaceMetadataValues;
if (namespaceMetadataState.DefaultAccessRestrictions != null)
{
// get DefaultAccessRestrictions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultAccessRestrictions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultAccessRestrictions = (AccessRestrictionType)Enum.ToObject(typeof(AccessRestrictionType), namespaceMetadataValues[0]);
}
}
if (namespaceMetadataState.DefaultRolePermissions != null)
{
// get DefaultRolePermissions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultRolePermissions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultRolePermissions = new RolePermissionTypeCollection(ExtensionObject.ToList<RolePermissionType>(namespaceMetadataValues[0]));
}
}
if (namespaceMetadataState.DefaultUserRolePermissions != null)
{
// get DefaultUserRolePermissions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultUserRolePermissions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultUserRolePermissions = new RolePermissionTypeCollection(ExtensionObject.ToList<RolePermissionType>(namespaceMetadataValues[0]));
}
}
}
SetDefaultPermissions(systemContext, target, metadata);
// get instance references.
BaseInstanceState instance = target as BaseInstanceState;
@@ -4424,10 +4384,64 @@ namespace Opc.Ua.Server
values = ReadValidationAttributes(systemContext, target);
SetAccessAndRolePermissions(values, metadata);
}
SetDefaultPermissions(systemContext, target, metadata);
return metadata;
}
}
/// <summary>
/// Set the metadata default permission values for DefaultAccessRestrictions, DefaultRolePermissions and DefaultUserRolePermissions
/// </summary>
/// <param name="systemContext"></param>
/// <param name="target"></param>
/// <param name="metadata"></param>
private void SetDefaultPermissions(ServerSystemContext systemContext, NodeState target, NodeMetadata metadata)
{
// check if NamespaceMetadata is defined for NamespaceUri
string namespaceUri = Server.NamespaceUris.GetString(target.NodeId.NamespaceIndex);
NamespaceMetadataState namespaceMetadataState = Server.NodeManager.ConfigurationNodeManager.GetNamespaceMetadataState(namespaceUri);
if (namespaceMetadataState != null)
{
List<object> namespaceMetadataValues;
if (namespaceMetadataState.DefaultAccessRestrictions != null)
{
// get DefaultAccessRestrictions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultAccessRestrictions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultAccessRestrictions = (AccessRestrictionType)Enum.ToObject(typeof(AccessRestrictionType), namespaceMetadataValues[0]);
}
}
if (namespaceMetadataState.DefaultRolePermissions != null)
{
// get DefaultRolePermissions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultRolePermissions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultRolePermissions = new RolePermissionTypeCollection(ExtensionObject.ToList<RolePermissionType>(namespaceMetadataValues[0]));
}
}
if (namespaceMetadataState.DefaultUserRolePermissions != null)
{
// get DefaultUserRolePermissions for Namespace
namespaceMetadataValues = namespaceMetadataState.DefaultUserRolePermissions.ReadAttributes(systemContext, Attributes.Value);
if (namespaceMetadataValues[0] != null)
{
metadata.DefaultUserRolePermissions = new RolePermissionTypeCollection(ExtensionObject.ToList<RolePermissionType>(namespaceMetadataValues[0]));
}
}
}
}
#endregion
#region ComponentCache Functions
@@ -802,7 +802,7 @@ namespace Opc.Ua.Server
}
}
// validate access rights and role permissions
ServiceResult serviceResult = ValidatePermissions(context, nodeManager, sourceHandle, PermissionType.Browse);
ServiceResult serviceResult = ValidatePermissions(context, nodeManager, sourceHandle, PermissionType.Browse, null, true);
if (ServiceResult.IsGood(serviceResult))
{
// translate path only if validation is passing