-/* Copyright (C) 2009-2011, Martin Johansson <martin@fatbob.nu>
- Copyright (C) 2005-2011, Thorvald Natvig <thorvald@natvig.com>
+/* Copyright (C) 2009-2012, Martin Johansson <martin@fatbob.nu>
+ Copyright (C) 2005-2012, Thorvald Natvig <thorvald@natvig.com>
All rights reserved.
#include "channel.h"
#include "conf.h"
#include "voicetarget.h"
+#include "ban.h"
#define MAX_TEXT 512
#define MAX_USERNAME 128
if (strlen(getStrConf(ADMIN_PASSPHRASE)) > 0 &&
Client_token_match(client, getStrConf(ADMIN_PASSPHRASE))) {
client->isAdmin = true;
- Log_info("User is admin");
+ Log_info_client(client, "User provided admin password");
}
/* Setup UDP encryption */
break;
case TextMessage:
+ if (!getBoolConf(ALLOW_TEXTMESSAGE))
+ break;
msg->payload.textMessage->has_actor = true;
msg->payload.textMessage->actor = client->sessionId;
case PermissionQuery:
Msg_inc_ref(msg); /* Re-use message */
msg->payload.permissionQuery->has_permissions = true;
+
if (client->isAdmin)
msg->payload.permissionQuery->permissions = PERM_ADMIN;
else
msg->payload.permissionQuery->permissions = PERM_DEFAULT;
+ if (!getBoolConf(ALLOW_TEXTMESSAGE))
+ msg->payload.permissionQuery->permissions &= ~PERM_TEXTMESSAGE;
+ if (!getBoolConf(ENABLE_BAN))
+ msg->payload.permissionQuery->permissions &= ~PERM_BAN;
+
Client_send_message(client, msg);
break;
case UDPTunnel:
memset(sendmsg->payload.userStats->address.data, 0, 16);
/* ipv4 representation as ipv6 address. Supposedly correct. */
memcpy(&sendmsg->payload.userStats->address.data[12], &target->remote_tcp.sin_addr, 4);
+ memset(&sendmsg->payload.userStats->address.data[10], 0xff, 2); /* IPv4 */
sendmsg->payload.userStats->address.len = 16;
}
/* BW */
msg->payload.userRemove->actor = client->sessionId;
if (msg->payload.userRemove->has_ban && msg->payload.userRemove->ban) {
- Ban_UserBan(target, msg->payload.userRemove->reason);
+ if (!getBoolConf(ENABLE_BAN))
+ sendPermissionDenied(client, "Permission denied");
+ else
+ Ban_UserBan(target, msg->payload.userRemove->reason);
} else {
- Log_info("User kicked");
+ Log_info_client(target, "User kicked. Reason: '%s'",
+ strlen(msg->payload.userRemove->reason) == 0 ? "N/A" : msg->payload.userRemove->reason);
}
/* Re-use message */
Msg_inc_ref(msg);
Client_send_message_except(NULL, msg);
Client_close(target);
break;
+ case BanList:
+ /* Only admin can issue this */
+ if (!client->isAdmin) {
+ sendPermissionDenied(client, "Permission denied");
+ break;
+ }
+ if (!getBoolConf(ENABLE_BAN)) {
+ sendPermissionDenied(client, "Permission denied");
+ break;
+ }
+ if (msg->payload.banList->has_query && msg->payload.banList->query) {
+ /* Create banlist message and add banentrys */
+ sendmsg = Ban_getBanList();
+ Client_send_message(client, sendmsg);
+ } else {
+ /* Clear banlist and set the new one */
+ Ban_clearBanList();
+ Ban_putBanList(msg, msg->payload.banList->n_bans);
+ }
+ break;
/* Permission denied for all these messages. Not implemented. */
case ChannelRemove:
case ContextAction:
case ContextActionAdd:
case ACL:
- case BanList:
case UserList:
case QueryUsers:
sendPermissionDenied(client, "Not supported by uMurmur");