1
0
Fork 0

added basic session and user management

This commit is contained in:
Frank Celler 2012-04-16 12:24:13 +02:00
parent 7840969b22
commit c76670ca08
24 changed files with 3998 additions and 20 deletions

View File

@ -628,6 +628,7 @@ INPUT = \
@srcdir@/RestHandler \
@srcdir@/RestServer \
@srcdir@/ShapedJson \
@srcdir@/UserManager \
@srcdir@/V8 \
@srcdir@/VocBase \
@srcdir@/QL

View File

@ -28,7 +28,6 @@ libavocado_a_SOURCES = \
BasicsC/conversions.c \
BasicsC/csv.c \
BasicsC/error.c \
BasicsC/voc-errors.c \
BasicsC/files.c \
BasicsC/hashes.c \
BasicsC/init.c \
@ -48,6 +47,7 @@ libavocado_a_SOURCES = \
BasicsC/terminal-utils.c \
BasicsC/threads-posix.c \
BasicsC/vector.c \
BasicsC/voc-errors.c \
JsonParser/json-parser.c \
JsonParserX/InputParser.cpp \
JsonParserX/JsonParserX.cpp \
@ -70,6 +70,13 @@ libavocado_a_SOURCES = \
ShapedJson/json-shaper.c \
ShapedJson/shape-accessor.c \
ShapedJson/shaped-json.c \
UserManager/ApplicationUserManager.cpp \
UserManager/Role.cpp \
UserManager/Session.cpp \
UserManager/SessionHandler.cpp \
UserManager/User.cpp \
UserManager/UserHandler.cpp \
UserManager/UsersHandler.cpp \
V8/JSLoader.cpp \
V8/v8-conv.cpp \
V8/v8-json.cpp \

View File

@ -153,19 +153,18 @@ am_libavocado_a_OBJECTS = Basics/ConditionLocker.$(OBJEXT) \
BasicsC/associative-multi.$(OBJEXT) \
BasicsC/associative.$(OBJEXT) BasicsC/conversions.$(OBJEXT) \
BasicsC/csv.$(OBJEXT) BasicsC/error.$(OBJEXT) \
BasicsC/voc-errors.$(OBJEXT) BasicsC/files.$(OBJEXT) \
BasicsC/hashes.$(OBJEXT) BasicsC/init.$(OBJEXT) \
BasicsC/json.$(OBJEXT) BasicsC/locks-macos.$(OBJEXT) \
BasicsC/locks-posix.$(OBJEXT) BasicsC/logging.$(OBJEXT) \
BasicsC/memory.$(OBJEXT) BasicsC/process-utils.$(OBJEXT) \
BasicsC/random.$(OBJEXT) BasicsC/socket-utils.$(OBJEXT) \
BasicsC/string-buffer.$(OBJEXT) BasicsC/strings.$(OBJEXT) \
BasicsC/structures.$(OBJEXT) \
BasicsC/files.$(OBJEXT) BasicsC/hashes.$(OBJEXT) \
BasicsC/init.$(OBJEXT) BasicsC/json.$(OBJEXT) \
BasicsC/locks-macos.$(OBJEXT) BasicsC/locks-posix.$(OBJEXT) \
BasicsC/logging.$(OBJEXT) BasicsC/memory.$(OBJEXT) \
BasicsC/process-utils.$(OBJEXT) BasicsC/random.$(OBJEXT) \
BasicsC/socket-utils.$(OBJEXT) BasicsC/string-buffer.$(OBJEXT) \
BasicsC/strings.$(OBJEXT) BasicsC/structures.$(OBJEXT) \
BasicsC/system-functions.$(OBJEXT) \
BasicsC/terminal-utils-ncurses.$(OBJEXT) \
BasicsC/terminal-utils.$(OBJEXT) \
BasicsC/threads-posix.$(OBJEXT) BasicsC/vector.$(OBJEXT) \
JsonParser/json-parser.$(OBJEXT) \
BasicsC/voc-errors.$(OBJEXT) JsonParser/json-parser.$(OBJEXT) \
JsonParserX/InputParser.$(OBJEXT) \
JsonParserX/JsonParserX.$(OBJEXT) \
JsonParserX/JsonParserXDriver.$(OBJEXT) \
@ -179,7 +178,12 @@ am_libavocado_a_OBJECTS = Basics/ConditionLocker.$(OBJEXT) \
Rest/SslInterface.$(OBJEXT) Rest/Url.$(OBJEXT) \
ShapedJson/json-shaper.$(OBJEXT) \
ShapedJson/shape-accessor.$(OBJEXT) \
ShapedJson/shaped-json.$(OBJEXT) V8/JSLoader.$(OBJEXT) \
ShapedJson/shaped-json.$(OBJEXT) \
UserManager/ApplicationUserManager.$(OBJEXT) \
UserManager/Role.$(OBJEXT) UserManager/Session.$(OBJEXT) \
UserManager/SessionHandler.$(OBJEXT) \
UserManager/User.$(OBJEXT) UserManager/UserHandler.$(OBJEXT) \
UserManager/UsersHandler.$(OBJEXT) V8/JSLoader.$(OBJEXT) \
V8/v8-conv.$(OBJEXT) V8/v8-json.$(OBJEXT) \
V8/v8-line-editor.$(OBJEXT) V8/v8-shell.$(OBJEXT) \
V8/v8-utils.$(OBJEXT) Variant/VariantArray.$(OBJEXT) \
@ -599,7 +603,6 @@ libavocado_a_SOURCES = \
BasicsC/conversions.c \
BasicsC/csv.c \
BasicsC/error.c \
BasicsC/voc-errors.c \
BasicsC/files.c \
BasicsC/hashes.c \
BasicsC/init.c \
@ -619,6 +622,7 @@ libavocado_a_SOURCES = \
BasicsC/terminal-utils.c \
BasicsC/threads-posix.c \
BasicsC/vector.c \
BasicsC/voc-errors.c \
JsonParser/json-parser.c \
JsonParserX/InputParser.cpp \
JsonParserX/JsonParserX.cpp \
@ -641,6 +645,13 @@ libavocado_a_SOURCES = \
ShapedJson/json-shaper.c \
ShapedJson/shape-accessor.c \
ShapedJson/shaped-json.c \
UserManager/ApplicationUserManager.cpp \
UserManager/Role.cpp \
UserManager/Session.cpp \
UserManager/SessionHandler.cpp \
UserManager/User.cpp \
UserManager/UserHandler.cpp \
UserManager/UsersHandler.cpp \
V8/JSLoader.cpp \
V8/v8-conv.cpp \
V8/v8-json.cpp \
@ -1090,8 +1101,6 @@ BasicsC/csv.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/error.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/voc-errors.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/files.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/hashes.$(OBJEXT): BasicsC/$(am__dirstamp) \
@ -1130,6 +1139,8 @@ BasicsC/threads-posix.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/vector.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
BasicsC/voc-errors.$(OBJEXT): BasicsC/$(am__dirstamp) \
BasicsC/$(DEPDIR)/$(am__dirstamp)
JsonParser/$(am__dirstamp):
@$(MKDIR_P) JsonParser
@: > JsonParser/$(am__dirstamp)
@ -1211,6 +1222,27 @@ ShapedJson/shape-accessor.$(OBJEXT): ShapedJson/$(am__dirstamp) \
ShapedJson/$(DEPDIR)/$(am__dirstamp)
ShapedJson/shaped-json.$(OBJEXT): ShapedJson/$(am__dirstamp) \
ShapedJson/$(DEPDIR)/$(am__dirstamp)
UserManager/$(am__dirstamp):
@$(MKDIR_P) UserManager
@: > UserManager/$(am__dirstamp)
UserManager/$(DEPDIR)/$(am__dirstamp):
@$(MKDIR_P) UserManager/$(DEPDIR)
@: > UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/ApplicationUserManager.$(OBJEXT): \
UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/Role.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/Session.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/SessionHandler.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/User.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/UserHandler.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
UserManager/UsersHandler.$(OBJEXT): UserManager/$(am__dirstamp) \
UserManager/$(DEPDIR)/$(am__dirstamp)
V8/$(am__dirstamp):
@$(MKDIR_P) V8
@: > V8/$(am__dirstamp)
@ -1884,6 +1916,13 @@ mostlyclean-compile:
-rm -f UnitTests/Philadelphia/vector-pointer-test.$(OBJEXT)
-rm -f UnitTests/Philadelphia/vector-test.$(OBJEXT)
-rm -f UnitTests/Runner.$(OBJEXT)
-rm -f UserManager/ApplicationUserManager.$(OBJEXT)
-rm -f UserManager/Role.$(OBJEXT)
-rm -f UserManager/Session.$(OBJEXT)
-rm -f UserManager/SessionHandler.$(OBJEXT)
-rm -f UserManager/User.$(OBJEXT)
-rm -f UserManager/UserHandler.$(OBJEXT)
-rm -f UserManager/UsersHandler.$(OBJEXT)
-rm -f V8/JSLoader.$(OBJEXT)
-rm -f V8/v8-actions.$(OBJEXT)
-rm -f V8/v8-conv.$(OBJEXT)
@ -2091,6 +2130,13 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/string-utf8-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/vector-pointer-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UnitTests/Philadelphia/$(DEPDIR)/vector-test.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/ApplicationUserManager.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/Role.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/Session.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/SessionHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/User.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/UserHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@UserManager/$(DEPDIR)/UsersHandler.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@V8/$(DEPDIR)/JSLoader.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@V8/$(DEPDIR)/v8-actions.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@V8/$(DEPDIR)/v8-conv.Po@am__quote@
@ -2492,6 +2538,8 @@ distclean-generic:
-rm -f UnitTests/Jutland/$(am__dirstamp)
-rm -f UnitTests/Philadelphia/$(DEPDIR)/$(am__dirstamp)
-rm -f UnitTests/Philadelphia/$(am__dirstamp)
-rm -f UserManager/$(DEPDIR)/$(am__dirstamp)
-rm -f UserManager/$(am__dirstamp)
-rm -f V8/$(DEPDIR)/$(am__dirstamp)
-rm -f V8/$(am__dirstamp)
-rm -f V8Client/$(DEPDIR)/$(am__dirstamp)
@ -2514,7 +2562,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-local \
distclean: distclean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf Admin/$(DEPDIR) ApplicationServer/$(DEPDIR) Basics/$(DEPDIR) BasicsC/$(DEPDIR) Dispatcher/$(DEPDIR) GeneralServer/$(DEPDIR) GeoIndex/$(DEPDIR) HashIndex/$(DEPDIR) HttpServer/$(DEPDIR) HttpsServer/$(DEPDIR) JsonParser/$(DEPDIR) JsonParserX/$(DEPDIR) Logger/$(DEPDIR) PriorityQueue/$(DEPDIR) ProgramOptions/$(DEPDIR) QL/$(DEPDIR) Rest/$(DEPDIR) RestHandler/$(DEPDIR) RestServer/$(DEPDIR) ResultGenerator/$(DEPDIR) Scheduler/$(DEPDIR) ShapedJson/$(DEPDIR) SimpleHttpClient/$(DEPDIR) SkipLists/$(DEPDIR) UnitTests/$(DEPDIR) UnitTests/Jutland/$(DEPDIR) UnitTests/Philadelphia/$(DEPDIR) V8/$(DEPDIR) V8Client/$(DEPDIR) Variant/$(DEPDIR) VocBase/$(DEPDIR)
-rm -rf Admin/$(DEPDIR) ApplicationServer/$(DEPDIR) Basics/$(DEPDIR) BasicsC/$(DEPDIR) Dispatcher/$(DEPDIR) GeneralServer/$(DEPDIR) GeoIndex/$(DEPDIR) HashIndex/$(DEPDIR) HttpServer/$(DEPDIR) HttpsServer/$(DEPDIR) JsonParser/$(DEPDIR) JsonParserX/$(DEPDIR) Logger/$(DEPDIR) PriorityQueue/$(DEPDIR) ProgramOptions/$(DEPDIR) QL/$(DEPDIR) Rest/$(DEPDIR) RestHandler/$(DEPDIR) RestServer/$(DEPDIR) ResultGenerator/$(DEPDIR) Scheduler/$(DEPDIR) ShapedJson/$(DEPDIR) SimpleHttpClient/$(DEPDIR) SkipLists/$(DEPDIR) UnitTests/$(DEPDIR) UnitTests/Jutland/$(DEPDIR) UnitTests/Philadelphia/$(DEPDIR) UserManager/$(DEPDIR) V8/$(DEPDIR) V8Client/$(DEPDIR) Variant/$(DEPDIR) VocBase/$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-tags
@ -2562,7 +2610,7 @@ installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -rf Admin/$(DEPDIR) ApplicationServer/$(DEPDIR) Basics/$(DEPDIR) BasicsC/$(DEPDIR) Dispatcher/$(DEPDIR) GeneralServer/$(DEPDIR) GeoIndex/$(DEPDIR) HashIndex/$(DEPDIR) HttpServer/$(DEPDIR) HttpsServer/$(DEPDIR) JsonParser/$(DEPDIR) JsonParserX/$(DEPDIR) Logger/$(DEPDIR) PriorityQueue/$(DEPDIR) ProgramOptions/$(DEPDIR) QL/$(DEPDIR) Rest/$(DEPDIR) RestHandler/$(DEPDIR) RestServer/$(DEPDIR) ResultGenerator/$(DEPDIR) Scheduler/$(DEPDIR) ShapedJson/$(DEPDIR) SimpleHttpClient/$(DEPDIR) SkipLists/$(DEPDIR) UnitTests/$(DEPDIR) UnitTests/Jutland/$(DEPDIR) UnitTests/Philadelphia/$(DEPDIR) V8/$(DEPDIR) V8Client/$(DEPDIR) Variant/$(DEPDIR) VocBase/$(DEPDIR)
-rm -rf Admin/$(DEPDIR) ApplicationServer/$(DEPDIR) Basics/$(DEPDIR) BasicsC/$(DEPDIR) Dispatcher/$(DEPDIR) GeneralServer/$(DEPDIR) GeoIndex/$(DEPDIR) HashIndex/$(DEPDIR) HttpServer/$(DEPDIR) HttpsServer/$(DEPDIR) JsonParser/$(DEPDIR) JsonParserX/$(DEPDIR) Logger/$(DEPDIR) PriorityQueue/$(DEPDIR) ProgramOptions/$(DEPDIR) QL/$(DEPDIR) Rest/$(DEPDIR) RestHandler/$(DEPDIR) RestServer/$(DEPDIR) ResultGenerator/$(DEPDIR) Scheduler/$(DEPDIR) ShapedJson/$(DEPDIR) SimpleHttpClient/$(DEPDIR) SkipLists/$(DEPDIR) UnitTests/$(DEPDIR) UnitTests/Jutland/$(DEPDIR) UnitTests/Philadelphia/$(DEPDIR) UserManager/$(DEPDIR) V8/$(DEPDIR) V8Client/$(DEPDIR) Variant/$(DEPDIR) VocBase/$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic

View File

@ -52,6 +52,7 @@
#include "RestHandler/RestImportHandler.h"
#include "RestServer/ActionDispatcherThread.h"
#include "RestServer/AvocadoHttpServer.h"
#include "UserManager/ApplicationUserManager.h"
#include "V8/JSLoader.h"
#include "V8/v8-actions.h"
#include "V8/v8-conv.h"
@ -274,6 +275,42 @@ void AvocadoServer::buildApplicationServer () {
_applicationAdminServer->allowLogViewer();
_applicationAdminServer->allowVersion("avocado", TRIAGENS_VERSION);
// .............................................................................
// build the application user manager
// .............................................................................
_applicationUserManager = ApplicationUserManager::create(_applicationServer);
_applicationServer->addFeature(_applicationUserManager);
// create manager role
vector<right_t> rightsManager;
rightsManager.push_back(RIGHT_TO_MANAGE_USER);
rightsManager.push_back(RIGHT_TO_MANAGE_ADMIN);
_applicationUserManager->createRole("manager", rightsManager, 0);
// create admin role
vector<right_t> rightsAdmin;
rightsAdmin.push_back(RIGHT_TO_MANAGE_USER);
rightsAdmin.push_back(RIGHT_TO_BE_DELETED);
_applicationUserManager->createRole("admin", rightsAdmin, RIGHT_TO_MANAGE_ADMIN);
// create user role
vector<right_t> rightsUser;
rightsUser.push_back(RIGHT_TO_BE_DELETED);
_applicationUserManager->createRole("user", rightsUser, RIGHT_TO_MANAGE_USER);
// create a standard user
_applicationUserManager->createUser("manager", "manager");
// added a anonymous right for session which are not logged in
vector<right_t> rightsAnonymous;
rightsAnonymous.push_back(RIGHT_TO_LOGIN);
_applicationUserManager->setAnonymousRights(rightsAnonymous);
// .............................................................................
// use relative system paths
// .............................................................................
@ -589,6 +626,7 @@ int AvocadoServer::startupServer () {
if (shareAdminPort) {
_applicationAdminServer->addHandlers(factory, "/_admin");
_applicationUserManager->addHandlers(factory, "/_admin");
allowedQueuesHttp.insert("SYSTEM");
}
@ -618,6 +656,7 @@ int AvocadoServer::startupServer () {
_applicationAdminServer->addBasicHandlers(adminFactory);
_applicationAdminServer->addHandlers(adminFactory, "/_admin");
_applicationUserManager->addHandlers(adminFactory, "/_admin");
adminFactory->addPrefixHandler(RestVocbaseBaseHandler::DOCUMENT_PATH, RestHandlerCreator<RestDocumentHandler>::createData<TRI_vocbase_t*>, _vocbase);
adminFactory->addPrefixHandler(RestVocbaseBaseHandler::EDGE_PATH, RestHandlerCreator<RestEdgeHandler>::createData<TRI_vocbase_t*>, _vocbase);

View File

@ -34,6 +34,16 @@
#include "HttpServer/ApplicationHttpServer.h"
#include "VocBase/vocbase.h"
// -----------------------------------------------------------------------------
// --SECTION-- forward declarations
// -----------------------------------------------------------------------------
namespace triagens {
namespace admin {
class ApplicationUserManager;
}
}
// -----------------------------------------------------------------------------
// --SECTION-- class AvocadoServer
// -----------------------------------------------------------------------------
@ -181,6 +191,12 @@ namespace triagens {
rest::ApplicationHttpServer* _applicationHttpServer;
////////////////////////////////////////////////////////////////////////////////
/// @brief constructed user server application
////////////////////////////////////////////////////////////////////////////////
admin::ApplicationUserManager* _applicationUserManager;
////////////////////////////////////////////////////////////////////////////////
/// @brief constructed http server
////////////////////////////////////////////////////////////////////////////////

View File

@ -29,8 +29,14 @@
/// @page HttpSystemTOC
///
/// <ol>
/// <li>@ref HttpSystemStatus</li>
/// <li>@ref HttpSystemLog</li>
/// <li>@ref HttpSystemStatus</li>
/// <li>@ref HttpSystemUsers</li>
/// <li>@ref HttpSystemUserGet</li>
/// <li>@ref HttpSystemUserPost</li>
/// <li>@ref HttpSystemSessionGet</li>
/// <li>@ref HttpSystemSessionPost</li>
/// <li>@ref HttpSystemSessionLogin</li>
/// </ol>
////////////////////////////////////////////////////////////////////////////////
@ -44,12 +50,36 @@
/// @copydoc HttpSystemTOC
/// <hr>
///
/// @anchor HttpSystemLog
/// @copydetails triagens::admin::RestAdminLogHandler::execute
/// <hr>
///
/// @anchor HttpSystemStatus
/// @copydetails JSF_GET_system_status
/// <hr>
///
/// @anchor HttpSystemLog
/// @copydetails triagens::admin::RestAdminLogHandler::execute
/// @anchor HttpSystemUsers
/// @copydetails triagens::admin::UsersHandler::execute
/// <hr>
///
/// @anchor HttpSystemUserGet
/// @copydetails triagens::admin::UserHandler::executeGet
/// <hr>
///
/// @anchor HttpSystemUserPost
/// @copydetails triagens::admin::UserHandler::executePost
/// <hr>
///
/// @anchor HttpSystemSessionGet
/// @copydetails triagens::admin::SessionHandler::executeGet
/// <hr>
///
/// @anchor HttpSystemSessionPost
/// @copydetails triagens::admin::SessionHandler::executePost
/// <hr>
///
/// @anchor HttpSystemSessionLogin
/// @copydetails triagens::admin::SessionHandler::executeLogin
/// <hr>
///
////////////////////////////////////////////////////////////////////////////////

View File

@ -0,0 +1,225 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief application simple user and session management feature
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "ApplicationUserManager.h"
#include "build.h"
#include "Admin/RestHandlerCreator.h"
#include "Basics/ProgramOptionsDescription.h"
#include "HttpServer/HttpHandlerFactory.h"
#include "Rest/HttpResponse.h"
#include "UserManager/Role.h"
#include "UserManager/Session.h"
#include "UserManager/SessionHandler.h"
#include "UserManager/User.h"
#include "UserManager/UserHandler.h"
#include "UserManager/UsersHandler.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::rest;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- static private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief option for the path of the user database
////////////////////////////////////////////////////////////////////////////////
string ApplicationUserManager::optionUserDatabase;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new feature
////////////////////////////////////////////////////////////////////////////////
ApplicationUserManager* ApplicationUserManager::create (ApplicationServer*) {
return new ApplicationUserManager();
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
ApplicationUserManager::ApplicationUserManager () {
}
////////////////////////////////////////////////////////////////////////////////
/// @brief destructor
////////////////////////////////////////////////////////////////////////////////
ApplicationUserManager::~ApplicationUserManager () {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief adds the http handlers for administration
///
/// Note that the server does not claim ownership of the factory.
////////////////////////////////////////////////////////////////////////////////
void ApplicationUserManager::addHandlers (HttpHandlerFactory* factory, string const& prefix) {
factory->addPrefixHandler(prefix + "/user-manager/user", UserHandler::create, this);
factory->addPrefixHandler(prefix + "/user-manager/users", UsersHandler::create, this);
factory->addPrefixHandler(prefix + "/user-manager/session", SessionHandler::create, this);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a role
////////////////////////////////////////////////////////////////////////////////
bool ApplicationUserManager::createRole (string const& name,
vector<right_t> const& rights,
right_t rightToManage) {
Role* role = Role::create(name, rightToManage);
if (role == 0) {
LOGGER_WARNING << "cannot create role '" << name << "'";
return false;
}
role->setRights(rights);
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a user
////////////////////////////////////////////////////////////////////////////////
bool ApplicationUserManager::createUser (string const& name,
string const& rolename) {
Role* role = Role::lookup(rolename);
if (role == 0) {
LOGGER_WARNING << "cannot create user '" << name << "', unknown role '" << rolename << "'";
return false;
}
User* user = User::create(name, role);
return user != 0;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief loads the user database
////////////////////////////////////////////////////////////////////////////////
bool ApplicationUserManager::loadUser () {
LOGGER_DEBUG << "trying to load user database '" << optionUserDatabase << "'";
if (optionUserDatabase.empty()) {
return false;
}
return User::loadUser(optionUserDatabase);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the right of an anonymous session
////////////////////////////////////////////////////////////////////////////////
void ApplicationUserManager::setAnonymousRights (vector<right_t> const& rights) {
Session::setAnonymousRights(rights);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- ApplicationFeature methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
void ApplicationUserManager::setupOptions (map<string, basics::ProgramOptionsDescription>& options) {
options[ApplicationServer::OPTIONS_SERVER + ":help-admin"]
("server.user-database", &optionUserDatabase, "file for storing the user database")
;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,207 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief application simple user and session management feature
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_APPLICATION_USER_MANAGER_H
#define TRIAGENS_USER_MANAGER_APPLICATION_USER_MANAGER_H 1
#include "ApplicationServer/ApplicationFeature.h"
#include <UserManager/Right.h>
#include "Rest/AddressPort.h"
namespace triagens {
namespace rest {
class ApplicationServer;
class HttpHandlerFactory;
class HttpResponse;
class HttpRequest;
}
namespace admin {
// -----------------------------------------------------------------------------
// --SECTION-- class ApplicationUserManager
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief application simple user and session management feature
////////////////////////////////////////////////////////////////////////////////
class ApplicationUserManager : public rest::ApplicationFeature {
ApplicationUserManager (ApplicationUserManager const&);
ApplicationUserManager& operator= (ApplicationUserManager const&);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new feature
////////////////////////////////////////////////////////////////////////////////
static ApplicationUserManager* create (rest::ApplicationServer*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief destructor
////////////////////////////////////////////////////////////////////////////////
~ApplicationUserManager ();
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
ApplicationUserManager ();
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief adds the http handlers for administration
///
/// Note that the server does not claim ownership of the factory.
////////////////////////////////////////////////////////////////////////////////
void addHandlers (rest::HttpHandlerFactory*, string const& prefix);
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a role
////////////////////////////////////////////////////////////////////////////////
bool createRole (string const& name, vector<right_t> const&, right_t rightToManage);
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a user
////////////////////////////////////////////////////////////////////////////////
bool createUser (string const& name, string const& role);
////////////////////////////////////////////////////////////////////////////////
/// @brief loads the user database
////////////////////////////////////////////////////////////////////////////////
bool loadUser ();
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the right of an anonymous session
////////////////////////////////////////////////////////////////////////////////
void setAnonymousRights (vector<right_t> const&);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- ApplicationFeature methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
void setupOptions (map<string, basics::ProgramOptionsDescription>&);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief option for the path of the user database
////////////////////////////////////////////////////////////////////////////////
static string optionUserDatabase;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,131 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief default handler for admin handlers
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "RestAdminBaseHandler.h"
#include "Rest/HttpRequest.h"
#include "SessionManager/Session.h"
#include "UserManager/User.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::rest;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
static Session* authSession (HttpRequest* request) {
bool found;
string const& sid = request->value("authSid", found);
if (! found) {
return 0;
}
Session* session = Session::lookup(sid);
if (session == 0) {
return 0;
}
return session;
}
// -----------------------------------------------------------------------------
// --SECTION-- class RestAdminBaseHandler
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
RestAdminBaseHandler::RestAdminBaseHandler (HttpRequest* request)
: RestBaseHandler(request) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- protected methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session has given right
////////////////////////////////////////////////////////////////////////////////
bool RestAdminBaseHandler::hasRight (right_t right) {
Session* session = authSession(request);
if (session == 0) {
return false;
}
return session->hasRight(right);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session is bound to given user
////////////////////////////////////////////////////////////////////////////////
bool RestAdminBaseHandler::isSelf (string const& username) {
Session* session = authSession(request);
if (session == 0) {
return false;
}
User* user = User::lookup(username);
if (user == 0) {
return false;
}
return session->getUser() != user;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,113 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief default handler for admin handlers
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_REST_ADMIN_BASE_HANDLER_H
#define TRIAGENS_USER_MANAGER_REST_ADMIN_BASE_HANDLER_H 1
#include "Admin/RestBaseHandler.h"
#include "UserManager/Right.h"
namespace triagens {
namespace admin {
// -----------------------------------------------------------------------------
// --SECTION-- class RestAdminBaseHandler
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief default handler for admin handlers
////////////////////////////////////////////////////////////////////////////////
class RestAdminBaseHandler : public RestBaseHandler {
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
RestAdminBaseHandler (rest::HttpRequest* request);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- protected methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session has given right
////////////////////////////////////////////////////////////////////////////////
virtual bool hasRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session is bound to given user
////////////////////////////////////////////////////////////////////////////////
virtual bool isSelf (string const& username);
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

105
UserManager/Right.h Normal file
View File

@ -0,0 +1,105 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief default rights
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_RIGHT_H
#define TRIAGENS_USER_MANAGER_RIGHT_H 1
#include "Basics/Common.h"
#include "Logger/Logger.h"
namespace triagens {
namespace admin {
// -----------------------------------------------------------------------------
// --SECTION-- public types
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief a single right
////////////////////////////////////////////////////////////////////////////////
typedef uint32_t right_t;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public constants
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief right to manage an administrator account
///
/// Right to create, delete, or change role.
////////////////////////////////////////////////////////////////////////////////
right_t const RIGHT_TO_MANAGE_ADMIN = 1000;
////////////////////////////////////////////////////////////////////////////////
/// @brief right to manage an user account
///
/// Right to create, delete, or change role.
////////////////////////////////////////////////////////////////////////////////
right_t const RIGHT_TO_MANAGE_USER = 1001;
////////////////////////////////////////////////////////////////////////////////
/// @brief right to be deleted
////////////////////////////////////////////////////////////////////////////////
right_t const RIGHT_TO_BE_DELETED = 1002;
////////////////////////////////////////////////////////////////////////////////
/// @brief right to login in
////////////////////////////////////////////////////////////////////////////////
right_t const RIGHT_TO_LOGIN = 1003;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

208
UserManager/Role.cpp Normal file
View File

@ -0,0 +1,208 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief role of a user
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "Role.h"
#include "Logger/Logger.h"
#include "Basics/Mutex.h"
#include "Basics/MutexLocker.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief mutex for registry
////////////////////////////////////////////////////////////////////////////////
static Mutex RoleLock;
////////////////////////////////////////////////////////////////////////////////
/// @brief registry
////////////////////////////////////////////////////////////////////////////////
static map<string, Role*> RoleRegistry;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new role
////////////////////////////////////////////////////////////////////////////////
Role* Role::create (string const& name, right_t manage) {
MUTEX_LOCKER(RoleLock);
map<string, Role*>::const_iterator i = RoleRegistry.find(name);
if (i != RoleRegistry.end()) {
LOGGER_DEBUG << "user '" << name << "' already exists";
return 0;
}
Role* user = new Role(name, manage);
RoleRegistry[name] = user;
return user;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
Role* Role::lookup (string const& name) {
MUTEX_LOCKER(RoleLock);
map<string, Role*>::const_iterator i = RoleRegistry.find(name);
if (i == RoleRegistry.end()) {
return 0;
}
else {
return i->second;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
Role::Role (string const& name, right_t manage)
: _name(name), _rightToManage(manage) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the name of a role
////////////////////////////////////////////////////////////////////////////////
string const& Role::getName () const {
return _name;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the rights of a role
////////////////////////////////////////////////////////////////////////////////
set<right_t> const& Role::getRights () const {
return _rights;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief adds a right to a role
////////////////////////////////////////////////////////////////////////////////
void Role::addRight (right_t right) {
_rights.insert(right);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the rights of a role
////////////////////////////////////////////////////////////////////////////////
void Role::setRights (vector<right_t> const& rights) {
_rights.clear();
_rights.insert(rights.begin(), rights.end());
}
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a right from a role
////////////////////////////////////////////////////////////////////////////////
void Role::removeRight (right_t right) {
_rights.erase(right);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief clears all rights of a role
////////////////////////////////////////////////////////////////////////////////
void Role::clearRights () {
_rights.clear();
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns right required to manage this role
////////////////////////////////////////////////////////////////////////////////
right_t Role::rightToManage () const {
return _rightToManage;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

205
UserManager/Role.h Normal file
View File

@ -0,0 +1,205 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief role of a user
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_ROLE_H
#define TRIAGENS_USER_MANAGER_ROLE_H 1
#include "Basics/Common.h"
#include "UserManager/Right.h"
namespace triagens {
namespace admin {
// -----------------------------------------------------------------------------
// --SECTION-- class Role
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief role of a user
////////////////////////////////////////////////////////////////////////////////
class Role {
Role (Role const&);
Role& operator= (Role const&);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new role
////////////////////////////////////////////////////////////////////////////////
static Role* create (string const& name, right_t manage);
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
static Role* lookup (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
Role (string const& name, right_t manage);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the name of a role
////////////////////////////////////////////////////////////////////////////////
string const& getName () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the rights of a role
////////////////////////////////////////////////////////////////////////////////
set<right_t> const& getRights () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief adds a right to a role
////////////////////////////////////////////////////////////////////////////////
void addRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief sets the rights of a role
////////////////////////////////////////////////////////////////////////////////
void setRights (vector<right_t> const&);
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a right from a role
////////////////////////////////////////////////////////////////////////////////
void removeRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief clears all rights of a role
////////////////////////////////////////////////////////////////////////////////
void clearRights ();
////////////////////////////////////////////////////////////////////////////////
/// @brief returns right required to manage this role
////////////////////////////////////////////////////////////////////////////////
right_t rightToManage () const;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief name
////////////////////////////////////////////////////////////////////////////////
string const _name;
////////////////////////////////////////////////////////////////////////////////
/// @brief rights
////////////////////////////////////////////////////////////////////////////////
set<right_t> _rights;
////////////////////////////////////////////////////////////////////////////////
/// @brief manager
////////////////////////////////////////////////////////////////////////////////
right_t _rightToManage;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

288
UserManager/Session.cpp Normal file
View File

@ -0,0 +1,288 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief session management
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "Session.h"
#include "Logger/Logger.h"
#include "Basics/MutexLocker.h"
#include "Basics/Random.h"
#include "UserManager/User.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief session registry
////////////////////////////////////////////////////////////////////////////////
static map<string, Session*> SessionRegistry;
////////////////////////////////////////////////////////////////////////////////
/// @brief all sessions
////////////////////////////////////////////////////////////////////////////////
static list<Session*> Sessions;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static constants
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
string const Session::SID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Mutex Session::lock;
set<right_t> Session::_rights;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
Session* Session::lookup (string const& sid) {
map<string, Session*>::const_iterator i = SessionRegistry.find(sid);
if (i == SessionRegistry.end()) {
return 0;
}
else {
Session* session = i->second;
list<Session*>::iterator j = find(Sessions.begin(), Sessions.end(), session);
if (j != Sessions.end()) {
Sessions.erase(j);
}
Sessions.push_back(session);
return session;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a session
////////////////////////////////////////////////////////////////////////////////
Session* Session::create () {
if (Sessions.size() > MAXIMAL_OPEN_SESSION) {
Session* session = Sessions.front();
LOGGER_DEBUG << "too many admin sessions, throwing away '" << session->getSid() << "'";
Sessions.pop_front();
remove(session);
}
Random::UniformCharacter generator(SID_LENGTH, SID_CHARACTERS);
string sid = generator.random();
while (SessionRegistry.find(sid) != SessionRegistry.end()) {
sid = generator.random();
}
Session* session = new Session(sid);
SessionRegistry[sid] = session;
Sessions.push_back(session);
LOGGER_DEBUG << "created admin session '" << session->getSid() << "'";
return session;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a session
///
/// Remove will also delete the session object.
////////////////////////////////////////////////////////////////////////////////
bool Session::remove (Session* session) {
LOGGER_DEBUG << "removing admin session '" << session->getSid() << "'";
SessionRegistry.erase(session->getSid());
list<Session*>::iterator j = find(Sessions.begin(), Sessions.end(), session);
if (j != Sessions.end()) {
Sessions.erase(j);
}
delete session;
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sets a anonymous rights
////////////////////////////////////////////////////////////////////////////////
void Session::setAnonymousRights (vector<right_t> const& rights) {
_rights.insert(rights.begin(), rights.end());
}
////////////////////////////////////////////////////////////////////////////////
/// @brief gets anonymous rights
////////////////////////////////////////////////////////////////////////////////
set<right_t> const& Session::anonymousRights () {
return _rights;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
Session::Session (string const& sid)
: _sid(sid), _user(0) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the session identifier
////////////////////////////////////////////////////////////////////////////////
string const& Session::getSid () const {
return _sid;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the user of a session
////////////////////////////////////////////////////////////////////////////////
User* Session::getUser () const {
return _user;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logs a user in
////////////////////////////////////////////////////////////////////////////////
bool Session::login (string const& username, string const& password, string& reason) {
User* user = User::lookup(username);
if (user == 0) {
reason = "unknown user '" + username + "'";
return false;
}
bool ok = user->checkPassword(password);
if (! ok) {
reason = "wrong password for user '" + username + "'";
return false;
}
_user = user;
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logs a user out
////////////////////////////////////////////////////////////////////////////////
bool Session::logout () {
if (_user != 0) {
_user = 0;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief checks for a right
////////////////////////////////////////////////////////////////////////////////
bool Session::hasRight (right_t right) {
if (_user == 0) {
return _rights.find(right) != _rights.end();
}
else {
return _user->hasRight(right);
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

278
UserManager/Session.h Normal file
View File

@ -0,0 +1,278 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief session management
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_SESSION_H
#define TRIAGENS_USER_MANAGER_SESSION_H 1
#include "Basics/Common.h"
#include "UserManager/Right.h"
#include "Basics/Mutex.h"
namespace triagens {
namespace admin {
class User;
// -----------------------------------------------------------------------------
// --SECTION-- class Session
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief session management
////////////////////////////////////////////////////////////////////////////////
class Session {
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static constants
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief maximal number of open sessions
////////////////////////////////////////////////////////////////////////////////
static size_t const MAXIMAL_OPEN_SESSION = 10;
////////////////////////////////////////////////////////////////////////////////
/// @brief length of session identifier
////////////////////////////////////////////////////////////////////////////////
static size_t const SID_LENGTH = 10;
////////////////////////////////////////////////////////////////////////////////
/// @brief length of session characters
////////////////////////////////////////////////////////////////////////////////
static string const SID_CHARACTERS;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief access lock
////////////////////////////////////////////////////////////////////////////////
static basics::Mutex lock;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
static Session* lookup (string const& sid);
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a session
////////////////////////////////////////////////////////////////////////////////
static Session* create ();
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a session
///
/// Remove will also delete the session object.
////////////////////////////////////////////////////////////////////////////////
static bool remove (Session*);
////////////////////////////////////////////////////////////////////////////////
/// @brief sets a anonymous rights
////////////////////////////////////////////////////////////////////////////////
static void setAnonymousRights (vector<right_t> const&);
////////////////////////////////////////////////////////////////////////////////
/// @brief gets anonymous rights
////////////////////////////////////////////////////////////////////////////////
static set<right_t> const& anonymousRights ();
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new sessions
////////////////////////////////////////////////////////////////////////////////
Session (string const& sid);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the session identifier
////////////////////////////////////////////////////////////////////////////////
string const& getSid () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the user of a session
////////////////////////////////////////////////////////////////////////////////
User* getUser () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief logs a user in
////////////////////////////////////////////////////////////////////////////////
bool login (string const& username, string const& password, string& reason);
////////////////////////////////////////////////////////////////////////////////
/// @brief logs a user out
////////////////////////////////////////////////////////////////////////////////
bool logout ();
////////////////////////////////////////////////////////////////////////////////
/// @brief checks for a right
////////////////////////////////////////////////////////////////////////////////
bool hasRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief rights
////////////////////////////////////////////////////////////////////////////////
static set<right_t> _rights;
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief session identifier
////////////////////////////////////////////////////////////////////////////////
string const _sid;
////////////////////////////////////////////////////////////////////////////////
/// @brief user
////////////////////////////////////////////////////////////////////////////////
User* _user;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,395 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief session handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Martin Schoenert
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "SessionHandler.h"
#include "Basics/MutexLocker.h"
#include "Rest/HttpRequest.h"
#include "Rest/HttpResponse.h"
#include "UserManager/Role.h"
#include "UserManager/Session.h"
#include "UserManager/User.h"
#include "Variant/VariantArray.h"
#include "Variant/VariantBoolean.h"
#include "Variant/VariantInt32.h"
#include "Variant/VariantVector.h"
using namespace triagens::basics;
using namespace triagens::rest;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief static constructor
////////////////////////////////////////////////////////////////////////////////
HttpHandler* SessionHandler::create (rest::HttpRequest* request, void* data) {
return new SessionHandler(request, (ApplicationAdminServer*) data);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
SessionHandler::SessionHandler (HttpRequest* request, ApplicationAdminServer* server)
: RestBaseHandler(request), _server(server) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- Handler methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
bool SessionHandler::isDirect () {
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::execute () {
// execute the request
switch (request->requestType()) {
case HttpRequest::HTTP_REQUEST_POST: return executePost();
case HttpRequest::HTTP_REQUEST_GET: return executeGet();
case HttpRequest::HTTP_REQUEST_PUT: return executePut();
case HttpRequest::HTTP_REQUEST_DELETE: return executeDelete();
default:
generateError(HttpResponse::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
return HANDLER_DONE;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a session
///
/// @REST{POST /_admin/user-manager/session}
///
/// Creates a new session. Returns an object with the following attributes.
///
/// - @LIT{sid}: The session identifier.
///
/// - @LIT{rights}: A list of rights for the newly created session.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executePost () {
if (request->suffix().size() != 0) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_SESSIONHANDLER_URL_INVALID1);
return HANDLER_DONE;
}
// create a new session
MUTEX_LOCKER(Session::lock);
Session* session = Session::create();
generateSession(session);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief reads a session
///
/// @REST{GET /_admin/user-manager/session/@FA{sid}}
///
/// Returns an object with the following attributes describing the session
/// @FA{sid}.
///
/// - @LIT{sid}: The session identifier.
///
/// - @LIT{rights}: A list of rights for the newly created session.
///
/// Note that @LIT{HTTP 404} is returned, if the session is unknown or expired.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executeGet () {
vector<string> const& suffix = request->suffix();
if (suffix.size() != 1) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_SESSIONHANDLER_URL_INVALID2);
return HANDLER_DONE;
}
string const& sid = suffix[0];
// lookup an existing session
MUTEX_LOCKER(Session::lock);
Session* session = Session::lookup(sid);
if (session != 0) {
generateSession(session);
}
else {
generateError(HttpResponse::NOT_FOUND, TRI_ERROR_SESSION_SESSIONHANDLER_SESSION_UNKNOWN);
}
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief updates a session
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executePut () {
vector<string> const& suffix = request->suffix();
if (suffix.size() != 2) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_SESSIONHANDLER_URL_INVALID3);
return HANDLER_DONE;
}
string const& sid = suffix[0];
string const& method = suffix[1];
// lookup an existing session
MUTEX_LOCKER(Session::lock);
Session* session = Session::lookup(sid);
if (session != 0) {
if (method == "login") {
return executeLogin(session);
}
else if (method == "logout") {
return executeLogout(session);
}
else if (method == "password") {
return executePassword(session);
}
generateError(HttpResponse::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
return HANDLER_DONE;
}
else {
generateError(HttpResponse::NOT_FOUND, TRI_ERROR_SESSION_SESSIONHANDLER_SESSION_UNKNOWN);
}
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief deletes a session
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executeDelete () {
vector<string> const& suffix = request->suffix();
if (suffix.size() != 1) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_SESSIONHANDLER_URL_INVALID4);
return HANDLER_DONE;
}
string const& sid = suffix[0];
// lookup an existing session
MUTEX_LOCKER(Session::lock);
Session* session = Session::lookup(sid);
bool removed = false;
if (session != 0) {
removed = Session::remove(session);
}
VariantArray* result = new VariantArray();
result->add("removed", new VariantBoolean(removed));
generateResult(result);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logs in an user
///
/// @REST{PUT /_admin/user-manager/session/@FA{sid}/login}
///
/// Logs an user into an existing session. Expects an object with the following
/// attributes.
///
/// - @LIT{user}: The user name.
///
/// - @LIT{password}: The password. The password must be a SHA256 hash of the
/// real password.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executeLogin (Session* session) {
struct Description : public InputParser::ObjectDescription {
Description () {
attribute("user", user);
attribute("password", password);
}
string user;
string password;
} desc;
bool ok = parseBody(desc);
if (! ok) {
return HANDLER_DONE;
}
string reason;
ok = session->login(desc.user, desc.password, reason);
if (! ok) {
generateError(HttpResponse::UNAUTHORIZED, TRI_ERROR_SESSION_SESSIONHANDLER_CANNOT_LOGIN, reason);
return HANDLER_DONE;
}
generateSession(session);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief logs out an user
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executeLogout (Session* session) {
session->logout();
generateSession(session);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief changes the password
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e SessionHandler::executePassword (Session* session) {
User* user = session->getUser();
if (user == 0) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_SESSIONHANDLER_SESSION_NOT_BOUND);
return HANDLER_DONE;
}
struct Description : public InputParser::ObjectDescription {
Description () {
attribute("password", password);
}
string password;
} desc;
bool ok = parseBody(desc);
if (! ok) {
return HANDLER_DONE;
}
bool changed = user->changePassword(desc.password);
VariantArray* result = new VariantArray();
result->add("changed", new VariantBoolean(changed));
generateResult(result);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generates a new session
////////////////////////////////////////////////////////////////////////////////
void SessionHandler::generateSession (Session* session) {
VariantArray* result = new VariantArray();
result->add("sid", session->getSid());
User* user = session->getUser();
if (user != 0) {
result->add("user", user->getName());
}
VariantVector* r = new VariantVector();
set<right_t> const& rights = (user == 0) ? Session::anonymousRights() : user->getRole()->getRights();
for (set<right_t>::const_iterator i = rights.begin(); i != rights.end(); ++i) {
r->add(new VariantInt32(*i));
}
result->add("rights", r);
generateResult(result);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,218 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief session handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Martin Schoenert
/// @author Copyright 2010-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_SESSION_HANDLER_H
#define TRIAGENS_USER_MANAGER_SESSION_HANDLER_H 1
#include "Admin/RestBaseHandler.h"
namespace triagens {
namespace admin {
class ApplicationAdminServer;
class Session;
// -----------------------------------------------------------------------------
// --SECTION-- class SessionHandler
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief session handler
////////////////////////////////////////////////////////////////////////////////
class SessionHandler : public RestBaseHandler {
public:
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief static constructor
////////////////////////////////////////////////////////////////////////////////
static rest::HttpHandler* create (rest::HttpRequest* request, void* data);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
SessionHandler (rest::HttpRequest* request, ApplicationAdminServer*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- Handler methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
bool isDirect ();
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
status_e execute ();
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a session
////////////////////////////////////////////////////////////////////////////////
status_e executePost ();
////////////////////////////////////////////////////////////////////////////////
/// @brief reads a session
////////////////////////////////////////////////////////////////////////////////
status_e executeGet ();
////////////////////////////////////////////////////////////////////////////////
/// @brief updates a session
////////////////////////////////////////////////////////////////////////////////
status_e executePut ();
////////////////////////////////////////////////////////////////////////////////
/// @brief deletes a session
////////////////////////////////////////////////////////////////////////////////
status_e executeDelete ();
////////////////////////////////////////////////////////////////////////////////
/// @brief logs in an user
////////////////////////////////////////////////////////////////////////////////
status_e executeLogin (Session*);
////////////////////////////////////////////////////////////////////////////////
/// @brief logs out an user
////////////////////////////////////////////////////////////////////////////////
status_e executeLogout (Session*);
////////////////////////////////////////////////////////////////////////////////
/// @brief changes the password
////////////////////////////////////////////////////////////////////////////////
status_e executePassword (Session*);
////////////////////////////////////////////////////////////////////////////////
/// @brief generates a new session
////////////////////////////////////////////////////////////////////////////////
void generateSession (Session*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief underlying user manager
////////////////////////////////////////////////////////////////////////////////
ApplicationAdminServer* _server;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

400
UserManager/User.cpp Normal file
View File

@ -0,0 +1,400 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief a user
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "User.h"
#include <fstream>
#include "Basics/FileUtils.h"
#include "Basics/Mutex.h"
#include "Basics/MutexLocker.h"
#include "Basics/StringUtils.h"
#include "Logger/Logger.h"
#include "UserManager/Role.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief registry lock
////////////////////////////////////////////////////////////////////////////////
static Mutex UserLock;
////////////////////////////////////////////////////////////////////////////////
/// @brief user registry
////////////////////////////////////////////////////////////////////////////////
static map<string, User*> UserRegistry;
////////////////////////////////////////////////////////////////////////////////
/// @brief path to database
////////////////////////////////////////////////////////////////////////////////
static string userDatabase;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief adds a new user
////////////////////////////////////////////////////////////////////////////////
User* User::create (string const& name, Role* role) {
MUTEX_LOCKER(UserLock);
map<string, User*>::const_iterator i = UserRegistry.find(name);
if (i != UserRegistry.end()) {
LOGGER_DEBUG << "user '" << name << "' already exists";
return 0;
}
User* user = new User(name, role);
UserRegistry[name] = user;
saveUser();
return user;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
User* User::lookup (string const& name) {
MUTEX_LOCKER(UserLock);
map<string, User*>::const_iterator i = UserRegistry.find(name);
if (i == UserRegistry.end()) {
return 0;
}
else {
return i->second;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a user
///
/// Remove will also delete the user object.
////////////////////////////////////////////////////////////////////////////////
bool User::remove (User* user) {
MUTEX_LOCKER(UserLock);
map<string, User*>::iterator i = UserRegistry.find(user->_name);
if (i == UserRegistry.end()) {
LOGGER_DEBUG << "user '" << user->_name << "' is unknown";
return false;
}
if (i->second != user) {
LOGGER_WARNING << "user '" << user->_name << "' does not matched stored profile";
return false;
}
if (! user->hasRight(RIGHT_TO_BE_DELETED)) {
LOGGER_WARNING << "user '" << user->_name << "' cannot be deleted";
return false;
}
UserRegistry.erase(i);
saveUser();
// This is a simple user manager, we are not deleting any old users.
// Otherwise we would need to create locks outside the "lookup" function
// to avoid deleting the current user, or we would need to use smart
// pointer or objects.
// delete user;
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
vector<User*> User::users () {
MUTEX_LOCKER(UserLock);
vector<User*> result;
for (map<string, User*>::const_iterator i = UserRegistry.begin(); i != UserRegistry.end(); ++i) {
result.push_back(i->second);
}
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief loads the user database
////////////////////////////////////////////////////////////////////////////////
bool User::loadUser (string const& path) {
userDatabase = path;
bool found = true;
if (userDatabase.empty()) {
return false;
}
if (! FileUtils::exists(userDatabase)) {
ofstream* of = FileUtils::createOutput(userDatabase);
if (of == 0) {
LOGGER_FATAL << "cannot create user database '" << userDatabase << "'";
exit(EXIT_FAILURE);
}
*of << "# EMPTY USER DATABASE\n";
if (of->fail()) {
LOGGER_FATAL << "cannot create user database '" << userDatabase << "'";
exit(EXIT_FAILURE);
}
delete of;
found = false;
}
ifstream* is = FileUtils::createInput(userDatabase);
if (is == 0) {
LOGGER_FATAL << "cannot read user database '" << userDatabase << "'";
return false;
}
while (true) {
string line;
getline(*is, line);
if (is->eof()) {
break;
}
if (is->fail()) {
LOGGER_FATAL << "cannot read user database '" << userDatabase << "'";
return false;
}
if (line.empty() || line[0] == '#') {
continue;
}
vector<string> split = StringUtils::split(line, ';');
if (split.size() != 3) {
LOGGER_FATAL << "corrupted user data '" << userDatabase << "'";
return false;
}
string const& name = split[2];
Role* role = Role::lookup(name);
if (role == 0) {
LOGGER_ERROR << "unknown role '" << name << "' in user database";
continue;
}
User* user = new User(split[0], role);
user->changePassword(split[1]);
UserRegistry[name] = user;
}
return found;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief saves the user database
////////////////////////////////////////////////////////////////////////////////
void User::saveUser () {
if (userDatabase.empty()) {
LOGGER_DEBUG << "no user database defined, cannot save data";
return;
}
string tmp = userDatabase + ".tmp";
if (FileUtils::exists(tmp)) {
if (! FileUtils::remove(tmp)) {
LOGGER_FATAL << "cannot remove the temporary user database '" << tmp << "'";
return;
}
}
ofstream* of = FileUtils::createOutput(tmp);
if (of == 0) {
LOGGER_FATAL << "cannot create the temporary user data '" << tmp << "'";
return;
}
for (map<string, User*>::const_iterator i = UserRegistry.begin(); i != UserRegistry.end(); ++i) {
User* user = i->second;
*of << StringUtils::escape(user->_name, ";") << ";"
<< StringUtils::escape(user->_password, ";") << ";"
<< StringUtils::escape(user->_role->getName(), ";")
<< "\n";
if (of->fail()) {
LOGGER_FATAL << "cannot write the temporary user data '" << tmp << "'";
delete of;
FileUtils::remove(tmp);
return;
}
}
delete of;
FileUtils::remove(userDatabase);
if (! FileUtils::rename(tmp, userDatabase)) {
LOGGER_FATAL << "could not rename the temporary user database '" << tmp << "'";
return;
}
LOGGER_DEBUG << "wrote user database '" << userDatabase << "'";
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new user
////////////////////////////////////////////////////////////////////////////////
User::User (string const& name, Role* role)
: _name(name), _password(""), _role(role) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the name of a user
////////////////////////////////////////////////////////////////////////////////
string const& User::getName () const {
return _name;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the role of a user
////////////////////////////////////////////////////////////////////////////////
Role* User::getRole () const {
return _role;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief changes the password of a user
////////////////////////////////////////////////////////////////////////////////
bool User::changePassword (string const& password) {
_password = password;
saveUser();
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief checks the password of a user
////////////////////////////////////////////////////////////////////////////////
bool User::checkPassword (string const& password) {
return _password == password;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief has right
////////////////////////////////////////////////////////////////////////////////
bool User::hasRight (right_t right) {
if (_role == 0) {
return false;
}
else {
set<right_t> const& rights = _role->getRights();
return rights.find(right) != rights.end();
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

220
UserManager/User.h Normal file
View File

@ -0,0 +1,220 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief a user
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_USER_H
#define TRIAGENS_USER_MANAGER_USER_H 1
#include "Basics/Common.h"
#include <UserManager/Right.h>
namespace triagens {
namespace admin {
class Role;
// -----------------------------------------------------------------------------
// --SECTION-- class User
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief a user
////////////////////////////////////////////////////////////////////////////////
class User {
User (User const&);
User& operator= (User const&);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief adds a new user
////////////////////////////////////////////////////////////////////////////////
static User* create (string const& name, Role*);
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
static User* lookup (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @brief removes a user
///
/// Remove will also delete the user object.
////////////////////////////////////////////////////////////////////////////////
static bool remove (User*);
////////////////////////////////////////////////////////////////////////////////
/// @brief returns a role by name
////////////////////////////////////////////////////////////////////////////////
static vector<User*> users ();
////////////////////////////////////////////////////////////////////////////////
/// @brief loads the user database
////////////////////////////////////////////////////////////////////////////////
static bool loadUser (string const& file);
////////////////////////////////////////////////////////////////////////////////
/// @brief saves the user database
////////////////////////////////////////////////////////////////////////////////
static void saveUser ();
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new user
////////////////////////////////////////////////////////////////////////////////
User (string const& name, Role*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the name of a user
////////////////////////////////////////////////////////////////////////////////
string const& getName () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the role of a user
////////////////////////////////////////////////////////////////////////////////
Role* getRole () const;
////////////////////////////////////////////////////////////////////////////////
/// @brief changes the password of a user
////////////////////////////////////////////////////////////////////////////////
bool changePassword (string const& password);
////////////////////////////////////////////////////////////////////////////////
/// @brief checks the password of a user
////////////////////////////////////////////////////////////////////////////////
bool checkPassword (string const& password);
////////////////////////////////////////////////////////////////////////////////
/// @brief has right
////////////////////////////////////////////////////////////////////////////////
bool hasRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief name
////////////////////////////////////////////////////////////////////////////////
string const _name;
////////////////////////////////////////////////////////////////////////////////
/// @brief password
////////////////////////////////////////////////////////////////////////////////
string _password;
////////////////////////////////////////////////////////////////////////////////
/// @brief role
////////////////////////////////////////////////////////////////////////////////
Role* _role;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

415
UserManager/UserHandler.cpp Normal file
View File

@ -0,0 +1,415 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief user handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "UserHandler.h"
#include "Rest/HttpRequest.h"
#include "Rest/HttpResponse.h"
#include "UserManager/Role.h"
#include "UserManager/Session.h"
#include "UserManager/User.h"
#include "Variant/VariantArray.h"
#include "Variant/VariantBoolean.h"
#include "Variant/VariantInt32.h"
#include "Variant/VariantVector.h"
using namespace std;
using namespace triagens::basics;
using namespace triagens::rest;
using namespace triagens::admin;
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns the authenticating session
////////////////////////////////////////////////////////////////////////////////
static Session* authSession (HttpRequest* request) {
bool found;
string const& sid = request->value("authSid", found);
if (! found) {
return 0;
}
Session* session = Session::lookup(sid);
if (session == 0) {
return 0;
}
return session;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief static constructor
////////////////////////////////////////////////////////////////////////////////
HttpHandler* UserHandler::create (rest::HttpRequest* request, void* data) {
return new UserHandler(request, (ApplicationUserManager*) data);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
UserHandler::UserHandler (HttpRequest* request, ApplicationUserManager* server)
: RestAdminBaseHandler(request), _server(server) {
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- Handler methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
bool UserHandler::isDirect () {
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UserHandler::execute () {
// extract the username
vector<string> const& suffix = request->suffix();
if (suffix.size() != 1) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_USERHANDLER_URL_INVALID);
return HANDLER_DONE;
}
string const& name = suffix[0];
// execute the request
switch (request->requestType()) {
case HttpRequest::HTTP_REQUEST_POST: return executePost(name);
case HttpRequest::HTTP_REQUEST_GET: return executeGet(name);
case HttpRequest::HTTP_REQUEST_PUT: return executePut(name);
case HttpRequest::HTTP_REQUEST_DELETE: return executeDelete(name);
default:
generateError(HttpResponse::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
return HANDLER_DONE;
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- protected methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session has given right
////////////////////////////////////////////////////////////////////////////////
bool UserHandler::hasRight (right_t right) {
Session* session = authSession(request);
if (session == 0) {
return false;
}
return session->hasRight(right);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session is bound to given user
////////////////////////////////////////////////////////////////////////////////
bool UserHandler::isSelf (string const& username) {
Session* session = authSession(request);
if (session == 0) {
return false;
}
User* user = User::lookup(username);
if (user == 0) {
return false;
}
return session->getUser() != user;
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief creates an user
///
/// @REST{POST /_admin/user-manager/user/@FA{user-name}}
///
/// Creates a new user named @FA{user-name}. Expects the following object.
///
/// - @LIT{role}: The role of the newly created user.
///
/// - @LIT{password}: The password of the user. The password must be a SHA256
/// hash of the real password.
///
/// The server will return a @LIT{HTTP 401}, if the current user has no right
/// to create a new user.
///
/// If the user was created a LIT{HTTP 200} is returned and the body contains
/// a description of the user, see @LIT{GET}.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UserHandler::executePost (string const& name) {
struct Description : public InputParser::ObjectDescription {
Description () {
attribute("role", role);
attribute("password", password);
}
string role;
string password;
} desc;
bool ok = parseBody(desc);
if (! ok) {
return HANDLER_DONE;
}
Role* role = Role::lookup(desc.role);
if (role == 0) {
generateError(HttpResponse::NOT_FOUND, TRI_ERROR_SESSION_USERHANDLER_ROLE_NOT_FOUND);
return HANDLER_DONE;
}
ok = hasRight(role->rightToManage());
if (! ok) {
generateError(HttpResponse::UNAUTHORIZED, TRI_ERROR_SESSION_USERHANDLER_NO_CREATE_PERMISSION);
return HANDLER_DONE;
}
User* user = User::create(name, role);
if (user == 0) {
generateError(HttpResponse::UNAUTHORIZED, TRI_ERROR_SESSION_USERHANDLER_CANNOT_CREATE_USER);
return HANDLER_DONE;
}
user->changePassword(desc.password);
generateUser(user);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief reads an user
///
/// @REST{GET /_admin/user-manager/user/@FA{user-name}}
///
/// Returns information about the user named @FA{user-name}.
///
/// - @LIT{role}: The role of the user. You should not use the role for
/// permissioning. Use the @LIT{rights} instead.
///
/// - @LIT{name}: The name of the user. You should not use the name for
/// permissioning. Use the @LIT{rights} instead.
///
/// - @LIT{rights}: A list of rights.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UserHandler::executeGet (string const& name) {
User* user = User::lookup(name);
if (user == 0) {
generateError(HttpResponse::NOT_FOUND, TRI_ERROR_SESSION_USERHANDLER_USER_NOT_FOUND);
return HANDLER_DONE;
}
generateUser(user);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief updates an user
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UserHandler::executePut (string const& name) {
if (! isSelf(name)) {
generateError(HttpResponse::UNAUTHORIZED, TRI_ERROR_SESSION_USERHANDLER_CANNOT_CHANGE_PW);
return HANDLER_DONE;
}
User* user = User::lookup(name);
if (user == 0) {
generateError(HttpResponse::NOT_FOUND, TRI_ERROR_SESSION_USERHANDLER_USER_NOT_FOUND);
return HANDLER_DONE;
}
struct Description : public InputParser::ObjectDescription {
Description () {
optional("password", password, hasPassword);
}
bool hasPassword;
string password;
} desc;
bool ok = parseBody(desc);
if (! ok) {
return HANDLER_DONE;
}
bool changed = true;
if (desc.hasPassword) {
changed = user->changePassword(desc.password);
}
VariantArray* result = new VariantArray();
result->add("changed", new VariantBoolean(changed));
generateResult(result);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief deletes an user
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UserHandler::executeDelete (string const& name) {
User* user = User::lookup(name);
bool removed = false;
if (user != 0) {
bool ok = hasRight(user->getRole()->rightToManage());
if (! ok) {
generateError(HttpResponse::UNAUTHORIZED, TRI_ERROR_SESSION_USERHANDLER_NO_CREATE_PERMISSION);
return HANDLER_DONE;
}
removed = User::remove(user);
}
VariantArray* result = new VariantArray();
result->add("removed", new VariantBoolean(removed));
generateResult(result);
return HANDLER_DONE;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief creates an new user
////////////////////////////////////////////////////////////////////////////////
void UserHandler::generateUser (User* user) {
VariantArray* result = new VariantArray();
result->add("role", user->getRole()->getName());
result->add("name", user->getName());
set<right_t> const& rights = user->getRole()->getRights();
VariantVector* r = new VariantVector();
for (set<right_t>::const_iterator i = rights.begin(); i != rights.end(); ++i) {
r->add(new VariantInt32(*i));
}
result->add("rights", r);
generateResult(result);
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

234
UserManager/UserHandler.h Normal file
View File

@ -0,0 +1,234 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief user handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_USER_HANDLER_H
#define TRIAGENS_USER_MANAGER_USER_HANDLER_H 1
#include "Admin/RestAdminBaseHandler.h"
#include "UserManager/Right.h"
namespace triagens {
namespace admin {
class ApplicationUserManager;
class User;
class Session;
// -----------------------------------------------------------------------------
// --SECTION-- class UserHandler
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief user handler
////////////////////////////////////////////////////////////////////////////////
class UserHandler : public RestAdminBaseHandler {
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- static public methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief static constructor
////////////////////////////////////////////////////////////////////////////////
static rest::HttpHandler* create (rest::HttpRequest* request, void* data);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- constructors and destructors
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
UserHandler (rest::HttpRequest* request, ApplicationUserManager*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- Handler methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
public:
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
bool isDirect ();
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
status_e execute ();
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- protected methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session has given right
////////////////////////////////////////////////////////////////////////////////
virtual bool hasRight (right_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief checks if authentication session is bound to given user
////////////////////////////////////////////////////////////////////////////////
virtual bool isSelf (string const& username);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief creates an user
////////////////////////////////////////////////////////////////////////////////
status_e executePost (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @brief reads an user
////////////////////////////////////////////////////////////////////////////////
status_e executeGet (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @brief updates an user
////////////////////////////////////////////////////////////////////////////////
status_e executePut (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @brief deletes as user
////////////////////////////////////////////////////////////////////////////////
status_e executeDelete (string const& name);
////////////////////////////////////////////////////////////////////////////////
/// @brief creates an new user
////////////////////////////////////////////////////////////////////////////////
void generateUser (User*);
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private variables
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup RestServer
/// @{
////////////////////////////////////////////////////////////////////////////////
private:
////////////////////////////////////////////////////////////////////////////////
/// @brief underlying user manager
////////////////////////////////////////////////////////////////////////////////
ApplicationUserManager* _server;
};
}
}
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
#endif
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -0,0 +1,93 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief users handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include "UsersHandler.h"
#include "Admin/ApplicationAdminServer.h"
#include "Variant/VariantArray.h"
#include "Variant/VariantString.h"
#include "Variant/VariantVector.h"
#include "Rest/HttpRequest.h"
#include "UserManager/User.h"
using namespace triagens::basics;
using namespace triagens::rest;
namespace triagens {
namespace admin {
// -----------------------------------------------------------------------------
// constructors and destructors
// -----------------------------------------------------------------------------
UsersHandler::UsersHandler (HttpRequest* request, ApplicationAdminServer* server)
: RestAdminBaseHandler(request), _server(server) {
}
// -----------------------------------------------------------------------------
// HttpHandler methods
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief returns all user names
///
/// @REST{GET /_admin/user-manager/users}
///
/// Returns all user names. The result object contains:
///
/// - @LIT{users}: a list of all user names.
////////////////////////////////////////////////////////////////////////////////
HttpHandler::status_e UsersHandler::execute () {
vector<string> const& suffix = request->suffix();
if (suffix.size() != 0) {
generateError(HttpResponse::BAD, TRI_ERROR_SESSION_USERSHANDLER_INVALID_URL);
return HANDLER_DONE;
}
if (request->requestType() != HttpRequest::HTTP_REQUEST_GET) {
generateError(HttpResponse::METHOD_NOT_ALLOWED, TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
return HANDLER_DONE;
}
vector<User*> users = User::users();
VariantArray* result = new VariantArray();
VariantVector* list = new VariantVector();
result->add("users", list);
for (vector<User*>::iterator i = users.begin(); i != users.end(); ++i) {
list->add((*i)->getName());
}
generateResult(result);
return HANDLER_DONE;
}
}
}

View File

@ -0,0 +1,83 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief users handler
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2004-2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Dr. Frank Celler
/// @author Copyright 2011-2012, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#ifndef TRIAGENS_USER_MANAGER_USERS_HANDLER_H
#define TRIAGENS_USER_MANAGER_USERS_HANDLER_H 1
#include "Admin/RestAdminBaseHandler.h"
namespace triagens {
namespace admin {
class ApplicationAdminServer;
class User;
////////////////////////////////////////////////////////////////////////////////
/// @brief user handler
////////////////////////////////////////////////////////////////////////////////
class UsersHandler : public RestAdminBaseHandler {
public:
////////////////////////////////////////////////////////////////////////////////
/// @brief static constructor
////////////////////////////////////////////////////////////////////////////////
static rest::HttpHandler* create (rest::HttpRequest* request, void* data) {
return new UsersHandler(request, (ApplicationAdminServer*) data);
}
public:
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
bool isDirect () {
return true;
}
////////////////////////////////////////////////////////////////////////////////
/// {@inheritDoc}
////////////////////////////////////////////////////////////////////////////////
status_e execute ();
protected:
////////////////////////////////////////////////////////////////////////////////
/// @brief constructor
////////////////////////////////////////////////////////////////////////////////
UsersHandler (rest::HttpRequest* request, ApplicationAdminServer*);
private:
ApplicationAdminServer* _server;
};
}
}
#endif

View File

@ -31,6 +31,25 @@
#include <VocBase/simple-collection.h>
// -----------------------------------------------------------------------------
// --SECTION-- private constants
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup VocBase
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief synchroniser interval in microseconds
////////////////////////////////////////////////////////////////////////////////
static int const SYNCHRONISER_INTERVAL = 1 * 1000 * 1000;
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- private functions
// -----------------------------------------------------------------------------
@ -374,7 +393,7 @@ void TRI_SynchroniserVocBase (void* data) {
if (! worked && vocbase->_active == 1) {
// only sleep while server is still running
usleep(1000);
usleep(SYNCHRONISER_INTERVAL);
}
if (active == 2) {