Improve logging for kick/ban
[umurmur.git] / src / messagehandler.c
index 1b94204294e4393fc877ef1fcd55669e053f69d1..50b648a29fbecf31a8d9e22d3b8d276945f16ada 100644 (file)
@@ -1,5 +1,5 @@
-/* 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.
 
@@ -122,20 +122,19 @@ void Mh_handle_message(client_t *client, message_t *msg)
                        if (msg->payload.authenticate->n_tokens > 0) {
                                Log_debug("Tokens in auth message from '%s'. n_tokens = %d", client->username,
                                          msg->payload.authenticate->n_tokens);
-                               addTokens(client, msg);
-                               
-                               /* Check if admin PW among tokens */
-                               if (strlen(getStrConf(ADMIN_PASSPHRASE)) > 0 &&
-                                   Client_token_match(client, getStrConf(ADMIN_PASSPHRASE))) {
-                                       client->isAdmin = true;
-                                       Log_info("User is admin");
-                               }                               
+                               addTokens(client, msg);                         
                        }
                        break;
                }
                
+               if (SSLi_getSHA1Hash(client->ssl, client->hash) && Ban_isBanned(client)) {
+                       char hexhash[41];
+                       SSLi_hash2hex(client->hash, hexhash);
+                       Log_info("Client with hash '%s' is banned. Disconnecting", hexhash);
+                       goto disconnect;
+               }
+               
                client->authenticated = true;
-               SSLi_getSHA1Hash(client->ssl, client->hash);
                
                client_itr = NULL;
                while (Client_iterate(&client_itr) != NULL) {
@@ -188,7 +187,7 @@ void Mh_handle_message(client_t *client, message_t *msg)
                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 */
@@ -410,7 +409,7 @@ void Mh_handle_message(client_t *client, message_t *msg)
                }
 
                if (msg->payload.userState->has_user_id || msg->payload.userState->has_suppress ||
-                       msg->payload.userState->has_texture) {
+                   msg->payload.userState->has_priority_speaker || msg->payload.userState->has_texture) {
                        sendPermissionDenied(client, "Not supported by uMurmur");
                        break;
                }
@@ -425,6 +424,10 @@ void Mh_handle_message(client_t *client, message_t *msg)
 
                if (msg->payload.userState->has_deaf) {
                        target->deaf = msg->payload.userState->deaf;
+                       if (target->deaf) {
+                               msg->payload.userState->has_mute = true;
+                               msg->payload.userState->mute = true;
+                       }
                }
                if (msg->payload.userState->has_mute) {
                        target->mute = msg->payload.userState->mute;
@@ -509,6 +512,8 @@ void Mh_handle_message(client_t *client, message_t *msg)
                break;
                
        case TextMessage:
+               if (!getBoolConf(ALLOW_TEXTMESSAGE))
+                       break;
                msg->payload.textMessage->has_actor = true;
                msg->payload.textMessage->actor = client->sessionId;
 
@@ -614,11 +619,15 @@ void Mh_handle_message(client_t *client, message_t *msg)
        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;
+               
                Client_send_message(client, msg);
                break;
        case UDPTunnel:
@@ -826,10 +835,10 @@ void Mh_handle_message(client_t *client, message_t *msg)
                msg->payload.userRemove->actor = client->sessionId;
 
                if (msg->payload.userRemove->has_ban && msg->payload.userRemove->ban) {
-                       Log_info("User banned for %d seconds", getIntConf(BAN_LENGTH));
-                       /* Put reason, IP, hash, name etc in a list   --->  msg->payload.userRemove->reason */
+                       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);