- /*
- * Change the mode
- */
-
- if (mask & SILC_UMODE_SERVER_OPERATOR) {
- if (!(client->mode & SILC_UMODE_SERVER_OPERATOR)) {
- /* Cannot operator mode */
- silc_server_command_send_status_reply(cmd, SILC_COMMAND_UMODE,
- SILC_STATUS_ERR_PERM_DENIED);
- goto out;
- }
- } else {
- /* Remove the server operator rights */
- if (client->mode & SILC_UMODE_SERVER_OPERATOR) {
- client->mode &= ~SILC_UMODE_SERVER_OPERATOR;
- if (client->connection)
- server->stat.my_server_ops--;
- if (server->server_type == SILC_ROUTER)
- server->stat.server_ops--;
- }
- }
-
- if (mask & SILC_UMODE_ROUTER_OPERATOR) {
- if (!(client->mode & SILC_UMODE_ROUTER_OPERATOR)) {
- /* Cannot operator mode */
- silc_server_command_send_status_reply(cmd, SILC_COMMAND_UMODE,
- SILC_STATUS_ERR_PERM_DENIED);
- goto out;
- }
- } else {
- /* Remove the router operator rights */
- if (client->mode & SILC_UMODE_ROUTER_OPERATOR) {
- client->mode &= ~SILC_UMODE_ROUTER_OPERATOR;
- if (client->connection)
- server->stat.my_router_ops--;
- if (server->server_type == SILC_ROUTER)
- server->stat.router_ops--;
- }
+ /* Check that mode changing is allowed. */
+ if (!silc_server_check_umode_rights(server, client, mask)) {
+ silc_server_command_send_status_reply(cmd, SILC_COMMAND_UMODE,
+ SILC_STATUS_ERR_PERM_DENIED);
+ goto out;