diff --git a/arangod/RestServer/VocbaseContext.cpp b/arangod/RestServer/VocbaseContext.cpp index 393b30b8a0..8aaea9d906 100644 --- a/arangod/RestServer/VocbaseContext.cpp +++ b/arangod/RestServer/VocbaseContext.cpp @@ -96,12 +96,24 @@ bool VocbaseContext::useClusterAuthentication () const { return false; } +//////////////////////////////////////////////////////////////////////////////// +/// @brief return authentication realm +//////////////////////////////////////////////////////////////////////////////// + +char const* VocbaseContext::getRealm () const { + if (_vocbase == nullptr) { + return nullptr; + } + + return _vocbase->_name; +} + //////////////////////////////////////////////////////////////////////////////// /// @brief checks the authentication //////////////////////////////////////////////////////////////////////////////// HttpResponse::HttpResponseCode VocbaseContext::authenticate () { - TRI_ASSERT(_vocbase != 0); + TRI_ASSERT(_vocbase != nullptr); if (! _vocbase->_settings.requireAuthentication) { // no authentication required at all diff --git a/arangod/RestServer/VocbaseContext.h b/arangod/RestServer/VocbaseContext.h index c1f5796659..5a22836bad 100644 --- a/arangod/RestServer/VocbaseContext.h +++ b/arangod/RestServer/VocbaseContext.h @@ -96,6 +96,12 @@ namespace triagens { bool useClusterAuthentication () const; +//////////////////////////////////////////////////////////////////////////////// +/// @brief return authentication realm +//////////////////////////////////////////////////////////////////////////////// + + char const* getRealm () const; + //////////////////////////////////////////////////////////////////////////////// /// @brief checks the authentication //////////////////////////////////////////////////////////////////////////////// diff --git a/lib/HttpServer/HttpHandlerFactory.cpp b/lib/HttpServer/HttpHandlerFactory.cpp index 0d3614ac54..770ce7595f 100644 --- a/lib/HttpServer/HttpHandlerFactory.cpp +++ b/lib/HttpServer/HttpHandlerFactory.cpp @@ -206,7 +206,15 @@ bool HttpHandlerFactory::setRequestContext (HttpRequest* request) { /// @brief returns the authentication realm //////////////////////////////////////////////////////////////////////////////// -string const& HttpHandlerFactory::authenticationRealm (HttpRequest*) const { +string HttpHandlerFactory::authenticationRealm (HttpRequest* request) const { + auto context = request->getRequestContext(); + if (context != nullptr) { + auto realm = context->getRealm(); + + if (realm != nullptr) { + return _authenticationRealm + "/" + std::string(realm); + } + } return _authenticationRealm; } diff --git a/lib/HttpServer/HttpHandlerFactory.h b/lib/HttpServer/HttpHandlerFactory.h index 5e41e5383f..5976199a82 100644 --- a/lib/HttpServer/HttpHandlerFactory.h +++ b/lib/HttpServer/HttpHandlerFactory.h @@ -177,7 +177,7 @@ namespace triagens { /// @brief returns the authentication realm //////////////////////////////////////////////////////////////////////////////// - virtual std::string const& authenticationRealm (HttpRequest*) const; + virtual std::string authenticationRealm (HttpRequest*) const; //////////////////////////////////////////////////////////////////////////////// /// @brief creates a new request diff --git a/lib/Rest/RequestContext.h b/lib/Rest/RequestContext.h index 4306acb57e..dc9041d706 100644 --- a/lib/Rest/RequestContext.h +++ b/lib/Rest/RequestContext.h @@ -80,9 +80,15 @@ namespace triagens { //////////////////////////////////////////////////////////////////////////////// virtual RequestUser* getRequestUser () { - return 0; + return nullptr; } +//////////////////////////////////////////////////////////////////////////////// +/// @brief return authentication realm +//////////////////////////////////////////////////////////////////////////////// + + virtual char const* getRealm () const = 0; + //////////////////////////////////////////////////////////////////////////////// /// @brief authenticate user ////////////////////////////////////////////////////////////////////////////////