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