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. ///