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. |
|
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(). |
|
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(). |
|
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(). |
|
Broatcasts the message to users that matches mask on DCC/telnet connection.
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: ![]() |
|
Called to set the READ-"ed" flag and notify OWNER(s) if needed.
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: ![]() |
|
Gets MD5-encoded password for user.
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 }
|
|
Constructs response to "dcc" or "dcc <group_number>" 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: ![]() |
|
Check for pending connections and handles existing ones.
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 }
|
|
Binds DCC server.
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: ![]() |
|
Binds telnet server.
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: ![]() |
|
Notifies user about filesystem events.
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: ![]() |
|
Message for partyline channel distribution.
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: ![]() |
|
Called from logic.cpp after rehashing. Applies new configuration to all connected users on DCC/telnet (also BOTNET) connections.
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: ![]() |
|
Sends file to remote host.
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: ![]() |
|
Called in UPGRADE state, to inform user who initiated .upgrade command that another instance is on channel.
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: ![]() |
|
Called in UPGRADE state, to inform user who initiated .upgrade command that another instance on some channel gets some 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: ![]() |
|
Called in UPGRADE state, to inform user who initiated .upgrade command that another instance changed its 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: ![]() |
|
Message for partyline user's pong.
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: ![]() |