Mercurial > hg > orthanc-authorization
diff Plugin/DefaultAuthorizationParser.cpp @ 1:d5d3cb00556a
initial release
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 22 Mar 2017 16:13:52 +0100 |
parents | |
children | 544732bbd87b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Plugin/DefaultAuthorizationParser.cpp Wed Mar 22 16:13:52 2017 +0100 @@ -0,0 +1,129 @@ +/** + * Advanced authorization plugin for Orthanc + * Copyright (C) 2017 Osimis, Belgium + * + * This program is free software: you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + **/ + +#include "DefaultAuthorizationParser.h" + +#include "../Resources/Orthanc/Core/OrthancException.h" + +namespace OrthancPlugins +{ + DefaultAuthorizationParser::DefaultAuthorizationParser(OrthancPluginContext* context, + ICacheFactory& factory, + const std::string& dicomWebRoot) : + AuthorizationParserBase(context, factory), + resourcesPattern_("^/(patients|studies|series|instances)/([a-f0-9-]+)(|/.*)$"), + seriesPattern_("^/(web-viewer/series|web-viewer/is-stable-series|wsi/pyramids|wsi/tiles)/([a-f0-9-]+)(|/.*)$"), + instancesPattern_("^/web-viewer/instances/[a-z0-9]+-([a-f0-9-]+)_[0-9]+$") + { + std::string tmp = dicomWebRoot; + while (!tmp.empty() && + tmp[tmp.size() - 1] == '/') + { + tmp = tmp.substr(0, tmp.size() - 1); + } + + dicomWebStudies_ = boost::regex( + "^" + tmp + "/studies/([.0-9]+)(|/series)(|/)$"); + + dicomWebSeries_ = boost::regex( + "^" + tmp + "/studies/([.0-9]+)/series/([.0-9]+)(|/instances)(|/)$"); + + dicomWebInstances_ = boost::regex( + "^" + tmp + "/studies/([.0-9]+)/series/([.0-9]+)/instances/([.0-9]+)(|/|/frames/.*)$"); + } + + + bool DefaultAuthorizationParser::Parse(AccessedResources& target, + const std::string& uri) + { + // The mutex below should not be necessary, but we prefer to + // ensure thread safety in boost::regex + boost::mutex::scoped_lock lock(mutex_); + + boost::smatch what; + + if (boost::regex_match(uri, what, resourcesPattern_)) + { + AccessLevel level = StringToAccessLevel(what[1]); + + switch (level) + { + case AccessLevel_Instance: + AddOrthancInstance(target, what[2]); + break; + + case AccessLevel_Series: + AddOrthancSeries(target, what[2]); + break; + + case AccessLevel_Study: + AddOrthancStudy(target, what[2]); + break; + + case AccessLevel_Patient: + AddOrthancPatient(target, what[2]); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + + return true; + } + else if (boost::regex_match(uri, what, seriesPattern_)) + { + AddOrthancSeries(target, what[2]); + return true; + } + else if (boost::regex_match(uri, what, instancesPattern_)) + { + AddOrthancInstance(target, what[1]); + return true; + } + else if (boost::regex_match(uri, what, dicomWebStudies_)) + { + AddDicomStudy(target, what[1]); + return true; + } + else if (boost::regex_match(uri, what, dicomWebSeries_)) + { + AddDicomSeries(target, what[1], what[2]); + return true; + } + else if (boost::regex_match(uri, what, dicomWebInstances_)) + { + AddDicomInstance(target, what[1], what[2], what[3]); + return true; + } + else + { + // Unknown type of resource: Consider it as a system access + + // Remove the trailing slashes if need be + std::string s = uri; + while (!s.empty() && + s[s.length() - 1] == '/') + { + s = s.substr(0, s.length() - 1); + } + + target.push_back(AccessedResource(AccessLevel_System, s, "")); + return true; + } + } +}