diff --git a/libtransport/AdminInterfaceCommand.cpp b/libtransport/AdminInterfaceCommand.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9a25726f8c6d346e5a8964db26931e5d88ff4ef7 --- /dev/null +++ b/libtransport/AdminInterfaceCommand.cpp @@ -0,0 +1,120 @@ +/** + * libtransport -- C++ library for easy XMPP Transports development + * + * Copyright (C) 2011, Jan Kaluza + * + * 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 +#include +#include + +#include +#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 &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 &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 &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 ""; +} + +}