public static void BeginInstancesTransferAuditLogger(List <StorageInstance> instances, AssociationParameters parms) { Dictionary <string, AuditPatientParticipantObject> list = new Dictionary <string, AuditPatientParticipantObject>(); foreach (StorageInstance instance in instances) { string key = instance.PatientId + instance.PatientsName; if (!list.ContainsKey(key)) { AuditPatientParticipantObject patient = new AuditPatientParticipantObject(instance.PatientsName, instance.PatientId); list.Add(key, patient); } } foreach (AuditPatientParticipantObject patient in list.Values) { // Audit Log BeginTransferringDicomInstancesAuditHelper audit = new BeginTransferringDicomInstancesAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, parms, patient); foreach (StorageInstance instance in instances) { if (patient.PatientId.Equals(instance.PatientId) && patient.PatientsName.Equals(instance.PatientsName)) { audit.AddStorageInstance(instance); } } ServerAuditHelper.LogAuditMessage(audit); } }
public static void SignOut(SessionInfo session) { FormsAuthentication.SignOut(); if (session != null) { try { ForceOtherPagesToLogout(session); using (LoginService service = new LoginService()) { service.Logout(session.Credentials.SessionToken.Id); } } catch (NotSupportedException) { //ignore this. } catch (Exception e) { Platform.Log(LogLevel.Warn, e, "Failed to log user out."); } UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, UserAuthenticationEventType.Logout); audit.AddUserParticipant(new AuditPersonActiveParticipant( session.Credentials.UserName, null, session.Credentials.DisplayName)); ServerAuditHelper.LogAuditMessage(audit); } }
private static void AuditLog(Study study, List <UpdateItem> fields) { Platform.CheckForNullReference(study, "study"); Platform.CheckForNullReference(fields, "fields"); var helper = new DicomInstancesAccessedAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, EventIdentificationContentsEventActionCode.U); helper.AddUser(new AuditPersonActiveParticipant( SessionManager.Current.Credentials.UserName, null, SessionManager.Current.Credentials.DisplayName)); var participant = new AuditStudyParticipantObject(study.StudyInstanceUid, study.AccessionNumber); string updateDescription = StringUtilities.Combine( fields, ";", item => String.Format("Tag=\"{0}\" Value=\"{1}\"", item.DicomTag.Name, item.Value) ); participant.ParticipantObjectDetailString = updateDescription; helper.AddStudyParticipantObject(participant); ServerAuditHelper.LogAuditMessage(helper); }
/// <summary> /// Method called when stopping the DICOM SCP. /// </summary> protected override void Stop() { lock (_syncLock) { ServerPartitionMonitor.Instance.Changed -= _changedEvent; foreach (DicomScp <DicomScpContext> scp in _listenerList) { scp.Stop(); var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(scp.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); } foreach (DicomScp <DicomScpContext> scp in _alternateAeListenerList) { scp.Stop(); var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(scp.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); } } }
protected void DeleteButton_Clicked(object sender, ImageClickEventArgs e) { if (Page.IsValid) { try { string reason = ReasonListBox.SelectedItem.Text; if (!String.IsNullOrEmpty(SaveReasonAsName.Text)) { SaveCustomReason(); reason = SaveReasonAsName.Text; } OnDeletingStudies(); StudyController controller = new StudyController(); foreach (DeleteStudyInfo study in DeletingStudies) { try { controller.DeleteStudy(study.StudyKey, reason + "::" + Comment.Text); // Audit log DicomStudyDeletedAuditHelper helper = new DicomStudyDeletedAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success); helper.AddUserParticipant(new AuditPersonActiveParticipant( SessionManager.Current.Credentials.UserName, null, SessionManager.Current.Credentials.DisplayName)); helper.AddStudyParticipantObject(new AuditStudyParticipantObject( study.StudyInstanceUid, study.AccessionNumber ?? string.Empty)); ServerAuditHelper.LogAuditMessage(helper); } catch (Exception ex) { Platform.Log(LogLevel.Error, ex, "DeleteClicked failed: Unable to delete studies"); throw; } } OnStudiesDeleted(); } finally { Close(); } } else { EnsureDialogVisible(); } }
private void GenerateAuditLog() { var audit = new DicomInstancesAccessedAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, EventIdentificationContentsEventActionCode.R /* Read*/); audit.AddUser(new AuditPersonActiveParticipant(SessionManager.Current.Credentials.UserName, null, SessionManager.Current.Credentials.DisplayName)); var participant = new AuditStudyParticipantObject(_study.StudyInstanceUid, _study.AccessionNumber); participant.ParticipantObjectDetailString = string.Format("Partition: {0}", string.IsNullOrEmpty(_study.ThePartition.Description) ? _study.ThePartition.AeTitle : _study.ThePartition.Description); audit.AddStudyParticipantObject(participant); ServerAuditHelper.LogAuditMessage(audit); }
public bool AddStudyAuthorityGroups(string studyInstanceUid, string accessionNumber, ServerEntityKey studyStorageKey, IList <string> assignedGroupOids) { List <AuthorityGroupDetail> nonAddedSummaries; Dictionary <ServerEntityKey, AuthorityGroupDetail> dic = LoadAuthorityGroups(out nonAddedSummaries); IList <AuthorityGroupStudyAccessInfo> assignedList = ListDataAccessGroupsForStudy(dic, studyStorageKey); List <string> assignedGroups = new List <string>(); foreach (var oid in assignedGroupOids) { bool found = false; foreach (AuthorityGroupStudyAccessInfo group in assignedList) { if (group.AuthorityOID.Equals(oid)) { found = true; break; } } if (!found) { DataAccessGroup accessGroup = AddDataAccessIfNotExists(oid); using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { StudyDataAccessUpdateColumns insertColumns = new StudyDataAccessUpdateColumns { DataAccessGroupKey = accessGroup.Key, StudyStorageKey = studyStorageKey }; IStudyDataAccessEntityBroker insert = updateContext.GetBroker <IStudyDataAccessEntityBroker>(); insert.Insert(insertColumns); updateContext.Commit(); } AuthorityGroupDetail detail; if (dic.TryGetValue(accessGroup.Key, out detail)) { assignedGroups.Add(detail.Name); } } } if (assignedGroups.Count > 0) { ServerAuditHelper.AddAuthorityGroupAccess(studyInstanceUid, accessionNumber, assignedGroups); } return(true); }
private void AuditLog(Study affectedStudy) { // Audit log DicomStudyDeletedAuditHelper helper = new DicomStudyDeletedAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success); helper.AddUserParticipant(new AuditPersonActiveParticipant( SessionManager.Current.Credentials. UserName, null, SessionManager.Current.Credentials. DisplayName)); helper.AddStudyParticipantObject(new AuditStudyParticipantObject( affectedStudy.StudyInstanceUid, affectedStudy.AccessionNumber ?? string.Empty)); ServerAuditHelper.LogAuditMessage(helper); }
private void StartScp(DicomScp <DicomScpContext> listener, List <DicomScp <DicomScpContext> > list) { if (listener.Start()) { list.Add(listener); var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStarted, new AuditProcessActiveParticipant(listener.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); } else { var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.MajorFailureActionMadeUnavailable, ApplicationActivityType.ApplicationStarted, new AuditProcessActiveParticipant(listener.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); Platform.Log(LogLevel.Error, "Unable to add {1} SCP handler for server partition {0}", listener.Context.Partition.Description, listener.ListenAddress.AddressFamily == AddressFamily.InterNetworkV6 ? "IPv6" : "IPv4"); Platform.Log(LogLevel.Error, "Partition {0} will not accept IPv6 incoming DICOM associations.", listener.Context.Partition.Description); ServerPlatform.Alert(AlertCategory.Application, AlertLevel.Critical, "DICOM Listener", AlertTypeCodes.UnableToStart, null, TimeSpan.Zero, "Unable to start {2} DICOM listener on {0} : {1}", listener.AeTitle, listener.ListenPort, listener.ListenAddress.AddressFamily == AddressFamily.InterNetworkV6 ? "IPv6" : "IPv4"); } }
/// <summary> /// Method called when stopping the DICOM SCP. /// </summary> protected override void Stop() { //TODO CR (Jan 2014): Move this into the base if it applies to all subclasses? PersistentStoreRegistry.GetDefaultStore().ShutdownRequested = true; lock (_syncLock) { if (_changedEvent == null) { return; } ServerPartitionMonitor.Instance.Changed -= _changedEvent; foreach (DicomScp <DicomScpContext> scp in _listenerList) { scp.Stop(); var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(scp.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); } foreach (DicomScp <DicomScpContext> scp in _alternateAeListenerList) { scp.Stop(); var helper = new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(scp.AeTitle)); ServerAuditHelper.LogAuditMessage(helper); } } }
private void RemoveDisabledAlternateAes() { var alternateAeScpsToDelete = new List <DicomScp <DicomScpContext> >(); // Now search for any alternate AEs that are disabled/missing foreach (DicomScp <DicomScpContext> alternateAeScp in _alternateAeListenerList) { bool bFound = false; foreach (ServerPartitionAlternateAeTitle altAe in _alternateAes) { if (altAe.Port == alternateAeScp.ListenPort && altAe.AeTitle.Equals(alternateAeScp.AeTitle) && altAe.Enabled && (altAe.AllowKOPR || altAe.AllowQuery || altAe.AllowRetrieve || altAe.AllowStorage)) { bFound = true; break; } } if (!bFound) { Platform.Log(LogLevel.Info, "Shutting down Alternate AE listener {0}:{1}", alternateAeScp.AeTitle, alternateAeScp.ListenPort); alternateAeScp.Stop(); alternateAeScpsToDelete.Add(alternateAeScp); ServerAuditHelper.LogAuditMessage(new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(alternateAeScp.AeTitle))); } } foreach (DicomScp <DicomScpContext> scp in alternateAeScpsToDelete) { _alternateAeListenerList.Remove(scp); } }
public static void InstancesTransferredAuditLogger(DicomScpContext context, ServerAssociationParameters assocParams, List <StorageInstance> instances) { Dictionary <string, AuditPatientParticipantObject> list = new Dictionary <string, AuditPatientParticipantObject>(); foreach (StorageInstance instance in instances) { string key = instance.PatientId + instance.PatientsName; if (!list.ContainsKey(key)) { AuditPatientParticipantObject patient = new AuditPatientParticipantObject(instance.PatientsName, instance.PatientId); list.Add(key, patient); } } foreach (AuditPatientParticipantObject patient in list.Values) { // Audit Log DicomInstancesTransferredAuditHelper helper = new DicomInstancesTransferredAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, EventIdentificationContentsEventActionCode.E, assocParams); foreach (StorageInstance instance in instances) { if (patient.PatientId.Equals(instance.PatientId) && patient.PatientsName.Equals(instance.PatientsName)) { helper.AddStorageInstance(instance); } } ServerAuditHelper.LogAuditMessage(helper); } }
protected virtual void OnStudyDeleted() { // Audit log DicomStudyDeletedAuditHelper helper = new DicomStudyDeletedAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success); helper.AddUserParticipant(new AuditProcessActiveParticipant(ServerPartition.AeTitle)); helper.AddStudyParticipantObject(new AuditStudyParticipantObject( StorageLocation.StudyInstanceUid, Study == null ? string.Empty : Study.AccessionNumber)); ServerAuditHelper.LogAuditMessage(helper); IList <IDeleteStudyProcessorExtension> extensions = LoadExtensions(); foreach (IDeleteStudyProcessorExtension ext in extensions) { if (ext.Enabled) { ext.OnStudyDeleted(); } } }
protected void LoginClicked(object sender, EventArgs e) { if (SessionManager.Current != null) { // already logged in. Maybe from different page RedirectAfterLogin(); } try { SessionManager.InitializeSession(UserName.Text, Password.Text, ApplicationName ?? ImageServerConstants.DefaultApplicationName); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, SessionManager.Current.Credentials.DisplayName)); ServerAuditHelper.LogAuditMessage(audit); } catch (PasswordExpiredException) { Platform.Log(LogLevel.Info, "Password for {0} has expired. Requesting new password.", UserName.Text); PasswordExpiredDialog.Show(UserName.Text, Password.Text); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, null)); ServerAuditHelper.LogAuditMessage(audit); } catch (UserAccessDeniedException ex) { Platform.Log(LogLevel.Warn, "Login unsuccessful for {0}. {1}", UserName.Text, ErrorMessages.UserAccessDenied); Platform.Log(LogLevel.Debug, ex, ex.Message); ShowError(ErrorMessages.UserAccessDenied); UserName.Focus(); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.SeriousFailureActionTerminated, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, null)); ServerAuditHelper.LogAuditMessage(audit); } catch (CommunicationException ex) { Platform.Log(LogLevel.Error, ex, "Unable to contact A/A server"); ShowError(ErrorMessages.CannotContactEnterpriseServer); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.MajorFailureActionMadeUnavailable, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, null)); ServerAuditHelper.LogAuditMessage(audit); } catch (ArgumentException ex) { Platform.Log(LogLevel.Warn, ex.Message); Platform.Log(LogLevel.Debug, ex, "Login error:"); ShowError(ex.Message); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.MajorFailureActionMadeUnavailable, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, null)); ServerAuditHelper.LogAuditMessage(audit); } catch (Exception ex) { Platform.Log(LogLevel.Error, ex, "Login error:"); ShowError(ex.Message); UserAuthenticationAuditHelper audit = new UserAuthenticationAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.MajorFailureActionMadeUnavailable, UserAuthenticationEventType.Login); audit.AddUserParticipant(new AuditPersonActiveParticipant(UserName.Text, null, null)); ServerAuditHelper.LogAuditMessage(audit); } }
private void RemoveDisabledPartitions() { var scpsToDelete = new List <DicomScp <DicomScpContext> >(); var alternateAeScpsToDelete = new List <DicomScp <DicomScpContext> >(); // First, search for removed ServerPartitions, then remove all related ServerPartitionAlternateAeTitles foreach (DicomScp <DicomScpContext> scp in _listenerList) { bool bFound = false; foreach (ServerPartition part in _partitions) { if (part.Port == scp.ListenPort && part.AeTitle.Equals(scp.AeTitle) && part.Enabled) { bFound = true; break; } } if (!bFound) { Platform.Log(LogLevel.Info, "Partition was deleted, shutting down listener {0}:{1}", scp.AeTitle, scp.ListenPort); scp.Stop(); scpsToDelete.Add(scp); ServerAuditHelper.LogAuditMessage(new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(scp.AeTitle))); // Cleanup any alternate AEs for the partition foreach (DicomScp <DicomScpContext> alternateAeScp in _alternateAeListenerList) { if (scp.Context.Partition.Key.Equals(alternateAeScp.Context.AlternateAeTitle.ServerPartitionKey)) { Platform.Log(LogLevel.Info, "Partition was deleted, shutting down Alternate AE listener {0}:{1}", alternateAeScp.AeTitle, alternateAeScp.ListenPort); alternateAeScp.Stop(); alternateAeScpsToDelete.Add(alternateAeScp); ServerAuditHelper.LogAuditMessage(new ApplicationActivityAuditHelper( ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, ApplicationActivityType.ApplicationStopped, new AuditProcessActiveParticipant(alternateAeScp.AeTitle))); } } } } foreach (DicomScp <DicomScpContext> scp in scpsToDelete) { _listenerList.Remove(scp); } foreach (DicomScp <DicomScpContext> scp in alternateAeScpsToDelete) { _alternateAeListenerList.Remove(scp); } }
protected void SearchButton_Click(object sender, ImageClickEventArgs e) { if (DisplaySearchWarning) { StudyListGridView.DataBindOnPreRender = false; ConfirmStudySearchMessageBox.Message = SR.NoFiltersSearchWarning; ConfirmStudySearchMessageBox.MessageStyle = "font-weight: bold; color: #205F87;"; ConfirmStudySearchMessageBox.Show(); } else { StudyListGridView.Refresh(); } var sb = new StringBuilder(); if (!String.IsNullOrEmpty(PatientId.TrimText)) { sb.AppendFormat("PatientId={0};", PatientId.TrimText); } if (!String.IsNullOrEmpty(PatientName.TrimText)) { sb.AppendFormat("PatientsName={0};", PatientName.TrimText); } if (!String.IsNullOrEmpty(AccessionNumber.TrimText)) { sb.AppendFormat("AccessionNumber={0};", AccessionNumber.TrimText); } if (!String.IsNullOrEmpty(ToStudyDate.Text) || !String.IsNullOrEmpty(FromStudyDate.Text)) { sb.AppendFormat("StudyDate={0}-{1};", FromStudyDate.Text, ToStudyDate.Text); } if (!String.IsNullOrEmpty(StudyDescription.TrimText)) { sb.AppendFormat("StudyDescription={0};", StudyDescription.TrimText); } if (ModalityListBox.SelectedIndex < 0) { bool first = true; foreach (ListItem item in ModalityListBox.Items) { if (!item.Selected) { continue; } if (first) { sb.AppendFormat("ModalitiesInStudy={0}", item.Value); first = false; } else { sb.AppendFormat(",{0}", item.Value); } } if (!first) { sb.Append(';'); } } var helper = new QueryAuditHelper(ServerPlatform.AuditSource, EventIdentificationContentsEventOutcomeIndicator.Success, new AuditPersonActiveParticipant(SessionManager.Current.Credentials.UserName, null, SessionManager.Current.Credentials.DisplayName), ServerPartition.AeTitle, ServerPlatform.HostId, sb.ToString()); ServerAuditHelper.LogAuditMessage(helper); }
public bool UpdateStudyAuthorityGroups(string studyInstanceUid, string accessionNumber, ServerEntityKey studyStorageKey, IList <string> assignedGroupOids) { List <AuthorityGroupDetail> nonAddedAuthorityGroups; Dictionary <ServerEntityKey, AuthorityGroupDetail> dic = LoadAuthorityGroups(out nonAddedAuthorityGroups); IList <AuthorityGroupStudyAccessInfo> assignedList = ListDataAccessGroupsForStudy(dic, studyStorageKey); List <string> groupList = new List <string>(); foreach (AuthorityGroupStudyAccessInfo group in assignedList) { bool found = false; foreach (var oid in assignedGroupOids) { if (group.AuthorityOID.Equals(oid)) { found = true; break; } } if (!found) { using (IUpdateContext update = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { IStudyDataAccessEntityBroker broker = update.GetBroker <IStudyDataAccessEntityBroker>(); broker.Delete(group.StudyDataAccess.Key); update.Commit(); } groupList.Add(group.Description); } } if (groupList.Count > 0) { ServerAuditHelper.RemoveAuthorityGroupAccess(studyInstanceUid, accessionNumber, groupList); groupList.Clear(); } foreach (var oid in assignedGroupOids) { bool found = false; foreach (AuthorityGroupStudyAccessInfo group in assignedList) { if (group.AuthorityOID.Equals(oid)) { found = true; break; } } if (!found) { DataAccessGroup accessGroup = AddDataAccessIfNotExists(oid); using (IUpdateContext updateContext = PersistentStoreRegistry.GetDefaultStore().OpenUpdateContext(UpdateContextSyncMode.Flush)) { StudyDataAccessUpdateColumns insertColumns = new StudyDataAccessUpdateColumns { DataAccessGroupKey = accessGroup.Key, StudyStorageKey = studyStorageKey }; IStudyDataAccessEntityBroker insert = updateContext.GetBroker <IStudyDataAccessEntityBroker>(); insert.Insert(insertColumns); updateContext.Commit(); } foreach (AuthorityGroupDetail group in nonAddedAuthorityGroups) { if (group.AuthorityGroupRef.ToString(false, false).Equals(accessGroup.AuthorityGroupOID.Key.ToString())) { groupList.Add(group.Name); } } } } if (groupList.Count > 0) { ServerAuditHelper.AddAuthorityGroupAccess(studyInstanceUid, accessionNumber, groupList); } return(true); }