Fixed KILLED notify handling in normal server.
[silc.git] / apps / silcd / server_util.c
index 54ed8e135327edc2d7fe893863e173a5c802101d..6e3056c7e49fae5e9fda99e00f31b6b13f3ae7b3 100644 (file)
@@ -77,7 +77,7 @@ silc_server_remove_clients_channels(SilcServer server,
     silc_free(chl);
 
     /* Update statistics */
-    if (client->connection)
+    if (SILC_IS_LOCAL(client))
       server->stat.my_chanclients--;
     if (server->server_type == SILC_ROUTER) {
       server->stat.cell_chanclients--;
@@ -762,7 +762,7 @@ bool silc_server_channel_delete(SilcServer server,
     channel->user_count--;
 
     /* Update statistics */
-    if (chl->client->connection)
+    if (SILC_IS_LOCAL(chl->client))
       server->stat.my_chanclients--;
     if (server->server_type == SILC_ROUTER) {
       server->stat.cell_chanclients--;
@@ -1068,8 +1068,10 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_PASSPHRASE) {
-    if (is_op && !is_fo)
-      return FALSE;
+    if (!(channel->mode & SILC_CHANNEL_MODE_PASSPHRASE)) {
+      if (is_op && !is_fo)
+       return FALSE;
+    }
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_PASSPHRASE) {
       if (is_op && !is_fo)
@@ -1078,8 +1080,10 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
 
   if (mode & SILC_CHANNEL_MODE_CIPHER) {
-    if (is_op && !is_fo)
-      return FALSE;
+    if (!(channel->mode & SILC_CHANNEL_MODE_CIPHER)) {
+      if (is_op && !is_fo)
+       return FALSE;
+    }
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_CIPHER) {
       if (is_op && !is_fo)
@@ -1088,8 +1092,10 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH) {
-    if (is_op && !is_fo)
-      return FALSE;
+    if (!(channel->mode & SILC_CHANNEL_MODE_FOUNDER_AUTH)) {
+      if (is_op && !is_fo)
+       return FALSE;
+    }
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_FOUNDER_AUTH) {
       if (is_op && !is_fo)
@@ -1098,8 +1104,10 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_SILENCE_USERS) {
-    if (is_op && !is_fo)
-      return FALSE;
+    if (!(channel->mode & SILC_CHANNEL_MODE_SILENCE_USERS)) {
+      if (is_op && !is_fo)
+       return FALSE;
+    }
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_SILENCE_USERS) {
       if (is_op && !is_fo)
@@ -1108,8 +1116,10 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_SILENCE_OPERS) {
-    if (is_op && !is_fo)
-      return FALSE;
+    if (!(channel->mode & SILC_CHANNEL_MODE_SILENCE_OPERS)) {
+      if (is_op && !is_fo)
+       return FALSE;
+    }
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_SILENCE_OPERS) {
       if (is_op && !is_fo)
@@ -1297,12 +1307,17 @@ void silc_server_kill_client(SilcServer server,
   } else {
     /* Update statistics */
     server->stat.clients--;
-    server->stat.my_clients--;
     if (server->stat.cell_clients)
       server->stat.cell_clients--;
     SILC_OPER_STATS_UPDATE(remote_client, server, SILC_UMODE_SERVER_OPERATOR);
     SILC_OPER_STATS_UPDATE(remote_client, router, SILC_UMODE_ROUTER_OPERATOR);
 
+    if (SILC_IS_LOCAL(remote_client)) {
+      server->stat.my_clients--;
+      silc_schedule_task_del_by_context(server->schedule, remote_client);
+      silc_idlist_del_data(remote_client);
+    }
+
     /* Remove remote client */
     if (!silc_idlist_del_client(server->global_list, remote_client)) {
       /* Remove this client from watcher list if it is */