diff --git a/Libraries/Opc.Ua.Server/Diagnostics/AuditEvents.cs b/Libraries/Opc.Ua.Server/Diagnostics/AuditEvents.cs
index 7393225a6b..2d715ee5b2 100644
--- a/Libraries/Opc.Ua.Server/Diagnostics/AuditEvents.cs
+++ b/Libraries/Opc.Ua.Server/Diagnostics/AuditEvents.cs
@@ -778,6 +778,7 @@ namespace Opc.Ua.Server
InitializeAuditSessionEvent(systemContext, e, message, exception == null, session, auditEntryId);
+ e.SetChildValue(systemContext, BrowseNames.ClientUserId, "System/CreateSession", false);
e.SetChildValue(systemContext, BrowseNames.SourceName, "Session/CreateSession", false);
// set AuditCreateSessionEventState fields
@@ -1350,6 +1351,65 @@ namespace Opc.Ua.Server
Utils.LogError(ex, "Error while reporting AuditOpenSecureChannelEvent event.");
}
}
+
+
+ ///
+ /// Reports the AuditUpdateMethodEventType
+ ///
+ /// The server which reports audit events.
+ /// Server information.
+ /// The id of the object where the method is executed.
+ /// The NodeId of the object that the method resides in.
+ /// The InputArguments of the method
+ /// Custom message for delete nodes.
+ /// The resulting status code.
+ public static void ReportAuditUpdateMethodEvent(this IAuditEventServer server,
+ ISystemContext systemContext,
+ NodeId objectId,
+ NodeId methodId,
+ object[] inputArgs,
+ string customMessage,
+ StatusCode statusCode)
+ {
+ if (server?.Auditing != true)
+ {
+ // current server does not support auditing
+ return;
+ }
+ try
+ {
+ AuditUpdateMethodEventState e = new AuditUpdateMethodEventState(null);
+
+ TranslationInfo message = new TranslationInfo(
+ "AuditUpdateMethodEventState",
+ "en-US",
+ $"'{customMessage}' returns StatusCode: {statusCode.ToString(null, CultureInfo.InvariantCulture)}.");
+
+ e.Initialize(
+ systemContext,
+ null,
+ EventSeverity.Min,
+ new LocalizedText(message),
+ StatusCode.IsGood(statusCode),
+ DateTime.UtcNow); // initializes Status, ActionTimeStamp, ServerId, ClientAuditEntryId, ClientUserId
+
+ e.SetChildValue(systemContext, BrowseNames.SourceNode, objectId, false);
+ e.SetChildValue(systemContext, BrowseNames.SourceName, "Attribute/Call", false);
+ e.SetChildValue(systemContext, BrowseNames.LocalTime, Utils.GetTimeZoneInfo(), false);
+
+ e.SetChildValue(systemContext, BrowseNames.ClientUserId, systemContext?.UserIdentity?.DisplayName, false);
+ e.SetChildValue(systemContext, BrowseNames.ClientAuditEntryId, systemContext?.AuditEntryId, false);
+
+ e.SetChildValue(systemContext, BrowseNames.MethodId, methodId, false);
+ e.SetChildValue(systemContext, BrowseNames.InputArguments, inputArgs, false);
+
+ server.ReportAuditEvent(systemContext, e);
+ }
+ catch (Exception ex)
+ {
+ Utils.LogError(ex, "Error while reporting AuditDeleteNodesEvent event.");
+ }
+ }
#endregion Report Audit Events
#region Private helpers
diff --git a/Libraries/Opc.Ua.Server/Diagnostics/CustomNodeManager.cs b/Libraries/Opc.Ua.Server/Diagnostics/CustomNodeManager.cs
index 3480170450..43e376219a 100644
--- a/Libraries/Opc.Ua.Server/Diagnostics/CustomNodeManager.cs
+++ b/Libraries/Opc.Ua.Server/Diagnostics/CustomNodeManager.cs
@@ -400,22 +400,6 @@ namespace Opc.Ua.Server
instance.Create(contextToUse, null, browseName, null, true);
AddPredefinedNode(contextToUse, instance);
- // report audit event
- if (Server?.Auditing == true)
- {
- // current server supports auditing, prepare the added nodes info
- AddNodesItem[] addNodesItems = GetFlattenedNodeTree(context, instance).Select(n => new AddNodesItem() {
- BrowseName = n.BrowseName,
- NodeClass = n.NodeClass,
- RequestedNewNodeId = n.NodeId,
- TypeDefinition = n.TypeDefinitionId,
- ReferenceTypeId = n.ReferenceTypeId,
- ParentNodeId = n.Parent?.NodeId
- }).ToArray();
-
- Server.ReportAuditAddNodesEvent(context, addNodesItems, "CreateNode", StatusCodes.Good);
- }
-
return instance.NodeId;
}
}
@@ -443,18 +427,6 @@ namespace Opc.Ua.Server
if (PredefinedNodes.TryGetValue(nodeId, out node))
{
- // report audit event
- if (Server?.Auditing == true)
- {
- // current server supports auditing, prepare the deleted nodes info
- DeleteNodesItem[] nodesToDelete = GetFlattenedNodeTree(context, node as BaseInstanceState).Select(n => new DeleteNodesItem() {
- NodeId = n.NodeId,
- DeleteTargetReferences = true
- }).ToArray();
-
- Server.ReportAuditDeleteNodesEvent(context, nodesToDelete, "DeleteNode", StatusCodes.Good);
- }
-
RemovePredefinedNode(contextToUse, node, referencesToRemove);
found = true;
}
@@ -740,36 +712,6 @@ namespace Opc.Ua.Server
}
}
-
- ///
- /// Get the flattened tree of nodes starting from the specified node
- ///
- /// Current server context.
- /// The root node from where the search begins.
- ///
- protected IList GetFlattenedNodeTree(ISystemContext context, BaseInstanceState rootNode)
- {
- if (rootNode == null) return new List();
-
- List nodes = new List() { rootNode };
- List results = new List { rootNode };
- while (nodes.Count > 0)
- {
- List childNodes = new List();
- foreach (BaseInstanceState node in nodes)
- {
- IList children = new List();
- node.GetChildren(context, children);
-
- childNodes.AddRange(children);
- results.AddRange(children);
- }
- nodes = childNodes;
- }
-
- return results;
- }
-
///
/// Called after a node has been deleted.
///