PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
xds_audit_events.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
40#ifndef PACS_SECURITY_XDS_AUDIT_EVENTS_HPP
41#define PACS_SECURITY_XDS_AUDIT_EVENTS_HPP
42
44
45#include <memory>
46#include <string>
47#include <vector>
48
49namespace kcenon::pacs::security {
50
51class atna_service_auditor;
52
61struct xds_iti41_event {
62 std::string source_id;
63 std::string destination_endpoint;
64 std::string patient_id;
65 std::string submission_set_unique_id;
66 std::vector<std::string> document_unique_ids;
67 atna_event_outcome outcome{atna_event_outcome::success};
68 std::string failure_description;
69};
70
74struct xds_iti43_event {
75 std::string consumer_id;
76 std::string source_endpoint;
77 std::string document_unique_id;
78 std::string repository_unique_id;
79 atna_event_outcome outcome{atna_event_outcome::success};
80 std::string failure_description;
81};
82
90struct xds_iti18_event {
91 enum class kind : std::uint8_t {
94 };
95
96 std::string querier_id;
97 std::string registry_endpoint;
98 kind query_kind{kind::find_documents};
99 std::string patient_id;
100 std::vector<std::string> document_uuids;
101 atna_event_outcome outcome{atna_event_outcome::success};
102 std::string failure_description;
103};
104
119class xds_audit_sink {
120public:
121 virtual ~xds_audit_sink() = default;
122
123 virtual void on_iti41_submit(const xds_iti41_event& e) = 0;
124 virtual void on_iti43_retrieve(const xds_iti43_event& e) = 0;
125 virtual void on_iti18_query(const xds_iti18_event& e) = 0;
126};
127
136[[nodiscard]] std::shared_ptr<xds_audit_sink> make_null_xds_audit_sink();
137
154[[nodiscard]] std::shared_ptr<xds_audit_sink> make_atna_xds_audit_sink(
155 atna_service_auditor& auditor, std::string local_participant_id);
156
170class recording_xds_audit_sink : public xds_audit_sink {
171public:
172 struct captured_event {
173 enum class kind : std::uint8_t { iti41, iti43, iti18 };
174 kind k{kind::iti41};
175 xds_iti41_event iti41;
176 xds_iti43_event iti43;
177 xds_iti18_event iti18;
178 };
179
180 void on_iti41_submit(const xds_iti41_event& e) override;
181 void on_iti43_retrieve(const xds_iti43_event& e) override;
182 void on_iti18_query(const xds_iti18_event& e) override;
183
184 [[nodiscard]] const std::vector<captured_event>& events() const noexcept;
185 void clear() noexcept;
186
187private:
188 std::vector<captured_event> events_;
189};
190
191// =============================================================================
192// Message-Build Helpers (testing surface)
193// =============================================================================
194
210[[nodiscard]] atna_audit_message build_iti41_audit_message(
211 const std::string& audit_source_id, const xds_iti41_event& event,
212 const std::string& local_participant_id = "");
213[[nodiscard]] atna_audit_message build_iti43_audit_message(
214 const std::string& audit_source_id, const xds_iti43_event& event,
215 const std::string& local_participant_id = "");
216[[nodiscard]] atna_audit_message build_iti18_audit_message(
217 const std::string& audit_source_id, const xds_iti18_event& event,
218 const std::string& local_participant_id = "");
219
220} // namespace kcenon::pacs::security
221
222#endif // PACS_SECURITY_XDS_AUDIT_EVENTS_HPP
IHE ATNA-compliant audit message generator (RFC 3881 XML format)
constexpr dicom_tag patient_id
Patient ID.
std::shared_ptr< xds_audit_sink > make_null_xds_audit_sink()
std::shared_ptr< xds_audit_sink > make_atna_xds_audit_sink(atna_service_auditor &auditor, std::string local_participant_id)
atna_event_outcome
Outcome of the audited event.