Mercurial > hg > orthanc-authorization
annotate Plugin/DefaultAuthorizationParser.cpp @ 31:c304ffca5d80
upgrade to year 2020
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 31 Jan 2020 17:51:30 +0100 |
parents | bc0431cb6b8f |
children | 79d871605ffd |
rev | line source |
---|---|
1 | 1 /** |
2 * Advanced authorization plugin for Orthanc | |
31
c304ffca5d80
upgrade to year 2020
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
29
diff
changeset
|
3 * Copyright (C) 2017-2020 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 "DefaultAuthorizationParser.h" | |
20 | |
22
c44013681a51
now using the Orthanc framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
11
diff
changeset
|
21 #include <Core/OrthancException.h> |
1 | 22 |
23 namespace OrthancPlugins | |
24 { | |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
25 DefaultAuthorizationParser::DefaultAuthorizationParser(ICacheFactory& factory, |
1 | 26 const std::string& dicomWebRoot) : |
29
bc0431cb6b8f
fix for compatibility with simplified OrthancPluginCppWrapper
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
28
diff
changeset
|
27 AuthorizationParserBase(factory), |
1 | 28 resourcesPattern_("^/(patients|studies|series|instances)/([a-f0-9-]+)(|/.*)$"), |
29 seriesPattern_("^/(web-viewer/series|web-viewer/is-stable-series|wsi/pyramids|wsi/tiles)/([a-f0-9-]+)(|/.*)$"), | |
11 | 30 instancesPattern_("^/web-viewer/instances/[a-z0-9]+-([a-f0-9-]+)_[0-9]+$"), |
31 osimisViewerSeries_("^/osimis-viewer/series/([a-f0-9-]+)(|/.*)$"), | |
28
ae19947abf68
Added support for Osimis Web Viewer new route (osimis-viewer/custom-command/)
am@osimis.io
parents:
22
diff
changeset
|
32 osimisViewerImages_("^/osimis-viewer/(images|custom-command)/([a-f0-9-]+)(|/.*)$"), |
11 | 33 osimisViewerStudies_("^/osimis-viewer/studies/([a-f0-9-]+)(|/.*)$") |
1 | 34 { |
35 std::string tmp = dicomWebRoot; | |
36 while (!tmp.empty() && | |
37 tmp[tmp.size() - 1] == '/') | |
38 { | |
39 tmp = tmp.substr(0, tmp.size() - 1); | |
40 } | |
41 | |
42 dicomWebStudies_ = boost::regex( | |
43 "^" + tmp + "/studies/([.0-9]+)(|/series)(|/)$"); | |
44 | |
45 dicomWebSeries_ = boost::regex( | |
46 "^" + tmp + "/studies/([.0-9]+)/series/([.0-9]+)(|/instances)(|/)$"); | |
47 | |
48 dicomWebInstances_ = boost::regex( | |
49 "^" + tmp + "/studies/([.0-9]+)/series/([.0-9]+)/instances/([.0-9]+)(|/|/frames/.*)$"); | |
50 } | |
51 | |
52 | |
53 bool DefaultAuthorizationParser::Parse(AccessedResources& target, | |
54 const std::string& uri) | |
55 { | |
56 // The mutex below should not be necessary, but we prefer to | |
57 // ensure thread safety in boost::regex | |
58 boost::mutex::scoped_lock lock(mutex_); | |
59 | |
60 boost::smatch what; | |
61 | |
62 if (boost::regex_match(uri, what, resourcesPattern_)) | |
63 { | |
64 AccessLevel level = StringToAccessLevel(what[1]); | |
65 | |
66 switch (level) | |
67 { | |
68 case AccessLevel_Instance: | |
69 AddOrthancInstance(target, what[2]); | |
70 break; | |
71 | |
72 case AccessLevel_Series: | |
73 AddOrthancSeries(target, what[2]); | |
74 break; | |
75 | |
76 case AccessLevel_Study: | |
77 AddOrthancStudy(target, what[2]); | |
78 break; | |
79 | |
80 case AccessLevel_Patient: | |
81 AddOrthancPatient(target, what[2]); | |
82 break; | |
83 | |
84 default: | |
85 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); | |
86 } | |
87 | |
88 return true; | |
89 } | |
90 else if (boost::regex_match(uri, what, seriesPattern_)) | |
91 { | |
92 AddOrthancSeries(target, what[2]); | |
93 return true; | |
94 } | |
95 else if (boost::regex_match(uri, what, instancesPattern_)) | |
96 { | |
97 AddOrthancInstance(target, what[1]); | |
98 return true; | |
99 } | |
100 else if (boost::regex_match(uri, what, dicomWebStudies_)) | |
101 { | |
102 AddDicomStudy(target, what[1]); | |
103 return true; | |
104 } | |
105 else if (boost::regex_match(uri, what, dicomWebSeries_)) | |
106 { | |
107 AddDicomSeries(target, what[1], what[2]); | |
108 return true; | |
109 } | |
110 else if (boost::regex_match(uri, what, dicomWebInstances_)) | |
111 { | |
112 AddDicomInstance(target, what[1], what[2], what[3]); | |
113 return true; | |
114 } | |
11 | 115 else if (boost::regex_match(uri, what, osimisViewerSeries_)) |
116 { | |
117 AddOrthancSeries(target, what[1]); | |
118 return true; | |
119 } | |
120 else if (boost::regex_match(uri, what, osimisViewerStudies_)) | |
121 { | |
122 AddOrthancStudy(target, what[1]); | |
123 return true; | |
124 } | |
125 else if (boost::regex_match(uri, what, osimisViewerImages_)) | |
126 { | |
127 AddOrthancInstance(target, what[1]); | |
128 return true; | |
129 } | |
1 | 130 else |
131 { | |
132 // Unknown type of resource: Consider it as a system access | |
133 | |
134 // Remove the trailing slashes if need be | |
135 std::string s = uri; | |
136 while (!s.empty() && | |
137 s[s.length() - 1] == '/') | |
138 { | |
139 s = s.substr(0, s.length() - 1); | |
140 } | |
141 | |
142 target.push_back(AccessedResource(AccessLevel_System, s, "")); | |
143 return true; | |
144 } | |
145 } | |
146 } |