Merge pull request #1391 from woogerboy21/admin_adjustmods

Allows admins to promote users to mod and demote mod to user
This commit is contained in:
Zach 2015-08-22 00:03:46 -04:00
commit e9156ecd62
15 changed files with 158 additions and 4 deletions

View file

@ -19,6 +19,7 @@
***************************************************************************/
#include <iostream>
#include <QSqlError>
#include <QSqlQuery>
#include <QHostAddress>
#include <QDebug>
@ -49,6 +50,7 @@
#include "pb/event_server_identification.pb.h"
#include "pb/event_add_to_list.pb.h"
#include "pb/event_remove_from_list.pb.h"
#include "pb/event_notify_user.pb.h"
#include "pb/response_deck_list.pb.h"
#include "pb/response_deck_download.pb.h"
#include "pb/response_deck_upload.pb.h"
@ -309,6 +311,7 @@ Response::ResponseCode ServerSocketInterface::processExtendedAdminCommand(int cm
case AdminCommand::SHUTDOWN_SERVER: return cmdShutdownServer(cmd.GetExtension(Command_ShutdownServer::ext), rc);
case AdminCommand::UPDATE_SERVER_MESSAGE: return cmdUpdateServerMessage(cmd.GetExtension(Command_UpdateServerMessage::ext), rc);
case AdminCommand::RELOAD_CONFIG: return cmdReloadConfig(cmd.GetExtension(Command_ReloadConfig::ext), rc);
case AdminCommand::ADJUST_MOD: return cmdAdjustMod(cmd.GetExtension(Command_AdjustMod::ext), rc);
default: return Response::RespFunctionNotAllowed;
}
}
@ -1000,3 +1003,52 @@ Response::ResponseCode ServerSocketInterface::cmdReloadConfig(const Command_Relo
settingsCache->sync();
return Response::RespOk;
}
Response::ResponseCode ServerSocketInterface::cmdAdjustMod(const Command_AdjustMod &cmd, ResponseContainer & /*rc*/) {
QString userName = QString::fromStdString(cmd.user_name());
if (cmd.should_be_mod()) {
QSqlQuery *query = sqlInterface->prepareQuery(
"update {prefix}_users set admin = :adminlevel where name = :username");
query->bindValue(":adminlevel", 2);
query->bindValue(":username", userName);
if (!sqlInterface->execSqlQuery(query)){
logger->logMessage(QString::fromStdString("Failed to promote user %1: %2").arg(userName).arg(query->lastError().text()));
return Response::RespInternalError;
}
ServerSocketInterface *user = static_cast<ServerSocketInterface *>(server->getUsers().value(userName));
if (user) {
Event_NotifyUser event;
event.set_type(Event_NotifyUser::PROMOTED);
SessionEvent *se = user->prepareSessionEvent(event);
user->sendProtocolItem(*se);
delete se;
}
} else {
QSqlQuery *query = sqlInterface->prepareQuery("update {prefix}_users set admin = :adminlevel where name = :username");
query->bindValue(":adminlevel", 0);
query->bindValue(":username", userName);
if (!sqlInterface->execSqlQuery(query)){
logger->logMessage(QString::fromStdString("Failed to demote user %1: %2").arg(userName).arg(query->lastError().text()));
return Response::RespInternalError;
}
ServerSocketInterface *user = static_cast<ServerSocketInterface *>(server->getUsers().value(userName));
if (user) {
Event_ConnectionClosed event;
event.set_reason(Event_ConnectionClosed::DEMOTED);
event.set_reason_str("Your moderator status has been revoked.");
event.set_end_time(QDateTime::currentDateTime().toTime_t());
SessionEvent *se = user->prepareSessionEvent(event);
user->sendProtocolItem(*se);
delete se;
}
QMetaObject::invokeMethod(user, "prepareDestroy", Qt::QueuedConnection);
}
return Response::RespOk;
}

View file

@ -100,6 +100,7 @@ private:
Response::ResponseCode cmdRegisterAccount(const Command_Register &cmd, ResponseContainer &rc);
Response::ResponseCode cmdActivateAccount(const Command_Activate &cmd, ResponseContainer & /* rc */);
Response::ResponseCode cmdReloadConfig(const Command_ReloadConfig &/* cmd */, ResponseContainer & /*rc*/);
Response::ResponseCode cmdAdjustMod(const Command_AdjustMod &cmd, ResponseContainer & /*rc*/);
Response::ResponseCode processExtendedSessionCommand(int cmdType, const SessionCommand &cmd, ResponseContainer &rc);
Response::ResponseCode processExtendedModeratorCommand(int cmdType, const ModeratorCommand &cmd, ResponseContainer &rc);