
30 changed files with 2185 additions and 7913 deletions
@ -0,0 +1,129 @@
@@ -0,0 +1,129 @@
|
||||
/**
|
||||
* libtransport -- C++ library for easy XMPP Transports development |
||||
* |
||||
* Copyright (C) 2016, Jan Kaluza <hanzz.k@gmail.com> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
||||
*/ |
||||
|
||||
#pragma once |
||||
|
||||
#include <string> |
||||
#include <map> |
||||
|
||||
#include "Swiften/Elements/Message.h" |
||||
#include "transport/StorageBackend.h" |
||||
|
||||
namespace Transport { |
||||
|
||||
class User; |
||||
|
||||
class AdminInterfaceCommand { |
||||
public: |
||||
typedef enum { |
||||
GlobalContext, |
||||
UserContext |
||||
} Context; |
||||
|
||||
typedef enum { |
||||
None = 0, |
||||
Get = 1, |
||||
Set = 2, |
||||
Execute = 4 |
||||
} Actions; |
||||
|
||||
typedef enum { |
||||
AdminMode, |
||||
UserMode |
||||
} AccessMode; |
||||
|
||||
typedef enum { |
||||
General, |
||||
Users, |
||||
Messages, |
||||
Frontend, |
||||
Backends, |
||||
Memory |
||||
} Category; |
||||
|
||||
class Arg { |
||||
public: |
||||
Arg(const std::string &_name, const std::string &_label, const std::string &_example) : |
||||
name(_name), label(_label), example(_example) {} |
||||
~Arg() {} |
||||
|
||||
std::string name; |
||||
std::string label; |
||||
std::string example; |
||||
}; |
||||
|
||||
AdminInterfaceCommand(const std::string &name, Category category, Context context, AccessMode accessMode, Actions actions); |
||||
|
||||
virtual ~AdminInterfaceCommand() { } |
||||
|
||||
void setDescription(const std::string &desc) { |
||||
m_desc = desc; |
||||
} |
||||
|
||||
const std::string &getDescription() { |
||||
return m_desc; |
||||
} |
||||
|
||||
const std::string &getName() { |
||||
return m_name; |
||||
} |
||||
|
||||
Actions getActions() { |
||||
return m_actions; |
||||
} |
||||
|
||||
Category getCategory() { |
||||
return m_category; |
||||
} |
||||
|
||||
const std::string getCategoryName(Category category); |
||||
|
||||
Context getContext() { |
||||
return m_context; |
||||
} |
||||
|
||||
AccessMode getAccessMode() { |
||||
return m_accessMode; |
||||
} |
||||
|
||||
void addArg(const std::string &name, const std::string &label, const std::string &example = "") { |
||||
Arg arg(name, label, example); |
||||
m_args.push_back(arg); |
||||
} |
||||
|
||||
const std::list<Arg> &getArgs() { |
||||
return m_args; |
||||
} |
||||
|
||||
virtual std::string handleSetRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args); |
||||
virtual std::string handleGetRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args); |
||||
virtual std::string handleExecuteRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args); |
||||
|
||||
private: |
||||
std::string m_name; |
||||
Category m_category; |
||||
Context m_context; |
||||
AccessMode m_accessMode; |
||||
Actions m_actions; |
||||
std::string m_desc; |
||||
std::list<Arg> m_args; |
||||
}; |
||||
|
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,120 @@
@@ -0,0 +1,120 @@
|
||||
/**
|
||||
* libtransport -- C++ library for easy XMPP Transports development |
||||
* |
||||
* Copyright (C) 2011, Jan Kaluza <hanzz.k@gmail.com> |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify |
||||
* it under the terms of the GNU General Public License as published by |
||||
* the Free Software Foundation; either version 2 of the License, or |
||||
* (at your option) any later version. |
||||
* |
||||
* This program is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
* GNU General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License |
||||
* along with this program; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
||||
*/ |
||||
|
||||
#include "transport/AdminInterfaceCommand.h" |
||||
#include "transport/User.h" |
||||
|
||||
#include <boost/foreach.hpp> |
||||
#include <boost/lexical_cast.hpp> |
||||
#include <iostream> |
||||
|
||||
#include <Swiften/Version.h> |
||||
#define HAVE_SWIFTEN_3 (SWIFTEN_VERSION >= 0x030000) |
||||
|
||||
namespace Transport { |
||||
|
||||
AdminInterfaceCommand::AdminInterfaceCommand(const std::string &name, Category category, Context context, AccessMode accessMode, Actions actions) { |
||||
m_name = name; |
||||
m_category = category; |
||||
m_context = context; |
||||
m_accessMode = accessMode; |
||||
m_actions = actions; |
||||
} |
||||
|
||||
const std::string AdminInterfaceCommand::getCategoryName(Category category) { |
||||
switch (category) { |
||||
case AdminInterfaceCommand::General: |
||||
return "General"; |
||||
case AdminInterfaceCommand::Users: |
||||
return "Users"; |
||||
case AdminInterfaceCommand::Messages: |
||||
return "Messages"; |
||||
case AdminInterfaceCommand::Frontend: |
||||
return "Frontend"; |
||||
case AdminInterfaceCommand::Backends: |
||||
return "Backends"; |
||||
case AdminInterfaceCommand::Memory: |
||||
return "Memory"; |
||||
default: |
||||
return "Unknown"; |
||||
} |
||||
} |
||||
|
||||
std::string AdminInterfaceCommand::handleSetRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args) { |
||||
if ((m_actions & Set) == 0) { |
||||
return "Error: This variable cannot be set."; |
||||
} |
||||
|
||||
if (user && (m_accessMode & AdminMode) != 0) { |
||||
return "Error: You do not have rights to set this variable."; |
||||
} |
||||
|
||||
if ((!user && uinfo.id == -1) && (m_context & UserContext)) { |
||||
return "Error: This variable can be set only in user context."; |
||||
} |
||||
|
||||
if (args.empty()) { |
||||
return "Error: Value is missing."; |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
||||
std::string AdminInterfaceCommand::handleGetRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args) { |
||||
if ((m_actions & Get) == 0) { |
||||
return "Error: This variable cannot be get."; |
||||
} |
||||
|
||||
if (user && (m_accessMode & AdminMode) != 0) { |
||||
return "Error: You do not have rights to get this variable."; |
||||
} |
||||
|
||||
if ((!user && uinfo.id == -1) && (m_context & UserContext)) { |
||||
return "Error: This variable can be get only in user context."; |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
||||
std::string AdminInterfaceCommand::handleExecuteRequest(UserInfo &uinfo, User *user, std::vector<std::string> &args) { |
||||
if ((m_actions & Execute) == 0) { |
||||
return "Error: This is not a command, but a variable."; |
||||
} |
||||
|
||||
if (user && (m_accessMode & AdminMode) != 0) { |
||||
return "Error: You do not have rights to execute this command."; |
||||
} |
||||
|
||||
if ((!user && uinfo.id == -1) && (m_context & UserContext)) { |
||||
return "Error: This command can be executed only in user context."; |
||||
} |
||||
|
||||
if (m_args.size() > args.size()) { |
||||
return "Error: Argument is missing."; |
||||
} |
||||
|
||||
if (m_args.size() < args.size()) { |
||||
return "Error: Too many arguments."; |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
||||
} |
File diff suppressed because one or more lines are too long