changeset 6241:54c8e2398c94

provide GET arguments to HTTP authentication callback
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 11 Jul 2025 10:00:55 +0200
parents a6c9451fbade
children 67f9625abb90
files OrthancFramework/Sources/HttpServer/HttpServer.cpp OrthancFramework/Sources/HttpServer/IIncomingHttpRequestFilter.h OrthancServer/Plugins/Engine/OrthancPlugins.cpp OrthancServer/Plugins/Engine/OrthancPlugins.h OrthancServer/Plugins/Include/orthanc/OrthancCPlugin.h OrthancServer/Sources/main.cpp
diffstat 6 files changed, 32 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/OrthancFramework/Sources/HttpServer/HttpServer.cpp	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancFramework/Sources/HttpServer/HttpServer.cpp	Fri Jul 11 10:00:55 2025 +0200
@@ -1283,7 +1283,7 @@
     }
     else
     {
-      status = filter->CheckAuthentication(authenticationPayload, redirection, requestUri, headers);
+      status = filter->CheckAuthentication(authenticationPayload, redirection, requestUri, argumentsGET, headers);
     }
 
     switch (status)
--- a/OrthancFramework/Sources/HttpServer/IIncomingHttpRequestFilter.h	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancFramework/Sources/HttpServer/IIncomingHttpRequestFilter.h	Fri Jul 11 10:00:55 2025 +0200
@@ -50,6 +50,7 @@
     virtual AuthenticationStatus CheckAuthentication(std::string& customPayload /* out: payload to provide to "IsAllowed()" */,
                                                      std::string& redirection   /* out: path relative to the root */,
                                                      const std::string& uri,
+                                                     const HttpToolbox::GetArguments& getArguments,
                                                      const HttpToolbox::Arguments& httpHeaders) const = 0;
     
     // This method corresponds to HTTP authorization
--- a/OrthancServer/Plugins/Engine/OrthancPlugins.cpp	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancServer/Plugins/Engine/OrthancPlugins.cpp	Fri Jul 11 10:00:55 2025 +0200
@@ -2355,6 +2355,11 @@
                                 std::vector<const char*>& values,
                                 const HttpToolbox::Arguments& arguments)
   {
+    if (static_cast<uint32_t>(arguments.size()) != arguments.size())
+    {
+      throw OrthancException(ErrorCode_NotEnoughMemory);
+    }
+
     keys.resize(arguments.size());
     values.resize(arguments.size());
 
@@ -2366,6 +2371,8 @@
       values[pos] = it->second.c_str();
       pos++;
     }
+
+    assert(pos == arguments.size());
   }
 
 
@@ -2373,6 +2380,11 @@
                                 std::vector<const char*>& values,
                                 const HttpToolbox::GetArguments& arguments)
   {
+    if (static_cast<uint32_t>(arguments.size()) != arguments.size())
+    {
+      throw OrthancException(ErrorCode_NotEnoughMemory);
+    }
+
     keys.resize(arguments.size());
     values.resize(arguments.size());
 
@@ -6862,6 +6874,7 @@
     std::string& customPayload,
     std::string& redirection,
     const std::string& uri,
+    const HttpToolbox::GetArguments& getArguments,
     const HttpToolbox::Arguments& httpHeaders) const
   {
     boost::shared_lock<boost::shared_mutex> lock(pimpl_->incomingHttpRequestFilterMutex_);
@@ -6872,27 +6885,19 @@
     }
     else
     {
-      std::vector<const char*> keys, values;
-      keys.resize(httpHeaders.size());
-      values.resize(httpHeaders.size());
-
-      uint32_t i = 0;
-      for (HttpToolbox::Arguments::const_iterator it = httpHeaders.begin(); it != httpHeaders.end(); ++it)
-      {
-        keys[i] = it->first.c_str();
-        values[i] = it->second.c_str();
-        i++;
-      }
-
-      assert(i == httpHeaders.size());
+      std::vector<const char*> headersKeys, headersValues;
+      ArgumentsToPlugin(headersKeys, headersValues, httpHeaders);
+
+      std::vector<const char*> getKeys, getValues;
+      ArgumentsToPlugin(getKeys, getValues, getArguments);
 
       OrthancPluginHttpAuthenticationStatus status = OrthancPluginHttpAuthenticationStatus_Unauthorized;
       PluginMemoryBuffer32 payloadBuffer;
       PluginMemoryBuffer32 redirectionBuffer;
       OrthancPluginErrorCode code = pimpl_->httpAuthentication_(
-        &status, payloadBuffer.GetObject(), redirectionBuffer.GetObject(), uri.c_str(), i,
-        keys.empty() ? NULL : &keys[0],
-        values.empty() ? NULL : &values[0]);
+        &status, payloadBuffer.GetObject(), redirectionBuffer.GetObject(), uri.c_str(),
+        getKeys.size(), getKeys.empty() ? NULL : &getKeys[0], getValues.empty() ? NULL : &getValues[0],
+        headersKeys.size(), headersKeys.empty() ? NULL : &headersKeys[0], headersValues.empty() ? NULL : &headersValues[0]);
 
       if (code != OrthancPluginErrorCode_Success)
       {
--- a/OrthancServer/Plugins/Engine/OrthancPlugins.h	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancServer/Plugins/Engine/OrthancPlugins.h	Fri Jul 11 10:00:55 2025 +0200
@@ -424,6 +424,7 @@
       std::string& customPayload,
       std::string& redirection,
       const std::string& uri,
+      const HttpToolbox::GetArguments& getArguments,
       const HttpToolbox::Arguments& httpHeaders) const;
   };
 }
--- a/OrthancServer/Plugins/Include/orthanc/OrthancCPlugin.h	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancServer/Plugins/Include/orthanc/OrthancCPlugin.h	Fri Jul 11 10:00:55 2025 +0200
@@ -10391,6 +10391,9 @@
    * a buffer filled with the path where to redirect the user (typically, a login page).
    * The path is relative to the root of the Web server of Orthanc.
    * @param uri The URI of interest (without the possible GET arguments).
+   * @param getCount For a GET request, the number of GET parameters.
+   * @param getKeys For a GET request, the keys of the GET parameters.
+   * @param getValues For a GET request, the values of the GET parameters.
    * @param headersCount The number of HTTP headers.
    * @param headersKeys The keys of the HTTP headers (always converted to low-case).
    * @param headersValues The values of the HTTP headers.
@@ -10402,6 +10405,9 @@
     OrthancPluginMemoryBuffer*              customPayload,  /* out */
     OrthancPluginMemoryBuffer*              redirection,    /* out */
     const char*                             uri,
+    uint32_t                                getCount,
+    const char* const*                      getKeys,
+    const char* const*                      getValues,
     uint32_t                                headersCount,
     const char* const*                      headersKeys,
     const char* const*                      headersValues);
--- a/OrthancServer/Sources/main.cpp	Fri Jul 11 09:41:19 2025 +0200
+++ b/OrthancServer/Sources/main.cpp	Fri Jul 11 10:00:55 2025 +0200
@@ -608,12 +608,13 @@
   virtual AuthenticationStatus CheckAuthentication(std::string& customPayload,
                                                    std::string& redirection,
                                                    const std::string& uri,
+                                                   const HttpToolbox::GetArguments& getArguments,
                                                    const HttpToolbox::Arguments& httpHeaders) const ORTHANC_OVERRIDE
   {
 #if ORTHANC_ENABLE_PLUGINS == 1
     if (plugins_ != NULL)
     {
-      return plugins_->CheckAuthentication(customPayload, redirection, uri, httpHeaders);
+      return plugins_->CheckAuthentication(customPayload, redirection, uri, getArguments, httpHeaders);
     }
 #endif