dcc.h File Reference


Detailed Description

Handles DCC / telnet communication.

Definition in file dcc.h.

#include <time.h>
#include "logic.h"
#include "sock.h"
#include "filesys.h"

Include dependency graph for dcc.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  s_dcc_awaiting_user
 Stores awaiting user on DCC request to process. More...

Defines

#define DCC_ACCESS_DENIED   2
 Access denied.
#define DCC_IO_ERROR   3
 I/O error while accessing file.
#define DCC_NO_SUCH_FILE   1
 No such file.

Functions

void dcc_broadcast (string user_mask, string msg, string sender, string bot_mask)
 Broatcasts the message to users that matches mask on DCC/telnet connection.
void dcc_file_has_been_read (string public_name, string nick)
 Called to set the READ-"ed" flag and notify OWNER(s) if needed.
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_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.
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_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.


Define Documentation

#define DCC_ACCESS_DENIED   2
 

Access denied.

Definition at line 56 of file dcc.h.

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

#define DCC_IO_ERROR   3
 

I/O error while accessing file.

Definition at line 61 of file dcc.h.

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

#define DCC_NO_SUCH_FILE   1
 

No such file.

Definition at line 51 of file dcc.h.

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


Function Documentation

void dcc_broadcast string  user_mask,
string  msg,
string  sender,
string  bot_mask
 

Broatcasts the message to users that matches mask on DCC/telnet connection.

Author:
VooDooMan
Version:
1
Date:
2005
Parameters:
user_mask User mask to match
msg Message
sender Sending bot, or an empty string for local message
bot_mask Receiving bot mask, or an empty string for local message

Definition at line 19240 of file dcc.cpp.

References dcc_clients, dcc_send_msg(), lang_get_string(), lang_subst(), match(), sock_flush_later(), and sock_send_cache().

19241 {
19242     vector<s_dcc_client>::iterator i;
19243     char dcc_eol[4]="\n\0";
19244     char telnet_eol[4]="\r\n\0";
19245     for(i=dcc_clients.begin(); i!=dcc_clients.end(); i++) {
19246         if((*i).got_passwd!=3)
19247             continue;
19248         if((*i).send)
19249             continue;
19250         if((*i).send_from_filesystem)
19251             continue;
19252         if((*i).replication_partner)
19253             continue;
19254         if((*i).ssl_connection)
19255             continue;
19256         if(!(*i).chat)
19257             continue;
19258         if(match((char*)user_mask.c_str(),(char*)(*i).as_in_logic.c_str()))
19259             continue;
19260         string eol=(*i).telnet?telnet_eol:dcc_eol;
19261 
19262         // (string user_mask, string msg, string sender, string bot_mask)
19263         string message;
19264         message=lang_get_string(1,(*i).lang,693);
19265 
19266         time_t now=time(NULL);
19267         char* t1=ctime(&now);
19268         char t2[128];
19269         strcpy(t2,t1);
19270         t2[strlen(t2)-1]=0; // get rid of \n
19271 
19272         message=lang_subst(message,t2);
19273         
19274         if(sender.empty())
19275             sender=lang_get_string(1,(*i).lang,694);
19276 
19277         message=lang_subst(message,sender);
19278 
19279         string to=user_mask;
19280         if(!bot_mask.empty())
19281             to+=(string)"@"+bot_mask;
19282         message=lang_subst(message,to);
19283 
19284         message=lang_subst(message,msg);
19285 
19286         string disp=message+eol;
19287         int ec=0;
19288         dcc_send_msg((*i).socket,disp,ec);
19289         sock_send_cache();
19290         sock_flush_later((*i).socket);
19291     }
19292 }

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:

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.

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 }

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:

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_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.

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

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 }

Here is the call graph for this function:


Generated on Sun Jul 10 03:58:28 2005 for VooDoo cIRCle by doxygen 1.4.3

Hosted by SourceForge.net Logo