updates
[silc.git] / apps / silcd / server_util.c
index 4cb11f4b76d1c40b032d5dc69b40b5966443172a..b00fbb0d707a2d778ad65a7e22e0a8d4e0abc260 100644 (file)
@@ -194,10 +194,9 @@ bool silc_server_remove_clients_by_server(SilcServer server,
          client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
          id_cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
        } else {
-         silc_idlist_del_client(server->local_list, client);
-
          /* Remove this client from watcher list if it is */
          silc_server_del_from_watcher_list(server, client);
+         silc_idlist_del_client(server->local_list, client);
        }
 
        if (!silc_idcache_list_next(list, &id_cache))
@@ -625,7 +624,7 @@ void silc_server_remove_channels_by_server(SilcServer server,
   SilcIDCacheEntry id_cache = NULL;
   SilcChannelEntry channel = NULL;
 
-  SILC_LOG_DEBUG(("Start"));
+  SILC_LOG_DEBUG(("Removing channels by server"));
 
   if (silc_idcache_get_all(server->global_list->channels, &list)) {
     if (silc_idcache_list_first(list, &id_cache)) {
@@ -651,7 +650,7 @@ void silc_server_update_channels_by_server(SilcServer server,
   SilcIDCacheEntry id_cache = NULL;
   SilcChannelEntry channel = NULL;
 
-  SILC_LOG_DEBUG(("Start"));
+  SILC_LOG_DEBUG(("Updating channels by server"));
 
   if (silc_idcache_get_all(server->global_list->channels, &list)) {
     if (silc_idcache_list_first(list, &id_cache)) {
@@ -1019,14 +1018,17 @@ bool silc_server_check_cmode_rights(SilcServer server,
   if (is_op && is_fo)
     return TRUE;
 
+  /* Founder implies operator */
+  if (is_fo)
+    is_op = TRUE;
+
   /* We know that client is channel operator, check that they are not
      changing anything that requires channel founder rights. Rest of the
      modes are available automatically for channel operator. */
 
   if (mode & SILC_CHANNEL_MODE_PRIVKEY) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_PRIVKEY))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
       if (is_op && !is_fo)
@@ -1035,9 +1037,8 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_PASSPHRASE) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_PASSPHRASE))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_PASSPHRASE) {
       if (is_op && !is_fo)
@@ -1046,9 +1047,8 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
 
   if (mode & SILC_CHANNEL_MODE_CIPHER) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_CIPHER))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_CIPHER) {
       if (is_op && !is_fo)
@@ -1057,9 +1057,8 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_FOUNDER_AUTH) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_FOUNDER_AUTH))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_FOUNDER_AUTH) {
       if (is_op && !is_fo)
@@ -1068,9 +1067,8 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_SILENCE_USERS) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_SILENCE_USERS))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_SILENCE_USERS) {
       if (is_op && !is_fo)
@@ -1079,9 +1077,8 @@ bool silc_server_check_cmode_rights(SilcServer server,
   }
   
   if (mode & SILC_CHANNEL_MODE_SILENCE_OPERS) {
-    if (!(channel->mode & SILC_CHANNEL_MODE_SILENCE_OPERS))
-      if (is_op && !is_fo)
-       return FALSE;
+    if (is_op && !is_fo)
+      return FALSE;
   } else {
     if (channel->mode & SILC_CHANNEL_MODE_SILENCE_OPERS) {
       if (is_op && !is_fo)
@@ -1266,7 +1263,6 @@ void silc_server_kill_client(SilcServer server,
     if (!silc_idlist_del_client(server->global_list, remote_client)) {
       /* Remove this client from watcher list if it is */
       silc_server_del_from_watcher_list(server, remote_client);
-
       silc_idlist_del_client(server->local_list, remote_client);  
     }
   }