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;
+    }        
+  }
+}