dcc.cpp File Reference


Detailed Description

Handles DCC / telnet communication.

Definition in file dcc.cpp.

#include <vector>
#include <string>
#include <time.h>
#include <stdio.h>
#include <list>
#include <stdlib.h>
#include <sys/stat.h>
#include "sock.h"
#include "log.h"
#include "irc.h"
#include "lang.h"
#include "md5.h"
#include "conf.h"
#include "botnet.h"
#include "shared.h"
#include "filesys.h"
#include "stats.h"
#include "ssl.h"
#include "exec.h"
#include "match.h"
#include "dcc.h"
#include "params.h"

Include dependency graph for dcc.cpp:

Go to the source code of this file.

Classes

struct  s_dcc_client
 Stores DCC state of user. More...
struct  s_dcc_client::s_dcc_client_send
 Stores data about temporary file being uploaded via DCC SEND. More...
struct  s_dcc_client::s_fs
 Stores data about file from the filesystem. More...
struct  s_dcc_client_to_resume
 Stores temporary resume information for DCC. More...
struct  s_dcc_send_file
 Stores informations about DCC SEND-ing file. More...
struct  s_dcc_server
 Stores DCC server's parameters. More...
struct  s_session
 Stores temporary data for counting amount of sessions. More...
struct  s_telnet_server
 Stores telnet server's parameters. More...
struct  s_user_to_lag
 Stores information about usage of DCC requests for users. Used for flood protection. More...

Defines

#define FILE_SLASH   "/"
#define NEW_INSTANCE_TIMEOUT_AFTER_LAST_JOIN   3*60
 Number of seconds as timeout after .upgrade command, and after last new instance's join to kill myself.

Functions

void dcc_apply (string who)
 Called after .apply. Applies new configuration to all connected users on DCC/telnet (also BOTNET) connections.
void dcc_broadcast (string msg)
 Broatcasts the message to all connected users on DCC/telnet connection (used for kill message).
bool dcc_can_unassign (vector< s_dcc_client >::iterator i, string &eol, string proc_name)
 Check wheter user can unassign procedure for event (has access_usage_procedure right).
void dcc_check_for_filesystem (string user_name)
 Check filesystem for new files for user.
void dcc_check_limit ()
 Check for maximum connection limit rule, and drop some.
void dcc_close_all ()
 Closes all DCC/telnet connections.
void dcc_close_servers ()
 Closes listening sockets.
void dcc_file_has_been_read (string public_name, string nick)
 Called to set the READ-"ed" flag and notify OWNER(s) if needed.
void dcc_flush_all ()
 Flushes all pending DCC/telnet connection caches.
string dcc_get_line (string &buff)
 Extracts one line from buffer.
int dcc_get_num_of_transfers ()
 Retrieves number of concurrent DCC trtansfers.
string dcc_get_password (string user)
 Gets MD5-encoded password for user.
string dcc_get_string (string msg, int &dcc_group)
 Constructs response to "dcc" or "dcc <group_number>" PRIVMSG.
void dcc_loop ()
 Check for pending connections and handles existing ones.
void dcc_loop_edit_chan (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process edit channel definitions commands in DCC CHAT/telnet connections.
void dcc_loop_edit_dynbans (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process edit channel's dynamic bans in DCC CHAT/telnet connections.
void dcc_loop_edit_proc (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process new / edit procedure commands in DCC CHAT/telnet connections.
void dcc_loop_edit_rproc (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process edit remote procedure call ability (.rproc) command in DCC CHAT/telnet connections.
void dcc_loop_edit_user1 (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process edit user / new user commands in DCC CHAT/telnet connections.
void dcc_loop_edit_user2 (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process edit user / new user commands in DCC CHAT/telnet connections.
void dcc_loop_filesystem (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process filesystem commands in DCC CHAT/telnet connections.
string dcc_loop_filesystem_disp_rights (string lang, s_access &access, string eol)
 Returns access rights to file.
void dcc_loop_get_rights (vector< s_dcc_client >::iterator i)
 Gets/resets user's access rights.
void dcc_loop_language (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process .lang commands in DCC CHAT/telnet connections.
void dcc_loop_msg (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process message/filesystem commands in DCC CHAT/telnet connections.
void dcc_loop_new_user (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process new user commands in DCC CHAT/telnet connections.
void dcc_loop_private (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to .private command.
void dcc_loop_replication (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process .replication commands in DCC CHAT/telnet connections.
void dcc_loop_terminator (vector< s_dcc_client >::iterator i, string &eol)
 Should be called in a loop to process .terminator commands in DCC CHAT/telnet connections.
void dcc_make_server (int ipv, int group, const char *bind_ip, unsigned short bind_port, string server_type)
 Binds DCC server.
void dcc_make_telnet_server (int ipv, const char *bind_ip, unsigned short bind_port)
 Binds telnet server.
void dcc_notify (string user, int reason, string incomplete_file)
 Notifies user about filesystem events.
void dcc_partyline_message (string channel, string message)
 Message for partyline channel distribution.
string dcc_put_multiple_lines (string msg, string eol)
 Parses message, replaces new line signs.
void dcc_rehashed (string who)
 Called from logic.cpp after rehashing. Applies new configuration to all connected users on DCC/telnet (also BOTNET) connections.
int dcc_send_file (bool from_dcc, string public_name, string nick, int dcc_group)
 Sends file to remote host.
void dcc_send_msg (s_socket &socket, string msg, int &ec)
 Sends a message to DCC CHAT / telnet connection and updates statistics.
void dcc_set_password (string user, string md5pass)
 Sets password for user.
void dcc_upgrade (vector< s_dcc_client >::iterator i, string &eol, string new_file_name)
 Tries to upgrade bot.
void dcc_upgrade_bot_join (string nick, string ident, string host, string fullname, string channel)
 Called in UPGRADE state, to inform user who initiated .upgrade command that another instance is on channel.
void dcc_upgrade_bot_mode (string nick, string ident, string host, string fullname, string channel, string mode)
 Called in UPGRADE state, to inform user who initiated .upgrade command that another instance on some channel gets some mode.
void dcc_upgrade_bot_nick (string nick, string ident, string host, string fullname, string new_nick)
 Called in UPGRADE state, to inform user who initiated .upgrade command that another instance changed its nick.
void dcc_user_pong (string time_, string user, string origin_bot)
 Message for partyline user's pong.
void irc_quoted_callback (const char *str, const char *nick, const char *host_mask)
 Called when 0x01-quoted PRIVMSG has been received to initialise DCC CHAT or DCC SEND connection.
void logic_partyline_access (string user, vector< string > &access_to_users, vector< string > &access_to_groups, vector< string > &access_grant_groups, vector< string > &access_to_proc_groups, vector< string > &access_grant_proc_groups, vector< string > &access_grant_proc, vector< string > &access_to_channel, vector< string > &access_grant_channel, bool &access_grant_partyline, vector< string > &access_to_procs, bool &access_to_backup, bool &access_grant_backup, bool &access_to_rehash, bool &access_grant_rehash, bool &access_to_plususer, bool &access_grant_plususer, bool &access_to_plusproc, bool &access_grant_plusproc, s_flood &partyline_msg_flood, bool &access_to_replication, bool &access_grant_replication, vector< string > &access_to_chan_defs, bool &access_to_restart, bool &access_grant_restart, bool &access_to_die, bool &access_grant_die, bool &access_to_filesystem, bool &access_grant_filesystem, bool &access_to_private, bool &access_grant_private, bool &access_to_can_send_all_users, bool &access_grant_can_send_all_users, bool &access_to_can_send_unknown_users, bool &access_grant_can_send_unknown_users, vector< string > &access_usage_proc, vector< string > &access_usage_proc_groups, bool &access_to_upgrade, bool &access_grant_upgrade, bool &access_to_apply, bool &access_grant_apply)
 Retrieves access rights of user on partyline.
bool logic_partyline_add_channel_def (s_channel_def &chd)
 Adds a channel definition.
void logic_partyline_add_user (s_user &user, vector< s_channel > &channels)
 Adds an user with channels definition.
bool logic_partyline_get_channel_def (string channel_name, s_channel_def &chd)
 Gets channel definition.
void logic_partyline_get_user (string user_name, s_user &user, vector< s_channel > &channels)
 Retrieves an user with channels.
void logic_partyline_get_user_template (string user_name, s_user &user, vector< s_channel > &channels)
 Retrieves an user template with channels.
void logic_partyline_remove_channel_def (string channel_name)
 Deletes channel definition.
char * ltoa (long value, char *buffer, int radix)
 ltoa() emulation for compiler which doesn't have it
void sleep (int ms)
 Sleeps.

Variables

vector< s_dcc_send_filedcc_awaiting_send
 List of files that are awaiting to send (DCC SEND) to remote host.
vector< s_dcc_awaiting_userdcc_awaiting_users
 Stores users who are waiting for DCC connection.
vector< s_dcc_clientdcc_clients
 List of DCC clients.
string dcc_killing_user_eol
 EOL string for user (DCC/telnet) who is killing the bot (.die/.restart).
string dcc_killing_user_lang
 Language code string for user (DCC/telnet) who is killing the bot (.die/.restart).
s_socketdcc_killing_user_socket = NULL
 Socket of DCC/telnet user who is killing the bot (.die/.restart), or NULL; (will be sent log to it).
vector< s_dcc_request_whoisdcc_request_whois
 Array, that stores DCC requests that are pending to establis, and waiting for whois result.
vector< s_dcc_serverdcc_servers
 List of DCC servers.
vector< s_dcc_client_to_resumedcc_to_resume
 Temporary array for user who wants to resume.
vector< s_user_to_lock_outdcc_users_to_lock_out
 Users to lock out due to bad log in.
bool dcc_want_to_die = false
 Set to true if .die command wants to kill the bot.
bool dcc_want_to_restart = false
 Set to true if .restart command wants to restart the bot.
bool dcc_want_to_upgrade = false
 Set to true if .upgrade command wants to upgrade the bot.
string dcc_who_is_killing
 Name of user (from "logic.txt") who invoked .restart/.die command.
vector< s_online_channelirc_channels
 List of channels we are on.
char irc_nick [512]
 Bot's current nick.
time_t last_new_instance_join
 After .upgrade command, there is timestamp of last new instance's join some channel.
vector< s_groupr_all_groups
 List of all groups for real usage (not temporary / compilation!).
vector< s_channel_defr_channel_defs
 List of real channel definitions (not temporary / compilation!).
vector< s_channelr_channel_templates
 List of channel templates for real usage (not temporary / compilation!).
vector< s_channelr_channels
 List of channels for real usage (not temporary / compilation!).
s_private r_private
 Informations about procedures when someone sends query message (not temporary / compilation!).
vector< s_procedurer_procedures
 List of procedures for real usage (not temporary / compilation!).
vector< s_userr_user_templates
 List of users templates for real usage (not temporary / compilation!).
vector< s_userr_users
 List of users for real usage (not temporary / compilation!).
s_ssl_conf ssl_conf
 Configuration of SSL.
vector< s_telnet_servertelnet_servers
 List of telnet servers.
vector< s_user_to_lagusers_to_lag
 Array of DCC requests statistics (for flood protection).


Define Documentation

#define FILE_SLASH   "/"
 

Definition at line 76 of file dcc.cpp.

Referenced by dcc_loop(), dcc_send_file(), dcc_upgrade(), filesys_add_file_raw(), filesys_dcc_add_message(), filesys_dcc_check_for_notifies(), filesys_dcc_check_for_resume(), filesys_dcc_delete(), filesys_flush(), filesys_init(), lang_get_langs(), lang_get_string(), lang_rehash(), log_bot(), log_botnet(), log_botnet_debug(), log_broadcast(), log_channel(), log_debug(), log_free_locks(), log_identd(), log_init(), log_irc(), log_socket(), log_ssl(), logic_exec(), logic_exec_script(), logic_rollback(), and main().

#define NEW_INSTANCE_TIMEOUT_AFTER_LAST_JOIN   3*60
 

Number of seconds as timeout after .upgrade command, and after last new instance's join to kill myself.

Definition at line 94 of file dcc.cpp.

Referenced by dcc_loop().


Function Documentation

void dcc_apply string  who  ) 
 

Called after .apply. Applies new configuration to all connected users on DCC/telnet (also BOTNET) connections.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
who This should contain who caused .apply (to inform connected users)

Definition at line 16307 of file dcc.cpp.

References dcc_clients, dcc_loop_get_rights(), dcc_send_msg(), lang_get_string(), and lang_subst().

Referenced by dcc_loop().

16308 {
16309     vector<s_dcc_client>::iterator i;
16310     char dcc_eol[4]="\n\0";
16311     char telnet_eol[4]="\r\n\0";
16312     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
16313         if((*i).got_passwd!=3)
16314             continue;
16315         dcc_loop_get_rights(i);
16316         if((*i).send)
16317             continue;
16318         if((*i).send_from_filesystem)
16319             continue;
16320         if((*i).replication_partner)
16321             continue;
16322         if((*i).ssl_connection)
16323             continue;
16324         if(!(*i).chat)
16325             continue;
16326         string eol=(*i).telnet?telnet_eol:dcc_eol;
16327         string disp=lang_subst(lang_get_string(1,(*i).lang,687),who)+eol;
16328         int ec=0;
16329         dcc_send_msg((*i).socket,disp,ec);
16330     }
16331 }

Here is the call graph for this function:

void dcc_broadcast string  msg  ) 
 

Broatcasts the message to all connected users on DCC/telnet connection (used for kill message).

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
msg Message

Definition at line 19203 of file dcc.cpp.

References dcc_clients, dcc_send_msg(), sock_flush_later(), and sock_send_cache().

Referenced by botnet_partyline_event(), dcc_upgrade(), logic_exec(), and main().

19204 {
19205     vector<s_dcc_client>::iterator i;
19206     char dcc_eol[4]="\n\0";
19207     char telnet_eol[4]="\r\n\0";
19208     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
19209         if((*i).got_passwd!=3)
19210             continue;
19211         if((*i).send)
19212             continue;
19213         if((*i).send_from_filesystem)
19214             continue;
19215         if((*i).replication_partner)
19216             continue;
19217         if((*i).ssl_connection)
19218             continue;
19219         if(!(*i).chat)
19220             continue;
19221         string eol=(*i).telnet?telnet_eol:dcc_eol;
19222         string disp=msg+eol;
19223         int ec=0;
19224         dcc_send_msg((*i).socket,disp,ec);
19225         sock_send_cache();
19226         sock_flush_later((*i).socket);
19227     }
19228 }

Here is the call graph for this function:

bool dcc_can_unassign vector< s_dcc_client >::iterator  i,
string &  eol,
string  proc_name
 

Check wheter user can unassign procedure for event (has access_usage_procedure right).

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string
proc_name Name of procedure
Returns:
Returns true if can unassign

Definition at line 2738 of file dcc.cpp.

Referenced by dcc_loop(), dcc_loop_edit_chan(), dcc_loop_edit_user1(), dcc_loop_edit_user2(), dcc_loop_new_user(), and dcc_loop_private().

02739 {
02740     if(proc_name.empty())
02741         return true;
02742 
02743     if(proc_name.find("(",0)!=string::npos)
02744         proc_name.erase(proc_name.find("(",0),proc_name.length()-proc_name.find("(",0));
02745 
02746     vector<string>::iterator i1;
02747     for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++) {
02748         if(!(*i1).compare("*"))
02749             return true;
02750 
02751         string name_only=*i1;
02752         if(name_only.find("(",0)!=string::npos)
02753             name_only.erase(name_only.find("(",0),name_only.length()-name_only.find("(",0));
02754 
02755         if(!name_only.compare(proc_name))
02756             return true;
02757     }
02758 
02759     return false;
02760 }

void dcc_check_for_filesystem string  user_name  ) 
 

Check filesystem for new files for user.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
user_name Name of the user from "logic.txt" file

Definition at line 19104 of file dcc.cpp.

References dcc_clients, dcc_put_multiple_lines(), dcc_send_msg(), filesys_dcc_check_for_notifies(), filesys_dcc_drop_notifies(), and lang_get_string().

Referenced by dcc_loop(), and dcc_notify().

19105 {
19106     char dcc_eol[4]="\n\0";
19107     char telnet_eol[4]="\r\n\0";
19108 
19109     bool got=false;
19110 
19111     vector<s_dcc_client>::iterator i;
19112     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
19113         if((*i).got_passwd!=3)
19114             continue;
19115         if(!(*i).chat)
19116             continue;
19117         if((*i).as_in_logic.compare(user_name))
19118             continue;
19119         string eol=(*i).telnet?telnet_eol:dcc_eol;
19120 
19121         got=true;
19122 
19123         string disp;
19124         {
19125             vector<s_dcc_notify> notifies;
19126             filesys_dcc_check_for_notifies((*i).as_in_logic,(*i).u,(*i).chs,"",notifies,true,(*i).lang,eol);
19127             filesys_dcc_drop_notifies((*i).as_in_logic,false);
19128             vector<s_dcc_notify>::iterator i1;
19129             bool unpublished=false;
19130             //bool incomplete=false;
19131             string incomplete_files;
19132             for(i1=notifies.begin(); i1!=notifies.end(); i1++) {
19133                 if(!unpublished && (*i1).unpublished) {
19134                     string msg=lang_get_string(1,(*i).lang,274); // 331
19135                     disp+=dcc_put_multiple_lines(msg,eol);
19136                     unpublished=true;
19137                 }
19138                 if((*i1).incomplete) {
19139                     if(!incomplete_files.empty())
19140                         incomplete_files+=", ";
19141                     incomplete_files+="\"";
19142                     incomplete_files+=(*i1).name;
19143                     incomplete_files+="\"";
19144                 }
19145                 if((*i1).notify_owner || (*i1).notify_user || (*i1).secure_notify_owner || (*i1).secure_notify_user) {
19146                     string msg=(*i1).message;
19147                     disp+=dcc_put_multiple_lines(msg,eol);
19148                 }
19149             }
19150             if(!incomplete_files.empty()) {
19151                 disp+=dcc_put_multiple_lines(lang_get_string(1,(*i).lang,402),eol);
19152                 disp+=dcc_put_multiple_lines(incomplete_files,eol);
19153             }
19154         }
19155 
19156         if(!disp.empty()) {
19157             int ec=0;
19158             dcc_send_msg((*i).socket,disp,ec);
19159         }
19160     }
19161 }

Here is the call graph for this function:

void dcc_check_limit  ) 
 

Check for maximum connection limit rule, and drop some.

Author:
VooDooMan
Version:
1
Date:
2005

Definition at line 16228 of file dcc.cpp.

References conf_getvar(), dcc_clients, dcc_send_msg(), s_socket::handle, s_dcc_client::lang, lang_get_string(), s_dcc_client::last_input, sock_close(), s_dcc_client::socket, and s_dcc_client::telnet.

Referenced by dcc_loop(), and irc_quoted_callback().

16229 {
16230     if(atol(conf_getvar("dcc_max_sessions_per_ip").c_str())==0)
16231         return;
16232 
16233     map<string,s_session> sessions;
16234 
16235     vector<s_dcc_client>::iterator i1;
16236     for(i1=dcc_clients.begin(); i1!=dcc_clients.end(); i1++) {
16237         if(!(*i1).replication_partner && (*i1).chat && !(*i1).remote.empty()) {
16238             pair<string,s_session> p;
16239             p.first=(*i1).remote;
16240             p.second.num=1;
16241             p.second.c.clear();
16242             p.second.c.push_back(&(*i1));
16243 
16244             map<string,s_session>::iterator i2;
16245             bool got=false;
16246             for(i2=sessions.begin(); i2!=sessions.end(); i2++) {
16247                 if(!(*i2).first.compare(p.first)) {
16248                     got=true;
16249                     (*i2).second.num++;
16250                     break;
16251                 }
16252             }
16253             if(!got)
16254                 sessions.insert(p);
16255         }
16256     }
16257     map<string,s_session>::iterator i2;
16258     for(i2=sessions.begin(); i2!=sessions.end(); i2++) {
16259         if((*i2).second.num>atol(conf_getvar("dcc_max_sessions_per_ip").c_str())) {
16260             s_dcc_client* max_idle=NULL;
16261 
16262             vector<s_dcc_client*>::iterator i3;
16263             for(i3=(*i2).second.c.begin(); i3!=(*i2).second.c.end(); i3++) {
16264                 if(max_idle==NULL) {
16265                     max_idle=*i3;
16266                     continue;
16267                 }
16268                 if((*i3)->last_input<max_idle->last_input)
16269                     max_idle=*i3;
16270             }
16271             if(max_idle==NULL) // huh?! just in case... ;-)
16272                 continue;
16273 
16274             string lang=max_idle->lang;
16275             if(lang.empty())
16276                 lang="en";
16277             
16278             char dcc_eol[4]="\n\0";
16279             char telnet_eol[4]="\r\n\0";
16280             string eol=max_idle->telnet?telnet_eol:dcc_eol;
16281             
16282             vector<s_dcc_client>::iterator i4;
16283             for(i4=dcc_clients.begin(); i4!=dcc_clients.end(); i4++)
16284                 if((*i4).socket==max_idle->socket) {
16285                     dcc_clients.erase(i4);
16286                     break;
16287                 }
16288 
16289             if(dcc_killing_user_socket && max_idle->socket.handle==dcc_killing_user_socket->handle) {
16290             } else {
16291                 string disp=lang_get_string(1,lang,620)+eol;
16292                 int ec=0;
16293                 dcc_send_msg(max_idle->socket,disp,ec);
16294                 sock_close(max_idle->socket);
16295             }
16296         }
16297     }
16298 }

Here is the call graph for this function:

void dcc_close_all  ) 
 

Closes all DCC/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004

Definition at line 19314 of file dcc.cpp.

References dcc_clients, and sock_close().

Referenced by main().

19315 {
19316     vector<s_dcc_client>::iterator i;
19317     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++)
19318         sock_close((*i).socket);
19319 }

Here is the call graph for this function:

void dcc_close_servers  ) 
 

Closes listening sockets.

Author:
VooDooMan
Version:
1
Date:
2005

Definition at line 805 of file dcc.cpp.

References dcc_servers, sock_close(), and telnet_servers.

Referenced by dcc_upgrade(), and main().

00806 {
00807     {
00808         vector<s_dcc_server>::iterator i1;
00809     again_a:
00810         for(i1=dcc_servers.begin(); i1!=dcc_servers.end(); i1++) {
00811             sock_close((*i1).socket);
00812             dcc_servers.erase(i1);
00813             goto again_a;
00814         }
00815     }
00816     {
00817         vector<s_telnet_server>::iterator i1;
00818     again_b:
00819         for(i1=telnet_servers.begin(); i1!=telnet_servers.end(); i1++) {
00820             sock_close((*i1).socket);
00821             telnet_servers.erase(i1);
00822             goto again_b;
00823         }
00824     }
00825 }

Here is the call graph for this function:

void dcc_file_has_been_read string  public_name,
string  nick
 

Called to set the READ-"ed" flag and notify OWNER(s) if needed.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
public_name Public name of the file
nick Nick name of user

Definition at line 1271 of file dcc.cpp.

References s_file::access, s_event::clear(), conf_getvar(), dcc_get_num_of_transfers(), s_file::events, files, filesys_dcc_filelist(), filesys_dcc_set_file_attrs(), s_event::first, s_event::has_read, irc_get_fullname(), irc_get_host(), irc_get_ident(), irc_is_ircop(), logic_access_to_filesystem(), logic_find_user(), s_event::owner_notified, sock_resolve(), s_event::user_name, and s_event::user_notified.

Referenced by irc_loop_process_input().

01272 {
01273     if(dcc_get_num_of_transfers()>=atol(conf_getvar("dcc_max_transfers").c_str())) {
01274         return;
01275     }
01276 
01277     string ident=irc_get_ident(nick);
01278     string host=irc_get_host(nick);
01279     string full_name=irc_get_fullname(nick);
01280     in_addr ip=sock_resolve(host.c_str(),NULL);
01281 #ifdef _WIN32
01282     if(!ip.S_un.S_addr)
01283 #else
01284     if(!ip.s_addr)
01285 #endif
01286         return;
01287 
01288     string user_name=logic_find_user(nick,ident,host,full_name,irc_is_ircop(nick));
01289 
01290     if(!logic_access_to_filesystem(user_name))
01291         return;
01292 
01293     vector<s_file> files;
01294     filesys_dcc_filelist(user_name,files,false);
01295 
01296     s_file f;
01297 
01298     bool got=false;
01299 
01300     vector<s_file>::iterator i1;
01301     for(i1=files.begin(); i1!=files.end(); i1++) {
01302         if(!(*i1).public_name.compare(public_name)) {
01303             got=true;
01304             f=*i1;
01305         }
01306     }
01307 
01308     if(!got)
01309         return;
01310 
01311     got=false;
01312     vector<s_access>::iterator i2;
01313     for(i2=f.access.begin(); i2!=f.access.end(); i2++)
01314         if((*i2).all_users || !(*i2).user_name.compare(user_name))
01315             if((*i2).read) {
01316                 if((*i2).notify_owner) {
01317                     vector<s_event>::iterator i3;
01318                     bool has_read=false;
01319                     for(i3=f.events.begin(); i3!=f.events.end(); i3++) {
01320                         if(!(*i3).user_name.compare(user_name)) {
01321                             if((*i3).has_read)
01322                                 has_read=true;
01323                             break;
01324                         }
01325                     }
01326                     if(!has_read) {
01327                         s_event e;
01328                         e.clear();
01329                         e.has_read=true;
01330                         e.owner_notified=false;
01331                         e.user_name=user_name;
01332                         e.user_notified=false;
01333                         e.first=time(NULL);
01334 
01335                         f.events.push_back(e);
01336                         filesys_dcc_set_file_attrs(f);
01337                     }
01338                     break;
01339                 }
01340                 got=true;
01341                 break;
01342             }
01343     if(!got)
01344         return;
01345 }

Here is the call graph for this function:

void dcc_flush_all  ) 
 

Flushes all pending DCC/telnet connection caches.

Author:
VooDooMan
Version:
1
Date:
2004

Definition at line 19300 of file dcc.cpp.

References dcc_clients, sock_flush_later(), and sock_send_cache().

Referenced by main().

19301 {
19302     sock_send_cache();
19303     vector<s_dcc_client>::iterator i;
19304     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++)
19305         sock_flush_later((*i).socket);
19306 }

Here is the call graph for this function:

string dcc_get_line string &  buff  ) 
 

Extracts one line from buffer.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
buff Buffer
Returns:
Extracted line

Definition at line 2107 of file dcc.cpp.

Referenced by dcc_loop(), dcc_loop_edit_chan(), dcc_loop_edit_dynbans(), dcc_loop_edit_proc(), dcc_loop_edit_rproc(), dcc_loop_edit_user1(), dcc_loop_edit_user2(), dcc_loop_filesystem(), dcc_loop_language(), dcc_loop_msg(), dcc_loop_new_user(), dcc_loop_private(), dcc_loop_replication(), and dcc_loop_terminator().

02108 {
02109     string res;
02110     bool got_eol=false;
02111     unsigned int i1;
02112     for(i1=0; i1<buff.length(); i1++) {
02113         if(buff[i1]=='\n') {
02114             got_eol=true;
02115             break;
02116         }
02117         res+=buff[i1];
02118     }
02119 
02120     if(got_eol)
02121         buff.erase(0,i1+1);
02122     else
02123         return "";
02124 
02125     if(res.length()>0 && res[res.length()-1]=='\r')
02126         res.erase(res.length()-1,1);
02127     if(res.length()>0 && res[res.length()-1]=='\n')
02128         res.erase(res.length()-1,1);
02129     if(res.length()>0 && res[res.length()-1]=='\r')
02130         res.erase(res.length()-1,1);
02131     if(res.length()>0 && res[res.length()-1]=='\n')
02132         res.erase(res.length()-1,1);
02133 
02134         // erase backspace's
02135     l:
02136         for(i1=0; i1<res.length(); i1++)
02137             if(res[i1]==8) {
02138                 if(i1==0) {
02139                     res.erase(0,1);
02140                     goto l;
02141                 }
02142                 res.erase(i1-1,2);
02143                 goto l;
02144             }
02145 
02146         return res;
02147 }

int dcc_get_num_of_transfers  ) 
 

Retrieves number of concurrent DCC trtansfers.

Author:
VooDooMan
Version:
1
Date:
2004
Returns:
Returns number of concurrent DCC trtansfers

Definition at line 1025 of file dcc.cpp.

References dcc_clients.

Referenced by dcc_file_has_been_read(), and irc_quoted_callback().

01026 {
01027     int num=0;
01028     vector<s_dcc_client>::iterator i1;
01029     for(i1=dcc_clients.begin(); i1!=dcc_clients.end(); i1++)
01030         if((*i1).send || (*i1).send_from_filesystem)
01031             num++;
01032 
01033     return num;
01034 }

string dcc_get_password string  user  ) 
 

Gets MD5-encoded password for user.

Author:
VooDooMan
Version:
2
Date:
2004
Parameters:
user Name of user
Returns:
Returns MD5-encoded password, or empty string is password has not been set yet
Warning:
Name of user is case-sensitive

Definition at line 1356 of file dcc.cpp.

Referenced by botnet_loop(), botnet_received_data_from_telnet(), dcc_loop(), and logic_exec().

01357 {
01358     FILE* in=fopen("pass.txt","r");
01359     if(!in)
01360         return "";
01361     char ln[10240+1];
01362     while(!feof(in)) {
01363         if(fgets(ln,1024*10-1,in)==NULL)
01364             break;
01365         ln[10240]=0;
01366         if(ln[strlen(ln)-1]=='\r')
01367             ln[strlen(ln)-1]=0;
01368         if(ln[strlen(ln)-1]=='\n')
01369             ln[strlen(ln)-1]=0;
01370         if(ln[strlen(ln)-1]=='\r')
01371             ln[strlen(ln)-1]=0;
01372         if(ln[strlen(ln)-1]=='\n')
01373             ln[strlen(ln)-1]=0;
01374 
01375         string name, pswd;
01376         int pos=0;
01377         for(unsigned int i1=0; i1<strlen(ln); i1++) {
01378             if(pos==0 && ln[i1]=='=') {
01379                 pos++;
01380                 continue;
01381             }
01382             if(pos==0)
01383                 name+=ln[i1];
01384             if(pos==1)
01385                 pswd+=ln[i1];
01386         }
01387 
01388         if(!name.compare(user)) {
01389             fclose(in);
01390             return pswd;
01391         }
01392     }
01393     fclose(in);
01394     return "";
01395 }

string dcc_get_string string  msg,
int &  dcc_group
 

Constructs response to "dcc" or "dcc <group_number>" PRIVMSG.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
msg Message that has been received from user (usually "dcc" or "dcc <group_number>"
dcc_group Returns extracted DCC group number from message msg, zero if msg was just "msg"
Returns:
Returns DCC CHAT request string to send to requesting user as PRIVMSG

Definition at line 18869 of file dcc.cpp.

References dcc_servers, and ltoa().

Referenced by irc_loop_process_input(), and irc_RPL_ENDOFWHOIS().

18870 {
18871     if(msg.length()>=3 && msg[0]=='d' && msg[1]=='c' && msg[2]=='c') {
18872         string group;
18873         for(unsigned int i1=3; i1<msg.length(); i1++)
18874             group+=msg[i1];
18875         if(!group.compare(""))
18876             group="0";
18877         dcc_group=atol(group.c_str());
18878         vector<s_dcc_server>::iterator i2;
18879         for(i2=dcc_servers.begin(); i2!=dcc_servers.end(); i2++) {
18880             if((*i2).group==dcc_group)
18881                 break;
18882         }
18883         if(i2==dcc_servers.end())
18884             return "";
18885 
18886         unsigned int ip_=0;
18887         if(!(*i2).using_ipv6) {
18888             {
18889                 char tmp[4];
18890                 memcpy(tmp,&(*i2).dcc_addr,4);
18891 
18892 #if !defined(HIGHFIRST)
18893                 // switch bytes: BIG endian (network byte order)
18894                 char x;
18895 
18896                 x=tmp[0];
18897                 tmp[0]=tmp[3];
18898                 tmp[3]=x;
18899                 //
18900                 x=tmp[1];
18901                 tmp[1]=tmp[2];
18902                 tmp[2]=x;
18903 #endif
18904     
18905                 memcpy(&ip_,tmp,4);
18906             }
18907         }
18908 
18909         string res="DCC CHAT chat ";
18910         char tmp[64];
18911         if(!(*i2).using_ipv6) {
18912             sprintf(tmp,"%u",ip_);
18913             res+=tmp;
18914         } else {
18915             string ip6=(*i2).bind_ip;
18916             if(ip6.find("%",0)!=string::npos)
18917                 ip6.erase(ip6.find("%",0),ip6.length()-ip6.find("%",0));
18918             res+=ip6;
18919         }
18920         res+=" ";
18921         ltoa((*i2).port,tmp,10);
18922         res+=tmp;
18923         //res+=" ";
18924         return res;
18925     }
18926     return "";
18927 }

Here is the call graph for this function:

void dcc_loop  ) 
 

Check for pending connections and handles existing ones.

Author:
VooDooMan
Version:
1
Date:
2004

Definition at line 16339 of file dcc.cpp.

References s_dcc_awaiting_user::addr4, s_dcc_awaiting_user::addr6, s_dcc_client::as_in_logic, botnet_partyline_join_channel(), botnet_partyline_leave_channel(), botnet_partyline_message(), botnet_received_data_from_telnet(), botnet_showbots(), s_flood_history::bytes, s_dcc_client::chat, s_socket::clear(), s_socket::cmp(), cmp_strings_case_insensitive(), conf_getvar(), conf_rehash(), DCC_ACCESS_DENIED, dcc_apply(), dcc_awaiting_send, dcc_awaiting_users, dcc_can_unassign(), dcc_check_for_filesystem(), dcc_check_limit(), dcc_clients, dcc_get_line(), dcc_get_password(), DCC_IO_ERROR, dcc_killing_user_eol, dcc_killing_user_lang, dcc_loop_edit_chan(), dcc_loop_edit_dynbans(), dcc_loop_edit_proc(), dcc_loop_edit_rproc(), dcc_loop_edit_user1(), dcc_loop_edit_user2(), dcc_loop_filesystem(), dcc_loop_get_rights(), dcc_loop_language(), dcc_loop_msg(), dcc_loop_new_user(), dcc_loop_private(), dcc_loop_replication(), dcc_loop_terminator(), DCC_NO_SUCH_FILE, s_dcc_client::dcc_send, dcc_send_file(), dcc_send_msg(), dcc_servers, dcc_set_password(), dcc_to_resume, dcc_upgrade(), dcc_users_to_lock_out, dcc_want_to_die, dcc_want_to_restart, dcc_want_to_upgrade, dcc_who_is_killing, s_dcc_client::edit_user, s_dcc_client_to_resume::file_name, s_dcc_client_to_resume::file_size, FILE_SLASH, files, filesys_add_file_raw(), filesys_check_add_file_raw(), filesys_dcc_check_for_notifies(), filesys_dcc_drop_notifies(), filesys_dcc_get_resume_info(), filesys_set_file_was_read(), s_dcc_client::filesystem, s_dcc_client::fullname, s_dcc_awaiting_user::fullname, s_dcc_client::got_passwd, s_dcc_client::got_user_name, s_socket::handle, s_dcc_client::host, s_socket::host, s_dcc_awaiting_user::host, s_dcc_client::ident, s_dcc_awaiting_user::ident, inet_ntop(), inet_pton(), s_dcc_client_to_resume::ip_addr4, s_dcc_client_to_resume::ip_addr6, irc_channels, irc_get_fullname(), irc_get_host(), irc_get_ident(), irc_get_mode(), irc_get_nick(), irc_is_ircop(), irc_join(), irc_nick, irc_part(), irc_rehashed(), s_dcc_client::s_dcc_client_send::is_file_server_proto, s_dcc_client::lang, lang_get_string(), lang_rehash(), lang_subst(), last_new_instance_join, log_bot(), log_debug(), log_free_locks(), log_socket(), logic_access_to_filesystem(), logic_access_to_partyline(), logic_eval(), logic_execute(), logic_filesys_got_new(), logic_find_user(), logic_is_replication_partner(), logic_on_internal_event(), logic_partyline_backup(), logic_partyline_get_user(), logic_partyline_rehash(), logic_partyline_whois(), ltoa(), match(), MD5Final(), MD5Init(), MD5Update(), s_flood_history::msg, s_group::name, NEW_INSTANCE_TIMEOUT_AFTER_LAST_JOIN, s_dcc_client::new_user, s_dcc_client::nick, s_dcc_awaiting_user::nick, s_dcc_client::s_dcc_client_send::original_name, s_dcc_client_to_resume::port, PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL, r_all_groups, s_user_to_lock_out::remote, s_dcc_client::remote, s_dcc_client::replication_partner, s_dcc_client::resume_pos, s_dcc_client::send, s_dcc_client::send_file, s_dcc_client::send_from_filesystem, s_ssl_conf::server_cert, s_ssl_conf::server_key, s_dcc_client::server_socket, s_dcc_client::s_dcc_client_send::size, sock_accept(), sock_accept6(), sock_async(), sock_cancel_caching(), sock_close(), sock_connect(), sock_error(), sock_flush_later(), sock_get_last_io(), sock_get_receive_size(), sock_get_remote_addr(), sock_read(), sock_send(), sock_set_blocking(), s_dcc_client::socket, s_ssl_conf::ssl_bots, ssl_close(), ssl_server_accept(), ssl_server_connection(), s_dcc_awaiting_user::start_time, stats_dcc_chat_bytes_received(), stats_dcc_chat_bytes_sent(), stats_dcc_chat_new_connection(), stats_dcc_send_bytes_received(), stats_dcc_send_bytes_sent(), stats_dcc_send_new_connection(), stats_display(), s_dcc_client::telnet, telnet_servers, s_flood_history::time, s_user_to_lock_out::timestamp, s_dcc_client_to_resume::user_name, s_dcc_awaiting_user::user_name_as_in_logic, s_dcc_client_to_resume::using_ipv6, s_dcc_awaiting_user::using_ipv6, and VERSION.

Referenced by irc_loop_process_input(), logic_exec(), and sleep().

16340 {
16341     if(dcc_want_to_upgrade && last_new_instance_join+NEW_INSTANCE_TIMEOUT_AFTER_LAST_JOIN<time(NULL)) {
16342         dcc_want_to_upgrade=false;
16343         dcc_want_to_die=true;
16344     }
16345 
16346     {
16347         vector<s_dcc_client_to_resume>::iterator i1;
16348 again__:
16349         for(i1=dcc_to_resume.begin(); i1!=dcc_to_resume.end(); i1++) {
16350             if((*i1).start_time+10<time(NULL)) {
16351                 // client probably doesn't support resume
16352                 // so connect
16353 
16354                 s_dcc_client_to_resume res=*i1;
16355                 dcc_to_resume.erase(i1);
16356 
16357                 string ip_addr;
16358                 if(!res.using_ipv6)
16359                     ip_addr=res.ip_addr4;
16360                 else
16361                     ip_addr=res.ip_addr6;
16362                 unsigned short port=res.port;
16363 
16364                 string dcc_bind_ip=conf_getvar("dcc_bind_ip");
16365                 if(dcc_bind_ip.empty())
16366                     dcc_bind_ip="0.0.0.0";
16367                 string dcc_bind_ip6=conf_getvar("dcc_bind_ip6");
16368                 if(dcc_bind_ip6.empty())
16369                     dcc_bind_ip6="::";
16370 
16371                 int ec=0;
16372                 s_socket s;
16373                 if(!res.using_ipv6)
16374                     s=sock_connect((char*)dcc_bind_ip.c_str(),(char*)ip_addr.c_str(),port,ec,true);
16375                 else
16376                     s=sock_connect((char*)dcc_bind_ip6.c_str(),(char*)ip_addr.c_str(),port,ec,true);
16377                 if(s.cmp()==false || ec) {
16378                     log_socket(ec,sock_error(ec),"while calling sock_connect in file " __FILE__ " in function " __FUNC__);
16379                     goto again__;
16380                 }
16381 
16382                 s_dcc_client c;
16383 
16384                 c.nick=(*i1).nick;
16385                 c.ident=irc_get_ident((*i1).nick);
16386                 c.host=irc_get_host((*i1).nick);
16387                 c.fullname=irc_get_fullname((*i1).nick);
16388 
16389                 c.resume_pos=0;
16390 
16391                 c.chat=false;
16392                 c.send=true;
16393                 c.send_from_filesystem=false;
16394                 c.socket=s;
16395 
16396                 c.server_socket.clear();
16397                 c.telnet=false;
16398                 c.got_passwd=0;
16399                 c.new_user=0;
16400                 c.edit_user=0;
16401                 c.filesystem=0;
16402                 c.as_in_logic=res.user_name;
16403                 c.got_user_name=(c.as_in_logic.empty()?false:true);
16404 
16405                 c.dcc_send.size=res.file_size;
16406                 c.dcc_send.original_name=res.file_name;
16407                 c.dcc_send.is_file_server_proto=false;
16408 
16409                 dcc_clients.push_back(c);
16410                 dcc_check_limit();
16411 
16412                 goto again__;
16413             }
16414         }
16415     }
16416 
16417     vector<s_dcc_client>::iterator i;
16418     char dcc_eol[4]="\n\0";
16419     char telnet_eol[4]="\r\n\0";
16420 again:
16421     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
16422         if((*i).replication_partner) {
16423             if(!(*i).telnet_botnet_called) {
16424                 if((*i).telnet_buffer_pos) {
16425                     unsigned int i1;
16426                     for(i1=0; i1<(*i).telnet_buffer_pos; i1++)
16427                         if((*i).telnet_buffer[i1]=='\r' || (*i).telnet_buffer[i1]=='\n')
16428                             break;
16429                     if((*i).telnet_buffer[i1]=='\r' || (*i).telnet_buffer[i1]=='\n')
16430                         i1++;
16431                     if((*i).telnet_buffer[i1]=='\r' || (*i).telnet_buffer[i1]=='\n')
16432                         i1++;
16433                     unsigned int begin=i1;
16434                     (*i).telnet_buffer_pos-=begin;
16435 
16436                     botnet_received_data_from_telnet((*i).socket,(*i).as_in_logic,&(*i).telnet_buffer[begin],(*i).telnet_buffer_pos,(*i).ssl_connection?(*i).ssl:NULL,(*i).remote);
16437                     (*i).telnet_buffer_pos=0;
16438                     (*i).telnet_botnet_called=true;
16439                 } else {
16440                     botnet_received_data_from_telnet((*i).socket,(*i).as_in_logic,NULL,0,(*i).ssl_connection?(*i).ssl:NULL,(*i).remote);
16441                     (*i).telnet_botnet_called=true;
16442                 }
16443                 if((*i).ssl_connection) {
16444                     if(!ssl_server_accept((*i).ssl,&((*i).socket))) {
16445                         continue;
16446                     }
16447                 }
16448             }
16449             if((*i).socket.cmp()==false) {
16450                 if((*i).ssl_connection) {
16451                     ssl_close((*i).ssl,&((*i).socket));
16452                 }
16453                 dcc_clients.erase(i);
16454                 goto again;
16455             }
16456             continue;
16457         }
16458 
16459         string eol=(*i).telnet?telnet_eol:dcc_eol;
16460         if((*i).chat) {
16461             if((*i).lang.empty())
16462                 (*i).lang="en";
16463 
16464             long dcc_always_want_nick=atol(conf_getvar("dcc_always_want_nick").c_str());
16465             if(dcc_always_want_nick && (*i).got_user_name) {
16466                 (*i).got_user_name=false;
16467                 (*i).supposed_to_be=(*i).as_in_logic;
16468                 (*i).as_in_logic="";
16469 
16470                 string disp=lang_get_string(1,(*i).lang,167)+eol;
16471                 int ec=0;
16472                 size_t sent=sock_send((*i).socket,disp.c_str(),disp.length(),ec);
16473                 stats_dcc_chat_bytes_sent(sent);
16474             }
16475             if(!dcc_always_want_nick)
16476                 (*i).supposed_to_be=(*i).as_in_logic;
16477 
16478             {
16479                 int ec=0;
16480                 char buff[5*1024+1];
16481                 bool closed;
16482                 int max_len=sizeof(buff)-1;
16483                 if((*i).got_passwd<=1 && (*i).telnet) {
16484                     max_len=1;
16485                     if((*i).in_buff.length()>128) {
16486                         // drop
16487                         sock_close((*i).socket);
16488                         dcc_clients.erase(i);
16489                         goto again;
16490                     }
16491                 }
16492                 size_t len=sock_read((*i).socket,buff,max_len,ec,closed);
16493                 if(ec==0) {
16494                     buff[len]=0;
16495                     stats_dcc_chat_bytes_received(len);
16496                 }
16497                 if(closed || ec) {
16498                     if((*i).partyline_channel.compare(""))
16499                         botnet_partyline_leave_channel((*i).as_in_logic,(*i).partyline_channel);
16500                     (*i).partyline_channel="";
16501                     if(dcc_killing_user_socket && (*i).socket.handle==dcc_killing_user_socket->handle)
16502                         dcc_killing_user_socket=NULL;
16503                     sock_close((*i).socket);
16504                     dcc_clients.erase(i);
16505                     goto again;
16506                 }
16507                 if(len) {
16508                     (*i).last_input=time(NULL);
16509                     if((*i).got_passwd==1) {
16510                         string disp;
16511                         unsigned int i1;
16512                         for(i1=0; i1<len; i1++)
16513                             disp+="\x08";
16514                         for(i1=0; i1<len; i1++)
16515                             disp+=" ";
16516                         for(i1=0; i1<len; i1++)
16517                             disp+="\x08";
16518                         int ec=0;
16519                         if((*i).telnet)
16520                             dcc_send_msg((*i).socket,disp,ec);
16521                     }
16522                     (*i).in_buff+=buff;
16523                     (*i).telnet_buffer_pos=len;
16524                     if((*i).telnet_buffer_pos>sizeof((*i).telnet_buffer))
16525                         (*i).telnet_buffer_pos=sizeof((*i).telnet_buffer);
16526                     memcpy((*i).telnet_buffer,buff,(*i).telnet_buffer_pos);
16527                 }
16528             }
16529 
16530             if((*i).as_in_logic.empty()) {
16531                 string ln=dcc_get_line((*i).in_buff);
16532                 if(!ln.empty() && match("### *",(char*)ln.c_str())) {
16533                     (*i).as_in_logic=ln;
16534                     (*i).got_passwd=0;
16535 
16536                     string pswd=dcc_get_password((*i).as_in_logic);
16537                     if(pswd.empty()) {
16538                         // do not hav password set yet
16539                         if((*i).supposed_to_be.compare((*i).as_in_logic)) {
16540                             // it is different user! SPOOFING!
16541                             string disp=lang_get_string(1,"en",698)+eol;
16542                             int ec=0;
16543                             dcc_send_msg((*i).socket,disp,ec);
16544                             sock_close((*i).socket);
16545                             dcc_clients.erase(i);
16546                             break;
16547                         }
16548                     }
16549                 }
16550             }
16551             if((*i).got_passwd==0) {
16552                 {
16553                     int secs=atol(conf_getvar("lockout_duration").c_str());
16554                     vector<s_user_to_lock_out>::iterator i1;
16555                 lock_a:
16556                     for(i1=dcc_users_to_lock_out.begin(); i1!=dcc_users_to_lock_out.end(); i1++)
16557                         if((*i1).timestamp+secs<time(NULL)) {
16558                             dcc_users_to_lock_out.erase(i1);
16559                             goto lock_a;
16560                         }
16561                     int num=0;
16562                     for(i1=dcc_users_to_lock_out.begin(); i1!=dcc_users_to_lock_out.end(); i1++)
16563                         if(!(*i1).remote.compare((*i).remote))
16564                             num++;
16565                     int max=atol(conf_getvar("lockout_count").c_str());
16566                     if(max!=0 && num>=max) {
16567                         string disp=lang_get_string(1,"en",612)+eol;
16568                         int ec=0;
16569                         dcc_send_msg((*i).socket,disp,ec);
16570                         sock_close((*i).socket);
16571                         dcc_clients.erase(i);
16572                         break;
16573                     }
16574                 }
16575 
16576                 (*i).new_user=0;
16577                 (*i).edit_user=0;
16578                 (*i).edit_proc=0;
16579                 (*i).edit_chan=0;
16580                 (*i).filesystem=0;
16581                 (*i).edit_proc=0;
16582                 (*i).edit_chan=0;
16583                 (*i).filesystem=0;
16584                 (*i).msg=0;
16585                 (*i).private_edit=0;
16586                 (*i).replication=0;
16587                 (*i).terminator=0;
16588                 (*i).language=0;
16589 
16590                 if(logic_is_replication_partner((*i).as_in_logic)) {
16591                     (*i).chat=false;
16592                     (*i).replication_partner=true;
16593                     (*i).telnet_botnet_called=false;
16594                     vector<s_ssl_bot>::iterator i1;
16595                     for(i1=ssl_conf.ssl_bots.begin(); i1!=ssl_conf.ssl_bots.end(); i1++) {
16596                         if(!(*i).as_in_logic.compare((*i1).botname)) {
16597                             sock_cancel_caching((*i).socket);
16598                             (*i).replication_partner=true;
16599                             (*i).ssl_connection=true;
16600                             char err_str[1024];
16601                             size_t len;
16602                             sock_set_blocking((*i).socket,true);
16603                             do
16604                                 len=recv((*i).socket.handle,err_str,sizeof(err_str),0);
16605                             while((signed)len>0);
16606 
16607                             int ec=0;
16608                             bool closed=false;
16609                             do
16610                                 len=sock_read((*i).socket,err_str,sizeof(err_str),ec,closed);
16611                             while((signed)len>0);
16612 
16613                             if(ssl_server_connection((*i).ssl,&((*i).socket),err_str,(char*)ssl_conf.server_cert.c_str(),(char*)ssl_conf.server_key.c_str(),(char*)(*i1).cert.c_str())) {
16614                                 sock_close((*i).socket);
16615                                 dcc_clients.erase(i);
16616                                 goto again;
16617                             }
16618                             botnet_received_data_from_telnet((*i).socket,(*i).as_in_logic,(*i).telnet_buffer,0,(*i).ssl,(*i).remote);
16619                             (*i).telnet_buffer_pos=0;
16620                             (*i).telnet_botnet_called=true;
16621                             char tmp=0x01;
16622                             send((*i).socket.handle,&tmp,1,0);
16623                             dcc_clients.erase(i);
16624 
16625                             sock_set_blocking((*i).socket,true);
16626 
16627                             goto again;
16628                         }
16629                     }
16630                     continue;
16631                 }
16632 
16633                 if((*i).as_in_logic.empty())
16634                     continue;
16635 
16636                 string pswd=dcc_get_password((*i).as_in_logic);
16637                 (*i).lang="en";
16638                 string disp=lang_subst(lang_get_string(1,(*i).lang,1),conf_getvar("botname"))+eol+lang_subst(lang_get_string(1,(*i).lang,640),VERSION)+eol+lang_subst(lang_get_string(1,(*i).lang,2),conf_getvar("admin"))+eol;
16639                 int ec=0;
16640                 dcc_send_msg((*i).socket,disp,ec);
16641                 if(!pswd.compare(""))
16642                     disp=lang_get_string(1,(*i).lang,3)+eol;
16643                     else
16644                     disp=lang_get_string(1,(*i).lang,4)+eol;
16645                 dcc_send_msg((*i).socket,disp,ec);
16646                 (*i).got_passwd++;
16647                 (*i).in_buff="";
16648                 continue; // very important
16649             }
16650             if((*i).got_passwd==1) {
16651                 string pswd=dcc_get_password((*i).as_in_logic);
16652                 string p=dcc_get_line((*i).in_buff);
16653                 if(p.empty() || !match("### *",(char*)p.c_str()))
16654                     continue;
16655                 string disp=eol;
16656                 int ec=0;
16657                 dcc_send_msg((*i).socket,disp,ec);
16658 
16659                 if(!logic_access_to_partyline((*i).as_in_logic)) {
16660                     s_user_to_lock_out u;
16661                     u.timestamp=time(NULL);
16662                     u.remote=(*i).remote;
16663                     dcc_users_to_lock_out.push_back(u);
16664 
16665                     string disp=lang_get_string(1,(*i).lang,5)+eol;
16666                     int ec=0;
16667                     dcc_send_msg((*i).socket,disp,ec);
16668                     sock_close((*i).socket);
16669                     dcc_clients.erase(i);
16670                     goto again;
16671                 }
16672 
16673                 unsigned char signature[16];
16674 
16675                 MD5Context md5c;
16676                 MD5Init(&md5c);
16677                 MD5Update(&md5c,(unsigned char *)p.c_str(),(unsigned int)p.length());
16678                 MD5Final(signature,&md5c);
16679 
16680                 char sig[128];
16681                 sig[0]=0;
16682                 for(int i1=0; i1<16; i1++) {
16683                     char tmp[16];
16684                     sprintf(tmp,"%02X",signature[i1]);
16685                     strcat(sig,tmp);
16686                 }
16687 
16688                 if(cmp_strings_case_insensitive(pswd,sig)!=0 && pswd.compare("")) {
16689                     s_user_to_lock_out u;
16690                     u.timestamp=time(NULL);
16691                     u.remote=(*i).remote;
16692                     dcc_users_to_lock_out.push_back(u);
16693 
16694                     string disp=lang_get_string(1,(*i).lang,5)+eol;
16695                     int ec=0;
16696                     dcc_send_msg((*i).socket,disp,ec);
16697                     sock_close((*i).socket);
16698                     dcc_clients.erase(i);
16699                     break;
16700                 }
16701 
16702                 if(!pswd.compare("")) {
16703                     // we got a new password set now!
16704                     if((*i).telnet) {
16705                         string disp=lang_subst(lang_get_string(1,(*i).lang,689),conf_getvar("admin"))+eol;
16706                         int ec=0;
16707                         dcc_send_msg((*i).socket,disp,ec);
16708                         sock_close((*i).socket);
16709                         dcc_clients.erase(i);
16710                         break;
16711                     } else {
16712                         if(dcc_want_to_upgrade) {
16713                             string disp=lang_get_string(1,(*i).lang,642)+eol;
16714                             int ec=0;
16715                             dcc_send_msg((*i).socket,disp,ec);
16716                         } else
16717                             dcc_set_password((*i).as_in_logic,sig);
16718                     }
16719                 }
16720 
16721                 (*i).got_passwd++;
16722             }
16723             if((*i).got_passwd==2) {
16724                 FILE* in=fopen("motd.txt","r");
16725                 char ln[10240+1];
16726                 while(in && !feof(in)) {
16727                     if(fgets(ln,1024*10-1,in)==NULL)
16728                         break;
16729                     ln[10240]=0;
16730                     if(ln[strlen(ln)-1]=='\r')
16731                         ln[strlen(ln)-1]=0;
16732                     if(ln[strlen(ln)-1]=='\n')
16733                         ln[strlen(ln)-1]=0;
16734                     if(ln[strlen(ln)-1]=='\r')
16735                         ln[strlen(ln)-1]=0;
16736                     if(ln[strlen(ln)-1]=='\n')
16737                         ln[strlen(ln)-1]=0;
16738                     string disp=(string)ln+eol;
16739                     int ec=0;
16740                     dcc_send_msg((*i).socket,disp,ec);
16741                 }
16742                 if(in)
16743                     fclose(in);
16744                 (*i).got_passwd++;
16745                 dcc_loop_get_rights(i);
16746 
16747                 dcc_check_for_filesystem((*i).as_in_logic);
16748 
16749                 /*vector<s_dcc_notify> notify;
16750                 filesys_dcc_check_for_notifies((*i).as_in_logic,notify);
16751 
16752                 string files;
16753 
16754                 vector<s_dcc_notify>::iterator i1;
16755                 for(i1=notify.begin(); i1!=notify.end(); i1++) {
16756                     if((*i1).unpublished) {
16757                         if(!files.empty())
16758                             files+=", ";
16759                         files+=(*i1).name;
16760                     }
16761                 }
16762 
16763                 if(!files.empty()) {
16764                     string disp=lang_get_string(1,(*i).lang,274)+eol;
16765                     int ec=0;
16766                     dcc_send_msg((*i).socket,disp,ec);
16767                 }*/
16768 
16769                 (*i).partyline_channel="";
16770             }
16771 
16772             if((*i).got_passwd!=3)
16773                 continue;
16774 
16775             dcc_loop_new_user(i,eol);
16776 
16777             dcc_loop_edit_user1(i,eol);
16778             dcc_loop_edit_user2(i,eol);
16779 
16780             dcc_loop_edit_rproc(i,eol);
16781 
16782             dcc_loop_edit_proc(i,eol);
16783 
16784             dcc_loop_edit_chan(i,eol);
16785 
16786             dcc_loop_filesystem(i,eol);
16787 
16788             dcc_loop_msg(i,eol);
16789 
16790             dcc_loop_private(i,eol);
16791 
16792             dcc_loop_replication(i,eol);
16793 
16794             dcc_loop_terminator(i,eol);
16795 
16796             dcc_loop_language(i,eol);
16797 
16798             dcc_loop_edit_dynbans(i,eol);
16799 
16800             {
16801                 int dcc_chat_ping_interval=atol(conf_getvar("dcc_chat_ping_interval").c_str());
16802                 if(dcc_chat_ping_interval && sock_get_last_io((*i).socket)+dcc_chat_ping_interval<=time(NULL)) {
16803                     time_t last_read=sock_get_last_io((*i).socket,'r');
16804 
16805                     string disp=lang_get_string(1,(*i).lang,611);
16806 
16807                     time_t diff=time(NULL)-last_read;
16808                     time_t days=diff/(24*60*60);
16809                     diff%=24*60*60;
16810                     time_t hrs=diff/(60*60);
16811                     diff%=60*60;
16812                     time_t mins=diff/(60);
16813                     diff%=60;
16814                     time_t secs=diff;
16815 
16816                     string idle=lang_get_string(1,(*i).lang,695);
16817                     char tmp[128];
16818                     idle=lang_subst(idle,ltoa((long)days,tmp,10));
16819                     idle=lang_subst(idle,ltoa((long)hrs,tmp,10));
16820                     idle=lang_subst(idle,ltoa((long)mins,tmp,10));
16821                     idle=lang_subst(idle,ltoa((long)secs,tmp,10));
16822 
16823                     disp+=" ";
16824                     disp+=idle;
16825                     disp+=eol;
16826 
16827                     {
16828                         time_t now=time(NULL);
16829                         char* t1=ctime(&now);
16830                         char t2[128];
16831                         strcpy(t2,t1);
16832                         t2[strlen(t2)-1]=0; // get rid of \n
16833                         string ts="[";
16834                         ts+=t2;
16835                         ts+="] ";
16836                         disp=ts+disp;
16837                     }
16838 
16839                     int ec=0;
16840                     dcc_send_msg((*i).socket,disp,ec);
16841                 }
16842             }
16843 
16844             if((*i).last_filesys_lookup==0 || (*i).last_filesys_lookup+30<time(NULL)) {
16845                 time(&(*i).last_filesys_lookup);
16846                 vector<s_dcc_notify> notify;
16847                 filesys_dcc_check_for_notifies((*i).as_in_logic,(*i).u,(*i).chs,"",notify,true,(*i).lang,eol);
16848                 if(!notify.empty()) {
16849                     filesys_dcc_drop_notifies((*i).as_in_logic,false);
16850 
16851                     string files;
16852                     string msgs;
16853                     string incomplete_files;
16854 
16855                     vector<s_dcc_notify>::iterator i1;
16856                     for(i1=notify.begin(); i1!=notify.end(); i1++) {
16857                         if((*i1).unpublished) {
16858                             if(!files.empty())
16859                                 files+=", ";
16860                             files+="\"";
16861                             files+=(*i1).name;
16862                             files+="\"";
16863                         }
16864                         if((*i1).incomplete) {
16865                             if(!incomplete_files.empty())
16866                                 incomplete_files+=", ";
16867                             incomplete_files+="\"";
16868                             incomplete_files+=(*i1).name;
16869                             incomplete_files+="\"";
16870                         }
16871                         if((*i1).notify_owner || (*i1).notify_user || (*i1).secure_notify_owner || (*i1).secure_notify_user)
16872                             msgs+=(*i1).message;
16873                     }
16874                     // do not abuse user every time about incomplete files
16875                     /*string disp=lang_get_string(1,(*i).lang,279)+eol;
16876                     disp+=files;
16877                     disp+=eol;
16878                     disp+=lang_get_string(1,(*i).lang,401)+eol;
16879                     disp+=incomplete_files;
16880                     disp+=eol;
16881                     disp+=lang_get_string(1,(*i).lang,324)+eol;
16882                     disp+=lang_get_string(1,(*i).lang,280)+eol;
16883                     disp+=lang_get_string(1,(*i).lang,281)+eol;
16884                     disp+=msgs;
16885                     disp+=lang_get_string(1,(*i).lang,469)+eol;*/
16886                     if(!msgs.empty()) {
16887                         string disp=msgs+eol;
16888                         int ec=0;
16889                         dcc_send_msg((*i).socket,disp,ec);
16890                     }
16891                 }
16892             }
16893 
16894             if((*i).new_user ||
16895                 (*i).edit_user ||
16896                 (*i).edit_proc ||
16897                 (*i).edit_chan ||
16898                 (*i).filesystem ||
16899                 (*i).msg ||
16900                 (*i).private_edit ||
16901                 (*i).replication ||
16902                 (*i).terminator ||
16903                 (*i).language)
16904                 continue;
16905 
16906             string c=dcc_get_line((*i).in_buff);
16907             string cmd, param1, param2;
16908             int pos=0;
16909             for(unsigned int i1=0; i1<c.length(); i1++) {
16910                 if((pos==0 || pos==1 || pos==2) && c[i1]==0x20) {
16911                     pos++;
16912                     continue;
16913                 }
16914                 if(pos==0)
16915                     cmd+=c[i1];
16916                 if(pos==1)
16917                     param1+=c[i1];
16918                 if(pos==2)
16919                     param2+=c[i1];
16920             }
16921 
16922             bool got_cmd=false;
16923 
16924             if(!cmd.compare(".whois")) {
16925                 got_cmd=true;
16926                 if(!param1.compare("") || param2.compare("")) {
16927                     string disp=lang_get_string(1,(*i).lang,8)+eol;
16928                     int ec=0;
16929                     dcc_send_msg((*i).socket,disp,ec);
16930                 } else {
16931                     string disp=lang_subst(lang_get_string(1,(*i).lang,6),param1)+eol;
16932                     int ec=0;
16933                     dcc_send_msg((*i).socket,disp,ec);
16934 
16935                     list<string> lines;
16936                     int num=logic_partyline_whois((*i).lang,param1,lines);
16937                     list<string>::iterator i1;
16938                     for(i1=lines.begin(); i1!=lines.end(); i1++) {
16939                         dcc_send_msg((*i).socket,*i1,ec);
16940                         dcc_send_msg((*i).socket,eol,ec);
16941                     }
16942 
16943                     char tmp[64];
16944                     ltoa(num,tmp,10);
16945                     disp=lang_subst(lang_get_string(1,(*i).lang,7),tmp)+eol;
16946                     disp=lang_subst(disp,param1);
16947                     dcc_send_msg((*i).socket,disp,ec);
16948                 }
16949             }
16950             if(!cmd.compare(".+user")) {
16951                 got_cmd=true;
16952                 if((*i).access_to_plususer) {
16953                     if(param1.compare("") || param2.compare("")) {
16954                         string disp=lang_get_string(1,(*i).lang,29)+eol;
16955                         int ec=0;
16956                         dcc_send_msg((*i).socket,disp,ec);
16957                     } else {
16958                         string disp=lang_get_string(1,(*i).lang,32)+eol;
16959                         int ec=0;
16960                         dcc_send_msg((*i).socket,disp,ec);
16961                         (*i).new_user=1;
16962                     }
16963                 } else {
16964                     string disp=lang_get_string(1,(*i).lang,183)+eol;
16965                     int ec=0;
16966                     dcc_send_msg((*i).socket,disp,ec);
16967                 }
16968             }
16969             if(!cmd.compare(".edituser")) {
16970                 got_cmd=true;
16971                 if(param1.compare("") || param2.compare("")) {
16972                     string disp=lang_get_string(1,(*i).lang,87)+eol;
16973                     int ec=0;
16974                     dcc_send_msg((*i).socket,disp,ec);
16975                 } else {
16976                     string disp=lang_get_string(1,(*i).lang,88)+eol;
16977                     int ec=0;
16978                     dcc_send_msg((*i).socket,disp,ec);
16979 
16980                     vector<string>::iterator i1;
16981                     for(i1=(*i).access_to_users.begin(); i1!=(*i).access_to_users.end(); i1++) {
16982                         if(!(*i1).compare("*"))
16983                             continue;
16984                         disp=*i1+eol;
16985                         dcc_send_msg((*i).socket,disp,ec);
16986                     }
16987 
16988                     disp=lang_get_string(1,(*i).lang,89)+eol;
16989                     dcc_send_msg((*i).socket,disp,ec);
16990 
16991                     (*i).edit_user=1;
16992                 }
16993             }
16994             if(!cmd.compare(".+proc")) {
16995                 got_cmd=true;
16996                 if((*i).access_to_plusproc) {
16997                     if(param1.compare("") || param2.compare("")) {
16998                         string disp=lang_get_string(1,(*i).lang,377)+eol;
16999                         int ec=0;
17000                         dcc_send_msg((*i).socket,disp,ec);
17001                     } else {
17002                         (*i).edit_proc=1000;
17003                     }
17004                 } else {
17005                     string disp=lang_get_string(1,(*i).lang,192)+eol;
17006                     int ec=0;
17007                     dcc_send_msg((*i).socket,disp,ec);
17008                 }
17009             }
17010             if(!cmd.compare(".editproc")) {
17011                 got_cmd=true;
17012                 if(param1.compare("") || param2.compare("")) {
17013                     string disp=lang_get_string(1,(*i).lang,134)+eol;
17014                     int ec=0;
17015                     dcc_send_msg((*i).socket,disp,ec);
17016                 } else {
17017                     string disp=lang_get_string(1,(*i).lang,135)+eol;
17018                     int ec=0;
17019                     dcc_send_msg((*i).socket,disp,ec);
17020 
17021                     vector<string>::iterator i1;
17022                     for(i1=(*i).access_to_procs.begin(); i1!=(*i).access_to_procs.end(); i1++) {
17023                         if(!(*i1).compare("*"))
17024                             continue;
17025                         disp=*i1+eol;
17026                         dcc_send_msg((*i).socket,disp,ec);
17027                     }
17028 
17029                     disp=lang_get_string(1,(*i).lang,136)+eol;
17030                     dcc_send_msg((*i).socket,disp,ec);
17031 
17032                     (*i).edit_proc=1;
17033                 }
17034             }
17035             if(!cmd.compare(".editchan")) {
17036                 got_cmd=true;
17037                 if(param1.compare("") || param2.compare("")) {
17038                     string disp=lang_get_string(1,(*i).lang,220)+eol;
17039                     int ec=0;
17040                     dcc_send_msg((*i).socket,disp,ec);
17041                 } else {
17042                     (*i).edit_chan=1;
17043                 }
17044             }
17045             if(!cmd.compare(".+chan")) {
17046                 got_cmd=true;
17047                 if(param1.compare("") || param2.compare("")) {
17048                     string disp=lang_get_string(1,(*i).lang,235)+eol;
17049                     int ec=0;
17050                     dcc_send_msg((*i).socket,disp,ec);
17051                 } else {
17052                     (*i).edit_chan=100;
17053                 }
17054             }
17055             if(!cmd.compare(".quit")) {
17056                 got_cmd=true;
17057                 if((*i).partyline_channel.compare(""))
17058                     botnet_partyline_leave_channel((*i).as_in_logic,(*i).partyline_channel);
17059                 (*i).partyline_channel="";
17060                 string disp=lang_get_string(1,(*i).lang,71)+eol;
17061                 int ec=0;
17062                 dcc_send_msg((*i).socket,disp,ec);
17063                 if(dcc_killing_user_socket && (*i).socket.handle==dcc_killing_user_socket->handle)
17064                     dcc_killing_user_socket=NULL;
17065                 sock_close((*i).socket);
17066                 dcc_clients.erase(i);
17067                 goto again;
17068             }
17069             if(!cmd.compare(".backup")) {
17070                 got_cmd=true;
17071                 if((*i).access_to_backup) {
17072                     logic_partyline_backup((*i).as_in_logic);
17073                     if(dcc_want_to_upgrade) {
17074                         string disp=lang_get_string(1,(*i).lang,641)+eol;
17075                         int ec=0;
17076                         dcc_send_msg((*i).socket,disp,ec);
17077                     } else {
17078                         string disp=lang_get_string(1,(*i).lang,74)+eol;
17079                         int ec=0;
17080                         dcc_send_msg((*i).socket,disp,ec);
17081                     }
17082                 } else {
17083                     string disp=lang_get_string(1,(*i).lang,188)+eol;
17084                     int ec=0;
17085                     dcc_send_msg((*i).socket,disp,ec);
17086                 }
17087             }
17088             if(!cmd.compare(".rehash")) {
17089                 got_cmd=true;
17090                 if((*i).access_to_rehash) {
17091                     string disp=lang_get_string(1,(*i).lang,348)+eol;
17092                     int ec=0;
17093                     dcc_send_msg((*i).socket,disp,ec);
17094                     sock_flush_later((*i).socket);
17095                     lang_rehash();
17096                     conf_rehash();
17097                     disp=logic_partyline_rehash((*i).lang,eol,(*i).as_in_logic);
17098                     ec=0;
17099                     dcc_send_msg((*i).socket,disp,ec);
17100                 } else {
17101                     string disp=lang_get_string(1,(*i).lang,347)+eol;
17102                     int ec=0;
17103                     dcc_send_msg((*i).socket,disp,ec);
17104                 }
17105             }
17106             if(!cmd.compare(".apply")) {
17107                 got_cmd=true;
17108                 if((*i).access_to_apply) {
17109                     irc_rehashed();
17110                     dcc_apply((*i).as_in_logic);
17111 
17112                     logic_on_internal_event("@apply@",(*i).as_in_logic,"","","",PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL,"","");
17113                 } else {
17114                     string disp=lang_get_string(1,(*i).lang,682)+eol;
17115                     int ec=0;
17116                     dcc_send_msg((*i).socket,disp,ec);
17117                 }
17118             }
17119             if(!cmd.compare(".filesystem")) {
17120                 got_cmd=true;
17121                 if(param1.compare("") || param2.compare("")) {
17122                     string disp=lang_get_string(1,(*i).lang,628)+eol;
17123                     int ec=0;
17124                     dcc_send_msg((*i).socket,disp,ec);
17125                 } else {
17126                     if((*i).access_to_filesystem) {
17127                         (*i).filesystem=1;
17128                     } else {
17129                         string disp=lang_get_string(1,(*i).lang,275)+eol;
17130                         int ec=0;
17131                         dcc_send_msg((*i).socket,disp,ec);
17132                     }
17133                 }
17134             }
17135             if(!cmd.compare(".upgrade")) {
17136                 got_cmd=true;
17137                 if(!param1.compare("") || param2.compare("")) {
17138                     string disp=lang_get_string(1,(*i).lang,629)+eol;
17139                     int ec=0;
17140                     dcc_send_msg((*i).socket,disp,ec);
17141                 } else {
17142                     if((*i).access_to_upgrade) {
17143                         bool ok=true;
17144                         for(unsigned int i1=0; i1<param1.length(); i1++) {
17145                             bool ok2=false;
17146                             if(param1[i1]>='a' && param1[i1]<='z')
17147                                 ok2=true;
17148                             if(param1[i1]>='A' && param1[i1]<='Z')
17149                                 ok2=true;
17150                             if(param1[i1]>='0' && param1[i1]<='9')
17151                                 ok2=true;
17152                             if(param1[i1]=='.' || param1[i1]=='_' || param1[i1]=='-')
17153                                 ok2=true;
17154                             if(!ok2) {
17155                                 ok=false;
17156                                 break;
17157                             }
17158                         }
17159                         if(ok)
17160                             dcc_upgrade(i,eol,param1);
17161                         else {
17162                             string disp=lang_get_string(1,(*i).lang,665)+eol;
17163                             int ec=0;
17164                             dcc_send_msg((*i).socket,disp,ec);
17165                         }
17166                     } else {
17167                         string disp=lang_get_string(1,(*i).lang,627)+eol;
17168                         int ec=0;
17169                         dcc_send_msg((*i).socket,disp,ec);
17170                     }
17171                 }
17172             }
17173             if(!cmd.compare(".msg")) {
17174                 got_cmd=true;
17175                 (*i).msg=1;
17176             }
17177             if(!cmd.compare(".rproc")) {
17178                 got_cmd=true;
17179                 if(param1.compare("") || param2.compare("")) {
17180                     string disp=lang_get_string(1,(*i).lang,614)+eol;
17181                     int ec=0;
17182                     dcc_send_msg((*i).socket,disp,ec);
17183                 } else {
17184                     string disp=lang_get_string(1,(*i).lang,135)+eol;
17185                     int ec=0;
17186                     dcc_send_msg((*i).socket,disp,ec);
17187 
17188                     vector<string>::iterator i1;
17189                     for(i1=(*i).access_to_procs.begin(); i1!=(*i).access_to_procs.end(); i1++) {
17190                         if(!(*i1).compare("*"))
17191                             continue;
17192                         disp=*i1+eol;
17193                         dcc_send_msg((*i).socket,disp,ec);
17194                     }
17195 
17196                     disp=lang_get_string(1,(*i).lang,616)+eol;
17197                     dcc_send_msg((*i).socket,disp,ec);
17198 
17199                     (*i).edit_rproc=1;
17200                 }
17201             }
17202             if(!cmd.compare(".getfile")) {
17203                 got_cmd=true;
17204                 if((*i).access_to_filesystem) {
17205                     int dcc_group=atol(param2.c_str());
17206                     int res=dcc_send_file(true,param1,irc_get_nick((*i).as_in_logic),dcc_group);
17207                     string disp;
17208                     switch(res) {
17209                         case DCC_NO_SUCH_FILE:
17210                             disp=lang_get_string(1,"en",334);
17211                             break;
17212                         case DCC_ACCESS_DENIED:
17213                             disp=lang_get_string(1,"en",335);
17214                             break;
17215                         case DCC_IO_ERROR:
17216                             disp=lang_get_string(1,"en",336);
17217                             break;
17218                     }
17219                     if(!disp.empty()) {
17220                         disp+=eol;
17221                         int ec=0;
17222                         dcc_send_msg((*i).socket,disp,ec);
17223                     }
17224                 } else {
17225                     string disp=lang_get_string(1,(*i).lang,275)+eol;
17226                     int ec=0;
17227                     dcc_send_msg((*i).socket,disp,ec);
17228                 }
17229             }
17230             if(!cmd.compare(".partyline")) {
17231                 got_cmd=true;
17232                 if(param2.compare("")) {
17233                     string disp=lang_get_string(1,(*i).lang,203)+eol;
17234                     int ec=0;
17235                     dcc_send_msg((*i).socket,disp,ec);
17236                 } else {
17237                     string chan=param1;
17238                     if(!chan.compare(""))
17239                         chan="partyline";
17240                     if(chan.compare((*i).partyline_channel)) {
17241                         if((*i).partyline_channel.compare(""))
17242                             botnet_partyline_leave_channel((*i).as_in_logic,(*i).partyline_channel);
17243                         (*i).partyline_channel=chan;
17244                         string users=botnet_partyline_join_channel((*i).as_in_logic,(*i).partyline_channel);
17245                         users=lang_get_string(1,(*i).lang,206)+" "+users+eol;
17246                         int ec=0;
17247                         dcc_send_msg((*i).socket,users,ec);
17248                     }
17249                 }
17250             }
17251             if(!cmd.compare(".leave")) {
17252                 got_cmd=true;
17253                 if(param1.compare("") || param2.compare("")) {
17254                     string disp=lang_get_string(1,(*i).lang,204)+eol;
17255                     int ec=0;
17256                     dcc_send_msg((*i).socket,disp,ec);
17257                 } else {
17258                     if((*i).partyline_channel.compare("")) {
17259                         botnet_partyline_leave_channel((*i).as_in_logic,(*i).partyline_channel);
17260                         (*i).partyline_channel="";
17261                     } else {
17262                         string disp=lang_get_string(1,(*i).lang,205)+eol;
17263                         int ec=0;
17264                         dcc_send_msg((*i).socket,disp,ec);
17265                     }
17266                 }
17267             }
17268             if(!cmd.compare(".restart")) {
17269                 got_cmd=true;
17270                 if(param1.compare("") || param2.compare("")) {
17271                     string disp=lang_get_string(1,(*i).lang,270)+eol;
17272                     int ec=0;
17273                     dcc_send_msg((*i).socket,disp,ec);
17274                 } else {
17275                     if((*i).access_to_restart) {
17276                         dcc_killing_user_eol=eol;
17277                         dcc_killing_user_socket=&((*i).socket);
17278 
17279                         char* tmp=new char[(*i).as_in_logic.length()+128];
17280                         sprintf(tmp,"%s%s","RESTART by ",(*i).as_in_logic.c_str());
17281                         log_bot(tmp);
17282 
17283                         logic_on_internal_event("@restart@",(*i).as_in_logic,"","","",PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL,"","");
17284 
17285                         string disp=(string)tmp;
17286                         disp+=eol;
17287                         int ec=0;
17288                         dcc_send_msg((*i).socket,disp,ec);
17289                         delete[] tmp;
17290                         tmp=NULL;
17291 
17292                         dcc_who_is_killing=(*i).as_in_logic;
17293                         dcc_killing_user_lang=(*i).lang;
17294                         dcc_want_to_restart=true;
17295 
17296                         log_free_locks();
17297 
17298                         logic_partyline_backup((*i).as_in_logic);
17299                     } else {
17300                         string disp=lang_get_string(1,(*i).lang,272)+eol;
17301                         int ec=0;
17302                         dcc_send_msg((*i).socket,disp,ec);
17303                     }
17304                 }
17305             }
17306             if(!cmd.compare(".die")) {
17307                 got_cmd=true;
17308                 if(param1.compare("") || param2.compare("")) {
17309                     string disp=lang_get_string(1,(*i).lang,271)+eol;
17310                     int ec=0;
17311                     dcc_send_msg((*i).socket,disp,ec);
17312                 } else {
17313                     if((*i).access_to_die) {
17314                         dcc_killing_user_eol=eol;
17315                         dcc_killing_user_socket=&((*i).socket);
17316 
17317                         char* tmp=new char[(*i).as_in_logic.length()+128];
17318                         sprintf(tmp,"%s%s","DIE by ",(*i).as_in_logic.c_str());
17319                         log_bot(tmp);
17320 
17321                         logic_on_internal_event("@die@",(*i).as_in_logic,"","","",PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL,"","");
17322 
17323                         string disp=(string)tmp;
17324                         disp+=eol;
17325                         int ec=0;
17326                         dcc_send_msg((*i).socket,disp,ec);
17327                         delete[] tmp;
17328                         tmp=NULL;
17329 
17330                         dcc_who_is_killing=(*i).as_in_logic;
17331                         dcc_killing_user_lang=(*i).lang;
17332                         dcc_want_to_die=true;
17333 
17334                         logic_partyline_backup((*i).as_in_logic);
17335                     } else {
17336                         string disp=lang_get_string(1,(*i).lang,273)+eol;
17337                         int ec=0;
17338                         dcc_send_msg((*i).socket,disp,ec);
17339                     }
17340                 }
17341             }
17342             if(!cmd.compare(".help")) {
17343                 got_cmd=true;
17344                 if(param1.compare("") || param2.compare("")) {
17345                     string disp=lang_get_string(1,(*i).lang,372)+eol;
17346                     int ec=0;
17347                     dcc_send_msg((*i).socket,disp,ec);
17348                 } else {
17349                     string disp;
17350                     for(int ii=354; ii<=371; ii++) // !!!
17351                         disp+=lang_get_string(1,(*i).lang,ii)+eol;
17352                     disp+=lang_get_string(1,(*i).lang,396)+eol;
17353                     disp+=lang_get_string(1,(*i).lang,410)+eol;
17354                     disp+=lang_get_string(1,(*i).lang,418)+eol;
17355                     disp+=lang_get_string(1,(*i).lang,454)+eol;
17356                     disp+=lang_get_string(1,(*i).lang,453)+eol;
17357                     disp+=lang_get_string(1,(*i).lang,535)+eol;
17358                     disp+=lang_get_string(1,(*i).lang,566)+eol;
17359                     disp+=lang_get_string(1,(*i).lang,571)+eol;
17360                     disp+=lang_get_string(1,(*i).lang,579)+eol;
17361                     disp+=lang_get_string(1,(*i).lang,615)+eol;
17362                     disp+=lang_get_string(1,(*i).lang,636)+eol;
17363                     disp+=lang_get_string(1,(*i).lang,643)+eol;
17364                     disp+=lang_get_string(1,(*i).lang,645)+eol;
17365                     disp+=lang_get_string(1,(*i).lang,679)+eol;
17366                     int ec=0;
17367                     dcc_send_msg((*i).socket,disp,ec);
17368                 }
17369             }
17370             if(!cmd.compare(".showbots")) {
17371                 got_cmd=true;
17372                 if(param1.compare("") || param2.compare("")) {
17373                     string disp=lang_get_string(1,(*i).lang,644)+eol;
17374                     int ec=0;
17375                     dcc_send_msg((*i).socket,disp,ec);
17376                 } else {
17377                     string disp=botnet_showbots((*i).lang,eol);
17378                     int ec=0;
17379                     dcc_send_msg((*i).socket,disp,ec);
17380                 }
17381             }
17382             if(!cmd.compare(".broadcastping")) {
17383                 got_cmd=true;
17384                 if(param1.compare("") || param2.compare("")) {
17385                     string disp=lang_get_string(1,(*i).lang,646)+eol;
17386                     int ec=0;
17387                     dcc_send_msg((*i).socket,disp,ec);
17388                 } else {
17389                     time_t now;
17390                     time(&now);
17391 
17392                     string c="\x01" "BROADCAST_PING\x01 ";
17393                     char tmp[128];
17394                     c+=ltoa((long)now,tmp,10);
17395                     c+=" ";
17396                     c+=(*i).as_in_logic;
17397 
17398                     // clean up flood buffers
17399                     vector<s_flood_history>::iterator i4;
17400                 l_flood:
17401                     for(i4=(*i).msg_flood_hist.begin(); i4!=(*i).msg_flood_hist.end(); i4++)
17402                         if(now-(*i4).time>(*i).partyline_msg_flood.seconds) {
17403                             (*i).msg_flood_hist.erase(i4);
17404                             goto l_flood;
17405                         }
17406 
17407                     s_flood_history entry;
17408                     entry.time=now;
17409                     entry.bytes=c.length();
17410                     entry.msg=c;
17411 
17412                     (*i).msg_flood_hist.push_back(entry);
17413                     unsigned int entries=0;
17414                     for(i4=(*i).msg_flood_hist.begin(); i4!=(*i).msg_flood_hist.end(); i4++)
17415                         entries++;
17416                     if((*i).partyline_msg_flood.lines!=0 && entries>=(*i).partyline_msg_flood.lines) {
17417                         char tmp[64];
17418                         ltoa((long)(*i).partyline_msg_flood.seconds,tmp,10);
17419                         string disp=lang_subst(lang_get_string(1,(*i).lang,207),tmp)+eol;
17420                         int ec=0;
17421                         dcc_send_msg((*i).socket,disp,ec);
17422                     } else {
17423                         string disp=lang_get_string(1,(*i).lang,647);
17424                         disp+=" ";
17425                         disp+=ctime(&now);
17426                         if(disp.length() && disp[disp.length()-1]=='\n')
17427                             disp.erase(disp.length()-1,1);
17428                         if(disp.length() && disp[disp.length()-1]=='\r')
17429                             disp.erase(disp.length()-1,1);
17430                         if(disp.length() && disp[disp.length()-1]=='\n')
17431                             disp.erase(disp.length()-1,1);
17432                         if(disp.length() && disp[disp.length()-1]=='\r')
17433                             disp.erase(disp.length()-1,1);
17434                         disp+=eol;
17435                         int ec=0;
17436                         dcc_send_msg((*i).socket,disp,ec);
17437                         botnet_partyline_message((*i).as_in_logic,"",c);
17438                     }
17439                 }
17440             }
17441             if(!cmd.compare(".execute")) {
17442                 got_cmd=true;
17443                 if(param1.empty() || c.find(" ",0)==string::npos) {
17444                     string disp=lang_get_string(1,(*i).lang,653)+eol;
17445                     int ec=0;
17446                     dcc_send_msg((*i).socket,disp,ec);
17447                 } else {
17448                     string proc=c;
17449                     proc.erase(0,proc.find(" ",0)+1);
17450                     if(dcc_can_unassign(i,eol,proc)) {
17451                         map<string,string> vars;
17452                         logic_execute(proc,vars);
17453                     } else {
17454                         string disp=lang_get_string(1,(*i).lang,654)+eol;
17455                         int ec=0;
17456                         dcc_send_msg((*i).socket,disp,ec);
17457                     }
17458                 }
17459             }
17460             if(!cmd.compare(".replication")) {
17461                 got_cmd=true;
17462                 if(param1.compare("") || param2.compare("")) {
17463                     string disp=lang_get_string(1,(*i).lang,419)+eol;
17464                     int ec=0;
17465                     dcc_send_msg((*i).socket,disp,ec);
17466                 } else {
17467                     if((*i).access_to_replication) {
17468                         (*i).replication=1;
17469                     } else {
17470                         string disp=lang_get_string(1,(*i).lang,420)+eol;
17471                         int ec=0;
17472                         dcc_send_msg((*i).socket,disp,ec);
17473                     }
17474                 }
17475             }
17476             if(!cmd.compare(".chpass")) {
17477                 got_cmd=true;
17478                 if(!param1.compare("") || !param2.compare("")) {
17479                     string disp=lang_get_string(1,(*i).lang,637)+eol;
17480                     int ec=0;
17481                     dcc_send_msg((*i).socket,disp,ec);
17482                 } else {
17483                     unsigned char signature[16];
17484 
17485                     MD5Context md5c;
17486                     MD5Init(&md5c);
17487                     MD5Update(&md5c,(unsigned char *)param2.c_str(),(unsigned int)param2.length());
17488                     MD5Final(signature,&md5c);
17489 
17490                     char sig[128];
17491                     sig[0]=0;
17492                     for(int i1=0; i1<16; i1++) {
17493                         char tmp[16];
17494                         sprintf(tmp,"%02X",signature[i1]);
17495                         strcat(sig,tmp);
17496                     }
17497 
17498                     bool got=false;
17499                     if((*i).as_in_logic.compare(param1)) {
17500                         vector<string>::iterator i1;
17501                         for(i1=(*i).access_to_users.begin(); i1!=(*i).access_to_users.end(); i1++) {
17502                             if(!(*i1).compare(param1)) {
17503                                 got=true;
17504                                 if(dcc_want_to_upgrade) {
17505                                     string disp=lang_get_string(1,(*i).lang,642)+eol;
17506                                     int ec=0;
17507                                     dcc_send_msg((*i).socket,disp,ec);
17508                                 } else
17509                                     dcc_set_password(param1,sig);
17510                                 break;
17511                             }
17512                         }
17513                     } else {
17514                         got=true;
17515                         if(dcc_want_to_upgrade) {
17516                             string disp=lang_get_string(1,(*i).lang,642)+eol;
17517                             int ec=0;
17518                             dcc_send_msg((*i).socket,disp,ec);
17519                         } else
17520                             dcc_set_password(param1,sig);
17521                     }
17522                     if(!got) {
17523                         string disp=lang_get_string(1,(*i).lang,638)+eol;
17524                         int ec=0;
17525                         dcc_send_msg((*i).socket,disp,ec);
17526                     } else {
17527                         string disp=lang_get_string(1,(*i).lang,639)+eol;
17528                         int ec=0;
17529                         dcc_send_msg((*i).socket,disp,ec);
17530                     }
17531                 }
17532             }
17533             if(!cmd.compare(".terminator")) {
17534                 got_cmd=true;
17535                 if(param1.compare("") || param2.compare("")) {
17536                     string disp=lang_get_string(1,(*i).lang,455)+eol;
17537                     int ec=0;
17538                     dcc_send_msg((*i).socket,disp,ec);
17539                 } else {
17540                     (*i).terminator=1;
17541                 }
17542             }
17543             if(!cmd.compare(".+group")) {
17544                 got_cmd=true;
17545                 if(!param1.compare("") || param2.compare("")) {
17546                     string disp=lang_get_string(1,(*i).lang,397)+eol;
17547                     int ec=0;
17548                     dcc_send_msg((*i).socket,disp,ec);
17549                 } else {
17550                     vector<s_group>::iterator i1;
17551                     bool got=false;
17552                     map<string,string> vars;
17553                     for(i1=r_all_groups.begin(); i1!=r_all_groups.end(); i1++) {
17554                         if(!logic_eval((*i1).name,vars).compare(param1)) {
17555                             got=true;
17556                             string disp=lang_get_string(1,(*i).lang,398)+eol;
17557                             int ec=0;
17558                             dcc_send_msg((*i).socket,disp,ec);
17559                             break;
17560                         }
17561                     }
17562                     if(!got) {
17563                         s_group g;
17564                         g.name=param1;
17565                         g.name="\""+g.name+"\"";
17566                         r_all_groups.push_back(g);
17567                         string disp=lang_get_string(1,(*i).lang,399)+eol;
17568                         int ec=0;
17569                         dcc_send_msg((*i).socket,disp,ec);
17570                     }
17571                 }
17572             }
17573             if(!cmd.compare(".private")) {
17574                 got_cmd=true;
17575                 if(param1.compare("") || param2.compare("")) {
17576                     string disp=lang_get_string(1,(*i).lang,411)+eol;
17577                     int ec=0;
17578                     dcc_send_msg((*i).socket,disp,ec);
17579                 } else {
17580                     if(!(*i).access_to_private) {
17581                         string disp=lang_get_string(1,(*i).lang,412)+eol;
17582                         int ec=0;
17583                         dcc_send_msg((*i).socket,disp,ec);
17584                     } else {
17585                         (*i).private_edit=1;
17586                     }
17587                 }
17588             }
17589             if(!cmd.compare(".lang")) {
17590                 got_cmd=true;
17591                 if(param1.compare("") || param2.compare("")) {
17592                     string disp=lang_get_string(1,(*i).lang,450)+eol;
17593                     int ec=0;
17594                     dcc_send_msg((*i).socket,disp,ec);
17595                 } else {
17596                     (*i).language=1;
17597                 }
17598             }
17599             if(!cmd.compare(".stat")) {
17600                 got_cmd=true;
17601                 if(param1.compare("") || param2.compare("")) {
17602                     string disp=lang_get_string(1,(*i).lang,534)+eol;
17603                     int ec=0;
17604                     dcc_send_msg((*i).socket,disp,ec);
17605                 } else {
17606                     list<string> lines;
17607                     stats_display(lines,(*i).lang);
17608                     list<string>::iterator i1;
17609                     string disp;
17610                     for(i1=lines.begin(); i1!=lines.end(); i1++) {
17611                         disp+=*i1;
17612                         disp+=eol;
17613                     }
17614                     disp+=eol;
17615                     vector<s_online_channel>::iterator i2;
17616                     for(i2=irc_channels.begin(); i2!=irc_channels.end(); i2++) {
17617                         disp+=lang_subst(lang_subst(lang_get_string(1,(*i).lang,539),irc_get_mode((*i2).name,irc_nick)),(*i2).name)+eol;
17618                         vector<s_online_user>::iterator i3;
17619                         for(i3=(*i2).users.begin(); i3!=(*i2).users.end(); i3++) {
17620                             disp+="   ";
17621                             disp+=lang_subst(lang_get_string(1,(*i).lang,540),(*i3).mode);
17622                             disp+=(*i3).nick;
17623                             disp+=" = ";
17624                             if((*i3).got_whois)
17625                                 disp+=(*i3).in_logic_as;
17626                             else
17627                                 disp+=lang_get_string(1,(*i).lang,557);
17628                             disp+=eol;
17629 
17630                             // display dynamic modes
17631                             s_user u;
17632                             vector<s_channel> chs;
17633                             logic_partyline_get_user((*i3).in_logic_as,u,chs);
17634                             vector<s_channel>::iterator i4;
17635                             for(i4=chs.begin(); i4!=chs.end(); i4++)
17636                                 if(!cmp_strings_case_insensitive((*i4).channel_name,(*i2).name)) {
17637                                     if(!(*i4).dynamic_plus_modes.empty()) {
17638                                         disp+="      ";
17639                                         disp+=lang_get_string(1,(*i).lang,550);
17640                                         disp+=(*i4).dynamic_plus_modes;
17641                                         disp+=eol;
17642                                     }
17643                                     if(!(*i4).dynamic_minus_modes.empty()) {
17644                                         disp+="      ";
17645                                         disp+=lang_get_string(1,(*i).lang,551);
17646                                         disp+=(*i4).dynamic_minus_modes;
17647                                         disp+=eol;
17648                                     }
17649                                     break;
17650                                 }
17651                         }
17652                     }
17653                     int ec=0;
17654                     dcc_send_msg((*i).socket,disp,ec);
17655                 }
17656             }
17657             if(!cmd.compare(".part")) {
17658                 got_cmd=true;
17659                 if(!param1.compare("")) {
17660                     string disp=lang_get_string(1,(*i).lang,567)+eol;
17661                     int ec=0;
17662                     dcc_send_msg((*i).socket,disp,ec);
17663                 } else {
17664                     vector<string>::iterator i1;
17665                     bool got=false;
17666                     for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
17667                         if(!cmp_strings_case_insensitive(param1,*i1)) {
17668                             got=true;
17669                             break;
17670                         }
17671                     if(!got) {
17672                         string disp=lang_get_string(1,(*i).lang,568)+eol;
17673                         int ec=0;
17674                         dcc_send_msg((*i).socket,disp,ec);
17675                     } else {
17676                         got=false;
17677                         vector<s_online_channel>::iterator i1;
17678                         for(i1=irc_channels.begin(); i1!=irc_channels.end(); i1++)
17679                             if(!cmp_strings_case_insensitive(param1,(*i1).name)) {
17680                                 got=true;
17681                                 irc_channels.erase(i1);
17682                                 string reason=param2;
17683                                 if(reason.compare(""))
17684                                     reason+=(string)" - ";
17685                                 reason+=(*i).as_in_logic;
17686                                 irc_part(param1.c_str(),reason.c_str());
17687                                 break;
17688                             }
17689                         string disp;
17690                         if(!got) {
17691                             disp=lang_get_string(1,(*i).lang,569)+eol;
17692                         } else {
17693                             disp=lang_get_string(1,(*i).lang,570)+eol;
17694                         }
17695                         int ec=0;
17696                         dcc_send_msg((*i).socket,disp,ec);
17697                     }
17698                 }
17699             }
17700             if(!cmd.compare(".join")) {
17701                 got_cmd=true;
17702                 if(!param1.compare("")) {
17703                     string disp=lang_get_string(1,(*i).lang,572)+eol;
17704                     int ec=0;
17705                     dcc_send_msg((*i).socket,disp,ec);
17706                 } else {
17707                     vector<string>::iterator i1;
17708                     bool got=false;
17709                     for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
17710                         if(!cmp_strings_case_insensitive(param1,*i1)) {
17711                             got=true;
17712                             break;
17713                         }
17714                     if(!got) {
17715                         string disp=lang_get_string(1,(*i).lang,568)+eol;
17716                         int ec=0;
17717                         dcc_send_msg((*i).socket,disp,ec);
17718                     } else {
17719                         got=false;
17720                         vector<s_online_channel>::iterator i1;
17721                         for(i1=irc_channels.begin(); i1!=irc_channels.end(); i1++)
17722                             if(!cmp_strings_case_insensitive(param1,(*i1).name)) {
17723                                 got=true;
17724                                 break;
17725                             }
17726                         string disp;
17727                         if(!got) {
17728                             irc_join(param1.c_str(),param2.c_str());
17729                             disp=lang_get_string(1,(*i).lang,574)+eol;
17730                         } else {
17731                             disp=lang_get_string(1,(*i).lang,573)+eol;
17732                         }
17733                         int ec=0;
17734                         dcc_send_msg((*i).socket,disp,ec);
17735                     }
17736                 }
17737             }
17738             if(!cmd.compare(".dynbans")) {
17739                 got_cmd=true;
17740                 if(!param1.compare("") || !param2.empty()) {
17741                     string disp=lang_get_string(1,(*i).lang,580)+eol;
17742                     int ec=0;
17743                     dcc_send_msg((*i).socket,disp,ec);
17744                 } else {
17745                     (*i).dynbans_channel=param1;
17746                     (*i).dynbans=1;
17747                     // the privilege check will be done in loop function
17748                 }
17749             }
17750             if(!got_cmd && c.length()>0 && (c[0]=='.' || !(*i).partyline_channel.compare(""))) {
17751                 string disp=lang_get_string(1,(*i).lang,449)+eol;
17752                 int ec=0;
17753                 dcc_send_msg((*i).socket,disp,ec);
17754             }
17755             if(c.length()>0 && c[0]!='.' && (*i).partyline_channel.compare("") && (*i).new_user==0 && (*i).edit_user==0 && (*i).edit_proc==0 && ((*i).chat || (*i).telnet) && !(*i).replication_partner && (*i).got_passwd==3) {
17756                 time_t now;
17757                 time(&now);
17758                 // clean up flood buffers
17759                 vector<s_flood_history>::iterator i4;
17760         l_flood2:
17761                 for(i4=(*i).msg_flood_hist.begin(); i4!=(*i).msg_flood_hist.end(); i4++)
17762                     if(now-(*i4).time>(*i).partyline_msg_flood.seconds) {
17763                         (*i).msg_flood_hist.erase(i4);
17764                         goto l_flood2;
17765                     }
17766 
17767                 s_flood_history entry;
17768                 entry.time=now;
17769                 entry.bytes=c.length();
17770                 entry.msg=c;
17771 
17772                 (*i).msg_flood_hist.push_back(entry);
17773                 unsigned int entries=0;
17774                 for(i4=(*i).msg_flood_hist.begin(); i4!=(*i).msg_flood_hist.end(); i4++)
17775                     entries++;
17776                 if((*i).partyline_msg_flood.lines!=0 && entries>=(*i).partyline_msg_flood.lines) {
17777                     char tmp[64];
17778                     ltoa((long)(*i).partyline_msg_flood.seconds,tmp,10);
17779                     string disp=lang_subst(lang_get_string(1,(*i).lang,207),tmp)+eol;
17780                     int ec=0;
17781                     dcc_send_msg((*i).socket,disp,ec);
17782                 } else {
17783                     // don't allow users to send magic control messages
17784                     if(c.length() && c[0]<0x20) // if it begins with character code lower than 0x20
17785                         c=(string)" "+c; // prepend it by SPACE
17786 
17787                     if(!c.empty())
17788                         botnet_partyline_message((*i).as_in_logic,(*i).partyline_channel,c);
17789                 }
17790             }
17791         }
17792         if((*i).send) {
17793             int ec=0;
17794             char buff[1024*10];
17795             bool closed=false;
17796             size_t len=0;
17797             if((*i).dcc_send.f || (*i).dcc_send.is_file_server_proto) {
17798                 len=sock_read((*i).socket,buff,sizeof(buff),ec,closed);
17799                 stats_dcc_send_bytes_received(len);
17800             }
17801 
17802             bool timeout=false;
17803             if((*i).dcc_send.last_packet==0)
17804                 time(&(*i).dcc_send.last_packet);
17805             if((*i).dcc_send.last_packet+atol(conf_getvar("dcc_send_timeout").c_str())<time(NULL))
17806                 timeout=true;
17807             if(closed || ec || timeout) {
17808                 sock_close((*i).socket);
17809                 dcc_clients.erase(i);
17810                 goto again;
17811             }
17812 
17813             if((*i).dcc_send.is_file_server_proto && len>0) {
17814                 (*i).dcc_send.is_file_server_proto=false;
17815                 // 120 clientnickname filesize filename
17816                 string msg;
17817                 size_t i1;
17818                 for(i1=0; i1<sizeof(buff) && i1<len && buff[i1]!=0 && buff[i1]!='\n' && buff[i1]!='\r'; i1++)
17819                     msg+=buff[i1];
17820                 string code, nick, size, name;
17821                 int pos=0;
17822                 for(i1=0; i1<msg.length(); i1++) {
17823                     if(msg[i1]==0x20 && pos!=3) {
17824                         pos++;
17825                         continue;
17826                     }
17827                     if(pos==0)
17828                         code+=msg[i1];
17829                     if(pos==1)
17830                         nick+=msg[i1];
17831                     if(pos==2)
17832                         size+=msg[i1];
17833                     if(pos==3)
17834                         name+=msg[i1];
17835                 }
17836                 string user_name=logic_find_user(nick,irc_get_ident(nick),irc_get_host(nick),irc_get_fullname(nick),irc_is_ircop(nick));
17837                 if(code.compare("120") || !logic_access_to_filesystem(user_name)) {
17838                     sock_close((*i).socket);
17839                     dcc_clients.erase(i);
17840                     goto again;
17841                 }
17842                 (*i).dcc_send.original_name=name;
17843                 (*i).dcc_send.size=atol(size.c_str());
17844                 if(filesys_check_add_file_raw(name,user_name)!=0) {
17845                     sock_close((*i).socket);
17846                     dcc_clients.erase(i);
17847                     goto again;
17848                 }
17849                 string resp="121 ";
17850                 resp+=irc_nick;
17851                 resp+=" 0\n";
17852                 int ec=0;
17853                 dcc_send_msg((*i).socket,resp,ec);
17854                 continue;
17855             }
17856             if((*i).dcc_send.is_file_server_proto && len==0)
17857                 continue;
17858             if(closed || ec || timeout || ((*i).dcc_send.received+(*i).resume_pos)==(*i).dcc_send.size) {
17859                 sock_close((*i).socket);
17860                 if(ec)
17861                     log_socket(ec,sock_error(ec),"while calling sock_read in file " __FILE__ " in function " __FUNC__);
17862 
17863                 if((*i).dcc_send.f!=NULL) {
17864                     fclose((*i).dcc_send.f);
17865                     (*i).dcc_send.f=NULL;
17866 
17867                     if(((*i).dcc_send.received+(*i).resume_pos)!=(*i).dcc_send.size) {
17868                         string fn=(*i).dcc_send.tmp_file_name;
17869                         while(fn.find("/",0)!=string::npos)
17870                             fn.erase(0,fn.find("/",0)+1);
17871                         while(fn.find("\\",0)!=string::npos)
17872                             fn.erase(0,fn.find("\\",0)+1);
17873 
17874                         filesys_add_file_raw(fn,(*i).dcc_send.original_name,(*i).as_in_logic,false,(*i).resume_pos!=0);
17875                         logic_filesys_got_new((*i).as_in_logic,(*i).nick,(*i).ident,(*i).host,fn);
17876                     } else {
17877                         string fn=(*i).dcc_send.tmp_file_name;
17878                         while(fn.find("/",0)!=string::npos)
17879                             fn.erase(0,fn.find("/",0)+1);
17880                         while(fn.find("\\",0)!=string::npos)
17881                             fn.erase(0,fn.find("\\",0)+1);
17882 
17883                         filesys_add_file_raw(fn,(*i).dcc_send.original_name,(*i).as_in_logic,true,(*i).resume_pos!=0);
17884                         logic_filesys_got_new((*i).as_in_logic,(*i).nick,(*i).ident,(*i).host,fn);
17885                     }
17886                 }
17887 
17888                 dcc_clients.erase(i);
17889                 goto again;
17890             }
17891             (*i).dcc_send.received+=len;
17892             if((*i).dcc_send.f==NULL && (*i).resume_pos==0) {
17893                 char fn[1024];
17894                 time_t now=time(NULL);
17895                 sprintf(fn,"%s",ctime(&now));
17896                 for(unsigned int i1=0; i1<strlen(fn); i1++) {
17897                     bool ok=false;
17898                     if(fn[i1]>='a' && fn[i1]<='z')
17899                         ok=true;
17900                     if(fn[i1]>='A' && fn[i1]<='Z')
17901                         ok=true;
17902                     if(fn[i1]>='0' && fn[i1]<='9')
17903                         ok=true;
17904                     if(!ok)
17905                         fn[i1]='_';
17906                 }
17907                 string new_fn="." FILE_SLASH "filesystem" FILE_SLASH;
17908                 new_fn+=fn;
17909                 new_fn+="_";
17910                 new_fn+=(*i).as_in_logic;
17911                 new_fn+=".dat";
17912                 strcpy((*i).dcc_send.tmp_file_name,new_fn.c_str());
17913                 (*i).dcc_send.f=fopen((*i).dcc_send.tmp_file_name,"wb");
17914                 if(!(*i).dcc_send.f) {
17915                     sock_close((*i).socket);
17916                     dcc_clients.erase(i);
17917                     goto again;
17918                 }
17919             } else
17920                 if((*i).dcc_send.f==NULL && (*i).resume_pos!=0) {
17921                     string internal;
17922                     filesys_dcc_get_resume_info((*i).as_in_logic,(*i).dcc_send.original_name,internal);
17923                     if(internal.empty()) {
17924                         // error!
17925                         string err="Internal error while trying to DCC RESUME (receive file): function filesys_dcc_get_resume_info() returned an emty string as internal name of file. Closing DCC SEND connection. in file " __FILE__ " in function " __FUNC__;
17926                         log_debug(err.c_str());
17927                         sock_close((*i).socket);
17928                         dcc_clients.erase(i);
17929                         goto again;
17930                     }
17931                     string new_fn="." FILE_SLASH "filesystem" FILE_SLASH;
17932                     new_fn+=internal;
17933                     strcpy((*i).dcc_send.tmp_file_name,new_fn.c_str());
17934                     (*i).dcc_send.f=fopen((*i).dcc_send.tmp_file_name,"ab");
17935                     if(!(*i).dcc_send.f) {
17936                         sock_close((*i).socket);
17937                         dcc_clients.erase(i);
17938                         goto again;
17939                     }
17940                     fseek((*i).dcc_send.f,(long)(*i).resume_pos,SEEK_SET);
17941                 } else {
17942                     time_t now=time(NULL);
17943                     if(len)
17944                         (*i).dcc_send.last_packet=now;
17945                     if(len)
17946                         (*i).dcc_send.response_sent=false;
17947                     size_t in_queue=sock_get_receive_size((*i).socket);
17948                     if((in_queue==0 && len==0 && (*i).dcc_send.received%512==0 && !(*i).dcc_send.response_sent) || ((*i).dcc_send.received+(*i).resume_pos)==(*i).dcc_send.size) {
17949                         (*i).dcc_send.response_sent=true;
17950                         size_t s=(*i).dcc_send.received+(*i).resume_pos;
17951     
17952                         char tmp[4];
17953                         memcpy(tmp,&s,4);
17954 
17955 #if !defined(HIGHFIRST)
17956                         // switch bytes: BIG endian (network byte order)
17957                         char x;
17958     
17959                         x=tmp[0];
17960                         tmp[0]=tmp[3];
17961                         tmp[3]=x;
17962                         //
17963                         x=tmp[1];
17964                         tmp[1]=tmp[2];
17965                         tmp[2]=x;
17966 #endif
17967                         size_t sent=sock_send((*i).socket,tmp,4,ec);
17968                         stats_dcc_send_bytes_sent(sent);
17969                     }
17970                     if(((*i).dcc_send.received+(*i).resume_pos)==(*i).dcc_send.size) {
17971                         if(len)
17972                             fwrite(buff,1,len,(*i).dcc_send.f);
17973 
17974                         fclose((*i).dcc_send.f);
17975                         (*i).dcc_send.f=NULL;
17976 
17977                         string fn=(*i).dcc_send.tmp_file_name;
17978                         while(fn.find("/",0)!=string::npos)
17979                             fn.erase(0,fn.find("/",0)+1);
17980                         while(fn.find("\\",0)!=string::npos)
17981                             fn.erase(0,fn.find("\\",0)+1);
17982 
17983                         filesys_add_file_raw(fn,(*i).dcc_send.original_name,(*i).as_in_logic,true,(*i).resume_pos!=0);
17984                         logic_filesys_got_new((*i).as_in_logic,(*i).nick,(*i).ident,(*i).host,fn);
17985 
17986                         sock_close((*i).socket);
17987                         dcc_clients.erase(i);
17988                         goto again;
17989                     }
17990                 }
17991                 if(len)
17992                     fwrite(buff,1,len,(*i).dcc_send.f);
17993         }
17994 
17995         if((*i).send_from_filesystem) {
17996             if((*i).dcc_send.f==NULL) {
17997                 (*i).dcc_send.f=fopen((*i).send_file.file_name.c_str(),"rb");
17998                 if((*i).dcc_send.f==NULL) {
17999                     string str="in file " __FILE__ " in function " __FUNC__ " occurred error: ";
18000                     str+="cannot open filesystem file to send. Filename: ";
18001                     str+=(*i).send_file.file_name;
18002                     log_debug(str.c_str());
18003 
18004                     sock_close((*i).socket);
18005                     dcc_clients.erase(i);
18006                     goto again;
18007                 }
18008                 if((*i).resume_pos!=0) {
18009                     fseek((*i).dcc_send.f,(long)(*i).resume_pos,SEEK_SET);
18010                     (*i).dcc_send.response_sent=true; // there is "response_sent" used as if response were received
18011                 }
18012             }
18013             // there is "response_sent" used as if response were received
18014 send_next:
18015             if((*i).dcc_send.response_sent || ftell((*i).dcc_send.f)==0) {
18016                 (*i).dcc_send.response_sent=false;
18017                 int ec=0;
18018                 char buff[1024];
18019                 size_t len=fread(buff,1,1024,(*i).dcc_send.f);
18020                 size_t sent=sock_send((*i).socket,buff,len,ec);
18021                 stats_dcc_send_bytes_sent(sent);
18022                 (*i).dcc_send.received+=len;
18023                 if(len)
18024                     time(&(*i).dcc_send.last_packet);
18025                 if(ec) {
18026                     sock_close((*i).socket);
18027                     log_socket(ec,sock_error(ec),"while calling sock_send in file " __FILE__ " in function " __FUNC__);
18028                     if((*i).dcc_send.f)
18029                         fclose((*i).dcc_send.f);
18030                     (*i).dcc_send.f=NULL;
18031                     dcc_clients.erase(i);
18032                     goto again;
18033                 }
18034             } else {
18035                 int ec=0;
18036                 char tmp[4];
18037                 bool closed=false;
18038                 size_t len=sock_read((*i).socket,tmp,sizeof(tmp),ec,closed);
18039                 if(len) {
18040                     time(&(*i).dcc_send.last_packet);
18041                     stats_dcc_send_bytes_received(len);
18042                 }
18043                 if(ec || closed) {
18044                     sock_close((*i).socket);
18045                     log_socket(ec,sock_error(ec),"while calling sock_read in file " __FILE__ " in function " __FUNC__);
18046                     if((*i).dcc_send.f)
18047                         fclose((*i).dcc_send.f);
18048                     (*i).dcc_send.f=NULL;
18049                     dcc_clients.erase(i);
18050                     goto again;
18051                 }
18052                 if(len==4) {
18053 #if !defined(HIGHFIRST)
18054                     // switch bytes: BIG endian (network byte order)
18055                     char x;
18056 
18057                     x=tmp[0];
18058                     tmp[0]=tmp[3];
18059                     tmp[3]=x;
18060                     //
18061                     x=tmp[1];
18062                     tmp[1]=tmp[2];
18063                     tmp[2]=x;
18064 #endif
18065 
18066                     unsigned int pos;
18067                     memcpy(&pos,tmp,4);
18068 
18069                     if(pos!=ftell((*i).dcc_send.f)) {
18070                         sock_close((*i).socket);
18071                         if((*i).dcc_send.f)
18072                             fclose((*i).dcc_send.f);
18073                         (*i).dcc_send.f=NULL;
18074                         dcc_clients.erase(i);
18075                         goto again;
18076                     }
18077 
18078                     if(pos==(*i).send_file.size) {
18079                         filesys_set_file_was_read((*i).as_in_logic,(*i).send_file.public_name);
18080                         sock_close((*i).socket);
18081                         if((*i).dcc_send.f)
18082                             fclose((*i).dcc_send.f);
18083                         (*i).dcc_send.f=NULL;
18084                         dcc_clients.erase(i);
18085                         goto again;
18086                     }
18087 
18088                     (*i).dcc_send.response_sent=true;
18089                     goto send_next;
18090                 }
18091             }
18092             if((*i).dcc_send.last_packet==0)
18093                 time(&(*i).dcc_send.last_packet);
18094             if((*i).dcc_send.last_packet+atol(conf_getvar("dcc_send_timeout").c_str())<time(NULL)) {
18095                 // timeout
18096                 if((*i).dcc_send.f!=NULL)
18097                     fclose((*i).dcc_send.f);
18098                 filesys_set_file_was_read((*i).as_in_logic,(*i).send_file.public_name);
18099                 sock_close((*i).socket);
18100                 if((*i).dcc_send.f)
18101                     fclose((*i).dcc_send.f);
18102                 (*i).dcc_send.f=NULL;
18103                 dcc_clients.erase(i);
18104                 goto again;
18105             }
18106         }
18107     }
18108 
18109     vector<s_dcc_server>::iterator i2;
18110     for(i2=dcc_servers.begin(); i2!=dcc_servers.end(); i2++) {
18111         if((*i2).socket.cmp()) {
18112             s_socket s;
18113             if(!(*i2).using_ipv6)
18114                 s=sock_accept((*i2).socket);
18115             else
18116                 s=sock_accept6((*i2).socket);
18117             if(s.cmp()) {
18118                 if(!(*i2).server_type.compare("chat"))
18119                     stats_dcc_chat_new_connection();
18120                 if(!(*i2).server_type.compare("send"))
18121                     stats_dcc_send_new_connection();
18122                 if((*i2).server_type.empty())
18123                     stats_dcc_chat_new_connection();
18124 
18125                 sock_async(s);
18126 
18127                 int ec=0;
18128                 in_addr addr;
18129 #ifdef _WIN32
18130                 addr.S_un.S_addr=(unsigned long)-1;
18131 #else
18132                 addr.s_addr=(unsigned long)-1;
18133 #endif
18134                 in_addr6_ addr6;
18135                 memset(&addr6,0,sizeof(addr6));
18136                 ec=0;
18137                 if(!(*i2).using_ipv6)
18138                     addr=sock_get_remote_addr(s,ec);
18139                 else
18140                     inet_pton(AF_INET6,s.host,&addr6);
18141                 if(!ec) {
18142                     bool awaiting_send=false;
18143                     {
18144                         vector<s_dcc_send_file>::iterator i;
18145                         for(i=dcc_awaiting_send.begin(); i!=dcc_awaiting_send.end(); i++) {
18146                             if(!(*i).using_ipv6) {
18147 #ifdef _WIN32
18148                                 if(addr.S_un.S_un_b.s_b1==(*i).remote_ip.S_un.S_un_b.s_b1 && addr.S_un.S_un_b.s_b2==(*i).remote_ip.S_un.S_un_b.s_b2 && addr.S_un.S_un_b.s_b3==(*i).remote_ip.S_un.S_un_b.s_b3 && addr.S_un.S_un_b.s_b4==(*i).remote_ip.S_un.S_un_b.s_b4) {
18149 #else
18150                                 if(((char*)&addr.s_addr)[0]==((char*)&(*i).remote_ip.s_addr)[0] && ((char*)&addr.s_addr)[1]==((char*)&(*i).remote_ip.s_addr)[1] && ((char*)&addr.s_addr)[2]==((char*)&(*i).remote_ip.s_addr)[2] && ((char*)&addr.s_addr)[3]==((char*)&(*i).remote_ip.s_addr)[3]) {
18151 #endif
18152                                     awaiting_send=true;
18153                                     break;
18154                                 }
18155                             } else {
18156                                 bool equal=true;
18157                                 for(unsigned i1=0; i1<sizeof((*i).remote_ip6); i1++) {
18158                                     if(((unsigned char*)&(*i).remote_ip6)[i1]!=((unsigned char*)&addr6)[i1]) {
18159                                         equal=false;
18160                                         break;
18161                                     }
18162                                 }
18163                                 if(equal) {
18164                                     awaiting_send=true;
18165                                     break;
18166                                 }
18167                             }
18168                         }
18169                     }
18170 
18171                     bool got=false;
18172                     if(!awaiting_send) {
18173                         vector<s_dcc_awaiting_user>::iterator i;
18174                         if(!(*i2).using_ipv6) {
18175 #ifdef _WIN32
18176                             if(addr.S_un.S_un_b.s_b1==127 && addr.S_un.S_un_b.s_b2==0 && addr.S_un.S_un_b.s_b3==0 && addr.S_un.S_un_b.s_b4==1) {
18177 #else
18178                             if(((char*)&addr.s_addr)[0]==127 && ((char*)&addr.s_addr)[1]==0 && ((char*)&addr.s_addr)[2]==0 && ((char*)&addr.s_addr)[3]==1) {
18179 #endif
18180                                 s_dcc_awaiting_user user;
18181 
18182                                 user.nick="";
18183                                 user.ident="";
18184                                 user.host="127.0.0.1";
18185                                 user.fullname="";
18186     
18187                                 user.using_ipv6=false;
18188                                 user.addr4=addr;
18189                                 time(&user.start_time);
18190                                 strcpy(user.user_name_as_in_logic,conf_getvar("127.0.0.1_dcc_user").c_str());
18191                                 dcc_awaiting_users.push_back(user);
18192                             }
18193                         } else {
18194                             if(addr6.bytes[0]==0 && addr6.bytes[1]==0 && addr6.bytes[2]==0 && addr6.bytes[3]==0 &&
18195                                 addr6.bytes[4]==0 && addr6.bytes[5]==0 && addr6.bytes[6]==0 && addr6.bytes[7]==0 &&
18196                                 addr6.bytes[8]==0 && addr6.bytes[9]==0 && addr6.bytes[10]==0 && addr6.bytes[11]==0 &&
18197                                 addr6.bytes[12]==0 && addr6.bytes[13]==0 && addr6.bytes[14]==0 && addr6.bytes[15]==1) {
18198                                 s_dcc_awaiting_user user;
18199 
18200                                 user.nick="";
18201                                 user.ident="";
18202                                 user.host="::1";
18203                                 user.fullname="";
18204     
18205                                 user.using_ipv6=true;
18206 #ifdef _WIN32
18207                                 user.addr4.S_un.S_addr=(unsigned long)-1;
18208 #else
18209                                 user.addr4.s_addr=(unsigned long)-1;
18210 #endif
18211                                 memcpy(&user.addr6,&addr6,sizeof(user.addr6));
18212                                 time(&user.start_time);
18213                                 strcpy(user.user_name_as_in_logic,conf_getvar("127.0.0.1_dcc_user").c_str());
18214                                 dcc_awaiting_users.push_back(user);
18215                             }
18216                         }
18217                     l1:
18218                         for(i=dcc_awaiting_users.begin(); i!=dcc_awaiting_users.end(); i++) {
18219                             time_t now;
18220                             time(&now);
18221                             if((*i).start_time+20<=now) {
18222                                 dcc_awaiting_users.erase(i);
18223                                 goto l1;
18224                             }
18225                             if(!(*i).using_ipv6 && !(*i2).using_ipv6) {
18226 #ifdef _WIN32
18227                                 if((*i).addr4.S_un.S_addr==addr.S_un.S_addr) {
18228 #else
18229                                 if((*i).addr4.s_addr==addr.s_addr) {
18230 #endif
18231                                     s_dcc_client c;
18232                                     c.server_socket=(*i2).socket;
18233 
18234                                     char tmp[256];
18235 #ifdef _WIN32
18236                                     inet_ntop(AF_INET,&(addr.S_un.S_addr),tmp,sizeof(tmp)-1);
18237 #else
18238                                     inet_ntop(AF_INET,&(addr.s_addr),tmp,sizeof(tmp)-1);
18239 #endif
18240                                     c.remote=tmp;
18241 
18242                                     c.nick=(*i).nick;
18243                                     c.ident=irc_get_ident((*i).nick);
18244                                     c.host=irc_get_host((*i).nick);
18245                                     c.fullname=irc_get_fullname((*i).nick);
18246 
18247                                     c.chat=true;
18248                                     c.send=false;
18249                                     c.telnet=false;
18250                                     c.send_from_filesystem=false;
18251                                     c.socket=s;
18252                                     c.got_passwd=0;
18253                                     c.new_user=0;
18254                                     c.edit_user=0;
18255                                     c.filesystem=0;
18256                                     c.as_in_logic=(*i).user_name_as_in_logic;
18257                                     c.got_user_name=(c.as_in_logic.empty()?false:true);
18258                                     if(!(*i2).server_type.empty()) {
18259                                         if(!(*i2).server_type.compare("chat")) {
18260                                             string gr="101 ";
18261                                             gr+=irc_nick;
18262                                             gr+="\n";
18263                                             int ec=0;
18264                                             size_t sent=sock_send(c.socket,gr.c_str(),gr.length(),ec);
18265                                             stats_dcc_chat_bytes_sent(sent);
18266                                         }
18267                                         if(!(*i2).server_type.compare("send")) {
18268                                             c.dcc_send.is_file_server_proto=true;
18269                                             c.chat=false;
18270                                             c.send=true;
18271                                         }
18272                                     }
18273                                     dcc_clients.push_back(c);
18274                                     dcc_check_limit();
18275                                     got=true;
18276                                     dcc_awaiting_users.erase(i);
18277                                     goto l1;
18278                                 }
18279                             } else if((*i).using_ipv6 && (*i2).using_ipv6) {
18280                                 if((*i).addr6.bytes[0]==addr6.bytes[0] && (*i).addr6.bytes[1]==addr6.bytes[1] &&
18281                                     (*i).addr6.bytes[2]==addr6.bytes[2] && (*i).addr6.bytes[3]==addr6.bytes[3] &&
18282                                     (*i).addr6.bytes[4]==addr6.bytes[4] && (*i).addr6.bytes[5]==addr6.bytes[5] &&
18283                                     (*i).addr6.bytes[6]==addr6.bytes[6] && (*i).addr6.bytes[7]==addr6.bytes[7] &&
18284                                     (*i).addr6.bytes[8]==addr6.bytes[8] && (*i).addr6.bytes[9]==addr6.bytes[9] &&
18285                                     (*i).addr6.bytes[10]==addr6.bytes[10] &&(*i).addr6.bytes[11]==addr6.bytes[11] &&
18286                                     (*i).addr6.bytes[12]==addr6.bytes[12] &&(*i).addr6.bytes[13]==addr6.bytes[13] &&
18287                                     (*i).addr6.bytes[14]==addr6.bytes[14] &&(*i).addr6.bytes[15]==addr6.bytes[15]) {
18288                                     s_dcc_client c;
18289                                     c.server_socket=(*i2).socket;
18290 
18291                                     char tmp[256];
18292                                     inet_ntop(AF_INET6,&addr6,tmp,sizeof(tmp)-1);
18293                                     c.remote=tmp;
18294 
18295                                     c.chat=true;
18296                                     c.send=false;
18297                                     c.telnet=false;
18298                                     c.send_from_filesystem=false;
18299                                     c.socket=s;
18300                                     c.got_passwd=0;
18301                                     c.new_user=0;
18302                                     c.edit_user=0;
18303                                     c.filesystem=0;
18304                                     c.as_in_logic=(*i).user_name_as_in_logic;
18305                                     c.got_user_name=(c.as_in_logic.empty()?false:true);
18306                                     if(!(*i2).server_type.empty()) {
18307                                         if(!(*i2).server_type.compare("chat")) {
18308                                             string gr="101 ";
18309                                             gr+=irc_nick;
18310                                             gr+="\n";
18311                                             int ec=0;
18312                                             size_t sent=sock_send(c.socket,gr.c_str(),gr.length(),ec);
18313                                             stats_dcc_chat_bytes_sent(sent);
18314                                         }
18315                                         if(!(*i2).server_type.compare("send")) {
18316                                             c.dcc_send.is_file_server_proto=true;
18317                                             c.chat=false;
18318                                             c.send=true;
18319                                         }
18320                                     }
18321                                     dcc_clients.push_back(c);
18322                                     dcc_check_limit();
18323                                     got=true;
18324                                     dcc_awaiting_users.erase(i);
18325                                     goto l1;
18326                                 }
18327                             }
18328                         }
18329                     } else {
18330                         got=false;
18331                     }
18332                     if(!got) {
18333                         vector<s_dcc_send_file>::iterator i;
18334                         got=false;
18335                 l2:
18336                         for(i=dcc_awaiting_send.begin(); i!=dcc_awaiting_send.end(); i++) {
18337                             time_t now;
18338                             time(&now);
18339                             if((*i).start_time+20<=now) {
18340                                 dcc_awaiting_send.erase(i);
18341                                 goto l2;
18342                             }
18343                             if(!(*i).using_ipv6 && !(*i2).using_ipv6) {
18344 #ifdef _WIN32
18345                                 if((*i).remote_ip.S_un.S_addr==addr.S_un.S_addr) {
18346 #else
18347                                 if((*i).remote_ip.s_addr==addr.s_addr) {
18348 #endif
18349                                     s_dcc_client c;
18350                                     c.server_socket=(*i2).socket;
18351 
18352                                 char tmp[256];
18353 #ifdef _WIN32
18354                                 inet_ntop(AF_INET,&(addr.S_un.S_addr),tmp,sizeof(tmp)-1);
18355 #else
18356                                 inet_ntop(AF_INET,&(addr.s_addr),tmp,sizeof(tmp)-1);
18357 #endif
18358                                 c.remote=tmp;
18359 
18360                                     c.chat=false;
18361                                     c.send=false;
18362                                     c.telnet=false;
18363                                     c.send_file=*i;
18364                                     c.send_from_filesystem=true;
18365                                     c.socket=s;
18366                                     c.got_passwd=0;
18367                                     c.new_user=0;
18368                                     c.edit_user=0;
18369                                     c.filesystem=0;
18370                                     c.as_in_logic=(*i).user_name_as_in_logic;
18371                                     c.got_user_name=(c.as_in_logic.empty()?false:true);
18372                                     c.resume_pos=(*i).resume_pos;
18373                                     dcc_clients.push_back(c);
18374                                     dcc_check_limit();
18375                                     got=true;
18376                                     dcc_awaiting_send.erase(i);
18377                                     goto l2;
18378                                 }
18379                             } else if((*i).using_ipv6 && (*i2).using_ipv6) {
18380                                 if((*i).remote_ip6.bytes[0]==addr6.bytes[0] && (*i).remote_ip6.bytes[1]==addr6.bytes[1] &&
18381                                    (*i).remote_ip6.bytes[2]==addr6.bytes[2] && (*i).remote_ip6.bytes[3]==addr6.bytes[3] &&
18382                                    (*i).remote_ip6.bytes[4]==addr6.bytes[4] && (*i).remote_ip6.bytes[5]==addr6.bytes[5] &&
18383                                    (*i).remote_ip6.bytes[6]==addr6.bytes[6] && (*i).remote_ip6.bytes[7]==addr6.bytes[7] &&
18384                                    (*i).remote_ip6.bytes[8]==addr6.bytes[8] && (*i).remote_ip6.bytes[9]==addr6.bytes[9] &&
18385                                    (*i).remote_ip6.bytes[10]==addr6.bytes[10] &&(*i).remote_ip6.bytes[11]==addr6.bytes[11] &&
18386                                    (*i).remote_ip6.bytes[12]==addr6.bytes[12] &&(*i).remote_ip6.bytes[13]==addr6.bytes[13] &&
18387                                    (*i).remote_ip6.bytes[14]==addr6.bytes[14] &&(*i).remote_ip6.bytes[15]==addr6.bytes[15]) {
18388                                         s_dcc_client c;
18389                                         c.server_socket=(*i2).socket;
18390 
18391                                         char tmp[256];
18392                                         inet_ntop(AF_INET6,&addr6,tmp,sizeof(tmp)-1);
18393                                         c.remote=tmp;
18394 
18395                                         c.chat=false;
18396                                         c.send=false;
18397                                         c.telnet=false;
18398                                         c.send_file=*i;
18399                                         c.send_from_filesystem=true;
18400                                         c.socket=s;
18401                                         c.got_passwd=0;
18402                                         c.new_user=0;
18403                                         c.edit_user=0;
18404                                         c.filesystem=0;
18405                                         c.as_in_logic=(*i).user_name_as_in_logic;
18406                                         c.got_user_name=(c.as_in_logic.empty()?false:true);
18407                                         c.resume_pos=(*i).resume_pos;
18408                                         dcc_clients.push_back(c);
18409                                         dcc_check_limit();
18410                                         got=true;
18411                                         dcc_awaiting_send.erase(i);
18412                                         goto l2;
18413                                 }
18414                             }
18415                         }
18416                     }
18417                     if(!got)
18418                         sock_close(s);
18419                 }
18420             }
18421         }
18422     }
18423 
18424     vector<s_telnet_server>::iterator i3;
18425     for(i3=telnet_servers.begin(); i3!=telnet_servers.end(); i3++) {
18426         if((*i3).socket.cmp()) {
18427             s_socket s;
18428             s.clear();
18429             if((*i3).telnet_addr!=-1)
18430                 s=sock_accept((*i3).socket);
18431             else
18432                 s=sock_accept6((*i3).socket);
18433             if(s.cmp()) {
18434                 stats_dcc_chat_new_connection();
18435 
18436                 sock_async(s);
18437 
18438                 int ec=0;
18439                 //in_addr addr=sock_get_remote_addr(s,ec);
18440                 s_dcc_client c;
18441                 c.server_socket=(*i3).socket;
18442 
18443                 {
18444                     int ec=0;
18445                     in_addr addr;
18446 #ifdef _WIN32
18447                     addr.S_un.S_addr=(unsigned long)-1;
18448 #else
18449                     addr.s_addr=(unsigned long)-1;
18450 #endif
18451                     in_addr6_ addr6;
18452                     memset(&addr6,0,sizeof(addr6));
18453                     ec=0;
18454                     if((*i3).telnet_addr!=-1)
18455                         addr=sock_get_remote_addr(s,ec);
18456                     else
18457                         inet_pton(AF_INET6,s.host,&addr6);
18458 
18459                     char tmp[256];
18460 #ifdef _WIN32
18461                     inet_ntop(AF_INET,&(addr.S_un.S_addr),tmp,sizeof(tmp)-1);
18462 #else
18463                     inet_ntop(AF_INET,&(addr.s_addr),tmp,sizeof(tmp)-1);
18464 #endif
18465                     c.remote=tmp;
18466                 }
18467 
18468                 c.chat=true;
18469                 c.send=false;
18470                 c.telnet=true;
18471                 c.send_from_filesystem=false;
18472                 c.socket=s;
18473                 c.got_passwd=0;
18474                 c.new_user=0;
18475                 c.edit_user=0;
18476                 c.filesystem=0;
18477                 c.as_in_logic="";
18478                 c.got_user_name=false;
18479                 c.replication_partner=false;
18480 
18481                 c.lang="en";
18482                 string disp=lang_get_string(1,c.lang,167)+"\r\n"; // always telnet! so \r\n
18483                 size_t sent=sock_send(c.socket,disp.c_str(),disp.length(),ec);
18484                 stats_dcc_chat_bytes_sent(sent);
18485 
18486                 dcc_clients.push_back(c);
18487                 dcc_check_limit();
18488             }
18489         }
18490     }
18491 }

Here is the call graph for this function:

void dcc_loop_edit_chan vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process edit channel definitions commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 14796 of file dcc.cpp.

References dcc_can_unassign(), dcc_get_line(), dcc_send_msg(), lang_get_string(), logic_eval(), logic_partyline_add_channel_def(), logic_partyline_get_channel_def(), logic_partyline_remove_channel_def(), ltoa(), and s_group::name.

Referenced by dcc_loop().

14797 {
14798     if((*i).edit_chan==1) {
14799                 string disp=lang_get_string(1,(*i).lang,232)+eol;
14800                 int ec=0;
14801                 dcc_send_msg((*i).socket,disp,ec);
14802                 vector<string>::iterator i1;
14803                 for(i1=(*i).access_to_chan_defs.begin(); i1!=(*i).access_to_chan_defs.end(); i1++) {
14804                     if(!(*i1).compare("*"))
14805                         continue;
14806                     disp=*i1+eol;
14807                     dcc_send_msg((*i).socket,disp,ec);
14808                 }
14809                 disp=lang_get_string(1,(*i).lang,233)+eol;
14810                 dcc_send_msg((*i).socket,disp,ec);
14811                 (*i).edit_chan++;
14812             }
14813             if((*i).edit_chan==2) {
14814                 string p=dcc_get_line((*i).in_buff);
14815                 if(!p.compare(""))
14816                     return;
14817 
14818                 if(!p.compare(".")) {
14819                     (*i).edit_chan=0;
14820                     return;
14821                 }
14822 
14823                 bool got=false;
14824                 vector<string>::iterator i1;
14825                 for(i1=(*i).access_to_chan_defs.begin(); i1!=(*i).access_to_chan_defs.end(); i1++) {
14826                     if(!p.compare(*i1)) {
14827                         got=logic_partyline_get_channel_def(*i1,(*i).user_channel_def);
14828                         break;
14829                     }
14830                 }
14831 
14832                 if(!got) {
14833                     string disp=lang_get_string(1,(*i).lang,234)+eol;
14834                     int ec=0;
14835                     dcc_send_msg((*i).socket,disp,ec);
14836                     (*i).edit_chan=1;
14837                 } else
14838                     (*i).edit_chan=10;
14839             }
14840 
14841             // on_mode
14842             if((*i).edit_chan==10) {
14843                 string disp;
14844                 int ec=0;
14845 
14846                 disp=lang_get_string(1,(*i).lang,223)+eol; // !!!
14847                 dcc_send_msg((*i).socket,disp,ec);
14848 
14849                 vector<string>::iterator i3;
14850                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
14851                     disp=*i3+eol;
14852                     dcc_send_msg((*i).socket,disp,ec);
14853                 }
14854 
14855                 disp=(string)"----------------"+eol;
14856                 dcc_send_msg((*i).socket,disp,ec);
14857 
14858                 disp=lang_get_string(1,(*i).lang,224)+eol; // !!!
14859                 dcc_send_msg((*i).socket,disp,ec);
14860 
14861                 disp=lang_get_string(1,(*i).lang,225)+eol;
14862                 dcc_send_msg((*i).socket,disp,ec);
14863 
14864                 (*i).edit_chan++;
14865             }
14866             if((*i).edit_chan==11) {
14867                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_mode)) {
14868                     int ec=0;
14869                     string disp=lang_get_string(1,(*i).lang,592)+eol;
14870                     dcc_send_msg((*i).socket,disp,ec);
14871                     (*i).edit_chan++;
14872                     return;
14873                 }
14874 
14875                 string p=dcc_get_line((*i).in_buff);
14876                 if(!p.compare(""))
14877                     return;
14878                 vector<string>::iterator i1;
14879                 bool got=false;
14880                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
14881                     if(!(*i1).compare(p))
14882                         got=true;
14883                 if(!p.compare("..")) {
14884                     got=true;
14885                     string disp=lang_get_string(1,(*i).lang,132)+eol;
14886                     int ec=0;
14887                     dcc_send_msg((*i).socket,disp,ec);
14888                     (*i).user_channel_def.on_mode="";
14889                     (*i).edit_chan++;
14890                 } else
14891                     if(!p.compare(".")) {
14892                         got=true;
14893                         string disp=lang_get_string(1,(*i).lang,57)+eol;
14894                         int ec=0;
14895                         dcc_send_msg((*i).socket,disp,ec);
14896                         (*i).edit_chan++;
14897                     } else {
14898                         string disp;
14899                         if(got)
14900                             disp=lang_get_string(1,(*i).lang,57)+eol;
14901                             else
14902                             disp=lang_get_string(1,(*i).lang,58)+eol;
14903                         int ec=0;
14904                         dcc_send_msg((*i).socket,disp,ec);
14905                         if(got)
14906                             (*i).user_channel_def.on_mode=p;
14907                         else {
14908                             (*i).edit_chan--;
14909                             return;
14910                         }
14911                         (*i).edit_chan++;
14912                     }
14913             }
14914             // on_key
14915             if((*i).edit_chan==12) {
14916                 string disp;
14917                 int ec=0;
14918 
14919                 disp=lang_get_string(1,(*i).lang,240)+eol; // !!!
14920                 dcc_send_msg((*i).socket,disp,ec);
14921 
14922                 vector<string>::iterator i3;
14923                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
14924                     disp=*i3+eol;
14925                     dcc_send_msg((*i).socket,disp,ec);
14926                 }
14927 
14928                 disp=(string)"----------------"+eol;
14929                 dcc_send_msg((*i).socket,disp,ec);
14930 
14931                 disp=lang_get_string(1,(*i).lang,241)+eol; // !!!
14932                 dcc_send_msg((*i).socket,disp,ec);
14933 
14934                 disp=lang_get_string(1,(*i).lang,225)+eol;
14935                 dcc_send_msg((*i).socket,disp,ec);
14936 
14937                 (*i).edit_chan++;
14938             }
14939             if((*i).edit_chan==13) {
14940                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_key)) {
14941                     int ec=0;
14942                     string disp=lang_get_string(1,(*i).lang,592)+eol;
14943                     dcc_send_msg((*i).socket,disp,ec);
14944                     (*i).edit_chan++;
14945                     return;
14946                 }
14947 
14948                 string p=dcc_get_line((*i).in_buff);
14949                 if(!p.compare(""))
14950                     return;
14951                 vector<string>::iterator i1;
14952                 bool got=false;
14953                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
14954                     if(!(*i1).compare(p))
14955                         got=true;
14956                 if(!p.compare("..")) {
14957                     got=true;
14958                     string disp=lang_get_string(1,(*i).lang,132)+eol;
14959                     int ec=0;
14960                     dcc_send_msg((*i).socket,disp,ec);
14961                     (*i).user_channel_def.on_key="";
14962                     (*i).edit_chan++;
14963                 } else
14964                     if(!p.compare(".")) {
14965                         got=true;
14966                         string disp=lang_get_string(1,(*i).lang,57)+eol;
14967                         int ec=0;
14968                         dcc_send_msg((*i).socket,disp,ec);
14969                         (*i).edit_chan++;
14970                     } else {
14971                         string disp;
14972                         if(got)
14973                             disp=lang_get_string(1,(*i).lang,57)+eol;
14974                             else
14975                             disp=lang_get_string(1,(*i).lang,58)+eol;
14976                         int ec=0;
14977                         dcc_send_msg((*i).socket,disp,ec);
14978                         if(got)
14979                             (*i).user_channel_def.on_key=p;
14980                         else {
14981                             (*i).edit_chan--;
14982                             return;
14983                         }
14984                         (*i).edit_chan++;
14985                     }
14986             }
14987             // on_limit
14988             if((*i).edit_chan==14) {
14989                 string disp;
14990                 int ec=0;
14991 
14992                 disp=lang_get_string(1,(*i).lang,242)+eol; // !!!
14993                 dcc_send_msg((*i).socket,disp,ec);
14994 
14995                 vector<string>::iterator i3;
14996                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
14997                     disp=*i3+eol;
14998                     dcc_send_msg((*i).socket,disp,ec);
14999                 }
15000 
15001                 disp=(string)"----------------"+eol;
15002                 dcc_send_msg((*i).socket,disp,ec);
15003 
15004                 disp=lang_get_string(1,(*i).lang,243)+eol; // !!!
15005                 dcc_send_msg((*i).socket,disp,ec);
15006 
15007                 disp=lang_get_string(1,(*i).lang,225)+eol;
15008                 dcc_send_msg((*i).socket,disp,ec);
15009 
15010                 (*i).edit_chan++;
15011             }
15012             if((*i).edit_chan==15) {
15013                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_limit)) {
15014                     int ec=0;
15015                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15016                     dcc_send_msg((*i).socket,disp,ec);
15017                     (*i).edit_chan++;
15018                     return;
15019                 }
15020 
15021                 string p=dcc_get_line((*i).in_buff);
15022                 if(!p.compare(""))
15023                     return;
15024                 vector<string>::iterator i1;
15025                 bool got=false;
15026                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15027                     if(!(*i1).compare(p))
15028                         got=true;
15029                 if(!p.compare("..")) {
15030                     got=true;
15031                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15032                     int ec=0;
15033                     dcc_send_msg((*i).socket,disp,ec);
15034                     (*i).user_channel_def.on_limit="";
15035                     (*i).edit_chan=200;
15036                 } else
15037                     if(!p.compare(".")) {
15038                         got=true;
15039                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15040                         int ec=0;
15041                         dcc_send_msg((*i).socket,disp,ec);
15042                         (*i).edit_chan++;
15043                     } else {
15044                         string disp;
15045                         if(got)
15046                             disp=lang_get_string(1,(*i).lang,57)+eol;
15047                             else
15048                             disp=lang_get_string(1,(*i).lang,58)+eol;
15049                         int ec=0;
15050                         dcc_send_msg((*i).socket,disp,ec);
15051                         if(got)
15052                             (*i).user_channel_def.on_limit=p;
15053                         else {
15054                             (*i).edit_chan--;
15055                             return;
15056                         }
15057                         (*i).edit_chan++;
15058                     }
15059             }
15060             // on_topic
15061             if((*i).edit_chan==16) {
15062                 string disp;
15063                 int ec=0;
15064 
15065                 disp=lang_get_string(1,(*i).lang,244)+eol; // !!!
15066                 dcc_send_msg((*i).socket,disp,ec);
15067 
15068                 vector<string>::iterator i3;
15069                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15070                     disp=*i3+eol;
15071                     dcc_send_msg((*i).socket,disp,ec);
15072                 }
15073 
15074                 disp=(string)"----------------"+eol;
15075                 dcc_send_msg((*i).socket,disp,ec);
15076 
15077                 disp=lang_get_string(1,(*i).lang,245)+eol; // !!!
15078                 dcc_send_msg((*i).socket,disp,ec);
15079 
15080                 disp=lang_get_string(1,(*i).lang,225)+eol;
15081                 dcc_send_msg((*i).socket,disp,ec);
15082 
15083                 (*i).edit_chan++;
15084             }
15085             if((*i).edit_chan==17) {
15086                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_topic)) {
15087                     int ec=0;
15088                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15089                     dcc_send_msg((*i).socket,disp,ec);
15090                     (*i).edit_chan=500;
15091                     return;
15092                 }
15093 
15094                 string p=dcc_get_line((*i).in_buff);
15095                 if(!p.compare(""))
15096                     return;
15097                 vector<string>::iterator i1;
15098                 bool got=false;
15099                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15100                     if(!(*i1).compare(p))
15101                         got=true;
15102                 if(!p.compare("..")) {
15103                     got=true;
15104                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15105                     int ec=0;
15106                     dcc_send_msg((*i).socket,disp,ec);
15107                     (*i).user_channel_def.on_topic="";
15108                     (*i).edit_chan=500;
15109                 } else
15110                     if(!p.compare(".")) {
15111                         got=true;
15112                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15113                         int ec=0;
15114                         dcc_send_msg((*i).socket,disp,ec);
15115                         (*i).edit_chan=500;
15116                     } else {
15117                         string disp;
15118                         if(got)
15119                             disp=lang_get_string(1,(*i).lang,57)+eol;
15120                             else
15121                             disp=lang_get_string(1,(*i).lang,58)+eol;
15122                         int ec=0;
15123                         dcc_send_msg((*i).socket,disp,ec);
15124                         if(got)
15125                             (*i).user_channel_def.on_topic=p;
15126                         else {
15127                             (*i).edit_chan--;
15128                             return;
15129                         }
15130                         (*i).edit_chan=500;
15131                     }
15132             }
15133             
15134             // allow_dynamic
15135             if((*i).edit_chan==20) {
15136                 string disp=lang_get_string(1,(*i).lang,226)+eol;
15137                 int ec=0;
15138                 dcc_send_msg((*i).socket,disp,ec);
15139                 disp="";
15140                 int i2=1;
15141                 vector<s_dynamic_rule>::iterator i1;
15142                 for(i1=(*i).user_channel_def.allow_dynamic.begin(); i1!=(*i).user_channel_def.allow_dynamic.end(); i1++, i2++) {
15143                     char tmp[64];
15144                     ltoa(i2,tmp,10);
15145                     disp+=lang_get_string(1,(*i).lang,593);
15146                     if(i2<10)
15147                         disp+="0";
15148                     if(i2<100)
15149                         disp+="0";
15150                     disp+=(string)tmp+": "+(*i1).group+";"+(*i1).plus_modes+";"+(*i1).minus_modes+eol;
15151                 }
15152                 dcc_send_msg((*i).socket,disp,ec);
15153                 disp=lang_get_string(1,(*i).lang,227)+eol;
15154                 dcc_send_msg((*i).socket,disp,ec);
15155                 (*i).edit_chan++;
15156             }
15157             if((*i).edit_chan==21) {
15158                 string p=dcc_get_line((*i).in_buff);
15159                 if(!p.compare(""))
15160                     return;
15161                 bool got=false;
15162                 if(!p.compare(".")) {
15163                     got=true;
15164                     (*i).edit_chan=600;
15165                     return;
15166                 }
15167                 if(!p.compare(".add")) {
15168                     got=true;
15169                     string disp=lang_get_string(1,(*i).lang,211)+eol;
15170                     int ec=0;
15171                     dcc_send_msg((*i).socket,disp,ec);
15172 
15173                     vector<string>::iterator i1;
15174                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
15175                         disp=(*i1)+eol;
15176                         dcc_send_msg((*i).socket,disp,ec);
15177                     }
15178 
15179                     (*i).user_channel_allow_dynamic.group="";
15180                     (*i).user_channel_allow_dynamic.plus_modes="";
15181                     (*i).user_channel_allow_dynamic.minus_modes="";
15182 
15183                     (*i).edit_chan=22;
15184                 }
15185                 string p1, p2;
15186                 int pos=0;
15187                 for(unsigned int i1=0; i1<p.length(); i1++) {
15188                     if(p[i1]==0x20) {
15189                         pos=1;
15190                         continue;
15191                     }
15192                     if(pos==0)
15193                         p1+=p[i1];
15194                     if(pos==1)
15195                         p2+=p[i1];
15196                 }
15197                 if(!p1.compare(".remove")) {
15198                     got=true;
15199                     int line=atol(p2.c_str());
15200 
15201                     int i2=1;
15202                     vector<s_dynamic_rule>::iterator i1;
15203                     for(i1=(*i).user_channel.allow_dynamic.begin(); i1!=(*i).user_channel.allow_dynamic.end(); i1++, i2++)
15204                         if(i2==line) {
15205                             bool access=false;
15206                             map<string,string> vars;
15207                             vector<string>::iterator i3;
15208                             for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
15209                                 if(!(*i3).compare(logic_eval((*i1).group,vars))) {
15210                                     access=true;
15211                                     break;
15212                                 }
15213                             if(access)
15214                                 (*i).user_channel.allow_dynamic.erase(i1);
15215                             else {
15216                                 string disp=lang_get_string(1,(*i).lang,121)+eol;
15217                                 int ec=0;
15218                                 dcc_send_msg((*i).socket,disp,ec);
15219                             }
15220                             break;
15221                         }
15222                     (*i).edit_chan=20;
15223                 }
15224                 if(!got) {
15225                     string disp=lang_get_string(1,(*i).lang,227)+eol;
15226                     int ec=0;
15227                     dcc_send_msg((*i).socket,disp,ec);
15228 
15229                     (*i).edit_chan=20;
15230                 }
15231             }
15232             if((*i).edit_chan==22) {
15233                 string p=dcc_get_line((*i).in_buff);
15234                 if(!p.compare(""))
15235                     return;
15236 
15237                 vector<string>::iterator i1;
15238                 bool got=false;
15239                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
15240                     if(!(*i1).compare(p))
15241                         got=true;
15242                 string disp;
15243                 if(got)
15244                     disp=lang_get_string(1,(*i).lang,228)+eol;
15245                     else
15246                     disp=lang_get_string(1,(*i).lang,214)+eol;
15247                 int ec=0;
15248                 dcc_send_msg((*i).socket,disp,ec);
15249                 p=(string)"\""+p+"\"";
15250                 if(got)
15251                     (*i).user_channel_allow_dynamic.group=p;
15252 
15253                 (*i).edit_chan++;
15254             }
15255             if((*i).edit_chan==23) {
15256                 string p=dcc_get_line((*i).in_buff);
15257                 if(!p.compare(""))
15258                     return;
15259                 if(!p.compare("."))
15260                     p="";
15261                 p=(string)"\""+p+"\"";
15262                 (*i).user_channel_allow_dynamic.plus_modes=p;
15263 
15264                 string disp;
15265                 int ec=0;
15266 
15267                 disp=lang_get_string(1,(*i).lang,238)+eol; // !!!
15268                 dcc_send_msg((*i).socket,disp,ec);
15269                 (*i).edit_chan++;
15270             }
15271             if((*i).edit_chan==24) {
15272                 string p=dcc_get_line((*i).in_buff);
15273                 if(!p.compare(""))
15274                     return;
15275                 if(!p.compare("."))
15276                     p="";
15277                 p=(string)"\""+p+"\"";
15278                 (*i).user_channel_allow_dynamic.minus_modes=p;
15279 
15280                 (*i).user_channel_def.allow_dynamic.push_back((*i).user_channel_allow_dynamic);
15281 
15282                 (*i).edit_chan=20;
15283             }
15284 
15285             if((*i).edit_chan==50) {
15286                 string disp=lang_get_string(1,(*i).lang,229)+eol;
15287                 int ec=0;
15288                 dcc_send_msg((*i).socket,disp,ec);
15289 
15290                 (*i).edit_chan++;
15291             }
15292             if((*i).edit_chan==51) {
15293                 string p=dcc_get_line((*i).in_buff);
15294                 if(!p.compare(""))
15295                     return;
15296 
15297                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
15298                     string disp=lang_get_string(1,(*i).lang,229)+eol;
15299                     int ec=0;
15300                     dcc_send_msg((*i).socket,disp,ec);
15301                 } else {
15302                     if(!p.compare("n") || !p.compare("N")) {
15303                         (*i).edit_chan=0;
15304                         string disp=lang_get_string(1,(*i).lang,230)+eol;
15305                         int ec=0;
15306                         dcc_send_msg((*i).socket,disp,ec);
15307                     } else {
15308                         logic_partyline_remove_channel_def((*i).user_channel_def.channel_name);
15309                         vector<s_group>::iterator i1;
15310                         for(i1=(*i).user_channel_def.groups.begin(); i1!=(*i).user_channel_def.groups.end(); i1++)
15311                             if((*i1).name.length()>0 && (*i1).name[0]!='\"')
15312                                 (*i1).name=(string)"\""+(*i1).name+"\"";
15313                         (*i).user_channel_def.last_changed=time(NULL);
15314                         logic_partyline_add_channel_def((*i).user_channel_def);
15315 
15316                         string disp=lang_get_string(1,(*i).lang,231)+eol;
15317                         int ec=0;
15318                         dcc_send_msg((*i).socket,disp,ec);
15319                     }
15320                     (*i).edit_chan=0;
15321                 }
15322             }
15323 
15324             if((*i).edit_chan==100) {
15325                 string disp=lang_get_string(1,(*i).lang,236)+eol;
15326                 int ec=0;
15327                 dcc_send_msg((*i).socket,disp,ec);
15328                 (*i).edit_chan++;
15329             }
15330             if((*i).edit_chan==101) {
15331                 string p=dcc_get_line((*i).in_buff);
15332                 if(!p.compare(""))
15333                     return;
15334 
15335                 if(!p.compare(".")) {
15336                     (*i).edit_chan=0;
15337                     return;
15338                 }
15339 
15340                 bool got=logic_partyline_get_channel_def(p,(*i).user_channel_def);
15341 
15342                 if(got) {
15343                     string disp=lang_get_string(1,(*i).lang,237)+eol;
15344                     int ec=0;
15345                     dcc_send_msg((*i).socket,disp,ec);
15346                     (*i).edit_chan=0;
15347                 } else {
15348                     (*i).user_channel_def.channel_name=p;
15349                     (*i).user_channel_def.on_mode="";
15350                     (*i).user_channel_def.on_key="";
15351                     (*i).user_channel_def.on_limit="";
15352                     (*i).user_channel_def.allow_dynamic.clear();
15353                     (*i).user_channel_def.dynamic_plus_modes="";
15354                     (*i).user_channel_def.dynamic_minus_modes="";
15355                     (*i).user_channel_def.groups.clear();
15356 
15357                     (*i).edit_chan=10;
15358                     return;
15359                 }
15360             }
15361 
15362             if((*i).edit_chan==200) {
15363                 string disp=lang_get_string(1,(*i).lang,239)+eol;
15364                 int ec=0;
15365                 dcc_send_msg((*i).socket,disp,ec);
15366                 disp="";
15367                 int i2=1;
15368                 vector<s_group>::iterator i1;
15369                 for(i1=(*i).user_channel_def.groups.begin(); i1!=(*i).user_channel_def.groups.end(); i1++, i2++) {
15370                     char tmp[64];
15371                     ltoa(i2,tmp,10);
15372                     disp+=lang_get_string(1,(*i).lang,593);
15373                     if(i2<10)
15374                         disp+="0";
15375                     if(i2<100)
15376                         disp+="0";
15377                     bool access=false;
15378                     vector<string>::iterator i3;
15379                     map<string,string> vars;
15380                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
15381                         if(!(*i3).compare(logic_eval((*i1).name,vars)) || !(*i3).compare("*")) {
15382                             access=true;
15383                             break;
15384                         }
15385                     }
15386                     char tmp2[128];
15387                     if(access)
15388                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
15389                         else
15390                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
15391                     disp+=(string)tmp+": "+(*i1).name+" = "+tmp2+eol;
15392                 }
15393                 dcc_send_msg((*i).socket,disp,ec);
15394                 disp=lang_get_string(1,(*i).lang,122)+eol;
15395                 dcc_send_msg((*i).socket,disp,ec);
15396                 (*i).edit_chan++;
15397             }
15398             if((*i).edit_chan==201) {
15399                 string p=dcc_get_line((*i).in_buff);
15400                 if(!p.compare(""))
15401                     return;
15402                 bool got=false;
15403                 if(!p.compare(".")) {
15404                     got=true;
15405                     (*i).edit_chan=20;
15406                 }
15407                 if(!p.compare(".add")) {
15408                     got=true;
15409                     string disp=lang_get_string(1,(*i).lang,124)+eol;
15410                     int ec=0;
15411                     dcc_send_msg((*i).socket,disp,ec);
15412 
15413                     disp="";
15414                     vector<string>::iterator i3;
15415                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
15416                         disp+=*i3+eol;
15417                     if((*i).access_grant_groups.begin()==(*i).access_grant_groups.end()) {
15418                         disp=lang_get_string(1,(*i).lang,124)+eol;
15419                         dcc_send_msg((*i).socket,disp,ec);
15420                         (*i).edit_chan=200;
15421                     } else {
15422                         dcc_send_msg((*i).socket,disp,ec);
15423                         disp=lang_get_string(1,(*i).lang,125)+eol;
15424                         dcc_send_msg((*i).socket,disp,ec);
15425                         (*i).edit_chan=202;
15426                     }
15427                 }
15428                 string p1, p2;
15429                 int pos=0;
15430                 for(unsigned int i1=0; i1<p.length(); i1++) {
15431                     if(p[i1]==0x20) {
15432                         pos=1;
15433                         continue;
15434                     }
15435                     if(pos==0)
15436                         p1+=p[i1];
15437                     if(pos==1)
15438                         p2+=p[i1];
15439                 }
15440                 if(!p1.compare(".remove")) {
15441                     got=true;
15442                     int line=atol(p2.c_str());
15443 
15444                     int i2=1;
15445                     map<string,string> vars;
15446                     vector<s_group>::iterator i1;
15447                     bool access=false;
15448                     for(i1=(*i).user_channel_def.groups.begin(); i1!=(*i).user_channel_def.groups.end(); i1++, i2++) {
15449                         vector<string>::iterator i3;
15450                         for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
15451                             if((!(*i3).compare(logic_eval((*i1).name,vars)) || !(*i3).compare("*")) && i2==line) {
15452                                 access=true;
15453                                 (*i).user_channel_def.groups.erase(i1);
15454                                 break;
15455                             }
15456                         }
15457                         if(access)
15458                             break;
15459                     }
15460                     if(!access) {
15461                         string disp=lang_get_string(1,(*i).lang,123)+eol;
15462                         int ec=0;
15463                         dcc_send_msg((*i).socket,disp,ec);
15464                     }
15465                     (*i).edit_chan=200;
15466                 }
15467                 if(!got) {
15468                     string disp=lang_get_string(1,(*i).lang,122)+eol;
15469                     int ec=0;
15470                     dcc_send_msg((*i).socket,disp,ec);
15471                 }
15472             }
15473             if((*i).edit_chan==202) {
15474                 string p=dcc_get_line((*i).in_buff);
15475                 if(!p.compare(""))
15476                     return;
15477                 vector<string>::iterator i3;
15478                 bool access=false;
15479                 for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
15480                     if(!(*i3).compare(p) || !(*i3).compare("*")) {
15481                         access=true;
15482                         break;
15483                     }
15484                 if(p.compare("*"))
15485                     p=(string)"\""+p+"\"";
15486                 if(!access) {
15487                     string disp=lang_get_string(1,(*i).lang,123)+eol;
15488                     int ec=0;
15489                     dcc_send_msg((*i).socket,disp,ec);
15490                 } else {
15491                     s_group g;
15492                     g.name=p;
15493                     (*i).user_channel_def.groups.push_back(g);
15494                 }
15495                 (*i).edit_chan=200;
15496                 return;
15497             }
15498 
15499             // on_ircop
15500             if((*i).edit_chan==500) {
15501                 string disp;
15502                 int ec=0;
15503 
15504                 disp=lang_get_string(1,(*i).lang,447)+eol; // !!!
15505                 dcc_send_msg((*i).socket,disp,ec);
15506 
15507                 vector<string>::iterator i3;
15508                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15509                     disp=*i3+eol;
15510                     dcc_send_msg((*i).socket,disp,ec);
15511                 }
15512 
15513                 disp=(string)"----------------"+eol;
15514                 dcc_send_msg((*i).socket,disp,ec);
15515 
15516                 disp=lang_get_string(1,(*i).lang,448)+eol; // !!!
15517                 dcc_send_msg((*i).socket,disp,ec);
15518 
15519                 disp=lang_get_string(1,(*i).lang,225)+eol;
15520                 dcc_send_msg((*i).socket,disp,ec);
15521 
15522                 (*i).edit_chan++;
15523             }
15524             if((*i).edit_chan==501) {
15525                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_ircop)) {
15526                     int ec=0;
15527                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15528                     dcc_send_msg((*i).socket,disp,ec);
15529                     (*i).edit_chan++;
15530                     return;
15531                 }
15532 
15533                 string p=dcc_get_line((*i).in_buff);
15534                 if(!p.compare(""))
15535                     return;
15536                 vector<string>::iterator i1;
15537                 bool got=false;
15538                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15539                     if(!(*i1).compare(p))
15540                         got=true;
15541                 if(!p.compare("..")) {
15542                     got=true;
15543                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15544                     int ec=0;
15545                     dcc_send_msg((*i).socket,disp,ec);
15546                     (*i).user_channel_def.on_ircop="";
15547                     (*i).edit_chan++;
15548                 } else
15549                     if(!p.compare(".")) {
15550                         got=true;
15551                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15552                         int ec=0;
15553                         dcc_send_msg((*i).socket,disp,ec);
15554                         (*i).edit_chan++;
15555                     } else {
15556                         string disp;
15557                         if(got)
15558                             disp=lang_get_string(1,(*i).lang,57)+eol;
15559                             else
15560                             disp=lang_get_string(1,(*i).lang,58)+eol;
15561                         int ec=0;
15562                         dcc_send_msg((*i).socket,disp,ec);
15563                         if(got)
15564                             (*i).user_channel_def.on_ircop=p;
15565                         else {
15566                             (*i).edit_chan--;
15567                             return;
15568                         }
15569                         (*i).edit_chan++;
15570                     }
15571             }
15572 
15573             // on_privmsg
15574             if((*i).edit_chan==502) {
15575                 string disp;
15576                 int ec=0;
15577 
15578                 disp=lang_get_string(1,(*i).lang,575)+eol; // !!!
15579                 dcc_send_msg((*i).socket,disp,ec);
15580 
15581                 vector<string>::iterator i3;
15582                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15583                     disp=*i3+eol;
15584                     dcc_send_msg((*i).socket,disp,ec);
15585                 }
15586 
15587                 disp=(string)"----------------"+eol;
15588                 dcc_send_msg((*i).socket,disp,ec);
15589 
15590                 disp=lang_get_string(1,(*i).lang,576)+eol; // !!!
15591                 dcc_send_msg((*i).socket,disp,ec);
15592 
15593                 disp=lang_get_string(1,(*i).lang,225)+eol;
15594                 dcc_send_msg((*i).socket,disp,ec);
15595 
15596                 (*i).edit_chan++;
15597             }
15598             if((*i).edit_chan==503) {
15599                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_privmsg)) {
15600                     int ec=0;
15601                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15602                     dcc_send_msg((*i).socket,disp,ec);
15603                     (*i).edit_chan++;
15604                     return;
15605                 }
15606 
15607                 string p=dcc_get_line((*i).in_buff);
15608                 if(!p.compare(""))
15609                     return;
15610                 vector<string>::iterator i1;
15611                 bool got=false;
15612                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15613                     if(!(*i1).compare(p))
15614                         got=true;
15615                 if(!p.compare("..")) {
15616                     got=true;
15617                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15618                     int ec=0;
15619                     dcc_send_msg((*i).socket,disp,ec);
15620                     (*i).user_channel_def.on_privmsg="";
15621                     (*i).edit_chan++;
15622                 } else
15623                     if(!p.compare(".")) {
15624                         got=true;
15625                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15626                         int ec=0;
15627                         dcc_send_msg((*i).socket,disp,ec);
15628                         (*i).edit_chan++;
15629                     } else {
15630                         string disp;
15631                         if(got)
15632                             disp=lang_get_string(1,(*i).lang,57)+eol;
15633                             else
15634                             disp=lang_get_string(1,(*i).lang,58)+eol;
15635                         int ec=0;
15636                         dcc_send_msg((*i).socket,disp,ec);
15637                         if(got)
15638                             (*i).user_channel_def.on_privmsg=p;
15639                         else {
15640                             (*i).edit_chan--;
15641                             return;
15642                         }
15643                         (*i).edit_chan++;
15644                     }
15645             }
15646 
15647             // on_notice
15648             if((*i).edit_chan==504) {
15649                 string disp;
15650                 int ec=0;
15651 
15652                 disp=lang_get_string(1,(*i).lang,603)+eol; // !!!
15653                 dcc_send_msg((*i).socket,disp,ec);
15654 
15655                 vector<string>::iterator i3;
15656                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15657                     disp=*i3+eol;
15658                     dcc_send_msg((*i).socket,disp,ec);
15659                 }
15660 
15661                 disp=(string)"----------------"+eol;
15662                 dcc_send_msg((*i).socket,disp,ec);
15663 
15664                 disp=lang_get_string(1,(*i).lang,604)+eol; // !!!
15665                 dcc_send_msg((*i).socket,disp,ec);
15666 
15667                 disp=lang_get_string(1,(*i).lang,225)+eol;
15668                 dcc_send_msg((*i).socket,disp,ec);
15669 
15670                 (*i).edit_chan++;
15671             }
15672             if((*i).edit_chan==505) {
15673                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_notice)) {
15674                     int ec=0;
15675                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15676                     dcc_send_msg((*i).socket,disp,ec);
15677                     (*i).edit_chan++;
15678                     return;
15679                 }
15680 
15681                 string p=dcc_get_line((*i).in_buff);
15682                 if(!p.compare(""))
15683                     return;
15684                 vector<string>::iterator i1;
15685                 bool got=false;
15686                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15687                     if(!(*i1).compare(p))
15688                         got=true;
15689                 if(!p.compare("..")) {
15690                     got=true;
15691                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15692                     int ec=0;
15693                     dcc_send_msg((*i).socket,disp,ec);
15694                     (*i).user_channel_def.on_notice="";
15695                     (*i).edit_chan++;
15696                 } else
15697                     if(!p.compare(".")) {
15698                         got=true;
15699                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15700                         int ec=0;
15701                         dcc_send_msg((*i).socket,disp,ec);
15702                         (*i).edit_chan++;
15703                     } else {
15704                         string disp;
15705                         if(got)
15706                             disp=lang_get_string(1,(*i).lang,57)+eol;
15707                             else
15708                             disp=lang_get_string(1,(*i).lang,58)+eol;
15709                         int ec=0;
15710                         dcc_send_msg((*i).socket,disp,ec);
15711                         if(got)
15712                             (*i).user_channel_def.on_notice=p;
15713                         else {
15714                             (*i).edit_chan--;
15715                             return;
15716                         }
15717                         (*i).edit_chan++;
15718                     }
15719             }
15720 
15721             // on_part
15722             if((*i).edit_chan==506) {
15723                 string disp;
15724                 int ec=0;
15725 
15726                 disp=lang_get_string(1,(*i).lang,577)+eol; // !!!
15727                 dcc_send_msg((*i).socket,disp,ec);
15728 
15729                 vector<string>::iterator i3;
15730                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15731                     disp=*i3+eol;
15732                     dcc_send_msg((*i).socket,disp,ec);
15733                 }
15734 
15735                 disp=(string)"----------------"+eol;
15736                 dcc_send_msg((*i).socket,disp,ec);
15737 
15738                 disp=lang_get_string(1,(*i).lang,578)+eol; // !!!
15739                 dcc_send_msg((*i).socket,disp,ec);
15740 
15741                 disp=lang_get_string(1,(*i).lang,225)+eol;
15742                 dcc_send_msg((*i).socket,disp,ec);
15743 
15744                 (*i).edit_chan++;
15745             }
15746             if((*i).edit_chan==507) {
15747                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_part)) {
15748                     int ec=0;
15749                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15750                     dcc_send_msg((*i).socket,disp,ec);
15751                     (*i).edit_chan++;
15752                     return;
15753                 }
15754 
15755                 string p=dcc_get_line((*i).in_buff);
15756                 if(!p.compare(""))
15757                     return;
15758                 vector<string>::iterator i1;
15759                 bool got=false;
15760                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15761                     if(!(*i1).compare(p))
15762                         got=true;
15763                 if(!p.compare("..")) {
15764                     got=true;
15765                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15766                     int ec=0;
15767                     dcc_send_msg((*i).socket,disp,ec);
15768                     (*i).user_channel_def.on_part="";
15769                     (*i).edit_chan++;
15770                 } else
15771                     if(!p.compare(".")) {
15772                         got=true;
15773                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15774                         int ec=0;
15775                         dcc_send_msg((*i).socket,disp,ec);
15776                         (*i).edit_chan++;
15777                     } else {
15778                         string disp;
15779                         if(got)
15780                             disp=lang_get_string(1,(*i).lang,57)+eol;
15781                             else
15782                             disp=lang_get_string(1,(*i).lang,58)+eol;
15783                         int ec=0;
15784                         dcc_send_msg((*i).socket,disp,ec);
15785                         if(got)
15786                             (*i).user_channel_def.on_part=p;
15787                         else {
15788                             (*i).edit_chan--;
15789                             return;
15790                         }
15791                         (*i).edit_chan++;
15792                     }
15793             }
15794 
15795             // on_ctcp
15796             if((*i).edit_chan==508) {
15797                 string disp;
15798                 int ec=0;
15799 
15800                 disp=lang_get_string(1,(*i).lang,608)+eol; // !!!
15801                 dcc_send_msg((*i).socket,disp,ec);
15802 
15803                 vector<string>::iterator i3;
15804                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15805                     disp=*i3+eol;
15806                     dcc_send_msg((*i).socket,disp,ec);
15807                 }
15808 
15809                 disp=(string)"----------------"+eol;
15810                 dcc_send_msg((*i).socket,disp,ec);
15811 
15812                 disp=lang_get_string(1,(*i).lang,609)+eol; // !!!
15813                 dcc_send_msg((*i).socket,disp,ec);
15814 
15815                 disp=lang_get_string(1,(*i).lang,225)+eol;
15816                 dcc_send_msg((*i).socket,disp,ec);
15817 
15818                 (*i).edit_chan++;
15819             }
15820             if((*i).edit_chan==509) {
15821                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_ctcp)) {
15822                     int ec=0;
15823                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15824                     dcc_send_msg((*i).socket,disp,ec);
15825                     (*i).edit_chan++;
15826                     return;
15827                 }
15828 
15829                 string p=dcc_get_line((*i).in_buff);
15830                 if(!p.compare(""))
15831                     return;
15832                 vector<string>::iterator i1;
15833                 bool got=false;
15834                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15835                     if(!(*i1).compare(p))
15836                         got=true;
15837                 if(!p.compare("..")) {
15838                     got=true;
15839                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15840                     int ec=0;
15841                     dcc_send_msg((*i).socket,disp,ec);
15842                     (*i).user_channel_def.on_ctcp="";
15843                     (*i).edit_chan++;
15844                 } else
15845                     if(!p.compare(".")) {
15846                         got=true;
15847                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15848                         int ec=0;
15849                         dcc_send_msg((*i).socket,disp,ec);
15850                         (*i).edit_chan++;
15851                     } else {
15852                         string disp;
15853                         if(got)
15854                             disp=lang_get_string(1,(*i).lang,57)+eol;
15855                             else
15856                             disp=lang_get_string(1,(*i).lang,58)+eol;
15857                         int ec=0;
15858                         dcc_send_msg((*i).socket,disp,ec);
15859                         if(got)
15860                             (*i).user_channel_def.on_ctcp=p;
15861                         else {
15862                             (*i).edit_chan--;
15863                             return;
15864                         }
15865                         (*i).edit_chan++;
15866                     }
15867             }
15868 
15869             // on_dynamic_ban
15870             if((*i).edit_chan==510) {
15871                 string disp;
15872                 int ec=0;
15873 
15874                 disp=lang_get_string(1,(*i).lang,675)+eol; // !!!
15875                 dcc_send_msg((*i).socket,disp,ec);
15876 
15877                 vector<string>::iterator i3;
15878                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15879                     disp=*i3+eol;
15880                     dcc_send_msg((*i).socket,disp,ec);
15881                 }
15882 
15883                 disp=(string)"----------------"+eol;
15884                 dcc_send_msg((*i).socket,disp,ec);
15885 
15886                 disp=lang_get_string(1,(*i).lang,676)+eol; // !!!
15887                 dcc_send_msg((*i).socket,disp,ec);
15888 
15889                 disp=lang_get_string(1,(*i).lang,225)+eol;
15890                 dcc_send_msg((*i).socket,disp,ec);
15891 
15892                 (*i).edit_chan++;
15893             }
15894             if((*i).edit_chan==511) {
15895                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_dynamic_ban)) {
15896                     int ec=0;
15897                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15898                     dcc_send_msg((*i).socket,disp,ec);
15899                     (*i).edit_chan++;
15900                     return;
15901                 }
15902 
15903                 string p=dcc_get_line((*i).in_buff);
15904                 if(!p.compare(""))
15905                     return;
15906                 vector<string>::iterator i1;
15907                 bool got=false;
15908                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15909                     if(!(*i1).compare(p))
15910                         got=true;
15911                 if(!p.compare("..")) {
15912                     got=true;
15913                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15914                     int ec=0;
15915                     dcc_send_msg((*i).socket,disp,ec);
15916                     (*i).user_channel_def.on_dynamic_ban="";
15917                     (*i).edit_chan++;
15918                 } else
15919                     if(!p.compare(".")) {
15920                         got=true;
15921                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15922                         int ec=0;
15923                         dcc_send_msg((*i).socket,disp,ec);
15924                         (*i).edit_chan++;
15925                     } else {
15926                         string disp;
15927                         if(got)
15928                             disp=lang_get_string(1,(*i).lang,57)+eol;
15929                             else
15930                             disp=lang_get_string(1,(*i).lang,58)+eol;
15931                         int ec=0;
15932                         dcc_send_msg((*i).socket,disp,ec);
15933                         if(got)
15934                             (*i).user_channel_def.on_dynamic_ban=p;
15935                         else {
15936                             (*i).edit_chan--;
15937                             return;
15938                         }
15939                         (*i).edit_chan++;
15940                     }
15941             }
15942 
15943             // on_server_msg
15944             if((*i).edit_chan==512) {
15945                 string disp;
15946                 int ec=0;
15947 
15948                 disp=lang_get_string(1,(*i).lang,677)+eol; // !!!
15949                 dcc_send_msg((*i).socket,disp,ec);
15950 
15951                 vector<string>::iterator i3;
15952                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
15953                     disp=*i3+eol;
15954                     dcc_send_msg((*i).socket,disp,ec);
15955                 }
15956 
15957                 disp=(string)"----------------"+eol;
15958                 dcc_send_msg((*i).socket,disp,ec);
15959 
15960                 disp=lang_get_string(1,(*i).lang,678)+eol; // !!!
15961                 dcc_send_msg((*i).socket,disp,ec);
15962 
15963                 disp=lang_get_string(1,(*i).lang,225)+eol;
15964                 dcc_send_msg((*i).socket,disp,ec);
15965 
15966                 (*i).edit_chan++;
15967             }
15968             if((*i).edit_chan==513) {
15969                 if(!dcc_can_unassign(i,eol,(*i).user_channel_def.on_server_msg)) {
15970                     int ec=0;
15971                     string disp=lang_get_string(1,(*i).lang,592)+eol;
15972                     dcc_send_msg((*i).socket,disp,ec);
15973                     (*i).edit_chan++;
15974                     return;
15975                 }
15976 
15977                 string p=dcc_get_line((*i).in_buff);
15978                 if(!p.compare(""))
15979                     return;
15980                 vector<string>::iterator i1;
15981                 bool got=false;
15982                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
15983                     if(!(*i1).compare(p))
15984                         got=true;
15985                 if(!p.compare("..")) {
15986                     got=true;
15987                     string disp=lang_get_string(1,(*i).lang,132)+eol;
15988                     int ec=0;
15989                     dcc_send_msg((*i).socket,disp,ec);
15990                     (*i).user_channel_def.on_server_msg="";
15991                     (*i).edit_chan++;
15992                 } else
15993                     if(!p.compare(".")) {
15994                         got=true;
15995                         string disp=lang_get_string(1,(*i).lang,57)+eol;
15996                         int ec=0;
15997                         dcc_send_msg((*i).socket,disp,ec);
15998                         (*i).edit_chan++;
15999                     } else {
16000                         string disp;
16001                         if(got)
16002                             disp=lang_get_string(1,(*i).lang,57)+eol;
16003                             else
16004                             disp=lang_get_string(1,(*i).lang,58)+eol;
16005                         int ec=0;
16006                         dcc_send_msg((*i).socket,disp,ec);
16007                         if(got)
16008                             (*i).user_channel_def.on_server_msg=p;
16009                         else {
16010                             (*i).edit_chan--;
16011                             return;
16012                         }
16013                         (*i).edit_chan++;
16014                     }
16015             }
16016 
16017             if((*i).edit_chan==514) {
16018                 (*i).edit_chan=200;
16019                 return;
16020             }
16021 
16022             // dynamic bans editors
16023             if((*i).edit_chan==600) {
16024                 string disp=lang_get_string(1,(*i).lang,587)+eol;
16025                 int ec=0;
16026                 dcc_send_msg((*i).socket,disp,ec);
16027                 disp="";
16028                 int i2=1;
16029                 vector<string>::iterator i1;
16030                 for(i1=(*i).user_channel_def.dynbans_editors.begin(); i1!=(*i).user_channel_def.dynbans_editors.end(); i1++, i2++) {
16031                     char tmp[64];
16032                     ltoa(i2,tmp,10);
16033                     disp+=lang_get_string(1,(*i).lang,593);
16034                     if(i2<10)
16035                         disp+="0";
16036                     if(i2<100)
16037                         disp+="0";
16038                     disp+=(string)tmp+": "+(*i1);
16039                     disp+=" (";
16040                     vector<string>::iterator i3;
16041                     bool access=false;
16042                     map<string,string> vars;
16043                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
16044                         if(!(*i3).compare(logic_eval(*i1,vars))) {
16045                             access=true;
16046                             break;
16047                         }
16048                     disp+=access?lang_get_string(1,(*i).lang,120):lang_get_string(1,(*i).lang,121);
16049                     disp+=")";
16050                     disp+=eol;
16051                 }
16052                 dcc_send_msg((*i).socket,disp,ec);
16053                 disp=lang_get_string(1,(*i).lang,588)+eol;
16054                 dcc_send_msg((*i).socket,disp,ec);
16055                 (*i).edit_chan++;
16056                 return;
16057             }
16058             if((*i).edit_chan==601) {
16059                 string p=dcc_get_line((*i).in_buff);
16060                 if(!p.compare(""))
16061                     return;
16062                 bool got=false;
16063                 if(!p.compare(".")) {
16064                     got=true;
16065                     (*i).edit_chan=50;
16066                 }
16067                 if(!p.compare(".add")) {
16068                     got=true;
16069                     string disp=lang_get_string(1,(*i).lang,211)+eol;
16070                     int ec=0;
16071                     dcc_send_msg((*i).socket,disp,ec);
16072 
16073                     vector<string>::iterator i1;
16074                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
16075                         disp=(*i1)+eol;
16076                         dcc_send_msg((*i).socket,disp,ec);
16077                     }
16078 
16079                     (*i).edit_chan=602;
16080                     return;
16081                 }
16082                 string p1, p2;
16083                 int pos=0;
16084                 for(unsigned int i1=0; i1<p.length(); i1++) {
16085                     if(p[i1]==0x20) {
16086                         pos=1;
16087                         continue;
16088                     }
16089                     if(pos==0)
16090                         p1+=p[i1];
16091                     if(pos==1)
16092                         p2+=p[i1];
16093                 }
16094                 if(!p1.compare(".remove")) {
16095                     got=true;
16096                     int line=atol(p2.c_str());
16097 
16098                     int i2=1;
16099                     vector<string>::iterator i1;
16100                     for(i1=(*i).user_channel_def.dynbans_editors.begin(); i1!=(*i).user_channel_def.dynbans_editors.end(); i1++, i2++)
16101                         if(i2==line) {
16102                             bool access=false;
16103                             map<string,string> vars;
16104                             vector<string>::iterator i3;
16105                             for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
16106                                 if(!(*i3).compare(logic_eval(*i1,vars))) {
16107                                     access=true;
16108                                     break;
16109                                 }
16110                             if(access)
16111                                 (*i).user_channel_def.dynbans_editors.erase(i1);
16112                             else {
16113                                 string disp=lang_get_string(1,(*i).lang,121)+eol;
16114                                 int ec=0;
16115                                 dcc_send_msg((*i).socket,disp,ec);
16116                             }
16117                             break;
16118                         }
16119                     (*i).edit_chan=600;
16120                 }
16121                 if(!got) {
16122                     string disp=lang_get_string(1,(*i).lang,588)+eol;
16123                     int ec=0;
16124                     dcc_send_msg((*i).socket,disp,ec);
16125                     (*i).edit_chan=600;
16126                 }
16127             }
16128             if((*i).edit_chan==602) {
16129                 string p=dcc_get_line((*i).in_buff);
16130                 if(!p.compare(""))
16131                     return;
16132 
16133                 vector<string>::iterator i1;
16134                 bool got=false;
16135                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
16136                     if(!(*i1).compare(p))
16137                         got=true;
16138                 string disp;
16139                 if(got)
16140                     disp=lang_get_string(1,(*i).lang,228)+eol;
16141                     else
16142                     disp=lang_get_string(1,(*i).lang,214)+eol;
16143                 int ec=0;
16144                 dcc_send_msg((*i).socket,disp,ec);
16145                 p=(string)"\""+p+"\"";
16146                 if(got)
16147                     (*i).user_channel_def.dynbans_editors.push_back(p);
16148 
16149                 (*i).edit_chan=600;
16150             }
16151 }

Here is the call graph for this function:

void dcc_loop_edit_dynbans vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process edit channel's dynamic bans in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 14633 of file dcc.cpp.

References cmp_strings_case_insensitive(), dcc_get_line(), dcc_send_msg(), s_channel_def::dynamic_bans, s_channel_def::dynbans_editors, lang_get_string(), logic_eval(), logic_partyline_get_channel_def(), r_channel_defs, and r_users.

Referenced by dcc_loop().

14634 {
14635     int ec=0;
14636 
14637     map<string,string> vars;
14638     if((*i).dynbans==1) {
14639         s_channel_def chd;
14640         bool got=logic_partyline_get_channel_def((*i).dynbans_channel,chd);
14641         bool access=false;
14642         if(got) {
14643             vector<string>::iterator i1;
14644             for(i1=chd.dynbans_editors.begin(); i1!=chd.dynbans_editors.end(); i1++) {
14645                 vector<s_user>::iterator i2;
14646                 for(i2=r_users.begin(); i2!=r_users.end(); i2++) {
14647                     if(!(*i2).name.compare((*i).as_in_logic)) {
14648                         vector<s_group>::iterator i3;
14649                         for(i3=(*i2).groups.begin(); i3!=(*i2).groups.end(); i3++) {
14650                             if(!logic_eval(*i1,vars).compare(logic_eval((*i3).name,vars))) {
14651                                 access=true;
14652                                 break;
14653                             }
14654                         }
14655                     }
14656                     if(access)
14657                         break;
14658                 }
14659                 if(access)
14660                     break;
14661             }
14662         }
14663         if(!got || !access) {
14664             (*i).dynbans=0;
14665             string disp=lang_get_string(1,(*i).lang,581)+eol;
14666             int ec=0;
14667             dcc_send_msg((*i).socket,disp,ec);
14668             return;
14669         }
14670 
14671         (*i).dynbans++;
14672         return;
14673     }
14674 
14675     if((*i).dynbans==2) {
14676         s_channel_def chd;
14677         bool got=logic_partyline_get_channel_def((*i).dynbans_channel,chd);
14678         if(!got) {
14679             // huh?!
14680             (*i).dynbans=0;
14681             return;
14682         }
14683 
14684         string disp=lang_get_string(1,(*i).lang,582)+eol;
14685         map<string,string>::iterator i1;
14686         for(i1=chd.dynamic_bans.begin(); i1!=chd.dynamic_bans.end(); i1++) {
14687             disp+=lang_get_string(1,(*i).lang,583);
14688             disp+=" ";
14689             disp+=(*i1).first;
14690             disp+=" ";
14691             disp+=lang_get_string(1,(*i).lang,584);
14692             disp+=(*i1).second;
14693             disp+=eol;
14694         }
14695         disp+=lang_get_string(1,(*i).lang,585);
14696         dcc_send_msg((*i).socket,disp,ec);
14697         (*i).dynbans++;
14698         return;
14699     }
14700 
14701     if((*i).dynbans==3) {
14702         string p=dcc_get_line((*i).in_buff);
14703         if(!p.compare(""))
14704             return;
14705 
14706         bool got=false;
14707 
14708         vector<s_channel_def>::iterator iii;
14709         for(iii=r_channel_defs.begin(); iii!=r_channel_defs.end(); iii++) {
14710             if(!cmp_strings_case_insensitive((*iii).channel_name,(*i).dynbans_channel)) {
14711                 got=true;
14712                 break;
14713             }
14714         }
14715 
14716         if(!got) {
14717             // huh?!
14718             (*i).dynbans=0;
14719             return;
14720         }
14721 
14722         if(p.length()>=3 && p[0]=='.' && p[1]=='-' && p[2]==0x20) {
14723             string mask=p;
14724             if(mask.find(" ",0)!=string::npos)
14725                 mask.erase(0,mask.find(" ",0)+1);
14726 
14727             mask=(string)"\""+mask+"\"";
14728 
14729             map<string,string>::iterator i1;
14730         erase_again:
14731             for(i1=(*iii).dynamic_bans.begin(); i1!=(*iii).dynamic_bans.end(); i1++) {
14732                 if(!(*i1).first.compare(mask)) {
14733                     (*iii).dynamic_bans.erase(i1);
14734                     goto erase_again;
14735                 }
14736             }
14737 
14738             (*i).dynbans=2;
14739             return;
14740         }
14741 
14742         if(p.length()>=3 && p[0]=='.' && p[1]=='+' && p[2]==0x20) {
14743             string mask=p;
14744             if(mask.find(" ",0)!=string::npos)
14745                 mask.erase(0,mask.find(" ",0)+1);
14746 
14747             if(mask.find(" ",0)==string::npos)
14748                 mask+=" ";
14749 
14750             string reason=mask;
14751             if(mask.find(" ",0)!=string::npos)
14752                 mask.erase(mask.find(" ",0),mask.length()-mask.find(" ",0));
14753             if(reason.find(" ",0)!=string::npos)
14754                 reason.erase(0,reason.find(" ",0)+1);
14755 
14756             mask=(string)"\""+mask+"\"";
14757 
14758             map<string,string>::iterator i1;
14759         erase_ban_again:
14760             for(i1=(*iii).dynamic_bans.begin(); i1!=(*iii).dynamic_bans.end(); i1++) {
14761                 if(!(*i1).first.compare(mask)) {
14762                     (*iii).dynamic_bans.erase(i1);
14763                     goto erase_ban_again;
14764                 }
14765             }
14766 
14767             pair<string,string> p;
14768             p.first=mask;
14769             p.second=(string)"\""+reason+"\"";
14770             (*iii).dynamic_bans.insert(p);
14771 
14772             (*i).dynbans=2;
14773             return;
14774         }
14775 
14776         if(!p.compare(".")) {
14777             string disp=lang_get_string(1,(*i).lang,586)+eol;
14778             dcc_send_msg((*i).socket,disp,ec);
14779             (*i).dynbans=0;
14780             return;
14781         }
14782 
14783         (*i).dynbans=2;
14784         return;
14785     }
14786 }

Here is the call graph for this function:

void dcc_loop_edit_proc vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process new / edit procedure commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 14120 of file dcc.cpp.

References dcc_get_line(), dcc_send_msg(), lang_get_string(), lang_subst(), logic_eval(), logic_list_proc(), logic_parse_proc(), ltoa(), and r_procedures.

Referenced by dcc_loop().

14121 {
14122     if((*i).edit_proc==1) {
14123                 (*i).edit_proc_addbefore_line=-1;
14124                 (*i).edit_proc_addafter_line=-1;
14125                 (*i).proc_error="";
14126                 (*i).proc_to_delete="";
14127                 (*i).plus_proc=false;
14128 
14129                 string p=dcc_get_line((*i).in_buff);
14130                 if(!p.compare(""))
14131                     return;
14132                 vector<string>::iterator i1;
14133                 bool got=false;
14134                 for(i1=(*i).access_to_procs.begin(); i1!=(*i).access_to_procs.end(); i1++)
14135                     if(!(*i1).compare(p))
14136                         got=true;
14137                 if(!got) {
14138                     string disp=lang_get_string(1,(*i).lang,137)+eol;
14139                     int ec=0;
14140                     dcc_send_msg((*i).socket,disp,ec);
14141                     return;
14142                 }
14143                 (*i).proc_name=p;
14144                 logic_list_proc((*i).proc_name,(*i).proc_commands,(*i).proc_decl,(*i).proc_groups);
14145                 vector<string>::iterator i3;
14146                 map<string,string> vars;
14147                 for(i3=(*i).proc_groups.begin(); i3!=(*i).proc_groups.end(); i3++)
14148                     *i3=logic_eval(*i3,vars);
14149                 list<string>::iterator i2=(*i).proc_commands.end();
14150                 i2--;
14151                 if(i2!=(*i).proc_commands.begin())
14152                     (*i).proc_commands.erase(i2); // erase trailing "}"
14153                 (*i).edit_proc++;
14154             }
14155             if((*i).edit_proc==2) {
14156                 string disp=lang_get_string(1,(*i).lang,138)+eol;
14157                 disp=lang_subst(disp,(*i).proc_name);
14158                 int ec=0;
14159                 dcc_send_msg((*i).socket,disp,ec);
14160                 disp="";
14161                 int i2=1;
14162                 list<string>::iterator i1;
14163                 for(i1=(*i).proc_commands.begin(); i1!=(*i).proc_commands.end(); i1++, i2++) {
14164                     char tmp[64];
14165                     ltoa(i2,tmp,10);
14166                     disp+=lang_get_string(1,(*i).lang,593);
14167                     if(i2<10)
14168                         disp+="0";
14169                     if(i2<100)
14170                         disp+="0";
14171                     disp+=(string)tmp+": "+*i1+eol;
14172                 }
14173                 dcc_send_msg((*i).socket,disp,ec);
14174                 disp=lang_get_string(1,(*i).lang,139)+eol;
14175                 dcc_send_msg((*i).socket,disp,ec);
14176                 if((*i).proc_error.compare("")) {
14177                     disp=(*i).proc_error;
14178                     (*i).proc_error="";
14179                     dcc_send_msg((*i).socket,disp,ec);
14180                 }
14181                 (*i).edit_proc++;
14182             }
14183             if((*i).edit_proc==3) {
14184                 string p=dcc_get_line((*i).in_buff);
14185                 if(!p.compare(""))
14186                     return;
14187                 bool got=false;
14188                 if(!p.compare(".")) {
14189                     got=true;
14190                     (*i).edit_proc=6;
14191                     return;
14192                 }
14193 
14194                 string p1, p2;
14195                 int pos=0;
14196                 for(unsigned int i1=0; i1<p.length(); i1++) {
14197                     if(p[i1]==0x20) {
14198                         pos=1;
14199                         continue;
14200                     }
14201                     if(pos==0)
14202                         p1+=p[i1];
14203                     if(pos==1)
14204                         p2+=p[i1];
14205                 }
14206 
14207                 if(!p1.compare(".addbefore")) {
14208                     got=true;
14209                     int line=atol(p2.c_str());
14210                     (*i).edit_proc_addbefore_line=line;
14211 
14212                     string disp=lang_get_string(1,(*i).lang,140)+eol;
14213                     char tmp[64];
14214                     ltoa(line,tmp,10);
14215                     disp=lang_subst(disp,tmp);
14216                     int ec=0;
14217                     dcc_send_msg((*i).socket,disp,ec);
14218 
14219                     (*i).edit_proc++;
14220                 }
14221                 if(!p1.compare(".addafter")) {
14222                     got=true;
14223                     int line=atol(p2.c_str());
14224                     (*i).edit_proc_addafter_line=line;
14225 
14226                     string disp=lang_get_string(1,(*i).lang,141)+eol;
14227                     char tmp[64];
14228                     ltoa(line,tmp,10);
14229                     disp=lang_subst(disp,tmp);
14230                     int ec=0;
14231                     dcc_send_msg((*i).socket,disp,ec);
14232 
14233                     (*i).edit_proc++;
14234                 }
14235                 if(!p1.compare(".remove")) {
14236                     got=true;
14237                     int line=atol(p2.c_str());
14238 
14239                     int i2=1;
14240                     list<string>::iterator i1;
14241                     for(i1=(*i).proc_commands.begin(); i1!=(*i).proc_commands.end(); i1++, i2++) {
14242                         if(i2==line) {
14243                             (*i).proc_commands.erase(i1);
14244                             break;
14245                         }
14246                     }
14247                     (*i).edit_proc=2;
14248                 }
14249                 if(!p1.compare(".replace")) {
14250                     got=true;
14251                     int line=atol(p2.c_str());
14252                     (*i).edit_proc_replace_line=line;
14253 
14254                     string disp=lang_get_string(1,(*i).lang,141)+eol;
14255                     char tmp[64];
14256                     ltoa(line,tmp,10);
14257                     disp=lang_subst(disp,tmp);
14258                     int ec=0;
14259                     dcc_send_msg((*i).socket,disp,ec);
14260 
14261                     (*i).edit_proc=5;
14262                 }
14263                 if(!p.compare(".groups")) {
14264                     got=true;
14265 
14266                     (*i).edit_proc=7;
14267                 }
14268                 if(!got) {
14269                     string disp=lang_get_string(1,(*i).lang,139)+eol;
14270                     int ec=0;
14271                     dcc_send_msg((*i).socket,disp,ec);
14272                 }
14273             }
14274             if((*i).edit_proc==4) {
14275                 string p=dcc_get_line((*i).in_buff);
14276                 if(!p.compare(""))
14277                     return;
14278                 bool before=(*i).edit_proc_addbefore_line!=-1;
14279                 int line;
14280                 if(before)
14281                     line=(*i).edit_proc_addbefore_line;
14282                     else
14283                     line=(*i).edit_proc_addafter_line;
14284                 int i2=1;
14285                 list<string>::iterator i1;
14286                 bool got=false;
14287                 for(i1=(*i).proc_commands.begin(); i1!=(*i).proc_commands.end(); i1++, i2++) {
14288                     if(before && i2==line) {
14289                         (*i).proc_commands.insert(i1,p);
14290                         got=true;
14291                         break;
14292                     }
14293                     if(!before && i2==line+1) {
14294                         (*i).proc_commands.insert(i1,p);
14295                         got=true;
14296                         break;
14297                     }
14298                 }
14299                 if(!got)
14300                     (*i).proc_commands.push_back(p);
14301                 (*i).edit_proc=2;
14302             }
14303             if((*i).edit_proc==5) {
14304                 string p=dcc_get_line((*i).in_buff);
14305                 if(!p.compare(""))
14306                     return;
14307                 int line=(*i).edit_proc_replace_line;
14308                 int i2=1;
14309                 list<string>::iterator i1;
14310                 for(i1=(*i).proc_commands.begin(); i1!=(*i).proc_commands.end(); i1++, i2++) {
14311                     if(i2==line) {
14312                         *i1=p;
14313                         break;
14314                     }
14315                 }
14316                 (*i).edit_proc=2;
14317             }
14318             if((*i).edit_proc==6) {
14319                 string disp=lang_get_string(1,(*i).lang,142)+eol;
14320                 disp=lang_subst(disp,(*i).proc_name);
14321                 int ec=0;
14322                 dcc_send_msg((*i).socket,disp,ec);
14323 
14324                 int error_line;
14325                 const char* error_reason=NULL;
14326                 logic_parse_proc(error_reason,error_line,(*i).proc_commands,false,(*i).proc_decl,(*i).proc_groups);
14327 
14328                 if(error_line!=0) {
14329                     disp=lang_get_string(1,(*i).lang,143)+eol;
14330                     char tmp[64];
14331                     ltoa(error_line,tmp,10);
14332                     disp=lang_subst(disp,tmp);
14333                     if(error_reason!=NULL) {
14334                         string d=lang_get_string(1,(*i).lang,144)+eol;
14335                         disp+=lang_subst(d,error_reason);
14336                     }
14337                     (*i).proc_error=disp;
14338                     (*i).edit_proc=2;
14339                 } else {
14340                     {
14341                         // for .+proc
14342                         if(!(*i).proc_to_delete.empty()) {
14343                             vector<s_procedure>::iterator i1;
14344                             for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
14345                                 if(!(*i1).name.compare((*i).proc_to_delete)) {
14346                                     r_procedures.erase(i1);
14347                                     break;
14348                                 }
14349                         }
14350                     }
14351 
14352                     /*if(!(*i).plus_proc)
14353                         (*i).proc_commands.push_back("}"); // add removed bracket*/
14354                     time_t now;
14355                     time(&now);
14356                     char tmp[128];
14357                     ltoa((long)now,tmp,10);
14358                     (*i).proc_commands.push_front((string)"last_changed "+tmp);
14359                     {
14360                         vector<string>::iterator i1;
14361                         for(i1=(*i).proc_groups.begin(); i1!=(*i).proc_groups.end(); i1++)
14362                             (*i1)=(string)"\""+(*i1)+"\"";
14363                     }
14364                     logic_parse_proc(error_reason,error_line,(*i).proc_commands,true,(*i).proc_decl,(*i).proc_groups);
14365                     disp=lang_get_string(1,(*i).lang,73)+eol;
14366                     dcc_send_msg((*i).socket,disp,ec);
14367                     (*i).edit_proc=0;
14368                 }
14369             }
14370             // groups
14371             if((*i).edit_proc==7) {
14372                 string disp=lang_get_string(1,(*i).lang,119)+eol;
14373                 int ec=0;
14374                 dcc_send_msg((*i).socket,disp,ec);
14375                 disp="";
14376                 int i2=1;
14377                 vector<string>::iterator i1;
14378                 for(i1=(*i).proc_groups.begin(); i1!=(*i).proc_groups.end(); i1++, i2++) {
14379                     char tmp[64];
14380                     ltoa(i2,tmp,10);
14381                     disp+=lang_get_string(1,(*i).lang,593);
14382                     if(i2<10)
14383                         disp+="0";
14384                     if(i2<100)
14385                         disp+="0";
14386                     bool access=false;
14387                     vector<string>::iterator i3;
14388                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
14389                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
14390                             access=true;
14391                             break;
14392                         }
14393                     }
14394                     char tmp2[128];
14395                     if(access)
14396                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
14397                         else
14398                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
14399                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
14400                 }
14401                 dcc_send_msg((*i).socket,disp,ec);
14402                 disp=lang_get_string(1,(*i).lang,122)+eol;
14403                 dcc_send_msg((*i).socket,disp,ec);
14404                 (*i).edit_proc++;
14405             }
14406             if((*i).edit_proc==8) {
14407                 string p=dcc_get_line((*i).in_buff);
14408                 if(!p.compare(""))
14409                     return;
14410                 bool got=false;
14411                 if(!p.compare(".")) {
14412                     got=true;
14413                     (*i).edit_proc=2;
14414                     return;
14415                 }
14416                 if(!p.compare(".add")) {
14417                     got=true;
14418                     string disp=lang_get_string(1,(*i).lang,124)+eol;
14419                     int ec=0;
14420                     dcc_send_msg((*i).socket,disp,ec);
14421 
14422                     disp="";
14423                     vector<string>::iterator i3;
14424                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
14425                         disp+=*i3+eol;
14426                     if((*i).access_grant_groups.begin()==(*i).access_grant_groups.end()) {
14427                         disp=lang_get_string(1,(*i).lang,124)+eol;
14428                         dcc_send_msg((*i).socket,disp,ec);
14429                         (*i).edit_proc=2;
14430                     } else {
14431                         dcc_send_msg((*i).socket,disp,ec);
14432                         disp=lang_get_string(1,(*i).lang,125)+eol;
14433                         dcc_send_msg((*i).socket,disp,ec);
14434                         (*i).edit_proc=9;
14435                     }
14436                 }
14437                 string p1, p2;
14438                 int pos=0;
14439                 for(unsigned int i1=0; i1<p.length(); i1++) {
14440                     if(p[i1]==0x20) {
14441                         pos=1;
14442                         continue;
14443                     }
14444                     if(pos==0)
14445                         p1+=p[i1];
14446                     if(pos==1)
14447                         p2+=p[i1];
14448                 }
14449                 if(!p1.compare(".remove")) {
14450                     got=true;
14451                     int line=atol(p2.c_str());
14452 
14453                     int i2=1;
14454                     vector<string>::iterator i1;
14455                     bool access=false;
14456                     for(i1=(*i).proc_groups.begin(); i1!=(*i).proc_groups.end(); i1++, i2++) {
14457                         vector<string>::iterator i3;
14458                         for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
14459                             if((!(*i3).compare(*i1) || !(*i3).compare("*")) && i2==line) {
14460                                 access=true;
14461                                 (*i).proc_groups.erase(i1);
14462                                 break;
14463                             }
14464                         }
14465                         if(access)
14466                             break;
14467                     }
14468                     if(!access) {
14469                         string disp=lang_get_string(1,(*i).lang,123)+eol;
14470                         int ec=0;
14471                         dcc_send_msg((*i).socket,disp,ec);
14472                     }
14473                     (*i).edit_proc=2;
14474                 }
14475                 if(!got) {
14476                     string disp=lang_get_string(1,(*i).lang,122)+eol;
14477                     int ec=0;
14478                     dcc_send_msg((*i).socket,disp,ec);
14479                 }
14480             }
14481             if((*i).edit_proc==9) {
14482                 string p=dcc_get_line((*i).in_buff);
14483                 if(!p.compare(""))
14484                     return;
14485                 vector<string>::iterator i3;
14486                 bool access=false;
14487                 for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
14488                     if(!(*i3).compare(p) || !(*i3).compare("*")) {
14489                         access=true;
14490                         break;
14491                     }
14492                 if(p.compare("*"))
14493                     p=(string)"\""+p+"\"";
14494                 if(!access) {
14495                     string disp=lang_get_string(1,(*i).lang,123)+eol;
14496                     int ec=0;
14497                     dcc_send_msg((*i).socket,disp,ec);
14498                 } else {
14499                     (*i).proc_groups.push_back(p);
14500                 }
14501                 (*i).edit_proc=2;
14502             }
14503 
14504             // .+proc
14505             if((*i).edit_proc==1000) {
14506                 (*i).edit_proc_addbefore_line=-1;
14507                 (*i).edit_proc_addafter_line=-1;
14508                 (*i).proc_error="";
14509                 (*i).proc_to_delete="";
14510                 (*i).proc_name="";
14511                 (*i).proc_decl="";
14512                 (*i).plus_proc=true;
14513                 string disp=lang_get_string(1,(*i).lang,373)+eol;
14514                 int ec=0;
14515                 dcc_send_msg((*i).socket,disp,ec);
14516                 (*i).edit_proc++;
14517                 return;
14518             }
14519             if((*i).edit_proc==1001) {
14520                 string p=dcc_get_line((*i).in_buff);
14521                 if(!p.compare(""))
14522                     return;
14523 
14524                 (*i).proc_name=p;
14525                 (*i).proc_decl=p;
14526 
14527                 string wo_decl=p;
14528                 if(wo_decl.find("(",0)!=string::npos)
14529                     wo_decl.erase(wo_decl.find("(",0),wo_decl.length()-wo_decl.find("(",0));
14530                 else {
14531                     string disp=lang_get_string(1,(*i).lang,374)+eol;
14532                     int ec=0;
14533                     dcc_send_msg((*i).socket,disp,ec);
14534                     (*i).edit_proc=1000;
14535                     return;
14536                 }
14537 
14538                 vector<s_procedure>::iterator i1;
14539                 bool got=false;
14540                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++) {
14541                     string pn=(*i1).name;
14542                     if(pn.find("(",0)!=string::npos)
14543                         pn.erase(pn.find("(",0),pn.length()-pn.find("(",0));
14544                     if(!pn.compare(wo_decl)) {
14545                         got=true;
14546                         break;
14547                     }
14548                 }
14549 
14550                 if(got) {
14551                     bool access=false;
14552                     vector<string>::iterator i3;
14553                     for(i3=(*i).access_to_procs.begin(); i3!=(*i).access_to_procs.end(); i3++) {
14554                         string pn=*i3;
14555                         if(pn.find("(",0)!=string::npos)
14556                             pn.erase(pn.find("(",0),pn.length()-pn.find("(",0));
14557 
14558                         if(!(*i3).compare(wo_decl) || !(*i3).compare("*")) {
14559                             access=true;
14560                             break;
14561                         }
14562                     }
14563                     if(!access) {
14564                         string disp=lang_get_string(1,(*i).lang,123)+eol;
14565                         int ec=0;
14566                         dcc_send_msg((*i).socket,disp,ec);
14567                         (*i).edit_proc=0;
14568                         return;
14569                     } else {
14570                         (*i).proc_to_delete=(*i1).name;
14571                         string disp=lang_subst(lang_get_string(1,(*i).lang,375),(*i).proc_to_delete)+eol;
14572                         int ec=0;
14573                         dcc_send_msg((*i).socket,disp,ec);
14574                         (*i).edit_proc=1500;
14575                         return;
14576                     }
14577                 } else
14578                     (*i).edit_proc++;
14579                 return;
14580             }
14581 
14582             if((*i).edit_proc==1002) {
14583                 string disp=lang_get_string(1,(*i).lang,376)+eol;
14584                 int ec=0;
14585                 dcc_send_msg((*i).socket,disp,ec);
14586                 (*i).edit_proc++;
14587 
14588                 (*i).proc_commands.clear();
14589                 return;
14590             }
14591             if((*i).edit_proc==1003) {
14592                 string p=dcc_get_line((*i).in_buff);
14593                 if(!p.compare(""))
14594                     return;
14595 
14596                 if(p.compare("."))
14597                     (*i).proc_commands.push_back(p);
14598                 else {
14599                     (*i).edit_proc=2;
14600                     return;
14601                 }
14602             }
14603 
14604             if((*i).edit_proc==1500) {
14605                 string p=dcc_get_line((*i).in_buff);
14606                 if(!p.compare(""))
14607                     return;
14608 
14609                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
14610                     string disp=lang_subst(lang_get_string(1,(*i).lang,375),(*i).proc_name)+eol;
14611                     int ec=0;
14612                     dcc_send_msg((*i).socket,disp,ec);
14613                 } else {
14614                     if(!p.compare("n") || !p.compare("N")) {
14615                         (*i).edit_proc=0;
14616                         return;
14617                     } else {
14618                         (*i).edit_proc=1002;
14619                         return;
14620                     }
14621                 }
14622             }
14623 }

Here is the call graph for this function:

void dcc_loop_edit_rproc vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process edit remote procedure call ability (.rproc) command in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 13906 of file dcc.cpp.

References dcc_get_line(), dcc_send_msg(), lang_get_string(), lang_subst(), ltoa(), r_procedures, r_users, and s_rproc::remote_bot.

Referenced by dcc_loop().

13907 {
13908     if((*i).edit_rproc==1) {
13909         string p=dcc_get_line((*i).in_buff);
13910         if(!p.compare(""))
13911             return;
13912         vector<string>::iterator i1;
13913         bool got=false;
13914         for(i1=(*i).access_to_procs.begin(); i1!=(*i).access_to_procs.end(); i1++)
13915             if(!(*i1).compare(p)) {
13916                 got=true;
13917                 (*i).proc_name=*i1;
13918                 break;
13919             }
13920         if(!got) {
13921             string disp=lang_get_string(1,(*i).lang,137)+eol;
13922             int ec=0;
13923             dcc_send_msg((*i).socket,disp,ec);
13924             return;
13925         }
13926         (*i).rproc.clear();
13927         vector<s_procedure>::iterator i2;
13928         for(i2=r_procedures.begin(); i2!=r_procedures.end(); i2++) {
13929             if(!(*i2).name.compare((*i).proc_name)) {
13930                 (*i).rproc=(*i2).rproc;
13931                 break;
13932             }
13933         }
13934         (*i).edit_rproc++;
13935     }
13936     if((*i).edit_rproc==2) {
13937         string disp=lang_get_string(1,(*i).lang,617)+eol;
13938         disp=lang_subst(disp,(*i).proc_name);
13939         int ec=0;
13940         dcc_send_msg((*i).socket,disp,ec);
13941         disp="";
13942         int i2=1;
13943         vector<s_rproc>::iterator i1;
13944         for(i1=(*i).rproc.begin(); i1!=(*i).rproc.end(); i1++, i2++) {
13945             char tmp[64];
13946             ltoa(i2,tmp,10);
13947             disp+=lang_get_string(1,(*i).lang,593);
13948             if(i2<10)
13949                 disp+="0";
13950             if(i2<100)
13951                 disp+="0";
13952             disp+=(string)tmp+": "+(*i1).remote_bot+eol;
13953         }
13954         dcc_send_msg((*i).socket,disp,ec);
13955         disp=lang_get_string(1,(*i).lang,618)+eol;
13956         dcc_send_msg((*i).socket,disp,ec);
13957         (*i).edit_rproc++;
13958     }
13959     if((*i).edit_rproc==3) {
13960         string p=dcc_get_line((*i).in_buff);
13961         if(!p.compare(""))
13962             return;
13963 
13964         if(!p.compare(".")) {
13965             string disp=lang_get_string(1,(*i).lang,426)+eol;
13966             int ec=0;
13967             dcc_send_msg((*i).socket,disp,ec);
13968             (*i).edit_rproc=100;
13969             return;
13970         }
13971 
13972         if(!p.compare(".add")) {
13973             string disp=lang_get_string(1,(*i).lang,619)+eol;
13974 
13975             vector<s_user>::iterator i1;
13976             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
13977                 disp+=(*i1).name+eol;
13978 
13979             disp+=lang_get_string(1,(*i).lang,429)+eol;
13980 
13981             int ec=0;
13982             dcc_send_msg((*i).socket,disp,ec);
13983             (*i).edit_rproc=200;
13984             return;
13985         }
13986 
13987         string p1, p2;
13988         {
13989             int pos=0;
13990             for(unsigned int i1=0; i1<p.length(); i1++) {
13991                 if(p[i1]==0x20) {
13992                     pos=1;
13993                     continue;
13994                 }
13995                 if(pos==0)
13996                     p1+=p[i1];
13997                 if(pos==1)
13998                     p2+=p[i1];
13999             }
14000         }
14001         if(!p1.compare(".remove")) {
14002             int line=0;
14003 
14004             vector<s_rproc>::iterator i1;
14005             for(i1=(*i).rproc.begin(); i1!=(*i).rproc.end(); i1++)
14006                 if(++line==atol(p2.c_str())) {
14007                     (*i).rproc.erase(i1);
14008                     break;
14009                 }
14010             (*i).edit_rproc=2;
14011             return;
14012         }
14013 
14014         (*i).edit_rproc=2;
14015         return;
14016     }
14017 
14018     // commmit?
14019     if((*i).edit_rproc==100) {
14020         string p=dcc_get_line((*i).in_buff);
14021         if(!p.compare(""))
14022             return;
14023 
14024         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
14025             string disp=lang_get_string(1,(*i).lang,426)+eol;
14026             int ec=0;
14027             dcc_send_msg((*i).socket,disp,ec);
14028         } else {
14029             if(!p.compare("n") || !p.compare("N")) {
14030                 string disp=lang_get_string(1,(*i).lang,70)+eol;
14031                 int ec=0;
14032                 dcc_send_msg((*i).socket,disp,ec);
14033 
14034                 (*i).proc_name="";
14035                 (*i).rproc.clear();
14036                 (*i).edit_rproc=0;
14037                 return;
14038             } else {
14039                 vector<string>::iterator i1;
14040                 bool got=false;
14041                 for(i1=(*i).access_to_procs.begin(); i1!=(*i).access_to_procs.end(); i1++)
14042                     if(!(*i1).compare((*i).proc_name)) {
14043                         got=true;
14044                         break;
14045                     }
14046                 if(!got) {
14047                     string disp=lang_get_string(1,(*i).lang,121)+eol;
14048                     int ec=0;
14049                     dcc_send_msg((*i).socket,disp,ec);
14050                 } else {
14051                     vector<s_procedure>::iterator i2;
14052                     for(i2=r_procedures.begin(); i2!=r_procedures.end(); i2++) {
14053                         if(!(*i2).name.compare((*i).proc_name)) {
14054                             (*i2).rproc=(*i).rproc;
14055                             break;
14056                         }
14057                     }
14058 
14059                     string disp=lang_get_string(1,(*i).lang,427)+eol;
14060                     int ec=0;
14061                     dcc_send_msg((*i).socket,disp,ec);
14062                 }
14063 
14064                 (*i).proc_name="";
14065                 (*i).rproc.clear();
14066                 (*i).edit_rproc=0;
14067                 return;
14068             }
14069             (*i).edit_rproc=0;
14070             return;
14071         }
14072     }
14073 
14074     // .add
14075     if((*i).edit_rproc==200) {
14076         string p=dcc_get_line((*i).in_buff);
14077         if(!p.compare(""))
14078             return;
14079 
14080         bool got=false;
14081         vector<s_user>::iterator i1;
14082         for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
14083             if(!(*i1).name.compare(p)) {
14084                 got=true;
14085                 break;
14086             }
14087         }
14088 
14089         if(!got) {
14090             string disp=lang_get_string(1,(*i).lang,428)+eol;
14091 
14092             vector<s_user>::iterator i1;
14093             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
14094                 disp+=(*i1).name+eol;
14095 
14096             disp+=lang_get_string(1,(*i).lang,429)+eol;
14097 
14098             int ec=0;
14099             dcc_send_msg((*i).socket,disp,ec);
14100             return;
14101         }
14102 
14103         s_rproc r;
14104         r.remote_bot=p;
14105         (*i).rproc.push_back(r);
14106 
14107         (*i).edit_rproc=2;
14108         return;
14109     }
14110 }

Here is the call graph for this function:

void dcc_loop_edit_user1 vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process edit user / new user commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
2
Date:
2005
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 9380 of file dcc.cpp.

References s_user::access_grant_apply, s_user::access_grant_backup, s_user::access_grant_can_send_all_users, s_user::access_grant_can_send_unknown_users, s_user::access_grant_channel, s_user::access_grant_die, s_user::access_grant_filesystem, s_user::access_grant_group, s_user::access_grant_partyline, s_user::access_grant_plusproc, s_user::access_grant_plususer, s_user::access_grant_private, s_user::access_grant_procedure, s_user::access_grant_rehash, s_user::access_grant_replication, s_user::access_grant_restart, s_user::access_grant_upgrade, s_user::access_to_apply, s_user::access_to_backup, s_user::access_to_can_send_all_users, s_user::access_to_can_send_unknown_users, s_user::access_to_channel, s_user::access_to_die, s_user::access_to_filesystem, s_user::access_to_group, s_user::access_to_partyline, s_user::access_to_plusproc, s_user::access_to_plususer, s_user::access_to_private, s_user::access_to_proc, s_user::access_to_rehash, s_user::access_to_replication, s_user::access_to_restart, s_user::access_to_upgrade, s_user::access_usage_procedure, s_channel::allow_dynamic, s_channel::can_send_unknown_users, s_channel::channel_name, cmp_strings_case_insensitive(), s_channel::configured, s_channel::ctcp_flood, dcc_can_unassign(), dcc_get_line(), s_user::dcc_hosts, dcc_send_msg(), s_user::fullname, s_user::groups, s_user::host_bot, s_user::host_unknown, s_user::hostmask, s_user::is_template, s_channel::join_flood, lang_get_string(), lang_subst(), s_user::last_changed, s_flood::lines, log_debug(), logic_eval(), logic_partyline_add_user(), logic_partyline_get_user(), logic_partyline_remove_user(), ltoa(), s_user::meta, s_channel::mode_flood, s_channel::msg_flood, s_group::name, s_user::name, s_channel::nick_flood, s_channel::notice_flood, s_channel::on_ban, s_channel::on_banned, s_channel::on_creator, s_channel::on_decreator, s_channel::on_deop, s_channel::on_devoice, s_channel::on_except, s_channel::on_flood, s_channel::on_invite, s_channel::on_join, s_channel::on_kick, s_channel::on_not_in_reop, s_channel::on_not_invited, s_channel::on_notice, s_channel::on_op, s_channel::on_other_mode, s_channel::on_privmsg, s_channel::on_unban, s_channel::on_unexcept, s_channel::on_uninvite, s_channel::on_voice, s_user::partyline_msg_flood, r_channels, s_channel::repeat_flood, and s_channel::username.

Referenced by dcc_loop().

09381 {
09382     if((*i).edit_user==1) {
09383         (*i).edit_user=-100;
09384     }
09385     if((*i).edit_user==-100) {
09386                 string p=dcc_get_line((*i).in_buff);
09387                 if(!p.compare(""))
09388                     return;
09389                 vector<string>::iterator i1;
09390                 bool got=false;
09391                 for(i1=(*i).access_to_users.begin(); i1!=(*i).access_to_users.end(); i1++)
09392                     if(!p.compare(*i1)) {
09393                         got=true;
09394                         break;
09395                     }
09396                 if(!got) {
09397                     string disp=lang_get_string(1,(*i).lang,90)+eol;
09398                     int ec=0;
09399                     dcc_send_msg((*i).socket,disp,ec);
09400                 } else {
09401                     (*i).user_name=p;
09402                     s_user u;
09403                     vector<s_channel> chs;
09404                     logic_partyline_get_user(p,u,chs);
09405 
09406                     vector<s_group>::iterator i1;
09407 
09408                     {
09409                         (*i).user_member_of.clear();
09410                         (*i).user_hosts.clear();
09411                         (*i).user_dcc_hosts.clear();
09412                         (*i).user_fullnames.clear();
09413                         (*i).user_meta.clear();
09414                         (*i).user_access_to_groups.clear();
09415                         (*i).user_access_grant_groups.clear();
09416                         (*i).user_access_to_proc_groups.clear();
09417                         (*i).user_access_grant_proc_groups.clear();
09418                         (*i).user_access_usage_proc_groups.clear();
09419                         (*i).user_access_to_channel.clear();
09420                         (*i).user_access_grant_channel.clear();
09421                         (*i).user_channels.clear();
09422                     }
09423 
09424                     for(i1=u.groups.begin(); i1!=u.groups.begin(); i1++)
09425                         (*i).user_member_of.push_back((*i1).name);
09426 
09427                     vector<string>::iterator i2;
09428                     for(i2=u.hostmask.begin(); i2!=u.hostmask.end(); i2++)
09429                         (*i).user_hosts.push_back(*i2);
09430 
09431                     vector<s_dcc_host>::iterator i3;
09432                     for(i3=u.dcc_hosts.begin(); i3!=u.dcc_hosts.end(); i3++) {
09433                         (*i).user_dcc_hosts.push_back(*i3);
09434                     }
09435 
09436                     for(i2=u.fullname.begin(); i2!=u.fullname.end(); i2++)
09437                         (*i).user_fullnames.push_back(*i2);
09438 
09439                     map<string,string>::iterator i6;
09440                     for(i6=u.meta.begin(); i6!=u.meta.end(); i6++)
09441                         (*i).user_meta.insert(*i6);
09442 
09443                     for(i2=u.access_to_group.begin(); i2!=u.access_to_group.end(); i2++)
09444                         (*i).user_access_to_groups.push_back(*i2);
09445 
09446                     for(i2=u.access_grant_group.begin(); i2!=u.access_grant_group.end(); i2++)
09447                         (*i).user_access_grant_groups.push_back(*i2);
09448 
09449                     for(i2=u.access_to_proc.begin(); i2!=u.access_to_proc.end(); i2++)
09450                         (*i).user_access_to_proc_groups.push_back(*i2);
09451 
09452                     for(i2=u.access_grant_procedure.begin(); i2!=u.access_grant_procedure.end(); i2++)
09453                         (*i).user_access_grant_proc_groups.push_back(*i2);
09454 
09455                     for(i2=u.access_usage_procedure.begin(); i2!=u.access_usage_procedure.end(); i2++)
09456                         (*i).user_access_usage_proc_groups.push_back(*i2);
09457 
09458                     for(i2=u.access_to_channel.begin(); i2!=u.access_to_channel.end(); i2++)
09459                         (*i).user_access_to_channel.push_back(*i2);
09460 
09461                     for(i2=u.access_grant_channel.begin(); i2!=u.access_grant_channel.end(); i2++)
09462                         (*i).user_access_grant_channel.push_back(*i2);
09463 
09464                     (*i).user_channels.clear();
09465                     vector<s_channel>::iterator i4;
09466                     for(i4=chs.begin(); i4!=chs.end(); i4++)
09467                         (*i).user_channels.push_back(*i4);
09468 
09469                     (*i).user_partyline_msg_flood=u.partyline_msg_flood;
09470 
09471                     (*i).user_access_to_backup=u.access_to_backup;
09472                     (*i).user_access_to_die=u.access_to_die;
09473                     (*i).user_access_to_filesystem=u.access_to_filesystem;
09474                     (*i).user_access_to_partyline=u.access_to_partyline;
09475                     (*i).user_access_to_plusproc=u.access_to_plusproc;
09476                     (*i).user_access_to_plususer=u.access_to_plususer;
09477                     (*i).user_access_to_rehash=u.access_to_rehash;
09478                     (*i).user_access_to_restart=u.access_to_restart;
09479                     (*i).user_access_grant_backup=u.access_grant_backup;
09480                     (*i).user_access_grant_die=u.access_grant_die;
09481                     (*i).user_access_grant_filesystem=u.access_grant_filesystem;
09482                     (*i).user_access_grant_partyline=u.access_grant_partyline;
09483                     (*i).user_access_grant_plusproc=u.access_grant_plusproc;
09484                     (*i).user_access_grant_plususer=u.access_grant_plususer;
09485                     (*i).user_access_grant_rehash=u.access_grant_rehash;
09486                     (*i).user_access_to_replication=u.access_to_replication;
09487                     (*i).user_access_grant_replication=u.access_grant_replication;
09488                     (*i).user_access_grant_restart=u.access_grant_restart;
09489 
09490                     (*i).user_access_grant_private=u.access_grant_private;
09491                     (*i).user_access_to_private=u.access_to_private;
09492 
09493                     (*i).user_access_to_upgrade=u.access_to_upgrade;
09494                     (*i).user_access_grant_upgrade=u.access_grant_upgrade;
09495 
09496                     (*i).user_access_to_apply=u.access_to_apply;
09497                     (*i).user_access_grant_apply=u.access_grant_apply;
09498 
09499                     (*i).user_access_to_can_send_all_users=u.access_to_can_send_all_users;
09500                     (*i).user_access_grant_can_send_all_users=u.access_grant_can_send_all_users;
09501 
09502                     vector<s_group>::iterator i5;
09503                     for(i5=u.groups.begin(); i5!=u.groups.end(); i5++)
09504                         (*i).user_member_of.push_back((*i5).name);
09505 
09506                     (*i).edit_user++;
09507                 }
09508             }
09509             if((*i).edit_user==-99) {
09510                 vector<s_channel>::iterator i1;
09511                 for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
09512                     vector<s_channel>::iterator i2;
09513                     bool got=false;
09514                     for(i2=(*i).user_channels.begin(); i2!=(*i).user_channels.end(); i2++) {
09515                         if(!cmp_strings_case_insensitive((*i2).channel_name,(*i1).channel_name)) {
09516                             got=true;
09517                             break;
09518                         }
09519                     }
09520                     if(!got) {
09521                         s_channel ch;
09522                         ch.channel_name=(*i1).channel_name;
09523                         ch.username=(*i).user_name;
09524                         ch.on_deop="";
09525                         ch.on_ban="";
09526                         ch.on_unban="";
09527                         ch.on_kick="";
09528                         ch.on_op="";
09529                         ch.on_voice="";
09530                         ch.on_devoice="";
09531                         ch.on_creator="";
09532                         ch.on_decreator="";
09533                         ch.on_join="";
09534                         ch.on_banned="";
09535                         ch.on_flood="";
09536                         ch.on_privmsg="";
09537                         ch.on_notice="";
09538                         ch.on_except="";
09539                         ch.on_unexcept="";
09540                         ch.on_invite="";
09541                         ch.on_uninvite="";
09542                         ch.on_not_invited="";
09543                         ch.on_not_in_reop="";
09544                         ch.on_other_mode="";
09545                         ch.msg_flood.lines=0;
09546                         ch.notice_flood.lines=0;
09547                         ch.repeat_flood.lines=0;
09548                         ch.nick_flood.lines=0;
09549                         ch.join_flood.lines=0;
09550                         ch.mode_flood.lines=0;
09551                         ch.ctcp_flood.lines=0;
09552                         ch.allow_dynamic.clear();
09553                         ch.configured=false;
09554                         ch.can_send_unknown_users=false;
09555                         (*i).user_channels.push_back(ch);
09556                     }
09557                 }
09558 
09559                 (*i).edit_user=2;
09560                 return;
09561             }
09562 
09563             // Type ".groups" if you want to edit group membership
09564             if((*i).edit_user==1200) {
09565                 string disp=lang_get_string(1,(*i).lang,485)+eol;
09566                 int ec=0;
09567                 dcc_send_msg((*i).socket,disp,ec);
09568                 disp="";
09569                 int i2=1;
09570                 vector<string>::iterator i1;
09571                 for(i1=(*i).user_member_of.begin(); i1!=(*i).user_member_of.end(); i1++, i2++) {
09572                     char tmp[64];
09573                     ltoa(i2,tmp,10);
09574                     disp+=lang_get_string(1,(*i).lang,593);
09575                     if(i2<10)
09576                         disp+="0";
09577                     if(i2<100)
09578                         disp+="0";
09579                     disp+=(string)tmp+": "+*i1;
09580                     disp+=" (";
09581                     vector<string>::iterator i3;
09582                     bool access=false;
09583                     map<string,string> vars;
09584                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
09585                         if(!(*i3).compare(logic_eval(*i1,vars))) {
09586                             access=true;
09587                             break;
09588                         }
09589                     disp+=access?lang_get_string(1,(*i).lang,120):lang_get_string(1,(*i).lang,121);
09590                     disp+=")";
09591                     disp+=eol;
09592                 }
09593                 dcc_send_msg((*i).socket,disp,ec);
09594                 disp=lang_get_string(1,(*i).lang,484)+eol;
09595                 dcc_send_msg((*i).socket,disp,ec);
09596                 (*i).edit_user++;
09597                 return;
09598             }
09599             if((*i).edit_user==1201) {
09600                 string p=dcc_get_line((*i).in_buff);
09601                 if(!p.compare(""))
09602                     return;
09603                 bool got=false;
09604                 if(!p.compare(".")) {
09605                     got=true;
09606                     (*i).edit_user=2;
09607                     return;
09608                 }
09609                 if(!p.compare(".add")) {
09610                     got=true;
09611                     string disp=lang_get_string(1,(*i).lang,486)+eol;
09612                     vector<string>::iterator i1;
09613                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
09614                         disp+=(*i1)+eol;
09615                     int ec=0;
09616                     dcc_send_msg((*i).socket,disp,ec);
09617                     (*i).edit_user=1202;
09618                     return;
09619                 }
09620                 string p1, p2;
09621                 int pos=0;
09622                 for(unsigned int i1=0; i1<p.length(); i1++) {
09623                     if(p[i1]==0x20) {
09624                         pos=1;
09625                         continue;
09626                     }
09627                     if(pos==0)
09628                         p1+=p[i1];
09629                     if(pos==1)
09630                         p2+=p[i1];
09631                 }
09632                 if(!p1.compare(".remove")) {
09633                     got=true;
09634                     int line=atol(p2.c_str());
09635 
09636                     int i2=1;
09637                     vector<string>::iterator i1;
09638                     for(i1=(*i).user_member_of.begin(); i1!=(*i).user_member_of.end(); i1++, i2++)
09639                         if(i2==line) {
09640                             vector<string>::iterator i3;
09641                             bool access=false;
09642                             map<string,string> vars;
09643                             for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
09644                                 if(!(*i3).compare(logic_eval(*i1,vars))) {
09645                                     access=true;
09646                                     break;
09647                                 }
09648                             if(!access) {
09649                                 string disp=lang_get_string(1,(*i).lang,121)+eol;
09650                                 int ec=0;
09651                                 dcc_send_msg((*i).socket,disp,ec);
09652                                 (*i).edit_user=1200;
09653                                 return;
09654                             }
09655                             (*i).user_member_of.erase(i1);
09656                             break;
09657                         }
09658                     (*i).edit_user=1200;
09659                     return;
09660                 }
09661                 if(!got) {
09662                     string disp=lang_get_string(1,(*i).lang,484)+eol;
09663                     int ec=0;
09664                     dcc_send_msg((*i).socket,disp,ec);
09665                 }
09666             }
09667             if((*i).edit_user==1202) {
09668                 string p=dcc_get_line((*i).in_buff);
09669                 if(!p.compare(""))
09670                     return;
09671 
09672                 vector<string>::iterator i1;
09673                 bool got=false;
09674                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
09675                     if(!(*i1).compare(p)) {
09676                         got=true;
09677                         break;
09678                     }
09679 
09680                 if(got) {
09681                     p=(string)"\""+p+"\"";
09682                     (*i).user_member_of.push_back(p);
09683                 } else {
09684                     string disp=lang_get_string(1,(*i).lang,487)+eol;
09685                     int ec=0;
09686                     dcc_send_msg((*i).socket,disp,ec);
09687                 }
09688                 (*i).edit_user=1200;
09689                 return;
09690             }
09691 
09692             // Type ".meta"
09693             if((*i).edit_user==1300) {
09694                 string disp=lang_get_string(1,(*i).lang,561)+eol;
09695                 int ec=0;
09696                 dcc_send_msg((*i).socket,disp,ec);
09697                 disp="";
09698                 int i2=1;
09699                 map<string,string> vars;
09700 
09701                 map<string,string>::iterator i1;
09702                 for(i1=(*i).user_meta.begin(); i1!=(*i).user_meta.end(); i1++, i2++) {
09703                     char tmp[64];
09704                     ltoa(i2,tmp,10);
09705                     disp+=lang_get_string(1,(*i).lang,593);
09706                     if(i2<10)
09707                         disp+="0";
09708                     if(i2<100)
09709                         disp+="0";
09710                     disp+=(string)tmp+": ";
09711                     disp+=logic_eval((*i1).first,vars);
09712                     disp+="=";
09713                     disp+=logic_eval((*i1).second,vars);
09714                     disp+=eol;
09715                 }
09716                 dcc_send_msg((*i).socket,disp,ec);
09717                 disp=lang_get_string(1,(*i).lang,562)+eol;
09718                 dcc_send_msg((*i).socket,disp,ec);
09719                 (*i).edit_user++;
09720             }
09721             if((*i).edit_user==1301) {
09722                 string p=dcc_get_line((*i).in_buff);
09723                 if(!p.compare(""))
09724                     return;
09725                 bool got=false;
09726                 if(!p.compare(".")) {
09727                     got=true;
09728                     (*i).edit_user=2;
09729                 }
09730                 if(!p.compare(".add")) {
09731                     got=true;
09732                     string disp=lang_get_string(1,(*i).lang,563)+eol;
09733                     int ec=0;
09734                     dcc_send_msg((*i).socket,disp,ec);
09735                     (*i).edit_user=1302;
09736                 }
09737                 string p1, p2;
09738                 int pos=0;
09739                 for(unsigned int i1=0; i1<p.length(); i1++) {
09740                     if(p[i1]==0x20) {
09741                         pos=1;
09742                         continue;
09743                     }
09744                     if(pos==0)
09745                         p1+=p[i1];
09746                     if(pos==1)
09747                         p2+=p[i1];
09748                 }
09749                 if(!p1.compare(".remove")) {
09750                     got=true;
09751                     int line=atol(p2.c_str());
09752 
09753                     int i2=1;
09754                     map<string,string>::iterator i1;
09755                     for(i1=(*i).user_meta.begin(); i1!=(*i).user_meta.end(); i1++, i2++)
09756                         if(i2==line) {
09757                             (*i).user_meta.erase(i1);
09758                             break;
09759                         }
09760                     (*i).edit_user=1300;
09761                 }
09762                 if(!got) {
09763                     string disp=lang_get_string(1,(*i).lang,562)+eol;
09764                     int ec=0;
09765                     dcc_send_msg((*i).socket,disp,ec);
09766                 }
09767             }
09768             if((*i).edit_user==1302) {
09769                 string p=dcc_get_line((*i).in_buff);
09770                 if(!p.compare(""))
09771                     return;
09772                 pair<string,string> pr;
09773                 bool equal=false;
09774                 for(unsigned int i1=0; i1<p.length(); i1++) {
09775                     if(!equal && p[i1]=='=') {
09776                         equal=true;
09777                         continue;
09778                     }
09779                     if(!equal)
09780                         pr.first+=p[i1];
09781                     else
09782                         pr.second+=p[i1];
09783                 }
09784                 pr.first=(string)"\""+pr.first+"\"";
09785                 pr.second=(string)"\""+pr.second+"\"";
09786                 (*i).user_meta.insert(pr);
09787                 (*i).edit_user=1300;
09788             }
09789 
09790             if((*i).edit_user==2) {
09791                 string disp="";
09792                 int ec=0;
09793 
09794                 for(int iii=91; iii<=98; iii++)
09795                     disp+=lang_get_string(1,(*i).lang,iii)+eol;
09796 
09797                 disp+=lang_get_string(1,(*i).lang,591)+eol;
09798 
09799                 for(int iii=99; iii<=100; iii++)
09800                     disp+=lang_get_string(1,(*i).lang,iii)+eol;
09801 
09802                 disp+=lang_get_string(1,(*i).lang,172)+eol;
09803                 disp+=lang_get_string(1,(*i).lang,483)+eol;
09804                 disp+=lang_get_string(1,(*i).lang,560)+eol;
09805 
09806                 dcc_send_msg((*i).socket,disp,ec);
09807 
09808                 int i3=1;
09809                 vector<s_channel>::iterator i2;
09810                 for(i2=(*i).user_channels.begin(); i2!=(*i).user_channels.end(); i2++, i3++) {
09811                     disp=lang_get_string(1,(*i).lang,101)+eol;
09812                     char tmp[64];
09813                     ltoa(i3,tmp,10);
09814                     disp=lang_subst(disp,tmp);
09815                     disp=lang_subst(disp,(*i2).channel_name);
09816                     vector<string>::iterator i3;
09817                     bool access=false;
09818                     map<string,string> vars;
09819                     for(i3=(*i).access_to_channel.begin(); i3!=(*i).access_to_channel.end(); i3++)
09820                         if(!cmp_strings_case_insensitive(*i3,logic_eval((*i2).channel_name,vars))) {
09821                             access=true;
09822                             break;
09823                         }
09824                     disp+="    ";
09825                     if(access)
09826                         disp+=lang_get_string(1,(*i).lang,464);
09827                     else
09828                         disp+=lang_get_string(1,(*i).lang,466);
09829                     disp+=" ";
09830                     if((*i2).configured)
09831                         disp+=lang_get_string(1,(*i).lang,467);
09832                     else
09833                         disp+=lang_get_string(1,(*i).lang,465);
09834 
09835                     disp+=eol;
09836                     dcc_send_msg((*i).socket,disp,ec);
09837                 }
09838                 disp=lang_get_string(1,(*i).lang,160)+eol;
09839 
09840                 if((*i).user_hosts.begin()==(*i).user_hosts.end())
09841                     disp+=lang_get_string(1,(*i).lang,547)+eol;
09842                 if((*i).user_fullnames.begin()==(*i).user_fullnames.end())
09843                     disp+=lang_get_string(1,(*i).lang,548)+eol;
09844 
09845                 dcc_send_msg((*i).socket,disp,ec);
09846 
09847                 (*i).edit_user++;
09848             }
09849             if((*i).edit_user==3) {
09850                 string p=dcc_get_line((*i).in_buff);
09851                 if(!p.compare(""))
09852                     return;
09853                 bool got=false;
09854                 if(!p.compare(".host")) {
09855                     got=true;
09856                     (*i).edit_user=100;
09857                 }
09858                 if(!p.compare(".dcchost")) {
09859                     got=true;
09860                     (*i).edit_user=200;
09861                 }
09862                 if(!p.compare(".fn")) {
09863                     got=true;
09864                     (*i).edit_user=300;
09865                 }
09866                 if(!p.compare(".pl")) {
09867                     got=true;
09868                     (*i).edit_user=400;
09869                 }
09870                 if(!p.compare(".atg")) {
09871                     got=true;
09872                     (*i).edit_user=500;
09873                 }
09874                 if(!p.compare(".aug")) {
09875                     got=true;
09876                     (*i).edit_user=600;
09877                 }
09878                 if(!p.compare(".atp")) {
09879                     got=true;
09880                     (*i).edit_user=700;
09881                 }
09882                 if(!p.compare(".agp")) {
09883                     got=true;
09884                     (*i).edit_user=800;
09885                 }
09886                 if(!p.compare(".aup")) {
09887                     got=true;
09888                     (*i).edit_user=1400;
09889                 }
09890                 if(!p.compare(".atc")) {
09891                     got=true;
09892                     (*i).edit_user=900;
09893                 }
09894                 if(!p.compare(".auc")) {
09895                     got=true;
09896                     (*i).edit_user=1000;
09897                 }
09898                 if(!p.compare(".commands")) {
09899                     got=true;
09900                     (*i).edit_user=1100;
09901                 }
09902                 if(!p.compare(".groups")) {
09903                     got=true;
09904                     (*i).edit_user=1200;
09905                 }
09906                 if(!p.compare(".meta")) {
09907                     got=true;
09908                     (*i).edit_user=1300;
09909                 }
09910                 vector<s_channel>::iterator i1;
09911                 int i2=1;
09912                 for(i1=(*i).user_channels.begin(); i1!=(*i).user_channels.end(); i1++, i2++) {
09913                     char tmp[64];
09914                     ltoa(i2,tmp,10);
09915                     string pp=(string)"."+tmp;
09916                     if(!p.compare(pp)) {
09917                         got=true;
09918                         (*i).edit_user=2000;
09919                         (*i).edit_channel_num=i2;
09920                         break;
09921                     }
09922                 }
09923                 if(!p.compare(".finish")) {
09924                     got=true;
09925 
09926                     string disp=lang_get_string(1,(*i).lang,161)+eol;
09927                     int ec=0;
09928                     dcc_send_msg((*i).socket,disp,ec);
09929 
09930                     (*i).edit_user++;
09931                 }
09932                 if(!got) {
09933                     string disp=lang_get_string(1,(*i).lang,106)+eol;
09934                     int ec=0;
09935                     dcc_send_msg((*i).socket,disp,ec);
09936                 }
09937             }
09938             if((*i).edit_user==4) {
09939                 string p=dcc_get_line((*i).in_buff);
09940                 if(!p.compare(""))
09941                     return;
09942                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
09943                     string disp=lang_get_string(1,(*i).lang,161)+eol;
09944                     int ec=0;
09945                     dcc_send_msg((*i).socket,disp,ec);
09946                 } else {
09947                     if(!p.compare("y") || !p.compare("Y")) {
09948                         if((*i).user_hosts.begin()==(*i).user_hosts.end() || (*i).user_fullnames.begin()==(*i).user_fullnames.end()) {
09949                             string disp=lang_get_string(1,(*i).lang,549)+eol;
09950                             int ec=0;
09951                             dcc_send_msg((*i).socket,disp,ec);
09952                             (*i).edit_user--;
09953                             return;
09954                         }
09955 
09956                         bool was_host_bot;
09957                         {
09958                             s_user u;
09959                             vector<s_channel> chs;
09960                             logic_partyline_get_user((*i).user_name,u,chs);
09961                             was_host_bot=u.host_bot;
09962                         }
09963 
09964                         s_user u;
09965 
09966                         u.name=(*i).user_name;
09967 
09968                         vector<string>::iterator i1;
09969                         for(i1=(*i).user_member_of.begin(); i1!=(*i).user_member_of.end(); i1++) {
09970                             s_group g;
09971                             g.name=*i1;
09972                             u.groups.push_back(g);
09973                         }
09974                         for(i1=(*i).user_hosts.begin(); i1!=(*i).user_hosts.end(); i1++)
09975                             u.hostmask.push_back(*i1);
09976                         vector<s_dcc_host>::iterator i2;
09977                         for(i2=(*i).user_dcc_hosts.begin(); i2!=(*i).user_dcc_hosts.end(); i2++)
09978                             u.dcc_hosts.push_back(*i2);
09979                         for(i1=(*i).user_fullnames.begin(); i1!=(*i).user_fullnames.end(); i1++)
09980                             u.fullname.push_back(*i1);
09981                         u.access_to_partyline=(*i).user_access_to_partyline;
09982                         u.access_grant_partyline=(*i).user_access_grant_partyline;
09983                         u.access_to_backup=(*i).user_access_to_backup;
09984                         u.access_to_rehash=(*i).user_access_to_rehash;
09985                         u.access_grant_backup=(*i).user_access_grant_backup;
09986                         u.access_grant_rehash=(*i).user_access_grant_rehash;
09987 
09988                         u.access_to_plususer=(*i).user_access_to_plususer;
09989                         u.access_grant_plususer=(*i).user_access_grant_plususer;
09990 
09991                         u.access_to_plusproc=(*i).user_access_to_plusproc;
09992                         u.access_grant_plusproc=(*i).user_access_grant_plusproc;
09993 
09994                         u.access_to_restart=(*i).user_access_to_restart;
09995                         u.access_grant_restart=(*i).user_access_grant_restart;
09996                         u.access_to_die=(*i).user_access_to_die;
09997                         u.access_grant_die=(*i).user_access_grant_die;
09998 
09999                         u.access_to_filesystem=(*i).user_access_to_filesystem;
10000                         u.access_grant_filesystem=(*i).user_access_grant_filesystem;
10001 
10002                         u.access_to_private=(*i).user_access_to_private;
10003                         u.access_grant_private=(*i).user_access_grant_private;
10004 
10005                         u.access_to_upgrade=(*i).user_access_to_upgrade;
10006                         u.access_grant_upgrade=(*i).user_access_grant_upgrade;
10007 
10008                         u.access_to_apply=(*i).user_access_to_apply;
10009                         u.access_grant_apply=(*i).user_access_grant_apply;
10010 
10011                         u.access_to_replication=(*i).user_access_to_replication;
10012                         u.access_grant_replication=(*i).user_access_grant_replication;
10013 
10014                         u.access_to_can_send_all_users=(*i).user_access_to_can_send_all_users;
10015                         u.access_grant_can_send_all_users=(*i).user_access_grant_can_send_all_users;
10016 
10017                         u.access_to_can_send_unknown_users=(*i).user_access_to_can_send_unknown_users;
10018                         u.access_grant_can_send_unknown_users=(*i).user_access_grant_can_send_unknown_users;
10019 
10020                         for(i1=(*i).user_access_to_groups.begin(); i1!=(*i).user_access_to_groups.end(); i1++)
10021                             u.access_to_group.push_back(*i1);
10022                         for(i1=(*i).user_access_grant_groups.begin(); i1!=(*i).user_access_grant_groups.end(); i1++)
10023                             u.access_grant_group.push_back(*i1);
10024                         for(i1=(*i).user_access_to_proc_groups.begin(); i1!=(*i).user_access_to_proc_groups.end(); i1++)
10025                             u.access_to_proc.push_back(*i1);
10026                         for(i1=(*i).user_access_grant_proc_groups.begin(); i1!=(*i).user_access_grant_proc_groups.end(); i1++)
10027                             u.access_grant_procedure.push_back(*i1);
10028                         for(i1=(*i).user_access_usage_proc_groups.begin(); i1!=(*i).user_access_usage_proc_groups.end(); i1++)
10029                             u.access_usage_procedure.push_back(*i1);
10030                         for(i1=(*i).user_access_to_channel.begin(); i1!=(*i).user_access_to_channel.end(); i1++)
10031                             u.access_to_channel.push_back(*i1);
10032                         for(i1=(*i).user_access_grant_channel.begin(); i1!=(*i).user_access_grant_channel.end(); i1++)
10033                             u.access_grant_channel.push_back(*i1);
10034 
10035                         map<string,string>::iterator i6;
10036                         for(i6=(*i).user_meta.begin(); i6!=(*i).user_meta.end(); i6++)
10037                             u.meta.insert(*i6);
10038 
10039                         vector<s_channel> chs;
10040                         vector<s_channel>::iterator i3;
10041                         for(i3=(*i).user_channels.begin(); i3!=(*i).user_channels.end(); i3++) {
10042                             if(!(*i3).configured)
10043                                 continue;
10044                             (*i3).username=(*i).user_name;
10045                             chs.push_back(*i3);
10046                         }
10047 
10048                         u.partyline_msg_flood=(*i).user_partyline_msg_flood;
10049 
10050                         time(&u.last_changed);
10051                         logic_partyline_remove_user(u.name);
10052                         u.host_bot=was_host_bot;
10053                         u.host_unknown=false;
10054                         u.is_template=false;
10055                         logic_partyline_add_user(u,chs);
10056 
10057                         string disp=lang_get_string(1,(*i).lang,163)+eol;
10058                         int ec=0;
10059                         dcc_send_msg((*i).socket,disp,ec);
10060                     } else {
10061                         string disp=lang_get_string(1,(*i).lang,162)+eol;
10062                         int ec=0;
10063                         dcc_send_msg((*i).socket,disp,ec);
10064                     }
10065                     (*i).edit_user=0;
10066                 }
10067             }
10068             // Type ".host" if you want to edit host masks
10069             if((*i).edit_user==100) {
10070                 string disp=lang_get_string(1,(*i).lang,107)+eol;
10071                 int ec=0;
10072                 dcc_send_msg((*i).socket,disp,ec);
10073                 disp="";
10074                 int i2=1;
10075                 vector<string>::iterator i1;
10076                 for(i1=(*i).user_hosts.begin(); i1!=(*i).user_hosts.end(); i1++, i2++) {
10077                     char tmp[64];
10078                     ltoa(i2,tmp,10);
10079                     disp+=lang_get_string(1,(*i).lang,593);
10080                     if(i2<10)
10081                         disp+="0";
10082                     if(i2<100)
10083                         disp+="0";
10084                     disp+=(string)tmp+": "+*i1+eol;
10085                 }
10086                 dcc_send_msg((*i).socket,disp,ec);
10087                 disp=lang_get_string(1,(*i).lang,108)+eol;
10088                 dcc_send_msg((*i).socket,disp,ec);
10089                 (*i).edit_user++;
10090             }
10091             if((*i).edit_user==101) {
10092                 string p=dcc_get_line((*i).in_buff);
10093                 if(!p.compare(""))
10094                     return;
10095                 bool got=false;
10096                 if(!p.compare(".")) {
10097                     got=true;
10098                     if((*i).user_hosts.begin()==(*i).user_hosts.end()) {
10099                         string disp=lang_get_string(1,(*i).lang,109)+eol;
10100                         int ec=0;
10101                         dcc_send_msg((*i).socket,disp,ec);
10102                     } else {
10103                         (*i).edit_user=2;
10104                     }
10105                 }
10106                 if(!p.compare(".add")) {
10107                     got=true;
10108                     string disp=lang_get_string(1,(*i).lang,110)+eol;
10109                     int ec=0;
10110                     dcc_send_msg((*i).socket,disp,ec);
10111                     (*i).edit_user=102;
10112                     return;
10113                 }
10114                 string p1, p2;
10115                 int pos=0;
10116                 for(unsigned int i1=0; i1<p.length(); i1++) {
10117                     if(p[i1]==0x20) {
10118                         pos=1;
10119                         continue;
10120                     }
10121                     if(pos==0)
10122                         p1+=p[i1];
10123                     if(pos==1)
10124                         p2+=p[i1];
10125                 }
10126                 if(!p1.compare(".remove")) {
10127                     got=true;
10128                     int line=atol(p2.c_str());
10129 
10130                     int i2=1;
10131                     vector<string>::iterator i1;
10132                     for(i1=(*i).user_hosts.begin(); i1!=(*i).user_hosts.end(); i1++, i2++)
10133                         if(i2==line) {
10134                             (*i).user_hosts.erase(i1);
10135                             break;
10136                         }
10137                     (*i).edit_user=100;
10138                 }
10139                 if(!got) {
10140                     string disp=lang_get_string(1,(*i).lang,108)+eol;
10141                     int ec=0;
10142                     dcc_send_msg((*i).socket,disp,ec);
10143                 }
10144             }
10145             if((*i).edit_user==102) {
10146                 string p=dcc_get_line((*i).in_buff);
10147                 if(!p.compare(""))
10148                     return;
10149                 p=(string)"\""+p+"\"";
10150                 (*i).user_hosts.push_back(p);
10151                 (*i).edit_user=100;
10152             }
10153 
10154             // Type ".dcchost"
10155             if((*i).edit_user==200) {
10156                 string disp=lang_get_string(1,(*i).lang,111)+eol;
10157                 int ec=0;
10158                 dcc_send_msg((*i).socket,disp,ec);
10159                 disp="";
10160                 int i2=1;
10161                 vector<s_dcc_host>::iterator i1;
10162                 for(i1=(*i).user_dcc_hosts.begin(); i1!=(*i).user_dcc_hosts.end(); i1++, i2++) {
10163                     char tmp[64];
10164                     ltoa(i2,tmp,10);
10165                     disp+=lang_get_string(1,(*i).lang,593);
10166                     if(i2<10)
10167                         disp+="0";
10168                     if(i2<100)
10169                         disp+="0";
10170                     char tmp2[64];
10171                     ltoa((*i1).group,tmp2,10);
10172                     disp+=(string)tmp+": "+(string)tmp2+";"+(*i1).host+eol;
10173                 }
10174                 dcc_send_msg((*i).socket,disp,ec);
10175                 disp=lang_get_string(1,(*i).lang,108)+eol;
10176                 dcc_send_msg((*i).socket,disp,ec);
10177                 (*i).edit_user++;
10178             }
10179             if((*i).edit_user==201) {
10180                 string p=dcc_get_line((*i).in_buff);
10181                 if(!p.compare(""))
10182                     return;
10183                 bool got=false;
10184                 if(!p.compare(".")) {
10185                     got=true;
10186                     (*i).edit_user=2;
10187                 }
10188                 if(!p.compare(".add")) {
10189                     got=true;
10190                     string disp=lang_get_string(1,(*i).lang,112)+eol;
10191                     int ec=0;
10192                     dcc_send_msg((*i).socket,disp,ec);
10193                     (*i).edit_user=202;
10194                 }
10195                 string p1, p2;
10196                 int pos=0;
10197                 for(unsigned int i1=0; i1<p.length(); i1++) {
10198                     if(p[i1]==0x20) {
10199                         pos=1;
10200                         continue;
10201                     }
10202                     if(pos==0)
10203                         p1+=p[i1];
10204                     if(pos==1)
10205                         p2+=p[i1];
10206                 }
10207                 if(!p1.compare(".remove")) {
10208                     got=true;
10209                     int line=atol(p2.c_str());
10210 
10211                     int i2=1;
10212                     vector<s_dcc_host>::iterator i1;
10213                     for(i1=(*i).user_dcc_hosts.begin(); i1!=(*i).user_dcc_hosts.end(); i1++, i2++)
10214                         if(i2==line) {
10215                             (*i).user_dcc_hosts.erase(i1);
10216                             break;
10217                         }
10218                     (*i).edit_user=200;
10219                 }
10220                 if(!got) {
10221                     string disp=lang_get_string(1,(*i).lang,108)+eol;
10222                     int ec=0;
10223                     dcc_send_msg((*i).socket,disp,ec);
10224                 }
10225             }
10226             if((*i).edit_user==202) {
10227                 string p=dcc_get_line((*i).in_buff);
10228                 if(!p.compare(""))
10229                     return;
10230                 (*i).user_dcc_host.group=atol(p.c_str());
10231                 string disp=lang_get_string(1,(*i).lang,113)+eol;
10232                 int ec=0;
10233                 dcc_send_msg((*i).socket,disp,ec);
10234                 (*i).edit_user++;
10235             }
10236             if((*i).edit_user==203) {
10237                 string p=dcc_get_line((*i).in_buff);
10238                 if(!p.compare(""))
10239                     return;
10240                 p=(string)"\""+p+"\"";
10241                 (*i).user_dcc_host.host=p;
10242                 (*i).user_dcc_hosts.push_back((*i).user_dcc_host);
10243                 (*i).edit_user=200;
10244             }
10245 
10246             // Type ".fn"
10247             if((*i).edit_user==300) {
10248                 string disp=lang_get_string(1,(*i).lang,114)+eol;
10249                 int ec=0;
10250                 dcc_send_msg((*i).socket,disp,ec);
10251                 disp="";
10252                 int i2=1;
10253                 vector<string>::iterator i1;
10254                 for(i1=(*i).user_fullnames.begin(); i1!=(*i).user_fullnames.end(); i1++, i2++) {
10255                     char tmp[64];
10256                     ltoa(i2,tmp,10);
10257                     disp+=lang_get_string(1,(*i).lang,593);
10258                     if(i2<10)
10259                         disp+="0";
10260                     if(i2<100)
10261                         disp+="0";
10262                     disp+=(string)tmp+": "+*i1+eol;
10263                 }
10264                 dcc_send_msg((*i).socket,disp,ec);
10265                 disp=lang_get_string(1,(*i).lang,115)+eol;
10266                 dcc_send_msg((*i).socket,disp,ec);
10267                 (*i).edit_user++;
10268             }
10269             if((*i).edit_user==301) {
10270                 string p=dcc_get_line((*i).in_buff);
10271                 if(!p.compare(""))
10272                     return;
10273                 bool got=false;
10274                 if(!p.compare(".")) {
10275                     if((*i).user_fullnames.begin()==(*i).user_fullnames.end()) {
10276                         string disp=lang_get_string(1,(*i).lang,546)+eol;
10277                         int ec=0;
10278                         dcc_send_msg((*i).socket,disp,ec);
10279                         return;
10280                     } else {
10281                         got=true;
10282                         (*i).edit_user=2;
10283                     }
10284                 }
10285                 if(!p.compare(".add")) {
10286                     got=true;
10287                     string disp=lang_get_string(1,(*i).lang,116)+eol;
10288                     int ec=0;
10289                     dcc_send_msg((*i).socket,disp,ec);
10290                     (*i).edit_user=302;
10291                 }
10292                 string p1, p2;
10293                 int pos=0;
10294                 for(unsigned int i1=0; i1<p.length(); i1++) {
10295                     if(p[i1]==0x20) {
10296                         pos=1;
10297                         continue;
10298                     }
10299                     if(pos==0)
10300                         p1+=p[i1];
10301                     if(pos==1)
10302                         p2+=p[i1];
10303                 }
10304                 if(!p1.compare(".remove")) {
10305                     got=true;
10306                     int line=atol(p2.c_str());
10307 
10308                     int i2=1;
10309                     vector<string>::iterator i1;
10310                     for(i1=(*i).user_fullnames.begin(); i1!=(*i).user_fullnames.end(); i1++, i2++)
10311                         if(i2==line) {
10312                             (*i).user_fullnames.erase(i1);
10313                             break;
10314                         }
10315                     (*i).edit_user=300;
10316                 }
10317                 if(!got) {
10318                     string disp=lang_get_string(1,(*i).lang,115)+eol;
10319                     int ec=0;
10320                     dcc_send_msg((*i).socket,disp,ec);
10321                 }
10322             }
10323             if((*i).edit_user==302) {
10324                 string p=dcc_get_line((*i).in_buff);
10325                 if(!p.compare(""))
10326                     return;
10327                 p=(string)"\""+p+"\"";
10328                 (*i).user_fullnames.push_back(p);
10329                 (*i).edit_user=300;
10330             }
10331 
10332             // Type ".pl"
10333             if((*i).edit_user==400) {
10334                 if(!(*i).access_grant_partyline) {
10335                     string disp=lang_get_string(1,(*i).lang,118)+eol;
10336                     int ec=0;
10337                     dcc_send_msg((*i).socket,disp,ec);
10338                     (*i).edit_user=2;
10339                 } else {
10340                     string disp=lang_get_string(1,(*i).lang,117)+eol;
10341                     int ec=0;
10342                     dcc_send_msg((*i).socket,disp,ec);
10343                     (*i).edit_user++;
10344                 }
10345             }
10346             if((*i).edit_user==401) {
10347                 string p=dcc_get_line((*i).in_buff);
10348                 if(!p.compare(""))
10349                     return;
10350                 bool got=false;
10351                 if(!p.compare("y") || !p.compare("Y")) {
10352                     (*i).user_access_to_partyline=true;
10353                     got=true;
10354                 }
10355                 if(!p.compare("n") || !p.compare("N")) {
10356                     (*i).user_access_to_partyline=false;
10357                     got=true;
10358                 }
10359                 (*i).edit_user++;
10360                 if(!got)
10361                     (*i).edit_user=400;
10362             }
10363             if((*i).edit_user==402) {
10364                 string disp=lang_get_string(1,(*i).lang,200)+eol;
10365                 int ec=0;
10366                 dcc_send_msg((*i).socket,disp,ec);
10367                 (*i).edit_user++;
10368             }
10369             if((*i).edit_user==403) {
10370                 string p=dcc_get_line((*i).in_buff);
10371                 if(!p.compare(""))
10372                     return;
10373                 bool got=false;
10374                 if(!p.compare(".")) {
10375                     got=true;
10376                     (*i).edit_user++;
10377                 } else {
10378                     if(!p.compare("0"))
10379                         p="0 0";
10380                     string lines, seconds;
10381                     int pos=0;
10382                     for(unsigned int i1=0; i1<p.length(); i1++) {
10383                         if(p[i1]==0x20) {
10384                             pos++;
10385                             continue;
10386                         }
10387                         if(pos==0)
10388                             lines+=p[i1];
10389                         if(pos==1)
10390                             seconds+=p[i1];
10391                     }
10392                     string disp;
10393                     (*i).user_partyline_msg_flood.lines=atol(lines.c_str());
10394                     (*i).user_partyline_msg_flood.seconds=atol(seconds.c_str());
10395                     (*i).edit_user++;
10396                     got=true;
10397                 }
10398                 if(!got)
10399                     (*i).edit_user=402;
10400             }
10401             if((*i).edit_user==404) {
10402                 (*i).edit_user=2;
10403             }
10404             // Type ".atg"
10405             if((*i).edit_user==500) {
10406                 string disp=lang_get_string(1,(*i).lang,119)+eol;
10407                 int ec=0;
10408                 dcc_send_msg((*i).socket,disp,ec);
10409                 disp="";
10410                 int i2=1;
10411                 vector<string>::iterator i1;
10412                 for(i1=(*i).user_access_to_groups.begin(); i1!=(*i).user_access_to_groups.end(); i1++, i2++) {
10413                     char tmp[64];
10414                     ltoa(i2,tmp,10);
10415                     disp+=lang_get_string(1,(*i).lang,593);
10416                     if(i2<10)
10417                         disp+="0";
10418                     if(i2<100)
10419                         disp+="0";
10420                     bool access=false;
10421                     vector<string>::iterator i3;
10422                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
10423                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
10424                             access=true;
10425                             break;
10426                         }
10427                     }
10428                     char tmp2[128];
10429                     if(access)
10430                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
10431                         else
10432                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
10433                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
10434                 }
10435                 dcc_send_msg((*i).socket,disp,ec);
10436                 disp=lang_get_string(1,(*i).lang,122)+eol;
10437                 dcc_send_msg((*i).socket,disp,ec);
10438                 (*i).edit_user++;
10439             }
10440             if((*i).edit_user==501) {
10441                 string p=dcc_get_line((*i).in_buff);
10442                 if(!p.compare(""))
10443                     return;
10444                 bool got=false;
10445                 if(!p.compare(".")) {
10446                     got=true;
10447                     (*i).edit_user=2;
10448                 }
10449                 if(!p.compare(".add")) {
10450                     got=true;
10451                     string disp=lang_get_string(1,(*i).lang,124)+eol;
10452                     int ec=0;
10453                     dcc_send_msg((*i).socket,disp,ec);
10454 
10455                     disp="";
10456                     vector<string>::iterator i3;
10457                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
10458                         disp+=*i3+eol;
10459                     if((*i).access_grant_groups.begin()==(*i).access_grant_groups.end()) {
10460                         disp=lang_get_string(1,(*i).lang,124)+eol;
10461                         dcc_send_msg((*i).socket,disp,ec);
10462                         (*i).edit_user=500;
10463                     } else {
10464                         dcc_send_msg((*i).socket,disp,ec);
10465                         disp=lang_get_string(1,(*i).lang,125)+eol;
10466                         dcc_send_msg((*i).socket,disp,ec);
10467                         (*i).edit_user=502;
10468                     }
10469                 }
10470                 string p1, p2;
10471                 int pos=0;
10472                 for(unsigned int i1=0; i1<p.length(); i1++) {
10473                     if(p[i1]==0x20) {
10474                         pos=1;
10475                         continue;
10476                     }
10477                     if(pos==0)
10478                         p1+=p[i1];
10479                     if(pos==1)
10480                         p2+=p[i1];
10481                 }
10482                 if(!p1.compare(".remove")) {
10483                     got=true;
10484                     int line=atol(p2.c_str());
10485 
10486                     int i2=1;
10487                     vector<string>::iterator i1;
10488                     bool access=false;
10489                     for(i1=(*i).user_access_to_groups.begin(); i1!=(*i).user_access_to_groups.end(); i1++, i2++) {
10490                         vector<string>::iterator i3;
10491                         for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
10492                             if((!(*i3).compare(*i1) || !(*i3).compare("*")) && i2==line) {
10493                                 access=true;
10494                                 (*i).user_access_to_groups.erase(i1);
10495                                 break;
10496                             }
10497                         }
10498                         if(access)
10499                             break;
10500                     }
10501                     if(!access) {
10502                         string disp=lang_get_string(1,(*i).lang,123)+eol;
10503                         int ec=0;
10504                         dcc_send_msg((*i).socket,disp,ec);
10505                     }
10506                     (*i).edit_user=500;
10507                 }
10508                 if(!got) {
10509                     string disp=lang_get_string(1,(*i).lang,122)+eol;
10510                     int ec=0;
10511                     dcc_send_msg((*i).socket,disp,ec);
10512                 }
10513             }
10514             if((*i).edit_user==502) {
10515                 string p=dcc_get_line((*i).in_buff);
10516                 if(!p.compare(""))
10517                     return;
10518                 vector<string>::iterator i3;
10519                 bool access=false;
10520                 for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
10521                     if((*i3).compare(p) || !(*i3).compare("*")) {
10522                         access=true;
10523                         break;
10524                     }
10525                 if(p.compare("*"))
10526                     p=(string)"\""+p+"\"";
10527                 if(!access) {
10528                     string disp=lang_get_string(1,(*i).lang,123)+eol;
10529                     int ec=0;
10530                     dcc_send_msg((*i).socket,disp,ec);
10531                 } else {
10532                     (*i).user_access_to_groups.push_back(p);
10533                 }
10534                 (*i).edit_user=500;
10535             }
10536             // Type ".aug"
10537             if((*i).edit_user==600) {
10538                 string disp=lang_get_string(1,(*i).lang,119)+eol;
10539                 int ec=0;
10540                 dcc_send_msg((*i).socket,disp,ec);
10541                 disp="";
10542                 int i2=1;
10543                 vector<string>::iterator i1;
10544                 for(i1=(*i).user_access_grant_groups.begin(); i1!=(*i).user_access_grant_groups.end(); i1++, i2++) {
10545                     char tmp[64];
10546                     ltoa(i2,tmp,10);
10547                     disp+=lang_get_string(1,(*i).lang,593);
10548                     if(i2<10)
10549                         disp+="0";
10550                     if(i2<100)
10551                         disp+="0";
10552                     bool access=false;
10553                     vector<string>::iterator i3;
10554                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
10555                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
10556                             access=true;
10557                             break;
10558                         }
10559                     }
10560                     char tmp2[128];
10561                     if(access)
10562                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
10563                         else
10564                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
10565                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
10566                 }
10567                 dcc_send_msg((*i).socket,disp,ec);
10568                 disp=lang_get_string(1,(*i).lang,122)+eol;
10569                 dcc_send_msg((*i).socket,disp,ec);
10570                 (*i).edit_user++;
10571             }
10572             if((*i).edit_user==601) {
10573                 string p=dcc_get_line((*i).in_buff);
10574                 if(!p.compare(""))
10575                     return;
10576                 bool got=false;
10577                 if(!p.compare(".")) {
10578                     got=true;
10579                     (*i).edit_user=2;
10580                 }
10581                 if(!p.compare(".add")) {
10582                     got=true;
10583                     string disp=lang_get_string(1,(*i).lang,124)+eol;
10584                     int ec=0;
10585                     dcc_send_msg((*i).socket,disp,ec);
10586 
10587                     disp="";
10588                     vector<string>::iterator i3;
10589                     for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
10590                         disp+=*i3+eol;
10591                     if((*i).access_grant_groups.begin()==(*i).access_grant_groups.end()) {
10592                         disp=lang_get_string(1,(*i).lang,124)+eol;
10593                         dcc_send_msg((*i).socket,disp,ec);
10594                         (*i).edit_user=600;
10595                     } else {
10596                         dcc_send_msg((*i).socket,disp,ec);
10597                         disp=lang_get_string(1,(*i).lang,125)+eol;
10598                         dcc_send_msg((*i).socket,disp,ec);
10599                         (*i).edit_user=602;
10600                     }
10601                 }
10602                 string p1, p2;
10603                 int pos=0;
10604                 for(unsigned int i1=0; i1<p.length(); i1++) {
10605                     if(p[i1]==0x20) {
10606                         pos=1;
10607                         continue;
10608                     }
10609                     if(pos==0)
10610                         p1+=p[i1];
10611                     if(pos==1)
10612                         p2+=p[i1];
10613                 }
10614                 if(!p1.compare(".remove")) {
10615                     got=true;
10616                     int line=atol(p2.c_str());
10617 
10618                     int i2=1;
10619                     bool access=false;
10620                     vector<string>::iterator i1;
10621                     vector<string>::iterator i3;
10622                     for(i1=(*i).user_access_grant_groups.begin(); i1!=(*i).user_access_grant_groups.end(); i1++, i2++) {
10623                         for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++) {
10624                             if((!(*i1).compare(*i3) || !(*i3).compare("*")) && i2==line) {
10625                                 access=true;
10626                                 (*i).user_access_grant_groups.erase(i1);
10627                                 break;
10628                             }
10629                         }
10630                     }
10631                     if(!access) {
10632                         string disp=lang_get_string(1,(*i).lang,123)+eol;
10633                         int ec=0;
10634                         dcc_send_msg((*i).socket,disp,ec);
10635                     }
10636                     (*i).edit_user=600;
10637                 }
10638                 if(!got) {
10639                     string disp=lang_get_string(1,(*i).lang,122)+eol;
10640                     int ec=0;
10641                     dcc_send_msg((*i).socket,disp,ec);
10642                 }
10643             }
10644             if((*i).edit_user==602) {
10645                 string p=dcc_get_line((*i).in_buff);
10646                 if(!p.compare(""))
10647                     return;
10648                 vector<string>::iterator i3;
10649                 bool access=false;
10650                 for(i3=(*i).access_grant_groups.begin(); i3!=(*i).access_grant_groups.end(); i3++)
10651                     if((*i3).compare(p) || !(*i3).compare("*")) {
10652                         access=true;
10653                         break;
10654                     }
10655                 if(p.compare("*"))
10656                     p=(string)"\""+p+"\"";
10657                 if(!access) {
10658                     string disp=lang_get_string(1,(*i).lang,123)+eol;
10659                     int ec=0;
10660                     dcc_send_msg((*i).socket,disp,ec);
10661                 } else {
10662                     (*i).user_access_to_groups.push_back(p);
10663                 }
10664                 (*i).edit_user=600;
10665             }
10666             // Type ".atp"
10667             if((*i).edit_user==700) {
10668                 string disp=lang_get_string(1,(*i).lang,126)+eol;
10669                 int ec=0;
10670                 dcc_send_msg((*i).socket,disp,ec);
10671                 disp="";
10672                 int i2=1;
10673                 vector<string>::iterator i1;
10674                 for(i1=(*i).user_access_to_proc_groups.begin(); i1!=(*i).user_access_to_proc_groups.end(); i1++, i2++) {
10675                     char tmp[64];
10676                     ltoa(i2,tmp,10);
10677                     disp+=lang_get_string(1,(*i).lang,593);
10678                     if(i2<10)
10679                         disp+="0";
10680                     if(i2<100)
10681                         disp+="0";
10682                     bool access=false;
10683                     vector<string>::iterator i3;
10684                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
10685                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
10686                             access=true;
10687                             break;
10688                         }
10689                     }
10690                     char tmp2[128];
10691                     if(access)
10692                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
10693                         else
10694                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
10695                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
10696                 }
10697                 dcc_send_msg((*i).socket,disp,ec);
10698                 disp=lang_get_string(1,(*i).lang,122)+eol;
10699                 dcc_send_msg((*i).socket,disp,ec);
10700                 (*i).edit_user++;
10701             }
10702             if((*i).edit_user==701) {
10703                 string p=dcc_get_line((*i).in_buff);
10704                 if(!p.compare(""))
10705                     return;
10706                 bool got=false;
10707                 if(!p.compare(".")) {
10708                     got=true;
10709                     (*i).edit_user=2;
10710                 }
10711                 if(!p.compare(".add")) {
10712                     got=true;
10713                     string disp=lang_get_string(1,(*i).lang,124)+eol;
10714                     int ec=0;
10715                     dcc_send_msg((*i).socket,disp,ec);
10716 
10717                     disp="";
10718                     vector<string>::iterator i3;
10719                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
10720                         disp+=*i3+eol;
10721                     if((*i).access_grant_proc_groups.begin()==(*i).access_grant_proc_groups.end()) {
10722                         disp=lang_get_string(1,(*i).lang,127)+eol;
10723                         dcc_send_msg((*i).socket,disp,ec);
10724                         (*i).edit_user=700;
10725                     } else {
10726                         dcc_send_msg((*i).socket,disp,ec);
10727                         disp=lang_get_string(1,(*i).lang,125)+eol;
10728                         dcc_send_msg((*i).socket,disp,ec);
10729                         (*i).edit_user=702;
10730                     }
10731                 }
10732                 string p1, p2;
10733                 int pos=0;
10734                 for(unsigned int i1=0; i1<p.length(); i1++) {
10735                     if(p[i1]==0x20) {
10736                         pos=1;
10737                         continue;
10738                     }
10739                     if(pos==0)
10740                         p1+=p[i1];
10741                     if(pos==1)
10742                         p2+=p[i1];
10743                 }
10744                 if(!p1.compare(".remove")) {
10745                     got=true;
10746                     int line=atol(p2.c_str());
10747 
10748                     int i2=1;
10749                     vector<string>::iterator i1;
10750                     bool access=false;
10751                     for(i1=(*i).user_access_to_proc_groups.begin(); i1!=(*i).user_access_to_proc_groups.end(); i1++, i2++) {
10752                         vector<string>::iterator i3;
10753                         for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
10754                             if((!(*i3).compare(*i1) || !(*i3).compare("*")) && i2==line) {
10755                                 access=true;
10756                                 (*i).user_access_to_proc_groups.erase(i1);
10757                                 break;
10758                             }
10759                         }
10760                         if(access)
10761                             break;
10762                     }
10763                     if(!access) {
10764                         string disp=lang_get_string(1,(*i).lang,123)+eol;
10765                         int ec=0;
10766                         dcc_send_msg((*i).socket,disp,ec);
10767                     }
10768                     (*i).edit_user=700;
10769                 }
10770                 if(!got) {
10771                     string disp=lang_get_string(1,(*i).lang,122)+eol;
10772                     int ec=0;
10773                     dcc_send_msg((*i).socket,disp,ec);
10774                 }
10775             }
10776             if((*i).edit_user==702) {
10777                 string p=dcc_get_line((*i).in_buff);
10778                 if(!p.compare(""))
10779                     return;
10780                 vector<string>::iterator i3;
10781                 bool access=false;
10782                 for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
10783                     if((*i3).compare(p) || !(*i3).compare("*")) {
10784                         access=true;
10785                         break;
10786                     }
10787                 if(p.compare("*"))
10788                     p=(string)"\""+p+"\"";
10789                 if(!access) {
10790                     string disp=lang_get_string(1,(*i).lang,123)+eol;
10791                     int ec=0;
10792                     dcc_send_msg((*i).socket,disp,ec);
10793                 } else {
10794                     (*i).user_access_to_proc_groups.push_back(p);
10795                 }
10796                 (*i).edit_user=700;
10797             }
10798             // Type ".agp"
10799             if((*i).edit_user==800) {
10800                 string disp=lang_get_string(1,(*i).lang,128)+eol;
10801                 int ec=0;
10802                 dcc_send_msg((*i).socket,disp,ec);
10803                 disp="";
10804                 int i2=1;
10805                 vector<string>::iterator i1;
10806                 for(i1=(*i).user_access_grant_proc_groups.begin(); i1!=(*i).user_access_grant_proc_groups.end(); i1++, i2++) {
10807                     char tmp[64];
10808                     ltoa(i2,tmp,10);
10809                     disp+=lang_get_string(1,(*i).lang,593);
10810                     if(i2<10)
10811                         disp+="0";
10812                     if(i2<100)
10813                         disp+="0";
10814                     bool access=false;
10815                     vector<string>::iterator i3;
10816                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
10817                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
10818                             access=true;
10819                             break;
10820                         }
10821                     }
10822                     char tmp2[128];
10823                     if(access)
10824                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
10825                         else
10826                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
10827                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
10828                 }
10829                 dcc_send_msg((*i).socket,disp,ec);
10830                 disp=lang_get_string(1,(*i).lang,122)+eol;
10831                 dcc_send_msg((*i).socket,disp,ec);
10832                 (*i).edit_user++;
10833             }
10834             if((*i).edit_user==801) {
10835                 string p=dcc_get_line((*i).in_buff);
10836                 if(!p.compare(""))
10837                     return;
10838                 bool got=false;
10839                 if(!p.compare(".")) {
10840                     got=true;
10841                     (*i).edit_user=2;
10842                 }
10843                 if(!p.compare(".add")) {
10844                     got=true;
10845                     string disp=lang_get_string(1,(*i).lang,124)+eol;
10846                     int ec=0;
10847                     dcc_send_msg((*i).socket,disp,ec);
10848 
10849                     disp="";
10850                     vector<string>::iterator i3;
10851                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
10852                         disp+=*i3+eol;
10853                     if((*i).access_grant_proc_groups.begin()==(*i).access_grant_proc_groups.end()) {
10854                         disp=lang_get_string(1,(*i).lang,124)+eol;
10855                         dcc_send_msg((*i).socket,disp,ec);
10856                         (*i).edit_user=800;
10857                     } else {
10858                         dcc_send_msg((*i).socket,disp,ec);
10859                         disp=lang_get_string(1,(*i).lang,125)+eol;
10860                         dcc_send_msg((*i).socket,disp,ec);
10861                         (*i).edit_user=802;
10862                     }
10863                 }
10864                 string p1, p2;
10865                 int pos=0;
10866                 for(unsigned int i1=0; i1<p.length(); i1++) {
10867                     if(p[i1]==0x20) {
10868                         pos=1;
10869                         continue;
10870                     }
10871                     if(pos==0)
10872                         p1+=p[i1];
10873                     if(pos==1)
10874                         p2+=p[i1];
10875                 }
10876                 if(!p1.compare(".remove")) {
10877                     got=true;
10878                     int line=atol(p2.c_str());
10879 
10880                     int i2=1;
10881                     bool access=false;
10882                     vector<string>::iterator i1;
10883                     vector<string>::iterator i3;
10884                     for(i1=(*i).user_access_grant_proc_groups.begin(); i1!=(*i).user_access_grant_proc_groups.end(); i1++, i2++) {
10885                         for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
10886                             if((!(*i1).compare(*i3) || !(*i3).compare("*")) && i2==line) {
10887                                 access=true;
10888                                 (*i).user_access_grant_proc_groups.erase(i1);
10889                                 break;
10890                             }
10891                         }
10892                     }
10893                     if(!access) {
10894                         string disp=lang_get_string(1,(*i).lang,123)+eol;
10895                         int ec=0;
10896                         dcc_send_msg((*i).socket,disp,ec);
10897                     }
10898                     (*i).edit_user=800;
10899                 }
10900                 if(!got) {
10901                     string disp=lang_get_string(1,(*i).lang,122)+eol;
10902                     int ec=0;
10903                     dcc_send_msg((*i).socket,disp,ec);
10904                 }
10905             }
10906             if((*i).edit_user==802) {
10907                 string p=dcc_get_line((*i).in_buff);
10908                 if(!p.compare(""))
10909                     return;
10910                 vector<string>::iterator i3;
10911                 bool access=false;
10912                 for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
10913                     if((*i3).compare(p) || !(*i3).compare("*")) {
10914                         access=true;
10915                         break;
10916                     }
10917                 if(p.compare("*"))
10918                     p=(string)"\""+p+"\"";
10919                 if(!access) {
10920                     string disp=lang_get_string(1,(*i).lang,123)+eol;
10921                     int ec=0;
10922                     dcc_send_msg((*i).socket,disp,ec);
10923                 } else {
10924                     (*i).user_access_grant_proc_groups.push_back(p);
10925                 }
10926                 (*i).edit_user=800;
10927             }
10928 
10929             // Type ".aup"
10930             if((*i).edit_user==1400) {
10931                 string disp=lang_get_string(1,(*i).lang,128)+eol;
10932                 int ec=0;
10933                 dcc_send_msg((*i).socket,disp,ec);
10934                 disp="";
10935                 int i2=1;
10936                 vector<string>::iterator i1;
10937                 for(i1=(*i).user_access_usage_proc_groups.begin(); i1!=(*i).user_access_usage_proc_groups.end(); i1++, i2++) {
10938                     char tmp[64];
10939                     ltoa(i2,tmp,10);
10940                     disp+=lang_get_string(1,(*i).lang,593);
10941                     if(i2<10)
10942                         disp+="0";
10943                     if(i2<100)
10944                         disp+="0";
10945                     bool access=false;
10946                     vector<string>::iterator i3;
10947                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
10948                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
10949                             access=true;
10950                             break;
10951                         }
10952                     }
10953                     char tmp2[128];
10954                     if(access)
10955                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
10956                         else
10957                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
10958                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
10959                 }
10960                 dcc_send_msg((*i).socket,disp,ec);
10961                 disp=lang_get_string(1,(*i).lang,122)+eol;
10962                 dcc_send_msg((*i).socket,disp,ec);
10963                 (*i).edit_user++;
10964             }
10965             if((*i).edit_user==1401) {
10966                 string p=dcc_get_line((*i).in_buff);
10967                 if(!p.compare(""))
10968                     return;
10969                 bool got=false;
10970                 if(!p.compare(".")) {
10971                     got=true;
10972                     (*i).edit_user=2;
10973                 }
10974                 if(!p.compare(".add")) {
10975                     got=true;
10976                     string disp=lang_get_string(1,(*i).lang,124)+eol;
10977                     int ec=0;
10978                     dcc_send_msg((*i).socket,disp,ec);
10979 
10980                     disp="";
10981                     vector<string>::iterator i3;
10982                     for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
10983                         disp+=*i3+eol;
10984                     if((*i).access_grant_proc_groups.begin()==(*i).access_grant_proc_groups.end()) {
10985                         disp=lang_get_string(1,(*i).lang,124)+eol;
10986                         dcc_send_msg((*i).socket,disp,ec);
10987                         (*i).edit_user=1400;
10988                     } else {
10989                         dcc_send_msg((*i).socket,disp,ec);
10990                         disp=lang_get_string(1,(*i).lang,125)+eol;
10991                         dcc_send_msg((*i).socket,disp,ec);
10992                         (*i).edit_user=1402;
10993                     }
10994                 }
10995                 string p1, p2;
10996                 int pos=0;
10997                 for(unsigned int i1=0; i1<p.length(); i1++) {
10998                     if(p[i1]==0x20) {
10999                         pos=1;
11000                         continue;
11001                     }
11002                     if(pos==0)
11003                         p1+=p[i1];
11004                     if(pos==1)
11005                         p2+=p[i1];
11006                 }
11007                 if(!p1.compare(".remove")) {
11008                     got=true;
11009                     int line=atol(p2.c_str());
11010 
11011                     int i2=1;
11012                     bool access=false;
11013                     vector<string>::iterator i1;
11014                     vector<string>::iterator i3;
11015                     for(i1=(*i).user_access_usage_proc_groups.begin(); i1!=(*i).user_access_usage_proc_groups.end(); i1++, i2++) {
11016                         for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++) {
11017                             if((!(*i1).compare(*i3) || !(*i3).compare("*")) && i2==line) {
11018                                 access=true;
11019                                 (*i).user_access_usage_proc_groups.erase(i1);
11020                                 break;
11021                             }
11022                         }
11023                     }
11024                     if(!access) {
11025                         string disp=lang_get_string(1,(*i).lang,123)+eol;
11026                         int ec=0;
11027                         dcc_send_msg((*i).socket,disp,ec);
11028                     }
11029                     (*i).edit_user=1400;
11030                 }
11031                 if(!got) {
11032                     string disp=lang_get_string(1,(*i).lang,122)+eol;
11033                     int ec=0;
11034                     dcc_send_msg((*i).socket,disp,ec);
11035                 }
11036             }
11037             if((*i).edit_user==1402) {
11038                 string p=dcc_get_line((*i).in_buff);
11039                 if(!p.compare(""))
11040                     return;
11041                 vector<string>::iterator i3;
11042                 bool access=false;
11043                 for(i3=(*i).access_grant_proc_groups.begin(); i3!=(*i).access_grant_proc_groups.end(); i3++)
11044                     if((*i3).compare(p) || !(*i3).compare("*")) {
11045                         access=true;
11046                         break;
11047                     }
11048                 if(p.compare("*"))
11049                     p=(string)"\""+p+"\"";
11050                 if(!access) {
11051                     string disp=lang_get_string(1,(*i).lang,123)+eol;
11052                     int ec=0;
11053                     dcc_send_msg((*i).socket,disp,ec);
11054                 } else {
11055                     (*i).user_access_usage_proc_groups.push_back(p);
11056                 }
11057                 (*i).edit_user=1400;
11058             }
11059 
11060             // Type ".atc"
11061             if((*i).edit_user==900) {
11062                 string disp=lang_get_string(1,(*i).lang,126)+eol;
11063                 int ec=0;
11064                 dcc_send_msg((*i).socket,disp,ec);
11065                 disp="";
11066                 int i2=1;
11067                 vector<string>::iterator i1;
11068                 for(i1=(*i).user_access_to_channel.begin(); i1!=(*i).user_access_to_channel.end(); i1++, i2++) {
11069                     char tmp[64];
11070                     ltoa(i2,tmp,10);
11071                     disp+=lang_get_string(1,(*i).lang,593);
11072                     if(i2<10)
11073                         disp+="0";
11074                     if(i2<100)
11075                         disp+="0";
11076                     bool access=false;
11077                     vector<string>::iterator i3;
11078                     for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++) {
11079                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
11080                             access=true;
11081                             break;
11082                         }
11083                     }
11084                     char tmp2[128];
11085                     if(access)
11086                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
11087                         else
11088                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
11089                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
11090                 }
11091                 dcc_send_msg((*i).socket,disp,ec);
11092                 disp=lang_get_string(1,(*i).lang,122)+eol;
11093                 dcc_send_msg((*i).socket,disp,ec);
11094                 (*i).edit_user++;
11095             }
11096             if((*i).edit_user==901) {
11097                 string p=dcc_get_line((*i).in_buff);
11098                 if(!p.compare(""))
11099                     return;
11100                 bool got=false;
11101                 if(!p.compare(".")) {
11102                     got=true;
11103                     (*i).edit_user=2;
11104                 }
11105                 if(!p.compare(".add")) {
11106                     got=true;
11107                     string disp=lang_get_string(1,(*i).lang,124)+eol;
11108                     int ec=0;
11109                     dcc_send_msg((*i).socket,disp,ec);
11110 
11111                     disp="";
11112                     vector<string>::iterator i3;
11113                     for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++)
11114                         disp+=*i3+eol;
11115                     if((*i).access_grant_channel.begin()==(*i).access_grant_channel.end()) {
11116                         disp=lang_get_string(1,(*i).lang,127)+eol;
11117                         dcc_send_msg((*i).socket,disp,ec);
11118                         (*i).edit_user=900;
11119                     } else {
11120                         dcc_send_msg((*i).socket,disp,ec);
11121                         disp=lang_get_string(1,(*i).lang,125)+eol;
11122                         dcc_send_msg((*i).socket,disp,ec);
11123                         (*i).edit_user=902;
11124                     }
11125                 }
11126                 string p1, p2;
11127                 int pos=0;
11128                 for(unsigned int i1=0; i1<p.length(); i1++) {
11129                     if(p[i1]==0x20) {
11130                         pos=1;
11131                         continue;
11132                     }
11133                     if(pos==0)
11134                         p1+=p[i1];
11135                     if(pos==1)
11136                         p2+=p[i1];
11137                 }
11138                 if(!p1.compare(".remove")) {
11139                     got=true;
11140                     int line=atol(p2.c_str());
11141 
11142                     int i2=1;
11143                     vector<string>::iterator i1;
11144                     bool access=false;
11145                     for(i1=(*i).user_access_to_channel.begin(); i1!=(*i).user_access_to_channel.end(); i1++, i2++) {
11146                         vector<string>::iterator i3;
11147                         for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++) {
11148                             if((!(*i3).compare(*i1) || !(*i3).compare("*")) && i2==line) {
11149                                 access=true;
11150                                 (*i).user_access_to_channel.erase(i1);
11151                                 break;
11152                             }
11153                         }
11154                         if(access)
11155                             break;
11156                     }
11157                     if(!access) {
11158                         string disp=lang_get_string(1,(*i).lang,123)+eol;
11159                         int ec=0;
11160                         dcc_send_msg((*i).socket,disp,ec);
11161                     }
11162                     (*i).edit_user=900;
11163                 }
11164                 if(!got) {
11165                     string disp=lang_get_string(1,(*i).lang,122)+eol;
11166                     int ec=0;
11167                     dcc_send_msg((*i).socket,disp,ec);
11168                 }
11169             }
11170             if((*i).edit_user==902) {
11171                 string p=dcc_get_line((*i).in_buff);
11172                 if(!p.compare(""))
11173                     return;
11174                 vector<string>::iterator i3;
11175                 bool access=false;
11176                 for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++)
11177                     if((*i3).compare(p) || !(*i3).compare("*")) {
11178                         access=true;
11179                         break;
11180                     }
11181                 if(p.compare("*"))
11182                     p=(string)"\""+p+"\"";
11183                 if(!access) {
11184                     string disp=lang_get_string(1,(*i).lang,123)+eol;
11185                     int ec=0;
11186                     dcc_send_msg((*i).socket,disp,ec);
11187                 } else {
11188                     (*i).user_access_to_groups.push_back(p);
11189                 }
11190                 (*i).edit_user=900;
11191             }
11192             // Type ".auc"
11193             if((*i).edit_user==1000) {
11194                 string disp=lang_get_string(1,(*i).lang,128)+eol;
11195                 int ec=0;
11196                 dcc_send_msg((*i).socket,disp,ec);
11197                 disp="";
11198                 int i2=1;
11199                 vector<string>::iterator i1;
11200                 for(i1=(*i).user_access_grant_channel.begin(); i1!=(*i).user_access_grant_channel.end(); i1++, i2++) {
11201                     char tmp[64];
11202                     ltoa(i2,tmp,10);
11203                     disp+=lang_get_string(1,(*i).lang,593);
11204                     if(i2<10)
11205                         disp+="0";
11206                     if(i2<100)
11207                         disp+="0";
11208                     bool access=false;
11209                     vector<string>::iterator i3;
11210                     for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++) {
11211                         if(!(*i3).compare(*i1) || !(*i3).compare("*")) {
11212                             access=true;
11213                             break;
11214                         }
11215                     }
11216                     char tmp2[128];
11217                     if(access)
11218                         strcpy(tmp2,lang_get_string(1,(*i).lang,120).c_str());
11219                         else
11220                         strcpy(tmp2,lang_get_string(1,(*i).lang,121).c_str());
11221                     disp+=(string)tmp+": "+*i1+" = "+tmp2+eol;
11222                 }
11223                 dcc_send_msg((*i).socket,disp,ec);
11224                 disp=lang_get_string(1,(*i).lang,122)+eol;
11225                 dcc_send_msg((*i).socket,disp,ec);
11226                 (*i).edit_user++;
11227             }
11228             if((*i).edit_user==1001) {
11229                 string p=dcc_get_line((*i).in_buff);
11230                 if(!p.compare(""))
11231                     return;
11232                 bool got=false;
11233                 if(!p.compare(".")) {
11234                     got=true;
11235                     (*i).edit_user=2;
11236                 }
11237                 if(!p.compare(".add")) {
11238                     got=true;
11239                     string disp=lang_get_string(1,(*i).lang,124)+eol;
11240                     int ec=0;
11241                     dcc_send_msg((*i).socket,disp,ec);
11242 
11243                     disp="";
11244                     vector<string>::iterator i3;
11245                     for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++)
11246                         disp+=*i3+eol;
11247                     if((*i).access_grant_channel.begin()==(*i).access_grant_channel.end()) {
11248                         disp=lang_get_string(1,(*i).lang,124)+eol;
11249                         dcc_send_msg((*i).socket,disp,ec);
11250                         (*i).edit_user=1000;
11251                     } else {
11252                         dcc_send_msg((*i).socket,disp,ec);
11253                         disp=lang_get_string(1,(*i).lang,125)+eol;
11254                         dcc_send_msg((*i).socket,disp,ec);
11255                         (*i).edit_user=1002;
11256                     }
11257                 }
11258                 string p1, p2;
11259                 int pos=0;
11260                 for(unsigned int i1=0; i1<p.length(); i1++) {
11261                     if(p[i1]==0x20) {
11262                         pos=1;
11263                         continue;
11264                     }
11265                     if(pos==0)
11266                         p1+=p[i1];
11267                     if(pos==1)
11268                         p2+=p[i1];
11269                 }
11270                 if(!p1.compare(".remove")) {
11271                     got=true;
11272                     int line=atol(p2.c_str());
11273 
11274                     int i2=1;
11275                     bool access=false;
11276                     vector<string>::iterator i1;
11277                     vector<string>::iterator i3;
11278                     for(i1=(*i).user_access_grant_channel.begin(); i1!=(*i).user_access_grant_channel.end(); i1++, i2++) {
11279                         for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++) {
11280                             if((!(*i1).compare(*i3) || !(*i3).compare("*")) && i2==line) {
11281                                 access=true;
11282                                 (*i).user_access_grant_channel.erase(i1);
11283                                 break;
11284                             }
11285                         }
11286                     }
11287                     if(!access) {
11288                         string disp=lang_get_string(1,(*i).lang,123)+eol;
11289                         int ec=0;
11290                         dcc_send_msg((*i).socket,disp,ec);
11291                     }
11292                     (*i).edit_user=1000;
11293                 }
11294                 if(!got) {
11295                     string disp=lang_get_string(1,(*i).lang,122)+eol;
11296                     int ec=0;
11297                     dcc_send_msg((*i).socket,disp,ec);
11298                 }
11299             }
11300             if((*i).edit_user==1002) {
11301                 string p=dcc_get_line((*i).in_buff);
11302                 if(!p.compare(""))
11303                     return;
11304                 vector<string>::iterator i3;
11305                 bool access=false;
11306                 for(i3=(*i).access_grant_channel.begin(); i3!=(*i).access_grant_channel.end(); i3++)
11307                     if((*i3).compare(p) || !(*i3).compare("*")) {
11308                         access=true;
11309                         break;
11310                     }
11311                 if(p.compare("*"))
11312                     p=(string)"\""+p+"\"";
11313                 if(!access) {
11314                     string disp=lang_get_string(1,(*i).lang,123)+eol;
11315                     int ec=0;
11316                     dcc_send_msg((*i).socket,disp,ec);
11317                 } else {
11318                     (*i).user_access_to_groups.push_back(p);
11319                 }
11320                 (*i).edit_user=1000;
11321             }
11322             // edituser / edit channel
11323             if((*i).edit_user==2000) {
11324                 string chan;
11325                 vector<s_channel>::iterator i1;
11326                 int i2=1;
11327                 for(i1=(*i).user_channels.begin(); i1!=(*i).user_channels.end(); i1++, i2++)
11328                     if(i2==(*i).edit_channel_num) {
11329                         chan=(*i1).channel_name;
11330                         break;
11331                     }
11332                 if(!chan.compare("")) {
11333                     (*i).edit_user=2;
11334                     log_debug("in file " __FILE__ " in function " __FUNC__ " occurred error: cannot find channel to edit! (#1) huh?!");
11335                     return;
11336                 }
11337                 (*i).user_channel.channel_name=chan;
11338                 (*i).user_channel.on_deop=(*i1).on_deop;
11339                 (*i).user_channel.on_ban=(*i1).on_ban;
11340                 (*i).user_channel.on_unban=(*i1).on_unban;
11341                 (*i).user_channel.on_kick=(*i1).on_kick;
11342                 (*i).user_channel.on_op=(*i1).on_op;
11343                 (*i).user_channel.on_voice=(*i1).on_voice;
11344                 (*i).user_channel.on_devoice=(*i1).on_devoice;
11345                 (*i).user_channel.on_creator=(*i1).on_creator;
11346                 (*i).user_channel.on_decreator=(*i1).on_decreator;
11347                 (*i).user_channel.on_join=(*i1).on_join;
11348                 (*i).user_channel.on_banned=(*i1).on_banned;
11349                 (*i).user_channel.on_flood=(*i1).on_flood;
11350                 (*i).user_channel.on_privmsg=(*i1).on_privmsg;
11351                 (*i).user_channel.on_notice=(*i1).on_notice;
11352                 (*i).user_channel.on_other_mode=(*i1).on_other_mode;
11353 
11354                 (*i).user_channel.msg_flood=(*i1).msg_flood;
11355                 (*i).user_channel.notice_flood=(*i1).notice_flood;
11356                 (*i).user_channel.repeat_flood=(*i1).repeat_flood;
11357                 (*i).user_channel.nick_flood=(*i1).nick_flood;
11358                 (*i).user_channel.join_flood=(*i1).join_flood;
11359                 (*i).user_channel.mode_flood=(*i1).mode_flood;
11360                 (*i).user_channel.ctcp_flood=(*i1).ctcp_flood;
11361 
11362                 (*i).user_channel.allow_dynamic.clear();
11363                 vector<s_dynamic_rule>::iterator i3;
11364                 for(i3=(*i1).allow_dynamic.begin(); i3!=(*i1).allow_dynamic.end(); i3++)
11365                     (*i).user_channel.allow_dynamic.push_back(*i3);
11366 
11367                 string disp=lang_get_string(1,(*i).lang,129)+eol;
11368                 disp=lang_subst(disp,chan);
11369                 int ec=0;
11370                 dcc_send_msg((*i).socket,disp,ec);
11371 
11372                 (*i).edit_user++;
11373             }
11374             // on_deop
11375             if((*i).edit_user==2001) {
11376                 string disp;
11377                 int ec=0;
11378 
11379                 disp=lang_get_string(1,(*i).lang,55)+eol; // !!!
11380                 dcc_send_msg((*i).socket,disp,ec);
11381 
11382                 vector<string>::iterator i3;
11383                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11384                     disp=*i3+eol;
11385                     dcc_send_msg((*i).socket,disp,ec);
11386                 }
11387 
11388                 disp=(string)"----------------"+eol;
11389                 dcc_send_msg((*i).socket,disp,ec);
11390 
11391                 disp=lang_get_string(1,(*i).lang,75)+eol; // !!!
11392                 dcc_send_msg((*i).socket,disp,ec);
11393 
11394                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11395                 dcc_send_msg((*i).socket,disp,ec);
11396 
11397                 disp=lang_get_string(1,(*i).lang,133)+eol;
11398                 disp=lang_subst(disp,(*i).user_channel.on_deop);
11399                 dcc_send_msg((*i).socket,disp,ec);
11400 
11401                 disp=lang_get_string(1,(*i).lang,544)+eol;
11402                 dcc_send_msg((*i).socket,disp,ec);
11403 
11404                 (*i).edit_user++;
11405             }
11406             if((*i).edit_user==2002) {
11407                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_deop)) {
11408                     int ec=0;
11409                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11410                     dcc_send_msg((*i).socket,disp,ec);
11411                     (*i).edit_user++;
11412                     return;
11413                 }
11414 
11415                 string p=dcc_get_line((*i).in_buff);
11416                 if(!p.compare(""))
11417                     return;
11418                 vector<string>::iterator i1;
11419                 bool got=false;
11420                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11421                     if(!(*i1).compare(p))
11422                         got=true;
11423                 if(!p.compare(".")) {
11424                     got=true;
11425                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11426                     int ec=0;
11427                     dcc_send_msg((*i).socket,disp,ec);
11428                     (*i).edit_user++;
11429                 } else {
11430                     if(!p.compare("..")) {
11431                         got=true;
11432                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11433                         int ec=0;
11434                         dcc_send_msg((*i).socket,disp,ec);
11435                         (*i).user_channel.on_deop="";
11436                         (*i).edit_user++;
11437                     } else {
11438                         if(!p.compare("!")) {
11439                             vector<s_channel>::iterator i1;
11440                             for(i1=(*i).user_channels.begin(); i1!=(*i).user_channels.end(); i1++)
11441                                 if(!(*i1).channel_name.compare((*i).user_channel.channel_name)) {
11442                                     (*i1).configured=false;
11443                                     (*i).edit_user=2;
11444                                     return;
11445                                 }
11446                         } else {
11447                             string disp;
11448                             if(got)
11449                                 disp=lang_get_string(1,(*i).lang,57)+eol;
11450                                 else
11451                                 disp=lang_get_string(1,(*i).lang,58)+eol;
11452                             int ec=0;
11453                             dcc_send_msg((*i).socket,disp,ec);
11454                             if(got)
11455                                 (*i).user_channel.on_deop=p;
11456                                 else {
11457                                     (*i).edit_user--;
11458                                     return;
11459                                 }
11460                             (*i).edit_user++;
11461                         }
11462                     }
11463                 }
11464             }
11465             // on_ban
11466             if((*i).edit_user==2003) {
11467                 string disp;
11468                 int ec=0;
11469 
11470                 disp=lang_get_string(1,(*i).lang,59)+eol; // !!!
11471                 dcc_send_msg((*i).socket,disp,ec);
11472 
11473                 vector<string>::iterator i3;
11474                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11475                     disp=*i3+eol;
11476                     dcc_send_msg((*i).socket,disp,ec);
11477                 }
11478 
11479                 disp=(string)"----------------"+eol;
11480                 dcc_send_msg((*i).socket,disp,ec);
11481 
11482                 disp=lang_get_string(1,(*i).lang,76)+eol; // !!!
11483                 dcc_send_msg((*i).socket,disp,ec);
11484 
11485                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11486                 dcc_send_msg((*i).socket,disp,ec);
11487 
11488                 disp=lang_get_string(1,(*i).lang,133)+eol;
11489                 disp=lang_subst(disp,(*i).user_channel.on_ban);
11490                 dcc_send_msg((*i).socket,disp,ec);
11491 
11492                 disp=lang_get_string(1,(*i).lang,130)+eol;
11493                 dcc_send_msg((*i).socket,disp,ec);
11494 
11495                 (*i).edit_user++;
11496             }
11497             if((*i).edit_user==2004) {
11498                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_ban)) {
11499                     int ec=0;
11500                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11501                     dcc_send_msg((*i).socket,disp,ec);
11502                     (*i).edit_user++;
11503                     return;
11504                 }
11505 
11506                 string p=dcc_get_line((*i).in_buff);
11507                 if(!p.compare(""))
11508                     return;
11509                 vector<string>::iterator i1;
11510                 bool got=false;
11511                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11512                     if(!(*i1).compare(p))
11513                         got=true;
11514                 if(!p.compare(".")) {
11515                     got=true;
11516                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11517                     int ec=0;
11518                     dcc_send_msg((*i).socket,disp,ec);
11519                     (*i).edit_user++;
11520                 } else {
11521                     if(!p.compare("..")) {
11522                         got=true;
11523                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11524                         int ec=0;
11525                         dcc_send_msg((*i).socket,disp,ec);
11526                         (*i).user_channel.on_ban="";
11527                         (*i).edit_user++;
11528                     } else {
11529                         string disp;
11530                         if(got)
11531                             disp=lang_get_string(1,(*i).lang,57)+eol;
11532                             else
11533                             disp=lang_get_string(1,(*i).lang,58)+eol;
11534                         int ec=0;
11535                         dcc_send_msg((*i).socket,disp,ec);
11536                         if(got)
11537                             (*i).user_channel.on_ban=p;
11538                             else {
11539                                 (*i).edit_user--;
11540                                 return;
11541                             }
11542                         (*i).edit_user++;
11543                     }
11544                 }
11545             }
11546             // on_unban
11547             if((*i).edit_user==2005) {
11548                 string disp;
11549                 int ec=0;
11550 
11551                 disp=lang_get_string(1,(*i).lang,60)+eol; // !!!
11552                 dcc_send_msg((*i).socket,disp,ec);
11553 
11554                 vector<string>::iterator i3;
11555                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11556                     disp=*i3+eol;
11557                     dcc_send_msg((*i).socket,disp,ec);
11558                 }
11559 
11560                 disp=(string)"----------------"+eol;
11561                 dcc_send_msg((*i).socket,disp,ec);
11562 
11563                 disp=lang_get_string(1,(*i).lang,77)+eol; // !!!
11564                 dcc_send_msg((*i).socket,disp,ec);
11565 
11566                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11567                 dcc_send_msg((*i).socket,disp,ec);
11568 
11569                 disp=lang_get_string(1,(*i).lang,133)+eol;
11570                 disp=lang_subst(disp,(*i).user_channel.on_unban);
11571                 dcc_send_msg((*i).socket,disp,ec);
11572 
11573                 disp=lang_get_string(1,(*i).lang,130)+eol;
11574                 dcc_send_msg((*i).socket,disp,ec);
11575 
11576                 (*i).edit_user++;
11577             }
11578 }

Here is the call graph for this function:

void dcc_loop_edit_user2 vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process edit user / new user commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 11588 of file dcc.cpp.

References dcc_can_unassign(), dcc_get_line(), dcc_send_msg(), lang_get_string(), lang_subst(), log_debug(), and ltoa().

Referenced by dcc_loop().

11589 {
11590             if((*i).edit_user==2006) {
11591                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_unban)) {
11592                     int ec=0;
11593                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11594                     dcc_send_msg((*i).socket,disp,ec);
11595                     (*i).edit_user++;
11596                     return;
11597                 }
11598 
11599                 string p=dcc_get_line((*i).in_buff);
11600                 if(!p.compare(""))
11601                     return;
11602                 vector<string>::iterator i1;
11603                 bool got=false;
11604                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11605                     if(!(*i1).compare(p))
11606                         got=true;
11607                 if(!p.compare(".")) {
11608                     got=true;
11609                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11610                     int ec=0;
11611                     dcc_send_msg((*i).socket,disp,ec);
11612                     (*i).edit_user++;
11613                 } else {
11614                     if(!p.compare("..")) {
11615                         got=true;
11616                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11617                         int ec=0;
11618                         dcc_send_msg((*i).socket,disp,ec);
11619                         (*i).user_channel.on_unban="";
11620                         (*i).edit_user++;
11621                     } else {
11622                         string disp;
11623                         if(got)
11624                             disp=lang_get_string(1,(*i).lang,57)+eol;
11625                             else
11626                             disp=lang_get_string(1,(*i).lang,58)+eol;
11627                         int ec=0;
11628                         dcc_send_msg((*i).socket,disp,ec);
11629                         if(got)
11630                             (*i).user_channel.on_unban=p;
11631                             else {
11632                                 (*i).edit_user--;
11633                                 return;
11634                             }
11635                         (*i).edit_user++;
11636                     }
11637                 }
11638             }
11639             // on_kick
11640             if((*i).edit_user==2007) {
11641                 string disp;
11642                 int ec=0;
11643 
11644                 disp=lang_get_string(1,(*i).lang,61)+eol; // !!!
11645                 dcc_send_msg((*i).socket,disp,ec);
11646 
11647                 vector<string>::iterator i3;
11648                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11649                     disp=*i3+eol;
11650                     dcc_send_msg((*i).socket,disp,ec);
11651                 }
11652 
11653                 disp=(string)"----------------"+eol;
11654                 dcc_send_msg((*i).socket,disp,ec);
11655 
11656                 disp=lang_get_string(1,(*i).lang,78)+eol; // !!!
11657                 dcc_send_msg((*i).socket,disp,ec);
11658 
11659                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11660                 dcc_send_msg((*i).socket,disp,ec);
11661 
11662                 disp=lang_get_string(1,(*i).lang,133)+eol;
11663                 disp=lang_subst(disp,(*i).user_channel.on_kick);
11664                 dcc_send_msg((*i).socket,disp,ec);
11665 
11666                 disp=lang_get_string(1,(*i).lang,130)+eol;
11667                 dcc_send_msg((*i).socket,disp,ec);
11668 
11669                 (*i).edit_user++;
11670             }
11671             if((*i).edit_user==2008) {
11672                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_kick)) {
11673                     int ec=0;
11674                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11675                     dcc_send_msg((*i).socket,disp,ec);
11676                     (*i).edit_user++;
11677                     return;
11678                 }
11679 
11680                 string p=dcc_get_line((*i).in_buff);
11681                 if(!p.compare(""))
11682                     return;
11683                 vector<string>::iterator i1;
11684                 bool got=false;
11685                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11686                     if(!(*i1).compare(p))
11687                         got=true;
11688                 if(!p.compare(".")) {
11689                     got=true;
11690                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11691                     int ec=0;
11692                     dcc_send_msg((*i).socket,disp,ec);
11693                     (*i).edit_user++;
11694                 } else {
11695                     if(!p.compare("..")) {
11696                         got=true;
11697                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11698                         int ec=0;
11699                         dcc_send_msg((*i).socket,disp,ec);
11700                         (*i).user_channel.on_kick="";
11701                         (*i).edit_user++;
11702                     } else {
11703                         string disp;
11704                         if(got)
11705                             disp=lang_get_string(1,(*i).lang,57)+eol;
11706                             else
11707                             disp=lang_get_string(1,(*i).lang,58)+eol;
11708                         int ec=0;
11709                         dcc_send_msg((*i).socket,disp,ec);
11710                         if(got)
11711                             (*i).user_channel.on_kick=p;
11712                             else {
11713                                 (*i).edit_user--;
11714                                 return;
11715                             }
11716                         (*i).edit_user++;
11717                     }
11718                 }
11719             }
11720             // on_op
11721             if((*i).edit_user==2009) {
11722                 string disp;
11723                 int ec=0;
11724 
11725                 disp=lang_get_string(1,(*i).lang,62)+eol; // !!!
11726                 dcc_send_msg((*i).socket,disp,ec);
11727 
11728                 vector<string>::iterator i3;
11729                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11730                     disp=*i3+eol;
11731                     dcc_send_msg((*i).socket,disp,ec);
11732                 }
11733 
11734                 disp=(string)"----------------"+eol;
11735                 dcc_send_msg((*i).socket,disp,ec);
11736 
11737                 disp=lang_get_string(1,(*i).lang,79)+eol; // !!!
11738                 dcc_send_msg((*i).socket,disp,ec);
11739 
11740                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11741                 dcc_send_msg((*i).socket,disp,ec);
11742 
11743                 disp=lang_get_string(1,(*i).lang,133)+eol;
11744                 disp=lang_subst(disp,(*i).user_channel.on_op);
11745                 dcc_send_msg((*i).socket,disp,ec);
11746 
11747                 disp=lang_get_string(1,(*i).lang,130)+eol;
11748                 dcc_send_msg((*i).socket,disp,ec);
11749 
11750                 (*i).edit_user++;
11751             }
11752             if((*i).edit_user==2010) {
11753                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_op)) {
11754                     int ec=0;
11755                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11756                     dcc_send_msg((*i).socket,disp,ec);
11757                     (*i).edit_user++;
11758                     return;
11759                 }
11760 
11761                 string p=dcc_get_line((*i).in_buff);
11762                 if(!p.compare(""))
11763                     return;
11764                 vector<string>::iterator i1;
11765                 bool got=false;
11766                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11767                     if(!(*i1).compare(p))
11768                         got=true;
11769                 if(!p.compare(".")) {
11770                     got=true;
11771                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11772                     int ec=0;
11773                     dcc_send_msg((*i).socket,disp,ec);
11774                     (*i).edit_user++;
11775                 } else {
11776                     if(!p.compare("..")) {
11777                         got=true;
11778                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11779                         int ec=0;
11780                         dcc_send_msg((*i).socket,disp,ec);
11781                         (*i).user_channel.on_op="";
11782                         (*i).edit_user++;
11783                     } else {
11784                         string disp;
11785                         if(got)
11786                             disp=lang_get_string(1,(*i).lang,57)+eol;
11787                             else
11788                             disp=lang_get_string(1,(*i).lang,58)+eol;
11789                         int ec=0;
11790                         dcc_send_msg((*i).socket,disp,ec);
11791                         if(got)
11792                             (*i).user_channel.on_op=p;
11793                             else {
11794                                 (*i).edit_user--;
11795                                 return;
11796                             }
11797                         (*i).edit_user++;
11798                     }
11799                 }
11800             }
11801             // on_voice
11802             if((*i).edit_user==2011) {
11803                 string disp;
11804                 int ec=0;
11805 
11806                 disp=lang_get_string(1,(*i).lang,63)+eol; // !!!
11807                 dcc_send_msg((*i).socket,disp,ec);
11808 
11809                 vector<string>::iterator i3;
11810                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11811                     disp=*i3+eol;
11812                     dcc_send_msg((*i).socket,disp,ec);
11813                 }
11814 
11815                 disp=(string)"----------------"+eol;
11816                 dcc_send_msg((*i).socket,disp,ec);
11817 
11818                 disp=lang_get_string(1,(*i).lang,80)+eol; // !!!
11819                 dcc_send_msg((*i).socket,disp,ec);
11820 
11821                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11822                 dcc_send_msg((*i).socket,disp,ec);
11823 
11824                 disp=lang_get_string(1,(*i).lang,133)+eol;
11825                 disp=lang_subst(disp,(*i).user_channel.on_voice);
11826                 dcc_send_msg((*i).socket,disp,ec);
11827 
11828                 disp=lang_get_string(1,(*i).lang,130)+eol;
11829                 dcc_send_msg((*i).socket,disp,ec);
11830 
11831                 (*i).edit_user++;
11832             }
11833             if((*i).edit_user==2012) {
11834                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_voice)) {
11835                     int ec=0;
11836                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11837                     dcc_send_msg((*i).socket,disp,ec);
11838                     (*i).edit_user++;
11839                     return;
11840                 }
11841 
11842                 string p=dcc_get_line((*i).in_buff);
11843                 if(!p.compare(""))
11844                     return;
11845                 vector<string>::iterator i1;
11846                 bool got=false;
11847                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11848                     if(!(*i1).compare(p))
11849                         got=true;
11850                 if(!p.compare(".")) {
11851                     got=true;
11852                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11853                     int ec=0;
11854                     dcc_send_msg((*i).socket,disp,ec);
11855                     (*i).edit_user++;
11856                 } else {
11857                     if(!p.compare("..")) {
11858                         got=true;
11859                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11860                         int ec=0;
11861                         dcc_send_msg((*i).socket,disp,ec);
11862                         (*i).user_channel.on_voice="";
11863                         (*i).edit_user++;
11864                     } else {
11865                         string disp;
11866                         if(got)
11867                             disp=lang_get_string(1,(*i).lang,57)+eol;
11868                             else
11869                             disp=lang_get_string(1,(*i).lang,58)+eol;
11870                         int ec=0;
11871                         dcc_send_msg((*i).socket,disp,ec);
11872                         if(got)
11873                             (*i).user_channel.on_voice=p;
11874                             else {
11875                                 (*i).edit_user--;
11876                                 return;
11877                             }
11878                         (*i).edit_user++;
11879                     }
11880                 }
11881             }
11882             // on_devoice
11883             if((*i).edit_user==2013) {
11884                 string disp;
11885                 int ec=0;
11886 
11887                 disp=lang_get_string(1,(*i).lang,64)+eol; // !!!
11888                 dcc_send_msg((*i).socket,disp,ec);
11889 
11890                 vector<string>::iterator i3;
11891                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11892                     disp=*i3+eol;
11893                     dcc_send_msg((*i).socket,disp,ec);
11894                 }
11895 
11896                 disp=(string)"----------------"+eol;
11897                 dcc_send_msg((*i).socket,disp,ec);
11898 
11899                 disp=lang_get_string(1,(*i).lang,81)+eol; // !!!
11900                 dcc_send_msg((*i).socket,disp,ec);
11901 
11902                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11903                 dcc_send_msg((*i).socket,disp,ec);
11904 
11905                 disp=lang_get_string(1,(*i).lang,133)+eol;
11906                 disp=lang_subst(disp,(*i).user_channel.on_devoice);
11907                 dcc_send_msg((*i).socket,disp,ec);
11908 
11909                 disp=lang_get_string(1,(*i).lang,130)+eol;
11910                 dcc_send_msg((*i).socket,disp,ec);
11911 
11912                 (*i).edit_user++;
11913             }
11914             if((*i).edit_user==2014) {
11915                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_devoice)) {
11916                     int ec=0;
11917                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11918                     dcc_send_msg((*i).socket,disp,ec);
11919                     (*i).edit_user++;
11920                     return;
11921                 }
11922 
11923                 string p=dcc_get_line((*i).in_buff);
11924                 if(!p.compare(""))
11925                     return;
11926                 vector<string>::iterator i1;
11927                 bool got=false;
11928                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
11929                     if(!(*i1).compare(p))
11930                         got=true;
11931                 if(!p.compare(".")) {
11932                     got=true;
11933                     string disp=lang_get_string(1,(*i).lang,131)+eol;
11934                     int ec=0;
11935                     dcc_send_msg((*i).socket,disp,ec);
11936                     (*i).edit_user++;
11937                 } else {
11938                     if(!p.compare("..")) {
11939                         got=true;
11940                         string disp=lang_get_string(1,(*i).lang,132)+eol;
11941                         int ec=0;
11942                         dcc_send_msg((*i).socket,disp,ec);
11943                         (*i).user_channel.on_devoice="";
11944                         (*i).edit_user++;
11945                     } else {
11946                         string disp;
11947                         if(got)
11948                             disp=lang_get_string(1,(*i).lang,57)+eol;
11949                             else
11950                             disp=lang_get_string(1,(*i).lang,58)+eol;
11951                         int ec=0;
11952                         dcc_send_msg((*i).socket,disp,ec);
11953                         if(got)
11954                             (*i).user_channel.on_devoice=p;
11955                             else {
11956                                 (*i).edit_user--;
11957                                 return;
11958                             }
11959                         (*i).edit_user++;
11960                     }
11961                 }
11962             }
11963             // on_creator
11964             if((*i).edit_user==2015) {
11965                 string disp;
11966                 int ec=0;
11967 
11968                 disp=lang_get_string(1,(*i).lang,65)+eol; // !!!
11969                 dcc_send_msg((*i).socket,disp,ec);
11970 
11971                 vector<string>::iterator i3;
11972                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
11973                     disp=*i3+eol;
11974                     dcc_send_msg((*i).socket,disp,ec);
11975                 }
11976 
11977                 disp=(string)"----------------"+eol;
11978                 dcc_send_msg((*i).socket,disp,ec);
11979 
11980                 disp=lang_get_string(1,(*i).lang,82)+eol; // !!!
11981                 dcc_send_msg((*i).socket,disp,ec);
11982 
11983                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
11984                 dcc_send_msg((*i).socket,disp,ec);
11985 
11986                 disp=lang_get_string(1,(*i).lang,133)+eol;
11987                 disp=lang_subst(disp,(*i).user_channel.on_creator);
11988                 dcc_send_msg((*i).socket,disp,ec);
11989 
11990                 disp=lang_get_string(1,(*i).lang,130)+eol;
11991                 dcc_send_msg((*i).socket,disp,ec);
11992 
11993                 (*i).edit_user++;
11994             }
11995             if((*i).edit_user==2016) {
11996                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_creator)) {
11997                     int ec=0;
11998                     string disp=lang_get_string(1,(*i).lang,592)+eol;
11999                     dcc_send_msg((*i).socket,disp,ec);
12000                     (*i).edit_user++;
12001                     return;
12002                 }
12003 
12004                 string p=dcc_get_line((*i).in_buff);
12005                 if(!p.compare(""))
12006                     return;
12007                 vector<string>::iterator i1;
12008                 bool got=false;
12009                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12010                     if(!(*i1).compare(p))
12011                         got=true;
12012                 if(!p.compare(".")) {
12013                     got=true;
12014                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12015                     int ec=0;
12016                     dcc_send_msg((*i).socket,disp,ec);
12017                     (*i).edit_user++;
12018                 } else {
12019                     if(!p.compare("..")) {
12020                         got=true;
12021                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12022                         int ec=0;
12023                         dcc_send_msg((*i).socket,disp,ec);
12024                         (*i).user_channel.on_creator="";
12025                         (*i).edit_user++;
12026                     } else {
12027                         string disp;
12028                         if(got)
12029                             disp=lang_get_string(1,(*i).lang,57)+eol;
12030                             else
12031                             disp=lang_get_string(1,(*i).lang,58)+eol;
12032                         int ec=0;
12033                         dcc_send_msg((*i).socket,disp,ec);
12034                         if(got)
12035                             (*i).user_channel.on_creator=p;
12036                             else {
12037                                 (*i).edit_user--;
12038                                 return;
12039                             }
12040                         (*i).edit_user++;
12041                     }
12042                 }
12043             }
12044             // on_decreator
12045             if((*i).edit_user==2017) {
12046                 string disp;
12047                 int ec=0;
12048 
12049                 disp=lang_get_string(1,(*i).lang,66)+eol; // !!!
12050                 dcc_send_msg((*i).socket,disp,ec);
12051 
12052                 vector<string>::iterator i3;
12053                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12054                     disp=*i3+eol;
12055                     dcc_send_msg((*i).socket,disp,ec);
12056                 }
12057 
12058                 disp=(string)"----------------"+eol;
12059                 dcc_send_msg((*i).socket,disp,ec);
12060 
12061                 disp=lang_get_string(1,(*i).lang,83)+eol; // !!!
12062                 dcc_send_msg((*i).socket,disp,ec);
12063 
12064                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12065                 dcc_send_msg((*i).socket,disp,ec);
12066 
12067                 disp=lang_get_string(1,(*i).lang,133)+eol;
12068                 disp=lang_subst(disp,(*i).user_channel.on_decreator);
12069                 dcc_send_msg((*i).socket,disp,ec);
12070 
12071                 disp=lang_get_string(1,(*i).lang,130)+eol;
12072                 dcc_send_msg((*i).socket,disp,ec);
12073 
12074                 (*i).edit_user++;
12075             }
12076             if((*i).edit_user==2018) {
12077                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_decreator)) {
12078                     int ec=0;
12079                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12080                     dcc_send_msg((*i).socket,disp,ec);
12081                     (*i).edit_user++;
12082                     return;
12083                 }
12084 
12085                 string p=dcc_get_line((*i).in_buff);
12086                 if(!p.compare(""))
12087                     return;
12088                 vector<string>::iterator i1;
12089                 bool got=false;
12090                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12091                     if(!(*i1).compare(p))
12092                         got=true;
12093                 if(!p.compare(".")) {
12094                     got=true;
12095                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12096                     int ec=0;
12097                     dcc_send_msg((*i).socket,disp,ec);
12098                     (*i).edit_user++;
12099                 } else {
12100                     if(!p.compare("..")) {
12101                         got=true;
12102                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12103                         int ec=0;
12104                         dcc_send_msg((*i).socket,disp,ec);
12105                         (*i).user_channel.on_decreator="";
12106                         (*i).edit_user++;
12107                     } else {
12108                         string disp;
12109                         if(got)
12110                             disp=lang_get_string(1,(*i).lang,57)+eol;
12111                             else
12112                             disp=lang_get_string(1,(*i).lang,58)+eol;
12113                         int ec=0;
12114                         dcc_send_msg((*i).socket,disp,ec);
12115                         if(got)
12116                             (*i).user_channel.on_decreator=p;
12117                             else {
12118                                 (*i).edit_user--;
12119                                 return;
12120                             }
12121                         (*i).edit_user++;
12122                     }
12123                 }
12124             }
12125             // on_join
12126             if((*i).edit_user==2019) {
12127                 string disp;
12128                 int ec=0;
12129 
12130                 disp=lang_get_string(1,(*i).lang,67)+eol; // !!!
12131                 dcc_send_msg((*i).socket,disp,ec);
12132 
12133                 vector<string>::iterator i3;
12134                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12135                     disp=*i3+eol;
12136                     dcc_send_msg((*i).socket,disp,ec);
12137                 }
12138 
12139                 disp=(string)"----------------"+eol;
12140                 dcc_send_msg((*i).socket,disp,ec);
12141 
12142                 disp=lang_get_string(1,(*i).lang,84)+eol; // !!!
12143                 dcc_send_msg((*i).socket,disp,ec);
12144 
12145                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12146                 dcc_send_msg((*i).socket,disp,ec);
12147 
12148                 disp=lang_get_string(1,(*i).lang,133)+eol;
12149                 disp=lang_subst(disp,(*i).user_channel.on_join);
12150                 dcc_send_msg((*i).socket,disp,ec);
12151 
12152                 disp=lang_get_string(1,(*i).lang,130)+eol;
12153                 dcc_send_msg((*i).socket,disp,ec);
12154 
12155                 (*i).edit_user++;
12156             }
12157             if((*i).edit_user==2020) {
12158                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_join)) {
12159                     int ec=0;
12160                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12161                     dcc_send_msg((*i).socket,disp,ec);
12162                     (*i).edit_user++;
12163                     return;
12164                 }
12165 
12166                 string p=dcc_get_line((*i).in_buff);
12167                 if(!p.compare(""))
12168                     return;
12169                 vector<string>::iterator i1;
12170                 bool got=false;
12171                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12172                     if(!(*i1).compare(p))
12173                         got=true;
12174                 if(!p.compare(".")) {
12175                     got=true;
12176                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12177                     int ec=0;
12178                     dcc_send_msg((*i).socket,disp,ec);
12179                     (*i).edit_user++;
12180                 } else {
12181                     if(!p.compare("..")) {
12182                         got=true;
12183                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12184                         int ec=0;
12185                         dcc_send_msg((*i).socket,disp,ec);
12186                         (*i).user_channel.on_join="";
12187                         (*i).edit_user++;
12188                     } else {
12189                         string disp;
12190                         if(got)
12191                             disp=lang_get_string(1,(*i).lang,57)+eol;
12192                             else
12193                             disp=lang_get_string(1,(*i).lang,58)+eol;
12194                         int ec=0;
12195                         dcc_send_msg((*i).socket,disp,ec);
12196                         if(got)
12197                             (*i).user_channel.on_join=p;
12198                             else {
12199                                 (*i).edit_user--;
12200                                 return;
12201                             }
12202                         (*i).edit_user++;
12203                     }
12204                 }
12205             }
12206             // on_banned
12207             if((*i).edit_user==2021) {
12208                 string disp;
12209                 int ec=0;
12210 
12211                 disp=lang_get_string(1,(*i).lang,68)+eol; // !!!
12212                 dcc_send_msg((*i).socket,disp,ec);
12213 
12214                 vector<string>::iterator i3;
12215                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12216                     disp=*i3+eol;
12217                     dcc_send_msg((*i).socket,disp,ec);
12218                 }
12219 
12220                 disp=(string)"----------------"+eol;
12221                 dcc_send_msg((*i).socket,disp,ec);
12222 
12223                 disp=lang_get_string(1,(*i).lang,85)+eol; // !!!
12224                 dcc_send_msg((*i).socket,disp,ec);
12225 
12226                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12227                 dcc_send_msg((*i).socket,disp,ec);
12228 
12229                 disp=lang_get_string(1,(*i).lang,133)+eol;
12230                 disp=lang_subst(disp,(*i).user_channel.on_banned);
12231                 dcc_send_msg((*i).socket,disp,ec);
12232 
12233                 disp=lang_get_string(1,(*i).lang,130)+eol;
12234                 dcc_send_msg((*i).socket,disp,ec);
12235 
12236                 (*i).edit_user++;
12237             }
12238             if((*i).edit_user==2022) {
12239                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_banned)) {
12240                     int ec=0;
12241                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12242                     dcc_send_msg((*i).socket,disp,ec);
12243                     (*i).edit_user++;
12244                     return;
12245                 }
12246 
12247                 string p=dcc_get_line((*i).in_buff);
12248                 if(!p.compare(""))
12249                     return;
12250                 vector<string>::iterator i1;
12251                 bool got=false;
12252                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12253                     if(!(*i1).compare(p))
12254                         got=true;
12255                 if(!p.compare(".")) {
12256                     got=true;
12257                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12258                     int ec=0;
12259                     dcc_send_msg((*i).socket,disp,ec);
12260                     (*i).edit_user++;
12261                 } else {
12262                     if(!p.compare("..")) {
12263                         got=true;
12264                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12265                         int ec=0;
12266                         dcc_send_msg((*i).socket,disp,ec);
12267                         (*i).user_channel.on_banned="";
12268                         (*i).edit_user++;
12269                     } else {
12270                         string disp;
12271                         if(got)
12272                             disp=lang_get_string(1,(*i).lang,57)+eol;
12273                             else
12274                             disp=lang_get_string(1,(*i).lang,58)+eol;
12275                         int ec=0;
12276                         dcc_send_msg((*i).socket,disp,ec);
12277                         if(got)
12278                             (*i).user_channel.on_banned=p;
12279                             else {
12280                                 (*i).edit_user--;
12281                                 return;
12282                             }
12283                         (*i).edit_user++;
12284                     }
12285                 }
12286             }
12287             // on_flood
12288             if((*i).edit_user==2023) {
12289                 string disp;
12290                 int ec=0;
12291 
12292                 disp=lang_get_string(1,(*i).lang,146)+eol; // !!!
12293                 dcc_send_msg((*i).socket,disp,ec);
12294 
12295                 vector<string>::iterator i3;
12296                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12297                     disp=*i3+eol;
12298                     dcc_send_msg((*i).socket,disp,ec);
12299                 }
12300 
12301                 disp=(string)"----------------"+eol;
12302                 dcc_send_msg((*i).socket,disp,ec);
12303 
12304                 disp=lang_get_string(1,(*i).lang,147)+eol; // !!!
12305                 dcc_send_msg((*i).socket,disp,ec);
12306 
12307                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12308                 dcc_send_msg((*i).socket,disp,ec);
12309 
12310                 disp=lang_get_string(1,(*i).lang,133)+eol;
12311                 disp=lang_subst(disp,(*i).user_channel.on_flood);
12312                 dcc_send_msg((*i).socket,disp,ec);
12313 
12314                 disp=lang_get_string(1,(*i).lang,130)+eol;
12315                 dcc_send_msg((*i).socket,disp,ec);
12316 
12317                 (*i).edit_user++;
12318             }
12319             if((*i).edit_user==2024) {
12320                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_flood)) {
12321                     int ec=0;
12322                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12323                     dcc_send_msg((*i).socket,disp,ec);
12324                     (*i).edit_user++;
12325                     return;
12326                 }
12327 
12328                 string p=dcc_get_line((*i).in_buff);
12329                 if(!p.compare(""))
12330                     return;
12331                 vector<string>::iterator i1;
12332                 bool got=false;
12333                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12334                     if(!(*i1).compare(p))
12335                         got=true;
12336                 if(!p.compare(".")) {
12337                     got=true;
12338                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12339                     int ec=0;
12340                     dcc_send_msg((*i).socket,disp,ec);
12341                     (*i).edit_user++;
12342                 } else {
12343                     if(!p.compare("..")) {
12344                         got=true;
12345                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12346                         int ec=0;
12347                         dcc_send_msg((*i).socket,disp,ec);
12348                         (*i).user_channel.on_flood="";
12349                         (*i).edit_user++;
12350                     } else {
12351                         string disp;
12352                         if(got)
12353                             disp=lang_get_string(1,(*i).lang,57)+eol;
12354                             else
12355                             disp=lang_get_string(1,(*i).lang,58)+eol;
12356                         int ec=0;
12357                         dcc_send_msg((*i).socket,disp,ec);
12358                         if(got)
12359                             (*i).user_channel.on_flood=p;
12360                             else {
12361                                 (*i).edit_user--;
12362                                 return;
12363                             }
12364                         (*i).edit_user++;
12365                     }
12366                 }
12367             }
12368             // on_privmsg
12369             if((*i).edit_user==2025) {
12370                 string disp;
12371                 int ec=0;
12372 
12373                 disp=lang_get_string(1,(*i).lang,164)+eol; // !!!
12374                 dcc_send_msg((*i).socket,disp,ec);
12375 
12376                 vector<string>::iterator i3;
12377                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12378                     disp=*i3+eol;
12379                     dcc_send_msg((*i).socket,disp,ec);
12380                 }
12381 
12382                 disp=(string)"----------------"+eol;
12383                 dcc_send_msg((*i).socket,disp,ec);
12384 
12385                 disp=lang_get_string(1,(*i).lang,165)+eol; // !!!
12386                 dcc_send_msg((*i).socket,disp,ec);
12387 
12388                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12389                 dcc_send_msg((*i).socket,disp,ec);
12390 
12391                 disp=lang_get_string(1,(*i).lang,133)+eol;
12392                 disp=lang_subst(disp,(*i).user_channel.on_privmsg);
12393                 dcc_send_msg((*i).socket,disp,ec);
12394 
12395                 disp=lang_get_string(1,(*i).lang,130)+eol;
12396                 dcc_send_msg((*i).socket,disp,ec);
12397 
12398                 (*i).edit_user++;
12399             }
12400             if((*i).edit_user==2026) {
12401                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_privmsg)) {
12402                     int ec=0;
12403                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12404                     dcc_send_msg((*i).socket,disp,ec);
12405                     (*i).edit_user++;
12406                     return;
12407                 }
12408 
12409                 string p=dcc_get_line((*i).in_buff);
12410                 if(!p.compare(""))
12411                     return;
12412                 vector<string>::iterator i1;
12413                 bool got=false;
12414                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12415                     if(!(*i1).compare(p))
12416                         got=true;
12417                 if(!p.compare(".")) {
12418                     got=true;
12419                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12420                     int ec=0;
12421                     dcc_send_msg((*i).socket,disp,ec);
12422                     (*i).edit_user++;
12423                 } else {
12424                     if(!p.compare("..")) {
12425                         got=true;
12426                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12427                         int ec=0;
12428                         dcc_send_msg((*i).socket,disp,ec);
12429                         (*i).user_channel.on_privmsg="";
12430                         (*i).edit_user++;
12431                     } else {
12432                         string disp;
12433                         if(got)
12434                             disp=lang_get_string(1,(*i).lang,57)+eol;
12435                             else
12436                             disp=lang_get_string(1,(*i).lang,58)+eol;
12437                         int ec=0;
12438                         dcc_send_msg((*i).socket,disp,ec);
12439                         if(got)
12440                             (*i).user_channel.on_privmsg=p;
12441                             else {
12442                                 (*i).edit_user--;
12443                                 return;
12444                             }
12445                         (*i).edit_user++;
12446                     }
12447                 }
12448             }
12449 
12450             // on_notice
12451             if((*i).edit_user==2027) {
12452                 string disp;
12453                 int ec=0;
12454 
12455                 disp=lang_get_string(1,(*i).lang,601)+eol; // !!!
12456                 dcc_send_msg((*i).socket,disp,ec);
12457 
12458                 vector<string>::iterator i3;
12459                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12460                     disp=*i3+eol;
12461                     dcc_send_msg((*i).socket,disp,ec);
12462                 }
12463 
12464                 disp=(string)"----------------"+eol;
12465                 dcc_send_msg((*i).socket,disp,ec);
12466 
12467                 disp=lang_get_string(1,(*i).lang,602)+eol; // !!!
12468                 dcc_send_msg((*i).socket,disp,ec);
12469 
12470                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12471                 dcc_send_msg((*i).socket,disp,ec);
12472 
12473                 disp=lang_get_string(1,(*i).lang,133)+eol;
12474                 disp=lang_subst(disp,(*i).user_channel.on_privmsg);
12475                 dcc_send_msg((*i).socket,disp,ec);
12476 
12477                 disp=lang_get_string(1,(*i).lang,130)+eol;
12478                 dcc_send_msg((*i).socket,disp,ec);
12479 
12480                 (*i).edit_user++;
12481             }
12482             if((*i).edit_user==2028) {
12483                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_notice)) {
12484                     int ec=0;
12485                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12486                     dcc_send_msg((*i).socket,disp,ec);
12487                     (*i).edit_user++;
12488                     return;
12489                 }
12490 
12491                 string p=dcc_get_line((*i).in_buff);
12492                 if(!p.compare(""))
12493                     return;
12494                 vector<string>::iterator i1;
12495                 bool got=false;
12496                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12497                     if(!(*i1).compare(p))
12498                         got=true;
12499                 if(!p.compare(".")) {
12500                     got=true;
12501                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12502                     int ec=0;
12503                     dcc_send_msg((*i).socket,disp,ec);
12504                     (*i).edit_user++;
12505                 } else {
12506                     if(!p.compare("..")) {
12507                         got=true;
12508                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12509                         int ec=0;
12510                         dcc_send_msg((*i).socket,disp,ec);
12511                         (*i).user_channel.on_notice="";
12512                         (*i).edit_user++;
12513                     } else {
12514                         string disp;
12515                         if(got)
12516                             disp=lang_get_string(1,(*i).lang,57)+eol;
12517                             else
12518                             disp=lang_get_string(1,(*i).lang,58)+eol;
12519                         int ec=0;
12520                         dcc_send_msg((*i).socket,disp,ec);
12521                         if(got)
12522                             (*i).user_channel.on_notice=p;
12523                             else {
12524                                 (*i).edit_user--;
12525                                 return;
12526                             }
12527                         (*i).edit_user++;
12528                     }
12529                 }
12530             }
12531 
12532             // on_other_mode
12533             if((*i).edit_user==2029) {
12534                 string disp;
12535                 int ec=0;
12536 
12537                 disp=lang_get_string(1,(*i).lang,564)+eol; // !!!
12538                 dcc_send_msg((*i).socket,disp,ec);
12539 
12540                 vector<string>::iterator i3;
12541                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
12542                     disp=*i3+eol;
12543                     dcc_send_msg((*i).socket,disp,ec);
12544                 }
12545 
12546                 disp=(string)"----------------"+eol;
12547                 dcc_send_msg((*i).socket,disp,ec);
12548 
12549                 disp=lang_get_string(1,(*i).lang,565)+eol; // !!!
12550                 dcc_send_msg((*i).socket,disp,ec);
12551 
12552                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
12553                 dcc_send_msg((*i).socket,disp,ec);
12554 
12555                 disp=lang_get_string(1,(*i).lang,133)+eol;
12556                 disp=lang_subst(disp,(*i).user_channel.on_privmsg);
12557                 dcc_send_msg((*i).socket,disp,ec);
12558 
12559                 disp=lang_get_string(1,(*i).lang,130)+eol;
12560                 dcc_send_msg((*i).socket,disp,ec);
12561 
12562                 (*i).edit_user++;
12563             }
12564             if((*i).edit_user==2030) {
12565                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_other_mode)) {
12566                     int ec=0;
12567                     string disp=lang_get_string(1,(*i).lang,592)+eol;
12568                     dcc_send_msg((*i).socket,disp,ec);
12569                     (*i).edit_user++;
12570                     return;
12571                 }
12572 
12573                 string p=dcc_get_line((*i).in_buff);
12574                 if(!p.compare(""))
12575                     return;
12576                 vector<string>::iterator i1;
12577                 bool got=false;
12578                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
12579                     if(!(*i1).compare(p))
12580                         got=true;
12581                 if(!p.compare(".")) {
12582                     got=true;
12583                     string disp=lang_get_string(1,(*i).lang,131)+eol;
12584                     int ec=0;
12585                     dcc_send_msg((*i).socket,disp,ec);
12586                     (*i).edit_user++;
12587                 } else {
12588                     if(!p.compare("..")) {
12589                         got=true;
12590                         string disp=lang_get_string(1,(*i).lang,132)+eol;
12591                         int ec=0;
12592                         dcc_send_msg((*i).socket,disp,ec);
12593                         (*i).user_channel.on_other_mode="";
12594                         (*i).edit_user++;
12595                     } else {
12596                         string disp;
12597                         if(got)
12598                             disp=lang_get_string(1,(*i).lang,57)+eol;
12599                             else
12600                             disp=lang_get_string(1,(*i).lang,58)+eol;
12601                         int ec=0;
12602                         dcc_send_msg((*i).socket,disp,ec);
12603                         if(got)
12604                             (*i).user_channel.on_other_mode=p;
12605                             else {
12606                                 (*i).edit_user--;
12607                                 return;
12608                             }
12609                         (*i).edit_user++;
12610                     }
12611                 }
12612             }
12613             // msg_flood
12614             if((*i).edit_user==2031) {
12615                 string disp;
12616                 int ec=0;
12617 
12618                 disp=lang_get_string(1,(*i).lang,153)+eol; // !!!
12619                 dcc_send_msg((*i).socket,disp,ec);
12620 
12621                 (*i).edit_user++;
12622             }
12623             if((*i).edit_user==2032) {
12624                 string p=dcc_get_line((*i).in_buff);
12625                 if(!p.compare(""))
12626                     return;
12627                 if(!p.compare(".")) {
12628                     (*i).edit_user++;
12629                 } else {
12630                     if(!p.compare("0"))
12631                         p="0 0";
12632                     string lines, seconds;
12633                     int pos=0;
12634                     for(unsigned int i1=0; i1<p.length(); i1++) {
12635                         if(p[i1]==0x20) {
12636                             pos++;
12637                             continue;
12638                         }
12639                         if(pos==0)
12640                             lines+=p[i1];
12641                         if(pos==1)
12642                             seconds+=p[i1];
12643                     }
12644                     string disp;
12645                     (*i).user_channel.msg_flood.lines=atol(lines.c_str());
12646                     (*i).user_channel.msg_flood.seconds=atol(seconds.c_str());
12647                     (*i).edit_user++;
12648                 }
12649             }
12650             // notice_flood
12651             if((*i).edit_user==2033) {
12652                 string disp;
12653                 int ec=0;
12654 
12655                 disp=lang_get_string(1,(*i).lang,154)+eol; // !!!
12656                 dcc_send_msg((*i).socket,disp,ec);
12657 
12658                 (*i).edit_user++;
12659             }
12660             if((*i).edit_user==2034) {
12661                 string p=dcc_get_line((*i).in_buff);
12662                 if(!p.compare(""))
12663                     return;
12664                 if(!p.compare(".")) {
12665                     (*i).edit_user++;
12666                 } else {
12667                     if(!p.compare("0"))
12668                         p="0 0";
12669                     string lines, seconds;
12670                     int pos=0;
12671                     for(unsigned int i1=0; i1<p.length(); i1++) {
12672                         if(p[i1]==0x20) {
12673                             pos++;
12674                             continue;
12675                         }
12676                         if(pos==0)
12677                             lines+=p[i1];
12678                         if(pos==1)
12679                             seconds+=p[i1];
12680                     }
12681                     string disp;
12682                     (*i).user_channel.notice_flood.lines=atol(lines.c_str());
12683                     (*i).user_channel.notice_flood.seconds=atol(seconds.c_str());
12684                     (*i).edit_user++;
12685                 }
12686             }
12687             // repeat_flood
12688             if((*i).edit_user==2035) {
12689                 string disp;
12690                 int ec=0;
12691 
12692                 disp=lang_get_string(1,(*i).lang,155)+eol; // !!!
12693                 dcc_send_msg((*i).socket,disp,ec);
12694 
12695                 (*i).edit_user++;
12696             }
12697             if((*i).edit_user==2036) {
12698                 string p=dcc_get_line((*i).in_buff);
12699                 if(!p.compare(""))
12700                     return;
12701                 if(!p.compare(".")) {
12702                     (*i).edit_user++;
12703                 } else {
12704                     if(!p.compare("0"))
12705                         p="0 0";
12706                     string lines, seconds;
12707                     int pos=0;
12708                     for(unsigned int i1=0; i1<p.length(); i1++) {
12709                         if(p[i1]==0x20) {
12710                             pos++;
12711                             continue;
12712                         }
12713                         if(pos==0)
12714                             lines+=p[i1];
12715                         if(pos==1)
12716                             seconds+=p[i1];
12717                     }
12718                     string disp;
12719                     (*i).user_channel.repeat_flood.lines=atol(lines.c_str());
12720                     (*i).user_channel.repeat_flood.seconds=atol(seconds.c_str());
12721                     (*i).edit_user++;
12722                 }
12723             }
12724             // nick_flood
12725             if((*i).edit_user==2037) {
12726                 string disp;
12727                 int ec=0;
12728 
12729                 disp=lang_get_string(1,(*i).lang,156)+eol; // !!!
12730                 dcc_send_msg((*i).socket,disp,ec);
12731 
12732                 (*i).edit_user++;
12733             }
12734             if((*i).edit_user==2038) {
12735                 string p=dcc_get_line((*i).in_buff);
12736                 if(!p.compare(""))
12737                     return;
12738                 if(!p.compare(".")) {
12739                     (*i).edit_user++;
12740                 } else {
12741                     if(!p.compare("0"))
12742                         p="0 0";
12743                     string lines, seconds;
12744                     int pos=0;
12745                     for(unsigned int i1=0; i1<p.length(); i1++) {
12746                         if(p[i1]==0x20) {
12747                             pos++;
12748                             continue;
12749                         }
12750                         if(pos==0)
12751                             lines+=p[i1];
12752                         if(pos==1)
12753                             seconds+=p[i1];
12754                     }
12755                     string disp;
12756                     (*i).user_channel.nick_flood.lines=atol(lines.c_str());
12757                     (*i).user_channel.nick_flood.seconds=atol(seconds.c_str());
12758                     (*i).edit_user++;
12759                 }
12760             }
12761             // join_flood
12762             if((*i).edit_user==2039) {
12763                 string disp;
12764                 int ec=0;
12765 
12766                 disp=lang_get_string(1,(*i).lang,157)+eol; // !!!
12767                 dcc_send_msg((*i).socket,disp,ec);
12768 
12769                 (*i).edit_user++;
12770             }
12771             if((*i).edit_user==2040) {
12772                 string p=dcc_get_line((*i).in_buff);
12773                 if(!p.compare(""))
12774                     return;
12775                 if(!p.compare(".")) {
12776                     (*i).edit_user++;
12777                 } else {
12778                     if(!p.compare("0"))
12779                         p="0 0";
12780                     string lines, seconds;
12781                     int pos=0;
12782                     for(unsigned int i1=0; i1<p.length(); i1++) {
12783                         if(p[i1]==0x20) {
12784                             pos++;
12785                             continue;
12786                         }
12787                         if(pos==0)
12788                             lines+=p[i1];
12789                         if(pos==1)
12790                             seconds+=p[i1];
12791                     }
12792                     string disp;
12793                     (*i).user_channel.join_flood.lines=atol(lines.c_str());
12794                     (*i).user_channel.join_flood.seconds=atol(seconds.c_str());
12795                     (*i).edit_user++;
12796                 }
12797             }
12798             // mode_flood
12799             if((*i).edit_user==2041) {
12800                 string disp;
12801                 int ec=0;
12802 
12803                 disp=lang_get_string(1,(*i).lang,159)+eol; // !!!
12804                 dcc_send_msg((*i).socket,disp,ec);
12805 
12806                 (*i).edit_user++;
12807             }
12808             if((*i).edit_user==2042) {
12809                 string p=dcc_get_line((*i).in_buff);
12810                 if(!p.compare(""))
12811                     return;
12812                 if(!p.compare(".")) {
12813                     (*i).edit_user++;
12814                 } else {
12815                     if(!p.compare("0"))
12816                         p="0 0";
12817                     string lines, seconds;
12818                     int pos=0;
12819                     for(unsigned int i1=0; i1<p.length(); i1++) {
12820                         if(p[i1]==0x20) {
12821                             pos++;
12822                             continue;
12823                         }
12824                         if(pos==0)
12825                             lines+=p[i1];
12826                         if(pos==1)
12827                             seconds+=p[i1];
12828                     }
12829                     string disp;
12830                     (*i).user_channel.mode_flood.lines=atol(lines.c_str());
12831                     (*i).user_channel.mode_flood.seconds=atol(seconds.c_str());
12832                     (*i).edit_user=2100;
12833                     return;
12834                 }
12835             }
12836             // ctcp_flood
12837             if((*i).edit_user==2100) {
12838                 string disp;
12839                 int ec=0;
12840 
12841                 disp=lang_get_string(1,(*i).lang,385)+eol; // !!!
12842                 dcc_send_msg((*i).socket,disp,ec);
12843 
12844                 (*i).edit_user++;
12845             }
12846             if((*i).edit_user==2101) {
12847                 string p=dcc_get_line((*i).in_buff);
12848                 if(!p.compare(""))
12849                     return;
12850                 if(!p.compare(".")) {
12851                     (*i).edit_user++;
12852                 } else {
12853                     if(!p.compare("0"))
12854                         p="0 0";
12855                     string lines, seconds;
12856                     int pos=0;
12857                     for(unsigned int i1=0; i1<p.length(); i1++) {
12858                         if(p[i1]==0x20) {
12859                             pos++;
12860                             continue;
12861                         }
12862                         if(pos==0)
12863                             lines+=p[i1];
12864                         if(pos==1)
12865                             seconds+=p[i1];
12866                     }
12867                     string disp;
12868                     (*i).user_channel.ctcp_flood.lines=atol(lines.c_str());
12869                     (*i).user_channel.ctcp_flood.seconds=atol(seconds.c_str());
12870                     (*i).edit_user++;
12871                 }
12872             }
12873             // can_send_unknown
12874             if((*i).edit_user==2102) {
12875                 string disp;
12876                 int ec=0;
12877 
12878                 disp=lang_get_string(1,(*i).lang,475)+eol; // !!!
12879                 dcc_send_msg((*i).socket,disp,ec);
12880 
12881                 (*i).edit_user++;
12882                 return;
12883             }
12884             if((*i).edit_user==2103) {
12885                 string p=dcc_get_line((*i).in_buff);
12886                 if(p.empty())
12887                     return;
12888 
12889                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
12890                     string disp=lang_get_string(1,(*i).lang,475)+eol;
12891                     int ec=0;
12892                     dcc_send_msg((*i).socket,disp,ec);
12893                 } else {
12894                     if(!p.compare("n") || !p.compare("N")) {
12895                         (*i).user_channel.can_send_unknown_users=false;
12896                     } else {
12897                         (*i).user_channel.can_send_unknown_users=true;
12898                     }
12899                     (*i).edit_user=2039;
12900                 }
12901                 return;
12902             }
12903 
12904             // allow_dynamic
12905             if((*i).edit_user==2039) {
12906                 string disp=lang_get_string(1,(*i).lang,218)+eol;
12907                 int ec=0;
12908                 dcc_send_msg((*i).socket,disp,ec);
12909                 disp="";
12910                 int i2=1;
12911                 vector<s_dynamic_rule>::iterator i1;
12912                 for(i1=(*i).user_channel.allow_dynamic.begin(); i1!=(*i).user_channel.allow_dynamic.end(); i1++, i2++) {
12913                     char tmp[64];
12914                     ltoa(i2,tmp,10);
12915                     disp+=lang_get_string(1,(*i).lang,593);
12916                     if(i2<10)
12917                         disp+="0";
12918                     if(i2<100)
12919                         disp+="0";
12920                     disp+=(string)tmp+": "+(*i1).group+";"+(*i1).plus_modes+";"+(*i1).minus_modes+eol;
12921                 }
12922                 dcc_send_msg((*i).socket,disp,ec);
12923                 disp=lang_get_string(1,(*i).lang,219)+eol;
12924                 dcc_send_msg((*i).socket,disp,ec);
12925                 (*i).edit_user++;
12926             }
12927             if((*i).edit_user==2040) {
12928                 string p=dcc_get_line((*i).in_buff);
12929                 if(!p.compare(""))
12930                     return;
12931                 bool got=false;
12932                 if(!p.compare(".")) {
12933                     got=true;
12934                     (*i).edit_user=2044;
12935                 }
12936                 if(!p.compare(".add")) {
12937                     got=true;
12938                     string disp=lang_get_string(1,(*i).lang,211)+eol;
12939                     int ec=0;
12940                     dcc_send_msg((*i).socket,disp,ec);
12941 
12942                     vector<string>::iterator i1;
12943                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
12944                         disp=(*i1)+eol;
12945                         dcc_send_msg((*i).socket,disp,ec);
12946                     }
12947 
12948                     (*i).user_channel_allow_dynamic.group="";
12949                     (*i).user_channel_allow_dynamic.plus_modes="";
12950                     (*i).user_channel_allow_dynamic.minus_modes="";
12951 
12952                     (*i).edit_user=2041;
12953                 }
12954                 string p1, p2;
12955                 int pos=0;
12956                 for(unsigned int i1=0; i1<p.length(); i1++) {
12957                     if(p[i1]==0x20) {
12958                         pos=1;
12959                         continue;
12960                     }
12961                     if(pos==0)
12962                         p1+=p[i1];
12963                     if(pos==1)
12964                         p2+=p[i1];
12965                 }
12966                 if(!p1.compare(".remove")) {
12967                     got=true;
12968                     int line=atol(p2.c_str());
12969 
12970                     int i2=1;
12971                     vector<s_dynamic_rule>::iterator i1;
12972                     for(i1=(*i).user_channel.allow_dynamic.begin(); i1!=(*i).user_channel.allow_dynamic.end(); i1++, i2++)
12973                         if(i2==line) {
12974                             (*i).user_channel.allow_dynamic.erase(i1);
12975                             break;
12976                         }
12977                     (*i).edit_user=2039;
12978                 }
12979                 if(!got) {
12980                     string disp=lang_get_string(1,(*i).lang,219)+eol;
12981                     int ec=0;
12982                     dcc_send_msg((*i).socket,disp,ec);
12983                 }
12984             }
12985             if((*i).edit_user==2041) {
12986                 string p=dcc_get_line((*i).in_buff);
12987                 if(!p.compare(""))
12988                     return;
12989 
12990                 vector<string>::iterator i1;
12991                 bool got=false;
12992                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
12993                     if(!(*i1).compare(p))
12994                         got=true;
12995                 string disp;
12996                 if(got)
12997                     disp=lang_get_string(1,(*i).lang,212)+eol;
12998                     else
12999                     disp=lang_get_string(1,(*i).lang,214)+eol;
13000                 int ec=0;
13001                 dcc_send_msg((*i).socket,disp,ec);
13002                 p=(string)"\""+p+"\"";
13003                 if(got)
13004                     (*i).user_channel_allow_dynamic.group=p;
13005 
13006                 (*i).edit_user++;
13007             }
13008             if((*i).edit_user==2042) {
13009                 string p=dcc_get_line((*i).in_buff);
13010                 if(!p.compare(""))
13011                     return;
13012                 if(!p.compare("."))
13013                     p="";
13014                 p=(string)"\""+p+"\"";
13015                 (*i).user_channel_allow_dynamic.plus_modes=p;
13016 
13017                 string disp;
13018                 int ec=0;
13019 
13020                 disp=lang_get_string(1,(*i).lang,213)+eol; // !!!
13021                 dcc_send_msg((*i).socket,disp,ec);
13022                 (*i).edit_user++;
13023             }
13024             if((*i).edit_user==2043) {
13025                 string p=dcc_get_line((*i).in_buff);
13026                 if(!p.compare(""))
13027                     return;
13028                 if(!p.compare("."))
13029                     p="";
13030                 p=(string)"\""+p+"\"";
13031                 (*i).user_channel_allow_dynamic.minus_modes=p;
13032 
13033                 (*i).user_channel.allow_dynamic.push_back((*i).user_channel_allow_dynamic);
13034 
13035                 (*i).edit_user=2039;
13036             }
13037             //
13038             if((*i).edit_user==2044) {
13039                 string chan;
13040                 vector<s_channel>::iterator i1;
13041                 int i2=1;
13042                 for(i1=(*i).user_channels.begin(); i1!=(*i).user_channels.end(); i1++, i2++)
13043                     if(i2==(*i).edit_channel_num) {
13044                         chan=(*i1).channel_name;
13045                         break;
13046                     }
13047                 if(!chan.compare("")) {
13048                     (*i).edit_user=2;
13049                     log_debug("in file " __FILE__ " in function " __FUNC__ " occurred error: cannot find channel to edit! (#2) huh?!");
13050                     return;
13051                 }
13052                 (*i1).on_deop=(*i).user_channel.on_deop;
13053                 (*i1).on_ban=(*i).user_channel.on_ban;
13054                 (*i1).on_unban=(*i).user_channel.on_unban;
13055                 (*i1).on_kick=(*i).user_channel.on_kick;
13056                 (*i1).on_op=(*i).user_channel.on_op;
13057                 (*i1).on_voice=(*i).user_channel.on_voice;
13058                 (*i1).on_devoice=(*i).user_channel.on_devoice;
13059                 (*i1).on_creator=(*i).user_channel.on_creator;
13060                 (*i1).on_decreator=(*i).user_channel.on_decreator;
13061                 (*i1).on_join=(*i).user_channel.on_join;
13062                 (*i1).on_banned=(*i).user_channel.on_banned;
13063                 (*i1).on_flood=(*i).user_channel.on_flood;
13064                 (*i1).on_privmsg=(*i).user_channel.on_privmsg;
13065                 (*i1).on_notice=(*i).user_channel.on_notice;
13066                 (*i1).on_other_mode=(*i).user_channel.on_other_mode;
13067 
13068                 (*i1).msg_flood=(*i).user_channel.msg_flood;
13069                 (*i1).notice_flood=(*i).user_channel.notice_flood;
13070                 (*i1).repeat_flood=(*i).user_channel.repeat_flood;
13071                 (*i1).nick_flood=(*i).user_channel.nick_flood;
13072                 (*i1).join_flood=(*i).user_channel.join_flood;
13073                 (*i1).mode_flood=(*i).user_channel.mode_flood;
13074                 (*i1).ctcp_flood=(*i).user_channel.ctcp_flood;
13075                 (*i1).configured=true;
13076 
13077                 (*i1).allow_dynamic.clear();
13078                 vector<s_dynamic_rule>::iterator i3;
13079                 for(i3=(*i).user_channel.allow_dynamic.begin(); i3!=(*i).user_channel.allow_dynamic.end(); i3++)
13080                     (*i1).allow_dynamic.push_back(*i3);
13081 
13082                 (*i).edit_user=2;
13083             }
13084             // type .commands
13085             if((*i).edit_user==1100) {
13086                 if(!(*i).access_grant_backup) {
13087                     string disp;
13088                     int ec=0;
13089                     disp=lang_get_string(1,(*i).lang,173)+eol; // !!!
13090                     dcc_send_msg((*i).socket,disp,ec);
13091 
13092                     (*i).edit_user+=2;
13093                     return;
13094                 }
13095                 string disp;
13096                 int ec=0;
13097 
13098                 disp=lang_get_string(1,(*i).lang,168)+eol; // !!!
13099                 dcc_send_msg((*i).socket,disp,ec);
13100 
13101                 (*i).edit_user++;
13102             }
13103             if((*i).edit_user==1101) {
13104                 string p=dcc_get_line((*i).in_buff);
13105                 if(!p.compare(""))
13106                     return;
13107                 bool got=false;
13108                 if(!p.compare("y") || !p.compare("Y")) {
13109                     got=true;
13110                     (*i).user_access_to_backup=true;
13111                 }
13112                 if(!p.compare("n") || !p.compare("N")) {
13113                     got=true;
13114                     (*i).user_access_to_backup=false;
13115                 }
13116                 got?(*i).edit_user++:(*i).edit_user--;
13117             }
13118             if((*i).edit_user==1102) {
13119                 if(!(*i).access_grant_rehash) {
13120                     string disp;
13121                     int ec=0;
13122                     disp=lang_get_string(1,(*i).lang,174)+eol; // !!!
13123                     dcc_send_msg((*i).socket,disp,ec);
13124 
13125                     (*i).edit_user+=2;
13126                     return;
13127                 }
13128                 string disp;
13129                 int ec=0;
13130 
13131                 disp=lang_get_string(1,(*i).lang,169)+eol; // !!!
13132                 dcc_send_msg((*i).socket,disp,ec);
13133 
13134                 (*i).edit_user++;
13135             }
13136             if((*i).edit_user==1103) {
13137                 string p=dcc_get_line((*i).in_buff);
13138                 if(!p.compare(""))
13139                     return;
13140                 bool got=false;
13141                 if(!p.compare("y") || !p.compare("Y")) {
13142                     got=true;
13143                     (*i).user_access_to_rehash=true;
13144                 }
13145                 if(!p.compare("n") || !p.compare("N")) {
13146                     got=true;
13147                     (*i).user_access_to_rehash=false;
13148                 }
13149                 got?(*i).edit_user++:(*i).edit_user--;
13150             }
13151             if((*i).edit_user==1104) {
13152                 if(!(*i).access_grant_backup) {
13153                     (*i).edit_user+=2;
13154                     return;
13155                 }
13156                 string disp;
13157                 int ec=0;
13158 
13159                 disp=lang_get_string(1,(*i).lang,170)+eol; // !!!
13160                 dcc_send_msg((*i).socket,disp,ec);
13161 
13162                 (*i).edit_user++;
13163             }
13164             if((*i).edit_user==1105) {
13165                 string p=dcc_get_line((*i).in_buff);
13166                 if(!p.compare(""))
13167                     return;
13168                 bool got=false;
13169                 if(!p.compare("y") || !p.compare("Y")) {
13170                     got=true;
13171                     (*i).user_access_grant_backup=true;
13172                 }
13173                 if(!p.compare("n") || !p.compare("N")) {
13174                     got=true;
13175                     (*i).user_access_grant_backup=false;
13176                 }
13177                 got?(*i).edit_user++:(*i).edit_user--;
13178             }
13179             if((*i).edit_user==1106) {
13180                 if(!(*i).access_grant_rehash) {
13181                     (*i).edit_user+=2;
13182                     return;
13183                 }
13184                 string disp;
13185                 int ec=0;
13186 
13187                 disp=lang_get_string(1,(*i).lang,171)+eol; // !!!
13188                 dcc_send_msg((*i).socket,disp,ec);
13189 
13190                 (*i).edit_user++;
13191             }
13192             if((*i).edit_user==1107) {
13193                 string p=dcc_get_line((*i).in_buff);
13194                 if(!p.compare(""))
13195                     return;
13196                 bool got=false;
13197                 if(!p.compare("y") || !p.compare("Y")) {
13198                     got=true;
13199                     (*i).user_access_grant_rehash=true;
13200                 }
13201                 if(!p.compare("n") || !p.compare("N")) {
13202                     got=true;
13203                     (*i).user_access_grant_rehash=false;
13204                 }
13205                 got?(*i).edit_user++:(*i).edit_user--;
13206             }
13207             if((*i).edit_user==1108) {
13208                 if(!(*i).access_grant_plususer) {
13209                     string disp;
13210                     int ec=0;
13211                     disp=lang_get_string(1,(*i).lang,191)+eol; // !!!
13212                     dcc_send_msg((*i).socket,disp,ec);
13213 
13214                     (*i).edit_user+=2;
13215                     return;
13216                 }
13217                 string disp;
13218                 int ec=0;
13219 
13220                 disp=lang_get_string(1,(*i).lang,189)+eol; // !!!
13221                 dcc_send_msg((*i).socket,disp,ec);
13222 
13223                 (*i).edit_user++;
13224             }
13225             if((*i).edit_user==1109) {
13226                 string p=dcc_get_line((*i).in_buff);
13227                 if(!p.compare(""))
13228                     return;
13229                 bool got=false;
13230                 if(!p.compare("y") || !p.compare("Y")) {
13231                     got=true;
13232                     (*i).user_access_to_plususer=true;
13233                 }
13234                 if(!p.compare("n") || !p.compare("N")) {
13235                     got=true;
13236                     (*i).user_access_to_plususer=false;
13237                 }
13238                 got?(*i).edit_user++:(*i).edit_user--;
13239             }
13240             if((*i).edit_user==1110) {
13241                 if(!(*i).access_grant_plususer) {
13242                     (*i).edit_user+=2;
13243                     return;
13244                 }
13245                 string disp;
13246                 int ec=0;
13247 
13248                 disp=lang_get_string(1,(*i).lang,190)+eol; // !!!
13249                 dcc_send_msg((*i).socket,disp,ec);
13250 
13251                 (*i).edit_user++;
13252             }
13253             if((*i).edit_user==1111) {
13254                 string p=dcc_get_line((*i).in_buff);
13255                 if(!p.compare(""))
13256                     return;
13257                 bool got=false;
13258                 if(!p.compare("y") || !p.compare("Y")) {
13259                     got=true;
13260                     (*i).user_access_grant_plususer=true;
13261                 }
13262                 if(!p.compare("n") || !p.compare("N")) {
13263                     got=true;
13264                     (*i).user_access_grant_plususer=false;
13265                 }
13266                 got?(*i).edit_user++:(*i).edit_user--;
13267             }
13268             if((*i).edit_user==1112) {
13269                 if(!(*i).access_grant_plusproc) {
13270                     string disp;
13271                     int ec=0;
13272                     disp=lang_get_string(1,(*i).lang,199)+eol; // !!!
13273                     dcc_send_msg((*i).socket,disp,ec);
13274 
13275                     (*i).edit_user+=2;
13276                     return;
13277                 }
13278                 string disp;
13279                 int ec=0;
13280 
13281                 disp=lang_get_string(1,(*i).lang,197)+eol; // !!!
13282                 dcc_send_msg((*i).socket,disp,ec);
13283 
13284                 (*i).edit_user++;
13285             }
13286             if((*i).edit_user==1113) {
13287                 string p=dcc_get_line((*i).in_buff);
13288                 if(!p.compare(""))
13289                     return;
13290                 bool got=false;
13291                 if(!p.compare("y") || !p.compare("Y")) {
13292                     got=true;
13293                     (*i).user_access_to_plusproc=true;
13294                 }
13295                 if(!p.compare("n") || !p.compare("N")) {
13296                     got=true;
13297                     (*i).user_access_to_plusproc=false;
13298                 }
13299                 got?(*i).edit_user++:(*i).edit_user--;
13300             }
13301             if((*i).edit_user==1114) {
13302                 if(!(*i).access_grant_plususer) {
13303                     (*i).edit_user+=2;
13304                     return;
13305                 }
13306                 string disp;
13307                 int ec=0;
13308 
13309                 disp=lang_get_string(1,(*i).lang,198)+eol; // !!!
13310                 dcc_send_msg((*i).socket,disp,ec);
13311 
13312                 (*i).edit_user++;
13313             }
13314             if((*i).edit_user==1115) {
13315                 string p=dcc_get_line((*i).in_buff);
13316                 if(!p.compare(""))
13317                     return;
13318                 bool got=false;
13319                 if(!p.compare("y") || !p.compare("Y")) {
13320                     got=true;
13321                     (*i).user_access_grant_plusproc=true;
13322                 }
13323                 if(!p.compare("n") || !p.compare("N")) {
13324                     got=true;
13325                     (*i).user_access_grant_plusproc=false;
13326                 }
13327                 got?(*i).edit_user++:(*i).edit_user--;
13328             }
13329             if((*i).edit_user==1116) {
13330                 string disp;
13331                 int ec=0;
13332 
13333                 if(!(*i).access_grant_replication) {
13334                     (*i).edit_user+=2;
13335 
13336                     disp=lang_get_string(1,(*i).lang,216)+eol; // !!!
13337                     dcc_send_msg((*i).socket,disp,ec);
13338 
13339                     return;
13340                 }
13341 
13342                 disp=lang_get_string(1,(*i).lang,215)+eol; // !!!
13343                 dcc_send_msg((*i).socket,disp,ec);
13344 
13345                 (*i).edit_user++;
13346             }
13347             if((*i).edit_user==1117) {
13348                 string p=dcc_get_line((*i).in_buff);
13349                 if(!p.compare(""))
13350                     return;
13351                 bool got=false;
13352                 if(!p.compare("y") || !p.compare("Y")) {
13353                     got=true;
13354                     (*i).user_access_to_replication=true;
13355                 }
13356                 if(!p.compare("n") || !p.compare("N")) {
13357                     got=true;
13358                     (*i).user_access_to_replication=false;
13359                 }
13360                 got?(*i).edit_user++:(*i).edit_user--;
13361             }
13362             if((*i).edit_user==1118) {
13363                 string disp;
13364                 int ec=0;
13365 
13366                 if(!(*i).access_grant_replication) {
13367                     (*i).edit_user+=2;
13368 
13369                     disp=lang_get_string(1,(*i).lang,216)+eol; // !!!
13370                     dcc_send_msg((*i).socket,disp,ec);
13371 
13372                     return;
13373                 }
13374 
13375                 disp=lang_get_string(1,(*i).lang,600)+eol; // !!!
13376                 dcc_send_msg((*i).socket,disp,ec);
13377 
13378                 (*i).edit_user++;
13379             }
13380             if((*i).edit_user==1119) {
13381                 string p=dcc_get_line((*i).in_buff);
13382                 if(!p.compare(""))
13383                     return;
13384                 bool got=false;
13385                 if(!p.compare("y") || !p.compare("Y")) {
13386                     got=true;
13387                     (*i).user_access_grant_replication=true;
13388                 }
13389                 if(!p.compare("n") || !p.compare("N")) {
13390                     got=true;
13391                     (*i).user_access_grant_replication=false;
13392                 }
13393                 got?(*i).edit_user++:(*i).edit_user--;
13394             }
13395 
13396             //---
13397 
13398             if((*i).edit_user==1120) {
13399                 string disp;
13400                 int ec=0;
13401 
13402                 if(!(*i).access_grant_restart) {
13403                     (*i).edit_user+=2;
13404 
13405                     disp=lang_get_string(1,(*i).lang,262)+eol; // !!!
13406                     dcc_send_msg((*i).socket,disp,ec);
13407 
13408                     return;
13409                 }
13410 
13411                 disp=lang_get_string(1,(*i).lang,260)+eol; // !!!
13412                 dcc_send_msg((*i).socket,disp,ec);
13413 
13414                 (*i).edit_user++;
13415             }
13416             if((*i).edit_user==1121) {
13417                 string p=dcc_get_line((*i).in_buff);
13418                 if(!p.compare(""))
13419                     return;
13420                 bool got=false;
13421                 if(!p.compare("y") || !p.compare("Y")) {
13422                     got=true;
13423                     (*i).user_access_to_restart=true;
13424                 }
13425                 if(!p.compare("n") || !p.compare("N")) {
13426                     got=true;
13427                     (*i).user_access_to_restart=false;
13428                 }
13429                 got?(*i).edit_user++:(*i).edit_user--;
13430             }
13431             if((*i).edit_user==1122) {
13432                 string disp;
13433                 int ec=0;
13434 
13435                 if(!(*i).access_grant_restart) {
13436                     (*i).edit_user+=2;
13437 
13438                     return;
13439                 }
13440 
13441                 disp=lang_get_string(1,(*i).lang,261)+eol; // !!!
13442                 dcc_send_msg((*i).socket,disp,ec);
13443 
13444                 (*i).edit_user++;
13445             }
13446             if((*i).edit_user==1123) {
13447                 string p=dcc_get_line((*i).in_buff);
13448                 if(!p.compare(""))
13449                     return;
13450                 bool got=false;
13451                 if(!p.compare("y") || !p.compare("Y")) {
13452                     got=true;
13453                     (*i).user_access_grant_restart=true;
13454                 }
13455                 if(!p.compare("n") || !p.compare("N")) {
13456                     got=true;
13457                     (*i).user_access_grant_restart=false;
13458                 }
13459                 got?(*i).edit_user++:(*i).edit_user--;
13460             }
13461 
13462             if((*i).edit_user==1124) {
13463                 string disp;
13464                 int ec=0;
13465 
13466                 if(!(*i).access_grant_die) {
13467                     (*i).edit_user+=2;
13468 
13469                     disp=lang_get_string(1,(*i).lang,269)+eol; // !!!
13470                     dcc_send_msg((*i).socket,disp,ec);
13471 
13472                     return;
13473                 }
13474 
13475                 disp=lang_get_string(1,(*i).lang,267)+eol; // !!!
13476                 dcc_send_msg((*i).socket,disp,ec);
13477 
13478                 (*i).edit_user++;
13479             }
13480             if((*i).edit_user==1125) {
13481                 string p=dcc_get_line((*i).in_buff);
13482                 if(!p.compare(""))
13483                     return;
13484                 bool got=false;
13485                 if(!p.compare("y") || !p.compare("Y")) {
13486                     got=true;
13487                     (*i).user_access_to_die=true;
13488                 }
13489                 if(!p.compare("n") || !p.compare("N")) {
13490                     got=true;
13491                     (*i).user_access_to_die=false;
13492                 }
13493                 got?(*i).edit_user++:(*i).edit_user--;
13494             }
13495             if((*i).edit_user==1126) {
13496                 string disp;
13497                 int ec=0;
13498 
13499                 if(!(*i).access_grant_die) {
13500                     (*i).edit_user+=2;
13501 
13502                     return;
13503                 }
13504 
13505                 disp=lang_get_string(1,(*i).lang,268)+eol; // !!!
13506                 dcc_send_msg((*i).socket,disp,ec);
13507 
13508                 (*i).edit_user++;
13509             }
13510             if((*i).edit_user==1127) {
13511                 string p=dcc_get_line((*i).in_buff);
13512                 if(!p.compare(""))
13513                     return;
13514                 bool got=false;
13515                 if(!p.compare("y") || !p.compare("Y")) {
13516                     got=true;
13517                     (*i).user_access_grant_die=true;
13518                 }
13519                 if(!p.compare("n") || !p.compare("N")) {
13520                     got=true;
13521                     (*i).user_access_grant_die=false;
13522                 }
13523                 got?(*i).edit_user++:(*i).edit_user--;
13524             }
13525 
13526             if((*i).edit_user==1128) {
13527                 string disp;
13528                 int ec=0;
13529 
13530                 if(!(*i).access_grant_filesystem) {
13531                     (*i).edit_user+=2;
13532 
13533                     disp=lang_get_string(1,(*i).lang,278)+eol; // !!!
13534                     dcc_send_msg((*i).socket,disp,ec);
13535 
13536                     return;
13537                 }
13538 
13539                 disp=lang_get_string(1,(*i).lang,276)+eol; // !!!
13540                 dcc_send_msg((*i).socket,disp,ec);
13541 
13542                 (*i).edit_user++;
13543             }
13544             if((*i).edit_user==1129) {
13545                 string p=dcc_get_line((*i).in_buff);
13546                 if(!p.compare(""))
13547                     return;
13548                 bool got=false;
13549                 if(!p.compare("y") || !p.compare("Y")) {
13550                     got=true;
13551                     (*i).user_access_to_filesystem=true;
13552                 }
13553                 if(!p.compare("n") || !p.compare("N")) {
13554                     got=true;
13555                     (*i).user_access_to_filesystem=false;
13556                 }
13557                 got?(*i).edit_user++:(*i).edit_user--;
13558             }
13559             if((*i).edit_user==1130) {
13560                 string disp;
13561                 int ec=0;
13562 
13563                 if(!(*i).access_grant_filesystem) {
13564                     (*i).edit_user+=2;
13565 
13566                     return;
13567                 }
13568 
13569                 disp=lang_get_string(1,(*i).lang,277)+eol; // !!!
13570                 dcc_send_msg((*i).socket,disp,ec);
13571 
13572                 (*i).edit_user++;
13573             }
13574             if((*i).edit_user==1131) {
13575                 string p=dcc_get_line((*i).in_buff);
13576                 if(!p.compare(""))
13577                     return;
13578                 bool got=false;
13579                 if(!p.compare("y") || !p.compare("Y")) {
13580                     got=true;
13581                     (*i).user_access_grant_filesystem=true;
13582                 }
13583                 if(!p.compare("n") || !p.compare("N")) {
13584                     got=true;
13585                     (*i).user_access_grant_filesystem=false;
13586                 }
13587                 got?(*i).edit_user++:(*i).edit_user--;
13588             }
13589 
13590             if((*i).edit_user==1132) {
13591                 string disp;
13592                 int ec=0;
13593 
13594                 if(!(*i).access_grant_private) {
13595                     (*i).edit_user+=2;
13596 
13597                     disp=lang_get_string(1,(*i).lang,409)+eol; // !!!
13598                     dcc_send_msg((*i).socket,disp,ec);
13599 
13600                     return;
13601                 }
13602 
13603                 disp=lang_get_string(1,(*i).lang,406)+eol; // !!!
13604                 dcc_send_msg((*i).socket,disp,ec);
13605 
13606                 (*i).edit_user++;
13607             }
13608             if((*i).edit_user==1133) {
13609                 string p=dcc_get_line((*i).in_buff);
13610                 if(!p.compare(""))
13611                     return;
13612                 bool got=false;
13613                 if(!p.compare("y") || !p.compare("Y")) {
13614                     got=true;
13615                     (*i).user_access_to_private=true;
13616                 }
13617                 if(!p.compare("n") || !p.compare("N")) {
13618                     got=true;
13619                     (*i).user_access_to_private=false;
13620                 }
13621                 got?(*i).edit_user++:(*i).edit_user--;
13622             }
13623 
13624             if((*i).edit_user==1134) {
13625                 string disp;
13626                 int ec=0;
13627 
13628                 if(!(*i).access_grant_private) {
13629                     (*i).edit_user+=2;
13630                     return;
13631                 }
13632 
13633                 disp=lang_get_string(1,(*i).lang,407)+eol; // !!!
13634                 dcc_send_msg((*i).socket,disp,ec);
13635 
13636                 (*i).edit_user++;
13637             }
13638             if((*i).edit_user==1135) {
13639                 string p=dcc_get_line((*i).in_buff);
13640                 if(!p.compare(""))
13641                     return;
13642                 bool got=false;
13643                 if(!p.compare("y") || !p.compare("Y")) {
13644                     got=true;
13645                     (*i).user_access_grant_private=true;
13646                 }
13647                 if(!p.compare("n") || !p.compare("N")) {
13648                     got=true;
13649                     (*i).user_access_grant_private=false;
13650                 }
13651                 got?(*i).edit_user++:(*i).edit_user--;
13652             }
13653 
13654             if((*i).edit_user==1136) {
13655                 string disp;
13656                 int ec=0;
13657 
13658                 if(!(*i).access_grant_upgrade) {
13659                     (*i).edit_user+=2;
13660                     return;
13661                 }
13662 
13663                 disp=lang_get_string(1,(*i).lang,625)+eol; // !!!
13664                 dcc_send_msg((*i).socket,disp,ec);
13665 
13666                 (*i).edit_user++;
13667             }
13668             if((*i).edit_user==1137) {
13669                 string p=dcc_get_line((*i).in_buff);
13670                 if(!p.compare(""))
13671                     return;
13672                 bool got=false;
13673                 if(!p.compare("y") || !p.compare("Y")) {
13674                     got=true;
13675                     (*i).user_access_to_upgrade=true;
13676                 }
13677                 if(!p.compare("n") || !p.compare("N")) {
13678                     got=true;
13679                     (*i).user_access_to_upgrade=false;
13680                 }
13681                 got?(*i).edit_user++:(*i).edit_user--;
13682             }
13683 
13684             if((*i).edit_user==1138) {
13685                 string disp;
13686                 int ec=0;
13687 
13688                 if(!(*i).access_grant_upgrade) {
13689                     (*i).edit_user+=2;
13690                     return;
13691                 }
13692 
13693                 disp=lang_get_string(1,(*i).lang,626)+eol; // !!!
13694                 dcc_send_msg((*i).socket,disp,ec);
13695 
13696                 (*i).edit_user++;
13697             }
13698             if((*i).edit_user==1139) {
13699                 string p=dcc_get_line((*i).in_buff);
13700                 if(!p.compare(""))
13701                     return;
13702                 bool got=false;
13703                 if(!p.compare("y") || !p.compare("Y")) {
13704                     got=true;
13705                     (*i).user_access_grant_upgrade=true;
13706                 }
13707                 if(!p.compare("n") || !p.compare("N")) {
13708                     got=true;
13709                     (*i).user_access_grant_upgrade=false;
13710                 }
13711                 got?(*i).edit_user++:(*i).edit_user--;
13712             }
13713 
13714             //--------------
13715             if((*i).edit_user==1140) {
13716                 string disp;
13717                 int ec=0;
13718 
13719                 if(!(*i).access_grant_apply) {
13720                     (*i).edit_user+=2;
13721                     return;
13722                 }
13723 
13724                 disp=lang_get_string(1,(*i).lang,680)+eol; // !!!
13725                 dcc_send_msg((*i).socket,disp,ec);
13726 
13727                 (*i).edit_user++;
13728             }
13729             if((*i).edit_user==1141) {
13730                 string p=dcc_get_line((*i).in_buff);
13731                 if(!p.compare(""))
13732                     return;
13733                 bool got=false;
13734                 if(!p.compare("y") || !p.compare("Y")) {
13735                     got=true;
13736                     (*i).user_access_to_apply=true;
13737                 }
13738                 if(!p.compare("n") || !p.compare("N")) {
13739                     got=true;
13740                     (*i).user_access_to_apply=false;
13741                 }
13742                 got?(*i).edit_user++:(*i).edit_user--;
13743             }
13744 
13745             if((*i).edit_user==1142) {
13746                 string disp;
13747                 int ec=0;
13748 
13749                 if(!(*i).access_grant_apply) {
13750                     (*i).edit_user+=2;
13751                     return;
13752                 }
13753 
13754                 disp=lang_get_string(1,(*i).lang,681)+eol; // !!!
13755                 dcc_send_msg((*i).socket,disp,ec);
13756 
13757                 (*i).edit_user++;
13758             }
13759             if((*i).edit_user==1143) {
13760                 string p=dcc_get_line((*i).in_buff);
13761                 if(!p.compare(""))
13762                     return;
13763                 bool got=false;
13764                 if(!p.compare("y") || !p.compare("Y")) {
13765                     got=true;
13766                     (*i).user_access_grant_apply=true;
13767                 }
13768                 if(!p.compare("n") || !p.compare("N")) {
13769                     got=true;
13770                     (*i).user_access_grant_apply=false;
13771                 }
13772                 got?(*i).edit_user++:(*i).edit_user--;
13773             }
13774 
13775             //---------------
13776             if((*i).edit_user==1144) {
13777                 if(!(*i).access_grant_can_send_all_users) {
13778                     (*i).edit_user+=2;
13779                     return;
13780                 }
13781                 string disp;
13782                 int ec=0;
13783 
13784                 disp=lang_get_string(1,(*i).lang,477)+eol; // !!!
13785                 dcc_send_msg((*i).socket,disp,ec);
13786 
13787                 (*i).edit_user++;
13788             }
13789             if((*i).edit_user==1145) {
13790                 string p=dcc_get_line((*i).in_buff);
13791                 if(!p.compare(""))
13792                     return;
13793                 bool got=false;
13794                 if(!p.compare("y") || !p.compare("Y")) {
13795                     got=true;
13796                     (*i).user_access_to_can_send_all_users=true;
13797                 }
13798                 if(!p.compare("n") || !p.compare("N")) {
13799                     got=true;
13800                     (*i).user_access_to_can_send_all_users=false;
13801                 }
13802                 got?(*i).edit_user++:(*i).edit_user--;
13803             }
13804 
13805             if((*i).edit_user==1146) {
13806                 if(!(*i).access_grant_can_send_all_users) {
13807                     (*i).edit_user+=2;
13808                     return;
13809                 }
13810                 string disp;
13811                 int ec=0;
13812 
13813                 disp=lang_get_string(1,(*i).lang,478)+eol; // !!!
13814                 dcc_send_msg((*i).socket,disp,ec);
13815 
13816                 (*i).edit_user++;
13817             }
13818             if((*i).edit_user==1147) {
13819                 string p=dcc_get_line((*i).in_buff);
13820                 if(!p.compare(""))
13821                     return;
13822                 bool got=false;
13823                 if(!p.compare("y") || !p.compare("Y")) {
13824                     got=true;
13825                     (*i).user_access_grant_can_send_all_users=true;
13826                 }
13827                 if(!p.compare("n") || !p.compare("N")) {
13828                     got=true;
13829                     (*i).user_access_grant_can_send_all_users=false;
13830                 }
13831                 got?(*i).edit_user++:(*i).edit_user--;
13832             }
13833 
13834             //---------------
13835             if((*i).edit_user==1148) {
13836                 if(!(*i).access_grant_can_send_unknown_users) {
13837                     (*i).edit_user+=2;
13838                     return;
13839                 }
13840                 string disp;
13841                 int ec=0;
13842 
13843                 disp=lang_get_string(1,(*i).lang,481)+eol; // !!!
13844                 dcc_send_msg((*i).socket,disp,ec);
13845 
13846                 (*i).edit_user++;
13847             }
13848             if((*i).edit_user==1149) {
13849                 string p=dcc_get_line((*i).in_buff);
13850                 if(!p.compare(""))
13851                     return;
13852                 bool got=false;
13853                 if(!p.compare("y") || !p.compare("Y")) {
13854                     got=true;
13855                     (*i).user_access_to_can_send_unknown_users=true;
13856                 }
13857                 if(!p.compare("n") || !p.compare("N")) {
13858                     got=true;
13859                     (*i).user_access_to_can_send_unknown_users=false;
13860                 }
13861                 got?(*i).edit_user++:(*i).edit_user--;
13862             }
13863 
13864             if((*i).edit_user==1150) {
13865                 if(!(*i).access_grant_can_send_unknown_users) {
13866                     (*i).edit_user+=2;
13867                     return;
13868                 }
13869                 string disp;
13870                 int ec=0;
13871 
13872                 disp=lang_get_string(1,(*i).lang,482)+eol; // !!!
13873                 dcc_send_msg((*i).socket,disp,ec);
13874 
13875                 (*i).edit_user++;
13876             }
13877             if((*i).edit_user==1151) {
13878                 string p=dcc_get_line((*i).in_buff);
13879                 if(!p.compare(""))
13880                     return;
13881                 bool got=false;
13882                 if(!p.compare("y") || !p.compare("Y")) {
13883                     got=true;
13884                     (*i).user_access_grant_can_send_unknown_users=true;
13885                 }
13886                 if(!p.compare("n") || !p.compare("N")) {
13887                     got=true;
13888                     (*i).user_access_grant_can_send_unknown_users=false;
13889                 }
13890                 got?(*i).edit_user++:(*i).edit_user--;
13891             }
13892 
13893             if((*i).edit_user==1152) {
13894                 (*i).edit_user=2;
13895             }
13896 }

Here is the call graph for this function:

void dcc_loop_filesystem vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process filesystem commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 7146 of file dcc.cpp.

References cmp_strings_case_insensitive(), DCC_ACCESS_DENIED, dcc_get_line(), DCC_IO_ERROR, dcc_loop_filesystem_disp_rights(), DCC_NO_SUCH_FILE, dcc_send_file(), dcc_send_msg(), files, filesys_dcc_check_for_notifies(), filesys_dcc_delete(), filesys_dcc_drop_notifies(), filesys_dcc_filelist(), filesys_dcc_get_file(), filesys_dcc_set_file_attrs(), ft_file, ft_message, s_user::host_unknown, irc_get_nick(), lang_get_string(), lang_subst(), logic_eval(), logic_partyline_get_user(), r_channels, and r_users.

Referenced by dcc_loop().

07147 {
07148     if((*i).filesystem==0)
07149         return;
07150 
07151     if((*i).filesystem==1) {
07152         vector<s_dcc_notify> notify;
07153         filesys_dcc_check_for_notifies((*i).as_in_logic,(*i).u,(*i).chs,"",notify,true,(*i).lang,eol);
07154         if(!notify.empty()) {
07155             filesys_dcc_drop_notifies((*i).as_in_logic,false);
07156 
07157             string files;
07158             string msgs;
07159             string incomplete_files;
07160 
07161             vector<s_dcc_notify>::iterator i1;
07162             for(i1=notify.begin(); i1!=notify.end(); i1++) {
07163                 if((*i1).unpublished) {
07164                     if(!files.empty())
07165                         files+=", ";
07166                     files+="\"";
07167                     files+=(*i1).name;
07168                     files+="\"";
07169                 }
07170                 if((*i1).incomplete) {
07171                     if(!incomplete_files.empty())
07172                         incomplete_files+=", ";
07173                     incomplete_files+="\"";
07174                     incomplete_files+=(*i1).name;
07175                     incomplete_files+="\"";
07176                 }
07177                 if((*i1).notify_owner || (*i1).notify_user || (*i1).secure_notify_owner || (*i1).secure_notify_user)
07178                     msgs+=(*i1).message;
07179             }
07180     
07181             string disp=lang_get_string(1,(*i).lang,279)+eol;
07182             disp+=files;
07183             disp+=eol;
07184             disp+=lang_get_string(1,(*i).lang,401)+eol;
07185             disp+=incomplete_files;
07186             disp+=eol;
07187             disp+=lang_get_string(1,(*i).lang,324)+eol;
07188             disp+=lang_get_string(1,(*i).lang,280)+eol;
07189             disp+=lang_get_string(1,(*i).lang,281)+eol;
07190             disp+=msgs;
07191             disp+=lang_get_string(1,(*i).lang,469)+eol;
07192             int ec=0;
07193             dcc_send_msg((*i).socket,disp,ec);
07194         }
07195 
07196         (*i).filesystem=2;
07197         return;
07198     }
07199 
07200     if((*i).filesystem==2) {
07201         string disp=lang_get_string(1,(*i).lang,690)+eol;
07202         int ec=0;
07203         dcc_send_msg((*i).socket,disp,ec);
07204 
07205         (*i).filesystem=1000;
07206     }
07207 
07208     string p=dcc_get_line((*i).in_buff);
07209 
07210     string c=p;
07211     string cmd, param1, param2;
07212     int pos=0;
07213     for(unsigned int i1=0; i1<c.length(); i1++) {
07214         if((pos==0 || pos==1 || pos==2) && c[i1]==0x20) {
07215             pos++;
07216             continue;
07217         }
07218         if(pos==0)
07219             cmd+=c[i1];
07220         if(pos==1)
07221             param1+=c[i1];
07222         if(pos==2)
07223             param2+=c[i1];
07224     }
07225 
07226     if((*i).filesystem==1000) {
07227         bool got_cmd=false;
07228         if(!cmd.compare(".editfile")) {
07229             got_cmd=true;
07230             if((*i).access_to_filesystem) {
07231                 vector<s_file> files;
07232                 filesys_dcc_filelist((*i).as_in_logic,files,true);
07233 
07234                 string files_;
07235 
07236                 bool got=false;
07237                 string fn;
07238 
07239                 vector<s_file>::iterator i1;
07240                 for(i1=files.begin(); i1!=files.end(); i1++) {
07241                         if(!(*i1).public_name.compare(param1)) {
07242                             got=true;
07243                             fn=(*i1).public_name;
07244                             break;
07245                         }
07246                         if(!files_.empty())
07247                             files_+=", ";
07248                         files_+="\"";
07249                         files_+=(*i1).public_name;
07250                         files_+="\"";
07251                 }
07252 
07253                 if(!got) {
07254                     string disp=lang_get_string(1,(*i).lang,279)+eol;
07255                     disp+=files_;
07256                     disp+=eol;
07257                     disp+=lang_get_string(1,(*i).lang,324)+eol;
07258                     disp+=lang_get_string(1,(*i).lang,280)+eol;
07259                     disp+=lang_get_string(1,(*i).lang,281)+eol;
07260                     disp+=lang_get_string(1,(*i).lang,282)+eol;
07261                     int ec=0;
07262                     dcc_send_msg((*i).socket,disp,ec);
07263                 } else {
07264                     (*i).fs.file.clear();
07265                     if(filesys_dcc_get_file((*i).as_in_logic,fn,(*i).fs.file)) {
07266                         vector<s_access>::iterator i1;
07267                         string disp;
07268                         for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
07269                             disp+=dcc_loop_filesystem_disp_rights((*i).lang,*i1,eol);
07270                         int ec=0;
07271                         dcc_send_msg((*i).socket,disp,ec);
07272 
07273                         (*i).fs.name=fn;
07274                         (*i).filesystem=2000;
07275                     } else {
07276                         string disp=lang_get_string(1,(*i).lang,291)+eol;
07277                         int ec=0;
07278                         dcc_send_msg((*i).socket,disp,ec);
07279                         (*i).filesystem=1000;
07280                     }
07281                     return;
07282                 }
07283             } else {
07284                 string disp=lang_get_string(1,(*i).lang,275)+eol;
07285                 int ec=0;
07286                 dcc_send_msg((*i).socket,disp,ec);
07287             }
07288         }
07289         if(!cmd.compare(".getfile")) {
07290             got_cmd=true;
07291             int dcc_group=atol(param2.c_str());
07292             int res=dcc_send_file(true,param1,irc_get_nick((*i).as_in_logic),dcc_group);
07293             string disp;
07294             switch(res) {
07295                 case DCC_NO_SUCH_FILE:
07296                     disp=lang_get_string(1,"en",334);
07297                     break;
07298                 case DCC_ACCESS_DENIED:
07299                     disp=lang_get_string(1,"en",335);
07300                     break;
07301                 case DCC_IO_ERROR:
07302                     disp=lang_get_string(1,"en",336);
07303                     break;
07304             }
07305             if(!disp.empty()) {
07306                 disp+=eol;
07307                 int ec=0;
07308                 dcc_send_msg((*i).socket,disp,ec);
07309             }
07310             return;
07311         }
07312         if(!cmd.compare(".finish")) {
07313             got_cmd=true;
07314             string disp=lang_get_string(1,(*i).lang,325)+eol;
07315             int ec=0;
07316             dcc_send_msg((*i).socket,disp,ec);
07317 
07318             (*i).filesystem=0;
07319             return;
07320         }
07321         if(!cmd.compare(".del")) {
07322             got_cmd=true;
07323             if(param1.empty() || !param2.empty()) {
07324                 string disp=lang_get_string(1,(*i).lang,403)+eol;
07325                 int ec=0;
07326                 dcc_send_msg((*i).socket,disp,ec);
07327             } else {
07328                 int fs_ec=filesys_dcc_delete((*i).as_in_logic,param1);
07329                 string disp;
07330                 switch(fs_ec) {
07331                     case DCC_NO_SUCH_FILE:
07332                         disp=lang_get_string(1,(*i).lang,334)+eol;
07333                         break;
07334                     case DCC_ACCESS_DENIED:
07335                         disp=lang_get_string(1,(*i).lang,404)+eol;
07336                         break;
07337                     case 0:
07338                         disp=lang_get_string(1,(*i).lang,405)+eol;
07339                 }
07340                 if(!disp.empty()) {
07341                     int ec=0;
07342                     dcc_send_msg((*i).socket,disp,ec);
07343                 }
07344             }
07345             (*i).filesystem=1000;
07346             return;
07347         }
07348         if(!cmd.compare(".list")) {
07349             got_cmd=true;
07350             vector<s_file> files;
07351             filesys_dcc_filelist((*i).as_in_logic,files,false);
07352             vector<s_file>::iterator i1;
07353             string msg;
07354             for(i1=files.begin(); i1!=files.end(); i1++) {
07355                 if(!((*i1).is_owner((*i).as_in_logic) || (*i1).can_read((*i).as_in_logic) || (*i1).can_delete((*i).as_in_logic)))
07356                     continue;
07357                 if((*i1).is_owner((*i).as_in_logic))
07358                     msg+=lang_get_string(1,(*i).lang,296);
07359                 if((*i1).can_read((*i).as_in_logic))
07360                     if(!msg.empty()) {
07361                         msg+=" ";
07362                         msg+=lang_get_string(1,(*i).lang,297);
07363                     }
07364                     else
07365                         msg+=lang_get_string(1,(*i).lang,297);
07366                 if((*i1).can_delete((*i).as_in_logic))
07367                     if(!msg.empty()) {
07368                         msg+=" ";
07369                         msg+=lang_get_string(1,(*i).lang,298);
07370                     }
07371                     else
07372                         msg+=lang_get_string(1,(*i).lang,298);
07373                 if((*i1).file_type==ft_file)
07374                     if(!msg.empty()) {
07375                         msg+=" ";
07376                         msg+=lang_get_string(1,(*i).lang,471);
07377                     }
07378                     else
07379                         msg+=lang_get_string(1,(*i).lang,471);
07380                 if((*i1).file_type==ft_message)
07381                     if(!msg.empty()) {
07382                         msg+=" ";
07383                         msg+=lang_get_string(1,(*i).lang,472);
07384                     }
07385                     else
07386                         msg+=lang_get_string(1,(*i).lang,472);
07387                 msg+=" = ";
07388                 msg+=(*i1).public_name+eol;
07389             }
07390             string disp;
07391             if(msg.empty())
07392                 disp=lang_get_string(1,(*i).lang,470)+eol;
07393             else
07394                 disp=msg;
07395             int ec=0;
07396             dcc_send_msg((*i).socket,disp,ec);
07397         }
07398         if(!cmd.compare(".help")) {
07399             got_cmd=true;
07400             string disp=lang_get_string(1,(*i).lang,691)+eol;
07401             int ec=0;
07402             dcc_send_msg((*i).socket,disp,ec);
07403         }
07404         if(!got_cmd && !cmd.empty()) {
07405             (*i).filesystem=2;
07406             return;
07407         }
07408         return;
07409     }
07410 
07411     // .editfile
07412     if((*i).filesystem==2000) {
07413         string disp=lang_subst(lang_get_string(1,(*i).lang,283),(*i).fs.name)+eol;
07414         disp+=lang_get_string(1,(*i).lang,284)+eol;
07415         if((*i).fs.file.is_owner((*i).as_in_logic))
07416             disp+=lang_get_string(1,(*i).lang,285)+eol;
07417         else
07418             disp+=lang_get_string(1,(*i).lang,286)+eol;
07419         if((*i).fs.file.can_read((*i).as_in_logic))
07420             disp+=lang_get_string(1,(*i).lang,287)+eol;
07421         else
07422             disp+=lang_get_string(1,(*i).lang,288)+eol;
07423         if((*i).fs.file.can_delete((*i).as_in_logic))
07424             disp+=lang_get_string(1,(*i).lang,289)+eol;
07425         else
07426             disp+=lang_get_string(1,(*i).lang,290)+eol;
07427         disp+=lang_get_string(1,(*i).lang,291)+eol;
07428         int ec=0;
07429         dcc_send_msg((*i).socket,disp,ec);
07430 
07431         (*i).filesystem++;
07432         return;
07433     }
07434 
07435     if((*i).filesystem==2001) {
07436         if(p.empty())
07437             return;
07438 
07439         if(!cmd.compare(".attr")) {
07440             if((*i).fs.file.is_owner((*i).as_in_logic)) {
07441                 (*i).filesystem=3000;
07442             } else {
07443                 string disp=lang_get_string(1,(*i).lang,286)+eol;
07444                 int ec=0;
07445                 dcc_send_msg((*i).socket,disp,ec);
07446                 (*i).filesystem=2000;
07447             }
07448             return;
07449         }
07450 
07451         if(!cmd.compare(".show")) {
07452             vector<s_access>::iterator i1;
07453             string disp;
07454             for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
07455                 disp+=dcc_loop_filesystem_disp_rights((*i).lang,*i1,eol);
07456             int ec=0;
07457             dcc_send_msg((*i).socket,disp,ec);
07458             (*i).filesystem=2000;
07459             return;
07460         }
07461 
07462         if(!cmd.compare(".expiration")) {
07463             vector<s_access>::iterator i1;
07464             (*i).filesystem=7000;
07465             return;
07466         }
07467 
07468         if(!cmd.compare(".finish")) {
07469             string disp=lang_get_string(1,(*i).lang,319)+eol;
07470             int ec=0;
07471             dcc_send_msg((*i).socket,disp,ec);
07472 
07473             (*i).filesystem=6000;
07474             return;
07475         }
07476         (*i).filesystem--;
07477         return;
07478     }
07479 
07480     // .attr
07481     if((*i).filesystem==3000) {
07482         string disp=lang_get_string(1,(*i).lang,293)+eol;
07483         vector<s_access>::iterator i1;
07484         for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
07485             disp+=dcc_loop_filesystem_disp_rights((*i).lang,*i1,eol);
07486         disp+=lang_get_string(1,(*i).lang,302)+eol;
07487         disp+=lang_get_string(1,(*i).lang,303)+eol;
07488         int ec=0;
07489         dcc_send_msg((*i).socket,disp,ec);
07490         (*i).filesystem++;
07491         return;
07492     }
07493     if((*i).filesystem==3001) {
07494         bool all_users=!param1.compare("*");
07495         bool got=false;
07496         bool got_cmd=false;
07497         if(!cmd.compare(".remove")) {
07498             got_cmd=true;
07499             if(all_users) {
07500                 vector<s_access>::iterator i1;
07501 again2:
07502                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07503                     if((*i1).user_name.compare((*i).as_in_logic)) {
07504                         (*i).fs.file.access.erase(i1);
07505                         got=true;
07506                         goto again2;
07507                     }
07508                 }
07509             } else {
07510                 vector<s_access>::iterator i1;
07511 again1:
07512                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07513                     if(!(*i1).user_name.compare(param1)) {
07514                         (*i).fs.file.access.erase(i1);
07515                         got=true;
07516                         goto again1;
07517                     }
07518                 }
07519                 if(!got) {
07520                     string disp=lang_get_string(1,(*i).lang,304)+eol;
07521                     int ec=0;
07522                     dcc_send_msg((*i).socket,disp,ec);
07523                     (*i).filesystem=3000;
07524                 } else
07525                     (*i).filesystem=3000;
07526             }
07527             (*i).filesystem=3000;
07528             return;
07529         }
07530         if(!cmd.compare(".add")) {
07531             got_cmd=true;
07532             (*i).fs.new_access.clear();
07533             (*i).filesystem=5000;
07534         }
07535         if(!cmd.compare(".change")) {
07536             got_cmd=true;
07537             (*i).fs.new_access.clear();
07538             (*i).fs.new_access.all_users=all_users;
07539             if(!all_users)
07540                 (*i).fs.new_access.user_name=param1;
07541             else
07542                 (*i).fs.new_access.user_name="";
07543             vector<s_access>::iterator i1;
07544             bool got=false;
07545             for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07546                 if(all_users && (*i1).all_users) {
07547                     (*i).fs.new_access.del=(*i1).del;
07548                     (*i).fs.new_access.notify_owner=(*i1).notify_owner;
07549                     (*i).fs.new_access.notify_user=(*i1).notify_user;
07550                     (*i).fs.new_access.owner=(*i1).owner;
07551                     (*i).fs.new_access.read=(*i1).read;
07552                     got=true;
07553                     break;
07554                 }
07555                 if(!all_users && !(*i1).user_name.compare(param1)) {
07556                     (*i).fs.new_access.del=(*i1).del;
07557                     (*i).fs.new_access.notify_owner=(*i1).notify_owner;
07558                     (*i).fs.new_access.notify_user=(*i1).notify_user;
07559                     (*i).fs.new_access.owner=(*i1).owner;
07560                     (*i).fs.new_access.read=(*i1).read;
07561                     got=true;
07562                     break;
07563                 }
07564             }
07565             if(!got && !all_users) {
07566                 string disp=lang_get_string(1,(*i).lang,304)+eol;
07567                 int ec=0;
07568                 dcc_send_msg((*i).socket,disp,ec);
07569                 (*i).filesystem=3000;
07570             } else
07571                 (*i).filesystem=4000;
07572         }
07573         if(!cmd.compare(".finish")) {
07574             got_cmd=true;
07575             string disp=lang_get_string(1,(*i).lang,319)+eol;
07576             int ec=0;
07577             dcc_send_msg((*i).socket,disp,ec);
07578 
07579             (*i).filesystem=6000;
07580             return;
07581         }
07582         if(!cmd.compare(".addchan")) {
07583             got_cmd=true;
07584             /*bool got=false;
07585             map<string,string> vars;
07586             vector<s_channel>::iterator i1;
07587             for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
07588                 if(!cmp_strings_case_insensitive(logic_eval((*i1).channel_name,vars),param1) && !(*i1).host_unknown) {
07589                     got=true;
07590                     break;
07591                 }
07592             }
07593             if(!got) {
07594                 string disp=lang_get_string(1,(*i).lang,323)+eol;
07595                 int ec=0;
07596                 dcc_send_msg((*i).socket,disp,ec);
07597                 (*i).filesystem=3000;
07598                 return;
07599             }*/
07600             bool got=false;
07601             vector<string>::iterator i1;
07602             for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
07603                 if(!cmp_strings_case_insensitive(*i1,param1)) {
07604                     got=true;
07605                     break;
07606                 }
07607             if(got) {
07608                 (*i).fs.new_access.clear();
07609                 (*i).fs.new_access.all_on_channel=param1;
07610                 s_user u;
07611                 vector<s_channel> chs;
07612                 logic_partyline_get_user((*i).as_in_logic,u,chs);
07613                 vector<s_channel>::iterator i2;
07614                 bool can=(*i).access_to_can_send_unknown_users;
07615                 for(i2=chs.begin(); i2!=chs.end(); i2++)
07616                     if(!cmp_strings_case_insensitive((*i2).channel_name,p)) {
07617                         can&=(*i2).can_send_unknown_users;
07618                         break;
07619                     }
07620                 if(!(*i).access_to_can_send_unknown_users)
07621                     can=false;
07622                 if(!can) {
07623                     (*i).filesystem=4000;
07624                 } else {
07625                     (*i).filesystem=8000;
07626                 }
07627             } else {
07628                 (*i).fs.new_access.all_on_channel="";
07629                 (*i).fs.new_access.also_unknown=false;
07630                 string disp=lang_get_string(1,(*i).lang,323)+eol;
07631                 int ec=0;
07632                 dcc_send_msg((*i).socket,disp,ec);
07633                 return;
07634             }
07635             return;
07636         }
07637         if(!got_cmd && !cmd.empty()) {
07638             (*i).filesystem=3000;
07639             return;
07640         }
07641         return;
07642     }
07643 
07644     // .change
07645     if((*i).filesystem==4000) {
07646         string disp=lang_get_string(1,(*i).lang,305)+eol;
07647         disp+=dcc_loop_filesystem_disp_rights((*i).lang,(*i).fs.new_access,eol);
07648         disp+=lang_get_string(1,(*i).lang,306)+eol;
07649         int ec=0;
07650         dcc_send_msg((*i).socket,disp,ec);
07651         (*i).filesystem++;
07652         return;
07653     }
07654     // .change && .add
07655     if((*i).filesystem==4001) {
07656         if(p.empty())
07657             return;
07658 
07659         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07660             string disp=lang_get_string(1,(*i).lang,306)+eol; // !!!
07661             int ec=0;
07662             dcc_send_msg((*i).socket,disp,ec);
07663         } else {
07664             if(!p.compare("n") || !p.compare("N")) {
07665                 (*i).fs.new_access.owner=false; // !!!
07666                 string disp=lang_get_string(1,(*i).lang,307)+eol; // !!!
07667                 int ec=0;
07668                 dcc_send_msg((*i).socket,disp,ec);
07669                 (*i).filesystem++;
07670             } else {
07671                 (*i).fs.new_access.owner=true; // !!!
07672                 string disp=lang_get_string(1,(*i).lang,307)+eol; // !!!
07673                 int ec=0;
07674                 dcc_send_msg((*i).socket,disp,ec);
07675                 (*i).filesystem++;
07676             }
07677         }
07678         return;
07679     }
07680     if((*i).filesystem==4002) {
07681         if(p.empty())
07682             return;
07683         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07684             string disp=lang_get_string(1,(*i).lang,307)+eol; // !!!
07685             int ec=0;
07686             dcc_send_msg((*i).socket,disp,ec);
07687         } else {
07688             if(!p.compare("n") || !p.compare("N")) {
07689                 (*i).fs.new_access.read=false; // !!!
07690                 string disp=lang_get_string(1,(*i).lang,308)+eol; // !!!
07691                 int ec=0;
07692                 dcc_send_msg((*i).socket,disp,ec);
07693                 (*i).filesystem++;
07694             } else {
07695                 (*i).fs.new_access.read=true; // !!!
07696                 string disp=lang_get_string(1,(*i).lang,308)+eol; // !!!
07697                 int ec=0;
07698                 dcc_send_msg((*i).socket,disp,ec);
07699                 (*i).filesystem++;
07700             }
07701         }
07702         return;
07703     }
07704     if((*i).filesystem==4003) {
07705         if(p.empty())
07706             return;
07707         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07708             string disp=lang_get_string(1,(*i).lang,308)+eol; // !!!
07709             int ec=0;
07710             dcc_send_msg((*i).socket,disp,ec);
07711         } else {
07712             if(!p.compare("n") || !p.compare("N")) {
07713                 (*i).fs.new_access.del=false; // !!!
07714                 string disp=lang_get_string(1,(*i).lang,309)+eol; // !!!
07715                 int ec=0;
07716                 dcc_send_msg((*i).socket,disp,ec);
07717                 (*i).filesystem++;
07718             } else {
07719                 (*i).fs.new_access.del=true; // !!!
07720                 string disp=lang_get_string(1,(*i).lang,309)+eol; // !!!
07721                 int ec=0;
07722                 dcc_send_msg((*i).socket,disp,ec);
07723                 (*i).filesystem++;
07724             }
07725         }
07726         return;
07727     }
07728     if((*i).filesystem==4004) {
07729         if(p.empty())
07730             return;
07731         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07732             string disp=lang_get_string(1,(*i).lang,309)+eol; // !!!
07733             int ec=0;
07734             dcc_send_msg((*i).socket,disp,ec);
07735         } else {
07736             if(!p.compare("n") || !p.compare("N")) {
07737                 (*i).fs.new_access.notify_owner=false; // !!!
07738                 string disp=lang_get_string(1,(*i).lang,310)+eol; // !!!
07739                 int ec=0;
07740                 dcc_send_msg((*i).socket,disp,ec);
07741                 (*i).filesystem++;
07742             } else {
07743                 (*i).fs.new_access.notify_owner=true; // !!!
07744                 string disp=lang_get_string(1,(*i).lang,310)+eol; // !!!
07745                 int ec=0;
07746                 dcc_send_msg((*i).socket,disp,ec);
07747                 (*i).filesystem++;
07748             }
07749         }
07750         return;
07751     }
07752 
07753     // SECURE flag
07754     if((*i).filesystem==4005) {
07755         if(p.empty())
07756             return;
07757         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07758             string disp=lang_get_string(1,(*i).lang,310)+eol; // !!!
07759             int ec=0;
07760             dcc_send_msg((*i).socket,disp,ec);
07761         } else {
07762             if(!p.compare("n") || !p.compare("N")) {
07763                 (*i).fs.new_access.notify_user=false; // !!!
07764                 if(!(*i).fs.new_access.notify_user) {
07765                     (*i).fs.new_access.notify_user_message="";
07766                     (*i).filesystem+=2;
07767                 }
07768                 string disp=lang_get_string(1,(*i).lang,326)+eol; // !!!
07769                 int ec=0;
07770                 dcc_send_msg((*i).socket,disp,ec);
07771                 (*i).filesystem++;
07772             } else {
07773                 (*i).fs.new_access.notify_user=true; // !!!
07774                 string disp=lang_get_string(1,(*i).lang,326)+eol; // !!!
07775                 int ec=0;
07776                 dcc_send_msg((*i).socket,disp,ec);
07777                 (*i).filesystem++;
07778             }
07779         }
07780         return;
07781     }
07782     if((*i).filesystem==4006) {
07783         if(p.empty())
07784             return;
07785         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07786             string disp=lang_get_string(1,(*i).lang,326)+eol; // !!!
07787             int ec=0;
07788             dcc_send_msg((*i).socket,disp,ec);
07789         } else {
07790             if(!p.compare("n") || !p.compare("N")) {
07791                 (*i).fs.new_access.secure=false; // !!!
07792                 if(!(*i).fs.new_access.notify_owner || (*i).fs.file.file_type==ft_message) {
07793                     (*i).fs.new_access.notify_owner_message="";
07794                     (*i).filesystem+=3;
07795                     return;
07796                 }
07797                 string disp=lang_get_string(1,(*i).lang,327)+eol; // !!!
07798                 disp+=lang_get_string(1,(*i).lang,349)+eol;
07799                 disp+=lang_get_string(1,(*i).lang,350)+eol;
07800                 disp+=lang_get_string(1,(*i).lang,353)+eol;
07801                 int ec=0;
07802                 dcc_send_msg((*i).socket,disp,ec);
07803                 (*i).filesystem++;
07804             } else {
07805                 (*i).fs.new_access.secure=true; // !!!
07806                 if(!(*i).fs.new_access.notify_owner) {
07807                     (*i).fs.new_access.notify_owner_message="";
07808                     (*i).filesystem+=3;
07809                     return;
07810                 }
07811                 string disp=lang_get_string(1,(*i).lang,327)+eol; // !!!
07812                 disp+=lang_get_string(1,(*i).lang,349)+eol;
07813                 disp+=lang_get_string(1,(*i).lang,350)+eol;
07814                 disp+=lang_get_string(1,(*i).lang,353)+eol;
07815                 int ec=0;
07816                 dcc_send_msg((*i).socket,disp,ec);
07817                 (*i).filesystem++;
07818             }
07819         }
07820         return;
07821     }
07822     // OWNER message edit
07823     if((*i).filesystem==4007) {
07824         if(p.empty())
07825             return;
07826         if(!p.compare(".")) {
07827             string disp=lang_get_string(1,(*i).lang,328)+eol; // !!!
07828             int ec=0;
07829             dcc_send_msg((*i).socket,disp,ec);
07830             if(!(*i).fs.new_access.notify_owner /*|| (*i).fs.file.file_type==ft_message*/) {
07831                 (*i).filesystem+=2;
07832                 return;
07833             }
07834             (*i).filesystem++;
07835             disp=lang_get_string(1,(*i).lang,329)+eol; // !!!
07836             disp+=lang_get_string(1,(*i).lang,349)+eol;
07837             disp+=lang_get_string(1,(*i).lang,351)+eol;
07838             disp+=lang_get_string(1,(*i).lang,352)+eol;
07839             disp+=lang_get_string(1,(*i).lang,353)+eol;
07840             dcc_send_msg((*i).socket,disp,ec);
07841             return;
07842         } else {
07843             (*i).fs.new_access.notify_owner_message+=p;
07844             (*i).fs.new_access.notify_owner_message+="\n";
07845         }
07846         return;
07847     }
07848     // USER message edit
07849     if((*i).filesystem==4008) {
07850         if(p.empty())
07851             return;
07852         if(!p.compare(".")) {
07853             string disp=lang_get_string(1,(*i).lang,328)+eol; // !!!
07854             int ec=0;
07855             dcc_send_msg((*i).socket,disp,ec);
07856             (*i).filesystem++;
07857             return;
07858         } else {
07859             (*i).fs.new_access.notify_user_message+=p;
07860             (*i).fs.new_access.notify_user_message+="\n";
07861         }
07862         return;
07863     }
07864 
07865     // done
07866     if((*i).filesystem==4009) {
07867         string disp=lang_get_string(1,(*i).lang,311)+eol; // !!!
07868         disp+=dcc_loop_filesystem_disp_rights((*i).lang,(*i).fs.new_access,eol);
07869         disp+=lang_get_string(1,(*i).lang,312)+eol; // !!!
07870         int ec=0;
07871         dcc_send_msg((*i).socket,disp,ec);
07872         (*i).filesystem++;
07873         return;
07874     }
07875     if((*i).filesystem==4010) {
07876         if(p.empty())
07877             return;
07878         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07879             string disp=lang_get_string(1,(*i).lang,311)+eol; // !!!
07880             disp+=dcc_loop_filesystem_disp_rights((*i).lang,(*i).fs.new_access,eol);
07881             disp+=lang_get_string(1,(*i).lang,312)+eol; // !!!
07882             int ec=0;
07883             dcc_send_msg((*i).socket,disp,ec);
07884         } else {
07885             if(!p.compare("n") || !p.compare("N")) {
07886                 string disp=lang_get_string(1,(*i).lang,314)+eol; // !!!
07887                 int ec=0;
07888                 dcc_send_msg((*i).socket,disp,ec);
07889                 (*i).filesystem=2000;
07890             } else {
07891                 if((*i).fs.new_access.user_name.length()>1 && (*i).fs.new_access.user_name[0]=='*') {
07892                     // from .addchan
07893                     string chan;
07894                     if((*i).fs.new_access.all_on_channel.empty())
07895                         chan=(*i).fs.new_access.user_name;
07896                     else
07897                         chan=(*i).fs.new_access.all_on_channel;
07898                     chan.erase(0,1);
07899                     vector<string> users;
07900                     map<string,string> vars;
07901                     vector<s_channel>::iterator i2;
07902                     for(i2=r_channels.begin(); i2!=r_channels.end(); i2++)
07903                         if(!cmp_strings_case_insensitive(logic_eval((*i2).channel_name,vars),chan) && !(*i2).host_unknown)
07904                             users.push_back((*i2).username);
07905 
07906                     vector<string>::iterator i3;
07907                     for(i3=users.begin(); i3!=users.end(); i3++) {
07908                         vector<s_access>::iterator i1;
07909 again5:
07910                         for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07911                             if((*i1).user_name.compare((*i).as_in_logic) && !(*i1).user_name.compare(*i3)) {
07912                                 (*i).fs.file.access.erase(i1);
07913                                 goto again5;
07914                             }
07915                         }
07916                     }
07917                     for(i3=users.begin(); i3!=users.end(); i3++) {
07918                         (*i).fs.new_access.user_name=*i3;
07919                         (*i).fs.file.access.push_back((*i).fs.new_access);
07920                     }
07921                 } else
07922                     if(!(*i).fs.new_access.all_on_channel.empty()) {
07923                         (*i).fs.file.access.push_back((*i).fs.new_access);
07924                     } else
07925                         if((*i).fs.new_access.all_users) {
07926                             vector<s_access>::iterator i1;
07927 again4:
07928                             for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07929                                 if((*i1).user_name.compare((*i).as_in_logic)) {
07930                                     (*i).fs.file.access.erase(i1);
07931                                     goto again4;
07932                                 }
07933                             }
07934                             (*i).fs.file.access.push_back((*i).fs.new_access);
07935                         } else {
07936                             vector<s_access>::iterator i1;
07937 again3:
07938                             for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
07939                                 if(!(*i1).user_name.compare((*i).fs.new_access.user_name)) {
07940                                     (*i).fs.file.access.erase(i1);
07941                                     goto again3;
07942                                 }
07943                             }
07944                             (*i).fs.file.access.push_back((*i).fs.new_access);
07945                         }
07946 
07947                 string disp=lang_get_string(1,(*i).lang,313)+eol; // !!!
07948                 int ec=0;
07949                 dcc_send_msg((*i).socket,disp,ec);
07950                 (*i).filesystem=3000;
07951             }
07952         }
07953         return;
07954     }
07955 
07956     // .add
07957     if((*i).filesystem==5000) {
07958         string disp=lang_get_string(1,(*i).lang,315)+eol;
07959         vector<s_user>::iterator i1;
07960         for(i1=r_users.begin(); i1!=r_users.end(); i1++)
07961             disp+=(*i1).name+eol;
07962         disp+=lang_get_string(1,(*i).lang,316)+eol;
07963         disp+=lang_get_string(1,(*i).lang,303)+eol;
07964         int ec=0;
07965         dcc_send_msg((*i).socket,disp,ec);
07966         (*i).filesystem++;
07967         return;
07968     }
07969     if((*i).filesystem==5001) {
07970         if(p.empty())
07971             return;
07972         bool all_users=!p.compare("*");
07973         (*i).fs.new_access.clear();
07974         (*i).fs.new_access.all_users=all_users;
07975         if(!all_users) {
07976             s_user u;
07977             vector<s_channel> chs;
07978             logic_partyline_get_user(p,u,chs);
07979             bool unknown_user=u.host_unknown;
07980             logic_partyline_get_user((*i).as_in_logic,u,chs);
07981             vector<s_channel>::iterator i2;
07982             bool can=(*i).access_to_can_send_unknown_users;
07983             for(i2=chs.begin(); i2!=chs.end(); i2++)
07984                 if(!cmp_strings_case_insensitive((*i2).channel_name,p)) {
07985                     can&=(*i2).can_send_unknown_users;
07986                     break;
07987                 }
07988             if(unknown_user && !can) {
07989                 string disp=lang_get_string(1,(*i).lang,480)+eol;
07990                 int ec=0;
07991                 dcc_send_msg((*i).socket,disp,ec);
07992                 (*i).filesystem--;
07993                 return;
07994             }
07995             (*i).fs.new_access.user_name=p;
07996         } else
07997             (*i).fs.new_access.user_name="";
07998 
07999         if(!all_users) {
08000             vector<s_user>::iterator i1;
08001             string user;
08002             for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
08003                 if(!(*i1).name.compare(p)) {
08004                     user=p;
08005                     break;
08006                 }
08007             }
08008             if(user.empty()) {
08009                 string disp=lang_get_string(1,(*i).lang,304)+eol;
08010                 int ec=0;
08011                 dcc_send_msg((*i).socket,disp,ec);
08012                 (*i).filesystem--;
08013                 return;
08014             }
08015         }
08016         vector<s_access>::iterator i1;
08017         bool got=false;
08018         for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
08019             if(all_users && (*i1).all_users) {
08020                 (*i).fs.new_access.del=(*i1).del;
08021                 (*i).fs.new_access.notify_owner=(*i1).notify_owner;
08022                 (*i).fs.new_access.notify_user=(*i1).notify_user;
08023                 (*i).fs.new_access.owner=(*i1).owner;
08024                 (*i).fs.new_access.read=(*i1).read;
08025                 got=true;
08026                 break;
08027             }
08028             if(!all_users && !(*i1).user_name.compare(p)) {
08029                 (*i).fs.new_access.del=(*i1).del;
08030                 (*i).fs.new_access.notify_owner=(*i1).notify_owner;
08031                 (*i).fs.new_access.notify_user=(*i1).notify_user;
08032                 (*i).fs.new_access.owner=(*i1).owner;
08033                 (*i).fs.new_access.read=(*i1).read;
08034                 got=true;
08035                 break;
08036             }
08037         }
08038         /*if(!got && !all_users) {
08039             string disp=lang_get_string(1,(*i).lang,304)+eol;
08040             int ec=0;
08041             dcc_send_msg((*i).socket,disp,ec);
08042             (*i).filesystem--;
08043             return;
08044         }*/
08045         if(got) {
08046             if(all_users) {
08047                 if(!(*i).access_to_can_send_all_users) {
08048                     string disp=lang_get_string(1,(*i).lang,479)+eol;
08049                     int ec=0;
08050                     dcc_send_msg((*i).socket,disp,ec);
08051                     return;
08052                 }
08053 
08054                 string disp=lang_get_string(1,(*i).lang,317)+eol;
08055                 int ec=0;
08056                 dcc_send_msg((*i).socket,disp,ec);
08057                 (*i).filesystem=5500;
08058                 return;
08059             } else {
08060                 string disp=lang_subst(lang_get_string(1,(*i).lang,318),(*i).fs.new_access.user_name)+eol;
08061                 int ec=0;
08062                 dcc_send_msg((*i).socket,disp,ec);
08063                 (*i).filesystem=5500;
08064                 return;
08065             }
08066         }
08067         (*i).filesystem=5200;
08068         return;
08069     }
08070 
08071     if((*i).filesystem==5200) {
08072         string disp=lang_get_string(1,(*i).lang,306)+eol;
08073         int ec=0;
08074         dcc_send_msg((*i).socket,disp,ec);
08075         (*i).filesystem=4001;
08076         return;
08077     }
08078 
08079     // replace? (.add)
08080     if((*i).filesystem==5500) {
08081         if(p.empty())
08082             return;
08083         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08084             if((*i).fs.new_access.all_users) {
08085                 string disp=lang_get_string(1,(*i).lang,317)+eol;
08086                 int ec=0;
08087                 dcc_send_msg((*i).socket,disp,ec);
08088                 return;
08089             } else {
08090                 string disp=lang_subst(lang_get_string(1,(*i).lang,318),(*i).fs.new_access.user_name)+eol;
08091                 int ec=0;
08092                 dcc_send_msg((*i).socket,disp,ec);
08093                 return;
08094             }
08095         } else {
08096             if(!p.compare("n") || !p.compare("N")) {
08097                 (*i).filesystem=2000;
08098             } else {
08099                 (*i).filesystem=5200;
08100             }
08101         }
08102         return;
08103     }
08104 
08105     // .finish (save changes?)
08106     if((*i).filesystem==6000) {
08107         if(p.empty())
08108             return;
08109         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08110             string disp=lang_get_string(1,(*i).lang,319)+eol; // !!!
08111             int ec=0;
08112             dcc_send_msg((*i).socket,disp,ec);
08113         } else {
08114             if(!p.compare("n") || !p.compare("N")) {
08115                 string disp=lang_get_string(1,(*i).lang,321)+eol; // !!!
08116                 int ec=0;
08117                 dcc_send_msg((*i).socket,disp,ec);
08118                 (*i).filesystem=1;
08119             } else {
08120                 (*i).fs.file.published=true;
08121 
08122                 vector<s_access>::iterator i1;
08123 
08124                 bool read=true;
08125                 bool notify_user=true;
08126                 bool old_secure=false;
08127                 bool notify_owner=false;
08128 
08129                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
08130                     read|=(*i1).read;
08131                     notify_user|=(*i1).notify_user;
08132                     notify_owner|=(*i1).notify_owner;
08133                     old_secure|=(*i1).secure;
08134                 }
08135 
08136                 bool forced_secure;
08137 
08138                 if(filesys_dcc_set_file_attrs((*i).as_in_logic,(*i).fs.file,forced_secure)) {
08139                     string disp;
08140                     if(!old_secure && forced_secure)
08141                         disp+=lang_get_string(1,(*i).lang,346)+eol;
08142 
08143                     disp+=lang_get_string(1,(*i).lang,320)+eol;
08144                     int ec=0;
08145                     dcc_send_msg((*i).socket,disp,ec);
08146                 } else {
08147                     string disp=lang_get_string(1,(*i).lang,292)+eol;
08148                     int ec=0;
08149                     dcc_send_msg((*i).socket,disp,ec);
08150                 }
08151                 (*i).filesystem=1;
08152             }
08153         }
08154         return;
08155     }
08156 
08157     if((*i).filesystem==5001) {
08158         if(p.empty())
08159             return;
08160         bool all_users=!p.compare("*");
08161         (*i).fs.new_access.clear();
08162         (*i).fs.new_access.all_users=all_users;
08163         if(!all_users)
08164             (*i).fs.new_access.user_name=p;
08165         else
08166             (*i).fs.new_access.user_name="";
08167 
08168         if(!all_users) {
08169             vector<s_user>::iterator i1;
08170             string user;
08171             for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
08172                 if(!(*i1).name.compare(p)) {
08173                     user=p;
08174                     break;
08175                 }
08176             }
08177             if(user.empty()) {
08178                 string disp=lang_get_string(1,(*i).lang,304)+eol;
08179                 int ec=0;
08180                 dcc_send_msg((*i).socket,disp,ec);
08181                 (*i).filesystem--;
08182                 return;
08183             }
08184         }
08185         vector<s_access>::iterator i1;
08186         bool got=false;
08187         for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
08188             if(all_users && (*i1).all_users) {
08189                 (*i).fs.new_access.del=(*i1).del;
08190                 (*i).fs.new_access.notify_owner=(*i1).notify_owner;
08191                 (*i).fs.new_access.notify_user=(*i1).notify_user;
08192                 (*i).fs.new_access.owner=(*i1).owner;
08193                 (*i).fs.new_access.read=(*i1).read;
08194                 got=true;
08195                 break;
08196             }
08197             if(!all_users && !(*i1).user_name.compare(p)) {
08198                 (*i).fs.new_access.del=(*i1).del;
08199                 (*i).fs.new_access.notify_owner=(*i1).notify_owner;
08200                 (*i).fs.new_access.notify_user=(*i1).notify_user;
08201                 (*i).fs.new_access.owner=(*i1).owner;
08202                 (*i).fs.new_access.read=(*i1).read;
08203                 got=true;
08204                 break;
08205             }
08206         }
08207         /*if(!got && !all_users) {
08208             string disp=lang_get_string(1,(*i).lang,304)+eol;
08209             int ec=0;
08210             dcc_send_msg((*i).socket,disp,ec);
08211             (*i).filesystem--;
08212             return;
08213         }*/
08214         if(got) {
08215             if(all_users) {
08216                 string disp=lang_get_string(1,(*i).lang,317)+eol;
08217                 int ec=0;
08218                 dcc_send_msg((*i).socket,disp,ec);
08219                 (*i).filesystem=5500;
08220                 return;
08221             } else {
08222                 string disp=lang_subst(lang_get_string(1,(*i).lang,318),(*i).fs.new_access.user_name)+eol;
08223                 int ec=0;
08224                 dcc_send_msg((*i).socket,disp,ec);
08225                 (*i).filesystem=5500;
08226                 return;
08227             }
08228         }
08229         (*i).filesystem=5200;
08230         return;
08231     }
08232 
08233     if((*i).filesystem==5200) {
08234         string disp=lang_get_string(1,(*i).lang,306)+eol;
08235         int ec=0;
08236         dcc_send_msg((*i).socket,disp,ec);
08237         (*i).filesystem=4001;
08238         return;
08239     }
08240 
08241     if((*i).filesystem==7000) {
08242         string disp=lang_get_string(1,(*i).lang,433)+eol;
08243         time_t ex=(*i).fs.file.expiration;
08244         if(ex==0)
08245             disp+=lang_get_string(1,(*i).lang,434)+eol;
08246         else {
08247             char* t1=ctime(&ex);
08248             char t2[128];
08249             strcpy(t2,t1);
08250             t2[strlen(t2)-1]=0; // get rid of \n
08251             disp+=t2;
08252         }
08253 
08254         disp+=lang_get_string(1,(*i).lang,435)+eol;
08255         int ec=0;
08256         dcc_send_msg((*i).socket,disp,ec);
08257 
08258         (*i).filesystem++;
08259         return;
08260     }
08261     if((*i).filesystem==7001) {
08262         string p=c;
08263         if(p.empty())
08264             return;
08265 
08266         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08267             string disp=lang_get_string(1,(*i).lang,435)+eol; // !!!
08268             int ec=0;
08269             dcc_send_msg((*i).socket,disp,ec);
08270         } else {
08271             if(!p.compare("n") || !p.compare("N")) {
08272                 (*i).filesystem=2000;
08273                 return;
08274             } else {
08275                 string disp=lang_get_string(1,(*i).lang,436)+eol; // !!!
08276                 int ec=0;
08277                 dcc_send_msg((*i).socket,disp,ec);
08278                 (*i).filesystem++;
08279                 return;
08280             }
08281         }
08282     }
08283     if((*i).filesystem==7002) {
08284         string p=c;
08285         if(p.empty())
08286             return;
08287 
08288         int x=atol(p.c_str());
08289         if(x==0) {
08290             (*i).fs.file.expiration=0;
08291             string disp=lang_get_string(1,(*i).lang,441)+eol; // !!!
08292             int ec=0;
08293             dcc_send_msg((*i).socket,disp,ec);
08294             (*i).filesystem=2000;
08295             return;
08296         }
08297         if(x<1970) {
08298             string disp=lang_get_string(1,(*i).lang,436)+eol; // !!!
08299             int ec=0;
08300             dcc_send_msg((*i).socket,disp,ec);
08301             return;
08302         }
08303         (*i).filesystem_expiration.tm_year=x;
08304         string disp=lang_get_string(1,(*i).lang,437)+eol; // !!!
08305         int ec=0;
08306         dcc_send_msg((*i).socket,disp,ec);
08307         (*i).filesystem++;
08308         return;
08309     }
08310     if((*i).filesystem==7003) {
08311         string p=c;
08312         if(p.empty())
08313             return;
08314 
08315         int x=atol(p.c_str());
08316         if(x<1 || x>12) {
08317             string disp=lang_get_string(1,(*i).lang,437)+eol; // !!!
08318             int ec=0;
08319             dcc_send_msg((*i).socket,disp,ec);
08320             return;
08321         }
08322         (*i).filesystem_expiration.tm_mon=x;
08323         string disp=lang_get_string(1,(*i).lang,438)+eol; // !!!
08324         int ec=0;
08325         dcc_send_msg((*i).socket,disp,ec);
08326         (*i).filesystem++;
08327         return;
08328     }
08329     if((*i).filesystem==7004) {
08330         string p=c;
08331         if(p.empty())
08332             return;
08333 
08334         int x=atol(p.c_str());
08335         if(x<1 || x>31) {
08336             string disp=lang_get_string(1,(*i).lang,438)+eol; // !!!
08337             int ec=0;
08338             dcc_send_msg((*i).socket,disp,ec);
08339             return;
08340         }
08341         (*i).filesystem_expiration.tm_mday=x;
08342         string disp=lang_get_string(1,(*i).lang,439)+eol; // !!!
08343         int ec=0;
08344         dcc_send_msg((*i).socket,disp,ec);
08345         (*i).filesystem++;
08346         return;
08347     }
08348     if((*i).filesystem==7005) {
08349         string p=c;
08350         if(p.empty())
08351             return;
08352 
08353         int x=atol(p.c_str());
08354         if(x<0 || x>23) {
08355             string disp=lang_get_string(1,(*i).lang,439)+eol; // !!!
08356             int ec=0;
08357             dcc_send_msg((*i).socket,disp,ec);
08358             return;
08359         }
08360         (*i).filesystem_expiration.tm_hour=x;
08361         string disp=lang_get_string(1,(*i).lang,440)+eol; // !!!
08362         int ec=0;
08363         dcc_send_msg((*i).socket,disp,ec);
08364         (*i).filesystem++;
08365         return;
08366     }
08367     if((*i).filesystem==7006) {
08368         string p=c;
08369         if(p.empty())
08370             return;
08371 
08372         int x=atol(p.c_str());
08373         if(x<0 || x>59) {
08374             string disp=lang_get_string(1,(*i).lang,440)+eol; // !!!
08375             int ec=0;
08376             dcc_send_msg((*i).socket,disp,ec);
08377             return;
08378         }
08379         (*i).filesystem_expiration.tm_min=x;
08380         (*i).filesystem_expiration.tm_isdst=-1;
08381         (*i).filesystem_expiration.tm_sec=0;
08382         (*i).filesystem_expiration.tm_wday=0;
08383         (*i).filesystem_expiration.tm_yday=0;
08384 
08385         (*i).filesystem_expiration.tm_mon-=1;
08386         (*i).filesystem_expiration.tm_year-=1900;
08387 
08388         time_t ex=mktime(&(*i).filesystem_expiration);
08389         if(ex==-1) {
08390             string disp=lang_get_string(1,(*i).lang,442)+eol; // !!!
08391             disp+=lang_get_string(1,(*i).lang,436)+eol; // !!!
08392             int ec=0;
08393             dcc_send_msg((*i).socket,disp,ec);
08394             (*i).filesystem=7002;
08395             return;
08396         }
08397         if(ex<time(NULL)) {
08398             string disp=lang_get_string(1,(*i).lang,443)+eol; // !!!
08399             disp+=lang_get_string(1,(*i).lang,436)+eol; // !!!
08400             int ec=0;
08401             dcc_send_msg((*i).socket,disp,ec);
08402             (*i).filesystem=7002;
08403             return;
08404         }
08405 
08406         (*i).fs.file.expiration=ex;
08407 
08408         string disp=lang_get_string(1,(*i).lang,433)+eol;
08409         if(ex==0)
08410             disp+=lang_get_string(1,(*i).lang,434)+eol;
08411         else {
08412             char* t1=ctime(&ex);
08413             char t2[128];
08414             strcpy(t2,t1);
08415             t2[strlen(t2)-1]=0; // get rid of \n
08416             disp+=t2;
08417         }
08418 
08419         int ec=0;
08420         dcc_send_msg((*i).socket,disp,ec);
08421         (*i).filesystem=2000;
08422         return;
08423     }
08424 
08425     // also unknown users?
08426     if((*i).filesystem==8000) {
08427         string disp=lang_get_string(1,(*i).lang,476)+eol;
08428         int ec=0;
08429         dcc_send_msg((*i).socket,disp,ec);
08430         (*i).filesystem++;
08431         return;
08432     }
08433     if((*i).filesystem==8001) {
08434         string p=c;
08435         if(!p.compare(""))
08436             return;
08437 
08438         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08439             string disp=lang_get_string(1,(*i).lang,476)+eol;
08440             int ec=0;
08441             dcc_send_msg((*i).socket,disp,ec);
08442         } else {
08443             if(!p.compare("n") || !p.compare("N")) {
08444                 (*i).fs.new_access.also_unknown=false;
08445             } else {
08446                 (*i).fs.new_access.also_unknown=true;;
08447             }
08448             string disp=lang_get_string(1,(*i).lang,339)+eol;
08449             int ec=0;
08450             dcc_send_msg((*i).socket,disp,ec);
08451             (*i).filesystem=4000;
08452             return;
08453         }
08454         return;
08455     }
08456 }

Here is the call graph for this function:

string dcc_loop_filesystem_disp_rights string  lang,
s_access access,
string  eol
 

Returns access rights to file.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
lang Language code
eol End-of-line string
access Access descriptor
Returns:
User-friendly list of access rights

Definition at line 7081 of file dcc.cpp.

References s_access::all_on_channel, s_access::all_users, s_access::also_unknown, s_access::del, lang_get_string(), lang_subst(), s_access::notify_owner, s_access::notify_user, s_access::owner, s_access::read, s_access::secure, and s_access::user_name.

Referenced by dcc_loop_filesystem().

07082 {
07083     string disp;
07084     if(access.all_users)
07085         disp+=lang_get_string(1,lang,294)+eol;
07086     else 
07087         if(!access.all_on_channel.empty()) {
07088             disp+=lang_subst(lang_get_string(1,lang,295),(string)"*"+access.all_on_channel);
07089             if(access.also_unknown)
07090                 disp+=(string)" "+lang_get_string(1,lang,474);
07091             disp+=eol;
07092         } else
07093             disp+=lang_subst(lang_get_string(1,lang,295),access.user_name)+eol;
07094     disp+="   ";
07095     bool plus=false;
07096     if(access.owner) {
07097         disp+=lang_get_string(1,lang,296);
07098         plus=true;
07099     }
07100     if(access.read) {
07101         if(plus)
07102             disp+=lang_get_string(1,lang,301);
07103         disp+=lang_get_string(1,lang,297);
07104         plus=true;
07105     }
07106     if(access.del) {
07107         if(plus)
07108             disp+=lang_get_string(1,lang,301);
07109         disp+=lang_get_string(1,lang,298);
07110         plus=true;
07111     }
07112     if(access.notify_owner) {
07113         if(plus)
07114             disp+=lang_get_string(1,lang,301);
07115         disp+=lang_get_string(1,lang,299);
07116         plus=true;
07117     }
07118     if(access.notify_user) {
07119         if(plus)
07120             disp+=lang_get_string(1,lang,301);
07121         disp+=lang_get_string(1,lang,300);
07122         plus=true;
07123     }
07124     if(access.secure) {
07125         if(plus)
07126             disp+=lang_get_string(1,lang,301);
07127         disp+=lang_get_string(1,lang,330);
07128         plus=true;
07129     }
07130     if(!plus) {
07131         disp+=lang_get_string(1,lang,322);
07132     }
07133     disp+=eol;
07134 
07135     return disp;
07136 }

Here is the call graph for this function:

void dcc_loop_get_rights vector< s_dcc_client >::iterator  i  ) 
 

Gets/resets user's access rights.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection

Definition at line 16162 of file dcc.cpp.

References logic_partyline_access(), and logic_partyline_get_user().

Referenced by dcc_apply(), dcc_loop(), and dcc_rehashed().

16163 {
16164     (*i).chs.clear();
16165     logic_partyline_get_user((*i).as_in_logic,(*i).u,(*i).chs);
16166     logic_partyline_access(
16167         (*i).as_in_logic,
16168         (*i).access_to_users,
16169         (*i).access_to_groups,
16170         (*i).access_grant_groups,
16171         (*i).access_to_proc_groups,
16172         (*i).access_grant_proc_groups,
16173         (*i).access_grant_proc,
16174         (*i).access_to_channel,
16175         (*i).access_grant_channel,
16176         (*i).access_grant_partyline,
16177         (*i).access_to_procs,
16178         (*i).access_to_backup,
16179         (*i).access_grant_backup,
16180         (*i).access_to_rehash,
16181         (*i).access_grant_rehash,
16182         (*i).access_to_plususer,
16183         (*i).access_grant_plususer,
16184         (*i).access_to_plusproc,
16185         (*i).access_grant_plusproc,
16186         (*i).partyline_msg_flood,
16187         (*i).access_to_replication,
16188         (*i).access_grant_replication,
16189         (*i).access_to_chan_defs,
16190         (*i).access_to_restart,
16191         (*i).access_grant_restart,
16192         (*i).access_to_die,
16193         (*i).access_grant_die,
16194         (*i).access_to_filesystem,
16195         (*i).access_grant_filesystem,
16196         (*i).access_to_private,
16197         (*i).access_grant_private,
16198         (*i).access_to_can_send_all_users,
16199         (*i).access_grant_can_send_all_users,
16200         (*i).access_to_can_send_unknown_users,
16201         (*i).access_grant_can_send_unknown_users,
16202         (*i).access_usage_proc,
16203         (*i).access_usage_proc_groups,
16204         (*i).access_to_upgrade,
16205         (*i).access_grant_upgrade,
16206         (*i).access_to_apply,
16207         (*i).access_grant_apply
16208         );
16209 }

Here is the call graph for this function:

void dcc_loop_language vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process .lang commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 9326 of file dcc.cpp.

References dcc_get_line(), dcc_send_msg(), lang_get_langs(), lang_get_string(), and lang_subst().

Referenced by dcc_loop().

09327 {
09328     if((*i).language==1) {
09329         string disp=lang_get_string(1,(*i).lang,451)+eol;
09330         vector<string> langs;
09331         lang_get_langs(1,langs);
09332         vector<string>::iterator i1;
09333         for(i1=langs.begin(); i1!=langs.end(); i1++) {
09334             disp+=lang_subst(lang_get_string(1,*i1,452),*i1)+eol;
09335             disp+="    ";
09336             disp+=lang_get_string(1,*i1,0)+eol;
09337         }
09338         int ec=0;
09339         dcc_send_msg((*i).socket,disp,ec);
09340 
09341         (*i).language++;
09342         return;
09343     }
09344 
09345     if((*i).language==2) {
09346         string p=dcc_get_line((*i).in_buff);
09347         if(!p.compare(""))
09348             return;
09349 
09350         vector<string> langs;
09351         lang_get_langs(1,langs);
09352         vector<string>::iterator i1;
09353         bool got=false;
09354         for(i1=langs.begin(); i1!=langs.end(); i1++) {
09355             if(!(*i1).compare(p)) {
09356                 (*i).lang=*i1;
09357                 got=true;
09358                 break;
09359             }
09360         }
09361         if(!got)
09362             (*i).language--;
09363         else {
09364             (*i).language=0;
09365             string disp=lang_get_string(1,(*i).lang,463)+eol;
09366             int ec=0;
09367             dcc_send_msg((*i).socket,disp,ec);
09368         }
09369         return;
09370     }
09371 }

Here is the call graph for this function:

void dcc_loop_msg vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process message/filesystem commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 2157 of file dcc.cpp.

References s_access::all_users, cmp_strings_case_insensitive(), conf_getvar(), dcc_get_line(), dcc_send_msg(), s_access::del, filesys_dcc_add_message(), s_user::host_unknown, lang_get_string(), logic_eval(), logic_filesys_got_new(), logic_partyline_get_user(), s_access::owner, r_channels, r_users, s_access::read, s_access::secure, and s_access::user_name.

Referenced by dcc_loop().

02158 {
02159     if((*i).msg==0)
02160         return;
02161 
02162     if((*i).msg==1) {
02163         (*i).fs.file.clear();
02164         (*i).fs.name="";
02165         (*i).fs.new_access.clear();
02166         (*i).msg_expiration=0;
02167 
02168         (*i).msg_content="";
02169 
02170         string disp=lang_get_string(1,(*i).lang,315)+eol;
02171         vector<s_user>::iterator i1;
02172         for(i1=r_users.begin(); i1!=r_users.end(); i1++)
02173             disp+=(*i1).name+eol;
02174         disp+=lang_get_string(1,(*i).lang,316)+eol;
02175         disp+=lang_get_string(1,(*i).lang,338)+eol;
02176         int ec=0;
02177         dcc_send_msg((*i).socket,disp,ec);
02178         (*i).msg++;
02179         return;
02180     }
02181 
02182     if((*i).msg==2) {
02183         string p=dcc_get_line((*i).in_buff);
02184         if(!p.compare(""))
02185             return;
02186 
02187         if(!p.compare(".")) {
02188             (*i).msg++;
02189             string disp=lang_get_string(1,(*i).lang,337)+eol;
02190             int ec=0;
02191             dcc_send_msg((*i).socket,disp,ec);
02192             return;
02193         }
02194         bool all_users=!p.compare("*");
02195         string all_channel;
02196         if(p.length()>=2 && p[0]=='*') {
02197             p.erase(0,1);
02198             bool got=false;
02199             vector<string>::iterator i1;
02200             for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
02201                 if(!cmp_strings_case_insensitive(*i1,p)) {
02202                     got=true;
02203                     break;
02204                 }
02205             if(got) {
02206                 all_channel=p;
02207             } else {
02208                 all_channel="";
02209                 all_users=false;
02210                 string disp=lang_get_string(1,(*i).lang,323)+eol;
02211                 int ec=0;
02212                 dcc_send_msg((*i).socket,disp,ec);
02213                 return;
02214             }
02215         }
02216 
02217         if(!all_users && all_channel.empty()) {
02218             string disp=lang_get_string(1,(*i).lang,304)+eol;
02219             disp+=lang_get_string(1,(*i).lang,315)+eol;
02220             vector<s_user>::iterator i1;
02221             for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
02222                 disp+=(*i1).name+eol;
02223                 if(!(*i1).name.compare(p)) {
02224                     (*i).fs.new_access.clear();
02225                     (*i).fs.new_access.user_name=p;
02226     
02227                     s_user u;
02228                     vector<s_channel> chs;
02229                     logic_partyline_get_user(p,u,chs);
02230                     bool unknown_user=u.host_unknown;
02231                     logic_partyline_get_user((*i).as_in_logic,u,chs);
02232                     vector<s_channel>::iterator i2;
02233                     bool can=(*i).access_to_can_send_unknown_users;
02234                     /*for(i2=chs.begin(); i2!=chs.end(); i2++)
02235                         if(!cmp_strings_case_insensitive((*i2).channel_name,p)) {
02236                             can&=(*i2).can_send_unknown_users;
02237                             break;
02238                         }*/
02239                     if(!unknown_user)
02240                         can=true;
02241                     if(unknown_user && !can) {
02242                         string disp=lang_get_string(1,(*i).lang,480)+eol;
02243                         int ec=0;
02244                         dcc_send_msg((*i).socket,disp,ec);
02245                         return;
02246                     }
02247                     (*i).fs.new_access.user_name=p;
02248                     (*i).fs.file.access.push_back((*i).fs.new_access);
02249                     (*i).fs.new_access.clear();
02250                     string disp=lang_get_string(1,(*i).lang,339)+eol;
02251                     int ec=0;
02252                     dcc_send_msg((*i).socket,disp,ec);
02253                     return;
02254                 }
02255             }
02256             int ec=0;
02257             dcc_send_msg((*i).socket,disp,ec);
02258         }
02259         if(!all_channel.empty()) {
02260             /*vector<s_channel>::iterator i1;
02261             bool got=false;
02262             map<string,string> vars;
02263             for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
02264                 if(!cmp_strings_case_insensitive(logic_eval((*i1).channel_name,vars),all_channel) && !(*i1).host_unknown) {
02265                     s_access a;
02266                     a.user_name=(*i1).username;
02267                     (*i).fs.file.access.push_back(a);
02268                     got=true;
02269                 }
02270             }*/
02271     
02272             vector<s_channel>::iterator i1;
02273             bool got=false;
02274             map<string,string> vars;
02275             for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
02276                 if(!(*i).as_in_logic.compare((*i1).username) && !cmp_strings_case_insensitive(logic_eval((*i1).channel_name,vars),all_channel) && !(*i1).host_unknown && (*i1).can_send_unknown_users) {
02277                     (*i).fs.new_access.clear();
02278                     (*i).fs.new_access.all_on_channel=all_channel;
02279                     got=true;
02280                     break;
02281                 }
02282             }
02283 
02284             if(!got) {
02285                 (*i).fs.new_access.clear();
02286                 (*i).fs.new_access.all_on_channel=all_channel;
02287                 (*i).fs.file.access.push_back((*i).fs.new_access);
02288 
02289                 string disp=lang_get_string(1,(*i).lang,339)+eol;
02290                 int ec=0;
02291                 dcc_send_msg((*i).socket,disp,ec);
02292                 return;
02293             }
02294             (*i).msg=2000;
02295             return;
02296         }
02297         if(all_users) {
02298             if(!(*i).access_to_can_send_all_users) {
02299                 string disp=lang_get_string(1,(*i).lang,479)+eol;
02300                 int ec=0;
02301                 dcc_send_msg((*i).socket,disp,ec);
02302                 return;
02303             }
02304 
02305             s_access a;
02306             a.all_users=true;
02307             (*i).fs.file.access.clear();
02308             (*i).fs.file.access.push_back(a);
02309             (*i).msg++;
02310 
02311             string disp=lang_get_string(1,(*i).lang,337)+eol;
02312             int ec=0;
02313             dcc_send_msg((*i).socket,disp,ec);
02314         }
02315         return;
02316     }
02317 
02318     if((*i).msg==3) {
02319         string p=dcc_get_line((*i).in_buff);
02320         if(!p.compare(""))
02321             return;
02322 
02323         if(p.compare(".")) {
02324             if(atol(conf_getvar("dcc_max_message_size").c_str())!=0 && (*i).msg_content.length()+p.length()>(unsigned)atol(conf_getvar("dcc_max_message_size").c_str())) {
02325                 string disp=lang_get_string(1,(*i).lang,613)+eol;
02326                 int ec=0;
02327                 dcc_send_msg((*i).socket,disp,ec);
02328             } else {
02329                 (*i).msg_content+=p;
02330                 (*i).msg_content+="\n";
02331             }
02332         } else {
02333             (*i).msg++;
02334         }
02335         return;
02336     }
02337 
02338     // attr's
02339     if((*i).msg==4) {
02340         string disp=lang_get_string(1,(*i).lang,340)+eol;
02341         int ec=0;
02342         dcc_send_msg((*i).socket,disp,ec);
02343         (*i).msg++;
02344         return;
02345     }
02346 
02347     if((*i).msg==5) {
02348         string p=dcc_get_line((*i).in_buff);
02349         if(!p.compare(""))
02350             return;
02351 
02352         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
02353             string disp=lang_get_string(1,(*i).lang,340)+eol;
02354             int ec=0;
02355             dcc_send_msg((*i).socket,disp,ec);
02356         } else {
02357             if(!p.compare("n") || !p.compare("N")) {
02358             } else {
02359                 vector<s_access>::iterator i1;
02360                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
02361                     (*i1).notify_owner=true;
02362             }
02363             (*i).msg++;
02364             return;
02365         }
02366     }
02367 
02368     if((*i).msg==6) {
02369         string disp=lang_get_string(1,(*i).lang,341)+eol;
02370         int ec=0;
02371         dcc_send_msg((*i).socket,disp,ec);
02372         (*i).msg++;
02373         return;
02374     }
02375 
02376     if((*i).msg==7) {
02377         string p=dcc_get_line((*i).in_buff);
02378         if(!p.compare(""))
02379             return;
02380 
02381         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
02382             string disp=lang_get_string(1,(*i).lang,341)+eol;
02383             int ec=0;
02384             dcc_send_msg((*i).socket,disp,ec);
02385         } else {
02386             if(!p.compare("n") || !p.compare("N")) {
02387                 vector<s_access>::iterator i1;
02388                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
02389                     (*i1).secure=false;
02390             } else {
02391                 vector<s_access>::iterator i1;
02392                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++)
02393                     (*i1).secure=true;
02394             }
02395             (*i).msg++;
02396             return;
02397         }
02398     }
02399 
02400     if((*i).msg==8) {
02401         (*i).msg++;
02402         return;
02403     }
02404 
02405     if((*i).msg==9) {
02406         string disp=lang_get_string(1,(*i).lang,473)+eol;
02407         int ec=0;
02408         dcc_send_msg((*i).socket,disp,ec);
02409         (*i).msg++;
02410         return;
02411     }
02412 
02413     if((*i).msg==10) {
02414         string p=dcc_get_line((*i).in_buff);
02415         if(p.empty())
02416             return;
02417 
02418         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
02419             string disp=lang_get_string(1,(*i).lang,473)+eol; // !!!
02420             int ec=0;
02421             dcc_send_msg((*i).socket,disp,ec);
02422         } else {
02423             if(!p.compare("n") || !p.compare("N")) {
02424                 (*i).msg=1000;
02425                 return;
02426             } else {
02427                 string disp=lang_get_string(1,(*i).lang,436)+eol; // !!!
02428                 int ec=0;
02429                 dcc_send_msg((*i).socket,disp,ec);
02430                 (*i).msg++;
02431                 return;
02432             }
02433         }
02434     }
02435     if((*i).msg==11) {
02436         string p=dcc_get_line((*i).in_buff);
02437         if(p.empty())
02438             return;
02439 
02440         int x=atol(p.c_str());
02441         if(x==0) {
02442             (*i).fs.file.expiration=0;
02443             string disp=lang_get_string(1,(*i).lang,441)+eol; // !!!
02444             int ec=0;
02445             dcc_send_msg((*i).socket,disp,ec);
02446             (*i).msg=1000;
02447             return;
02448         }
02449         if(x<1970) {
02450             string disp=lang_get_string(1,(*i).lang,436)+eol; // !!!
02451             int ec=0;
02452             dcc_send_msg((*i).socket,disp,ec);
02453             return;
02454         }
02455         (*i).filesystem_expiration.tm_year=x;
02456         string disp=lang_get_string(1,(*i).lang,437)+eol; // !!!
02457         int ec=0;
02458         dcc_send_msg((*i).socket,disp,ec);
02459         (*i).msg++;
02460         return;
02461     }
02462     if((*i).msg==12) {
02463         string p=dcc_get_line((*i).in_buff);
02464         if(p.empty())
02465             return;
02466 
02467         int x=atol(p.c_str());
02468         if(x<1 || x>12) {
02469             string disp=lang_get_string(1,(*i).lang,437)+eol; // !!!
02470             int ec=0;
02471             dcc_send_msg((*i).socket,disp,ec);
02472             return;
02473         }
02474         (*i).filesystem_expiration.tm_mon=x;
02475         string disp=lang_get_string(1,(*i).lang,438)+eol; // !!!
02476         int ec=0;
02477         dcc_send_msg((*i).socket,disp,ec);
02478         (*i).msg++;
02479         return;
02480     }
02481     if((*i).msg==13) {
02482         string p=dcc_get_line((*i).in_buff);
02483         if(p.empty())
02484             return;
02485 
02486         int x=atol(p.c_str());
02487         if(x<1 || x>31) {
02488             string disp=lang_get_string(1,(*i).lang,438)+eol; // !!!
02489             int ec=0;
02490             dcc_send_msg((*i).socket,disp,ec);
02491             return;
02492         }
02493         (*i).filesystem_expiration.tm_mday=x;
02494         string disp=lang_get_string(1,(*i).lang,439)+eol; // !!!
02495         int ec=0;
02496         dcc_send_msg((*i).socket,disp,ec);
02497         (*i).msg++;
02498         return;
02499     }
02500     if((*i).msg==14) {
02501         string p=dcc_get_line((*i).in_buff);
02502         if(p.empty())
02503             return;
02504 
02505         int x=atol(p.c_str());
02506         if(x<0 || x>23) {
02507             string disp=lang_get_string(1,(*i).lang,439)+eol; // !!!
02508             int ec=0;
02509             dcc_send_msg((*i).socket,disp,ec);
02510             return;
02511         }
02512         (*i).filesystem_expiration.tm_hour=x;
02513         string disp=lang_get_string(1,(*i).lang,440)+eol; // !!!
02514         int ec=0;
02515         dcc_send_msg((*i).socket,disp,ec);
02516         (*i).msg++;
02517         return;
02518     }
02519     if((*i).msg==15) {
02520         string p=dcc_get_line((*i).in_buff);
02521         if(p.empty())
02522             return;
02523 
02524         int x=atol(p.c_str());
02525         if(x<0 || x>59) {
02526             string disp=lang_get_string(1,(*i).lang,440)+eol; // !!!
02527             int ec=0;
02528             dcc_send_msg((*i).socket,disp,ec);
02529             return;
02530         }
02531         (*i).filesystem_expiration.tm_min=x;
02532         (*i).filesystem_expiration.tm_isdst=-1;
02533         (*i).filesystem_expiration.tm_sec=0;
02534         (*i).filesystem_expiration.tm_wday=0;
02535         (*i).filesystem_expiration.tm_yday=0;
02536 
02537         (*i).filesystem_expiration.tm_mon-=1;
02538         (*i).filesystem_expiration.tm_year-=1900;
02539 
02540         time_t ex=mktime(&(*i).filesystem_expiration);
02541         if(ex==-1) {
02542             string disp=lang_get_string(1,(*i).lang,442)+eol; // !!!
02543             disp+=lang_get_string(1,(*i).lang,436)+eol; // !!!
02544             int ec=0;
02545             dcc_send_msg((*i).socket,disp,ec);
02546             (*i).msg=11;
02547             return;
02548         }
02549         if(ex<time(NULL)) {
02550             string disp=lang_get_string(1,(*i).lang,443)+eol; // !!!
02551             disp+=lang_get_string(1,(*i).lang,436)+eol; // !!!
02552             int ec=0;
02553             dcc_send_msg((*i).socket,disp,ec);
02554             (*i).msg=11;
02555             return;
02556         }
02557 
02558         (*i).msg_expiration=ex;
02559 
02560         string disp=lang_get_string(1,(*i).lang,433)+eol;
02561         if(ex==0)
02562             disp+=lang_get_string(1,(*i).lang,434)+eol;
02563         else {
02564             char* t1=ctime(&ex);
02565             char t2[128];
02566             strcpy(t2,t1);
02567             t2[strlen(t2)-1]=0; // get rid of \n
02568             disp+=t2;
02569             disp+=eol;
02570         }
02571 
02572         int ec=0;
02573         dcc_send_msg((*i).socket,disp,ec);
02574         (*i).msg=1000;
02575         return;
02576     }
02577 
02578     if((*i).msg==1000) {
02579         string disp=lang_get_string(1,(*i).lang,342)+eol;
02580         int ec=0;
02581         dcc_send_msg((*i).socket,disp,ec);
02582         (*i).msg++;
02583         return;
02584     }
02585 
02586     if((*i).msg==1001) {
02587         string p=dcc_get_line((*i).in_buff);
02588         if(!p.compare(""))
02589             return;
02590 
02591         (*i).fs.file.public_name=p;
02592         (*i).fs.file.expiration=(*i).msg_expiration;
02593 
02594         string disp=lang_get_string(1,(*i).lang,343)+eol;
02595         int ec=0;
02596         dcc_send_msg((*i).socket,disp,ec);
02597         (*i).msg++;
02598         return;
02599     }
02600 
02601     if((*i).msg==1002) {
02602         string p=dcc_get_line((*i).in_buff);
02603         if(!p.compare(""))
02604             return;
02605 
02606         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
02607             string disp=lang_get_string(1,(*i).lang,343)+eol;
02608             int ec=0;
02609             dcc_send_msg((*i).socket,disp,ec);
02610         } else {
02611             if(!p.compare("n") || !p.compare("N")) {
02612                 string disp=lang_get_string(1,(*i).lang,344)+eol;
02613                 int ec=0;
02614                 dcc_send_msg((*i).socket,disp,ec);
02615                 (*i).fs.file.clear();
02616                 (*i).fs.name="";
02617                 (*i).fs.new_access.clear();
02618                 (*i).msg=0;
02619             } else {
02620 l1:
02621                 vector<s_access>::iterator i1;
02622 
02623                 bool read=true;
02624                 bool notify_user=true;
02625                 bool old_secure=false;
02626                 bool notify_owner=false;
02627 
02628                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
02629                     read|=(*i1).read;
02630                     notify_user|=(*i1).notify_user;
02631                     notify_owner|=(*i1).notify_owner;
02632                     old_secure|=(*i1).secure;
02633                 }
02634 
02635                 // erase duplicates
02636                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
02637                     vector<s_access>::iterator i2;
02638                     for(i2=(*i).fs.file.access.begin(); i2!=(*i).fs.file.access.end(); i2++) {
02639                         if(i1==i2)
02640                             continue;
02641                         if((!(*i2).user_name.compare((*i1).user_name) || (*i2).all_users) && !(*i2).user_name.empty()) {
02642                             (*i).fs.file.access.erase(i2);
02643                             goto l1;
02644                         }
02645                     }
02646                 }
02647 
02648                 for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
02649                     (*i1).read=read;
02650                     (*i1).notify_user=notify_user;
02651                     (*i1).notify_owner=notify_owner;
02652                     (*i1).secure=old_secure;
02653                 }
02654 
02655                 /*for(i1=(*i).fs.file.access.begin(); i1!=(*i).fs.file.access.end(); i1++) {
02656                     (*i1).read=true;
02657                     (*i1).notify_user=true;
02658                     old_secure=(*i1).secure;
02659                 }*/
02660 
02661                 s_access a;
02662                 a.del=true;
02663                 a.owner=true;
02664                 a.read=true;
02665                 a.secure=old_secure;
02666                 a.user_name=(*i).as_in_logic;
02667                 (*i).fs.file.access.push_back(a);
02668 
02669                 bool force_secure=false;
02670                 string internal_name=filesys_dcc_add_message((*i).as_in_logic,(*i).fs.file,(*i).msg_content,force_secure);
02671 
02672                 string disp;
02673                 if(!old_secure && force_secure)
02674                     disp+=lang_get_string(1,(*i).lang,346)+eol;
02675 
02676                 disp+=lang_get_string(1,(*i).lang,345)+eol;
02677                 int ec=0;
02678                 dcc_send_msg((*i).socket,disp,ec);
02679 
02680                 (*i).fs.file.clear();
02681                 (*i).fs.name="";
02682                 (*i).fs.new_access.clear();
02683                 (*i).msg_content="";
02684                 (*i).msg=0;
02685 
02686                 logic_filesys_got_new((*i).as_in_logic,"","","",internal_name);
02687             }
02688             (*i).msg=0;
02689             return;
02690         }
02691     }
02692 
02693     // also unknown users?
02694     if((*i).msg==2000) {
02695         string disp=lang_get_string(1,(*i).lang,476)+eol;
02696         int ec=0;
02697         dcc_send_msg((*i).socket,disp,ec);
02698         (*i).msg++;
02699         return;
02700     }
02701     if((*i).msg==2001) {
02702         string p=dcc_get_line((*i).in_buff);
02703         if(!p.compare(""))
02704             return;
02705 
02706         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
02707             string disp=lang_get_string(1,(*i).lang,476)+eol;
02708             int ec=0;
02709             dcc_send_msg((*i).socket,disp,ec);
02710         } else {
02711             if(!p.compare("n") || !p.compare("N")) {
02712                 (*i).fs.new_access.also_unknown=false;
02713             } else {
02714                 (*i).fs.new_access.also_unknown=true;;
02715             }
02716             (*i).fs.file.access.push_back((*i).fs.new_access);
02717             (*i).fs.new_access.clear();
02718             string disp=lang_get_string(1,(*i).lang,339)+eol;
02719             int ec=0;
02720             dcc_send_msg((*i).socket,disp,ec);
02721             (*i).msg=2;
02722             return;
02723         }
02724         return;
02725     }
02726 }

Here is the call graph for this function:

void dcc_loop_new_user vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process new user commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 3429 of file dcc.cpp.

References s_user::access_grant_apply, s_user::access_grant_backup, s_user::access_grant_can_send_all_users, s_user::access_grant_can_send_unknown_users, s_user::access_grant_channel, s_user::access_grant_die, s_user::access_grant_filesystem, s_user::access_grant_group, s_user::access_grant_partyline, s_user::access_grant_plusproc, s_user::access_grant_plususer, s_user::access_grant_private, s_user::access_grant_procedure, s_user::access_grant_rehash, s_user::access_grant_replication, s_user::access_grant_restart, s_user::access_grant_upgrade, s_user::access_to_apply, s_user::access_to_backup, s_user::access_to_can_send_all_users, s_user::access_to_can_send_unknown_users, s_user::access_to_channel, s_user::access_to_die, s_user::access_to_filesystem, s_user::access_to_group, s_user::access_to_partyline, s_user::access_to_plusproc, s_user::access_to_plususer, s_user::access_to_private, s_user::access_to_proc, s_user::access_to_rehash, s_user::access_to_replication, s_user::access_to_restart, s_user::access_to_upgrade, s_user::access_usage_procedure, s_channel::allow_dynamic, s_channel::can_send_unknown_users, s_channel::channel_name, s_channel::configured, s_channel::ctcp_flood, dcc_can_unassign(), dcc_get_line(), s_user::dcc_hosts, dcc_send_msg(), s_user::fullname, s_user::groups, s_user::host_bot, s_user::host_unknown, s_user::hostmask, s_user::is_template, s_channel::join_flood, lang_get_string(), lang_subst(), s_user::last_changed, s_flood::lines, logic_partyline_add_user(), logic_partyline_get_channels(), logic_partyline_get_user_template(), logic_partyline_user_exists(), s_user::meta, s_channel::mode_flood, s_channel::msg_flood, s_group::name, s_user::name, s_channel::nick_flood, s_channel::notice_flood, s_channel::on_ban, s_channel::on_banned, s_channel::on_creator, s_channel::on_decreator, s_channel::on_deop, s_channel::on_devoice, s_channel::on_except, s_channel::on_flood, s_channel::on_invite, s_channel::on_join, s_channel::on_kick, s_channel::on_not_in_reop, s_channel::on_not_invited, s_channel::on_notice, s_channel::on_op, s_channel::on_other_mode, s_channel::on_privmsg, s_channel::on_reop, s_channel::on_unban, s_channel::on_unexcept, s_channel::on_uninvite, s_channel::on_voice, s_user::partyline_msg_flood, r_user_templates, s_channel::repeat_flood, and s_channel::username.

Referenced by dcc_loop().

03430 {
03431     if((*i).new_user==-1) {
03432                 string p=dcc_get_line((*i).in_buff);
03433                 if(!p.compare(""))
03434                     return;
03435                 if(p.compare(".")) {
03436                     bool got=false;
03437                     vector<string>::iterator i1;
03438                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
03439                         if(!(*i1).compare(p)) {
03440                             got=true;
03441                             p=(string)"\""+p+"\"";
03442                             (*i).user_member_of.push_back(p);
03443                             break;
03444                         }
03445                     if(got) {
03446                         string disp=lang_subst(lang_get_string(1,(*i).lang,104),p)+eol;
03447                         int ec=0;
03448                         dcc_send_msg((*i).socket,disp,ec);
03449                     } else {
03450                         string disp=lang_subst(lang_get_string(1,(*i).lang,47),p)+eol;
03451                         int ec=0;
03452                         dcc_send_msg((*i).socket,disp,ec);
03453                     }
03454                 } else {
03455                     string disp=lang_subst(lang_get_string(1,(*i).lang,34),p)+eol;
03456                     int ec=0;
03457                     dcc_send_msg((*i).socket,disp,ec);
03458                     (*i).new_user=2;
03459                 }
03460             }
03461 
03462             if((*i).new_user==1) {
03463                 string p=dcc_get_line((*i).in_buff);
03464                 if(!p.compare(""))
03465                     return;
03466                 if(logic_partyline_user_exists(p)) {
03467                     string disp=lang_subst(lang_get_string(1,(*i).lang,33),p)+eol;
03468                     int ec=0;
03469                     dcc_send_msg((*i).socket,disp,ec);
03470                 } else {
03471                     (*i).new_user=-100;
03472                     (*i).user_name=p;
03473                     return;
03474                 }
03475             }
03476             if((*i).new_user==-100) {
03477                 string disp=lang_get_string(1,(*i).lang,386)+eol;
03478                 vector<s_user>::iterator i1;
03479                 bool got=false;
03480                 for(i1=r_user_templates.begin(); i1!=r_user_templates.end(); i1++) {
03481                     got=true;
03482                     disp+=(*i1).name+eol;
03483                 }
03484                 if(!got) {
03485                     disp+=lang_get_string(1,(*i).lang,387)+eol;
03486                     (*i).new_user=-150;
03487                 } else 
03488                     (*i).new_user++;
03489                 int ec=0;
03490                 dcc_send_msg((*i).socket,disp,ec);
03491                 return;
03492             }
03493             if((*i).new_user==-99) {
03494                 string p=dcc_get_line((*i).in_buff);
03495                 if(!p.compare(""))
03496                     return;
03497 
03498                 if(!p.compare(".")) {
03499                     string disp=lang_subst(lang_get_string(1,(*i).lang,389),p)+eol;
03500                     int ec=0;
03501                     dcc_send_msg((*i).socket,disp,ec);
03502                     (*i).new_user=-150;
03503                     return;
03504                 }
03505 
03506                 vector<s_user>::iterator i1;
03507                 bool got=false;
03508                 for(i1=r_user_templates.begin(); i1!=r_user_templates.end(); i1++) {
03509                     if(!(*i1).name.compare(p)) {
03510                         got=true;
03511                         break;
03512                     }
03513                 }
03514                 if(!got) {
03515                     string disp=lang_subst(lang_get_string(1,(*i).lang,388),p)+eol;
03516                     int ec=0;
03517                     dcc_send_msg((*i).socket,disp,ec);
03518                     (*i).new_user=-100;
03519                     return;
03520                 } else {
03521                     s_user u;
03522                     vector<s_channel> chs;
03523                     logic_partyline_get_user_template(p,u,chs);
03524 
03525                     u.is_template=false;
03526                     u.host_bot=false;
03527                     u.host_unknown=false;
03528 
03529                     {
03530                         (*i).user_member_of.clear();
03531                         (*i).user_hosts.clear();
03532                         (*i).user_dcc_hosts.clear();
03533                         (*i).user_fullnames.clear();
03534                         (*i).user_meta.clear();
03535                         (*i).user_access_to_groups.clear();
03536                         (*i).user_access_grant_groups.clear();
03537                         (*i).user_access_to_proc_groups.clear();
03538                         (*i).user_access_grant_proc_groups.clear();
03539                         (*i).user_access_usage_proc_groups.clear();
03540                         (*i).user_access_to_channel.clear();
03541                         (*i).user_access_grant_channel.clear();
03542                         (*i).user_channels.clear();
03543                     }
03544 
03545                     vector<s_group>::iterator i1;
03546 
03547                     for(i1=u.groups.begin(); i1!=u.groups.begin(); i1++)
03548                         (*i).user_member_of.push_back((*i1).name);
03549 
03550                     vector<string>::iterator i2;
03551                     for(i2=u.hostmask.begin(); i2!=u.hostmask.end(); i2++)
03552                         (*i).user_hosts.push_back(*i2);
03553 
03554                     vector<s_dcc_host>::iterator i3;
03555                     for(i3=u.dcc_hosts.begin(); i3!=u.dcc_hosts.end(); i3++) {
03556                         (*i).user_dcc_hosts.push_back(*i3);
03557                     }
03558 
03559                     for(i2=u.fullname.begin(); i2!=u.fullname.end(); i2++)
03560                         (*i).user_fullnames.push_back(*i2);
03561 
03562                     map<string,string>::iterator i5;
03563                     for(i5=u.meta.begin(); i5!=u.meta.end(); i5++)
03564                         (*i).user_meta.insert(*i5);
03565 
03566                     for(i2=u.access_to_group.begin(); i2!=u.access_to_group.end(); i2++)
03567                         (*i).user_access_to_groups.push_back(*i2);
03568 
03569                     for(i2=u.access_grant_group.begin(); i2!=u.access_grant_group.end(); i2++)
03570                         (*i).user_access_grant_groups.push_back(*i2);
03571 
03572                     for(i2=u.access_to_proc.begin(); i2!=u.access_to_proc.end(); i2++)
03573                         (*i).user_access_to_proc_groups.push_back(*i2);
03574 
03575                     for(i2=u.access_grant_procedure.begin(); i2!=u.access_grant_procedure.end(); i2++)
03576                         (*i).user_access_grant_proc_groups.push_back(*i2);
03577 
03578                     for(i2=u.access_usage_procedure.begin(); i2!=u.access_usage_procedure.end(); i2++)
03579                         (*i).user_access_usage_proc_groups.push_back(*i2);
03580 
03581                     for(i2=u.access_to_channel.begin(); i2!=u.access_to_channel.end(); i2++)
03582                         (*i).user_access_to_channel.push_back(*i2);
03583 
03584                     for(i2=u.access_grant_channel.begin(); i2!=u.access_grant_channel.end(); i2++)
03585                         (*i).user_access_grant_channel.push_back(*i2);
03586 
03587                     (*i).user_channels.clear();
03588                     vector<s_channel>::iterator i4;
03589                     for(i4=chs.begin(); i4!=chs.end(); i4++) {
03590                         (*i4).configured=true;
03591                         (*i4).is_template=false;
03592                         (*i).user_channels.push_back(*i4);
03593                     }
03594 
03595                     (*i).user_access_to_backup=u.access_to_backup;
03596                     (*i).user_access_to_die=u.access_to_die;
03597                     (*i).user_access_to_filesystem=u.access_to_filesystem;
03598                     (*i).user_access_to_partyline=u.access_to_partyline;
03599                     (*i).user_access_to_plusproc=u.access_to_plusproc;
03600                     (*i).user_access_to_plususer=u.access_to_plususer;
03601                     (*i).user_access_to_rehash=u.access_to_rehash;
03602                     (*i).user_access_to_restart=u.access_to_restart;
03603                     (*i).user_access_grant_backup=u.access_grant_backup;
03604                     (*i).user_access_grant_die=u.access_grant_die;
03605                     (*i).user_access_grant_filesystem=u.access_grant_filesystem;
03606                     (*i).user_access_grant_partyline=u.access_grant_partyline;
03607                     (*i).user_access_grant_plusproc=u.access_grant_plusproc;
03608                     (*i).user_access_grant_plususer=u.access_grant_plususer;
03609                     (*i).user_access_grant_rehash=u.access_grant_rehash;
03610                     (*i).user_access_to_replication=u.access_to_replication;
03611                     (*i).user_access_grant_replication=u.access_grant_replication;
03612                     (*i).user_access_grant_restart=u.access_grant_restart;
03613 
03614                     (*i).user_access_to_private=u.access_to_private;
03615                     (*i).user_access_grant_private=u.access_grant_private;
03616 
03617                     (*i).user_partyline_msg_flood=u.partyline_msg_flood;
03618 
03619                     (*i).user_access_to_can_send_all_users=u.access_to_can_send_all_users;
03620                     (*i).user_access_grant_can_send_all_users=u.access_grant_can_send_all_users;
03621 
03622                     (*i).user_access_to_can_send_unknown_users=u.access_to_can_send_unknown_users;
03623                     (*i).user_access_grant_can_send_unknown_users=u.access_grant_can_send_unknown_users;
03624 
03625                     (*i).user_access_to_upgrade=u.access_to_upgrade;
03626                     (*i).user_access_grant_upgrade=u.access_grant_upgrade;
03627 
03628                     (*i).user_access_to_apply=u.access_to_apply;
03629                     (*i).user_access_grant_apply=u.access_grant_apply;
03630 
03631                     (*i).new_user=0;
03632                     (*i).edit_user=2;
03633                     return;
03634                 }
03635             }
03636             if((*i).new_user==-150) {
03637                     (*i).user_fullnames.clear();
03638                     (*i).user_meta.clear();
03639                     (*i).user_hosts.clear();
03640                     (*i).user_dcc_hosts.clear();
03641                     (*i).user_fullnames.clear();
03642                     (*i).user_access_grant_partyline=false;
03643                     (*i).user_channels.clear();
03644                     (*i).user_member_of.clear();
03645                     (*i).user_access_to_backup=false;
03646                     (*i).user_access_grant_backup=false;
03647                     (*i).user_access_to_rehash=false;
03648                     (*i).user_access_grant_rehash=false;
03649                     (*i).user_access_to_plususer=false;
03650                     (*i).user_access_grant_plususer=false;
03651 
03652                     (*i).user_access_to_plusproc=false;
03653                     (*i).user_access_grant_plusproc=false;
03654 
03655                     (*i).user_access_to_replication=false;
03656                     (*i).user_access_grant_replication=false;
03657 
03658                     (*i).user_access_to_restart=false;
03659                     (*i).user_access_grant_restart=false;
03660                     (*i).user_access_to_die=false;
03661                     (*i).user_access_grant_die=false;
03662 
03663                     (*i).user_access_to_filesystem=false;
03664                     (*i).user_access_grant_filesystem=false;
03665 
03666                     (*i).user_access_to_upgrade=false;
03667                     (*i).user_access_grant_upgrade=false;
03668 
03669                     (*i).user_access_to_apply=false;
03670                     (*i).user_access_grant_apply=false;
03671 
03672                     (*i).user_access_to_private=false;
03673                     (*i).user_access_grant_private=false;
03674 
03675                     (*i).user_access_to_can_send_all_users=false;
03676                     (*i).user_access_grant_can_send_all_users=false;
03677 
03678                     (*i).new_user=-300;
03679                     return;
03680             }
03681             if((*i).new_user==-200) {
03682                     string disp=lang_get_string(1,(*i).lang,102)+eol;
03683                     int ec=0;
03684                     dcc_send_msg((*i).socket,disp,ec);
03685                     vector<string>::iterator i1;
03686                     disp="";
03687                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
03688                         disp+=*i1+eol;
03689                     dcc_send_msg((*i).socket,disp,ec);
03690                     disp=lang_get_string(1,(*i).lang,103)+eol;
03691                     dcc_send_msg((*i).socket,disp,ec);
03692 
03693                     (*i).user_member_of.clear();
03694                     (*i).new_user=-1;
03695                     return;
03696             }
03697 
03698             if((*i).new_user==-300) {
03699                 (*i).new_user=-200;
03700                 return;
03701             }
03702 
03703             if((*i).new_user==2) {
03704                 string p=dcc_get_line((*i).in_buff);
03705                 if(!p.compare(""))
03706                     return;
03707                 if(p.compare(".")) {
03708                     p=(string)"\""+p+"\"";
03709                     (*i).user_hosts.push_back(p);
03710                     string disp=lang_get_string(1,(*i).lang,35)+eol;
03711                     int ec=0;
03712                     dcc_send_msg((*i).socket,disp,ec);
03713                 } else {
03714                     if((*i).user_hosts.begin()==(*i).user_hosts.end()) {
03715                         string disp=lang_get_string(1,(*i).lang,105)+eol;
03716                         int ec=0;
03717                         dcc_send_msg((*i).socket,disp,ec);
03718                     } else {
03719                         string disp=lang_get_string(1,(*i).lang,36)+eol;
03720                         int ec=0;
03721                         dcc_send_msg((*i).socket,disp,ec);
03722                         (*i).new_user++;
03723                     }
03724                 }
03725             }
03726             if((*i).new_user==3) {
03727                 string p=dcc_get_line((*i).in_buff);
03728                 if(!p.compare(""))
03729                     return;
03730                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
03731                     string disp=lang_get_string(1,(*i).lang,36)+eol;
03732                     int ec=0;
03733                     dcc_send_msg((*i).socket,disp,ec);
03734                 } else {
03735                     if(!p.compare("n") || !p.compare("N")) {
03736                         (*i).new_user=6;
03737                         string disp=lang_get_string(1,(*i).lang,39)+eol;
03738                         int ec=0;
03739                         dcc_send_msg((*i).socket,disp,ec);
03740                     } else {
03741                         string disp=lang_get_string(1,(*i).lang,37)+eol;
03742                         int ec=0;
03743                         dcc_send_msg((*i).socket,disp,ec);
03744                         (*i).new_user++;
03745                     }
03746                 }
03747             }
03748             if((*i).new_user==4) {
03749                 string p=dcc_get_line((*i).in_buff);
03750                 if(!p.compare(""))
03751                     return;
03752                 if(p.compare(".")) {
03753                     (*i).user_dcc_host.group=atol(p.c_str());
03754                     string disp=lang_get_string(1,(*i).lang,38)+eol;
03755                     int ec=0;
03756                     dcc_send_msg((*i).socket,disp,ec);
03757                     (*i).new_user++;
03758                 } else {
03759                     if((*i).user_fullnames.begin()==(*i).user_fullnames.end()) {
03760                         string disp=lang_get_string(1,(*i).lang,545)+eol;
03761                         int ec=0;
03762                         dcc_send_msg((*i).socket,disp,ec);
03763                     } else {
03764                         string disp=lang_get_string(1,(*i).lang,39)+eol;
03765                         int ec=0;
03766                         dcc_send_msg((*i).socket,disp,ec);
03767                         (*i).new_user=6;
03768                     }
03769                 }
03770             }
03771             if((*i).new_user==5) {
03772                 string p=dcc_get_line((*i).in_buff);
03773                 if(!p.compare(""))
03774                     return;
03775                 if(p.compare(".")) {
03776                     p=(string)"\""+p+"\"";
03777                     (*i).user_dcc_host.host=p;
03778                     (*i).user_dcc_hosts.push_back((*i).user_dcc_host);
03779                     string disp=lang_get_string(1,(*i).lang,37)+eol;
03780                     int ec=0;
03781                     dcc_send_msg((*i).socket,disp,ec);
03782                     (*i).new_user=4;
03783                 } else {
03784                     string disp=lang_get_string(1,(*i).lang,39)+eol;
03785                     int ec=0;
03786                     dcc_send_msg((*i).socket,disp,ec);
03787                     (*i).new_user++;
03788                 }
03789             }
03790             if((*i).new_user==6) {
03791                 string p=dcc_get_line((*i).in_buff);
03792                 if(!p.compare(""))
03793                     return;
03794                 if(p.compare(".")) {
03795                     p=(string)"\""+p+"\"";
03796                     (*i).user_fullnames.push_back(p);
03797                     string disp=lang_get_string(1,(*i).lang,40)+eol;
03798                     int ec=0;
03799                     dcc_send_msg((*i).socket,disp,ec);
03800                 } else {
03801                     if((*i).access_grant_partyline) {
03802                         string disp=lang_get_string(1,(*i).lang,43)+eol;
03803                         int ec=0;
03804                         dcc_send_msg((*i).socket,disp,ec);
03805                         (*i).new_user++;
03806                     } else {
03807                         (*i).new_user=100;
03808                     }
03809                 }
03810             }
03811             if((*i).new_user==7) {
03812                 string p=dcc_get_line((*i).in_buff);
03813                 if(!p.compare(""))
03814                     return;
03815                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
03816                     string disp=lang_get_string(1,(*i).lang,43)+eol;
03817                     int ec=0;
03818                     dcc_send_msg((*i).socket,disp,ec);
03819                 } else {
03820                     if(!p.compare("n") || !p.compare("N")) {
03821                         (*i).user_access_to_partyline=false;
03822                         //(*i).new_user=100;
03823                         (*i).new_user=1000;
03824                         (*i).user_partyline_msg_flood.lines=0;
03825                         (*i).user_partyline_msg_flood.seconds=0;
03826                         return;
03827                     } else {
03828                         (*i).user_access_to_partyline=true;
03829                         //(*i).new_user=200;
03830                         (*i).new_user=1100;
03831                         return;
03832                     }
03833                 }
03834             }
03835 
03836             //---
03837             if((*i).new_user==8) {
03838                 string p=dcc_get_line((*i).in_buff);
03839                 if(!p.compare(""))
03840                     return;
03841                 if(p.compare(".")) {
03842                     vector<string>::iterator i1;
03843                     bool got=false;
03844                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
03845                         if(!(*i1).compare(p))
03846                             got=true;
03847                     string disp;
03848                     if(got)
03849                         disp=lang_get_string(1,(*i).lang,46)+eol;
03850                         else
03851                         disp=lang_get_string(1,(*i).lang,47)+eol;
03852                     int ec=0;
03853                     dcc_send_msg((*i).socket,disp,ec);
03854                     p=(string)"\""+p+"\"";
03855                     if(got)
03856                         (*i).user_access_to_groups.push_back(p);
03857                 } else {
03858                     string disp=lang_get_string(1,(*i).lang,48)+eol;
03859                     int ec=0;
03860                     dcc_send_msg((*i).socket,disp,ec);
03861                     vector<string>::iterator i1;
03862                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
03863                         disp=*i1+eol;
03864                         dcc_send_msg((*i).socket,disp,ec);
03865                     }
03866                     disp=lang_get_string(1,(*i).lang,45)+eol;
03867                     dcc_send_msg((*i).socket,disp,ec);
03868                     (*i).new_user++;
03869                 }
03870             }
03871             if((*i).new_user==9) {
03872                 string p=dcc_get_line((*i).in_buff);
03873                 if(!p.compare(""))
03874                     return;
03875                 if(p.compare(".")) {
03876                     vector<string>::iterator i1;
03877                     bool got=false;
03878                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
03879                         if(!(*i1).compare(p))
03880                             got=true;
03881                     string disp;
03882                     if(got)
03883                         disp=lang_get_string(1,(*i).lang,46)+eol;
03884                         else
03885                         disp=lang_get_string(1,(*i).lang,47)+eol;
03886                     int ec=0;
03887                     dcc_send_msg((*i).socket,disp,ec);
03888                     p=(string)"\""+p+"\"";
03889                     if(got)
03890                         (*i).user_access_grant_groups.push_back(p);
03891                 } else {
03892                     string disp=lang_get_string(1,(*i).lang,49)+eol;
03893                     int ec=0;
03894                     dcc_send_msg((*i).socket,disp,ec);
03895                     vector<string>::iterator i1;
03896                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++) {
03897                         disp=*i1+eol;
03898                         dcc_send_msg((*i).socket,disp,ec);
03899                     }
03900                     disp=lang_get_string(1,(*i).lang,45)+eol;
03901                     dcc_send_msg((*i).socket,disp,ec);
03902                     (*i).new_user++;
03903                 }
03904             }
03905             if((*i).new_user==10) {
03906                 string p=dcc_get_line((*i).in_buff);
03907                 if(!p.compare(""))
03908                     return;
03909                 if(p.compare(".")) {
03910                     vector<string>::iterator i1;
03911                     bool got=false;
03912                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++)
03913                         if(!(*i1).compare(p))
03914                             got=true;
03915                     string disp;
03916                     if(got)
03917                         disp=lang_get_string(1,(*i).lang,46)+eol;
03918                         else
03919                         disp=lang_get_string(1,(*i).lang,47)+eol;
03920                     int ec=0;
03921                     dcc_send_msg((*i).socket,disp,ec);
03922                     p=(string)"\""+p+"\"";
03923                     if(got)
03924                         (*i).user_access_to_proc_groups.push_back(p);
03925                 } else {
03926                     string disp=lang_get_string(1,(*i).lang,50)+eol;
03927                     int ec=0;
03928                     dcc_send_msg((*i).socket,disp,ec);
03929                     vector<string>::iterator i1;
03930                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++) {
03931                         disp=*i1+eol;
03932                         dcc_send_msg((*i).socket,disp,ec);
03933                     }
03934                     disp=lang_get_string(1,(*i).lang,45)+eol;
03935                     dcc_send_msg((*i).socket,disp,ec);
03936                     (*i).new_user++;
03937                 }
03938             }
03939             if((*i).new_user==11) {
03940                 string p=dcc_get_line((*i).in_buff);
03941                 if(!p.compare(""))
03942                     return;
03943                 if(p.compare(".")) {
03944                     vector<string>::iterator i1;
03945                     bool got=false;
03946                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++)
03947                         if(!(*i1).compare(p))
03948                             got=true;
03949                     string disp;
03950                     if(got)
03951                         disp=lang_get_string(1,(*i).lang,46)+eol;
03952                         else
03953                         disp=lang_get_string(1,(*i).lang,47)+eol;
03954                     int ec=0;
03955                     dcc_send_msg((*i).socket,disp,ec);
03956                     p=(string)"\""+p+"\"";
03957                     if(got)
03958                         (*i).user_access_grant_proc_groups.push_back(p);
03959                 } else {
03960                     string disp=lang_get_string(1,(*i).lang,590)+eol;
03961                     int ec=0;
03962                     dcc_send_msg((*i).socket,disp,ec);
03963                     vector<string>::iterator i1;
03964                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++) {
03965                         disp=*i1+eol;
03966                         dcc_send_msg((*i).socket,disp,ec);
03967                     }
03968                     disp=lang_get_string(1,(*i).lang,45)+eol;
03969                     dcc_send_msg((*i).socket,disp,ec);
03970                     (*i).new_user=1200;
03971                     return;
03972                 }
03973             }
03974 
03975             if((*i).new_user==12) {
03976                 string p=dcc_get_line((*i).in_buff);
03977                 if(!p.compare(""))
03978                     return;
03979                 if(p.compare(".")) {
03980                     vector<string>::iterator i1;
03981                     bool got=false;
03982                     for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
03983                         if(!(*i1).compare(p))
03984                             got=true;
03985                     string disp;
03986                     if(got)
03987                         disp=lang_get_string(1,(*i).lang,46)+eol;
03988                         else
03989                         disp=lang_get_string(1,(*i).lang,47)+eol;
03990                     int ec=0;
03991                     dcc_send_msg((*i).socket,disp,ec);
03992                     p=(string)"\""+p+"\"";
03993                     if(got)
03994                         (*i).access_to_channel.push_back(p);
03995                 } else {
03996                     string disp=lang_get_string(1,(*i).lang,52)+eol;
03997                     int ec=0;
03998                     dcc_send_msg((*i).socket,disp,ec);
03999                     vector<string>::iterator i1;
04000                     for(i1=(*i).access_grant_channel.begin(); i1!=(*i).access_grant_channel.end(); i1++) {
04001                         disp=*i1+eol;
04002                         dcc_send_msg((*i).socket,disp,ec);
04003                     }
04004                     disp=lang_get_string(1,(*i).lang,45)+eol;
04005                     dcc_send_msg((*i).socket,disp,ec);
04006                     (*i).new_user++;
04007                 }
04008             }
04009             if((*i).new_user==13) {
04010                 string p=dcc_get_line((*i).in_buff);
04011                 if(!p.compare(""))
04012                     return;
04013                 if(p.compare(".")) {
04014                     vector<string>::iterator i1;
04015                     bool got=false;
04016                     for(i1=(*i).access_grant_channel.begin(); i1!=(*i).access_grant_channel.end(); i1++)
04017                         if(!(*i1).compare(p))
04018                             got=true;
04019                     string disp;
04020                     if(got)
04021                         disp=lang_get_string(1,(*i).lang,46)+eol;
04022                         else
04023                         disp=lang_get_string(1,(*i).lang,47)+eol;
04024                     int ec=0;
04025                     dcc_send_msg((*i).socket,disp,ec);
04026                     p=(string)"\""+p+"\"";
04027                     if(got)
04028                         (*i).access_grant_channel.push_back(p);
04029                 } else {
04030                     string disp=lang_get_string(1,(*i).lang,53)+eol;
04031                     int ec=0;
04032                     dcc_send_msg((*i).socket,disp,ec);
04033                     (*i).new_user++;
04034                 }
04035             }
04036             if((*i).new_user==14) {
04037                 vector<string> channels;
04038                 logic_partyline_get_channels(channels);
04039                 vector<string>::iterator i1;
04040                 for(i1=channels.begin(); i1!=channels.end(); i1++) {
04041                     vector<string>::iterator i2;
04042                     for(i2=(*i).access_grant_channel.begin(); i2!=(*i).access_grant_channel.end(); i2++) {
04043                         vector<s_channel>::iterator i3;
04044                         bool got=false;
04045                         for(i3=(*i).user_channels.begin(); i3!=(*i).user_channels.end(); i3++)
04046                             if(!((*i3).channel_name.compare(*i2))) {
04047                                 got=true;
04048                                 break;
04049                             }
04050                         if(got)
04051                             continue;
04052                         if(!(*i2).compare("*"))
04053                             continue;
04054                         s_channel ch;
04055                         ch.username=(*i).user_name;
04056                         ch.channel_name=*i2;
04057                         ch.on_deop="";
04058                         ch.on_ban="";
04059                         ch.on_unban="";
04060                         ch.on_kick="";
04061                         ch.on_op="";
04062                         ch.on_voice="";
04063                         ch.on_devoice="";
04064                         ch.on_creator="";
04065                         ch.on_decreator="";
04066                         ch.on_join="";
04067                         ch.on_banned="";
04068                         ch.on_flood="";
04069                         ch.on_privmsg="";
04070                         ch.on_notice="";
04071                         ch.on_except="";
04072                         ch.on_unexcept="";
04073                         ch.on_invite="";
04074                         ch.on_uninvite="";
04075                         ch.on_not_invited="";
04076                         ch.on_not_in_reop="";
04077                         ch.on_reop="";
04078                         ch.on_other_mode="";
04079                         ch.msg_flood.lines=0;
04080                         ch.notice_flood.lines=0;
04081                         ch.repeat_flood.lines=0;
04082                         ch.nick_flood.lines=0;
04083                         ch.join_flood.lines=0;
04084                         ch.mode_flood.lines=0;
04085                         ch.ctcp_flood.lines=0;
04086                         ch.allow_dynamic.clear();
04087                         ch.configured=false;
04088                         ch.can_send_unknown_users=false;
04089                         (*i).user_channels.push_back(ch);
04090                         string disp=*i2+eol;
04091                         int ec=0;
04092                         dcc_send_msg((*i).socket,disp,ec);
04093                     }
04094                 }
04095                 (*i).new_user++;
04096             }
04097 
04098             if((*i).new_user==15) {
04099                 int num_not_configured_channels=0;
04100 
04101                 string channel="";
04102 
04103                 vector<s_channel>::iterator i2;
04104                 for(i2=(*i).user_channels.begin(); i2!=(*i).user_channels.end(); i2++)
04105                     if(!(*i2).configured) {
04106                         num_not_configured_channels++;
04107                         if(!channel.compare(""))
04108                             channel=(*i2).channel_name;
04109                     }
04110                 (*i).num_not_configured_channels=num_not_configured_channels;
04111                 (*i).user_channel.username=(*i).user_name;
04112                 (*i).user_channel.channel_name=channel;
04113                 (*i).user_channel.on_deop="";
04114                 (*i).user_channel.on_ban="";
04115                 (*i).user_channel.on_unban="";
04116                 (*i).user_channel.on_kick="";
04117                 (*i).user_channel.on_op="";
04118                 (*i).user_channel.on_voice="";
04119                 (*i).user_channel.on_devoice="";
04120                 (*i).user_channel.on_creator="";
04121                 (*i).user_channel.on_decreator="";
04122                 (*i).user_channel.on_join="";
04123                 (*i).user_channel.on_banned="";
04124                 (*i).user_channel.on_flood="";
04125                 (*i).user_channel.on_privmsg="";
04126                 (*i).user_channel.on_notice="";
04127                 (*i).user_channel.on_except="";
04128                 (*i).user_channel.on_unexcept="";
04129                 (*i).user_channel.on_invite="";
04130                 (*i).user_channel.on_uninvite="";
04131                 (*i).user_channel.on_not_invited="";
04132                 (*i).user_channel.on_not_in_reop="";
04133                 (*i).user_channel.on_reop="";
04134                 (*i).user_channel.on_other_mode="";
04135                 (*i).user_channel.msg_flood.lines=0;
04136                 (*i).user_channel.notice_flood.lines=0;
04137                 (*i).user_channel.repeat_flood.lines=0;
04138                 (*i).user_channel.nick_flood.lines=0;
04139                 (*i).user_channel.join_flood.lines=0;
04140                 (*i).user_channel.mode_flood.lines=0;
04141                 (*i).user_channel.ctcp_flood.lines=0;
04142 
04143                 (*i).user_channel_allow_dynamic.group="";
04144                 (*i).user_channel_allow_dynamic.plus_modes="";
04145                 (*i).user_channel_allow_dynamic.minus_modes="";
04146 
04147                 (*i).user_channel.configured=false;
04148                 (*i).user_channel.can_send_unknown_users=false;
04149 
04150                 (*i).new_user++;
04151 
04152                 // end!
04153                 if(num_not_configured_channels==0)
04154                     (*i).new_user=38;
04155                 (*i).num_not_configured_channels=num_not_configured_channels;
04156             }
04157             // on_deop
04158             if((*i).new_user==16) {
04159                 string disp;
04160                 int ec=0;
04161 
04162                 disp=lang_get_string(1,(*i).lang,55)+eol; // !!!
04163                 dcc_send_msg((*i).socket,disp,ec);
04164 
04165                 vector<string>::iterator i3;
04166                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04167                     if(!(*i3).compare("*"))
04168                         continue;
04169                     disp=*i3+eol;
04170                     dcc_send_msg((*i).socket,disp,ec);
04171                 }
04172 
04173                 disp=(string)"----------------"+eol;
04174                 dcc_send_msg((*i).socket,disp,ec);
04175 
04176                 disp=lang_get_string(1,(*i).lang,75)+eol; // !!!
04177                 dcc_send_msg((*i).socket,disp,ec);
04178 
04179                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04180                 dcc_send_msg((*i).socket,disp,ec);
04181 
04182                 disp=lang_get_string(1,(*i).lang,541)+eol;
04183                 dcc_send_msg((*i).socket,disp,ec);
04184 
04185                 (*i).new_user++;
04186             }
04187             if((*i).new_user==17) {
04188                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_deop)) {
04189                     int ec=0;
04190                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04191                     dcc_send_msg((*i).socket,disp,ec);
04192                     (*i).new_user++;
04193                     return;
04194                 }
04195 
04196                 string p=dcc_get_line((*i).in_buff);
04197                 if(!p.compare(""))
04198                     return;
04199                 vector<string>::iterator i1;
04200                 bool got=false;
04201                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04202                     if(!(*i1).compare(p))
04203                         got=true;
04204                 if(!p.compare(".")) {
04205                     got=true;
04206                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04207                     int ec=0;
04208                     dcc_send_msg((*i).socket,disp,ec);
04209                     (*i).new_user++;
04210                 } else {
04211                     if(!p.compare("!")) {
04212                         vector<s_channel>::iterator i2;
04213                         for(i2=(*i).user_channels.begin(); i2!=(*i).user_channels.end(); i2++)
04214                             if(!(*i2).channel_name.compare((*i).user_channel.channel_name)) {
04215                                 (*i).user_channels.erase(i2);
04216                                 break;
04217                             }
04218                         if((*i).num_not_configured_channels>0) {
04219                             (*i).new_user=15;
04220                             return;
04221                         } else {
04222                             string disp=lang_get_string(1,(*i).lang,69)+eol;
04223                             int ec=0;
04224                             dcc_send_msg((*i).socket,disp,ec);
04225                             (*i).new_user=39;
04226                             return;
04227                         }
04228                     } else {
04229                         string disp;
04230                         if(got)
04231                             disp=lang_get_string(1,(*i).lang,57)+eol;
04232                             else
04233                             disp=lang_get_string(1,(*i).lang,58)+eol;
04234                         int ec=0;
04235                         dcc_send_msg((*i).socket,disp,ec);
04236                         if(got)
04237                             (*i).user_channel.on_deop=p;
04238                             else {
04239                                 (*i).new_user--;
04240                                 return;
04241                             }
04242                         (*i).new_user++;
04243                     }
04244                 }
04245             }
04246             // on_ban
04247             if((*i).new_user==18) {
04248                 string disp;
04249                 int ec=0;
04250 
04251                 disp=lang_get_string(1,(*i).lang,59)+eol; // !!!
04252                 dcc_send_msg((*i).socket,disp,ec);
04253 
04254                 vector<string>::iterator i3;
04255                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04256                     if(!(*i3).compare("*"))
04257                         continue;
04258                     disp=*i3+eol;
04259                     dcc_send_msg((*i).socket,disp,ec);
04260                 }
04261 
04262                 disp=(string)"----------------"+eol;
04263                 dcc_send_msg((*i).socket,disp,ec);
04264 
04265                 disp=lang_get_string(1,(*i).lang,76)+eol; // !!!
04266                 dcc_send_msg((*i).socket,disp,ec);
04267 
04268                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04269                 dcc_send_msg((*i).socket,disp,ec);
04270 
04271                 disp=lang_get_string(1,(*i).lang,56)+eol;
04272                 dcc_send_msg((*i).socket,disp,ec);
04273 
04274                 (*i).new_user++;
04275             }
04276             if((*i).new_user==19) {
04277                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_ban)) {
04278                     int ec=0;
04279                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04280                     dcc_send_msg((*i).socket,disp,ec);
04281                     (*i).new_user++;
04282                     return;
04283                 }
04284 
04285                 string p=dcc_get_line((*i).in_buff);
04286                 if(!p.compare(""))
04287                     return;
04288                 vector<string>::iterator i1;
04289                 bool got=false;
04290                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04291                     if(!(*i1).compare(p))
04292                         got=true;
04293                 if(!p.compare(".")) {
04294                     got=true;
04295                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04296                     int ec=0;
04297                     dcc_send_msg((*i).socket,disp,ec);
04298                     (*i).new_user++;
04299                 } else {
04300                     string disp;
04301                     if(got)
04302                         disp=lang_get_string(1,(*i).lang,57)+eol;
04303                         else
04304                         disp=lang_get_string(1,(*i).lang,58)+eol;
04305                     int ec=0;
04306                     dcc_send_msg((*i).socket,disp,ec);
04307                     if(got)
04308                         (*i).user_channel.on_ban=p;
04309                         else {
04310                             (*i).new_user--;
04311                             return;
04312                         }
04313                     (*i).new_user++;
04314                 }
04315             }
04316             // on_unban
04317             if((*i).new_user==20) {
04318                 string disp;
04319                 int ec=0;
04320 
04321                 disp=lang_get_string(1,(*i).lang,60)+eol; // !!!
04322                 dcc_send_msg((*i).socket,disp,ec);
04323 
04324                 vector<string>::iterator i3;
04325                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04326                     if(!(*i3).compare("*"))
04327                         continue;
04328                     disp=*i3+eol;
04329                     dcc_send_msg((*i).socket,disp,ec);
04330                 }
04331 
04332                 disp=(string)"----------------"+eol;
04333                 dcc_send_msg((*i).socket,disp,ec);
04334 
04335                 disp=lang_get_string(1,(*i).lang,77)+eol; // !!!
04336                 dcc_send_msg((*i).socket,disp,ec);
04337 
04338                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04339                 dcc_send_msg((*i).socket,disp,ec);
04340 
04341                 disp=lang_get_string(1,(*i).lang,56)+eol;
04342                 dcc_send_msg((*i).socket,disp,ec);
04343 
04344                 (*i).new_user++;
04345             }
04346             if((*i).new_user==21) {
04347                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_unban)) {
04348                     int ec=0;
04349                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04350                     dcc_send_msg((*i).socket,disp,ec);
04351                     (*i).new_user++;
04352                     return;
04353                 }
04354 
04355                 string p=dcc_get_line((*i).in_buff);
04356                 if(!p.compare(""))
04357                     return;
04358                 vector<string>::iterator i1;
04359                 bool got=false;
04360                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04361                     if(!(*i1).compare(p))
04362                         got=true;
04363                 if(!p.compare(".")) {
04364                     got=true;
04365                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04366                     int ec=0;
04367                     dcc_send_msg((*i).socket,disp,ec);
04368                     (*i).new_user++;
04369                 } else {
04370                     string disp;
04371                     if(got)
04372                         disp=lang_get_string(1,(*i).lang,57)+eol;
04373                         else
04374                         disp=lang_get_string(1,(*i).lang,58)+eol;
04375                     int ec=0;
04376                     dcc_send_msg((*i).socket,disp,ec);
04377                     if(got)
04378                         (*i).user_channel.on_unban=p;
04379                         else {
04380                             (*i).new_user--;
04381                             return;
04382                         }
04383                     (*i).new_user++;
04384                 }
04385             }
04386             // on_kick
04387             if((*i).new_user==22) {
04388                 string disp;
04389                 int ec=0;
04390 
04391                 disp=lang_get_string(1,(*i).lang,61)+eol; // !!!
04392                 dcc_send_msg((*i).socket,disp,ec);
04393 
04394                 vector<string>::iterator i3;
04395                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04396                     if(!(*i3).compare("*"))
04397                         continue;
04398                     disp=*i3+eol;
04399                     dcc_send_msg((*i).socket,disp,ec);
04400                 }
04401 
04402                 disp=(string)"----------------"+eol;
04403                 dcc_send_msg((*i).socket,disp,ec);
04404 
04405                 disp=lang_get_string(1,(*i).lang,78)+eol; // !!!
04406                 dcc_send_msg((*i).socket,disp,ec);
04407 
04408                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04409                 dcc_send_msg((*i).socket,disp,ec);
04410 
04411                 disp=lang_get_string(1,(*i).lang,56)+eol;
04412                 dcc_send_msg((*i).socket,disp,ec);
04413 
04414                 (*i).new_user++;
04415             }
04416             if((*i).new_user==23) {
04417                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_kick)) {
04418                     int ec=0;
04419                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04420                     dcc_send_msg((*i).socket,disp,ec);
04421                     (*i).new_user++;
04422                     return;
04423                 }
04424 
04425                 string p=dcc_get_line((*i).in_buff);
04426                 if(!p.compare(""))
04427                     return;
04428                 vector<string>::iterator i1;
04429                 bool got=false;
04430                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04431                     if(!(*i1).compare(p))
04432                         got=true;
04433                 if(!p.compare(".")) {
04434                     got=true;
04435                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04436                     int ec=0;
04437                     dcc_send_msg((*i).socket,disp,ec);
04438                     (*i).new_user++;
04439                 } else {
04440                     string disp;
04441                     if(got)
04442                         disp=lang_get_string(1,(*i).lang,57)+eol;
04443                         else
04444                         disp=lang_get_string(1,(*i).lang,58)+eol;
04445                     int ec=0;
04446                     dcc_send_msg((*i).socket,disp,ec);
04447                     if(got)
04448                         (*i).user_channel.on_kick=p;
04449                         else {
04450                             (*i).new_user--;
04451                             return;
04452                         }
04453                     (*i).new_user++;
04454                 }
04455             }
04456             // on_op
04457             if((*i).new_user==24) {
04458                 string disp;
04459                 int ec=0;
04460 
04461                 disp=lang_get_string(1,(*i).lang,62)+eol; // !!!
04462                 dcc_send_msg((*i).socket,disp,ec);
04463 
04464                 vector<string>::iterator i3;
04465                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04466                     if(!(*i3).compare("*"))
04467                         continue;
04468                     disp=*i3+eol;
04469                     dcc_send_msg((*i).socket,disp,ec);
04470                 }
04471 
04472                 disp=(string)"----------------"+eol;
04473                 dcc_send_msg((*i).socket,disp,ec);
04474 
04475                 disp=lang_get_string(1,(*i).lang,79)+eol; // !!!
04476                 dcc_send_msg((*i).socket,disp,ec);
04477 
04478                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04479                 dcc_send_msg((*i).socket,disp,ec);
04480 
04481                 disp=lang_get_string(1,(*i).lang,56)+eol;
04482                 dcc_send_msg((*i).socket,disp,ec);
04483 
04484                 (*i).new_user++;
04485             }
04486             if((*i).new_user==25) {
04487                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_op)) {
04488                     int ec=0;
04489                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04490                     dcc_send_msg((*i).socket,disp,ec);
04491                     (*i).new_user++;
04492                     return;
04493                 }
04494 
04495                 string p=dcc_get_line((*i).in_buff);
04496                 if(!p.compare(""))
04497                     return;
04498                 vector<string>::iterator i1;
04499                 bool got=false;
04500                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04501                     if(!(*i1).compare(p))
04502                         got=true;
04503                 if(!p.compare(".")) {
04504                     got=true;
04505                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04506                     int ec=0;
04507                     dcc_send_msg((*i).socket,disp,ec);
04508                     (*i).new_user++;
04509                 } else {
04510                     string disp;
04511                     if(got)
04512                         disp=lang_get_string(1,(*i).lang,57)+eol;
04513                         else
04514                         disp=lang_get_string(1,(*i).lang,58)+eol;
04515                     int ec=0;
04516                     dcc_send_msg((*i).socket,disp,ec);
04517                     if(got)
04518                         (*i).user_channel.on_op=p;
04519                         else {
04520                             (*i).new_user--;
04521                             return;
04522                         }
04523                     (*i).new_user++;
04524                 }
04525             }
04526             // on_voice
04527             if((*i).new_user==26) {
04528                 string disp;
04529                 int ec=0;
04530 
04531                 disp=lang_get_string(1,(*i).lang,63)+eol; // !!!
04532                 dcc_send_msg((*i).socket,disp,ec);
04533 
04534                 vector<string>::iterator i3;
04535                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04536                     if(!(*i3).compare("*"))
04537                         continue;
04538                     disp=*i3+eol;
04539                     dcc_send_msg((*i).socket,disp,ec);
04540                 }
04541 
04542                 disp=(string)"----------------"+eol;
04543                 dcc_send_msg((*i).socket,disp,ec);
04544 
04545                 disp=lang_get_string(1,(*i).lang,80)+eol; // !!!
04546                 dcc_send_msg((*i).socket,disp,ec);
04547 
04548                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04549                 dcc_send_msg((*i).socket,disp,ec);
04550 
04551                 disp=lang_get_string(1,(*i).lang,56)+eol;
04552                 dcc_send_msg((*i).socket,disp,ec);
04553 
04554                 (*i).new_user++;
04555             }
04556             if((*i).new_user==27) {
04557                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_voice)) {
04558                     int ec=0;
04559                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04560                     dcc_send_msg((*i).socket,disp,ec);
04561                     (*i).new_user++;
04562                     return;
04563                 }
04564 
04565                 string p=dcc_get_line((*i).in_buff);
04566                 if(!p.compare(""))
04567                     return;
04568                 vector<string>::iterator i1;
04569                 bool got=false;
04570                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04571                     if(!(*i1).compare(p))
04572                         got=true;
04573                 if(!p.compare(".")) {
04574                     got=true;
04575                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04576                     int ec=0;
04577                     dcc_send_msg((*i).socket,disp,ec);
04578                     (*i).new_user++;
04579                 } else {
04580                     string disp;
04581                     if(got)
04582                         disp=lang_get_string(1,(*i).lang,57)+eol;
04583                         else
04584                         disp=lang_get_string(1,(*i).lang,58)+eol;
04585                     int ec=0;
04586                     dcc_send_msg((*i).socket,disp,ec);
04587                     if(got)
04588                         (*i).user_channel.on_voice=p;
04589                         else {
04590                             (*i).new_user--;
04591                             return;
04592                         }
04593                     (*i).new_user++;
04594                 }
04595             }
04596             // on_devoice
04597             if((*i).new_user==28) {
04598                 string disp;
04599                 int ec=0;
04600 
04601                 disp=lang_get_string(1,(*i).lang,64)+eol; // !!!
04602                 dcc_send_msg((*i).socket,disp,ec);
04603 
04604                 vector<string>::iterator i3;
04605                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04606                     if(!(*i3).compare("*"))
04607                         continue;
04608                     disp=*i3+eol;
04609                     dcc_send_msg((*i).socket,disp,ec);
04610                 }
04611 
04612                 disp=(string)"----------------"+eol;
04613                 dcc_send_msg((*i).socket,disp,ec);
04614 
04615                 disp=lang_get_string(1,(*i).lang,81)+eol; // !!!
04616                 dcc_send_msg((*i).socket,disp,ec);
04617 
04618                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04619                 dcc_send_msg((*i).socket,disp,ec);
04620 
04621                 disp=lang_get_string(1,(*i).lang,56)+eol;
04622                 dcc_send_msg((*i).socket,disp,ec);
04623 
04624                 (*i).new_user++;
04625             }
04626             if((*i).new_user==29) {
04627                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_devoice)) {
04628                     int ec=0;
04629                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04630                     dcc_send_msg((*i).socket,disp,ec);
04631                     (*i).new_user++;
04632                     return;
04633                 }
04634 
04635                 string p=dcc_get_line((*i).in_buff);
04636                 if(!p.compare(""))
04637                     return;
04638                 vector<string>::iterator i1;
04639                 bool got=false;
04640                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04641                     if(!(*i1).compare(p))
04642                         got=true;
04643                 if(!p.compare(".")) {
04644                     got=true;
04645                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04646                     int ec=0;
04647                     dcc_send_msg((*i).socket,disp,ec);
04648                     (*i).new_user++;
04649                 } else {
04650                     string disp;
04651                     if(got)
04652                         disp=lang_get_string(1,(*i).lang,57)+eol;
04653                         else
04654                         disp=lang_get_string(1,(*i).lang,58)+eol;
04655                     int ec=0;
04656                     dcc_send_msg((*i).socket,disp,ec);
04657                     if(got)
04658                         (*i).user_channel.on_devoice=p;
04659                         else {
04660                             (*i).new_user--;
04661                             return;
04662                         }
04663                     (*i).new_user++;
04664                 }
04665             }
04666             // on_creator
04667             if((*i).new_user==30) {
04668                 string disp;
04669                 int ec=0;
04670 
04671                 disp=lang_get_string(1,(*i).lang,65)+eol; // !!!
04672                 dcc_send_msg((*i).socket,disp,ec);
04673 
04674                 vector<string>::iterator i3;
04675                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04676                     if(!(*i3).compare("*"))
04677                         continue;
04678                     disp=*i3+eol;
04679                     dcc_send_msg((*i).socket,disp,ec);
04680                 }
04681 
04682                 disp=(string)"----------------"+eol;
04683                 dcc_send_msg((*i).socket,disp,ec);
04684 
04685                 disp=lang_get_string(1,(*i).lang,82)+eol; // !!!
04686                 dcc_send_msg((*i).socket,disp,ec);
04687 
04688                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04689                 dcc_send_msg((*i).socket,disp,ec);
04690 
04691                 disp=lang_get_string(1,(*i).lang,56)+eol;
04692                 dcc_send_msg((*i).socket,disp,ec);
04693 
04694                 (*i).new_user++;
04695             }
04696             if((*i).new_user==31) {
04697                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_creator)) {
04698                     int ec=0;
04699                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04700                     dcc_send_msg((*i).socket,disp,ec);
04701                     (*i).new_user++;
04702                     return;
04703                 }
04704 
04705                 string p=dcc_get_line((*i).in_buff);
04706                 if(!p.compare(""))
04707                     return;
04708                 vector<string>::iterator i1;
04709                 bool got=false;
04710                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04711                     if(!(*i1).compare(p))
04712                         got=true;
04713                 if(!p.compare(".")) {
04714                     got=true;
04715                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04716                     int ec=0;
04717                     dcc_send_msg((*i).socket,disp,ec);
04718                     (*i).new_user++;
04719                 } else {
04720                     string disp;
04721                     if(got)
04722                         disp=lang_get_string(1,(*i).lang,57)+eol;
04723                         else
04724                         disp=lang_get_string(1,(*i).lang,58)+eol;
04725                     int ec=0;
04726                     dcc_send_msg((*i).socket,disp,ec);
04727                     if(got)
04728                         (*i).user_channel.on_creator=p;
04729                         else {
04730                             (*i).new_user--;
04731                             return;
04732                         }
04733                     (*i).new_user++;
04734                 }
04735             }
04736             // on_decreator
04737             if((*i).new_user==32) {
04738                 string disp;
04739                 int ec=0;
04740 
04741                 disp=lang_get_string(1,(*i).lang,66)+eol; // !!!
04742                 dcc_send_msg((*i).socket,disp,ec);
04743 
04744                 vector<string>::iterator i3;
04745                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04746                     if(!(*i3).compare("*"))
04747                         continue;
04748                     disp=*i3+eol;
04749                     dcc_send_msg((*i).socket,disp,ec);
04750                 }
04751 
04752                 disp=(string)"----------------"+eol;
04753                 dcc_send_msg((*i).socket,disp,ec);
04754 
04755                 disp=lang_get_string(1,(*i).lang,83)+eol; // !!!
04756                 dcc_send_msg((*i).socket,disp,ec);
04757 
04758                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04759                 dcc_send_msg((*i).socket,disp,ec);
04760 
04761                 disp=lang_get_string(1,(*i).lang,56)+eol;
04762                 dcc_send_msg((*i).socket,disp,ec);
04763 
04764                 (*i).new_user++;
04765             }
04766             if((*i).new_user==33) {
04767                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_decreator)) {
04768                     int ec=0;
04769                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04770                     dcc_send_msg((*i).socket,disp,ec);
04771                     (*i).new_user++;
04772                     return;
04773                 }
04774 
04775                 string p=dcc_get_line((*i).in_buff);
04776                 if(!p.compare(""))
04777                     return;
04778                 vector<string>::iterator i1;
04779                 bool got=false;
04780                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04781                     if(!(*i1).compare(p))
04782                         got=true;
04783                 if(!p.compare(".")) {
04784                     got=true;
04785                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04786                     int ec=0;
04787                     dcc_send_msg((*i).socket,disp,ec);
04788                     (*i).new_user++;
04789                 } else {
04790                     string disp;
04791                     if(got)
04792                         disp=lang_get_string(1,(*i).lang,57)+eol;
04793                         else
04794                         disp=lang_get_string(1,(*i).lang,58)+eol;
04795                     int ec=0;
04796                     dcc_send_msg((*i).socket,disp,ec);
04797                     if(got)
04798                         (*i).user_channel.on_decreator=p;
04799                         else {
04800                             (*i).new_user--;
04801                             return;
04802                         }
04803                     (*i).new_user++;
04804                 }
04805             }
04806             // on_join
04807             if((*i).new_user==34) {
04808                 string disp;
04809                 int ec=0;
04810 
04811                 disp=lang_get_string(1,(*i).lang,67)+eol; // !!!
04812                 dcc_send_msg((*i).socket,disp,ec);
04813 
04814                 vector<string>::iterator i3;
04815                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04816                     if(!(*i3).compare("*"))
04817                         continue;
04818                     disp=*i3+eol;
04819                     dcc_send_msg((*i).socket,disp,ec);
04820                 }
04821 
04822                 disp=(string)"----------------"+eol;
04823                 dcc_send_msg((*i).socket,disp,ec);
04824 
04825                 disp=lang_get_string(1,(*i).lang,84)+eol; // !!!
04826                 dcc_send_msg((*i).socket,disp,ec);
04827 
04828                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04829                 dcc_send_msg((*i).socket,disp,ec);
04830 
04831                 disp=lang_get_string(1,(*i).lang,56)+eol;
04832                 dcc_send_msg((*i).socket,disp,ec);
04833 
04834                 (*i).new_user++;
04835             }
04836             if((*i).new_user==35) {
04837                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_join)) {
04838                     int ec=0;
04839                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04840                     dcc_send_msg((*i).socket,disp,ec);
04841                     (*i).new_user++;
04842                     return;
04843                 }
04844 
04845                 string p=dcc_get_line((*i).in_buff);
04846                 if(!p.compare(""))
04847                     return;
04848                 vector<string>::iterator i1;
04849                 bool got=false;
04850                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04851                     if(!(*i1).compare(p))
04852                         got=true;
04853                 if(!p.compare(".")) {
04854                     got=true;
04855                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04856                     int ec=0;
04857                     dcc_send_msg((*i).socket,disp,ec);
04858                     (*i).new_user++;
04859                 } else {
04860                     string disp;
04861                     if(got)
04862                         disp=lang_get_string(1,(*i).lang,57)+eol;
04863                         else
04864                         disp=lang_get_string(1,(*i).lang,58)+eol;
04865                     int ec=0;
04866                     dcc_send_msg((*i).socket,disp,ec);
04867                     if(got)
04868                         (*i).user_channel.on_join=p;
04869                         else {
04870                             (*i).new_user--;
04871                             return;
04872                         }
04873                     (*i).new_user++;
04874                 }
04875             }
04876             // on_banned
04877             if((*i).new_user==36) {
04878                 string disp;
04879                 int ec=0;
04880 
04881                 disp=lang_get_string(1,(*i).lang,68)+eol; // !!!
04882                 dcc_send_msg((*i).socket,disp,ec);
04883 
04884                 vector<string>::iterator i3;
04885                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
04886                     if(!(*i3).compare("*"))
04887                         continue;
04888                     disp=*i3+eol;
04889                     dcc_send_msg((*i).socket,disp,ec);
04890                 }
04891 
04892                 disp=(string)"----------------"+eol;
04893                 dcc_send_msg((*i).socket,disp,ec);
04894 
04895                 disp=lang_get_string(1,(*i).lang,85)+eol; // !!!
04896                 dcc_send_msg((*i).socket,disp,ec);
04897 
04898                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
04899                 dcc_send_msg((*i).socket,disp,ec);
04900 
04901                 disp=lang_get_string(1,(*i).lang,56)+eol;
04902                 dcc_send_msg((*i).socket,disp,ec);
04903 
04904                 (*i).new_user++;
04905             }
04906             if((*i).new_user==37) {
04907                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_banned)) {
04908                     int ec=0;
04909                     string disp=lang_get_string(1,(*i).lang,592)+eol;
04910                     dcc_send_msg((*i).socket,disp,ec);
04911                     (*i).new_user++;
04912                     return;
04913                 }
04914 
04915                 string p=dcc_get_line((*i).in_buff);
04916                 if(!p.compare(""))
04917                     return;
04918                 vector<string>::iterator i1;
04919                 bool got=false;
04920                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
04921                     if(!(*i1).compare(p))
04922                         got=true;
04923                 if(!p.compare(".")) {
04924                     got=true;
04925                     string disp=lang_get_string(1,(*i).lang,57)+eol;
04926                     int ec=0;
04927                     dcc_send_msg((*i).socket,disp,ec);
04928                     (*i).new_user=40;
04929                 } else {
04930                     string disp;
04931                     if(got)
04932                         disp=lang_get_string(1,(*i).lang,57)+eol;
04933                         else
04934                         disp=lang_get_string(1,(*i).lang,58)+eol;
04935                     int ec=0;
04936                     dcc_send_msg((*i).socket,disp,ec);
04937                     if(got)
04938                         (*i).user_channel.on_banned=p;
04939                         else {
04940                             (*i).new_user--;
04941                             return;
04942                         }
04943                     (*i).new_user=40;
04944                 }
04945             }
04946 
04947             if((*i).new_user==38) {
04948                 vector<s_channel>::iterator i2;
04949                 for(i2=(*i).user_channels.begin(); i2!=(*i).user_channels.end(); i2++)
04950                     if(!(*i2).channel_name.compare((*i).user_channel.channel_name)) {
04951                         *i2=(*i).user_channel;
04952                         (*i2).configured=true;
04953                     }
04954 
04955                 if((*i).num_not_configured_channels>0) {
04956                     (*i).new_user=15;
04957                 } else {
04958                         string disp=lang_get_string(1,(*i).lang,69)+eol;
04959                         int ec=0;
04960                         dcc_send_msg((*i).socket,disp,ec);
04961                         (*i).new_user++;
04962                     }
04963             }
04964             if((*i).new_user==39) {
04965                 string p=dcc_get_line((*i).in_buff);
04966                 if(!p.compare(""))
04967                     return;
04968                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N") && p.compare("t") && p.compare("T")) {
04969                     string disp=lang_get_string(1,(*i).lang,69)+eol;
04970                     int ec=0;
04971                     dcc_send_msg((*i).socket,disp,ec);
04972                 } else {
04973                     if(!p.compare("n") || !p.compare("N")) {
04974                         string disp=lang_get_string(1,(*i).lang,70)+eol;
04975                         int ec=0;
04976                         dcc_send_msg((*i).socket,disp,ec);
04977                         (*i).new_user=0;
04978                     } else {
04979                         (*i).new_user=0;
04980                         // commit !!!
04981                         if(logic_partyline_user_exists((*i).user_name)) {
04982                             string disp=lang_get_string(1,(*i).lang,72)+eol;
04983                             int ec=0;
04984                             dcc_send_msg((*i).socket,disp,ec);
04985                         } else {
04986                             s_user u;
04987 
04988                             u.name=(*i).user_name;
04989 
04990                             u.host_unknown=false;
04991                             u.host_bot=false;
04992 
04993                             u.is_template=!p.compare("t") || !p.compare("T");
04994 
04995                             vector<string>::iterator i1;
04996                             for(i1=(*i).user_member_of.begin(); i1!=(*i).user_member_of.end(); i1++) {
04997                                 s_group g;
04998                                 g.name=*i1;
04999                                 u.groups.push_back(g);
05000                             }
05001                             for(i1=(*i).user_hosts.begin(); i1!=(*i).user_hosts.end(); i1++)
05002                                 u.hostmask.push_back(*i1);
05003                             vector<s_dcc_host>::iterator i2;
05004                             for(i2=(*i).user_dcc_hosts.begin(); i2!=(*i).user_dcc_hosts.end(); i2++)
05005                                 u.dcc_hosts.push_back(*i2);
05006                             for(i1=(*i).user_fullnames.begin(); i1!=(*i).user_fullnames.end(); i1++)
05007                                 u.fullname.push_back(*i1);
05008 
05009                             map<string,string>::iterator i5;
05010                             for(i5=(*i).user_meta.begin(); i5!=(*i).user_meta.end(); i5++)
05011                                 u.meta.insert(*i5);
05012 
05013                             u.access_to_partyline=(*i).user_access_to_partyline;
05014                             u.access_grant_partyline=(*i).user_access_grant_partyline;
05015                             u.access_to_backup=(*i).user_access_to_backup;
05016                             u.access_to_rehash=(*i).user_access_to_rehash;
05017                             u.access_grant_backup=(*i).user_access_grant_backup;
05018                             u.access_grant_rehash=(*i).user_access_grant_rehash;
05019                             u.access_to_plususer=(*i).user_access_to_plususer;
05020                             u.access_grant_plususer=(*i).user_access_grant_plususer;
05021 
05022                             u.access_to_plusproc=(*i).user_access_to_plusproc;
05023                             u.access_grant_plusproc=(*i).user_access_grant_plusproc;
05024 
05025                             u.access_to_replication=(*i).user_access_to_replication;
05026                             u.access_grant_replication=(*i).user_access_grant_replication;
05027 
05028                             u.access_to_restart=(*i).user_access_to_restart;
05029                             u.access_grant_restart=(*i).user_access_grant_restart;
05030                             u.access_to_die=(*i).user_access_to_die;
05031                             u.access_grant_die=(*i).user_access_grant_die;
05032 
05033                             u.access_to_filesystem=(*i).user_access_to_filesystem;
05034                             u.access_grant_filesystem=(*i).user_access_grant_filesystem;
05035 
05036                             u.access_to_upgrade=(*i).user_access_to_upgrade;
05037                             u.access_grant_upgrade=(*i).user_access_grant_upgrade;
05038 
05039                             u.access_to_apply=(*i).user_access_to_apply;
05040                             u.access_grant_apply=(*i).user_access_grant_apply;
05041 
05042                             u.access_to_can_send_all_users=(*i).user_access_to_can_send_all_users;
05043                             u.access_grant_can_send_all_users=(*i).user_access_grant_can_send_all_users;
05044 
05045                             u.access_to_can_send_unknown_users=(*i).user_access_to_can_send_unknown_users;
05046                             u.access_grant_can_send_unknown_users=(*i).user_access_grant_can_send_unknown_users;
05047 
05048                             u.access_to_private=(*i).user_access_to_private;
05049                             u.access_grant_private=(*i).user_access_grant_private;
05050 
05051                             for(i1=(*i).user_access_to_groups.begin(); i1!=(*i).user_access_to_groups.end(); i1++)
05052                                 u.access_to_group.push_back(*i1);
05053                             for(i1=(*i).user_access_grant_groups.begin(); i1!=(*i).user_access_grant_groups.end(); i1++)
05054                                 u.access_grant_group.push_back(*i1);
05055                             for(i1=(*i).user_access_to_proc_groups.begin(); i1!=(*i).user_access_to_proc_groups.end(); i1++)
05056                                 u.access_to_proc.push_back(*i1);
05057                             for(i1=(*i).user_access_grant_proc_groups.begin(); i1!=(*i).user_access_grant_proc_groups.end(); i1++)
05058                                 u.access_grant_procedure.push_back(*i1);
05059                             for(i1=(*i).user_access_usage_proc_groups.begin(); i1!=(*i).user_access_usage_proc_groups.end(); i1++)
05060                                 u.access_usage_procedure.push_back(*i1);
05061                             for(i1=(*i).user_access_to_channel.begin(); i1!=(*i).user_access_to_channel.end(); i1++)
05062                                 u.access_to_channel.push_back(*i1);
05063                             for(i1=(*i).user_access_grant_channel.begin(); i1!=(*i).user_access_grant_channel.end(); i1++)
05064                                 u.access_grant_channel.push_back(*i1);
05065                             vector<s_channel> chs;
05066                             vector<s_channel>::iterator i3;
05067                             for(i3=(*i).user_channels.begin(); i3!=(*i).user_channels.end(); i3++) {
05068                                 if(!(*i3).configured)
05069                                     continue;
05070                                 chs.push_back(*i3);
05071                             }
05072 
05073                             u.partyline_msg_flood=(*i).user_partyline_msg_flood;
05074 
05075                             time(&u.last_changed);
05076                             logic_partyline_add_user(u,chs);
05077                             string disp=lang_get_string(1,(*i).lang,73)+eol;
05078                             int ec=0;
05079                             dcc_send_msg((*i).socket,disp,ec);
05080                         }
05081                     }
05082                 }
05083             }
05084             // on_flood
05085             if((*i).new_user==40) {
05086                 string disp;
05087                 int ec=0;
05088 
05089                 disp=lang_get_string(1,(*i).lang,146)+eol; // !!!
05090                 dcc_send_msg((*i).socket,disp,ec);
05091 
05092                 vector<string>::iterator i3;
05093                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
05094                     if(!(*i3).compare("*"))
05095                         continue;
05096                     disp=*i3+eol;
05097                     dcc_send_msg((*i).socket,disp,ec);
05098                 }
05099 
05100                 disp=(string)"----------------"+eol;
05101                 dcc_send_msg((*i).socket,disp,ec);
05102 
05103                 disp=lang_get_string(1,(*i).lang,147)+eol; // !!!
05104                 dcc_send_msg((*i).socket,disp,ec);
05105 
05106                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
05107                 dcc_send_msg((*i).socket,disp,ec);
05108 
05109                 disp=lang_get_string(1,(*i).lang,56)+eol;
05110                 dcc_send_msg((*i).socket,disp,ec);
05111 
05112                 (*i).new_user++;
05113             }
05114             if((*i).new_user==41) {
05115                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_flood)) {
05116                     int ec=0;
05117                     string disp=lang_get_string(1,(*i).lang,592)+eol;
05118                     dcc_send_msg((*i).socket,disp,ec);
05119                     (*i).new_user++;
05120                     return;
05121                 }
05122 
05123                 string p=dcc_get_line((*i).in_buff);
05124                 if(!p.compare(""))
05125                     return;
05126                 vector<string>::iterator i1;
05127                 bool got=false;
05128                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
05129                     if(!(*i1).compare(p))
05130                         got=true;
05131                 if(!p.compare(".")) {
05132                     got=true;
05133                     string disp=lang_get_string(1,(*i).lang,57)+eol;
05134                     int ec=0;
05135                     dcc_send_msg((*i).socket,disp,ec);
05136                     (*i).new_user++;
05137                 } else {
05138                     string disp;
05139                     if(got)
05140                         disp=lang_get_string(1,(*i).lang,57)+eol;
05141                         else
05142                         disp=lang_get_string(1,(*i).lang,58)+eol;
05143                     int ec=0;
05144                     dcc_send_msg((*i).socket,disp,ec);
05145                     if(got)
05146                         (*i).user_channel.on_flood=p;
05147                         else {
05148                             (*i).new_user--;
05149                             return;
05150                         }
05151                     (*i).new_user++;
05152                 }
05153             }
05154             // on_privmsg
05155             if((*i).new_user==42) {
05156                 string disp;
05157                 int ec=0;
05158 
05159                 disp=lang_get_string(1,(*i).lang,164)+eol; // !!!
05160                 dcc_send_msg((*i).socket,disp,ec);
05161 
05162                 vector<string>::iterator i3;
05163                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
05164                     if(!(*i3).compare("*"))
05165                         continue;
05166                     disp=*i3+eol;
05167                     dcc_send_msg((*i).socket,disp,ec);
05168                 }
05169 
05170                 disp=(string)"----------------"+eol;
05171                 dcc_send_msg((*i).socket,disp,ec);
05172 
05173                 disp=lang_get_string(1,(*i).lang,165)+eol; // !!!
05174                 dcc_send_msg((*i).socket,disp,ec);
05175 
05176                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
05177                 dcc_send_msg((*i).socket,disp,ec);
05178 
05179                 disp=lang_get_string(1,(*i).lang,56)+eol;
05180                 dcc_send_msg((*i).socket,disp,ec);
05181 
05182                 (*i).new_user++;
05183             }
05184             if((*i).new_user==43) {
05185                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_privmsg)) {
05186                     int ec=0;
05187                     string disp=lang_get_string(1,(*i).lang,592)+eol;
05188                     dcc_send_msg((*i).socket,disp,ec);
05189                     (*i).new_user=500;
05190                     return;
05191                 }
05192 
05193                 string p=dcc_get_line((*i).in_buff);
05194                 if(!p.compare(""))
05195                     return;
05196                 vector<string>::iterator i1;
05197                 bool got=false;
05198                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
05199                     if(!(*i1).compare(p))
05200                         got=true;
05201                 if(!p.compare(".")) {
05202                     got=true;
05203                     string disp=lang_get_string(1,(*i).lang,57)+eol;
05204                     int ec=0;
05205                     dcc_send_msg((*i).socket,disp,ec);
05206                     (*i).new_user=500;
05207                 } else {
05208                     string disp;
05209                     if(got)
05210                         disp=lang_get_string(1,(*i).lang,57)+eol;
05211                         else
05212                         disp=lang_get_string(1,(*i).lang,58)+eol;
05213                     int ec=0;
05214                     dcc_send_msg((*i).socket,disp,ec);
05215                     if(got)
05216                         (*i).user_channel.on_privmsg=p;
05217                         else {
05218                             (*i).new_user--;
05219                             return;
05220                         }
05221                     (*i).new_user=500;
05222                 }
05223             }
05224 
05225             // msg_flood
05226             if((*i).new_user==44) {
05227                 string disp;
05228                 int ec=0;
05229 
05230                 disp=lang_get_string(1,(*i).lang,148)+eol; // !!!
05231                 dcc_send_msg((*i).socket,disp,ec);
05232 
05233                 (*i).new_user++;
05234             }
05235             if((*i).new_user==45) {
05236                 string p=dcc_get_line((*i).in_buff);
05237                 if(!p.compare(""))
05238                     return;
05239                 if(!p.compare(".")) {
05240                     (*i).new_user--;
05241                 } else {
05242                     if(!p.compare("0"))
05243                         p="0 0";
05244                     string lines, seconds;
05245                     int pos=0;
05246                     for(unsigned int i1=0; i1<p.length(); i1++) {
05247                         if(p[i1]==0x20) {
05248                             pos++;
05249                             continue;
05250                         }
05251                         if(pos==0)
05252                             lines+=p[i1];
05253                         if(pos==1)
05254                             seconds+=p[i1];
05255                     }
05256                     string disp;
05257                     (*i).user_channel.msg_flood.lines=atol(lines.c_str());
05258                     (*i).user_channel.msg_flood.seconds=atol(seconds.c_str());
05259                     (*i).new_user++;
05260                 }
05261             }
05262             // notice_flood
05263             if((*i).new_user==46) {
05264                 string disp;
05265                 int ec=0;
05266 
05267                 disp=lang_get_string(1,(*i).lang,149)+eol; // !!!
05268                 dcc_send_msg((*i).socket,disp,ec);
05269 
05270                 (*i).new_user++;
05271             }
05272             if((*i).new_user==47) {
05273                 string p=dcc_get_line((*i).in_buff);
05274                 if(!p.compare(""))
05275                     return;
05276                 if(!p.compare(".")) {
05277                     (*i).new_user--;
05278                 } else {
05279                     if(!p.compare("0"))
05280                         p="0 0";
05281                     string lines, seconds;
05282                     int pos=0;
05283                     for(unsigned int i1=0; i1<p.length(); i1++) {
05284                         if(p[i1]==0x20) {
05285                             pos++;
05286                             continue;
05287                         }
05288                         if(pos==0)
05289                             lines+=p[i1];
05290                         if(pos==1)
05291                             seconds+=p[i1];
05292                     }
05293                     string disp;
05294                     (*i).user_channel.notice_flood.lines=atol(lines.c_str());
05295                     (*i).user_channel.notice_flood.seconds=atol(seconds.c_str());
05296                     (*i).new_user++;
05297                 }
05298             }
05299             // repeat_flood
05300             if((*i).new_user==48) {
05301                 string disp;
05302                 int ec=0;
05303 
05304                 disp=lang_get_string(1,(*i).lang,150)+eol; // !!!
05305                 dcc_send_msg((*i).socket,disp,ec);
05306 
05307                 (*i).new_user++;
05308             }
05309             if((*i).new_user==49) {
05310                 string p=dcc_get_line((*i).in_buff);
05311                 if(!p.compare(""))
05312                     return;
05313                 if(!p.compare(".")) {
05314                     (*i).new_user--;
05315                 } else {
05316                     if(!p.compare("0"))
05317                         p="0 0";
05318                     string lines, seconds;
05319                     int pos=0;
05320                     for(unsigned int i1=0; i1<p.length(); i1++) {
05321                         if(p[i1]==0x20) {
05322                             pos++;
05323                             continue;
05324                         }
05325                         if(pos==0)
05326                             lines+=p[i1];
05327                         if(pos==1)
05328                             seconds+=p[i1];
05329                     }
05330                     string disp;
05331                     (*i).user_channel.repeat_flood.lines=atol(lines.c_str());
05332                     (*i).user_channel.repeat_flood.seconds=atol(seconds.c_str());
05333                     (*i).new_user++;
05334                 }
05335             }
05336             // nick_flood
05337             if((*i).new_user==50) {
05338                 string disp;
05339                 int ec=0;
05340 
05341                 disp=lang_get_string(1,(*i).lang,151)+eol; // !!!
05342                 dcc_send_msg((*i).socket,disp,ec);
05343 
05344                 (*i).new_user++;
05345             }
05346             if((*i).new_user==51) {
05347                 string p=dcc_get_line((*i).in_buff);
05348                 if(!p.compare(""))
05349                     return;
05350                 if(!p.compare(".")) {
05351                     (*i).new_user--;
05352                 } else {
05353                     if(!p.compare("0"))
05354                         p="0 0";
05355                     string lines, seconds;
05356                     int pos=0;
05357                     for(unsigned int i1=0; i1<p.length(); i1++) {
05358                         if(p[i1]==0x20) {
05359                             pos++;
05360                             continue;
05361                         }
05362                         if(pos==0)
05363                             lines+=p[i1];
05364                         if(pos==1)
05365                             seconds+=p[i1];
05366                     }
05367                     string disp;
05368                     (*i).user_channel.nick_flood.lines=atol(lines.c_str());
05369                     (*i).user_channel.nick_flood.seconds=atol(seconds.c_str());
05370                     (*i).new_user++;
05371                 }
05372             }
05373             // join_flood
05374             if((*i).new_user==52) {
05375                 string disp;
05376                 int ec=0;
05377 
05378                 disp=lang_get_string(1,(*i).lang,152)+eol; // !!!
05379                 dcc_send_msg((*i).socket,disp,ec);
05380 
05381                 (*i).new_user++;
05382             }
05383             if((*i).new_user==53) {
05384                 string p=dcc_get_line((*i).in_buff);
05385                 if(!p.compare(""))
05386                     return;
05387                 if(!p.compare(".")) {
05388                     (*i).new_user--;
05389                 } else {
05390                     if(!p.compare("0"))
05391                         p="0 0";
05392                     string lines, seconds;
05393                     int pos=0;
05394                     for(unsigned int i1=0; i1<p.length(); i1++) {
05395                         if(p[i1]==0x20) {
05396                             pos++;
05397                             continue;
05398                         }
05399                         if(pos==0)
05400                             lines+=p[i1];
05401                         if(pos==1)
05402                             seconds+=p[i1];
05403                     }
05404                     string disp;
05405                     (*i).user_channel.join_flood.lines=atol(lines.c_str());
05406                     (*i).user_channel.join_flood.seconds=atol(seconds.c_str());
05407                     (*i).new_user++;
05408                 }
05409             }
05410             // mode_flood
05411             if((*i).new_user==54) {
05412                 string disp;
05413                 int ec=0;
05414 
05415                 disp=lang_get_string(1,(*i).lang,158)+eol; // !!!
05416                 dcc_send_msg((*i).socket,disp,ec);
05417 
05418                 (*i).new_user++;
05419             }
05420             if((*i).new_user==55) {
05421                 string p=dcc_get_line((*i).in_buff);
05422                 if(!p.compare(""))
05423                     return;
05424                 if(!p.compare(".")) {
05425                     (*i).new_user--;
05426                 } else {
05427                     if(!p.compare("0"))
05428                         p="0 0";
05429                     string lines, seconds;
05430                     int pos=0;
05431                     for(unsigned int i1=0; i1<p.length(); i1++) {
05432                         if(p[i1]==0x20) {
05433                             pos++;
05434                             continue;
05435                         }
05436                         if(pos==0)
05437                             lines+=p[i1];
05438                         if(pos==1)
05439                             seconds+=p[i1];
05440                     }
05441                     (*i).user_channel.mode_flood.lines=atol(lines.c_str());
05442                     (*i).user_channel.mode_flood.seconds=atol(seconds.c_str());
05443                     (*i).new_user++;
05444                 }
05445             }
05446             // ctcp_flood
05447             if((*i).new_user==56) {
05448                 string disp;
05449                 int ec=0;
05450 
05451                 disp=lang_get_string(1,(*i).lang,384)+eol; // !!!
05452                 dcc_send_msg((*i).socket,disp,ec);
05453 
05454                 (*i).new_user++;
05455             }
05456             if((*i).new_user==57) {
05457                 string p=dcc_get_line((*i).in_buff);
05458                 if(!p.compare(""))
05459                     return;
05460                 if(!p.compare(".")) {
05461                     (*i).new_user--;
05462                 } else {
05463                     if(!p.compare("0"))
05464                         p="0 0";
05465                     string lines, seconds;
05466                     int pos=0;
05467                     for(unsigned int i1=0; i1<p.length(); i1++) {
05468                         if(p[i1]==0x20) {
05469                             pos++;
05470                             continue;
05471                         }
05472                         if(pos==0)
05473                             lines+=p[i1];
05474                         if(pos==1)
05475                             seconds+=p[i1];
05476                     }
05477                     (*i).user_channel.ctcp_flood.lines=atol(lines.c_str());
05478                     (*i).user_channel.ctcp_flood.seconds=atol(seconds.c_str());
05479                     (*i).new_user++;
05480                 }
05481             }
05482             // can_send_unknown
05483             if((*i).new_user==58) {
05484                 string disp;
05485                 int ec=0;
05486 
05487                 disp=lang_get_string(1,(*i).lang,475)+eol; // !!!
05488                 dcc_send_msg((*i).socket,disp,ec);
05489 
05490                 (*i).new_user++;
05491             }
05492             if((*i).new_user==59) {
05493                 string p=dcc_get_line((*i).in_buff);
05494                 if(p.empty())
05495                     return;
05496 
05497                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
05498                     string disp=lang_get_string(1,(*i).lang,475)+eol;
05499                     int ec=0;
05500                     dcc_send_msg((*i).socket,disp,ec);
05501                 } else {
05502                     if(!p.compare("n") || !p.compare("N")) {
05503                         (*i).user_channel.can_send_unknown_users=false;
05504                     } else {
05505                         (*i).user_channel.can_send_unknown_users=true;
05506                     }
05507                     (*i).new_user=300;
05508                 }
05509                 return;
05510             }
05511 
05512             if((*i).new_user==100) {
05513                 if(!(*i).access_grant_backup) {
05514                     (*i).new_user+=2;
05515                     return;
05516                 }
05517                 string disp;
05518                 int ec=0;
05519 
05520                 disp=lang_get_string(1,(*i).lang,168)+eol; // !!!
05521                 dcc_send_msg((*i).socket,disp,ec);
05522 
05523                 (*i).new_user++;
05524             }
05525             if((*i).new_user==101) {
05526                 string p=dcc_get_line((*i).in_buff);
05527                 if(!p.compare(""))
05528                     return;
05529                 bool got=false;
05530                 if(!p.compare("y") || !p.compare("Y")) {
05531                     got=true;
05532                     (*i).user_access_to_backup=true;
05533                 }
05534                 if(!p.compare("n") || !p.compare("N")) {
05535                     got=true;
05536                     (*i).user_access_to_backup=false;
05537                 }
05538                 got?(*i).new_user++:(*i).new_user--;
05539             }
05540             if((*i).new_user==102) {
05541                 if(!(*i).access_grant_rehash) {
05542                     (*i).new_user+=2;
05543                     return;
05544                 }
05545                 string disp;
05546                 int ec=0;
05547 
05548                 disp=lang_get_string(1,(*i).lang,169)+eol; // !!!
05549                 dcc_send_msg((*i).socket,disp,ec);
05550 
05551                 (*i).new_user++;
05552             }
05553             if((*i).new_user==103) {
05554                 string p=dcc_get_line((*i).in_buff);
05555                 if(!p.compare(""))
05556                     return;
05557                 bool got=false;
05558                 if(!p.compare("y") || !p.compare("Y")) {
05559                     got=true;
05560                     (*i).user_access_to_rehash=true;
05561                 }
05562                 if(!p.compare("n") || !p.compare("N")) {
05563                     got=true;
05564                     (*i).user_access_to_rehash=false;
05565                 }
05566                 got?(*i).new_user++:(*i).new_user--;
05567             }
05568             if((*i).new_user==104) {
05569                 if(!(*i).access_grant_backup) {
05570                     (*i).new_user+=2;
05571                     return;
05572                 }
05573                 string disp;
05574                 int ec=0;
05575 
05576                 disp=lang_get_string(1,(*i).lang,170)+eol; // !!!
05577                 dcc_send_msg((*i).socket,disp,ec);
05578 
05579                 (*i).new_user++;
05580             }
05581             if((*i).new_user==105) {
05582                 string p=dcc_get_line((*i).in_buff);
05583                 if(!p.compare(""))
05584                     return;
05585                 bool got=false;
05586                 if(!p.compare("y") || !p.compare("Y")) {
05587                     got=true;
05588                     (*i).user_access_grant_backup=true;
05589                 }
05590                 if(!p.compare("n") || !p.compare("N")) {
05591                     got=true;
05592                     (*i).user_access_grant_backup=false;
05593                 }
05594                 got?(*i).new_user++:(*i).new_user--;
05595             }
05596             if((*i).new_user==106) {
05597                 if(!(*i).access_grant_rehash) {
05598                     (*i).new_user+=2;
05599                     return;
05600                 }
05601                 string disp;
05602                 int ec=0;
05603 
05604                 disp=lang_get_string(1,(*i).lang,171)+eol; // !!!
05605                 dcc_send_msg((*i).socket,disp,ec);
05606 
05607                 (*i).new_user++;
05608             }
05609             if((*i).new_user==107) {
05610                 string p=dcc_get_line((*i).in_buff);
05611                 if(!p.compare(""))
05612                     return;
05613                 bool got=false;
05614                 if(!p.compare("y") || !p.compare("Y")) {
05615                     got=true;
05616                     (*i).user_access_grant_rehash=true;
05617                 }
05618                 if(!p.compare("n") || !p.compare("N")) {
05619                     got=true;
05620                     (*i).user_access_grant_rehash=false;
05621                 }
05622                 got?(*i).new_user++:(*i).new_user--;
05623             }
05624             if((*i).new_user==108) {
05625                 if(!(*i).access_grant_plususer) {
05626                     (*i).new_user+=2;
05627                     return;
05628                 }
05629                 string disp;
05630                 int ec=0;
05631 
05632                 disp=lang_get_string(1,(*i).lang,189)+eol; // !!!
05633                 dcc_send_msg((*i).socket,disp,ec);
05634 
05635                 (*i).new_user++;
05636             }
05637             if((*i).new_user==109) {
05638                 string p=dcc_get_line((*i).in_buff);
05639                 if(!p.compare(""))
05640                     return;
05641                 bool got=false;
05642                 if(!p.compare("y") || !p.compare("Y")) {
05643                     got=true;
05644                     (*i).user_access_to_plususer=true;
05645                 }
05646                 if(!p.compare("n") || !p.compare("N")) {
05647                     got=true;
05648                     (*i).user_access_to_plususer=false;
05649                 }
05650                 got?(*i).new_user++:(*i).new_user--;
05651             }
05652             if((*i).new_user==110) {
05653                 if(!(*i).access_grant_plususer) {
05654                     (*i).new_user+=2;
05655                     return;
05656                 }
05657                 string disp;
05658                 int ec=0;
05659 
05660                 disp=lang_get_string(1,(*i).lang,190)+eol; // !!!
05661                 dcc_send_msg((*i).socket,disp,ec);
05662 
05663                 (*i).new_user++;
05664             }
05665             if((*i).new_user==111) {
05666                 string p=dcc_get_line((*i).in_buff);
05667                 if(!p.compare(""))
05668                     return;
05669                 bool got=false;
05670                 if(!p.compare("y") || !p.compare("Y")) {
05671                     got=true;
05672                     (*i).user_access_grant_plususer=true;
05673                 }
05674                 if(!p.compare("n") || !p.compare("N")) {
05675                     got=true;
05676                     (*i).user_access_grant_plususer=false;
05677                 }
05678                 got?(*i).new_user++:(*i).new_user--;
05679             }
05680             if((*i).new_user==112) {
05681                 if(!(*i).access_grant_plusproc) {
05682                     (*i).new_user+=2;
05683                     return;
05684                 }
05685                 string disp;
05686                 int ec=0;
05687 
05688                 disp=lang_get_string(1,(*i).lang,197)+eol; // !!!
05689                 dcc_send_msg((*i).socket,disp,ec);
05690 
05691                 (*i).new_user++;
05692             }
05693             if((*i).new_user==113) {
05694                 string p=dcc_get_line((*i).in_buff);
05695                 if(!p.compare(""))
05696                     return;
05697                 bool got=false;
05698                 if(!p.compare("y") || !p.compare("Y")) {
05699                     got=true;
05700                     (*i).user_access_to_plusproc=true;
05701                 }
05702                 if(!p.compare("n") || !p.compare("N")) {
05703                     got=true;
05704                     (*i).user_access_to_plusproc=false;
05705                 }
05706                 got?(*i).new_user++:(*i).new_user--;
05707             }
05708             if((*i).new_user==114) {
05709                 if(!(*i).access_grant_plusproc) {
05710                     (*i).new_user+=2;
05711                     return;
05712                 }
05713                 string disp;
05714                 int ec=0;
05715 
05716                 disp=lang_get_string(1,(*i).lang,198)+eol; // !!!
05717                 dcc_send_msg((*i).socket,disp,ec);
05718 
05719                 (*i).new_user++;
05720             }
05721             if((*i).new_user==115) {
05722                 string p=dcc_get_line((*i).in_buff);
05723                 if(!p.compare(""))
05724                     return;
05725                 bool got=false;
05726                 if(!p.compare("y") || !p.compare("Y")) {
05727                     got=true;
05728                     (*i).user_access_grant_plusproc=true;
05729                 }
05730                 if(!p.compare("n") || !p.compare("N")) {
05731                     got=true;
05732                     (*i).user_access_grant_plusproc=false;
05733                 }
05734                 got?(*i).new_user++:(*i).new_user--;
05735             }
05736             if((*i).new_user==116) {
05737                 if(!(*i).access_grant_replication) {
05738                     (*i).new_user+=2;
05739                     return;
05740                 }
05741                 string disp;
05742                 int ec=0;
05743 
05744                 disp=lang_get_string(1,(*i).lang,210)+eol; // !!!
05745                 dcc_send_msg((*i).socket,disp,ec);
05746 
05747                 (*i).new_user++;
05748             }
05749             if((*i).new_user==117) {
05750                 string p=dcc_get_line((*i).in_buff);
05751                 if(!p.compare(""))
05752                     return;
05753                 bool got=false;
05754                 if(!p.compare("y") || !p.compare("Y")) {
05755                     got=true;
05756                     (*i).user_access_to_replication=true;
05757                 }
05758                 if(!p.compare("n") || !p.compare("N")) {
05759                     got=true;
05760                     (*i).user_access_to_replication=false;
05761                 }
05762                 got?(*i).new_user++:(*i).new_user--;
05763             }
05764             if((*i).new_user==118) {
05765                 if(!(*i).access_grant_replication) {
05766                     (*i).new_user+=2;
05767                     return;
05768                 }
05769                 string disp;
05770                 int ec=0;
05771 
05772                 disp=lang_get_string(1,(*i).lang,600)+eol; // !!!
05773                 dcc_send_msg((*i).socket,disp,ec);
05774 
05775                 (*i).new_user++;
05776             }
05777             if((*i).new_user==119) {
05778                 string p=dcc_get_line((*i).in_buff);
05779                 if(!p.compare(""))
05780                     return;
05781                 bool got=false;
05782                 if(!p.compare("y") || !p.compare("Y")) {
05783                     got=true;
05784                     (*i).user_access_grant_replication=true;
05785                 }
05786                 if(!p.compare("n") || !p.compare("N")) {
05787                     got=true;
05788                     (*i).user_access_grant_replication=false;
05789                 }
05790                 got?(*i).new_user++:(*i).new_user--;
05791             }
05792             if((*i).new_user==120) {
05793                 if(!(*i).access_grant_restart) {
05794                     (*i).new_user+=2;
05795                     return;
05796                 }
05797                 string disp;
05798                 int ec=0;
05799 
05800                 disp=lang_get_string(1,(*i).lang,260)+eol; // !!!
05801                 dcc_send_msg((*i).socket,disp,ec);
05802 
05803                 (*i).new_user++;
05804             }
05805             if((*i).new_user==121) {
05806                 string p=dcc_get_line((*i).in_buff);
05807                 if(!p.compare(""))
05808                     return;
05809                 bool got=false;
05810                 if(!p.compare("y") || !p.compare("Y")) {
05811                     got=true;
05812                     (*i).user_access_to_restart=true;
05813                 }
05814                 if(!p.compare("n") || !p.compare("N")) {
05815                     got=true;
05816                     (*i).user_access_to_restart=false;
05817                 }
05818                 got?(*i).new_user++:(*i).new_user--;
05819             }
05820             if((*i).new_user==122) {
05821                 if(!(*i).access_grant_restart) {
05822                     (*i).new_user+=2;
05823                     return;
05824                 }
05825                 string disp;
05826                 int ec=0;
05827 
05828                 disp=lang_get_string(1,(*i).lang,261)+eol; // !!!
05829                 dcc_send_msg((*i).socket,disp,ec);
05830 
05831                 (*i).new_user++;
05832             }
05833             if((*i).new_user==123) {
05834                 string p=dcc_get_line((*i).in_buff);
05835                 if(!p.compare(""))
05836                     return;
05837                 bool got=false;
05838                 if(!p.compare("y") || !p.compare("Y")) {
05839                     got=true;
05840                     (*i).user_access_grant_restart=true;
05841                 }
05842                 if(!p.compare("n") || !p.compare("N")) {
05843                     got=true;
05844                     (*i).user_access_grant_restart=false;
05845                 }
05846                 got?(*i).new_user++:(*i).new_user--;
05847             }
05848 
05849             if((*i).new_user==124) {
05850                 if(!(*i).access_grant_die) {
05851                     (*i).new_user+=2;
05852                     return;
05853                 }
05854                 string disp;
05855                 int ec=0;
05856 
05857                 disp=lang_get_string(1,(*i).lang,267)+eol; // !!!
05858                 dcc_send_msg((*i).socket,disp,ec);
05859 
05860                 (*i).new_user++;
05861             }
05862             if((*i).new_user==125) {
05863                 string p=dcc_get_line((*i).in_buff);
05864                 if(!p.compare(""))
05865                     return;
05866                 bool got=false;
05867                 if(!p.compare("y") || !p.compare("Y")) {
05868                     got=true;
05869                     (*i).user_access_to_die=true;
05870                 }
05871                 if(!p.compare("n") || !p.compare("N")) {
05872                     got=true;
05873                     (*i).user_access_to_die=false;
05874                 }
05875                 got?(*i).new_user++:(*i).new_user--;
05876             }
05877             if((*i).new_user==126) {
05878                 if(!(*i).access_grant_die) {
05879                     (*i).new_user+=2;
05880                     return;
05881                 }
05882                 string disp;
05883                 int ec=0;
05884 
05885                 disp=lang_get_string(1,(*i).lang,268)+eol; // !!!
05886                 dcc_send_msg((*i).socket,disp,ec);
05887 
05888                 (*i).new_user++;
05889             }
05890             if((*i).new_user==127) {
05891                 string p=dcc_get_line((*i).in_buff);
05892                 if(!p.compare(""))
05893                     return;
05894                 bool got=false;
05895                 if(!p.compare("y") || !p.compare("Y")) {
05896                     got=true;
05897                     (*i).user_access_grant_die=true;
05898                 }
05899                 if(!p.compare("n") || !p.compare("N")) {
05900                     got=true;
05901                     (*i).user_access_grant_die=false;
05902                 }
05903                 got?(*i).new_user++:(*i).new_user--;
05904             }
05905 
05906             if((*i).new_user==128) {
05907                 if(!(*i).access_grant_filesystem) {
05908                     (*i).new_user+=2;
05909                     return;
05910                 }
05911                 string disp;
05912                 int ec=0;
05913 
05914                 disp=lang_get_string(1,(*i).lang,276)+eol; // !!!
05915                 dcc_send_msg((*i).socket,disp,ec);
05916 
05917                 (*i).new_user++;
05918             }
05919             if((*i).new_user==129) {
05920                 string p=dcc_get_line((*i).in_buff);
05921                 if(!p.compare(""))
05922                     return;
05923                 bool got=false;
05924                 if(!p.compare("y") || !p.compare("Y")) {
05925                     got=true;
05926                     (*i).user_access_to_filesystem=true;
05927                 }
05928                 if(!p.compare("n") || !p.compare("N")) {
05929                     got=true;
05930                     (*i).user_access_to_filesystem=false;
05931                 }
05932                 got?(*i).new_user++:(*i).new_user--;
05933             }
05934             if((*i).new_user==130) {
05935                 if(!(*i).access_grant_filesystem) {
05936                     (*i).new_user+=2;
05937                     return;
05938                 }
05939                 string disp;
05940                 int ec=0;
05941 
05942                 disp=lang_get_string(1,(*i).lang,277)+eol; // !!!
05943                 dcc_send_msg((*i).socket,disp,ec);
05944 
05945                 (*i).new_user++;
05946             }
05947             if((*i).new_user==131) {
05948                 string p=dcc_get_line((*i).in_buff);
05949                 if(!p.compare(""))
05950                     return;
05951                 bool got=false;
05952                 if(!p.compare("y") || !p.compare("Y")) {
05953                     got=true;
05954                     (*i).user_access_grant_filesystem=true;
05955                 }
05956                 if(!p.compare("n") || !p.compare("N")) {
05957                     got=true;
05958                     (*i).user_access_grant_filesystem=false;
05959                 }
05960                 got?(*i).new_user++:(*i).new_user--;
05961             }
05962 
05963             if((*i).new_user==132) {
05964                 (*i).new_user++;
05965             }
05966 
05967             if((*i).new_user==133) {
05968                 if(!(*i).access_grant_private) {
05969                     (*i).new_user+=2;
05970                     return;
05971                 }
05972                 string disp;
05973                 int ec=0;
05974 
05975                 disp=lang_get_string(1,(*i).lang,406)+eol; // !!!
05976                 dcc_send_msg((*i).socket,disp,ec);
05977 
05978                 (*i).new_user++;
05979             }
05980             if((*i).new_user==134) {
05981                 string p=dcc_get_line((*i).in_buff);
05982                 if(!p.compare(""))
05983                     return;
05984                 bool got=false;
05985                 if(!p.compare("y") || !p.compare("Y")) {
05986                     got=true;
05987                     (*i).user_access_to_private=true;
05988                 }
05989                 if(!p.compare("n") || !p.compare("N")) {
05990                     got=true;
05991                     (*i).user_access_to_private=false;
05992                 }
05993                 got?(*i).new_user++:(*i).new_user--;
05994             }
05995 
05996             if((*i).new_user==135) {
05997                 if(!(*i).access_grant_private) {
05998                     (*i).new_user+=2;
05999                     return;
06000                 }
06001                 string disp;
06002                 int ec=0;
06003 
06004                 disp=lang_get_string(1,(*i).lang,407)+eol; // !!!
06005                 dcc_send_msg((*i).socket,disp,ec);
06006 
06007                 (*i).new_user++;
06008             }
06009             if((*i).new_user==136) {
06010                 string p=dcc_get_line((*i).in_buff);
06011                 if(!p.compare(""))
06012                     return;
06013                 bool got=false;
06014                 if(!p.compare("y") || !p.compare("Y")) {
06015                     got=true;
06016                     (*i).user_access_grant_private=true;
06017                 }
06018                 if(!p.compare("n") || !p.compare("N")) {
06019                     got=true;
06020                     (*i).user_access_grant_private=false;
06021                 }
06022                 got?(*i).new_user++:(*i).new_user--;
06023             }
06024 
06025             if((*i).new_user==137) {
06026                 if(!(*i).access_grant_upgrade) {
06027                     (*i).new_user+=2;
06028                     return;
06029                 }
06030                 string disp;
06031                 int ec=0;
06032 
06033                 disp=lang_get_string(1,(*i).lang,625)+eol; // !!!
06034                 dcc_send_msg((*i).socket,disp,ec);
06035 
06036                 (*i).new_user++;
06037             }
06038             if((*i).new_user==138) {
06039                 string p=dcc_get_line((*i).in_buff);
06040                 if(!p.compare(""))
06041                     return;
06042                 bool got=false;
06043                 if(!p.compare("y") || !p.compare("Y")) {
06044                     got=true;
06045                     (*i).user_access_to_upgrade=true;
06046                 }
06047                 if(!p.compare("n") || !p.compare("N")) {
06048                     got=true;
06049                     (*i).user_access_to_upgrade=false;
06050                 }
06051                 got?(*i).new_user++:(*i).new_user--;
06052             }
06053 
06054             if((*i).new_user==139) {
06055                 if(!(*i).access_grant_upgrade) {
06056                     (*i).new_user+=2;
06057                     return;
06058                 }
06059                 string disp;
06060                 int ec=0;
06061 
06062                 disp=lang_get_string(1,(*i).lang,626)+eol; // !!!
06063                 dcc_send_msg((*i).socket,disp,ec);
06064 
06065                 (*i).new_user++;
06066             }
06067             if((*i).new_user==140) {
06068                 string p=dcc_get_line((*i).in_buff);
06069                 if(!p.compare(""))
06070                     return;
06071                 bool got=false;
06072                 if(!p.compare("y") || !p.compare("Y")) {
06073                     got=true;
06074                     (*i).user_access_grant_upgrade=true;
06075                 }
06076                 if(!p.compare("n") || !p.compare("N")) {
06077                     got=true;
06078                     (*i).user_access_grant_upgrade=false;
06079                 }
06080                 got?(*i).new_user++:(*i).new_user--;
06081             }
06082 
06083             //---
06084             if((*i).new_user==141) {
06085                 if(!(*i).access_grant_apply) {
06086                     (*i).new_user+=2;
06087                     return;
06088                 }
06089                 string disp;
06090                 int ec=0;
06091 
06092                 disp=lang_get_string(1,(*i).lang,680)+eol; // !!!
06093                 dcc_send_msg((*i).socket,disp,ec);
06094 
06095                 (*i).new_user++;
06096             }
06097             if((*i).new_user==142) {
06098                 string p=dcc_get_line((*i).in_buff);
06099                 if(!p.compare(""))
06100                     return;
06101                 bool got=false;
06102                 if(!p.compare("y") || !p.compare("Y")) {
06103                     got=true;
06104                     (*i).user_access_to_apply=true;
06105                 }
06106                 if(!p.compare("n") || !p.compare("N")) {
06107                     got=true;
06108                     (*i).user_access_to_apply=false;
06109                 }
06110                 got?(*i).new_user++:(*i).new_user--;
06111             }
06112 
06113             if((*i).new_user==143) {
06114                 if(!(*i).access_grant_apply) {
06115                     (*i).new_user+=2;
06116                     return;
06117                 }
06118                 string disp;
06119                 int ec=0;
06120 
06121                 disp=lang_get_string(1,(*i).lang,681)+eol; // !!!
06122                 dcc_send_msg((*i).socket,disp,ec);
06123 
06124                 (*i).new_user++;
06125             }
06126             if((*i).new_user==144) {
06127                 string p=dcc_get_line((*i).in_buff);
06128                 if(!p.compare(""))
06129                     return;
06130                 bool got=false;
06131                 if(!p.compare("y") || !p.compare("Y")) {
06132                     got=true;
06133                     (*i).user_access_grant_apply=true;
06134                 }
06135                 if(!p.compare("n") || !p.compare("N")) {
06136                     got=true;
06137                     (*i).user_access_grant_apply=false;
06138                 }
06139                 got?(*i).new_user++:(*i).new_user--;
06140             }
06141 
06142             if((*i).new_user==145) {
06143                 /*string disp=lang_get_string(1,(*i).lang,44)+eol;
06144                 int ec=0;
06145                 dcc_send_msg((*i).socket,disp,ec);
06146                 vector<string>::iterator i1;
06147                 for(i1=(*i).access_to_groups.begin(); i1!=(*i).access_to_groups.end(); i1++) {
06148                     disp=*i1+eol;
06149                     dcc_send_msg((*i).socket,disp,ec);
06150                 }
06151                 disp=lang_get_string(1,(*i).lang,45)+eol;
06152                 dcc_send_msg((*i).socket,disp,ec);*/
06153                 (*i).new_user++;
06154                 return;
06155             }
06156 
06157             //---------------
06158             if((*i).new_user==146) {
06159                 if(!(*i).access_grant_can_send_all_users) {
06160                     (*i).new_user+=2;
06161                     return;
06162                 }
06163                 string disp;
06164                 int ec=0;
06165 
06166                 disp=lang_get_string(1,(*i).lang,477)+eol; // !!!
06167                 dcc_send_msg((*i).socket,disp,ec);
06168 
06169                 (*i).new_user++;
06170             }
06171             if((*i).new_user==147) {
06172                 string p=dcc_get_line((*i).in_buff);
06173                 if(!p.compare(""))
06174                     return;
06175                 bool got=false;
06176                 if(!p.compare("y") || !p.compare("Y")) {
06177                     got=true;
06178                     (*i).user_access_to_can_send_all_users=true;
06179                 }
06180                 if(!p.compare("n") || !p.compare("N")) {
06181                     got=true;
06182                     (*i).user_access_to_can_send_all_users=false;
06183                 }
06184                 got?(*i).new_user++:(*i).new_user--;
06185             }
06186 
06187             if((*i).new_user==148) {
06188                 if(!(*i).access_grant_can_send_all_users) {
06189                     (*i).new_user+=2;
06190                     return;
06191                 }
06192                 string disp;
06193                 int ec=0;
06194 
06195                 disp=lang_get_string(1,(*i).lang,478)+eol; // !!!
06196                 dcc_send_msg((*i).socket,disp,ec);
06197 
06198                 (*i).new_user++;
06199             }
06200             if((*i).new_user==149) {
06201                 string p=dcc_get_line((*i).in_buff);
06202                 if(!p.compare(""))
06203                     return;
06204                 bool got=false;
06205                 if(!p.compare("y") || !p.compare("Y")) {
06206                     got=true;
06207                     (*i).user_access_grant_can_send_all_users=true;
06208                 }
06209                 if(!p.compare("n") || !p.compare("N")) {
06210                     got=true;
06211                     (*i).user_access_grant_can_send_all_users=false;
06212                 }
06213                 got?(*i).new_user++:(*i).new_user--;
06214             }
06215 
06216             if((*i).new_user==150) {
06217                 string disp=lang_get_string(1,(*i).lang,44)+eol;
06218                 int ec=0;
06219                 dcc_send_msg((*i).socket,disp,ec);
06220                 vector<string>::iterator i1;
06221                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
06222                     disp=*i1+eol;
06223                     dcc_send_msg((*i).socket,disp,ec);
06224                 }
06225                 disp=lang_get_string(1,(*i).lang,45)+eol;
06226                 dcc_send_msg((*i).socket,disp,ec);
06227 
06228                 (*i).new_user=8;
06229                 return;
06230             }
06231 
06232             if((*i).new_user==200) {
06233                 string disp=lang_get_string(1,(*i).lang,201)+eol;
06234                 int ec=0;
06235                 dcc_send_msg((*i).socket,disp,ec);
06236                 (*i).new_user++;
06237             }
06238             if((*i).new_user==201) {
06239                 string p=dcc_get_line((*i).in_buff);
06240                 if(!p.compare(""))
06241                     return;
06242                 bool got=false;
06243                 if(!p.compare(".")) {
06244                     got=false;
06245                 } else {
06246                     got=true;
06247                     if(!p.compare("0"))
06248                         p="0 0";
06249                     string lines, seconds;
06250                     int pos=0;
06251                     for(unsigned int i1=0; i1<p.length(); i1++) {
06252                         if(p[i1]==0x20) {
06253                             pos++;
06254                             continue;
06255                         }
06256                         if(pos==0)
06257                             lines+=p[i1];
06258                         if(pos==1)
06259                             seconds+=p[i1];
06260                     }
06261                     string disp;
06262                     (*i).user_partyline_msg_flood.lines=atol(lines.c_str());
06263                     (*i).user_partyline_msg_flood.seconds=atol(seconds.c_str());
06264                     (*i).new_user++;
06265                     return;
06266                 }
06267                 if(!got)
06268                     (*i).new_user=200;
06269                 return;
06270             }
06271             if((*i).new_user==202) {
06272                 (*i).new_user=100;
06273             }
06274 
06275             if((*i).new_user==300) {
06276                 string disp;
06277                 int ec=0;
06278 
06279                 disp=lang_get_string(1,(*i).lang,211)+eol; // !!!
06280                 dcc_send_msg((*i).socket,disp,ec);
06281 
06282                 vector<string>::iterator i1;
06283                 for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++) {
06284                     disp=(*i1)+eol;
06285                     dcc_send_msg((*i).socket,disp,ec);
06286                 }
06287 
06288                 disp=lang_get_string(1,(*i).lang,125)+eol; // !!!
06289                 dcc_send_msg((*i).socket,disp,ec);
06290 
06291                 (*i).user_channel_allow_dynamic.group="";
06292                 (*i).user_channel_allow_dynamic.plus_modes="";
06293                 (*i).user_channel_allow_dynamic.minus_modes="";
06294 
06295                 (*i).new_user++;
06296             }
06297             if((*i).new_user==301) {
06298                 string p=dcc_get_line((*i).in_buff);
06299                 if(!p.compare(""))
06300                     return;
06301                 if(p.compare(".")) {
06302                     vector<string>::iterator i1;
06303                     bool got=false;
06304                     for(i1=(*i).access_grant_groups.begin(); i1!=(*i).access_grant_groups.end(); i1++)
06305                         if(!(*i1).compare(p))
06306                             got=true;
06307                     string disp;
06308                     if(got)
06309                         disp=lang_get_string(1,(*i).lang,212)+eol;
06310                         else
06311                         disp=lang_get_string(1,(*i).lang,214)+eol;
06312                     int ec=0;
06313                     dcc_send_msg((*i).socket,disp,ec);
06314                     p=(string)"\""+p+"\"";
06315                     if(got) {
06316                         (*i).user_channel_allow_dynamic.group=p;
06317                         (*i).new_user++;
06318                     }
06319                 } else {
06320                     (*i).new_user=304;
06321                 }
06322             }
06323             if((*i).new_user==302) {
06324                 string p=dcc_get_line((*i).in_buff);
06325                 if(!p.compare(""))
06326                     return;
06327                 if(!p.compare("."))
06328                     p="";
06329                 p=(string)"\""+p+"\"";
06330                 (*i).user_channel_allow_dynamic.plus_modes=p;
06331 
06332                 string disp;
06333                 int ec=0;
06334 
06335                 disp=lang_get_string(1,(*i).lang,213)+eol; // !!!
06336                 dcc_send_msg((*i).socket,disp,ec);
06337                 (*i).new_user++;
06338             }
06339             if((*i).new_user==303) {
06340                 string p=dcc_get_line((*i).in_buff);
06341                 if(!p.compare(""))
06342                     return;
06343                 if(!p.compare("."))
06344                     p="";
06345                 p=(string)"\""+p+"\"";
06346                 (*i).user_channel_allow_dynamic.minus_modes=p;
06347 
06348                 (*i).user_channel.allow_dynamic.push_back((*i).user_channel_allow_dynamic);
06349 
06350                 (*i).new_user=300;
06351             }
06352             if((*i).new_user==304) {
06353                 (*i).new_user=38;
06354             }
06355 
06356             // on_notice
06357             if((*i).new_user==500) {
06358                 string disp;
06359                 int ec=0;
06360 
06361                 disp=lang_get_string(1,(*i).lang,601)+eol; // !!!
06362                 dcc_send_msg((*i).socket,disp,ec);
06363 
06364                 vector<string>::iterator i3;
06365                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06366                     if(!(*i3).compare("*"))
06367                         continue;
06368                     disp=*i3+eol;
06369                     dcc_send_msg((*i).socket,disp,ec);
06370                 }
06371 
06372                 disp=(string)"----------------"+eol;
06373                 dcc_send_msg((*i).socket,disp,ec);
06374 
06375                 disp=lang_get_string(1,(*i).lang,602)+eol; // !!!
06376                 dcc_send_msg((*i).socket,disp,ec);
06377 
06378                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06379                 dcc_send_msg((*i).socket,disp,ec);
06380 
06381                 disp=lang_get_string(1,(*i).lang,56)+eol;
06382                 dcc_send_msg((*i).socket,disp,ec);
06383 
06384                 (*i).new_user++;
06385             }
06386             if((*i).new_user==501) {
06387                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_notice)) {
06388                     int ec=0;
06389                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06390                     dcc_send_msg((*i).socket,disp,ec);
06391                     (*i).new_user++;
06392                     return;
06393                 }
06394 
06395                 string p=dcc_get_line((*i).in_buff);
06396                 if(!p.compare(""))
06397                     return;
06398                 vector<string>::iterator i1;
06399                 bool got=false;
06400                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06401                     if(!(*i1).compare(p))
06402                         got=true;
06403                 if(!p.compare(".")) {
06404                     got=true;
06405                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06406                     int ec=0;
06407                     dcc_send_msg((*i).socket,disp,ec);
06408                     (*i).new_user++;
06409                 } else {
06410                     string disp;
06411                     if(got)
06412                         disp=lang_get_string(1,(*i).lang,57)+eol;
06413                         else
06414                         disp=lang_get_string(1,(*i).lang,58)+eol;
06415                     int ec=0;
06416                     dcc_send_msg((*i).socket,disp,ec);
06417                     if(got)
06418                         (*i).user_channel.on_notice=p;
06419                         else {
06420                             (*i).new_user--;
06421                             return;
06422                         }
06423                     (*i).new_user++;
06424                 }
06425             }
06426 
06427             // on_except
06428             if((*i).new_user==502) {
06429                 string disp;
06430                 int ec=0;
06431 
06432                 disp=lang_get_string(1,(*i).lang,246)+eol; // !!!
06433                 dcc_send_msg((*i).socket,disp,ec);
06434 
06435                 vector<string>::iterator i3;
06436                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06437                     if(!(*i3).compare("*"))
06438                         continue;
06439                     disp=*i3+eol;
06440                     dcc_send_msg((*i).socket,disp,ec);
06441                 }
06442 
06443                 disp=(string)"----------------"+eol;
06444                 dcc_send_msg((*i).socket,disp,ec);
06445 
06446                 disp=lang_get_string(1,(*i).lang,247)+eol; // !!!
06447                 dcc_send_msg((*i).socket,disp,ec);
06448 
06449                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06450                 dcc_send_msg((*i).socket,disp,ec);
06451 
06452                 disp=lang_get_string(1,(*i).lang,56)+eol;
06453                 dcc_send_msg((*i).socket,disp,ec);
06454 
06455                 (*i).new_user++;
06456             }
06457             if((*i).new_user==503) {
06458                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_except)) {
06459                     int ec=0;
06460                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06461                     dcc_send_msg((*i).socket,disp,ec);
06462                     (*i).new_user++;
06463                     return;
06464                 }
06465 
06466                 string p=dcc_get_line((*i).in_buff);
06467                 if(!p.compare(""))
06468                     return;
06469                 vector<string>::iterator i1;
06470                 bool got=false;
06471                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06472                     if(!(*i1).compare(p))
06473                         got=true;
06474                 if(!p.compare(".")) {
06475                     got=true;
06476                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06477                     int ec=0;
06478                     dcc_send_msg((*i).socket,disp,ec);
06479                     (*i).new_user++;
06480                 } else {
06481                     string disp;
06482                     if(got)
06483                         disp=lang_get_string(1,(*i).lang,57)+eol;
06484                         else
06485                         disp=lang_get_string(1,(*i).lang,58)+eol;
06486                     int ec=0;
06487                     dcc_send_msg((*i).socket,disp,ec);
06488                     if(got)
06489                         (*i).user_channel.on_except=p;
06490                         else {
06491                             (*i).new_user--;
06492                             return;
06493                         }
06494                     (*i).new_user++;
06495                 }
06496             }
06497             // on_unexcept
06498             if((*i).new_user==504) {
06499                 string disp;
06500                 int ec=0;
06501 
06502                 disp=lang_get_string(1,(*i).lang,248)+eol; // !!!
06503                 dcc_send_msg((*i).socket,disp,ec);
06504 
06505                 vector<string>::iterator i3;
06506                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06507                     if(!(*i3).compare("*"))
06508                         continue;
06509                     disp=*i3+eol;
06510                     dcc_send_msg((*i).socket,disp,ec);
06511                 }
06512 
06513                 disp=(string)"----------------"+eol;
06514                 dcc_send_msg((*i).socket,disp,ec);
06515 
06516                 disp=lang_get_string(1,(*i).lang,249)+eol; // !!!
06517                 dcc_send_msg((*i).socket,disp,ec);
06518 
06519                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06520                 dcc_send_msg((*i).socket,disp,ec);
06521 
06522                 disp=lang_get_string(1,(*i).lang,56)+eol;
06523                 dcc_send_msg((*i).socket,disp,ec);
06524 
06525                 (*i).new_user++;
06526             }
06527             if((*i).new_user==505) {
06528                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_unexcept)) {
06529                     int ec=0;
06530                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06531                     dcc_send_msg((*i).socket,disp,ec);
06532                     (*i).new_user++;
06533                     return;
06534                 }
06535 
06536                 string p=dcc_get_line((*i).in_buff);
06537                 if(!p.compare(""))
06538                     return;
06539                 vector<string>::iterator i1;
06540                 bool got=false;
06541                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06542                     if(!(*i1).compare(p))
06543                         got=true;
06544                 if(!p.compare(".")) {
06545                     got=true;
06546                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06547                     int ec=0;
06548                     dcc_send_msg((*i).socket,disp,ec);
06549                     (*i).new_user++;
06550                 } else {
06551                     string disp;
06552                     if(got)
06553                         disp=lang_get_string(1,(*i).lang,57)+eol;
06554                         else
06555                         disp=lang_get_string(1,(*i).lang,58)+eol;
06556                     int ec=0;
06557                     dcc_send_msg((*i).socket,disp,ec);
06558                     if(got)
06559                         (*i).user_channel.on_unexcept=p;
06560                         else {
06561                             (*i).new_user--;
06562                             return;
06563                         }
06564                     (*i).new_user++;
06565                 }
06566             }
06567             // on_invite
06568             if((*i).new_user==506) {
06569                 string disp;
06570                 int ec=0;
06571 
06572                 disp=lang_get_string(1,(*i).lang,250)+eol; // !!!
06573                 dcc_send_msg((*i).socket,disp,ec);
06574 
06575                 vector<string>::iterator i3;
06576                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06577                     if(!(*i3).compare("*"))
06578                         continue;
06579                     disp=*i3+eol;
06580                     dcc_send_msg((*i).socket,disp,ec);
06581                 }
06582 
06583                 disp=(string)"----------------"+eol;
06584                 dcc_send_msg((*i).socket,disp,ec);
06585 
06586                 disp=lang_get_string(1,(*i).lang,251)+eol; // !!!
06587                 dcc_send_msg((*i).socket,disp,ec);
06588 
06589                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06590                 dcc_send_msg((*i).socket,disp,ec);
06591 
06592                 disp=lang_get_string(1,(*i).lang,56)+eol;
06593                 dcc_send_msg((*i).socket,disp,ec);
06594 
06595                 (*i).new_user++;
06596             }
06597             if((*i).new_user==507) {
06598                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_invite)) {
06599                     int ec=0;
06600                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06601                     dcc_send_msg((*i).socket,disp,ec);
06602                     (*i).new_user++;
06603                     return;
06604                 }
06605 
06606                 string p=dcc_get_line((*i).in_buff);
06607                 if(!p.compare(""))
06608                     return;
06609                 vector<string>::iterator i1;
06610                 bool got=false;
06611                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06612                     if(!(*i1).compare(p))
06613                         got=true;
06614                 if(!p.compare(".")) {
06615                     got=true;
06616                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06617                     int ec=0;
06618                     dcc_send_msg((*i).socket,disp,ec);
06619                     (*i).new_user++;
06620                 } else {
06621                     string disp;
06622                     if(got)
06623                         disp=lang_get_string(1,(*i).lang,57)+eol;
06624                         else
06625                         disp=lang_get_string(1,(*i).lang,58)+eol;
06626                     int ec=0;
06627                     dcc_send_msg((*i).socket,disp,ec);
06628                     if(got)
06629                         (*i).user_channel.on_invite=p;
06630                         else {
06631                             (*i).new_user--;
06632                             return;
06633                         }
06634                     (*i).new_user++;
06635                 }
06636             }
06637             // on_uninvite
06638             if((*i).new_user==508) {
06639                 string disp;
06640                 int ec=0;
06641 
06642                 disp=lang_get_string(1,(*i).lang,252)+eol; // !!!
06643                 dcc_send_msg((*i).socket,disp,ec);
06644 
06645                 vector<string>::iterator i3;
06646                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06647                     if(!(*i3).compare("*"))
06648                         continue;
06649                     disp=*i3+eol;
06650                     dcc_send_msg((*i).socket,disp,ec);
06651                 }
06652 
06653                 disp=(string)"----------------"+eol;
06654                 dcc_send_msg((*i).socket,disp,ec);
06655 
06656                 disp=lang_get_string(1,(*i).lang,253)+eol; // !!!
06657                 dcc_send_msg((*i).socket,disp,ec);
06658 
06659                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06660                 dcc_send_msg((*i).socket,disp,ec);
06661 
06662                 disp=lang_get_string(1,(*i).lang,56)+eol;
06663                 dcc_send_msg((*i).socket,disp,ec);
06664 
06665                 (*i).new_user++;
06666             }
06667             if((*i).new_user==509) {
06668                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_uninvite)) {
06669                     int ec=0;
06670                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06671                     dcc_send_msg((*i).socket,disp,ec);
06672                     (*i).new_user++;
06673                     return;
06674                 }
06675 
06676                 string p=dcc_get_line((*i).in_buff);
06677                 if(!p.compare(""))
06678                     return;
06679                 vector<string>::iterator i1;
06680                 bool got=false;
06681                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06682                     if(!(*i1).compare(p))
06683                         got=true;
06684                 if(!p.compare(".")) {
06685                     got=true;
06686                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06687                     int ec=0;
06688                     dcc_send_msg((*i).socket,disp,ec);
06689                     (*i).new_user++;
06690                 } else {
06691                     string disp;
06692                     if(got)
06693                         disp=lang_get_string(1,(*i).lang,57)+eol;
06694                         else
06695                         disp=lang_get_string(1,(*i).lang,58)+eol;
06696                     int ec=0;
06697                     dcc_send_msg((*i).socket,disp,ec);
06698                     if(got)
06699                         (*i).user_channel.on_uninvite=p;
06700                         else {
06701                             (*i).new_user--;
06702                             return;
06703                         }
06704                     (*i).new_user++;
06705                 }
06706             }
06707             // on_not_invited
06708             if((*i).new_user==510) {
06709                 string disp;
06710                 int ec=0;
06711 
06712                 disp=lang_get_string(1,(*i).lang,254)+eol; // !!!
06713                 dcc_send_msg((*i).socket,disp,ec);
06714 
06715                 vector<string>::iterator i3;
06716                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06717                     if(!(*i3).compare("*"))
06718                         continue;
06719                     disp=*i3+eol;
06720                     dcc_send_msg((*i).socket,disp,ec);
06721                 }
06722 
06723                 disp=(string)"----------------"+eol;
06724                 dcc_send_msg((*i).socket,disp,ec);
06725 
06726                 disp=lang_get_string(1,(*i).lang,255)+eol; // !!!
06727                 dcc_send_msg((*i).socket,disp,ec);
06728 
06729                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06730                 dcc_send_msg((*i).socket,disp,ec);
06731 
06732                 disp=lang_get_string(1,(*i).lang,56)+eol;
06733                 dcc_send_msg((*i).socket,disp,ec);
06734 
06735                 (*i).new_user++;
06736             }
06737             if((*i).new_user==511) {
06738                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_not_invited)) {
06739                     int ec=0;
06740                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06741                     dcc_send_msg((*i).socket,disp,ec);
06742                     (*i).new_user++;
06743                     return;
06744                 }
06745 
06746                 string p=dcc_get_line((*i).in_buff);
06747                 if(!p.compare(""))
06748                     return;
06749                 vector<string>::iterator i1;
06750                 bool got=false;
06751                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06752                     if(!(*i1).compare(p))
06753                         got=true;
06754                 if(!p.compare(".")) {
06755                     got=true;
06756                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06757                     int ec=0;
06758                     dcc_send_msg((*i).socket,disp,ec);
06759                     (*i).new_user++;
06760                 } else {
06761                     string disp;
06762                     if(got)
06763                         disp=lang_get_string(1,(*i).lang,57)+eol;
06764                         else
06765                         disp=lang_get_string(1,(*i).lang,58)+eol;
06766                     int ec=0;
06767                     dcc_send_msg((*i).socket,disp,ec);
06768                     if(got)
06769                         (*i).user_channel.on_not_invited=p;
06770                         else {
06771                             (*i).new_user--;
06772                             return;
06773                         }
06774                     (*i).new_user++;
06775                 }
06776             }
06777 
06778             // on_not_in_reop
06779             if((*i).new_user==512) {
06780                 string disp;
06781                 int ec=0;
06782 
06783                 disp=lang_get_string(1,(*i).lang,594)+eol; // !!!
06784                 dcc_send_msg((*i).socket,disp,ec);
06785 
06786                 vector<string>::iterator i3;
06787                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06788                     if(!(*i3).compare("*"))
06789                         continue;
06790                     disp=*i3+eol;
06791                     dcc_send_msg((*i).socket,disp,ec);
06792                 }
06793 
06794                 disp=(string)"----------------"+eol;
06795                 dcc_send_msg((*i).socket,disp,ec);
06796 
06797                 disp=lang_get_string(1,(*i).lang,595)+eol; // !!!
06798                 dcc_send_msg((*i).socket,disp,ec);
06799 
06800                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06801                 dcc_send_msg((*i).socket,disp,ec);
06802 
06803                 disp=lang_get_string(1,(*i).lang,56)+eol;
06804                 dcc_send_msg((*i).socket,disp,ec);
06805 
06806                 (*i).new_user++;
06807             }
06808             if((*i).new_user==513) {
06809                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_not_in_reop)) {
06810                     int ec=0;
06811                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06812                     dcc_send_msg((*i).socket,disp,ec);
06813                     (*i).new_user++;
06814                     return;
06815                 }
06816 
06817                 string p=dcc_get_line((*i).in_buff);
06818                 if(!p.compare(""))
06819                     return;
06820                 vector<string>::iterator i1;
06821                 bool got=false;
06822                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06823                     if(!(*i1).compare(p))
06824                         got=true;
06825                 if(!p.compare(".")) {
06826                     got=true;
06827                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06828                     int ec=0;
06829                     dcc_send_msg((*i).socket,disp,ec);
06830                     (*i).new_user++;
06831                 } else {
06832                     string disp;
06833                     if(got)
06834                         disp=lang_get_string(1,(*i).lang,57)+eol;
06835                         else
06836                         disp=lang_get_string(1,(*i).lang,58)+eol;
06837                     int ec=0;
06838                     dcc_send_msg((*i).socket,disp,ec);
06839                     if(got)
06840                         (*i).user_channel.on_not_in_reop=p;
06841                         else {
06842                             (*i).new_user--;
06843                             return;
06844                         }
06845                     (*i).new_user++;
06846                 }
06847             }
06848 
06849             // on_reop
06850             if((*i).new_user==514) {
06851                 string disp;
06852                 int ec=0;
06853 
06854                 disp=lang_get_string(1,(*i).lang,596)+eol; // !!!
06855                 dcc_send_msg((*i).socket,disp,ec);
06856 
06857                 vector<string>::iterator i3;
06858                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06859                     if(!(*i3).compare("*"))
06860                         continue;
06861                     disp=*i3+eol;
06862                     dcc_send_msg((*i).socket,disp,ec);
06863                 }
06864 
06865                 disp=(string)"----------------"+eol;
06866                 dcc_send_msg((*i).socket,disp,ec);
06867 
06868                 disp=lang_get_string(1,(*i).lang,597)+eol; // !!!
06869                 dcc_send_msg((*i).socket,disp,ec);
06870 
06871                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06872                 dcc_send_msg((*i).socket,disp,ec);
06873 
06874                 disp=lang_get_string(1,(*i).lang,56)+eol;
06875                 dcc_send_msg((*i).socket,disp,ec);
06876 
06877                 (*i).new_user++;
06878             }
06879             if((*i).new_user==515) {
06880                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_reop)) {
06881                     int ec=0;
06882                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06883                     dcc_send_msg((*i).socket,disp,ec);
06884                     (*i).new_user++;
06885                     return;
06886                 }
06887 
06888                 string p=dcc_get_line((*i).in_buff);
06889                 if(!p.compare(""))
06890                     return;
06891                 vector<string>::iterator i1;
06892                 bool got=false;
06893                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06894                     if(!(*i1).compare(p))
06895                         got=true;
06896                 if(!p.compare(".")) {
06897                     got=true;
06898                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06899                     int ec=0;
06900                     dcc_send_msg((*i).socket,disp,ec);
06901                     (*i).new_user++;
06902                 } else {
06903                     string disp;
06904                     if(got)
06905                         disp=lang_get_string(1,(*i).lang,57)+eol;
06906                         else
06907                         disp=lang_get_string(1,(*i).lang,58)+eol;
06908                     int ec=0;
06909                     dcc_send_msg((*i).socket,disp,ec);
06910                     if(got)
06911                         (*i).user_channel.on_reop=p;
06912                         else {
06913                             (*i).new_user--;
06914                             return;
06915                         }
06916                     (*i).new_user++;
06917                 }
06918             }
06919 
06920             // on_other_mode
06921             if((*i).new_user==516) {
06922                 string disp;
06923                 int ec=0;
06924 
06925                 disp=lang_get_string(1,(*i).lang,564)+eol; // !!!
06926                 dcc_send_msg((*i).socket,disp,ec);
06927 
06928                 vector<string>::iterator i3;
06929                 for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
06930                     if(!(*i3).compare("*"))
06931                         continue;
06932                     disp=*i3+eol;
06933                     dcc_send_msg((*i).socket,disp,ec);
06934                 }
06935 
06936                 disp=(string)"----------------"+eol;
06937                 dcc_send_msg((*i).socket,disp,ec);
06938 
06939                 disp=lang_get_string(1,(*i).lang,565)+eol; // !!!
06940                 dcc_send_msg((*i).socket,disp,ec);
06941 
06942                 disp=lang_subst(lang_get_string(1,(*i).lang,54),(*i).user_channel.channel_name)+eol;
06943                 dcc_send_msg((*i).socket,disp,ec);
06944 
06945                 disp=lang_get_string(1,(*i).lang,56)+eol;
06946                 dcc_send_msg((*i).socket,disp,ec);
06947 
06948                 (*i).new_user++;
06949             }
06950             if((*i).new_user==517) {
06951                 if(!dcc_can_unassign(i,eol,(*i).user_channel.on_other_mode)) {
06952                     int ec=0;
06953                     string disp=lang_get_string(1,(*i).lang,592)+eol;
06954                     dcc_send_msg((*i).socket,disp,ec);
06955                     (*i).new_user++;
06956                     return;
06957                 }
06958 
06959                 string p=dcc_get_line((*i).in_buff);
06960                 if(!p.compare(""))
06961                     return;
06962                 vector<string>::iterator i1;
06963                 bool got=false;
06964                 for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
06965                     if(!(*i1).compare(p))
06966                         got=true;
06967                 if(!p.compare(".")) {
06968                     got=true;
06969                     string disp=lang_get_string(1,(*i).lang,57)+eol;
06970                     int ec=0;
06971                     dcc_send_msg((*i).socket,disp,ec);
06972                     (*i).new_user++;
06973                 } else {
06974                     string disp;
06975                     if(got)
06976                         disp=lang_get_string(1,(*i).lang,57)+eol;
06977                         else
06978                         disp=lang_get_string(1,(*i).lang,58)+eol;
06979                     int ec=0;
06980                     dcc_send_msg((*i).socket,disp,ec);
06981                     if(got)
06982                         (*i).user_channel.on_other_mode=p;
06983                         else {
06984                             (*i).new_user--;
06985                             return;
06986                         }
06987                     (*i).new_user++;
06988                 }
06989             }
06990             if((*i).new_user==518) {
06991                 (*i).new_user=44;
06992             }
06993 
06994             if((*i).new_user==1000 || (*i).new_user==1100) {
06995                 if((*i).access_grant_partyline) {
06996                     string disp=lang_get_string(1,(*i).lang,542)+eol;
06997                     int ec=0;
06998                     dcc_send_msg((*i).socket,disp,ec);
06999                     (*i).new_user++;
07000                 } else {
07001                     (*i).new_user+=2;
07002                 }
07003             }
07004             if((*i).new_user==1001 || (*i).new_user==1101) {
07005                 string p=dcc_get_line((*i).in_buff);
07006                 if(!p.compare(""))
07007                     return;
07008                 if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
07009                     string disp=lang_get_string(1,(*i).lang,542)+eol;
07010                     int ec=0;
07011                     dcc_send_msg((*i).socket,disp,ec);
07012                 } else {
07013                     if(!p.compare("n") || !p.compare("N")) {
07014                         (*i).user_access_grant_partyline=false;
07015                         (*i).new_user++;
07016                         return;
07017                     } else {
07018                         (*i).user_access_grant_partyline=true;
07019                         (*i).new_user++;
07020                         return;
07021                     }
07022                 }
07023             }
07024             if((*i).new_user==1002) {
07025                 (*i).new_user=100;
07026                 return;
07027             }
07028             if((*i).new_user==1102) {
07029                 (*i).new_user=200;
07030                 return;
07031             }
07032 
07033             // access_usage_proc
07034             if((*i).new_user==1200) {
07035                 string p=dcc_get_line((*i).in_buff);
07036                 if(!p.compare(""))
07037                     return;
07038                 if(p.compare(".")) {
07039                     vector<string>::iterator i1;
07040                     bool got=false;
07041                     for(i1=(*i).access_grant_proc_groups.begin(); i1!=(*i).access_grant_proc_groups.end(); i1++)
07042                         if(!(*i1).compare(p))
07043                             got=true;
07044                     string disp;
07045                     if(got)
07046                         disp=lang_get_string(1,(*i).lang,46)+eol;
07047                         else
07048                         disp=lang_get_string(1,(*i).lang,47)+eol;
07049                     int ec=0;
07050                     dcc_send_msg((*i).socket,disp,ec);
07051                     p=(string)"\""+p+"\"";
07052                     if(got)
07053                         (*i).user_access_usage_proc_groups.push_back(p);
07054                 } else {
07055                     string disp=lang_get_string(1,(*i).lang,51)+eol;
07056                     int ec=0;
07057                     dcc_send_msg((*i).socket,disp,ec);
07058                     vector<string>::iterator i1;
07059                     for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++) {
07060                         disp=*i1+eol;
07061                         dcc_send_msg((*i).socket,disp,ec);
07062                     }
07063                     disp=lang_get_string(1,(*i).lang,45)+eol;
07064                     dcc_send_msg((*i).socket,disp,ec);
07065                     (*i).new_user=12;
07066                     return;
07067                 }
07068             }
07069 }

Here is the call graph for this function:

void dcc_loop_private vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to .private command.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 2770 of file dcc.cpp.

References dcc_can_unassign(), dcc_get_line(), dcc_send_msg(), and lang_get_string().

Referenced by dcc_loop().

02771 {
02772     if((*i).private_edit==0)
02773         return;
02774 
02775     if((*i).private_edit==1) {
02776         (*i).private_=r_private;
02777 
02778         int ec=0;
02779         string disp=lang_get_string(1,(*i).lang,413)+eol; // !!!
02780         dcc_send_msg((*i).socket,disp,ec);
02781 
02782         vector<string>::iterator i3;
02783         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
02784             if(!(*i3).compare("*"))
02785                 continue;
02786             disp=*i3+eol;
02787             dcc_send_msg((*i).socket,disp,ec);
02788         }
02789 
02790         disp=(string)"----------------"+eol;
02791         dcc_send_msg((*i).socket,disp,ec);
02792 
02793         disp=lang_get_string(1,(*i).lang,414)+eol; // !!!
02794         dcc_send_msg((*i).socket,disp,ec);
02795 
02796         disp=lang_get_string(1,(*i).lang,130)+eol;
02797         dcc_send_msg((*i).socket,disp,ec);
02798 
02799         (*i).private_edit++;
02800         return;
02801     }
02802     if((*i).private_edit==2) {
02803         if(!dcc_can_unassign(i,eol,(*i).private_.on_privmsg)) {
02804             int ec=0;
02805             string disp=lang_get_string(1,(*i).lang,592)+eol;
02806             dcc_send_msg((*i).socket,disp,ec);
02807             (*i).private_edit++;
02808             return;
02809         }
02810 
02811         string p=dcc_get_line((*i).in_buff);
02812         if(!p.compare(""))
02813             return;
02814 
02815         vector<string>::iterator i1;
02816         bool got=false;
02817         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
02818             if(!(*i1).compare(p))
02819                 got=true;
02820         if(!p.compare(".")) {
02821             got=true;
02822             string disp=lang_get_string(1,(*i).lang,131)+eol;
02823             int ec=0;
02824             dcc_send_msg((*i).socket,disp,ec);
02825             (*i).private_edit++;
02826         } else {
02827             if(!p.compare("..")) {
02828                 (*i).private_.on_privmsg="";
02829                 got=true;
02830                 string disp=lang_get_string(1,(*i).lang,132)+eol;
02831                 int ec=0;
02832                 dcc_send_msg((*i).socket,disp,ec);
02833                 (*i).private_edit++;
02834             } else {
02835                 string disp;
02836                 if(got)
02837                     disp=lang_get_string(1,(*i).lang,57)+eol;
02838                 else
02839                     disp=lang_get_string(1,(*i).lang,58)+eol;
02840                 int ec=0;
02841                 dcc_send_msg((*i).socket,disp,ec);
02842                 if(got)
02843                     (*i).private_.on_privmsg=p;
02844                 else {
02845                     (*i).private_edit--;
02846                     return;
02847                 }
02848                 (*i).private_edit++;
02849             }
02850         }
02851     }
02852 
02853     if((*i).private_edit==3) {
02854         int ec=0;
02855         string disp=lang_get_string(1,(*i).lang,605)+eol; // !!!
02856         dcc_send_msg((*i).socket,disp,ec);
02857 
02858         vector<string>::iterator i3;
02859         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
02860             if(!(*i3).compare("*"))
02861                 continue;
02862             disp=*i3+eol;
02863             dcc_send_msg((*i).socket,disp,ec);
02864         }
02865 
02866         disp=(string)"----------------"+eol;
02867         dcc_send_msg((*i).socket,disp,ec);
02868 
02869         disp=lang_get_string(1,(*i).lang,607)+eol; // !!!
02870         dcc_send_msg((*i).socket,disp,ec);
02871 
02872         disp=lang_get_string(1,(*i).lang,130)+eol;
02873         dcc_send_msg((*i).socket,disp,ec);
02874 
02875         (*i).private_edit++;
02876         return;
02877     }
02878     if((*i).private_edit==4) {
02879         if(!dcc_can_unassign(i,eol,(*i).private_.on_notice)) {
02880             int ec=0;
02881             string disp=lang_get_string(1,(*i).lang,592)+eol;
02882             dcc_send_msg((*i).socket,disp,ec);
02883             (*i).private_edit++;
02884             return;
02885         }
02886 
02887         string p=dcc_get_line((*i).in_buff);
02888         if(!p.compare(""))
02889             return;
02890 
02891         vector<string>::iterator i1;
02892         bool got=false;
02893         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
02894             if(!(*i1).compare(p))
02895                 got=true;
02896         if(!p.compare(".")) {
02897             got=true;
02898             string disp=lang_get_string(1,(*i).lang,131)+eol;
02899             int ec=0;
02900             dcc_send_msg((*i).socket,disp,ec);
02901             (*i).private_edit++;
02902         } else {
02903             if(!p.compare("..")) {
02904                 (*i).private_.on_notice="";
02905                 got=true;
02906                 string disp=lang_get_string(1,(*i).lang,132)+eol;
02907                 int ec=0;
02908                 dcc_send_msg((*i).socket,disp,ec);
02909                 (*i).private_edit++;
02910             } else {
02911                 string disp;
02912                 if(got)
02913                     disp=lang_get_string(1,(*i).lang,57)+eol;
02914                 else
02915                     disp=lang_get_string(1,(*i).lang,58)+eol;
02916                 int ec=0;
02917                 dcc_send_msg((*i).socket,disp,ec);
02918                 if(got)
02919                     (*i).private_.on_notice=p;
02920                 else {
02921                     (*i).private_edit--;
02922                     return;
02923                 }
02924                 (*i).private_edit++;
02925             }
02926         }
02927     }
02928 
02929     if((*i).private_edit==5) {
02930         int ec=0;
02931         string disp=lang_get_string(1,(*i).lang,415)+eol; // !!!
02932         dcc_send_msg((*i).socket,disp,ec);
02933 
02934         vector<string>::iterator i3;
02935         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
02936             if(!(*i3).compare("*"))
02937                 continue;
02938             disp=*i3+eol;
02939             dcc_send_msg((*i).socket,disp,ec);
02940         }
02941 
02942         disp=(string)"----------------"+eol;
02943         dcc_send_msg((*i).socket,disp,ec);
02944 
02945         disp=lang_get_string(1,(*i).lang,416)+eol; // !!!
02946         dcc_send_msg((*i).socket,disp,ec);
02947 
02948         disp=lang_get_string(1,(*i).lang,130)+eol;
02949         dcc_send_msg((*i).socket,disp,ec);
02950 
02951         (*i).private_edit++;
02952         return;
02953     }
02954     if((*i).private_edit==6) {
02955         if(!dcc_can_unassign(i,eol,(*i).private_.on_ctcp)) {
02956             int ec=0;
02957             string disp=lang_get_string(1,(*i).lang,592)+eol;
02958             dcc_send_msg((*i).socket,disp,ec);
02959             (*i).private_edit++;
02960             return;
02961         }
02962 
02963         string p=dcc_get_line((*i).in_buff);
02964         if(!p.compare(""))
02965             return;
02966 
02967         vector<string>::iterator i1;
02968         bool got=false;
02969         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
02970             if(!(*i1).compare(p))
02971                 got=true;
02972         if(!p.compare(".")) {
02973             got=true;
02974             string disp=lang_get_string(1,(*i).lang,131)+eol;
02975             int ec=0;
02976             dcc_send_msg((*i).socket,disp,ec);
02977             (*i).private_edit++;
02978         } else {
02979             if(!p.compare("..")) {
02980                 (*i).private_.on_ctcp="";
02981                 got=true;
02982                 string disp=lang_get_string(1,(*i).lang,132)+eol;
02983                 int ec=0;
02984                 dcc_send_msg((*i).socket,disp,ec);
02985                 (*i).private_edit++;
02986             } else {
02987                 string disp;
02988                 if(got)
02989                     disp=lang_get_string(1,(*i).lang,57)+eol;
02990                 else
02991                     disp=lang_get_string(1,(*i).lang,58)+eol;
02992                 int ec=0;
02993                 dcc_send_msg((*i).socket,disp,ec);
02994                 if(got)
02995                     (*i).private_.on_ctcp=p;
02996                 else {
02997                     (*i).private_edit--;
02998                     return;
02999                 }
03000                 (*i).private_edit++;
03001             }
03002         }
03003     }
03004 
03005     if((*i).private_edit==7) {
03006         int ec=0;
03007         string disp=lang_get_string(1,(*i).lang,667)+eol; // !!!
03008         dcc_send_msg((*i).socket,disp,ec);
03009 
03010         vector<string>::iterator i3;
03011         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
03012             if(!(*i3).compare("*"))
03013                 continue;
03014             disp=*i3+eol;
03015             dcc_send_msg((*i).socket,disp,ec);
03016         }
03017 
03018         disp=(string)"----------------"+eol;
03019         dcc_send_msg((*i).socket,disp,ec);
03020 
03021         disp=lang_get_string(1,(*i).lang,668)+eol; // !!!
03022         dcc_send_msg((*i).socket,disp,ec);
03023 
03024         disp=lang_get_string(1,(*i).lang,130)+eol;
03025         dcc_send_msg((*i).socket,disp,ec);
03026 
03027         (*i).private_edit++;
03028         return;
03029     }
03030     if((*i).private_edit==8) {
03031         if(!dcc_can_unassign(i,eol,(*i).private_.on_filesys_got_new)) {
03032             int ec=0;
03033             string disp=lang_get_string(1,(*i).lang,592)+eol;
03034             dcc_send_msg((*i).socket,disp,ec);
03035             (*i).private_edit++;
03036             return;
03037         }
03038 
03039         string p=dcc_get_line((*i).in_buff);
03040         if(!p.compare(""))
03041             return;
03042 
03043         vector<string>::iterator i1;
03044         bool got=false;
03045         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
03046             if(!(*i1).compare(p))
03047                 got=true;
03048         if(!p.compare(".")) {
03049             got=true;
03050             string disp=lang_get_string(1,(*i).lang,131)+eol;
03051             int ec=0;
03052             dcc_send_msg((*i).socket,disp,ec);
03053             (*i).private_edit++;
03054         } else {
03055             if(!p.compare("..")) {
03056                 (*i).private_.on_filesys_got_new="";
03057                 got=true;
03058                 string disp=lang_get_string(1,(*i).lang,132)+eol;
03059                 int ec=0;
03060                 dcc_send_msg((*i).socket,disp,ec);
03061                 (*i).private_edit++;
03062             } else {
03063                 string disp;
03064                 if(got)
03065                     disp=lang_get_string(1,(*i).lang,57)+eol;
03066                 else
03067                     disp=lang_get_string(1,(*i).lang,58)+eol;
03068                 int ec=0;
03069                 dcc_send_msg((*i).socket,disp,ec);
03070                 if(got)
03071                     (*i).private_.on_filesys_got_new=p;
03072                 else {
03073                     (*i).private_edit--;
03074                     return;
03075                 }
03076                 (*i).private_edit++;
03077             }
03078         }
03079     }
03080 
03081     if((*i).private_edit==9) {
03082         int ec=0;
03083         string disp=lang_get_string(1,(*i).lang,669)+eol; // !!!
03084         dcc_send_msg((*i).socket,disp,ec);
03085 
03086         vector<string>::iterator i3;
03087         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
03088             if(!(*i3).compare("*"))
03089                 continue;
03090             disp=*i3+eol;
03091             dcc_send_msg((*i).socket,disp,ec);
03092         }
03093 
03094         disp=(string)"----------------"+eol;
03095         dcc_send_msg((*i).socket,disp,ec);
03096 
03097         disp=lang_get_string(1,(*i).lang,670)+eol; // !!!
03098         dcc_send_msg((*i).socket,disp,ec);
03099 
03100         disp=lang_get_string(1,(*i).lang,130)+eol;
03101         dcc_send_msg((*i).socket,disp,ec);
03102 
03103         (*i).private_edit++;
03104         return;
03105     }
03106     if((*i).private_edit==10) {
03107         if(!dcc_can_unassign(i,eol,(*i).private_.on_fnc)) {
03108             int ec=0;
03109             string disp=lang_get_string(1,(*i).lang,592)+eol;
03110             dcc_send_msg((*i).socket,disp,ec);
03111             (*i).private_edit++;
03112             return;
03113         }
03114 
03115         string p=dcc_get_line((*i).in_buff);
03116         if(!p.compare(""))
03117             return;
03118 
03119         vector<string>::iterator i1;
03120         bool got=false;
03121         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
03122             if(!(*i1).compare(p))
03123                 got=true;
03124         if(!p.compare(".")) {
03125             got=true;
03126             string disp=lang_get_string(1,(*i).lang,131)+eol;
03127             int ec=0;
03128             dcc_send_msg((*i).socket,disp,ec);
03129             (*i).private_edit++;
03130         } else {
03131             if(!p.compare("..")) {
03132                 (*i).private_.on_fnc="";
03133                 got=true;
03134                 string disp=lang_get_string(1,(*i).lang,132)+eol;
03135                 int ec=0;
03136                 dcc_send_msg((*i).socket,disp,ec);
03137                 (*i).private_edit++;
03138             } else {
03139                 string disp;
03140                 if(got)
03141                     disp=lang_get_string(1,(*i).lang,57)+eol;
03142                 else
03143                     disp=lang_get_string(1,(*i).lang,58)+eol;
03144                 int ec=0;
03145                 dcc_send_msg((*i).socket,disp,ec);
03146                 if(got)
03147                     (*i).private_.on_fnc=p;
03148                 else {
03149                     (*i).private_edit--;
03150                     return;
03151                 }
03152                 (*i).private_edit++;
03153             }
03154         }
03155     }
03156 
03157     if((*i).private_edit==11) {
03158         int ec=0;
03159         string disp=lang_get_string(1,(*i).lang,671)+eol; // !!!
03160         dcc_send_msg((*i).socket,disp,ec);
03161 
03162         vector<string>::iterator i3;
03163         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
03164             if(!(*i3).compare("*"))
03165                 continue;
03166             disp=*i3+eol;
03167             dcc_send_msg((*i).socket,disp,ec);
03168         }
03169 
03170         disp=(string)"----------------"+eol;
03171         dcc_send_msg((*i).socket,disp,ec);
03172 
03173         disp=lang_get_string(1,(*i).lang,672)+eol; // !!!
03174         dcc_send_msg((*i).socket,disp,ec);
03175 
03176         disp=lang_get_string(1,(*i).lang,130)+eol;
03177         dcc_send_msg((*i).socket,disp,ec);
03178 
03179         (*i).private_edit++;
03180         return;
03181     }
03182     if((*i).private_edit==12) {
03183         if(!dcc_can_unassign(i,eol,(*i).private_.on_broadcast)) {
03184             int ec=0;
03185             string disp=lang_get_string(1,(*i).lang,592)+eol;
03186             dcc_send_msg((*i).socket,disp,ec);
03187             (*i).private_edit++;
03188             return;
03189         }
03190 
03191         string p=dcc_get_line((*i).in_buff);
03192         if(!p.compare(""))
03193             return;
03194 
03195         vector<string>::iterator i1;
03196         bool got=false;
03197         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
03198             if(!(*i1).compare(p))
03199                 got=true;
03200         if(!p.compare(".")) {
03201             got=true;
03202             string disp=lang_get_string(1,(*i).lang,131)+eol;
03203             int ec=0;
03204             dcc_send_msg((*i).socket,disp,ec);
03205             (*i).private_edit++;
03206         } else {
03207             if(!p.compare("..")) {
03208                 (*i).private_.on_broadcast="";
03209                 got=true;
03210                 string disp=lang_get_string(1,(*i).lang,132)+eol;
03211                 int ec=0;
03212                 dcc_send_msg((*i).socket,disp,ec);
03213                 (*i).private_edit++;
03214             } else {
03215                 string disp;
03216                 if(got)
03217                     disp=lang_get_string(1,(*i).lang,57)+eol;
03218                 else
03219                     disp=lang_get_string(1,(*i).lang,58)+eol;
03220                 int ec=0;
03221                 dcc_send_msg((*i).socket,disp,ec);
03222                 if(got)
03223                     (*i).private_.on_broadcast=p;
03224                 else {
03225                     (*i).private_edit--;
03226                     return;
03227                 }
03228                 (*i).private_edit++;
03229             }
03230         }
03231     }
03232 
03233     if((*i).private_edit==13) {
03234         int ec=0;
03235         string disp=lang_get_string(1,(*i).lang,673)+eol; // !!!
03236         dcc_send_msg((*i).socket,disp,ec);
03237 
03238         vector<string>::iterator i3;
03239         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
03240             if(!(*i3).compare("*"))
03241                 continue;
03242             disp=*i3+eol;
03243             dcc_send_msg((*i).socket,disp,ec);
03244         }
03245 
03246         disp=(string)"----------------"+eol;
03247         dcc_send_msg((*i).socket,disp,ec);
03248 
03249         disp=lang_get_string(1,(*i).lang,674)+eol; // !!!
03250         dcc_send_msg((*i).socket,disp,ec);
03251 
03252         disp=lang_get_string(1,(*i).lang,130)+eol;
03253         dcc_send_msg((*i).socket,disp,ec);
03254 
03255         (*i).private_edit++;
03256         return;
03257     }
03258     if((*i).private_edit==14) {
03259         if(!dcc_can_unassign(i,eol,(*i).private_.on_server_msg)) {
03260             int ec=0;
03261             string disp=lang_get_string(1,(*i).lang,592)+eol;
03262             dcc_send_msg((*i).socket,disp,ec);
03263             (*i).private_edit++;
03264             return;
03265         }
03266 
03267         string p=dcc_get_line((*i).in_buff);
03268         if(!p.compare(""))
03269             return;
03270 
03271         vector<string>::iterator i1;
03272         bool got=false;
03273         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
03274             if(!(*i1).compare(p))
03275                 got=true;
03276         if(!p.compare(".")) {
03277             got=true;
03278             string disp=lang_get_string(1,(*i).lang,131)+eol;
03279             int ec=0;
03280             dcc_send_msg((*i).socket,disp,ec);
03281             (*i).private_edit++;
03282         } else {
03283             if(!p.compare("..")) {
03284                 (*i).private_.on_server_msg="";
03285                 got=true;
03286                 string disp=lang_get_string(1,(*i).lang,132)+eol;
03287                 int ec=0;
03288                 dcc_send_msg((*i).socket,disp,ec);
03289                 (*i).private_edit++;
03290             } else {
03291                 string disp;
03292                 if(got)
03293                     disp=lang_get_string(1,(*i).lang,57)+eol;
03294                 else
03295                     disp=lang_get_string(1,(*i).lang,58)+eol;
03296                 int ec=0;
03297                 dcc_send_msg((*i).socket,disp,ec);
03298                 if(got)
03299                     (*i).private_.on_server_msg=p;
03300                 else {
03301                     (*i).private_edit--;
03302                     return;
03303                 }
03304                 (*i).private_edit++;
03305             }
03306         }
03307     }
03308 
03309     // on_internal_event
03310     if((*i).private_edit==15) {
03311         int ec=0;
03312         string disp=lang_get_string(1,(*i).lang,696)+eol; // !!!
03313         dcc_send_msg((*i).socket,disp,ec);
03314 
03315         vector<string>::iterator i3;
03316         for(i3=(*i).access_usage_proc.begin(); i3!=(*i).access_usage_proc.end(); i3++) {
03317             if(!(*i3).compare("*"))
03318                 continue;
03319             disp=*i3+eol;
03320             dcc_send_msg((*i).socket,disp,ec);
03321         }
03322 
03323         disp=(string)"----------------"+eol;
03324         dcc_send_msg((*i).socket,disp,ec);
03325 
03326         disp=lang_get_string(1,(*i).lang,697)+eol; // !!!
03327         dcc_send_msg((*i).socket,disp,ec);
03328 
03329         disp=lang_get_string(1,(*i).lang,130)+eol;
03330         dcc_send_msg((*i).socket,disp,ec);
03331 
03332         (*i).private_edit++;
03333         return;
03334     }
03335     if((*i).private_edit==16) {
03336         if(!dcc_can_unassign(i,eol,(*i).private_.on_internal_event)) {
03337             int ec=0;
03338             string disp=lang_get_string(1,(*i).lang,592)+eol;
03339             dcc_send_msg((*i).socket,disp,ec);
03340             (*i).private_edit++;
03341             return;
03342         }
03343 
03344         string p=dcc_get_line((*i).in_buff);
03345         if(!p.compare(""))
03346             return;
03347 
03348         vector<string>::iterator i1;
03349         bool got=false;
03350         for(i1=(*i).access_usage_proc.begin(); i1!=(*i).access_usage_proc.end(); i1++)
03351             if(!(*i1).compare(p))
03352                 got=true;
03353         if(!p.compare(".")) {
03354             got=true;
03355             string disp=lang_get_string(1,(*i).lang,131)+eol;
03356             int ec=0;
03357             dcc_send_msg((*i).socket,disp,ec);
03358             (*i).private_edit++;
03359         } else {
03360             if(!p.compare("..")) {
03361                 (*i).private_.on_internal_event="";
03362                 got=true;
03363                 string disp=lang_get_string(1,(*i).lang,132)+eol;
03364                 int ec=0;
03365                 dcc_send_msg((*i).socket,disp,ec);
03366                 (*i).private_edit++;
03367             } else {
03368                 string disp;
03369                 if(got)
03370                     disp=lang_get_string(1,(*i).lang,57)+eol;
03371                 else
03372                     disp=lang_get_string(1,(*i).lang,58)+eol;
03373                 int ec=0;
03374                 dcc_send_msg((*i).socket,disp,ec);
03375                 if(got)
03376                     (*i).private_.on_internal_event=p;
03377                 else {
03378                     (*i).private_edit--;
03379                     return;
03380                 }
03381                 (*i).private_edit++;
03382             }
03383         }
03384     }
03385 
03386     // commit?
03387     if((*i).private_edit==17) {
03388         int ec=0;
03389         string disp=lang_get_string(1,(*i).lang,417)+eol; // !!!
03390         dcc_send_msg((*i).socket,disp,ec);
03391         (*i).private_edit++;
03392         return;
03393     }
03394     if((*i).private_edit==18) {
03395         string p=dcc_get_line((*i).in_buff);
03396         if(!p.compare(""))
03397             return;
03398 
03399         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
03400             string disp=lang_get_string(1,(*i).lang,417)+eol;
03401             int ec=0;
03402             dcc_send_msg((*i).socket,disp,ec);
03403         } else {
03404             if(!p.compare("n") || !p.compare("N")) {
03405                 string disp=lang_get_string(1,(*i).lang,70)+eol;
03406                 int ec=0;
03407                 dcc_send_msg((*i).socket,disp,ec);
03408             } else {
03409                 (*i).private_.last_changed=time(NULL);
03410                 r_private=(*i).private_;
03411                 string disp=lang_get_string(1,(*i).lang,231)+eol;
03412                 int ec=0;
03413                 dcc_send_msg((*i).socket,disp,ec);
03414             }
03415             (*i).private_edit=0;
03416             return;
03417         }
03418     }
03419 }

Here is the call graph for this function:

void dcc_loop_replication vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process .replication commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 8466 of file dcc.cpp.

References dcc_get_line(), dcc_send_msg(), s_user::is_template, lang_get_string(), logic_partyline_add_user(), logic_partyline_get_user(), logic_partyline_get_user_template(), logic_partyline_remove_user(), ltoa(), s_user::name, r_channel_defs, r_procedures, r_user_templates, r_users, REPL_INVALID, REPL_PULL, REPL_PUSH, REPL_PUSHPULL, s_private::replication, and s_user::replication_partner.

Referenced by dcc_loop().

08467 {
08468     if((*i).replication==1) {
08469         (*i).b_repl_user=false;
08470         (*i).b_repl_user_template=false;
08471         (*i).b_repl_chandef=false;
08472         (*i).b_repl_proc=false;
08473         (*i).b_repl_private=false;
08474 
08475         string disp=lang_get_string(1,(*i).lang,421)+eol;
08476 
08477         {
08478             vector<s_user>::iterator i1;
08479             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
08480                 disp+=(string)"USER = "+(*i1).name+eol;
08481         }
08482         {
08483             vector<s_user>::iterator i1;
08484             for(i1=r_user_templates.begin(); i1!=r_user_templates.end(); i1++)
08485                 disp+=(string)"USER TEMPLATE = "+(*i1).name+eol;
08486         }
08487         {
08488             vector<s_procedure>::iterator i1;
08489             for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
08490                 disp+=(string)"PROCEDURE = "+(*i1).name+eol;
08491         }
08492         {
08493             vector<s_channel_def>::iterator i1;
08494             for(i1=r_channel_defs.begin(); i1!=r_channel_defs.end(); i1++)
08495                 disp+=(string)"CHANDEF = "+(*i1).channel_name+eol;
08496         }
08497         disp+=(string)"PRIVATE = private"+eol;
08498 
08499         disp+=lang_get_string(1,(*i).lang,422)+eol;
08500 
08501         int ec=0;
08502         dcc_send_msg((*i).socket,disp,ec);
08503         (*i).replication++;
08504         return;
08505     }
08506 
08507     if((*i).replication==2) {
08508         string p=dcc_get_line((*i).in_buff);
08509         if(!p.compare(""))
08510             return;
08511 
08512         if(!p.compare(".")) {
08513             (*i).replication=0;
08514             return;
08515         }
08516 
08517         bool got=false;
08518 
08519         {
08520             vector<s_user>::iterator i1;
08521             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
08522                 if(!(*i1).name.compare(p)) {
08523                     got=true;
08524                     (*i).b_repl_user=true;
08525                     (*i).repl_user=*i1;
08526                     (*i).replication=1000;
08527                     return;
08528                 }
08529         }
08530         {
08531             vector<s_user>::iterator i1;
08532             for(i1=r_user_templates.begin(); i1!=r_user_templates.end(); i1++)
08533                 if(!(*i1).name.compare(p)) {
08534                     got=true;
08535                     (*i).b_repl_user_template=true;
08536                     (*i).repl_user_template=*i1;
08537                     (*i).replication=1000;
08538                     return;
08539                 }
08540         }
08541         {
08542             vector<s_procedure>::iterator i1;
08543             for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
08544                 if(!(*i1).name.compare(p)) {
08545                     got=true;
08546                     (*i).b_repl_proc=true;
08547                     (*i).repl_proc=*i1;
08548                     (*i).replication=3000;
08549                     return;
08550                 }
08551         }
08552         {
08553             vector<s_channel_def>::iterator i1;
08554             for(i1=r_channel_defs.begin(); i1!=r_channel_defs.end(); i1++)
08555                 if(!(*i1).channel_name.compare(p)) {
08556                     got=true;
08557                     (*i).b_repl_chandef=true;
08558                     (*i).repl_chandef=*i1;
08559                     (*i).replication=4000;
08560                     return;
08561                 }
08562         }
08563 
08564         if(!p.compare("private")) {
08565             got=true;
08566             (*i).b_repl_private=true;
08567             (*i).repl_private.replication=r_private.replication;
08568             (*i).replication=5000;
08569             return;
08570         }
08571 
08572         string disp=lang_get_string(1,(*i).lang,423)+eol;
08573         int ec=0;
08574         dcc_send_msg((*i).socket,disp,ec);
08575         (*i).replication=1;
08576         return;
08577     }
08578 
08579     // user or user template
08580     if((*i).replication==1000) {
08581         string disp=lang_get_string(1,(*i).lang,424)+eol;
08582 
08583         int line=0;
08584 
08585         vector<s_replication>::iterator i1;
08586         for(i1=(*i).repl_user.replication.begin(); i1!=(*i).repl_user.replication.end(); i1++) {
08587             disp+=lang_get_string(1,(*i).lang,593);
08588             if(line<100)
08589                 disp+="0";
08590             if(line<10)
08591                 disp+="0";
08592             char tmp[64];
08593             disp+=ltoa(++line,tmp,10);
08594             disp+=": ";
08595             disp+=(*i1).partner;
08596             disp+=" = ";
08597             if((*i1).type==REPL_PUSH)
08598                 disp+="PUSH";
08599             if((*i1).type==REPL_PULL)
08600                 disp+="PULL";
08601             if((*i1).type==REPL_PUSHPULL)
08602                 disp+="PUSHPULL";
08603             disp+=eol;
08604         }
08605         if(line==0)
08606             disp+="(no replications)"+eol;
08607 
08608         disp+=lang_get_string(1,(*i).lang,425)+eol;
08609 
08610         int ec=0;
08611         dcc_send_msg((*i).socket,disp,ec);
08612 
08613         (*i).replication++;
08614         return;
08615     }
08616     if((*i).replication==1001) {
08617         string p=dcc_get_line((*i).in_buff);
08618         if(!p.compare(""))
08619             return;
08620 
08621         if(!p.compare(".")) {
08622             string disp=lang_get_string(1,(*i).lang,426)+eol;
08623             int ec=0;
08624             dcc_send_msg((*i).socket,disp,ec);
08625             (*i).replication++;
08626             return;
08627         }
08628 
08629         if(!p.compare(".add")) {
08630             string disp=lang_get_string(1,(*i).lang,428)+eol;
08631 
08632             vector<s_user>::iterator i1;
08633             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
08634                 disp+=(*i1).name+eol;
08635 
08636             disp+=lang_get_string(1,(*i).lang,429)+eol;
08637 
08638             int ec=0;
08639             dcc_send_msg((*i).socket,disp,ec);
08640             (*i).replication=10000;
08641             return;
08642         }
08643 
08644         string p1, p2;
08645         {
08646             int pos=0;
08647             for(unsigned int i1=0; i1<p.length(); i1++) {
08648                 if(p[i1]==0x20) {
08649                     pos=1;
08650                     continue;
08651                 }
08652                 if(pos==0)
08653                     p1+=p[i1];
08654                 if(pos==1)
08655                     p2+=p[i1];
08656             }
08657         }
08658         if(!p1.compare(".remove")) {
08659             int line=0;
08660 
08661             vector<s_replication>::iterator i1;
08662             for(i1=(*i).repl_user.replication.begin(); i1!=(*i).repl_user.replication.end(); i1++)
08663                 if(++line==atol(p2.c_str())) {
08664                     (*i).repl_user.replication.erase(i1);
08665                     break;
08666                 }
08667             (*i).replication=1000;
08668             return;
08669         }
08670 
08671         (*i).replication=1000;
08672     }
08673     if((*i).replication==1002) {
08674         string p=dcc_get_line((*i).in_buff);
08675         if(!p.compare(""))
08676             return;
08677 
08678         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08679             string disp=lang_get_string(1,(*i).lang,426)+eol;
08680             int ec=0;
08681             dcc_send_msg((*i).socket,disp,ec);
08682         } else {
08683             if(!p.compare("y") || !p.compare("Y")) {
08684                 s_user u;
08685                 vector<s_channel> chs;
08686                 if(!(*i).b_repl_user_template) {
08687                     logic_partyline_get_user((*i).repl_user.name,u,chs);
08688                 } else {
08689                     logic_partyline_get_user_template((*i).repl_user.name,u,chs);
08690                     u.is_template=true;
08691                 }
08692                 logic_partyline_remove_user((*i).repl_user.name);
08693                 logic_partyline_add_user((*i).repl_user,chs);
08694 
08695                 string disp=lang_get_string(1,(*i).lang,427)+eol;
08696                 int ec=0;
08697                 dcc_send_msg((*i).socket,disp,ec);
08698                 (*i).replication=1;
08699                 return;
08700             } else {
08701                 string disp=lang_get_string(1,(*i).lang,162)+eol;
08702                 int ec=0;
08703                 dcc_send_msg((*i).socket,disp,ec);
08704                 (*i).replication=1;
08705                 return;
08706             }
08707         }
08708     }
08709 
08710     // procedure
08711     if((*i).replication==3000) {
08712         string disp=lang_get_string(1,(*i).lang,424)+eol;
08713 
08714         int line=0;
08715 
08716         vector<s_replication>::iterator i1;
08717         for(i1=(*i).repl_proc.replication.begin(); i1!=(*i).repl_proc.replication.end(); i1++) {
08718             disp+=lang_get_string(1,(*i).lang,593);
08719             if(line<100)
08720                 disp+="0";
08721             if(line<10)
08722                 disp+="0";
08723             char tmp[64];
08724             disp+=ltoa(++line,tmp,10);
08725             disp+=": ";
08726             disp+=(*i1).partner;
08727             disp+=" = ";
08728             if((*i1).type==REPL_PUSH)
08729                 disp+="PUSH";
08730             if((*i1).type==REPL_PULL)
08731                 disp+="PULL";
08732             if((*i1).type==REPL_PUSHPULL)
08733                 disp+="PUSHPULL";
08734             disp+=eol;
08735         }
08736         if(line==0)
08737             disp+="(no replications)"+eol;
08738 
08739         disp+=lang_get_string(1,(*i).lang,425)+eol;
08740 
08741         int ec=0;
08742         dcc_send_msg((*i).socket,disp,ec);
08743 
08744         (*i).replication++;
08745         return;
08746     }
08747     if((*i).replication==3001) {
08748         string p=dcc_get_line((*i).in_buff);
08749         if(!p.compare(""))
08750             return;
08751 
08752         if(!p.compare(".")) {
08753             string disp=lang_get_string(1,(*i).lang,426)+eol;
08754             int ec=0;
08755             dcc_send_msg((*i).socket,disp,ec);
08756             (*i).replication++;
08757             return;
08758         }
08759 
08760         if(!p.compare(".add")) {
08761             string disp=lang_get_string(1,(*i).lang,428)+eol;
08762 
08763             vector<s_user>::iterator i1;
08764             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
08765                 disp+=(*i1).name+eol;
08766 
08767             disp+=lang_get_string(1,(*i).lang,429)+eol;
08768 
08769             int ec=0;
08770             dcc_send_msg((*i).socket,disp,ec);
08771             (*i).replication=10000;
08772             return;
08773         }
08774 
08775         string p1, p2;
08776         {
08777             int pos=0;
08778             for(unsigned int i1=0; i1<p.length(); i1++) {
08779                 if(p[i1]==0x20) {
08780                     pos=1;
08781                     continue;
08782                 }
08783                 if(pos==0)
08784                     p1+=p[i1];
08785                 if(pos==1)
08786                     p2+=p[i1];
08787             }
08788         }
08789         if(!p1.compare(".remove")) {
08790             int line=0;
08791 
08792             vector<s_replication>::iterator i1;
08793             for(i1=(*i).repl_proc.replication.begin(); i1!=(*i).repl_proc.replication.end(); i1++)
08794                 if(++line==atol(p2.c_str())) {
08795                     (*i).repl_proc.replication.erase(i1);
08796                     break;
08797                 }
08798             (*i).replication=3000;
08799             return;
08800         }
08801 
08802         (*i).replication=3000;
08803     }
08804     if((*i).replication==3002) {
08805         string p=dcc_get_line((*i).in_buff);
08806         if(!p.compare(""))
08807             return;
08808 
08809         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08810             string disp=lang_get_string(1,(*i).lang,426)+eol;
08811             int ec=0;
08812             dcc_send_msg((*i).socket,disp,ec);
08813         } else {
08814             if(!p.compare("y") || !p.compare("Y")) {
08815                 vector<s_procedure>::iterator i1;
08816                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++) {
08817                     if(!(*i1).name.compare((*i).repl_proc.name)) {
08818                         (*i1).replication.clear();
08819                         vector<s_replication>::iterator i2;
08820                         for(i2=(*i).repl_proc.replication.begin(); i2!=(*i).repl_proc.replication.end(); i2++)
08821                             (*i1).replication.push_back(*i2);
08822                         break;
08823                     }
08824                 }
08825 
08826                 string disp=lang_get_string(1,(*i).lang,427)+eol;
08827                 int ec=0;
08828                 dcc_send_msg((*i).socket,disp,ec);
08829                 (*i).replication=1;
08830                 return;
08831             } else {
08832                 string disp=lang_get_string(1,(*i).lang,162)+eol;
08833                 int ec=0;
08834                 dcc_send_msg((*i).socket,disp,ec);
08835                 (*i).replication=1;
08836                 return;
08837             }
08838         }
08839     }
08840 
08841     // chandef
08842     if((*i).replication==4000) {
08843         string disp=lang_get_string(1,(*i).lang,424)+eol;
08844 
08845         int line=0;
08846 
08847         vector<s_replication>::iterator i1;
08848         for(i1=(*i).repl_chandef.replication.begin(); i1!=(*i).repl_chandef.replication.end(); i1++) {
08849             disp+=lang_get_string(1,(*i).lang,593);
08850             if(line<100)
08851                 disp+="0";
08852             if(line<10)
08853                 disp+="0";
08854             char tmp[64];
08855             disp+=ltoa(++line,tmp,10);
08856             disp+=": ";
08857             disp+=(*i1).partner;
08858             disp+=" = ";
08859             if((*i1).type==REPL_PUSH)
08860                 disp+="PUSH";
08861             if((*i1).type==REPL_PULL)
08862                 disp+="PULL";
08863             if((*i1).type==REPL_PUSHPULL)
08864                 disp+="PUSHPULL";
08865             disp+=eol;
08866         }
08867         if(line==0)
08868             disp+="(no replications)"+eol;
08869 
08870         disp+=lang_get_string(1,(*i).lang,425)+eol;
08871 
08872         int ec=0;
08873         dcc_send_msg((*i).socket,disp,ec);
08874 
08875         (*i).replication++;
08876         return;
08877     }
08878     if((*i).replication==4001) {
08879         string p=dcc_get_line((*i).in_buff);
08880         if(!p.compare(""))
08881             return;
08882 
08883         if(!p.compare(".")) {
08884             string disp=lang_get_string(1,(*i).lang,426)+eol;
08885             int ec=0;
08886             dcc_send_msg((*i).socket,disp,ec);
08887             (*i).replication++;
08888             return;
08889         }
08890 
08891         if(!p.compare(".add")) {
08892             string disp=lang_get_string(1,(*i).lang,428)+eol;
08893 
08894             vector<s_user>::iterator i1;
08895             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
08896                 disp+=(*i1).name+eol;
08897 
08898             disp+=lang_get_string(1,(*i).lang,429)+eol;
08899 
08900             int ec=0;
08901             dcc_send_msg((*i).socket,disp,ec);
08902             (*i).replication=10000;
08903             return;
08904         }
08905 
08906         string p1, p2;
08907         {
08908             int pos=0;
08909             for(unsigned int i1=0; i1<p.length(); i1++) {
08910                 if(p[i1]==0x20) {
08911                     pos=1;
08912                     continue;
08913                 }
08914                 if(pos==0)
08915                     p1+=p[i1];
08916                 if(pos==1)
08917                     p2+=p[i1];
08918             }
08919         }
08920         if(!p1.compare(".remove")) {
08921             int line=0;
08922 
08923             vector<s_replication>::iterator i1;
08924             for(i1=(*i).repl_chandef.replication.begin(); i1!=(*i).repl_chandef.replication.end(); i1++)
08925                 if(++line==atol(p2.c_str())) {
08926                     (*i).repl_chandef.replication.erase(i1);
08927                     break;
08928                 }
08929             (*i).replication=4000;
08930             return;
08931         }
08932 
08933         (*i).replication=4000;
08934     }
08935     if((*i).replication==4002) {
08936         string p=dcc_get_line((*i).in_buff);
08937         if(!p.compare(""))
08938             return;
08939 
08940         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
08941             string disp=lang_get_string(1,(*i).lang,426)+eol;
08942             int ec=0;
08943             dcc_send_msg((*i).socket,disp,ec);
08944         } else {
08945             if(!p.compare("y") || !p.compare("Y")) {
08946                 vector<s_channel_def>::iterator i1;
08947                 for(i1=r_channel_defs.begin(); i1!=r_channel_defs.end(); i1++) {
08948                     if(!(*i1).channel_name.compare((*i).repl_chandef.channel_name)) {
08949                         (*i1).replication.clear();
08950                         vector<s_replication>::iterator i2;
08951                         for(i2=(*i).repl_chandef.replication.begin(); i2!=(*i).repl_chandef.replication.end(); i2++)
08952                             (*i1).replication.push_back(*i2);
08953                         break;
08954                     }
08955                 }
08956 
08957                 string disp=lang_get_string(1,(*i).lang,427)+eol;
08958                 int ec=0;
08959                 dcc_send_msg((*i).socket,disp,ec);
08960                 (*i).replication=1;
08961                 return;
08962             } else {
08963                 string disp=lang_get_string(1,(*i).lang,162)+eol;
08964                 int ec=0;
08965                 dcc_send_msg((*i).socket,disp,ec);
08966                 (*i).replication=1;
08967                 return;
08968             }
08969         }
08970     }
08971 
08972     // private
08973     if((*i).replication==5000) {
08974         string disp=lang_get_string(1,(*i).lang,424)+eol;
08975 
08976         int line=0;
08977 
08978         vector<s_replication>::iterator i1;
08979         for(i1=(*i).repl_private.replication.begin(); i1!=(*i).repl_private.replication.end(); i1++) {
08980             disp+=lang_get_string(1,(*i).lang,593);
08981             if(line<100)
08982                 disp+="0";
08983             if(line<10)
08984                 disp+="0";
08985             char tmp[64];
08986             disp+=ltoa(++line,tmp,10);
08987             disp+=": ";
08988             disp+=(*i1).partner;
08989             disp+=" = ";
08990             if((*i1).type==REPL_PUSH)
08991                 disp+="PUSH";
08992             if((*i1).type==REPL_PULL)
08993                 disp+="PULL";
08994             if((*i1).type==REPL_PUSHPULL)
08995                 disp+="PUSHPULL";
08996             disp+=eol;
08997         }
08998         if(line==0)
08999             disp+="(no replications)"+eol;
09000 
09001         disp+=lang_get_string(1,(*i).lang,425)+eol;
09002 
09003         int ec=0;
09004         dcc_send_msg((*i).socket,disp,ec);
09005 
09006         (*i).replication++;
09007         return;
09008     }
09009     if((*i).replication==5001) {
09010         string p=dcc_get_line((*i).in_buff);
09011         if(!p.compare(""))
09012             return;
09013 
09014         if(!p.compare(".")) {
09015             string disp=lang_get_string(1,(*i).lang,426)+eol;
09016             int ec=0;
09017             dcc_send_msg((*i).socket,disp,ec);
09018             (*i).replication++;
09019             return;
09020         }
09021 
09022         if(!p.compare(".add")) {
09023             string disp=lang_get_string(1,(*i).lang,428)+eol;
09024 
09025             vector<s_user>::iterator i1;
09026             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
09027                 disp+=(*i1).name+eol;
09028 
09029             disp+=lang_get_string(1,(*i).lang,429)+eol;
09030 
09031             int ec=0;
09032             dcc_send_msg((*i).socket,disp,ec);
09033             (*i).replication=10000;
09034             return;
09035         }
09036 
09037         string p1, p2;
09038         {
09039             int pos=0;
09040             for(unsigned int i1=0; i1<p.length(); i1++) {
09041                 if(p[i1]==0x20) {
09042                     pos=1;
09043                     continue;
09044                 }
09045                 if(pos==0)
09046                     p1+=p[i1];
09047                 if(pos==1)
09048                     p2+=p[i1];
09049             }
09050         }
09051         if(!p1.compare(".remove")) {
09052             int line=0;
09053 
09054             vector<s_replication>::iterator i1;
09055             for(i1=(*i).repl_private.replication.begin(); i1!=(*i).repl_private.replication.end(); i1++)
09056                 if(++line==atol(p2.c_str())) {
09057                     (*i).repl_private.replication.erase(i1);
09058                     break;
09059                 }
09060             (*i).replication=5000;
09061             return;
09062         }
09063 
09064         (*i).replication=5000;
09065     }
09066     if((*i).replication==5002) {
09067         string p=dcc_get_line((*i).in_buff);
09068         if(!p.compare(""))
09069             return;
09070 
09071         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
09072             string disp=lang_get_string(1,(*i).lang,426)+eol;
09073             int ec=0;
09074             dcc_send_msg((*i).socket,disp,ec);
09075         } else {
09076             if(!p.compare("y") || !p.compare("Y")) {
09077                 r_private.replication.clear();
09078                 vector<s_replication>::iterator i2;
09079                 for(i2=(*i).repl_private.replication.begin(); i2!=(*i).repl_private.replication.end(); i2++)
09080                     r_private.replication.push_back(*i2);
09081 
09082                 string disp=lang_get_string(1,(*i).lang,427)+eol;
09083                 int ec=0;
09084                 dcc_send_msg((*i).socket,disp,ec);
09085                 (*i).replication=1;
09086                 return;
09087             } else {
09088                 string disp=lang_get_string(1,(*i).lang,162)+eol;
09089                 int ec=0;
09090                 dcc_send_msg((*i).socket,disp,ec);
09091                 (*i).replication=1;
09092                 return;
09093             }
09094         }
09095     }
09096 
09097     // .add (universal)
09098     if((*i).replication==10000) {
09099         string p=dcc_get_line((*i).in_buff);
09100         if(!p.compare(""))
09101             return;
09102 
09103         bool got=false;
09104         vector<s_user>::iterator i1;
09105         for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
09106             if(!(*i1).name.compare(p)) {
09107                 got=true;
09108                 break;
09109             }
09110         }
09111 
09112         if(!got) {
09113             string disp=lang_get_string(1,(*i).lang,428)+eol;
09114 
09115             vector<s_user>::iterator i1;
09116             for(i1=r_users.begin(); i1!=r_users.end(); i1++)
09117                 disp+=(*i1).name+eol;
09118 
09119             disp+=lang_get_string(1,(*i).lang,429)+eol;
09120 
09121             int ec=0;
09122             dcc_send_msg((*i).socket,disp,ec);
09123             (*i).replication=(*i).replication;
09124             return;
09125         }
09126 
09127         (*i).repl_add.partner=p;
09128         (*i).repl_add.type=REPL_INVALID;
09129 
09130         string disp=lang_get_string(1,(*i).lang,430)+eol;
09131         int ec=0;
09132         dcc_send_msg((*i).socket,disp,ec);
09133         (*i).replication++;
09134         return;
09135     }
09136     if((*i).replication==10001) {
09137         string p=dcc_get_line((*i).in_buff);
09138         if(!p.compare(""))
09139             return;
09140 
09141         if(!p.compare("PUSH"))
09142             (*i).repl_add.type=REPL_PUSH;
09143         if(!p.compare("PULL"))
09144             (*i).repl_add.type=REPL_PULL;
09145         if(!p.compare("PUSHPULL"))
09146             (*i).repl_add.type=REPL_PUSHPULL;
09147 
09148         if(!p.compare(".")) {
09149             (*i).replication+=2;
09150             return;
09151         }
09152 
09153         (*i).repl_add.type==REPL_INVALID?(*i).replication--:(*i).replication++;
09154 
09155         if((*i).repl_add.type==REPL_INVALID) {
09156             string disp=lang_get_string(1,(*i).lang,430)+eol;
09157             int ec=0;
09158             dcc_send_msg((*i).socket,disp,ec);
09159             return;
09160         }
09161 
09162         return;
09163     }
09164     if((*i).replication==10002) {
09165         s_user u;
09166         vector<s_channel> chs;
09167         logic_partyline_get_user((*i).repl_add.partner,u,chs);
09168         if(!u.replication_partner) {
09169             u.replication_partner=true;
09170             logic_partyline_remove_user(u.name);
09171             logic_partyline_add_user(u,chs);
09172 
09173             string disp=lang_get_string(1,(*i).lang,431)+eol;
09174             int ec=0;
09175             dcc_send_msg((*i).socket,disp,ec);
09176         } else {
09177             string disp=lang_get_string(1,(*i).lang,432)+eol;
09178             int ec=0;
09179             dcc_send_msg((*i).socket,disp,ec);
09180         }
09181         (*i).replication++;
09182         return;
09183     }
09184     if((*i).replication==10003) {
09185         if((*i).b_repl_user) {
09186             (*i).repl_user.replication.push_back((*i).repl_add);
09187             (*i).replication=1000;
09188         }
09189         if((*i).b_repl_proc) {
09190             (*i).repl_proc.replication.push_back((*i).repl_add);
09191             (*i).replication=3000;
09192         }
09193         if((*i).b_repl_chandef) {
09194             (*i).repl_chandef.replication.push_back((*i).repl_add);
09195             (*i).replication=4000;
09196         }
09197         if((*i).b_repl_private) {
09198             (*i).repl_private.replication.push_back((*i).repl_add);
09199             (*i).replication=5000;
09200         }
09201         return;
09202     }
09203 }

Here is the call graph for this function:

void dcc_loop_terminator vector< s_dcc_client >::iterator  i,
string &  eol
 

Should be called in a loop to process .terminator commands in DCC CHAT/telnet connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
i Descriptor of remote connection
eol End-of-line string

Definition at line 9213 of file dcc.cpp.

References dcc_get_line(), dcc_send_msg(), lang_get_string(), s_user::last_changed, logic_partyline_add_user(), logic_partyline_get_user(), logic_partyline_remove_user(), and s_user::terminator.

Referenced by dcc_loop().

09214 {
09215     if((*i).terminator==1) {
09216         string disp=lang_get_string(1,(*i).lang,456)+eol;
09217 
09218         vector<string>::iterator i1;
09219         for(i1=(*i).access_to_users.begin(); i1!=(*i).access_to_users.end(); i1++) {
09220             if(!(*i1).compare("*"))
09221                 continue;
09222 
09223             s_user u;
09224             vector<s_channel> chs;
09225             logic_partyline_get_user(*i1,u,chs);
09226 
09227             if(u.terminator)
09228                 disp+=lang_get_string(1,(*i).lang,458);
09229             else
09230                 disp+=lang_get_string(1,(*i).lang,457);
09231 
09232             disp+=*i1+eol;
09233         }
09234 
09235         disp+=lang_get_string(1,(*i).lang,459)+eol;
09236         int ec=0;
09237         dcc_send_msg((*i).socket,disp,ec);
09238 
09239         (*i).terminator++;
09240         return;
09241     }
09242 
09243     if((*i).terminator==2) {
09244         string p=dcc_get_line((*i).in_buff);
09245         if(!p.compare(""))
09246             return;
09247 
09248         if(!p.compare(".")) {
09249             string disp=lang_get_string(1,(*i).lang,460)+eol;
09250             int ec=0;
09251             dcc_send_msg((*i).socket,disp,ec);
09252 
09253             (*i).terminator=0;
09254             return;
09255         }
09256 
09257         bool got=false;
09258         vector<string>::iterator i1;
09259         for(i1=(*i).access_to_users.begin(); i1!=(*i).access_to_users.end(); i1++) {
09260             if(!(*i1).compare(p)) {
09261                 got=true;
09262                 break;
09263             }
09264         }
09265 
09266         if(!got) {
09267             string disp=lang_get_string(1,(*i).lang,461)+eol;
09268             int ec=0;
09269             dcc_send_msg((*i).socket,disp,ec);
09270             (*i).terminator=1;
09271             return;
09272         }
09273 
09274         (*i).terminator_user=p;
09275         (*i).terminator++;
09276         return;
09277     }
09278 
09279     if((*i).terminator==3) {
09280         string disp=lang_get_string(1,(*i).lang,462)+eol;
09281         int ec=0;
09282         dcc_send_msg((*i).socket,disp,ec);
09283         (*i).terminator++;
09284         return;
09285     }
09286 
09287     if((*i).terminator==4) {
09288         string p=dcc_get_line((*i).in_buff);
09289         if(!p.compare(""))
09290             return;
09291 
09292         if(p.compare("y") && p.compare("n") && p.compare("Y") && p.compare("N")) {
09293             string disp=lang_get_string(1,(*i).lang,462)+eol;
09294             int ec=0;
09295             dcc_send_msg((*i).socket,disp,ec);
09296             return;
09297         } else {
09298             s_user u;
09299             vector<s_channel> chs;
09300             logic_partyline_get_user((*i).terminator_user,u,chs);
09301             logic_partyline_remove_user((*i).terminator_user);
09302             u.last_changed=time(NULL);
09303 
09304             if(!p.compare("y") || !p.compare("Y")) {
09305                 u.terminator=true;
09306             } else {
09307                 u.terminator=false;
09308             }
09309             logic_partyline_add_user(u,chs); // this func automatically clears/sets for channels terminator flag according to user.terminator flag, cool, isn't it? :)
09310 
09311             (*i).terminator=1;
09312             return;
09313         }
09314     }
09315 }

Here is the call graph for this function:

void dcc_make_server int  ipv,
int  group,
const char *  bind_ip,
unsigned short  bind_port,
string  server_type
 

Binds DCC server.

Author:
VooDooMan
Version:
2
Date:
2004
Parameters:
ipv Version of IP protocol: 4, or 6
group DCC group
bind_ip IPv4/IPv6 bind address
bind_port Port to listen on
server_type Type of server (e.g. "chat", "send", or an empty string)

Definition at line 18595 of file dcc.cpp.

References s_dcc_server::bind_ip, s_socket::cmp(), s_dcc_server::dcc_addr, s_dcc_server::dcc_addr6, dcc_servers, s_dcc_server::group, inet_pton(), log_socket(), s_dcc_server::port, s_dcc_server::server_type, sock_bind(), sock_bind6(), sock_error(), s_dcc_server::socket, and s_dcc_server::using_ipv6.

Referenced by logic_exec().

18596 {
18597     if(ipv==4) {
18598         if(strlen(bind_ip)>32)
18599             return;
18600 
18601         unsigned long ip;
18602         unsigned char* i=(unsigned char*)&ip;
18603         i++;
18604         i++;
18605         i++;
18606         char tmp[64];
18607         unsigned int i1;
18608         int i2=0;
18609         for(i1=0; i1<strlen(bind_ip); i1++) {
18610             if(bind_ip[i1]=='.')
18611                 break;
18612             tmp[i2++]=bind_ip[i1];
18613         }
18614         i1++;
18615         tmp[i2]=0;
18616         *i=(unsigned char)atol(tmp);
18617         i--;
18618 
18619         i2=0;
18620         for(; i1<strlen(bind_ip); i1++) {
18621             if(bind_ip[i1]=='.')
18622                 break;
18623             tmp[i2++]=bind_ip[i1];
18624         }
18625         i1++;
18626         tmp[i2]=0;
18627         *i=(unsigned char)atol(tmp);
18628         i--;
18629 
18630         i2=0;
18631         for(; i1<strlen(bind_ip); i1++) {
18632             if(bind_ip[i1]=='.')
18633                 break;
18634             tmp[i2++]=bind_ip[i1];
18635         }
18636         i1++;
18637         tmp[i2]=0;
18638         *i=(unsigned char)atol(tmp);
18639         i--;
18640     
18641         i2=0;
18642         for(; i1<strlen(bind_ip); i1++) {
18643             if(bind_ip[i1]=='.')
18644                 break;
18645             tmp[i2++]=bind_ip[i1];
18646         }
18647         i1++;
18648         tmp[i2]=0;
18649         *i=(unsigned char)atol(tmp);
18650 
18651         int ec=0;
18652 
18653 #ifdef _WIN32
18654         in_addr l;
18655         l.S_un.S_addr=ip;
18656 #else
18657         in_addr l;
18658         l.s_addr=ip;
18659 #endif
18660 
18661 #if !defined(HIGHFIRST)
18662 #   ifdef _WIN32
18663         char ch;
18664         ch=l.S_un.S_un_b.s_b1;
18665         l.S_un.S_un_b.s_b1=l.S_un.S_un_b.s_b4;
18666         l.S_un.S_un_b.s_b4=ch;
18667         ch=l.S_un.S_un_b.s_b2;
18668         l.S_un.S_un_b.s_b2=l.S_un.S_un_b.s_b3;
18669         l.S_un.S_un_b.s_b3=ch;
18670 #   else
18671         char ch;
18672         ch=((char*)&l.s_addr)[0];
18673         ((char*)&l.s_addr)[0]=((char*)&l.s_addr)[3];
18674         ((char*)&l.s_addr)[3]=ch;
18675         ch=((char*)&l.s_addr)[1];
18676         ((char*)&l.s_addr)[1]=((char*)&l.s_addr)[2];
18677         ((char*)&l.s_addr)[2]=ch;
18678 #   endif
18679 #endif
18680 
18681         s_socket dcc_server=sock_bind(l,bind_port,ec);
18682 
18683         if(dcc_server.cmp()==false) {
18684             log_socket(ec,sock_error(ec),"while calling sock_bind in file " __FILE__ " in function " __FUNC__);
18685             return;
18686         }
18687     
18688         s_dcc_server s;
18689         s.group=group;
18690         s.using_ipv6=false;
18691 #ifdef _WIN32
18692         s.dcc_addr=l.S_un.S_addr;
18693 #else
18694         s.dcc_addr=l.s_addr;
18695 #endif
18696         s.port=bind_port;
18697         s.bind_ip=bind_ip;
18698         s.socket=dcc_server;
18699         if(server_type.find("\"",0)!=string::npos)
18700             server_type.erase(0,1);
18701         if(server_type.find("\"",0)!=string::npos)
18702             server_type.erase(server_type.find("\"",0),1);
18703         s.server_type=server_type;
18704     
18705         dcc_servers.push_back(s);
18706     }
18707     if(ipv==6) {
18708         int ec=0;
18709         s_socket dcc_server=sock_bind6((char*)bind_ip,bind_port,ec);
18710     
18711         if(dcc_server.cmp()==false) {
18712             log_socket(ec,sock_error(ec),"while calling sock_bind6 in file " __FILE__ " in function " __FUNC__);
18713             return;
18714         }
18715     
18716         s_dcc_server s;
18717         s.group=group;
18718         s.using_ipv6=true;
18719         s.dcc_addr=-1;
18720         inet_pton(AF_INET6,(char*)bind_ip,&s.dcc_addr6);
18721         s.port=bind_port;
18722         s.bind_ip=bind_ip;
18723         s.socket=dcc_server;
18724         if(server_type.find("\"",0)!=string::npos)
18725             server_type.erase(0,1);
18726         if(server_type.find("\"",0)!=string::npos)
18727             server_type.erase(server_type.find("\"",0),1);
18728         s.server_type=server_type;
18729     
18730         dcc_servers.push_back(s);
18731     }
18732 }

Here is the call graph for this function:

void dcc_make_telnet_server int  ipv,
const char *  bind_ip,
unsigned short  bind_port
 

Binds telnet server.

Author:
VooDooMan
Version:
2
Date:
2004
Parameters:
ipv Version of IP protocol: 4, or 6
bind_ip IPv4 bind address, or IPv6 address
bind_port Port to listen on

Definition at line 18743 of file dcc.cpp.

References s_telnet_server::bind_ip, s_socket::cmp(), log_socket(), s_telnet_server::port, sock_bind(), sock_bind6(), sock_error(), s_telnet_server::socket, s_telnet_server::telnet_addr, and telnet_servers.

Referenced by logic_exec().

18744 {
18745     if(ipv==4) {
18746         if(strlen(bind_ip)>32)
18747             return;
18748 
18749         unsigned long ip;
18750         unsigned char* i=(unsigned char*)&ip;
18751         i++;
18752         i++;
18753         i++;
18754         char tmp[64];
18755         unsigned int i1;
18756         int i2=0;
18757         for(i1=0; i1<strlen(bind_ip); i1++) {
18758             if(bind_ip[i1]=='.')
18759                 break;
18760             tmp[i2++]=bind_ip[i1];
18761         }
18762         i1++;
18763         tmp[i2]=0;
18764         *i=(unsigned char)atol(tmp);
18765         i--;
18766     
18767         i2=0;
18768         for(; i1<strlen(bind_ip); i1++) {
18769             if(bind_ip[i1]=='.')
18770                 break;
18771             tmp[i2++]=bind_ip[i1];
18772         }
18773         i1++;
18774         tmp[i2]=0;
18775         *i=(unsigned char)atol(tmp);
18776         i--;
18777     
18778         i2=0;
18779         for(; i1<strlen(bind_ip); i1++) {
18780             if(bind_ip[i1]=='.')
18781                 break;
18782             tmp[i2++]=bind_ip[i1];
18783         }
18784         i1++;
18785         tmp[i2]=0;
18786         *i=(unsigned char)atol(tmp);
18787         i--;
18788 
18789         i2=0;
18790         for(; i1<strlen(bind_ip); i1++) {
18791             if(bind_ip[i1]=='.')
18792                 break;
18793             tmp[i2++]=bind_ip[i1];
18794         }
18795         i1++;
18796         tmp[i2]=0;
18797         *i=(unsigned char)atol(tmp);
18798     
18799         int ec=0;
18800     
18801 #ifdef _WIN32
18802         in_addr l;
18803         l.S_un.S_addr=ip;
18804         char ch;
18805         ch=l.S_un.S_un_b.s_b1;
18806         l.S_un.S_un_b.s_b1=l.S_un.S_un_b.s_b4;
18807         l.S_un.S_un_b.s_b4=ch;
18808         ch=l.S_un.S_un_b.s_b2;
18809         l.S_un.S_un_b.s_b2=l.S_un.S_un_b.s_b3;
18810         l.S_un.S_un_b.s_b3=ch;
18811 #else
18812         in_addr l;
18813         l.s_addr=ip;
18814         char ch;
18815         ch=((char*)&l.s_addr)[0];
18816         ((char*)&l.s_addr)[0]=((char*)&l.s_addr)[3];
18817         ((char*)&l.s_addr)[3]=ch;
18818         ch=((char*)&l.s_addr)[1];
18819         ((char*)&l.s_addr)[1]=((char*)&l.s_addr)[2];
18820         ((char*)&l.s_addr)[2]=ch;
18821 #endif
18822         s_socket telnet_server=sock_bind(l,bind_port,ec);
18823 
18824         if(telnet_server.cmp()==false) {
18825             log_socket(ec,sock_error(ec),"while calling sock_bind in file " __FILE__ " in function " __FUNC__);
18826             return;
18827         }
18828     
18829         s_telnet_server s;
18830 #ifdef _WIN32
18831         s.telnet_addr=l.S_un.S_addr;
18832 #else
18833         s.telnet_addr=l.s_addr;
18834 #endif
18835         s.port=bind_port;
18836         s.bind_ip=bind_ip;
18837         s.socket=telnet_server;
18838 
18839         telnet_servers.push_back(s);
18840     }
18841     if(ipv==6) {
18842         int ec=0;
18843         s_socket telnet_server=sock_bind6((char*)bind_ip,bind_port,ec);
18844     
18845         if(telnet_server.cmp()==false) {
18846             log_socket(ec,sock_error(ec),"while calling sock_bind6 in file " __FILE__ " in function " __FUNC__);
18847             return;
18848         }
18849     
18850         s_telnet_server s;
18851         s.telnet_addr=-1;
18852         s.port=bind_port;
18853         s.bind_ip=bind_ip;
18854         s.socket=telnet_server;
18855     
18856         telnet_servers.push_back(s);
18857     }
18858 }

Here is the call graph for this function:

void dcc_notify string  user,
int  reason,
string  incomplete_file
 

Notifies user about filesystem events.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
user Name of the user from "logic.txt" file
reason One of the following values: FILESYS_NOT_PUBLISHED - user has uploaded file(s) and they don't have set flags for publishing; FILESYS_GOT_FILE - user has notification about new file to filesystem; FILESYS_GOT_INCOMPLETE - user should be notified for incomplete uploaded file
incomplete_file If reason==FILESYS_GOT_INCOMPLETE there is public name of incomplete received file to filesystem via DCC SEND (undefined in other cases)

Definition at line 18939 of file dcc.cpp.

References dcc_check_for_filesystem(), dcc_clients, dcc_send_msg(), dcc_servers, FILESYS_GOT_FILE, FILESYS_GOT_INCOMPLETE, FILESYS_NOT_PUBLISHED, irc_await_dcc_chat(), irc_get_nick(), irc_put(), lang_get_string(), LOW_PRIORITY, and ltoa().

Referenced by filesys_add_file_raw().

18940 {
18941     char dcc_eol[4]="\n\0";
18942     char telnet_eol[4]="\r\n\0";
18943 
18944     bool got=false;
18945 
18946     vector<s_dcc_client>::iterator i;
18947     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
18948         if((*i).got_passwd!=3)
18949             continue;
18950         if(!(*i).chat)
18951             continue;
18952         if((*i).as_in_logic.compare(user))
18953             continue;
18954         string eol=(*i).telnet?telnet_eol:dcc_eol;
18955 
18956         got=true;
18957 
18958         string disp;
18959         switch(reason) {
18960             case FILESYS_NOT_PUBLISHED:
18961                 disp=lang_get_string(1,(*i).lang,274)+eol;
18962                 break;
18963             case FILESYS_GOT_FILE:
18964                 dcc_check_for_filesystem((*i).as_in_logic);
18965                 break;
18966             case FILESYS_GOT_INCOMPLETE:
18967                 disp=lang_get_string(1,(*i).lang,400)+eol;
18968                 disp+=incomplete_file;
18969                 disp+=eol;
18970                 break;
18971         }
18972 
18973         if(!disp.empty()) {
18974             int ec=0;
18975             dcc_send_msg((*i).socket,disp,ec);
18976         }
18977     }
18978 
18979     if(!got && reason==FILESYS_NOT_PUBLISHED) {
18980         string nick=irc_get_nick(user);
18981         if(nick.empty())
18982             return;
18983 
18984         string inv="PRIVMSG ";
18985         inv+=nick;
18986         inv+=" :";
18987 
18988         int dcc_group=0; // TODO: !!!
18989 
18990         unsigned long dcc_addr=0;
18991         unsigned short dcc_port=0;
18992         vector<s_dcc_server>::iterator i1;
18993         for(i1=dcc_servers.begin(); i1!=dcc_servers.end(); i1++) {
18994             if((*i1).group==dcc_group) {
18995                 dcc_addr=(*i1).dcc_addr;
18996                 dcc_port=(*i1).port;
18997                 break;
18998             }
18999         }
19000 
19001         if(dcc_addr && dcc_port) {
19002             irc_await_dcc_chat(nick,user,dcc_group);
19003 
19004             unsigned int ip_=0;
19005             {
19006                 char tmp[4];
19007                 memcpy(tmp,&dcc_addr,4);
19008 
19009 #if !defined(HIGHFIRST)
19010                 // switch bytes: BIG endian (network byte order)
19011                 char x;
19012 
19013                 x=tmp[0];
19014                 tmp[0]=tmp[3];
19015                 tmp[3]=x;
19016                 //
19017                 x=tmp[1];
19018                 tmp[1]=tmp[2];
19019                 tmp[2]=x;
19020 #endif
19021 
19022                 memcpy(&ip_,tmp,4);
19023             }
19024 
19025             string res="DCC CHAT chat ";
19026             char tmp[64];
19027             sprintf(tmp,"%u",ip_);
19028             res+=tmp;
19029             res+=" ";
19030             ltoa(dcc_port,tmp,10);
19031             res+=tmp;
19032 
19033             inv+="\x01";
19034             inv+=res;
19035             inv+="\x01";
19036 
19037             irc_put(inv,LOW_PRIORITY);
19038         }
19039     }
19040     if(!got && reason==FILESYS_GOT_INCOMPLETE) {
19041         string nick=irc_get_nick(user);
19042         if(nick.empty())
19043             return;
19044 
19045         string lang="en"; // TODO: !!!
19046 
19047         string msg="PRIVMSG ";
19048         msg+=nick;
19049         msg+=" :";
19050         msg+=lang_get_string(1,lang,400);
19051         irc_put(msg,LOW_PRIORITY);
19052 
19053         msg="PRIVMSG ";
19054         msg+=nick;
19055         msg+=" :";
19056         msg+=incomplete_file;
19057         irc_put(msg,LOW_PRIORITY);
19058     }
19059 }

Here is the call graph for this function:

void dcc_partyline_message string  channel,
string  message
 

Message for partyline channel distribution.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
channel Partyline channel
message Partyline message

Definition at line 18501 of file dcc.cpp.

References dcc_clients, sock_send(), and stats_dcc_chat_bytes_sent().

Referenced by botnet_on_unlink(), and botnet_partyline_event().

18502 {
18503     vector<s_dcc_client>::iterator i;
18504     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
18505         if(!(*i).replication_partner && ((*i).chat || (*i).telnet) && (*i).got_passwd==3 && !(*i).partyline_channel.compare(channel)) {
18506             string m=message;
18507             if((*i).telnet)
18508                 m+="\r\n";
18509             else
18510                 m+="\n";
18511             int ec=0;
18512             size_t sent=sock_send((*i).socket,m.c_str(),m.length(),ec);
18513             stats_dcc_chat_bytes_sent(sent);
18514         }
18515     }
18516 }

Here is the call graph for this function:

string dcc_put_multiple_lines string  msg,
string  eol
 

Parses message, replaces new line signs.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
msg Message to parse
eol End-of-line sequence
Returns:
Returns parsed message

Definition at line 19070 of file dcc.cpp.

Referenced by dcc_check_for_filesystem().

19071 {
19072     string result;
19073 
19074     string m;
19075     for(unsigned int i1=0; i1<msg.length(); i1++) {
19076         if(msg[i1]=='\\') {
19077             if(!(i1+1<msg.length() && msg[i1+1]=='n'))
19078                 m+=msg[i1];
19079         } else
19080             m+=msg[i1];
19081         if(i1==msg.length()-1 || (i1+1<msg.length() && msg[i1]=='\\' && msg[i1+1]=='n')) {
19082             if((i1+1<msg.length() && msg[i1]=='\\' && msg[i1+1]=='n'))
19083                 i1++;
19084 
19085             if(!m.empty()) {
19086                 //result+="*** ";
19087                 result+=m;
19088                 result+=eol;
19089             }
19090             m="";
19091         }
19092     }
19093     result=(string)"***"+eol+result+"***"+eol;
19094     return result;
19095 }

void dcc_rehashed string  who  ) 
 

Called from logic.cpp after rehashing. Applies new configuration to all connected users on DCC/telnet (also BOTNET) connections.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
who This should contain who caused rehasing (to inform connected users)

Definition at line 19170 of file dcc.cpp.

References dcc_clients, dcc_loop_get_rights(), dcc_send_msg(), lang_get_string(), and lang_subst().

Referenced by logic_rehash().

19171 {
19172     vector<s_dcc_client>::iterator i;
19173     char dcc_eol[4]="\n\0";
19174     char telnet_eol[4]="\r\n\0";
19175     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
19176         if((*i).got_passwd!=3)
19177             continue;
19178         dcc_loop_get_rights(i);
19179         if((*i).send)
19180             continue;
19181         if((*i).send_from_filesystem)
19182             continue;
19183         if((*i).replication_partner)
19184             continue;
19185         if((*i).ssl_connection)
19186             continue;
19187         if(!(*i).chat)
19188             continue;
19189         string eol=(*i).telnet?telnet_eol:dcc_eol;
19190         string disp=lang_subst(lang_get_string(1,(*i).lang,610),who)+eol;
19191         int ec=0;
19192         dcc_send_msg((*i).socket,disp,ec);
19193     }
19194 }

Here is the call graph for this function:

int dcc_send_file bool  from_dcc,
string  public_name,
string  nick,
int  dcc_group
 

Sends file to remote host.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
from_dcc Is this function invoked from DCC CHAT?
public_name Public name of the file
nick Nickname of user
dcc_group DCC group of the connection that should be used

Definition at line 1046 of file dcc.cpp.

References s_file::access, DCC_ACCESS_DENIED, dcc_awaiting_send, DCC_IO_ERROR, DCC_NO_SUCH_FILE, dcc_servers, s_dcc_send_file::file_name, FILE_SLASH, files, filesys_dcc_filelist(), HIGH_PRIORITY, inet_ntop(), inet_pton(), s_file::internal_name, irc_get_fullname(), irc_get_host(), irc_get_ident(), irc_is_ircop(), irc_putserv(), lang_get_string(), logic_access_to_filesystem(), logic_find_user(), LOW_PRIORITY, ltoa(), s_dcc_send_file::public_name, s_dcc_send_file::remote_ip, s_dcc_send_file::remote_ip6, s_dcc_send_file::resume_pos, s_dcc_send_file::size, sock_get_address_type(), sock_resolve(), sock_resolve6(), s_dcc_send_file::start_time, s_dcc_send_file::user_name_as_in_logic, and s_dcc_send_file::using_ipv6.

Referenced by dcc_loop(), dcc_loop_filesystem(), and irc_loop_process_input().

01047 {
01048     string ident=irc_get_ident(nick);
01049     string host=irc_get_host(nick);
01050     string full_name=irc_get_fullname(nick);
01051 
01052     string user_name=logic_find_user(nick,ident,host,full_name,irc_is_ircop(nick));
01053 
01054     if(!logic_access_to_filesystem(user_name))
01055         return DCC_ACCESS_DENIED;
01056 
01057     vector<s_file> files;
01058     filesys_dcc_filelist(user_name,files,false);
01059 
01060     s_file f;
01061 
01062     bool got=false;
01063 
01064     vector<s_file>::iterator i1;
01065     for(i1=files.begin(); i1!=files.end(); i1++) {
01066         if(!(*i1).public_name.compare(public_name)) {
01067             got=true;
01068             f=*i1;
01069         }
01070     }
01071 
01072     if(!got)
01073         return DCC_NO_SUCH_FILE;
01074 
01075     got=false;
01076     vector<s_access>::iterator i2;
01077     for(i2=f.access.begin(); i2!=f.access.end(); i2++)
01078         if((*i2).all_users || !(*i2).user_name.compare(user_name) || (*i2).also_unknown)
01079             if((*i2).read) {
01080                 if(!from_dcc && (*i2).secure) {
01081                     string msg="PRIVMSG ";
01082                     msg+=nick;
01083                     msg+=" :";
01084                     msg+=lang_get_string(1,"en",333);
01085                     irc_putserv(msg.c_str(),false,LOW_PRIORITY);
01086                     return DCC_ACCESS_DENIED;
01087                 }
01088                 got=true;
01089                 break;
01090             }
01091     if(!got)
01092         return DCC_ACCESS_DENIED;
01093 
01094     bool using_ipv6=false;
01095     in_addr ip;
01096 #ifdef _WIN32
01097     ip.S_un.S_addr=0;
01098 #else
01099     ip.s_addr=0;
01100 #endif
01101     in_addr6_ ip6;
01102     memset(&ip6,0,sizeof(ip6));
01103     in_addr ip_serv;
01104 #ifdef _WIN32
01105     ip_serv.S_un.S_addr=0;
01106 #else
01107     ip_serv.s_addr=0;
01108 #endif
01109     in_addr6_ ip6_serv;
01110     string bind_ip6;
01111     memset(&ip6_serv,0,sizeof(ip6_serv));
01112 
01113     bool want_ipv6=false;
01114 again_ipv6:
01115     got=false;
01116     vector<s_dcc_server>::iterator i3;
01117     for(i3=dcc_servers.begin(); i3!=dcc_servers.end(); i3++)
01118         if((*i3).group==dcc_group) {
01119             if(!want_ipv6 && !(*i3).using_ipv6) {
01120                 using_ipv6=false;
01121                 int type=sock_get_address_type(host);
01122                 if(type==4)
01123                     inet_pton(AF_INET,host.c_str(),&ip);
01124                 if(type==0)
01125                     ip=sock_resolve(host.c_str(),NULL);
01126                 if(type==6) {
01127                     want_ipv6=true;
01128                     goto again_ipv6;
01129                 }
01130                 {
01131 #ifdef _WIN32
01132                     if(!ip.S_un.S_addr)
01133 #else
01134                     if(!ip.s_addr)
01135 #endif
01136                         return DCC_IO_ERROR;
01137                 }
01138 #ifdef _WIN32
01139                 ip_serv.S_un.S_addr=(*i3).dcc_addr;
01140 #else
01141                 ip_serv.s_addr=(*i3).dcc_addr;
01142 #endif
01143             } else {
01144                 using_ipv6=true;
01145                 int type=sock_get_address_type(host);
01146                 if(type==0)
01147                     ip6=sock_resolve6((char*)host.c_str());
01148                 if(type==6)
01149                     inet_pton(AF_INET6,host.c_str(),&ip6);
01150                 if(true) {
01151                     if(!ip6.bytes[0] && !ip6.bytes[1] && !ip6.bytes[2] && !ip6.bytes[3]
01152                         && !ip6.bytes[4] && !ip6.bytes[5] && !ip6.bytes[6] && !ip6.bytes[7]
01153                         && !ip6.bytes[8] && !ip6.bytes[9] && !ip6.bytes[10] && !ip6.bytes[11]
01154                         && !ip6.bytes[12] && !ip6.bytes[13] && !ip6.bytes[14] && !ip6.bytes[15])
01155                         return DCC_IO_ERROR;
01156                 }
01157                 memcpy(&ip6_serv,&(*i3).dcc_addr6,sizeof(ip6_serv));
01158                 bind_ip6=(*i3).bind_ip;
01159                 if(bind_ip6.find("%",0)!=string::npos)
01160                     bind_ip6.erase(bind_ip6.find("%",0),bind_ip6.length()-bind_ip6.find("%",0));
01161             }
01162             got=true;
01163             break;
01164         }
01165 
01166     if(!got)
01167         return DCC_IO_ERROR;
01168 
01169     s_dcc_send_file send;
01170     send.user_name_as_in_logic=user_name;
01171     send.resume_pos=0;
01172     send.public_name=public_name;
01173     send.start_time=time(NULL);
01174     send.using_ipv6=using_ipv6;
01175     if(!using_ipv6) {
01176         send.remote_ip=ip;
01177         memset(&send.remote_ip6,0,sizeof(send.remote_ip6));
01178     } else {
01179 #ifdef _WIN32
01180         send.remote_ip.S_un.S_addr=(unsigned long)-1;
01181 #else
01182         send.remote_ip.s_addr=(unsigned long)-1;
01183 #endif
01184         memcpy(&send.remote_ip6,&ip6,sizeof(send.remote_ip6));
01185     }
01186 
01187     if(!using_ipv6) {
01188         char tmp[4];
01189         memcpy(tmp,&ip_serv,4);
01190 
01191 #if !defined(HIGHFIRST)
01192         // switch bytes: BIG endian (network byte order)
01193         char x;
01194 
01195         x=tmp[0];
01196         tmp[0]=tmp[3];
01197         tmp[3]=x;
01198         //
01199         x=tmp[1];
01200         tmp[1]=tmp[2];
01201         tmp[2]=x;
01202 
01203 #endif
01204         memcpy(&ip_serv,tmp,4);
01205     }
01206 
01207     send.file_name="." FILE_SLASH "filesystem" FILE_SLASH;
01208     send.file_name+=f.internal_name;
01209 
01210     FILE* ff=fopen(send.file_name.c_str(),"rb");
01211     if(!ff)
01212         return DCC_IO_ERROR;
01213 
01214     fseek(ff,0,SEEK_END);
01215     send.size=ftell(ff);
01216     fclose(ff);
01217 
01218     dcc_awaiting_send.push_back(send);
01219 
01220     string inv="PRIVMSG ";
01221     inv+=nick;
01222     inv+=" :\x01";
01223     inv+="DCC SEND ";
01224     inv+=public_name;
01225     inv+=" ";
01226 
01227     string ip_string;
01228 
01229     char tmp[64];
01230     if(!using_ipv6) {
01231         sprintf(tmp,"%u",ip_serv);
01232         inv+=tmp;
01233         inet_ntop(AF_INET,&ip,tmp,63);
01234         ip_string=tmp;
01235     } else {
01236         inv+=bind_ip6;
01237         ip_string=bind_ip6;
01238     }
01239     inv+=" ";
01240     
01241     ltoa((*i3).port,tmp,10);
01242 
01243     inv+=tmp;
01244     inv+=" ";
01245     sprintf(tmp,"%u",send.size);
01246     inv+=tmp;
01247     inv+="\x01";
01248 
01249     string inv2="NOTICE ";
01250     inv2+=nick;
01251     inv2+=" :DCC Send ";
01252     inv2+=public_name;
01253     inv2+=" (";
01254     inv2+=ip_string;
01255     inv2+=")";
01256 
01257     irc_putserv(inv2.c_str(),false,HIGH_PRIORITY);
01258     irc_putserv(inv.c_str(),false,HIGH_PRIORITY);
01259 
01260     return 0;
01261 }

Here is the call graph for this function:

void dcc_send_msg s_socket socket,
string  msg,
int &  ec
 

Sends a message to DCC CHAT / telnet connection and updates statistics.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
socket Socket handle
msg Message to send
ec Returns socket I/O error code

Definition at line 791 of file dcc.cpp.

References sock_send(), and stats_dcc_chat_bytes_sent().

Referenced by dcc_apply(), dcc_broadcast(), dcc_check_for_filesystem(), dcc_check_limit(), dcc_loop(), dcc_loop_edit_chan(), dcc_loop_edit_dynbans(), dcc_loop_edit_proc(), dcc_loop_edit_rproc(), dcc_loop_edit_user1(), dcc_loop_edit_user2(), dcc_loop_filesystem(), dcc_loop_language(), dcc_loop_msg(), dcc_loop_new_user(), dcc_loop_private(), dcc_loop_replication(), dcc_loop_terminator(), dcc_notify(), dcc_rehashed(), dcc_upgrade(), dcc_upgrade_bot_join(), dcc_upgrade_bot_mode(), dcc_upgrade_bot_nick(), dcc_user_pong(), and main().

00792 {
00793     ec=0;
00794     size_t sent=sock_send(socket,msg.c_str(),msg.length(),ec);
00795     if(!ec)
00796         stats_dcc_chat_bytes_sent(sent);
00797 }

Here is the call graph for this function:

void dcc_set_password string  user,
string  md5pass
 

Sets password for user.

Author:
VooDooMan
Version:
2
Date:
2005
Parameters:
user Name of user
md5pass MD5-encoded password
Warning:
Name of user is case-sensitive

Definition at line 1406 of file dcc.cpp.

References dcc_want_to_upgrade.

Referenced by dcc_loop().

01407 {
01408     if(dcc_want_to_upgrade)
01409         return;
01410 
01411     map<string,string> pswd_;
01412 
01413     bool got=false;
01414 
01415     FILE* in=fopen("pass.txt","r");
01416     char ln[10240+1];
01417     while(in && !feof(in)) {
01418         if(fgets(ln,1024*10-1,in)==NULL)
01419             break;
01420         ln[10240]=0;
01421         if(ln[strlen(ln)-1]=='\r')
01422             ln[strlen(ln)-1]=0;
01423         if(ln[strlen(ln)-1]=='\n')
01424             ln[strlen(ln)-1]=0;
01425         if(ln[strlen(ln)-1]=='\r')
01426             ln[strlen(ln)-1]=0;
01427         if(ln[strlen(ln)-1]=='\n')
01428             ln[strlen(ln)-1]=0;
01429 
01430         string name, pswd;
01431         int pos=0;
01432         for(unsigned int i1=0; i1<strlen(ln); i1++) {
01433             if(pos==0 && ln[i1]=='=') {
01434                 pos++;
01435                 continue;
01436             }
01437             if(pos==0)
01438                 name+=ln[i1];
01439             if(pos==1)
01440                 pswd+=ln[i1];
01441         }
01442 
01443         pair<string,string> p;
01444         p.first=name;
01445         p.second=pswd;
01446         if(!name.compare(user)) {
01447             p.second=md5pass;
01448             got=true;
01449         }
01450         pswd_.insert(p);
01451     }
01452     if(!got) {
01453         pair<string,string> p;
01454         p.first=user;
01455         p.second=md5pass;
01456         pswd_.insert(p);
01457     }
01458     if(in)
01459         fclose(in);
01460     FILE* f=fopen("pass.txt","w");
01461     if(f) {
01462         map<string,string>::iterator i1;
01463         for(i1=pswd_.begin(); i1!=pswd_.end(); i1++)
01464             fprintf(f,"%s=%s\n",(*i1).first.c_str(),(*i1).second.c_str());
01465         fclose(f);
01466     }
01467 }

void dcc_upgrade vector< s_dcc_client >::iterator  i,
string &  eol,
string  new_file_name
 

Tries to upgrade bot.

Author:
VooDooMan
Version:
1
Date:
2005

Definition at line 833 of file dcc.cpp.

References binary_name, dcc_broadcast(), dcc_close_servers(), dcc_killing_user_eol, dcc_killing_user_lang, dcc_send_msg(), dcc_want_to_upgrade, dcc_who_is_killing, s_exec_handle::error, exec_async_exec2(), FILE_SLASH, lang_get_string(), last_new_instance_join, log_bot(), log_free_locks(), logic_on_internal_event(), logic_partyline_backup(), PRIVATE_EVENT_SEVERITY_CODE_ERROR, and PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL.

Referenced by dcc_loop().

00834 {
00835     string path="upgrade" FILE_SLASH;
00836     path+=new_file_name;
00837     {
00838         FILE* f=fopen(path.c_str(),"rb");
00839         if(f==NULL) {
00840             string disp=lang_get_string(1,(*i).lang,630)+eol;
00841             int ec=0;
00842             dcc_send_msg((*i).socket,disp,ec);
00843             return;
00844         } else {
00845             fclose(f);
00846         }
00847     }
00848     dcc_killing_user_eol=eol;
00849     dcc_killing_user_socket=&((*i).socket);
00850 
00851     char* tmp=new char[(*i).as_in_logic.length()+128];
00852     sprintf(tmp,"%s%s","UPGRADE by ",(*i).as_in_logic.c_str());
00853     log_bot(tmp);
00854     dcc_broadcast(tmp);
00855     delete[] tmp;
00856     tmp=NULL;
00857 
00858     logic_on_internal_event("@upgrade@",(*i).as_in_logic,path,"","",PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL,"","");
00859 
00860     dcc_close_servers();
00861 
00862     log_free_locks();
00863 
00864     logic_partyline_backup((*i).as_in_logic);
00865 
00866     string msg="Entering UPGRADE state. All server sockets have been closed. Spawning new instance.";
00867     log_bot(msg.c_str());
00868     dcc_broadcast(msg);
00869 
00870 #ifndef _WIN32
00871     chmod(path.c_str(),S_IRWXU);
00872 #endif
00873 
00874     extern string binary_name;
00875     string arg="--upgrade=";
00876     string tmp2=binary_name;
00877     while(tmp2.find(FILE_SLASH,0)!=string::npos)
00878         tmp2.erase(0,tmp2.find(FILE_SLASH,0)+1);
00879     arg+=tmp2;
00880     
00881     string tmp3=(string)"\""+path+"\"";
00882     s_exec_handle* h=exec_async_exec2(tmp3.c_str(),arg.c_str(),"." FILE_SLASH);
00883 
00884     if(!h || h->error) {
00885         string disp=lang_get_string(1,(*i).lang,631)+eol;
00886         int ec=0;
00887         dcc_send_msg((*i).socket,disp,ec);
00888         dcc_want_to_upgrade=false;
00889         char msg1[]="UPGRADE panic! Error spawning new instance. You should use .restart command now.";
00890         log_bot(msg1);
00891 
00892         logic_on_internal_event("@upgrade@",(*i).as_in_logic,path,"","",PRIVATE_EVENT_SEVERITY_CODE_ERROR,msg1,"");
00893     } else {
00894         string disp=lang_get_string(1,(*i).lang,632)+eol;
00895         int ec=0;
00896         dcc_send_msg((*i).socket,disp,ec);
00897         char msg1[]="UPGRADE: New instance spawned, waiting for it to come in.";
00898         log_bot(msg1);
00899 
00900         logic_on_internal_event("@upgrade@",(*i).as_in_logic,path,"","",PRIVATE_EVENT_SEVERITY_CODE_INFORMATIONAL,msg1,"");
00901 
00902         last_new_instance_join=time(NULL);
00903         dcc_killing_user_socket=&(*i).socket;
00904         dcc_who_is_killing=(*i).as_in_logic;
00905         dcc_killing_user_lang=(*i).lang;
00906         dcc_want_to_upgrade=true;
00907     }
00908 }

Here is the call graph for this function:

void dcc_upgrade_bot_join string  nick,
string  ident,
string  host,
string  fullname,
string  channel
 

Called in UPGRADE state, to inform user who initiated .upgrade command that another instance is on channel.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
nick Nick of new instance
ident Ident of new instance
host Host of new instance
fullname Full name of new instance
channel Channnel that new instance joined

Definition at line 921 of file dcc.cpp.

References s_socket::cmp(), dcc_killing_user_eol, dcc_killing_user_lang, dcc_send_msg(), lang_get_string(), and last_new_instance_join.

Referenced by logic_on_join().

00922 {
00923     last_new_instance_join=time(NULL);
00924     string eol=dcc_killing_user_eol;
00925     s_socket* s=dcc_killing_user_socket;
00926     string lang=dcc_killing_user_lang;
00927     if(s->cmp()) {
00928         string disp=lang_get_string(1,lang,633)+eol;
00929         disp+="    ";
00930         disp+=channel+eol;
00931         disp+="    ";
00932         disp+=nick;
00933         disp+="!";
00934         disp+=ident;
00935         disp+="@";
00936         disp+=host;
00937         disp+=" * ";
00938         disp+=fullname;
00939         disp+=eol;
00940         int ec=0;
00941         dcc_send_msg(*s,disp,ec);
00942     }
00943 }

Here is the call graph for this function:

void dcc_upgrade_bot_mode string  nick,
string  ident,
string  host,
string  fullname,
string  channel,
string  mode
 

Called in UPGRADE state, to inform user who initiated .upgrade command that another instance on some channel gets some mode.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
nick Nick of new instance
ident Ident of new instance
host Host of new instance
fullname Full name of new instance
channel Channnel that new instance joined
mode New mode

Definition at line 957 of file dcc.cpp.

References s_socket::cmp(), dcc_killing_user_eol, dcc_killing_user_lang, dcc_send_msg(), and lang_get_string().

Referenced by logic_exec(), and logic_validate().

00958 {
00959     string eol=dcc_killing_user_eol;
00960     s_socket* s=dcc_killing_user_socket;
00961     string lang=dcc_killing_user_lang;
00962     if(s->cmp()) {
00963         string disp=lang_get_string(1,lang,634)+eol;
00964         disp+="    ";
00965         disp+=channel;
00966         disp+=" ";
00967         disp+=mode;
00968         disp+=eol;
00969         disp+="    ";
00970         disp+=nick;
00971         disp+="!";
00972         disp+=ident;
00973         disp+="@";
00974         disp+=host;
00975         disp+=" * ";
00976         disp+=fullname;
00977         disp+=eol;
00978         int ec=0;
00979         dcc_send_msg(*s,disp,ec);
00980     }
00981 }

Here is the call graph for this function:

void dcc_upgrade_bot_nick string  nick,
string  ident,
string  host,
string  fullname,
string  new_nick
 

Called in UPGRADE state, to inform user who initiated .upgrade command that another instance changed its nick.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
nick Nick of new instance
ident Ident of new instance
host Host of new instance
fullname Full name of new instance
new_nick New nick

Definition at line 994 of file dcc.cpp.

References s_socket::cmp(), dcc_killing_user_eol, dcc_killing_user_lang, dcc_send_msg(), and lang_get_string().

Referenced by logic_on_nick_change().

00995 {
00996     string eol=dcc_killing_user_eol;
00997     s_socket* s=dcc_killing_user_socket;
00998     string lang=dcc_killing_user_lang;
00999     if(s->cmp()) {
01000         string disp=lang_get_string(1,lang,635);
01001         disp+=" ";
01002         disp+=new_nick;
01003         disp+=eol;
01004         disp+="    ";
01005         disp+=nick;
01006         disp+="!";
01007         disp+=ident;
01008         disp+="@";
01009         disp+=host;
01010         disp+=" * ";
01011         disp+=fullname;
01012         disp+=eol;
01013         int ec=0;
01014         dcc_send_msg(*s,disp,ec);
01015     }
01016 }

Here is the call graph for this function:

void dcc_user_pong string  time_,
string  user,
string  origin_bot
 

Message for partyline user's pong.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
time_ UNIX timestamp of original ping
user Name of user as in "logic.txt"
origin_bot Name of bot from which is event

Definition at line 18527 of file dcc.cpp.

Referenced by botnet_partyline_event().

18528 {
18529     vector<s_dcc_client>::iterator i;
18530     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
18531         if(!(*i).replication_partner && ((*i).chat || (*i).telnet) && (*i).got_passwd==3 && !(*i).as_in_logic.compare(user)) {
18532             string eol;
18533             if((*i).telnet)
18534                 eol+="\r\n";
18535             else
18536                 eol+="\n";
18537 
18538             string disp=lang_subst(lang_get_string(1,(*i).lang,648),origin_bot)+eol;
18539             time_t now=time(NULL);
18540             time_t origin=atol(time_.c_str());
18541             char tmp[128];
18542             ltoa((long)now-origin,tmp,10);
18543             disp=lang_subst(disp,tmp); // not +eol !!!
18544             int ec=0;
18545             dcc_send_msg((*i).socket,disp,ec);
18546         }
18547     }
18548 }

void irc_quoted_callback const char *  str,
const char *  nick,
const char *  host_mask
 

Called when 0x01-quoted PRIVMSG has been received to initialise DCC CHAT or DCC SEND connection.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
str Message content to parse
nick Nick name of sender
host_mask Host mask of sender

Definition at line 1480 of file dcc.cpp.

References s_user::access_to_filesystem, s_user::access_to_partyline, s_dcc_client::as_in_logic, byteReverse(), s_dcc_client::chat, s_dcc_request_whois::clear(), s_socket::clear(), s_socket::cmp(), s_user_to_lag::cnt, conf_getvar(), dcc_awaiting_send, dcc_check_limit(), dcc_clients, dcc_get_num_of_transfers(), dcc_request_whois, s_dcc_client::dcc_send, dcc_to_resume, s_dcc_client::edit_user, s_dcc_client_to_resume::file_name, s_dcc_client_to_resume::file_size, FILESYS_ALREADY_EXISTS, filesys_check_add_file_raw(), filesys_dcc_check_for_resume(), s_dcc_client::filesystem, s_dcc_client::fullname, s_dcc_client::got_passwd, s_dcc_client::got_user_name, HIGH_PRIORITY, s_dcc_client::host, s_dcc_request_whois::host_mask, s_dcc_client::ident, inet_ntop(), inet_pton(), s_dcc_client_to_resume::ip_4, s_dcc_client_to_resume::ip_6, s_dcc_client_to_resume::ip_addr4, s_dcc_client_to_resume::ip_addr6, irc_get_fullname(), irc_get_host(), irc_get_ident(), irc_is_ircop(), irc_putserv(), s_dcc_client::s_dcc_client_send::is_file_server_proto, lang_get_string(), lang_subst(), s_user_to_lag::last_try, log_bot(), log_debug(), log_socket(), logic_find_user(), logic_partyline_get_user(), LOW_PRIORITY, ltoa(), s_dcc_client::new_user, s_dcc_request_whois::nick, s_dcc_client_to_resume::nick, s_dcc_client::nick, s_user_to_lag::notified, s_dcc_client::s_dcc_client_send::original_name, s_dcc_client_to_resume::port, s_dcc_client::resume_pos, s_dcc_client_to_resume::resume_position, s_dcc_client::send, s_dcc_client::send_from_filesystem, s_dcc_client::server_socket, s_dcc_client::s_dcc_client_send::size, sock_connect(), sock_error(), sock_resolve(), sock_resolve6(), s_dcc_client::socket, s_dcc_request_whois::start, s_dcc_client_to_resume::start_time, s_dcc_request_whois::str, s_dcc_client::telnet, s_user_to_lag::user_name, s_dcc_client_to_resume::user_name, users_to_lag, and s_dcc_client_to_resume::using_ipv6.

Referenced by irc_loop_process_input(), and irc_RPL_WHOISUSER().

01481 {
01482     if(strstr(str,"DCC ")==NULL)
01483         return;
01484 
01485     string user_name;
01486     {
01487         if(irc_get_host(nick).empty()) {
01488             bool got=false;
01489             vector<s_dcc_request_whois>::iterator i1;
01490         l1:
01491             for(i1=dcc_request_whois.begin(); i1!=dcc_request_whois.end(); i1++) {
01492                 if((*i1).start+120<time(NULL)) {
01493                     dcc_request_whois.erase(i1);
01494                     goto l1;
01495                 }
01496             }
01497             for(i1=dcc_request_whois.begin(); i1!=dcc_request_whois.end(); i1++) {
01498                 if(!(*i1).nick.compare(nick) && (*i1).got_whois) {
01499                     user_name=logic_find_user(nick,(*i1).ident,(*i1).host,(*i1).full_name,(*i1).irc_op);
01500                     got=true;
01501                     break;
01502                 }
01503             }
01504 
01505             if(!got) {
01506                 s_dcc_request_whois r;
01507                 r.clear();
01508                 time(&r.start);
01509                 r.str=str;
01510                 r.nick=nick;
01511                 r.host_mask=host_mask;
01512                 dcc_request_whois.push_back(r);
01513 
01514                 string msg="WHOIS ";
01515                 msg+=nick;
01516                 irc_putserv(msg.c_str(),true,HIGH_PRIORITY);
01517                 return;
01518             }
01519         } else
01520             user_name=logic_find_user(nick,irc_get_ident(nick), irc_get_host(nick), irc_get_fullname(nick), irc_is_ircop(nick));
01521         vector<s_user_to_lag>::iterator i1;
01522 again:
01523         for(i1=users_to_lag.begin(); i1!=users_to_lag.end(); i1++) {
01524             if((*i1).last_try+atol(conf_getvar("ctcp_lag_user_seconds").c_str())<time(NULL)) {
01525                 users_to_lag.erase(i1);
01526                 goto again;
01527             }
01528         }
01529         bool got=false;
01530         for(i1=users_to_lag.begin(); i1!=users_to_lag.end(); i1++) {
01531             if(!(*i1).user_name.compare(user_name)) {
01532                 (*i1).cnt++;
01533                 (*i1).last_try=time(NULL);
01534                 got=true;
01535                 break;
01536             }
01537         }
01538         if(got) {
01539             if((*i1).cnt>atol(conf_getvar("ctcp_lag_user_msgs").c_str())) {
01540                 time_t x=(*i1).last_try;
01541                 time_t now=time(NULL);
01542                 while((signed)x>0 && (*i1).cnt>0 && (signed)now-(signed)x>atol(conf_getvar("ctcp_lag_user_seconds").c_str())) {
01543                     x-=atol(conf_getvar("ctcp_lag_user_seconds").c_str());
01544                     (*i1).cnt--;
01545                 }
01546                 if((*i1).cnt>atol(conf_getvar("ctcp_lag_user_msgs").c_str())) {
01547                     if(!(*i1).notified) {
01548                         (*i1).notified=true;
01549                         string msg="PRIVMSG ";
01550                         msg+=nick;
01551                         msg+=" :";
01552                         string lang="en"; // TODO: !!!
01553                         msg+=lang_get_string(1,lang,446);
01554                         irc_putserv(msg.c_str(),false,LOW_PRIORITY);
01555                     }
01556                     return;
01557                 }
01558                 if((*i1).cnt==0) {
01559                     (*i1).cnt=1;
01560                     (*i1).notified=false;
01561                 }
01562             }
01563         } else {
01564             s_user_to_lag u;
01565             u.cnt=1;
01566             u.last_try=time(NULL);
01567             u.user_name=user_name;
01568             u.notified=false;
01569             users_to_lag.push_back(u);
01570         }
01571     }
01572 
01573     if((strlen(str)>=14 && str[0]=='D' && str[1]=='C' && str[2]=='C' && str[3]==' ' && str[4]=='C' && str[5]=='H' && str[6]=='A' && str[7]=='T' && str[8]==' ' && str[9]=='c' && str[10]=='h' && str[11]=='a' && str[12]=='t' && str[13]==' ') ||
01574        (strlen(str)>=9  && str[0]=='D' && str[1]=='C' && str[2]=='C' && str[3]==' ' && str[4]=='S' && str[5]=='E' && str[6]=='N' && str[7]=='D' && str[8]==' ')) {
01575         bool send=str[4]=='S';
01576 
01577         string user_name_as_in_logic=user_name;
01578 
01579         {
01580             s_user u;
01581             vector<s_channel> chs;
01582             logic_partyline_get_user(user_name_as_in_logic,u,chs);
01583             if(send && !u.access_to_filesystem)
01584                 return;
01585             if(!send && !u.access_to_partyline)
01586                 return;
01587         }
01588 
01589         string file_name;
01590 
01591         int begin_pos=14;
01592 
01593         if(send) {
01594             if(dcc_get_num_of_transfers()>=atol(conf_getvar("dcc_max_transfers").c_str())) {
01595                 string msg="PRIVMSG ";
01596                 msg+=nick;
01597                 msg+=" :";
01598                 string lang="en"; // TODO: !!!
01599                 msg+=lang_get_string(1,lang,445);
01600                 irc_putserv(msg.c_str(),false,LOW_PRIORITY);
01601                 return;
01602             }
01603 
01604             int i1=9;
01605             for(; str[i1]!=0; i1++) {
01606                 if(str[i1]==0x20)
01607                     break;
01608                 file_name+=str[i1];
01609             }
01610             if(str[i1]==0x20)
01611                 i1++;
01612             begin_pos=i1;
01613         }
01614 
01615         string ip_, port_;
01616         int i1=begin_pos;
01617         for(; str[i1]!=0; i1++) {
01618             if(str[i1]==0x20)
01619                 break;
01620             ip_+=str[i1];
01621         }
01622         if(str[i1]!=0)
01623             i1++;
01624         for(; str[i1]!=0; i1++) {
01625             if(str[i1]==0x20)
01626                 break;
01627             port_+=str[i1];
01628         }
01629 
01630         if(str[i1]!=0)
01631             i1++;
01632 
01633         string size;
01634 
01635         if(send) {
01636             while(str[i1]!=0 && str[i1]==0x20)
01637                 i1++;
01638             for(; str[i1]!=0; i1++) {
01639                 if(str[i1]==0x20)
01640                     break;
01641                 size+=str[i1];
01642             }
01643         }
01644 
01645         long ip=0;
01646         string ip_addr;
01647         in_addr6_ ip6;
01648         memset(&ip6,0,sizeof(ip6));
01649         bool got_ipv6=false;
01650         long i_size=atol(size.c_str());
01651         unsigned short port=(unsigned short)atol(port_.c_str());
01652 
01653         if(ip_.find(":",0)==string::npos && ip_.find(".",0)==string::npos) {
01654             got_ipv6=false;
01655 
01656             long ip=atol(ip_.c_str());
01657             byteReverse((unsigned char*)&ip,1); // for BIG endian machines
01658             unsigned char* i=(unsigned char*)&ip;
01659             char tmp[64];
01660 
01661             ltoa(*i,tmp,10);
01662             ip_addr=(string)"."+tmp;
01663             i++;
01664 
01665             ltoa(*i,tmp,10);
01666             ip_addr=(string)"."+tmp+ip_addr;
01667             i++;
01668 
01669             ltoa(*i,tmp,10);
01670             ip_addr=(string)"."+tmp+ip_addr;
01671             i++;
01672 
01673             ltoa(*i,tmp,10);
01674             ip_addr=(string)tmp+ip_addr;
01675             i++;
01676         }
01677         if(ip_.find(":",0)==string::npos && ip_.find(".",0)!=string::npos) {
01678             got_ipv6=false;
01679             if(inet_pton(AF_INET,ip_.c_str(),&ip)==1) {
01680                 ip_addr=ip_;
01681             } else
01682                 return; // error
01683         }
01684         if(ip_.find(":",0)!=string::npos) {
01685             got_ipv6=true;
01686             if(inet_pton(AF_INET6,ip_.c_str(),&ip6)==1) {
01687                 ip_addr=ip_;
01688             } else
01689                 return; // error
01690         }
01691 
01692         string dcc_bind_ip=conf_getvar("dcc_bind_ip");
01693         if(dcc_bind_ip.empty())
01694             dcc_bind_ip="0.0.0.0";
01695         string dcc_bind_ip6=conf_getvar("dcc_bind_ip6");
01696         if(dcc_bind_ip6.empty())
01697             dcc_bind_ip6="::";
01698 
01699         if(send) {
01700             size_t got_bytes;
01701             bool resume=filesys_dcc_check_for_resume(user_name_as_in_logic,file_name,got_bytes);
01702             if(resume) {
01703                 string msg="PRIVMSG ";
01704                 msg+=nick;
01705                 msg+=" :\x01" "DCC RESUME ";
01706                 msg+=file_name;
01707                 msg+=" ";
01708                 msg+=port_;
01709                 msg+=" ";
01710                 char tmp[64];
01711                 ltoa((long)got_bytes,tmp,10);
01712                 msg+=tmp;
01713                 msg+="\x01";
01714                 irc_putserv(msg.c_str(),false,LOW_PRIORITY);
01715 
01716                 s_dcc_client_to_resume res;
01717                 res.file_name=file_name;
01718                 res.file_size=i_size;
01719                 res.using_ipv6=got_ipv6;
01720                 if(!got_ipv6) {
01721                     res.ip_addr4=ip_;
01722                     res.ip_4=ip;
01723 
01724                     res.ip_addr6="";
01725                     memset(&res.ip_6,0,sizeof(res.ip_6));
01726                 } else {
01727                     res.ip_addr4="";
01728                     res.ip_4=0;
01729 
01730                     res.ip_addr6=ip_;
01731                     res.ip_6=ip6;
01732                 }
01733                 res.nick=nick;
01734                 res.port=port;
01735                 res.start_time=time(NULL);
01736                 res.resume_position=got_bytes;
01737                 res.user_name=user_name_as_in_logic;
01738 
01739                 dcc_to_resume.push_back(res);
01740                 return;
01741             } else {
01742                 int ec=filesys_check_add_file_raw(file_name,user_name_as_in_logic);
01743                 if(ec==FILESYS_ALREADY_EXISTS) {
01744                     string msg="PRIVMSG ";
01745                     msg+=nick;
01746                     msg+=" :";
01747 
01748                     string lang="en"; // TODO: !!!
01749                     string m=lang_subst(lang_get_string(1,lang,444),file_name);
01750 
01751                     msg+=m;
01752                     irc_putserv(msg.c_str(),false,LOW_PRIORITY);
01753                     return;
01754                 }
01755             }
01756         }
01757 
01758         {
01759             bool spoofing=false;
01760             in_addr6_ supplied6;
01761             in_addr6_ originator6;
01762             in_addr supplied4;
01763             in_addr originator4;
01764             if(got_ipv6) {
01765                 supplied6=sock_resolve6((char*)ip_addr.c_str());
01766                 originator6=sock_resolve6((char*)irc_get_host(nick).c_str());
01767                 unsigned char sum_supplied=0;
01768                 unsigned char sum_originator=0;
01769                 for(int i1=0; i1<sizeof(supplied6); i1++) {
01770                     sum_supplied|=((unsigned char*)&supplied6)[i1];
01771                     sum_originator|=((unsigned char*)&originator6)[i1];
01772                     if(((unsigned char*)&supplied6)[i1]!=((unsigned char*)&originator6)[i1]) {
01773                         spoofing=true;
01774                         break;
01775                     }
01776                 }
01777                 if(!sum_supplied || !sum_originator)
01778                     spoofing=true; // some of addresses are zero
01779             } else {
01780                 supplied4=sock_resolve(ip_addr.c_str(),NULL);
01781                 originator4=sock_resolve(irc_get_host(nick).c_str(),NULL);
01782                 unsigned char sum_supplied=0;
01783                 unsigned char sum_originator=0;
01784                 for(int i1=0; i1<sizeof(supplied4); i1++) {
01785                     sum_supplied|=((unsigned char*)&supplied4)[i1];
01786                     sum_originator|=((unsigned char*)&originator4)[i1];
01787                     if(((unsigned char*)&supplied4)[i1]!=((unsigned char*)&originator4)[i1]) {
01788                         spoofing=true;
01789                         break;
01790                     }
01791                 }
01792                 if(!sum_supplied || !sum_originator)
01793                     spoofing=true; // some of addresses are zero
01794             }
01795             if(spoofing) {
01796                 string msg="DCC IP address spoofing from user ";
01797                 msg+=host_mask;
01798                 msg+=" with supplied IPv";
01799                 msg+=(got_ipv6?"6":"4");
01800                 msg+=" address \"";
01801                 msg+=ip_;
01802                 msg+="\" translated to ";
01803                 char tmp[128+1];
01804                 tmp[0]=tmp[128]=0;
01805                 if(got_ipv6)
01806                     inet_ntop(AF_INET6,(const void*)&supplied6,tmp,128);
01807                 else
01808                     inet_ntop(AF_INET,(const void*)&supplied4,tmp,128);
01809                 msg+=tmp;
01810                 msg+=", but host of sender of CTCP message was decoded/and/or/DNS-translated to IPv";
01811                 msg+=(got_ipv6?"6":"4");
01812                 msg+=" address ";
01813                 tmp[0]=tmp[128]=0;
01814                 if(got_ipv6)
01815                     inet_ntop(AF_INET6,(const void*)&originator6,tmp,128);
01816                 else
01817                     inet_ntop(AF_INET,(const void*)&originator4,tmp,128);
01818                 msg+=tmp;
01819                 log_bot(msg.c_str());
01820                 return;
01821             }
01822         }
01823 
01824         int ec=0;
01825         s_socket s;
01826         if(!got_ipv6)
01827             s=sock_connect((char*)dcc_bind_ip.c_str(),(char*)ip_addr.c_str(),port,ec,true);
01828         else
01829             s=sock_connect((char*)dcc_bind_ip6.c_str(),(char*)ip_addr.c_str(),port,ec,true);
01830         if(s.cmp()==false || ec) {
01831             log_socket(ec,sock_error(ec),"while calling sock_connect in file " __FILE__ " in function " __FUNC__);
01832             return;
01833         }
01834 
01835         s_dcc_client c;
01836 
01837         c.nick=nick;
01838         c.ident=irc_get_ident(nick);
01839         c.host=irc_get_host(nick);
01840         c.fullname=irc_get_fullname(nick);
01841 
01842         c.resume_pos=0;
01843 
01844         c.chat=!send;
01845         c.send=send;
01846         c.send_from_filesystem=false;
01847         c.socket=s;
01848 
01849         c.server_socket.clear();
01850         c.telnet=false;
01851         c.got_passwd=0;
01852         c.new_user=0;
01853         c.edit_user=0;
01854         c.filesystem=0;
01855         c.as_in_logic=user_name_as_in_logic;
01856         c.got_user_name=(c.as_in_logic.empty()?false:true);
01857 
01858         if(send) {
01859             c.dcc_send.size=i_size;
01860             c.dcc_send.original_name=file_name;
01861             c.dcc_send.is_file_server_proto=false;
01862         }
01863 
01864         dcc_clients.push_back(c);
01865         dcc_check_limit();
01866     }
01867 
01868     if(strlen(str)>=11 && str[0]=='D' && str[1]=='C' && str[2]=='C' && str[3]==' ' && str[4]=='A' && str[5]=='C' && str[6]=='C' && str[7]=='E' && str[8]=='P' && str[9]=='T' && str[10]==' ') {
01869         if(dcc_get_num_of_transfers()>=atol(conf_getvar("dcc_max_transfers").c_str())) {
01870             string msg="PRIVMSG ";
01871             msg+=nick;
01872             msg+=" :";
01873             string lang="en"; // TODO: !!!
01874             msg+=lang_get_string(1,lang,445);
01875             irc_putserv(msg.c_str(),false,HIGH_PRIORITY);
01876             return;
01877         }
01878 
01879         string file_name;
01880 
01881         int begin_pos=11;
01882 
01883         bool send=true;
01884         if(send) {
01885             int i1=11;
01886             for(; str[i1]!=0; i1++) {
01887                 if(str[i1]==0x20)
01888                     break;
01889                 file_name+=str[i1];
01890             }
01891             if(str[i1]==0x20)
01892                 i1++;
01893             begin_pos=i1;
01894         }
01895 
01896         string user_name_as_in_logic=user_name;
01897 
01898         {
01899             s_user u;
01900             vector<s_channel> chs;
01901             logic_partyline_get_user(user_name_as_in_logic,u,chs);
01902             if(send && !u.access_to_filesystem)
01903                 return;
01904             if(!send && !u.access_to_partyline)
01905                 return;
01906         }
01907 
01908         string port_, position_;
01909         int i1=begin_pos;
01910         for(; str[i1]!=0; i1++) {
01911             if(str[i1]==0x20)
01912                 break;
01913             port_+=str[i1];
01914         }
01915         if(str[i1]!=0)
01916             i1++;
01917         for(; str[i1]!=0; i1++) {
01918             if(str[i1]==0x20)
01919                 break;
01920             position_+=str[i1];
01921         }
01922 
01923         if(str[i1]!=0)
01924             i1++;
01925 
01926         unsigned short port=(unsigned short)atol(port_.c_str());
01927 
01928         {
01929             bool got=false;
01930             vector<s_dcc_client_to_resume>::iterator i1;
01931             for(i1=dcc_to_resume.begin(); i1!=dcc_to_resume.end(); i1++)
01932                 // BEGIN bug in mIRC workaround
01933                 //if(!(*i1).file_name.compare(file_name) && (*i1).port==port && !(*i1).nick.compare(nick) && !(*i1).user_name.compare(user_name_as_in_logic)) {
01934                 if(!(*i1).nick.compare(nick) && !(*i1).user_name.compare(user_name_as_in_logic)) {
01935                     file_name=(*i1).file_name;
01936                     port=(*i1).port;
01937                     char tmp[64];
01938                     ltoa((long)(*i1).resume_position,tmp,10);
01939                     position_=tmp;
01940                 // END   bug in mIRC workaround
01941                     got=true;
01942                     break;
01943                 }
01944 
01945             if(!got) {
01946                 // huh! error!
01947                 log_debug("in file " __FILE__ " in function " __FUNC__ " occurred panic: cannot find entry for DCC RESUME! huh?!");
01948                 return;
01949             }
01950 
01951             s_dcc_client_to_resume res=*i1;
01952             dcc_to_resume.erase(i1);
01953 
01954             size_t i_size=res.file_size;
01955             string ip_addr;
01956             if(!res.using_ipv6)
01957                 ip_addr=res.ip_addr4;
01958             else
01959                 ip_addr=res.ip_addr6;
01960 
01961             string dcc_bind_ip=conf_getvar("dcc_bind_ip");
01962             if(dcc_bind_ip.empty())
01963                 dcc_bind_ip="0.0.0.0";
01964             string dcc_bind_ip6=conf_getvar("dcc_bind_ip6");
01965             if(dcc_bind_ip6.empty())
01966                 dcc_bind_ip6="::";
01967 
01968             int ec=0;
01969             s_socket s;
01970             if(!res.using_ipv6)
01971                 s=sock_connect((char*)dcc_bind_ip.c_str(),(char*)ip_addr.c_str(),port,ec,true);
01972             else
01973                 s=sock_connect((char*)dcc_bind_ip6.c_str(),(char*)ip_addr.c_str(),port,ec,true);
01974             if(s.cmp()==false || ec) {
01975                 log_socket(ec,sock_error(ec),"while calling sock_connect in file " __FILE__ " in function " __FUNC__);
01976                 return;
01977             }
01978 
01979             s_dcc_client c;
01980 
01981             c.nick=nick;
01982             c.ident=irc_get_ident(nick);
01983             c.host=irc_get_host(nick);
01984             c.fullname=irc_get_fullname(nick);
01985 
01986             c.resume_pos=atol(position_.c_str());
01987 
01988             c.chat=!send;
01989             c.send=send;
01990             c.send_from_filesystem=false;
01991             c.socket=s;
01992 
01993             c.server_socket.clear();
01994             c.telnet=false;
01995             c.got_passwd=0;
01996             c.new_user=0;
01997             c.edit_user=0;
01998             c.filesystem=0;
01999             c.as_in_logic=user_name_as_in_logic;
02000             c.got_user_name=(c.as_in_logic.empty()?false:true);
02001 
02002             c.dcc_send.size=i_size;
02003             c.dcc_send.original_name=file_name;
02004             c.dcc_send.is_file_server_proto=false;
02005 
02006             dcc_clients.push_back(c);
02007             dcc_check_limit();
02008         }
02009     }
02010 
02011     if((strlen(str)>=11 && str[0]=='D' && str[1]=='C' && str[2]=='C' && str[3]==' ' && str[4]=='R' && str[5]=='E' && str[6]=='S' && str[7]=='U' && str[8]=='M' && str[9]=='E' && str[10]==' ')) {
02012         if(dcc_get_num_of_transfers()>=atol(conf_getvar("dcc_max_transfers").c_str())) {
02013             string msg="PRIVMSG ";
02014             msg+=nick;
02015             msg+=" :";
02016             string lang="en"; // TODO: !!!
02017             msg+=lang_get_string(1,lang,445);
02018             irc_putserv(msg.c_str(),false,HIGH_PRIORITY);
02019             return;
02020         }
02021 
02022         //bool send=false;
02023 
02024         string file_name;
02025 
02026         int begin_pos=11;
02027 
02028         string user_name_as_in_logic=user_name;
02029 
02030         {
02031             s_user u;
02032             vector<s_channel> chs;
02033             logic_partyline_get_user(user_name_as_in_logic,u,chs);
02034             if(!u.access_to_filesystem)
02035                 return;
02036         }
02037 
02038         string port_, position_;
02039         int i1=begin_pos;
02040 
02041         bool q=str[i1]=='\"';
02042         for(; str[i1]!=0; i1++) {
02043             if(str[i1]==0x20 && !q)
02044                 break;
02045             if(str[i1]=='\"')
02046                 q=false;
02047             file_name+=str[i1];
02048         }
02049         if(file_name.length()>0 && file_name[0]=='\"')
02050             file_name.erase(0,1);
02051         if(file_name.length()>0 && file_name[file_name.length()-1]=='\"')
02052             file_name.erase(file_name.length()-1,1);
02053 
02054         if(str[i1]!=0)
02055             i1++;
02056 
02057         for(; str[i1]!=0; i1++) {
02058             if(str[i1]==0x20)
02059                 break;
02060             port_+=str[i1];
02061         }
02062         if(str[i1]!=0)
02063             i1++;
02064         for(; str[i1]!=0; i1++) {
02065             if(str[i1]==0x20)
02066                 break;
02067             position_+=str[i1];
02068         }
02069 
02070         if(str[i1]!=0)
02071             i1++;
02072 
02073         //unsigned short port=(unsigned short)atol(port_.c_str());
02074         long pos=atol(position_.c_str());
02075 
02076         string msg="PRIVMSG ";
02077         msg+=nick;
02078         msg+=" :\x01" "DCC ACCEPT ";
02079         msg+=(string)"\""+file_name+"\"";
02080         msg+=" ";
02081         msg+=port_;
02082         msg+=" ";
02083         msg+=position_;
02084         msg+="\x01";
02085         irc_putserv(msg.c_str(),false,HIGH_PRIORITY);
02086 
02087         {
02088             vector<s_dcc_send_file>::iterator i1;
02089             for(i1=dcc_awaiting_send.begin(); i1!=dcc_awaiting_send.end(); i1++) {
02090                 if(!(*i1).user_name_as_in_logic.compare(user_name_as_in_logic) && !(*i1).public_name.compare(file_name)) {
02091                     (*i1).resume_pos=pos;
02092                     break;
02093                 }
02094             }
02095         }
02096     }
02097 }

Here is the call graph for this function:

void logic_partyline_access string  user,
vector< string > &  access_to_users,
vector< string > &  access_to_groups,
vector< string > &  access_grant_groups,
vector< string > &  access_to_proc_groups,
vector< string > &  access_grant_proc_groups,
vector< string > &  access_grant_proc,
vector< string > &  access_to_channel,
vector< string > &  access_grant_channel,
bool &  access_grant_partyline,
vector< string > &  access_to_procs,
bool &  access_to_backup,
bool &  access_grant_backup,
bool &  access_to_rehash,
bool &  access_grant_rehash,
bool &  access_to_plususer,
bool &  access_grant_plususer,
bool &  access_to_plusproc,
bool &  access_grant_plusproc,
s_flood partyline_msg_flood,
bool &  access_to_replication,
bool &  access_grant_replication,
vector< string > &  access_to_chan_defs,
bool &  access_to_restart,
bool &  access_grant_restart,
bool &  access_to_die,
bool &  access_grant_die,
bool &  access_to_filesystem,
bool &  access_grant_filesystem,
bool &  access_to_private,
bool &  access_grant_private,
bool &  access_to_can_send_all_users,
bool &  access_grant_can_send_all_users,
bool &  access_to_can_send_unknown_users,
bool &  access_grant_can_send_unknown_users,
vector< string > &  access_usage_proc,
vector< string > &  access_usage_proc_groups,
bool &  access_to_upgrade,
bool &  access_grant_upgrade,
bool &  access_to_apply,
bool &  access_grant_apply
 

Retrieves access rights of user on partyline.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
user User name as defined in logic.txt
access_to_users Array with list of users that can modify
access_to_groups Array with list of groups that can modify
access_grant_groups Array with list of groups that can add/exclude objects to/from
access_to_proc_groups Array with list of procedure groups that can modify
access_grant_proc_groups Array with list of procedure groups that can add/exclude procedure to/from
access_grant_proc Array with list of procedures that can add/exclude procedure to/from
access_to_channel Array with list of channels that can modify
access_grant_channel Array with list of channels that can add/exclude users to/from
access_grant_partyline Set to true if can grant/deny access to partyline to users
access_to_procs Array with list of procedures that can modify
access_to_backup Has the user access to .backup command?
access_grant_backup Can the user grant access to .backup command to other user?
access_to_rehash Has the user access to .rehash command?
access_grant_rehash Can the user grant access to .rehash command to other user?
access_to_plususer Has the user access to .+user command?
access_grant_plususer Can the user grant access to .+user command to other user?
access_to_plusproc Has the user access to .+proc command?
access_grant_plusproc Can the user grant access to .+proc command to other user?
access_to_replication Can the user change replication parameters?
access_to_restart Has the user access to .restart command?
access_grant_restart Can the user grant access to .restart command to other user?
access_to_die Has the user access to .die command?
access_grant_die Can the user grant access to .die command to other user?
partyline_msg_flood Flood limit for partyline
access_to_chan_defs List of channels that the user has access to (definitions)
access_to_filesystem Has the user access to filesystem? (.filesystem)
access_grant_filesystem Can the user grant access to filesystem (.filesystem) to other user?
access_to_private Can user modify private query definitions?
access_grant_private Can user grant access to other user modify private query definitions?
access_to_can_send_all_users Can user send message / file to all users?
access_grant_can_send_all_users Can user grant access to other user to send message / file to all users?
access_to_can_send_unknown_users Can user send message / file to unknown users?
access_grant_can_send_unknown_users Can user grant access to other user to send message / file to unknown users?
access_usage_proc Array with list of procedures that can assign events to
access_usage_proc_groups Array with list groups of procedures that can assign events to
access_grant_replication Can this user grant right to change replication parameters?
access_to_upgrade Has user access to .upgrade command?
access_grant_upgrade Can this user grant accesst to .upgrade command to other user?
access_to_apply Has user access to .apply command?
access_grant_apply Can this user grant accesst to .apply command to other user?

Definition at line 10383 of file logic.cpp.

References cmp_strings_case_insensitive(), s_flood::lines, logic_erase_duplicate_or_empty_string_in_vector(), logic_eval(), r_all_groups, r_channel_defs, r_channels, r_procedures, r_users, and s_flood::seconds.

Referenced by dcc_loop_get_rights().

10384 {
10385     access_to_users.clear();
10386     access_to_groups.clear();
10387     access_grant_groups.clear();
10388     access_to_proc_groups.clear();
10389     access_grant_proc_groups.clear();
10390     access_grant_proc.clear();
10391     access_to_channel.clear();
10392     access_grant_channel.clear();
10393     access_grant_partyline=false;
10394     access_to_procs.clear();
10395     access_to_backup=access_grant_backup=access_to_rehash=access_grant_rehash=
10396         access_to_plususer=access_grant_plususer=access_to_plusproc=
10397         access_grant_plusproc=false;
10398     partyline_msg_flood.lines=0;
10399     partyline_msg_flood.seconds=0;
10400     access_to_replication=access_grant_replication=false;
10401     access_to_chan_defs.clear();
10402     access_to_restart=access_grant_restart=access_to_die=access_grant_die=
10403         access_to_filesystem=access_grant_filesystem=access_to_private=
10404         access_grant_private=access_to_can_send_all_users=
10405         access_grant_can_send_all_users=access_to_can_send_unknown_users=
10406         access_grant_can_send_unknown_users=false;
10407     access_usage_proc.clear();
10408     access_usage_proc_groups.clear();
10409     access_to_upgrade=access_grant_upgrade=false;
10410     access_to_apply=access_grant_apply=false;
10411 
10412     vector<s_user>::iterator i1;
10413     for(i1=r_users.begin(); i1!=r_users.end(); i1++) {
10414         if(!(*i1).name.compare(user)) {
10415             bool all=false;
10416             vector<string>::iterator i2;
10417             for(i2=(*i1).access_to_group.begin(); i2!=(*i1).access_to_group.end(); i2++) {
10418                 if((*i2).compare("*")) {
10419                     vector<s_user>::iterator i3;
10420                     for(i3=r_users.begin(); i3!=r_users.end(); i3++) {
10421                         vector<s_group>::iterator i4;
10422                         for(i4=(*i3).groups.begin(); i4!=(*i3).groups.end(); i4++) {
10423                             if(!(*i4).name.compare(*i2)) {
10424                                     access_to_users.push_back((*i3).name);
10425                             }
10426                         }
10427                     }
10428                 } else {
10429                     vector<s_user>::iterator i3;
10430                     for(i3=r_users.begin(); i3!=r_users.end(); i3++) {
10431                         access_to_users.push_back((*i3).name);
10432                     }
10433                     access_to_users.push_back("*");
10434                     break;
10435                 }
10436             }
10437             map<string,string> vars;
10438             all=false;
10439             for(i2=(*i1).access_to_group.begin(); i2!=(*i1).access_to_group.end(); i2++)
10440                 if((*i2).compare("*"))
10441                     access_to_groups.push_back(logic_eval(*i2,vars));
10442                     else
10443                     all=true;
10444             if(all) {
10445                 vector<s_group>::iterator i4;
10446                 for(i4=r_all_groups.begin(); i4!=r_all_groups.end(); i4++)
10447                     access_to_groups.push_back(logic_eval((*i4).name,vars));
10448                 access_to_groups.push_back("*");
10449             }
10450             all=false;
10451             for(i2=(*i1).access_grant_group.begin(); i2!=(*i1).access_grant_group.end(); i2++)
10452                 if((*i2).compare("*"))
10453                     access_grant_groups.push_back(logic_eval(*i2,vars));
10454                     else
10455                     all=true;
10456             if(all) {
10457                 vector<s_group>::iterator i4;
10458                 for(i4=r_all_groups.begin(); i4!=r_all_groups.end(); i4++)
10459                     access_grant_groups.push_back(logic_eval((*i4).name,vars));
10460                 access_grant_groups.push_back("*");
10461             }
10462 
10463             all=false;
10464             for(i2=(*i1).access_to_proc.begin(); i2!=(*i1).access_to_proc.end(); i2++)
10465                 if((*i2).compare("*"))
10466                     access_to_proc_groups.push_back(logic_eval(*i2,vars));
10467                     else
10468                     all=true;
10469             if(all) {
10470                 vector<string> got;
10471                 vector<s_procedure>::iterator i1;
10472                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++) {
10473                     vector<s_group>::iterator i2;
10474                     for(i2=(*i1).groups.begin(); i2!=(*i1).groups.end(); i2++) {
10475                         vector<string>::iterator i3;
10476                         bool got_=false;
10477                         for(i3=got.begin(); i3!=got.end(); i3++) {
10478                             if(!(*i3).compare(logic_eval((*i2).name,vars))) {
10479                                 got_=true;
10480                                 break;
10481                             }
10482                         }
10483                         if(!got_)
10484                             got.push_back(logic_eval((*i2).name,vars));
10485                     }
10486                 }
10487                 vector<string>::iterator i3;
10488                 for(i3=got.begin(); i3!=got.end(); i3++)
10489                     access_to_proc_groups.push_back(*i3);
10490                 access_to_proc_groups.push_back("*");
10491             }
10492             all=false;
10493             for(i2=(*i1).access_to_proc.begin(); i2!=(*i1).access_to_proc.end(); i2++)
10494                 if((*i2).compare("*")) {
10495                     string gr=logic_eval(*i2,vars);
10496                     vector<s_procedure>::iterator i3;
10497                     for(i3=r_procedures.begin(); i3!=r_procedures.end(); i3++) {
10498                         vector<s_group>::iterator i4;
10499                         for(i4=(*i3).groups.begin(); i4!=(*i3).groups.end(); i3++) {
10500                             if(!(*i4).name.compare(gr)) {
10501                                 access_to_procs.push_back(gr);
10502                             }
10503                         }
10504                     }
10505                 } else {
10506                     all=true;
10507                 }
10508             if(all) {
10509                 vector<string> got;
10510                 vector<s_procedure>::iterator i1;
10511                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
10512                     access_to_procs.push_back((*i1).name);
10513                 access_to_procs.push_back("*");
10514             }
10515 
10516             all=false;
10517             for(i2=(*i1).access_grant_procedure.begin(); i2!=(*i1).access_grant_procedure.end(); i2++)
10518                 if((*i2).compare("*"))
10519                     access_grant_proc_groups.push_back(logic_eval(*i2,vars));
10520                     else
10521                     all=true;
10522             if(all) {
10523                 vector<string> got;
10524                 vector<s_procedure>::iterator i1;
10525                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++) {
10526                     vector<s_group>::iterator i2;
10527                     for(i2=(*i1).groups.begin(); i2!=(*i1).groups.end(); i2++) {
10528                         vector<string>::iterator i3;
10529                         bool got_=false;
10530                         for(i3=got.begin(); i3!=got.end(); i3++) {
10531                             if(!(*i3).compare(logic_eval((*i2).name,vars))) {
10532                                 got_=true;
10533                                 break;
10534                             }
10535                         }
10536                         if(!got_)
10537                             got.push_back(logic_eval((*i2).name,vars));
10538                     }
10539                 }
10540                 vector<string>::iterator i3;
10541                 for(i3=got.begin(); i3!=got.end(); i3++)
10542                     access_grant_proc_groups.push_back(*i3);
10543                 access_grant_proc_groups.push_back("*");
10544             }
10545             all=false;
10546             for(i2=(*i1).access_grant_procedure.begin(); i2!=(*i1).access_grant_procedure.end(); i2++)
10547                 if((*i2).compare("*")) {
10548                     string gr=logic_eval(*i2,vars);
10549                     vector<s_procedure>::iterator i3;
10550                     for(i3=r_procedures.begin(); i3!=r_procedures.end(); i3++) {
10551                         vector<s_group>::iterator i4;
10552                         for(i4=(*i3).groups.begin(); i4!=(*i3).groups.end(); i3++) {
10553                             if(!(*i4).name.compare(gr)) {
10554                                 access_grant_proc.push_back(gr);
10555                             }
10556                         }
10557                     }
10558                 } else {
10559                     all=true;
10560                 }
10561             if(all) {
10562                 vector<string> got;
10563                 vector<s_procedure>::iterator i1;
10564                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
10565                     access_to_procs.push_back((*i1).name);
10566                 access_grant_proc.push_back("*");
10567             }
10568 
10569             all=false;
10570             for(i2=(*i1).access_usage_procedure.begin(); i2!=(*i1).access_usage_procedure.end(); i2++)
10571                 if((*i2).compare("*"))
10572                     access_usage_proc_groups.push_back(logic_eval(*i2,vars));
10573                     else
10574                     all=true;
10575             if(all) {
10576                 vector<string> got;
10577                 vector<s_procedure>::iterator i1;
10578                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++) {
10579                     vector<s_group>::iterator i2;
10580                     for(i2=(*i1).groups.begin(); i2!=(*i1).groups.end(); i2++) {
10581                         vector<string>::iterator i3;
10582                         bool got_=false;
10583                         for(i3=got.begin(); i3!=got.end(); i3++) {
10584                             if(!(*i3).compare(logic_eval((*i2).name,vars))) {
10585                                 got_=true;
10586                                 break;
10587                             }
10588                         }
10589                         if(!got_)
10590                             got.push_back(logic_eval((*i2).name,vars));
10591                     }
10592                 }
10593                 vector<string>::iterator i3;
10594                 for(i3=got.begin(); i3!=got.end(); i3++)
10595                     access_usage_proc_groups.push_back(*i3);
10596                 access_usage_proc_groups.push_back("*");
10597             }
10598             all=false;
10599             for(i2=(*i1).access_usage_procedure.begin(); i2!=(*i1).access_usage_procedure.end(); i2++)
10600                 if((*i2).compare("*")) {
10601                     string gr=logic_eval(*i2,vars);
10602                     vector<s_procedure>::iterator i3;
10603                     for(i3=r_procedures.begin(); i3!=r_procedures.end(); i3++) {
10604                         vector<s_group>::iterator i4;
10605                         for(i4=(*i3).groups.begin(); i4!=(*i3).groups.end(); i3++) {
10606                             if(!(*i4).name.compare(gr)) {
10607                                 access_usage_proc.push_back(gr);
10608                             }
10609                         }
10610                     }
10611                 } else {
10612                     all=true;
10613                 }
10614             if(all) {
10615                 vector<string> got;
10616                 vector<s_procedure>::iterator i1;
10617                 for(i1=r_procedures.begin(); i1!=r_procedures.end(); i1++)
10618                     access_usage_proc.push_back((*i1).name);
10619                 access_usage_proc.push_back("*");
10620             }
10621 
10622             all=false;
10623             for(i2=(*i1).access_to_channel.begin(); i2!=(*i1).access_to_channel.end(); i2++)
10624                 if((*i2).compare("*"))
10625                     access_to_channel.push_back(logic_eval(*i2,vars));
10626                     else
10627                     all=true;
10628             if(all) {
10629                 vector<string> got;
10630                 vector<s_channel>::iterator i1;
10631                 for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
10632                     /*vector<s_group>::iterator i2;
10633                     for(i2=(*i1).groups.begin(); i2!=(*i1).groups.end(); i2++) {
10634                         vector<string>::iterator i3;
10635                         bool got_=false;
10636                         for(i3=got.begin(); i3!=got.end(); i3++) {
10637                             if(!(*i3).compare(logic_eval((*i2).name,vars))) {
10638                                 got_=true;
10639                                 break;
10640                             }
10641                         }
10642                         if(!got_)
10643                             got.push_back(logic_eval((*i2).name,vars));
10644                     }*/
10645                     vector<string>::iterator i3;
10646                     bool got_=false;
10647                     for(i3=got.begin(); i3!=got.end(); i3++)
10648                         if(!cmp_strings_case_insensitive(*i3,logic_eval((*i1).channel_name,vars))) {
10649                             got_=true;
10650                             break;
10651                         }
10652                     if(!got_)
10653                         got.push_back(logic_eval((*i1).channel_name,vars));
10654                 }
10655                 vector<string>::iterator i3;
10656                 for(i3=got.begin(); i3!=got.end(); i3++)
10657                     access_to_channel.push_back(*i3);
10658                 access_to_channel.push_back("*");
10659             }
10660             all=false;
10661             for(i2=(*i1).access_grant_channel.begin(); i2!=(*i1).access_grant_channel.end(); i2++)
10662                 if((*i2).compare("*"))
10663                     access_grant_channel.push_back(logic_eval(*i2,vars));
10664                     else
10665                     all=true;
10666             if(all) {
10667                 vector<string> got;
10668                 vector<s_channel>::iterator i1;
10669                 for(i1=r_channels.begin(); i1!=r_channels.end(); i1++) {
10670                     vector<string>::iterator i3;
10671                     bool got_=false;
10672                     for(i3=got.begin(); i3!=got.end(); i3++)
10673                         if(!cmp_strings_case_insensitive(*i3,logic_eval((*i1).channel_name,vars))) {
10674                             got_=true;
10675                             break;
10676                         }
10677                     if(!got_)
10678                         got.push_back(logic_eval((*i1).channel_name,vars));
10679                 }
10680                 vector<string>::iterator i3;
10681                 for(i3=got.begin(); i3!=got.end(); i3++)
10682                     access_grant_channel.push_back(*i3);
10683                 access_grant_channel.push_back("*");
10684             }
10685             all=false;
10686             for(i2=(*i1).access_to_channel.begin(); i2!=(*i1).access_to_channel.end(); i2++)
10687                 if((*i2).compare("*"))
10688                     access_to_chan_defs.push_back(logic_eval(*i2,vars));
10689                     else
10690                     all=true;
10691             if(all) {
10692                 vector<string> got;
10693                 vector<s_channel_def>::iterator i1;
10694                 for(i1=r_channel_defs.begin(); i1!=r_channel_defs.end(); i1++) {
10695                     vector<s_group>::iterator i2;
10696                     for(i2=(*i1).groups.begin(); i2!=(*i1).groups.end(); i2++) {
10697                         vector<string>::iterator i3;
10698                         bool got_=false;
10699                         for(i3=got.begin(); i3!=got.end(); i3++)
10700                             if(!cmp_strings_case_insensitive(*i3,(*i1).channel_name)) {
10701                                 got_=true;
10702                                 break;
10703                             }
10704                         if(!got_)
10705                             got.push_back((*i1).channel_name);
10706                     }
10707                 }
10708                 vector<string>::iterator i3;
10709                 for(i3=got.begin(); i3!=got.end(); i3++)
10710                     access_to_chan_defs.push_back(*i3);
10711                 access_to_chan_defs.push_back("*");
10712             }
10713 
10714             all=false;
10715             access_grant_partyline=(*i1).access_grant_partyline;
10716 
10717             access_to_backup=(*i1).access_to_backup;
10718             access_grant_backup=(*i1).access_grant_backup;
10719             access_to_rehash=(*i1).access_to_rehash;
10720             access_grant_rehash=(*i1).access_grant_rehash;
10721 
10722             access_to_plususer=(*i1).access_to_plususer;
10723             access_grant_plususer=(*i1).access_grant_plususer;
10724 
10725             access_to_plusproc=(*i1).access_to_plusproc;
10726             access_grant_plusproc=(*i1).access_grant_plusproc;
10727 
10728             partyline_msg_flood=(*i1).partyline_msg_flood;
10729 
10730             access_to_replication=(*i1).access_to_replication;
10731             access_grant_replication=(*i1).access_grant_replication;
10732 
10733             access_to_restart=(*i1).access_to_restart;
10734             access_grant_restart=(*i1).access_grant_restart;
10735             access_to_die=(*i1).access_to_die;
10736             access_grant_die=(*i1).access_grant_die;
10737 
10738             access_to_filesystem=(*i1).access_to_filesystem;
10739             access_grant_filesystem=(*i1).access_grant_filesystem;
10740 
10741             access_to_upgrade=(*i1).access_to_upgrade;
10742             access_grant_upgrade=(*i1).access_grant_upgrade;
10743 
10744             access_to_apply=(*i1).access_to_apply;
10745             access_grant_apply=(*i1).access_grant_apply;
10746 
10747             access_to_private=(*i1).access_to_private;
10748             access_grant_private=(*i1).access_grant_private;
10749 
10750             access_to_can_send_all_users=(*i1).access_to_can_send_all_users;
10751             access_grant_can_send_all_users=(*i1).access_grant_can_send_all_users;
10752 
10753             access_to_can_send_unknown_users=(*i1).access_to_can_send_unknown_users;
10754             access_grant_can_send_unknown_users=(*i1).access_grant_can_send_unknown_users;
10755 
10756             break;
10757         }
10758     }
10759 
10760     logic_erase_duplicate_or_empty_string_in_vector(access_to_users);
10761     logic_erase_duplicate_or_empty_string_in_vector(access_to_groups);
10762     logic_erase_duplicate_or_empty_string_in_vector(access_grant_groups);
10763     logic_erase_duplicate_or_empty_string_in_vector(access_to_proc_groups);
10764     logic_erase_duplicate_or_empty_string_in_vector(access_grant_proc_groups);
10765     logic_erase_duplicate_or_empty_string_in_vector(access_grant_proc);
10766     logic_erase_duplicate_or_empty_string_in_vector(access_to_channel);
10767     logic_erase_duplicate_or_empty_string_in_vector(access_grant_channel);
10768     logic_erase_duplicate_or_empty_string_in_vector(access_to_procs);
10769     logic_erase_duplicate_or_empty_string_in_vector(access_to_chan_defs);
10770     logic_erase_duplicate_or_empty_string_in_vector(access_usage_proc);
10771     logic_erase_duplicate_or_empty_string_in_vector(access_usage_proc_groups);
10772 }

Here is the call graph for this function:

bool logic_partyline_add_channel_def s_channel_def chd  ) 
 

Adds a channel definition.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
chd Channel definition
Returns:
Returns always true

Definition at line 11369 of file logic.cpp.

References r_channel_defs.

Referenced by dcc_loop_edit_chan().

11370 {
11371     r_channel_defs.push_back(chd);
11372 
11373     return true;
11374 }

void logic_partyline_add_user s_user user,
vector< s_channel > &  channels
 

Adds an user with channels definition.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
user User definition
channels User's channels

Definition at line 11384 of file logic.cpp.

References s_user::fullname, s_user::hostmask, s_user::is_template, s_user::last_changed, s_user::name, r_channel_templates, r_channel_terminators, r_channels, r_terminators, r_user_templates, r_users, and s_user::terminator.

Referenced by dcc_loop_edit_user1(), dcc_loop_new_user(), dcc_loop_replication(), and dcc_loop_terminator().

11385 {
11386     if(user.is_template) {
11387         user.hostmask.clear();
11388         user.fullname.clear();
11389         vector<s_channel>::iterator i2;
11390 l2:
11391         for(i2=r_channel_templates.begin(); i2!=r_channel_templates.end(); i2++) {
11392             if(!(*i2).username.compare(user.name)) {
11393                 r_channel_templates.erase(i2);
11394                 goto l2;
11395             }
11396         }
11397     
11398         time(&user.last_changed);
11399         r_user_templates.push_back(user);
11400     
11401         for(i2=channels.begin(); i2!=channels.end(); i2++) {
11402             (*i2).is_template=true;
11403             if((*i2).channel_name.length()>0 && (*i2).channel_name[0]!='\"')
11404                 (*i2).channel_name="\""+(*i2).channel_name+"\"";
11405             r_channel_templates.push_back(*i2);
11406         }
11407     } else {
11408         vector<s_channel>::iterator i2;
11409 l1:
11410         for(i2=r_channels.begin(); i2!=r_channels.end(); i2++) {
11411             if(!(*i2).username.compare(user.name)) {
11412                 r_channels.erase(i2);
11413                 goto l1;
11414             }
11415         }
11416     
11417         time(&user.last_changed);
11418 
11419         if(!user.terminator) {
11420             r_users.push_back(user);
11421             for(i2=channels.begin(); i2!=channels.end(); i2++) {
11422                 (*i2).is_template=false;
11423                 (*i2).terminator=false;
11424                 if((*i2).channel_name.length()>0 && (*i2).channel_name[0]!='\"')
11425                     (*i2).channel_name="\""+(*i2).channel_name+"\"";
11426                 r_channels.push_back(*i2);
11427             }
11428         } else {
11429             r_terminators.push_back(user);
11430             for(i2=channels.begin(); i2!=channels.end(); i2++) {
11431                 (*i2).is_template=false;
11432                 (*i2).terminator=true;
11433                 if((*i2).channel_name.length()>0 && (*i2).channel_name[0]!='\"')
11434                     (*i2).channel_name="\""+(*i2).channel_name+"\"";
11435                 r_channel_terminators.push_back(*i2);
11436             }
11437         }
11438     }
11439 }

bool logic_partyline_get_channel_def string  channel_name,
s_channel_def chd
 

Gets channel definition.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
channel_name Name of the channel
chd Channel definition (case-insensitive)
Returns:
Returns true if channel was found in pre-loaded "logic.txt"

Definition at line 11331 of file logic.cpp.

References cmp_strings_case_insensitive(), and r_channel_defs.

Referenced by dcc_loop_edit_chan(), and dcc_loop_edit_dynbans().

11332 {
11333     vector<s_channel_def>::iterator i;
11334     for(i=r_channel_defs.begin(); i!=r_channel_defs.end(); i++) {
11335         if(!cmp_strings_case_insensitive((*i).channel_name,channel_name)) {
11336             chd=*i;
11337             return true;
11338         }
11339     }
11340     return false;
11341 }

Here is the call graph for this function:

void logic_partyline_get_user string  user_name,
s_user user,
vector< s_channel > &  channels
 

Retrieves an user with channels.

Author:
VooDooMan
Version:
2
Date:
2005
Parameters:
user_name Name of user as define in logic.txt
user Returns user definition
channels Returns list of channels

Definition at line 12113 of file logic.cpp.

Referenced by botnet_loop(), dcc_loop(), dcc_loop_edit_user1(), dcc_loop_filesystem(), dcc_loop_get_rights(), dcc_loop_msg(), dcc_loop_replication(), dcc_loop_terminator(), filesys_dcc_drop_notifies(), irc_check_for_filesystem(), irc_quoted_callback(), logic_exec_script(), and logic_validate_chan_mode().

12114 {
12115     user.clear();
12116     channels.clear();
12117     vector<s_user>::iterator i;
12118     vector<s_user> usrs;
12119     for(int iii=0; iii<2; iii++) {
12120         switch(iii) {
12121             case 0:
12122                 usrs=r_users;
12123                 break;
12124             case 1:
12125                 usrs=r_terminators;
12126                 break;
12127         }
12128     for(i=usrs.begin(); i!=usrs.end(); i++) {
12129         if(!(*i).name.compare(user_name)) {
12130             user=*i;
12131             vector<string> all_channels;
12132             vector<string>::iterator i4;
12133 
12134             vector<s_channel>::iterator i3;
12135             if(iii==0) {
12136                 for(i3=r_channels.begin(); i3!=r_channels.end(); i3++) {
12137                     bool got_channel=false;
12138                     for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12139                         if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12140                             got_channel=true;
12141                             break;
12142                         }
12143                     if(!got_channel)
12144                         all_channels.push_back((*i3).channel_name);
12145     
12146                     if(!(*i3).username.compare((*i).name)) {
12147                         s_channel ch=*i3;
12148                         ch.configured=true;
12149                         channels.push_back(ch);
12150                     }
12151                 }
12152             } else {
12153                 for(i3=r_channel_terminators.begin(); i3!=r_channel_terminators.end(); i3++) {
12154                     bool got_channel=false;
12155                     for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12156                         if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12157                             got_channel=true;
12158                             break;
12159                         }
12160                     if(!got_channel)
12161                         all_channels.push_back((*i3).channel_name);
12162     
12163                     if(!(*i3).username.compare((*i).name)) {
12164                         s_channel ch=*i3;
12165                         ch.configured=true;
12166                         channels.push_back(ch);
12167                     }
12168                 }
12169             }
12170         l1:
12171             if(iii==0) {
12172                 for(i3=r_channels.begin(); i3!=r_channels.end(); i3++)
12173                     if(!(*i3).username.compare((*i).name))
12174                         for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12175                             if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12176                                 all_channels.erase(i4);
12177                                 goto l1;
12178                             }
12179             } else {
12180                 for(i3=r_channel_terminators.begin(); i3!=r_channel_terminators.end(); i3++)
12181                     if(!(*i3).username.compare((*i).name))
12182                         for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12183                             if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12184                                 all_channels.erase(i4);
12185                                 goto l1;
12186                             }
12187             }
12188             vector<string>::iterator i1;
12189             for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12190                 for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
12191                     if(!(*i4).compare(*i1)) {
12192                         s_channel ch;
12193                         ch.terminator=iii==1;
12194                         ch.is_template=false;
12195                         ch.configured=false;
12196                         ch.can_send_unknown_users=false;
12197                         ch.username=user_name;
12198                         ch.channel_name=*i4;
12199                         ch.host_unknown=false;
12200                         ch.groups.clear();
12201                         ch.on_deop="";
12202                         ch.on_ban="";
12203                         ch.on_unban="";
12204                         ch.on_kick="";
12205                         ch.on_op="";
12206                         ch.on_voice="";
12207                         ch.on_devoice="";
12208                         ch.on_creator="";
12209                         ch.on_decreator="";
12210                         ch.on_join="";
12211                         ch.on_banned="";
12212                         ch.on_flood="";
12213                         ch.on_privmsg="";
12214                         ch.on_notice="";
12215                         ch.on_other_mode="";
12216                         ch.msg_flood.lines=0;
12217                         ch.msg_flood.seconds=0;
12218                         ch.notice_flood.lines=0;
12219                         ch.notice_flood.seconds=0;
12220                         ch.repeat_flood.lines=0;
12221                         ch.repeat_flood.seconds=0;
12222                         ch.nick_flood.lines=0;
12223                         ch.nick_flood.seconds=0;
12224                         ch.join_flood.lines=0;
12225                         ch.join_flood.seconds=0;
12226                         ch.mode_flood.lines=0;
12227                         ch.mode_flood.seconds=0;
12228                         ch.ctcp_flood.lines=0;
12229                         ch.ctcp_flood.seconds=0;
12230                         channels.push_back(ch);
12231                     }
12232         }
12233     }
12234     }
12235 }

void logic_partyline_get_user_template string  user_name,
s_user user,
vector< s_channel > &  channels
 

Retrieves an user template with channels.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
user_name Name of user template as define in logic.txt
user Returns user template definition
channels Returns list of channels

Definition at line 12246 of file logic.cpp.

Referenced by botnet_loop(), dcc_loop_new_user(), and dcc_loop_replication().

12247 {
12248     channels.clear();
12249     vector<s_user>::iterator i;
12250     for(i=r_user_templates.begin(); i!=r_user_templates.end(); i++) {
12251         if(!(*i).name.compare(user_name)) {
12252             user=*i;
12253             user.is_template=false;
12254             vector<string> all_channels;
12255             vector<string>::iterator i4;
12256 
12257             map<string,string> vars;
12258 
12259             vector<s_channel>::iterator i3;
12260             for(i3=r_channel_templates.begin(); i3!=r_channel_templates.end(); i3++) {
12261                 bool got_channel=false;
12262                 for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12263                     if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12264                         got_channel=true;
12265                         break;
12266                     }
12267                 if(!got_channel)
12268                     all_channels.push_back((*i3).channel_name);
12269 
12270                 if(!(*i3).username.compare((*i).name)) {
12271                     s_channel ch=*i3;
12272                     ch.configured=true;
12273                     ch.is_template=false;
12274                     channels.push_back(ch);
12275                 }
12276             }
12277         l1:
12278             for(i3=r_channel_templates.begin(); i3!=r_channel_templates.end(); i3++) {
12279                 if(!(*i3).username.compare((*i).name))
12280                     for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12281                         if(!logic_cmp_strings_case_insensitive((*i4),(*i3).channel_name)) {
12282                             all_channels.erase(i4);
12283                             goto l1;
12284                         }
12285             }
12286             vector<string>::iterator i1;
12287             for(i4=all_channels.begin(); i4!=all_channels.end(); i4++)
12288                 for(i1=(*i).access_to_channel.begin(); i1!=(*i).access_to_channel.end(); i1++)
12289                     if(!(*i4).compare(*i1)) {
12290                         s_channel ch;
12291                         ch.is_template=true;
12292                         ch.configured=false;
12293                         ch.can_send_unknown_users=false;
12294                         ch.username=user_name;
12295                         ch.channel_name=*i4;
12296                         ch.host_unknown=false;
12297                         ch.groups.clear();
12298                         ch.on_deop="";
12299                         ch.on_ban="";
12300                         ch.on_unban="";
12301                         ch.on_kick="";
12302                         ch.on_op="";
12303                         ch.on_voice="";
12304                         ch.on_devoice="";
12305                         ch.on_creator="";
12306                         ch.on_decreator="";
12307                         ch.on_join="";
12308                         ch.on_banned="";
12309                         ch.on_flood="";
12310                         ch.on_privmsg="";
12311                         ch.on_notice="";
12312                         ch.on_other_mode="";
12313                         ch.msg_flood.lines=0;
12314                         ch.msg_flood.seconds=0;
12315                         ch.notice_flood.lines=0;
12316                         ch.notice_flood.seconds=0;
12317                         ch.repeat_flood.lines=0;
12318                         ch.repeat_flood.seconds=0;
12319                         ch.nick_flood.lines=0;
12320                         ch.nick_flood.seconds=0;
12321                         ch.join_flood.lines=0;
12322                         ch.join_flood.seconds=0;
12323                         ch.mode_flood.lines=0;
12324                         ch.mode_flood.seconds=0;
12325                         ch.ctcp_flood.lines=0;
12326                         ch.ctcp_flood.seconds=0;
12327                         channels.push_back(ch);
12328                     }
12329         }
12330     }
12331 }

void logic_partyline_remove_channel_def string  channel_name  ) 
 

Deletes channel definition.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
channel_name Name of the channel

Definition at line 11350 of file logic.cpp.

References r_channel_defs.

Referenced by dcc_loop_edit_chan().

11351 {
11352     vector<s_channel_def>::iterator i;
11353     for(i=r_channel_defs.begin(); i!=r_channel_defs.end(); i++) {
11354         if(!(*i).channel_name.compare(channel_name)) {
11355             r_channel_defs.erase(i);
11356             break;
11357         }
11358     }
11359 }

char* ltoa long  value,
char *  buffer,
int  radix
 

ltoa() emulation for compiler which doesn't have it

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
value Value to convert to string
buffer Output string
radix *MUST* be 10
Returns:
Returns buffer
Bug:
radix MUST be 10!

Definition at line 171 of file dcc.cpp.

00172 {
00173     sprintf(buffer,"%ld",value);
00174     return buffer;
00175 }

void sleep int  ms  ) 
 

Sleeps.

Author:
VooDooMan
Version:
1
Date:
2004
Parameters:
ms Mili-seconds to sleep

Definition at line 226 of file irc_bot.cpp.

00227 {
00228 #ifdef _WIN32
00229     ProcessMessages();
00230     sock_send_cache();
00231     if(ms) {
00232         if(ms<1000) {
00233             long ms_remain=ms;
00234             while(ms_remain>0) {
00235                 ProcessMessages();
00236                 sock_send_cache();
00237                 int s=ms_remain>50?50:ms_remain;
00238                 Sleep(s);
00239                 ms_remain-=s;
00240                 ProcessMessages();
00241                 sock_send_cache();
00242             }
00243         } else {
00244             time_t now=time(NULL);
00245             for(;;) {
00246                 Sleep(1);
00247                 ProcessMessages();
00248                 dcc_loop();
00249                 sock_send_cache();
00250                 if(now+ms/1000<time(NULL))
00251                     break;
00252             }
00253         }
00254     }
00255     ProcessMessages();
00256 #else
00257     sock_send_cache();
00258     if(ms) {
00259         if(ms<1000) {
00260             long ms_remain=ms;
00261             while(ms_remain>0) {
00262                 sock_send_cache();
00263                 int s=ms_remain>50?50:ms_remain;
00264                 timeval tv;
00265                 tv.tv_sec=0;
00266                 tv.tv_usec=ms*1000;
00267                 select(1,NULL,NULL,NULL,&tv);
00268                 ms_remain-=s;
00269                 sock_send_cache();
00270             }
00271         } else {
00272             time_t now=time(NULL);
00273             for(;;) {
00274                 timeval tv;
00275                 tv.tv_sec=0;
00276                 tv.tv_usec=1*1000;
00277                 select(1,NULL,NULL,NULL,&tv);
00278                 dcc_loop();
00279                 sock_send_cache();
00280                 if(now+ms/1000<time(NULL))
00281                     break;
00282             }
00283         }
00284     }
00285 #endif
00286 }


Variable Documentation

vector<s_dcc_send_file> dcc_awaiting_send
 

List of files that are awaiting to send (DCC SEND) to remote host.

Definition at line 748 of file dcc.cpp.

Referenced by dcc_loop(), dcc_send_file(), and irc_quoted_callback().

vector<s_dcc_awaiting_user> dcc_awaiting_users
 

Stores users who are waiting for DCC connection.

Definition at line 133 of file dcc.cpp.

Referenced by dcc_loop(), irc_await_dcc_chat(), irc_loop_process_input(), and irc_RPL_ENDOFWHOIS().

vector<s_dcc_client> dcc_clients
 

List of DCC clients.

Definition at line 744 of file dcc.cpp.

Referenced by dcc_apply(), dcc_broadcast(), dcc_check_for_filesystem(), dcc_check_limit(), dcc_close_all(), dcc_flush_all(), dcc_get_num_of_transfers(), dcc_loop(), dcc_notify(), dcc_partyline_message(), dcc_rehashed(), dcc_user_pong(), and irc_quoted_callback().

string dcc_killing_user_eol
 

EOL string for user (DCC/telnet) who is killing the bot (.die/.restart).

Definition at line 154 of file dcc.cpp.

Referenced by dcc_loop(), dcc_upgrade(), dcc_upgrade_bot_join(), dcc_upgrade_bot_mode(), dcc_upgrade_bot_nick(), and main().

string dcc_killing_user_lang
 

Language code string for user (DCC/telnet) who is killing the bot (.die/.restart).

Definition at line 155 of file dcc.cpp.

Referenced by dcc_loop(), dcc_upgrade(), dcc_upgrade_bot_join(), dcc_upgrade_bot_mode(), and dcc_upgrade_bot_nick().

s_socket* dcc_killing_user_socket = NULL
 

Socket of DCC/telnet user who is killing the bot (.die/.restart), or NULL; (will be sent log to it).

Definition at line 153 of file dcc.cpp.

vector<s_dcc_request_whois> dcc_request_whois
 

Array, that stores DCC requests that are pending to establis, and waiting for whois result.

Definition at line 774 of file dcc.cpp.

Referenced by irc_connect(), irc_quoted_callback(), irc_RPL_WHOISOPERATOR(), and irc_RPL_WHOISUSER().

vector<s_dcc_server> dcc_servers
 

List of DCC servers.

Definition at line 745 of file dcc.cpp.

Referenced by dcc_close_servers(), dcc_get_string(), dcc_loop(), dcc_make_server(), dcc_notify(), and dcc_send_file().

vector<s_dcc_client_to_resume> dcc_to_resume
 

Temporary array for user who wants to resume.

Definition at line 750 of file dcc.cpp.

Referenced by dcc_loop(), and irc_quoted_callback().

vector<s_user_to_lock_out> dcc_users_to_lock_out
 

Users to lock out due to bad log in.

Definition at line 778 of file dcc.cpp.

Referenced by botnet_loop(), and dcc_loop().

bool dcc_want_to_die = false
 

Set to true if .die command wants to kill the bot.

Definition at line 150 of file dcc.cpp.

Referenced by dcc_loop(), handler_sighup(), handler_sigterm(), logic_exec(), logic_rehash(), main(), and write_kill_log().

bool dcc_want_to_restart = false
 

Set to true if .restart command wants to restart the bot.

Definition at line 149 of file dcc.cpp.

Referenced by dcc_loop(), log_done(), logic_exec(), logic_rehash(), main(), and write_kill_log().

bool dcc_want_to_upgrade = false
 

Set to true if .upgrade command wants to upgrade the bot.

Definition at line 151 of file dcc.cpp.

Referenced by dcc_loop(), dcc_set_password(), dcc_upgrade(), filesys_flush(), log_done(), logic_exec(), logic_on_join(), logic_on_nick_change(), logic_partyline_backup(), logic_validate(), and write_kill_log().

string dcc_who_is_killing
 

Name of user (from "logic.txt") who invoked .restart/.die command.

Definition at line 152 of file dcc.cpp.

Referenced by dcc_loop(), dcc_upgrade(), handler_sighup(), handler_sigterm(), logic_exec(), logic_rehash(), main(), and write_kill_log().

vector<s_online_channel> irc_channels
 

List of channels we are on.

Definition at line 141 of file irc.cpp.

Referenced by dcc_loop(), irc_access_to_partyline(), irc_banned(), irc_check_bans(), irc_check_flood(), irc_check_for_not_invited(), irc_check_for_not_reopped(), irc_check_invites(), irc_check_nick_on_channel(), irc_connect(), irc_disconnect(), irc_excepted(), irc_find_user(), irc_get_chan_mode(), irc_get_fullname(), irc_get_host(), irc_get_ident(), irc_get_mode(), irc_get_modes_for_log(), irc_get_nick(), irc_get_online_channel(), irc_in_reop(), irc_internal_set_mode(), irc_invited(), irc_is_ircop(), irc_is_online(), irc_loop_process_input(), irc_loop_putserv(), irc_mode_change_ban(), irc_mode_change_ban_exception(), irc_mode_change_chan_key(), irc_mode_change_chan_limit(), irc_mode_change_chan_status(), irc_mode_change_invitation(), irc_mode_change_op(), irc_mode_change_reop(), irc_on_broadcast(), irc_on_notice(), irc_on_privmsg(), irc_rehashed(), irc_RPL_324(), irc_RPL_NAMREPLY(), irc_RPL_WHOISCHANNELS(), irc_RPL_WHOISOPERATOR(), irc_RPL_WHOISUSER(), irc_unban(), irc_user_mode_change(), logic_exec(), and logic_exec_script().

char irc_nick[512]
 

Bot's current nick.

Definition at line 108 of file irc.cpp.

Referenced by dcc_loop(), irc_check_flood(), irc_connect(), irc_got_op(), irc_join(), irc_loop_process_input(), irc_loop_putserv(), irc_mode_change_creator(), irc_mode_change_op(), irc_mode_change_other(), irc_mode_change_voice(), irc_on_notice(), irc_on_privmsg(), irc_RPL_MODE(), irc_RPL_NAMREPLY(), irc_RPL_WHOISCHANNELS(), irc_RPL_WHOISUSER(), irc_user_mode_change(), logic_access_to_partyline(), logic_exec(), logic_exec_script(), logic_find_user(), logic_rehash(), logic_validate(), logic_validate_by_mask(), logic_validate_chan_key(), logic_validate_chan_limit(), logic_validate_chan_mode(), logic_validate_kick(), and logic_validate_topic().

time_t last_new_instance_join
 

After .upgrade command, there is timestamp of last new instance's join some channel.

Definition at line 156 of file dcc.cpp.

Referenced by dcc_loop(), dcc_upgrade(), and dcc_upgrade_bot_join().

vector<s_group> r_all_groups
 

List of all groups for real usage (not temporary / compilation!).

Definition at line 224 of file logic.cpp.

Referenced by dcc_loop(), logic_load_conf(), logic_partyline_access(), and logic_partyline_backup().

vector<s_channel_def> r_channel_defs
 

List of real channel definitions (not temporary / compilation!).

Definition at line 222 of file logic.cpp.

vector<s_channel> r_channel_templates
 

List of channel templates for real usage (not temporary / compilation!).

Definition at line 219 of file logic.cpp.

vector<s_channel> r_channels
 

List of channels for real usage (not temporary / compilation!).

Definition at line 218 of file logic.cpp.

s_private r_private
 

Informations about procedures when someone sends query message (not temporary / compilation!).

Definition at line 226 of file logic.cpp.

vector<s_procedure> r_procedures
 

List of procedures for real usage (not temporary / compilation!).

Definition at line 214 of file logic.cpp.

vector<s_user> r_user_templates
 

List of users templates for real usage (not temporary / compilation!).

Definition at line 216 of file logic.cpp.

vector<s_user> r_users
 

List of users for real usage (not temporary / compilation!).

Definition at line 215 of file logic.cpp.

s_ssl_conf ssl_conf
 

Configuration of SSL.

Definition at line 66 of file ssl.cpp.

vector<s_telnet_server> telnet_servers
 

List of telnet servers.

Definition at line 746 of file dcc.cpp.

Referenced by dcc_close_servers(), dcc_loop(), and dcc_make_telnet_server().

vector<s_user_to_lag> users_to_lag
 

Array of DCC requests statistics (for flood protection).

Definition at line 772 of file dcc.cpp.

Referenced by irc_quoted_callback().


Generated on Sun Jul 10 03:56:13 2005 for VooDoo cIRCle by doxygen 1.4.3

Hosted by SourceForge.net Logo