Mercurial > hg > orthanc-authorization
annotate Plugin/AuthorizationParserBase.cpp @ 142:8c86b459b3a5
fix news
author | Alain Mazy <am@osimis.io> |
---|---|
date | Wed, 20 Dec 2023 14:55:16 +0100 |
parents | f448e8626f1a |
children | 9be1ee2b8fe1 |
rev | line source |
---|---|
1 | 1 /** |
2 * Advanced authorization plugin for Orthanc | |
68 | 3 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
1 | 4 * |
5 * This program is free software: you can redistribute it and/or | |
6 * modify it under the terms of the GNU Affero General Public License | |
7 * as published by the Free Software Foundation, either version 3 of | |
8 * the License, or (at your option) any later version. | |
9 * | |
10 * This program is distributed in the hope that it will be useful, but | |
11 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Affero General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Affero General Public License | |
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 **/ | |
18 | |
19 #include "AuthorizationParserBase.h" | |
20 | |
32 | 21 #include <OrthancException.h> |
1 | 22 |
23 namespace OrthancPlugins | |
24 { | |
25 void AuthorizationParserBase::AddResourceInternal(AccessedResources& target, | |
26 Orthanc::ResourceType level, | |
109 | 27 const std::string& orthancId, |
28 const std::set<std::string>& labels) | |
1 | 29 { |
30 std::string dicomUid; | |
31 | |
32 if (resourceHierarchy_->LookupDicomUid(dicomUid, level, orthancId)) | |
33 { | |
109 | 34 target.push_back(AccessedResource(level, orthancId, dicomUid, labels)); |
1 | 35 } |
36 } | |
37 | |
38 | |
138
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
39 Orthanc::ResourceType AuthorizationParserBase::AddOrthancUnknownResource(AccessedResources& target, |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
40 const std::string& orthancId) |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
41 { |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
42 std::string dicomId; |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
43 if (resourceHierarchy_->LookupDicomUid(dicomId, Orthanc::ResourceType_Study, orthancId)) |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
44 { |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
45 AddOrthancStudy(target, orthancId); |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
46 return Orthanc::ResourceType_Study; |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
47 } |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
48 |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
49 if (resourceHierarchy_->LookupDicomUid(dicomId, Orthanc::ResourceType_Patient, orthancId)) |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
50 { |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
51 AddOrthancPatient(target, orthancId); |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
52 return Orthanc::ResourceType_Patient; |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
53 } |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
54 |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
55 if (resourceHierarchy_->LookupDicomUid(dicomId, Orthanc::ResourceType_Series, orthancId)) |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
56 { |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
57 AddOrthancSeries(target, orthancId); |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
58 return Orthanc::ResourceType_Series; |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
59 } |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
60 |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
61 if (resourceHierarchy_->LookupDicomUid(dicomId, Orthanc::ResourceType_Instance, orthancId)) |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
62 { |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
63 AddOrthancInstance(target, orthancId); |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
64 return Orthanc::ResourceType_Instance; |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
65 } |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
66 |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
67 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
68 } |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
69 |
f448e8626f1a
Now handling new GET /tools/create-archive and sibling routes
Alain Mazy <am@osimis.io>
parents:
109
diff
changeset
|
70 |
1 | 71 void AuthorizationParserBase::AddOrthancInstance(AccessedResources& target, |
72 const std::string& orthancId) | |
73 { | |
74 std::string patient, study, series; | |
75 if (!resourceHierarchy_->LookupInstance(patient, study, series, orthancId)) | |
76 { | |
77 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
78 } | |
79 | |
109 | 80 std::set<std::string> labels; |
81 | |
82 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, patient)); | |
83 AddResourceInternal(target, Orthanc::ResourceType_Patient, patient, labels); | |
84 | |
85 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Study, study)); | |
86 AddResourceInternal(target, Orthanc::ResourceType_Study, study, labels); | |
87 | |
88 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Series, series)); | |
89 AddResourceInternal(target, Orthanc::ResourceType_Series, series, labels); | |
90 | |
91 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Instance, orthancId)); | |
92 AddResourceInternal(target, Orthanc::ResourceType_Instance, orthancId, labels); | |
1 | 93 } |
94 | |
95 | |
96 void AuthorizationParserBase::AddOrthancSeries(AccessedResources& target, | |
97 const std::string& orthancId) | |
98 { | |
99 std::string patient, study; | |
100 if (!resourceHierarchy_->LookupSeries(patient, study, orthancId)) | |
101 { | |
102 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
103 } | |
104 | |
109 | 105 std::set<std::string> labels; |
106 | |
107 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, patient)); | |
108 AddResourceInternal(target, Orthanc::ResourceType_Patient, patient, labels); | |
109 | |
110 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Study, study)); | |
111 AddResourceInternal(target, Orthanc::ResourceType_Study, study, labels); | |
112 | |
113 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Series, orthancId)); | |
114 AddResourceInternal(target, Orthanc::ResourceType_Series, orthancId, labels); | |
1 | 115 } |
116 | |
117 | |
118 void AuthorizationParserBase::AddOrthancStudy(AccessedResources& target, | |
119 const std::string& orthancId) | |
120 { | |
121 std::string patient; | |
122 if (!resourceHierarchy_->LookupStudy(patient, orthancId)) | |
123 { | |
124 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
125 } | |
126 | |
109 | 127 std::set<std::string> labels; |
128 | |
129 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, patient)); | |
130 AddResourceInternal(target, Orthanc::ResourceType_Patient, patient, labels); | |
131 | |
132 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Study, orthancId)); | |
133 AddResourceInternal(target, Orthanc::ResourceType_Study, orthancId, labels); | |
1 | 134 } |
135 | |
136 | |
137 void AuthorizationParserBase::AddOrthancPatient(AccessedResources& target, | |
138 const std::string& orthancId) | |
139 { | |
109 | 140 std::set<std::string> labels; |
141 | |
142 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, orthancId)); | |
143 AddResourceInternal(target, Orthanc::ResourceType_Patient, orthancId, labels); | |
1 | 144 } |
145 | |
146 | |
147 void AuthorizationParserBase::AddDicomStudy(AccessedResources& target, | |
148 const std::string& studyDicomUid) | |
149 { | |
150 std::string patient, study; | |
151 | |
152 if (!resourceHierarchy_->LookupOrthancId(study, Orthanc::ResourceType_Study, studyDicomUid) || | |
153 !resourceHierarchy_->LookupStudy(patient, study)) | |
154 { | |
155 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
156 } | |
157 | |
109 | 158 std::set<std::string> labels; |
159 | |
160 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, patient)); | |
161 AddResourceInternal(target, Orthanc::ResourceType_Patient, patient, labels); | |
162 | |
163 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Study, study)); | |
164 target.push_back(AccessedResource(Orthanc::ResourceType_Study, study, studyDicomUid, labels)); | |
1 | 165 } |
166 | |
77
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
167 void AuthorizationParserBase::AddDicomPatient(AccessedResources& target, |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
168 const std::string& patientId) |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
169 { |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
170 std::string patient; |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
171 |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
172 if (!resourceHierarchy_->LookupOrthancId(patient, Orthanc::ResourceType_Patient, patientId)) |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
173 { |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
174 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
175 } |
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
176 |
109 | 177 std::set<std::string> labels; |
178 | |
179 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Patient, patient)); | |
180 AddResourceInternal(target, Orthanc::ResourceType_Patient, patient, labels); | |
77
94a9484d7f8f
fix security issues allowing to browse remote dicom servers + introduced UnitTests
Alain Mazy <am@osimis.io>
parents:
68
diff
changeset
|
181 } |
1 | 182 |
183 void AuthorizationParserBase::AddDicomSeries(AccessedResources& target, | |
184 const std::string& studyDicomUid, | |
185 const std::string& seriesDicomUid) | |
186 { | |
187 std::string series; | |
188 | |
189 if (!resourceHierarchy_->LookupOrthancId(series, Orthanc::ResourceType_Series, seriesDicomUid)) | |
190 { | |
191 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
192 } | |
193 | |
109 | 194 std::set<std::string> labels; |
195 | |
1 | 196 AddDicomStudy(target, studyDicomUid); |
109 | 197 |
198 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Series, series)); | |
199 target.push_back(AccessedResource(Orthanc::ResourceType_Series, series, seriesDicomUid, labels)); | |
1 | 200 } |
201 | |
202 | |
203 void AuthorizationParserBase::AddDicomInstance(AccessedResources& target, | |
204 const std::string& studyDicomUid, | |
205 const std::string& seriesDicomUid, | |
206 const std::string& instanceDicomUid) | |
207 { | |
208 std::string instance; | |
209 | |
210 if (!resourceHierarchy_->LookupOrthancId | |
211 (instance, Orthanc::ResourceType_Instance, instanceDicomUid)) | |
212 { | |
213 throw Orthanc::OrthancException(Orthanc::ErrorCode_UnknownResource); | |
214 } | |
215 | |
109 | 216 std::set<std::string> labels; |
217 | |
1 | 218 AddDicomSeries(target, studyDicomUid, seriesDicomUid); |
109 | 219 |
220 resourceHierarchy_->GetLabels(labels, OrthancResource(Orthanc::ResourceType_Instance, instance)); | |
221 target.push_back(AccessedResource(Orthanc::ResourceType_Instance, instance, instanceDicomUid, labels)); | |
1 | 222 } |
223 | |
224 | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
225 AuthorizationParserBase::AuthorizationParserBase(ICacheFactory& factory) |
1 | 226 { |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
22
diff
changeset
|
227 resourceHierarchy_.reset(new ResourceHierarchyCache(factory)); |
1 | 228 |
229 if (resourceHierarchy_.get() == NULL) | |
230 { | |
231 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
232 } | |
233 } | |
234 } | |
235 |