home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / plum2_33_1.lzh / module / ctcp / dcc / gate.plm < prev    next >
Text File  |  1999-03-24  |  12KB  |  435 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: gate.plm,v 2.39 1999/02/09 22:24:50 hasegawa Exp $
  3. # copyright (c)1997-1999 Yoshinori Hasegawa <hasegawa@madoka.org>
  4.  
  5. package ctcp_dcc_gate;
  6.  
  7. $RECVSIZE = 65536;
  8. $CLIENTINFO = 'DCC';
  9. $TIMEOUT = 3600;
  10.  
  11. $_ = 'ctcp_dcc_gate';
  12.  
  13. sub main_loop {
  14.   local($userno) = @_;
  15.   local($timeout);
  16.   $timeout = &'property($userno, 'timeout') || $TIMEOUT;
  17.   foreach $cno (&'array($dccclientlist)) {
  18.     next unless $userno[$cno] == $userno;
  19.     if (vec($'rout, $cno, 1)) {
  20.       &dcc_client($cno);
  21.       vec($'rout, $cno, 1) = 0;
  22.     } elsif (time() - $'access[$cno] > $timeout) {
  23.       &'close($cno);
  24.       $dccclientlist = &'remove($dccclientlist, $cno);
  25.       &'close($peer[$cno]);
  26.       $dccserverlist = &'remove($dccserverlist, $peer[$cno]);
  27.     }
  28.   }
  29.   foreach $sno (&'array($dccserverlist)) {
  30.     next unless $userno[$sno] == $userno;
  31.     if (vec($'rout, $sno, 1)) {
  32.       &dcc_server($sno);
  33.       vec($'rout, $sno, 1) = 0;
  34.     } elsif (time() - $'access[$sno] > $timeout) {
  35.       &'close($sno);
  36.       $dccserverlist = &'remove($dccserverlist, $sno);
  37.       &'close($peer[$sno]);
  38.       $dccclientlist = &'remove($dccclientlist, $peer[$sno]);
  39.     }
  40.   }
  41.   foreach $lno (&'array($dcclistenlist)) {
  42.     next unless $userno[$lno] == $userno;
  43.     if (vec($'rout, $lno, 1)) {
  44.       &dcc_accept($lno);
  45.       vec($'rout, $lno, 1) = 0;
  46.     } elsif (time() - $'access[$lno] > $timeout) {
  47.       &'close($lno);
  48.       $dcclistenlist = &'remove($dcclistenlist, $lno);
  49.     }
  50.   }
  51. }
  52.  
  53. sub module_disable {
  54.   local($userno) = @_;
  55.   foreach $cno (&'array($dccclientlist)) {
  56.     next unless $userno[$cno] == $userno;
  57.     &'close($cno);
  58.     $dccclientlist = &'remove($dccclientlist, $cno);
  59.   }
  60.   foreach $sno (&'array($dccserverlist)) {
  61.     next unless $userno[$sno] == $userno;
  62.     &'close($sno);
  63.     $dccserverlist = &'remove($dccserverlist, $sno);
  64.   }
  65.   foreach $lno (&'array($dcclistenlist)) {
  66.     next unless $userno[$lno] == $userno;
  67.     &'close($lno);
  68.     $dcclistenlist = &'remove($dcclistenlist, $lno);
  69.   }
  70.   foreach $sno (&'array($'serverlist)) {
  71.     next unless $'avail[$sno];
  72.     next unless $'userno[$sno] == $userno;
  73.     &delete_address($sno);
  74.   }
  75. }
  76.  
  77. sub server_close {
  78.   local($serverno) = @_;
  79.   &delete_address($serverno);
  80. }
  81.  
  82. sub ss_join {
  83.   local($serverno, $prefix, $cmd, @params) = @_;
  84.   local($nick);
  85.   $nick = &'prefix($prefix);
  86.   $address{$serverno, $nick} = $prefix;
  87.   return ($prefix, $cmd, @params);
  88. }
  89.  
  90. sub ss_kick {
  91.   local($serverno, $prefix, $cmd, @params) = @_;
  92.   local($nick);
  93.   $nick = &'prefix($prefix);
  94.   $address{$serverno, $nick} = $prefix;
  95.   return ($prefix, $cmd, @params);
  96. }
  97.  
  98. sub ss_mode {
  99.   local($serverno, $prefix, $cmd, @params) = @_;
  100.   local($nick);
  101.   $nick = &'prefix($prefix);
  102.   $address{$serverno, $nick} = $prefix;
  103.   return ($prefix, $cmd, @params);
  104. }
  105.  
  106. sub ss_nick {
  107.   local($serverno, $prefix, $cmd, @params) = @_;
  108.   local($nick, $user);
  109.   $nick = &'prefix($prefix);
  110.   $user = $params[0] . '!' . join('@', (&'prefix($prefix))[1, 2]);
  111.   delete $address{$serverno, $nick};
  112.   $address{$serverno, $params[0]} = $user;
  113.   return ($prefix, $cmd, @params);
  114. }
  115.  
  116. sub ss_notice {
  117.   local($serverno, $prefix, $cmd, @params) = @_;
  118.   local($nick);
  119.   $nick = &'prefix($prefix);
  120.   $address{$serverno, $nick} = $prefix;
  121.   return ($prefix, $cmd, @params);
  122. }
  123.  
  124. sub ss_part {
  125.   local($serverno, $prefix, $cmd, @params) = @_;
  126.   local($nick);
  127.   $nick = &'prefix($prefix);
  128.   $address{$serverno, $nick} = $prefix;
  129.   return ($prefix, $cmd, @params);
  130. }
  131.  
  132. sub ss_privmsg {
  133.   local($serverno, $prefix, $cmd, @params) = @_;
  134.   local($nick);
  135.   $nick = &'prefix($prefix);
  136.   $address{$serverno, $nick} = $prefix;
  137.   return ($prefix, $cmd, @params);
  138. }
  139.  
  140. sub ss_quit {
  141.   local($serverno, $prefix, $cmd, @params) = @_;
  142.   local($nick);
  143.   $nick = &'prefix($prefix);
  144.   delete $address{$serverno, $nick};
  145.   return ($prefix, $cmd, @params);
  146. }
  147.  
  148. sub ss_topic {
  149.   local($serverno, $prefix, $cmd, @params) = @_;
  150.   local($nick);
  151.   $nick = &'prefix($prefix);
  152.   $address{$serverno, $nick} = $prefix;
  153.   return ($prefix, $cmd, @params);
  154. }
  155.  
  156. sub ss_302 {
  157.   local($serverno, $prefix, $cmd, @params) = @_;
  158.   local($nick, $user);
  159.   if ($params[1]) {
  160.     ($nick, $user) = split(/\*?\=[\+\-]/, $params[1]);
  161.     $address{$serverno, $nick} = $nick . '!' . $user;
  162.   }
  163.   return ($prefix, $cmd, @params);
  164. }
  165.  
  166. sub ss_311 {
  167.   local($serverno, $prefix, $cmd, @params) = @_;
  168.   local($user);
  169.   $address{$serverno, $params[1]} = $params[1] . '!' . $params[2] . '@' . $params[3];
  170.   return ($prefix, $cmd, @params);
  171. }
  172.  
  173. sub ss_352 {
  174.   local($serverno, $prefix, $cmd, @params) = @_;
  175.   local($nick, $user);
  176.   $address{$serverno, $params[5]} = $params[5] . '!' . $params[2] . '@' . $params[3];
  177.   return ($prefix, $cmd, @params);
  178. }
  179.  
  180. sub cpss_dcc {
  181.   local($serverno, $prefix, $cmd, @params) = @_;
  182.   local($userno, $regex, @msg);
  183.   $userno = $'userno[$serverno];
  184.   if (&check_mask($userno, $prefix, $params[0])) {
  185.     @msg = &server_gate($serverno, $prefix, split(/\s+/, $params[1]));
  186.     if (@msg) {
  187.       $params[1] = join(' ', @msg);
  188.       return ($prefix, $cmd, @params);
  189.     } else {
  190.       return ();
  191.     }
  192.   }
  193.   return ($prefix, $cmd, @params);
  194. }
  195.  
  196. sub cpcs_dcc {
  197.   local($clientno, $prefix, $cmd, @params) = @_;
  198.   local($userno, $regex, @msg, $user, $info, $nick);
  199.   $userno = $'userno[$clientno];
  200.   $user = $address{$'server[$clientno], $params[0]};
  201.   if (!$user) {
  202.     foreach $known (&'property($userno, 'known')) {
  203.       ($info, $nick) = split(/\s+/, $known);
  204.       if (!$nick || &'exist(&'list(split(/\,/, $nick)), $params[0])) {
  205.         $user = $info;
  206.         last;
  207.       }
  208.     }
  209.     if (!$user) {
  210.       $user = &'user($clientno);
  211.     }
  212.   }
  213.   if (&check_mask($userno, $user, $params[0])) {
  214.     @msg = &client_gate($clientno, $user, split(/\s+/, $params[1]));
  215.     if (@msg) {
  216.       $params[1] = join(' ', @msg);
  217.       return ($prefix, $cmd, @params);
  218.     } else {
  219.       return ();
  220.     }
  221.   }
  222.   return ($prefix, $cmd, @params);
  223. }
  224.  
  225. sub delete_address {
  226.   local($sno) = @_;
  227.   local($no, $nick);
  228.   foreach $key (keys(%address)) {
  229.     ($no, $nick) = split(/$;/, $key, 2);
  230.     next unless $no == $sno;
  231.     delete $address{$key};
  232.   }
  233. }
  234.  
  235. sub dcc_client {
  236.   local($clientno) = @_;
  237.   local($socket, $tmp, $recv);
  238.   $tmp = '';
  239.   $recv = &'property($userno[$clientno], 'recvsize') || $RECVSIZE;
  240.   if (sysread($'socket[$clientno], $tmp, $recv)) {
  241.     $socket = $'socket[$peer[$clientno]];
  242.     print $socket $tmp if fileno($socket);
  243.   } else {
  244.     &'close($clientno);
  245.     $dccclientlist = &'remove($dccclientlist, $clientno);
  246.     &'close($peer[$clientno]);
  247.     $dccserverlist = &'remove($dccserverlist, $peer[$clientno]);
  248.   }
  249. }
  250.  
  251. sub dcc_server {
  252.   local($serverno) = @_;
  253.   local($socket, $tmp, $recv);
  254.   $tmp = '';
  255.   $recv = &'property($userno[$serverno], 'recvsize') || $RECVSIZE;
  256.   if (sysread($'socket[$serverno], $tmp, $recv)) {
  257.     $socket = $'socket[$peer[$serverno]];
  258.     print $socket $tmp if fileno($socket);
  259.   } else {
  260.     &'close($serverno);
  261.     $dccserverlist = &'remove($dccserverlist, $serverno);
  262.     &'close($peer[$serverno]);
  263.     $dccclientlist = &'remove($dccclientlist, $peer[$serverno]);
  264.   }
  265. }
  266.  
  267. sub dcc_accept {
  268.   local($listenno) = @_;
  269.   local($cno, $sno, @params);
  270.   if ($cno = &'accept($listenno)) {
  271.     $userno[$cno] = $userno[$listenno];
  272.     @params = &'array($request[$listenno]);
  273.     if ($sno = &'connect($params[2], $params[3])) {
  274.       $userno[$sno] = $userno[$listenno];
  275.       $peer[$cno] = $sno;
  276.       $peer[$sno] = $cno;
  277.       $dccclientlist = &'add($dccclientlist, $cno);
  278.       $dccserverlist = &'add($dccserverlist, $sno);
  279.     } else {
  280.       &'close($cno);
  281.     }
  282.   }
  283.   &'close($listenno);
  284.   $dcclistenlist = &'remove($dcclistenlist, $listenno);
  285. }
  286.  
  287. sub server_gate {
  288.   local($serverno, $prefix, @params) = @_;
  289.   local($lno, $host, $port);
  290.   if ("\L$params[0]\E" eq 'send' || "\L$params[0]\E" eq 'chat') {
  291.     $lno = &'listen(0, 1) || return @params;
  292.     $userno[$lno] = $'userno[$serverno];
  293.     $request[$lno] = &'list(@params);
  294.     $dcclistenlist = &'add($dcclistenlist, $lno);
  295.     $params[3] = (&'sockname($lno))[0];
  296.     foreach $cno (&'array($'clientlist)) {
  297.       next unless $'avail[$cno];
  298.       next unless $'server[$cno] == $serverno;
  299.       $params[2] = (&'sockname($cno))[1];
  300.       &'c_print($cno, $prefix, 'PRIVMSG', $'nick[$cno], "\cA" . join(' ', 'DCC', @params) . "\cA");
  301.     }
  302.     return ();
  303.   } elsif ("\L$params[0]\E" eq 'cancel') {
  304.     $host = (&'sockname($serverno))[1];
  305.     if ($host == $params[2]) {
  306.       foreach $lno (&'array($dcclistenlist)) {
  307.         $port = (&'sockname($lno))[0];
  308.         next unless $port == $params[3];
  309.         &'close($lno);
  310.         $dcclistenlist = &'remove($dcclistenlist, $lno);
  311.         &'close($peer[$lno]);
  312.         return ();
  313.       }
  314.     }
  315.   }
  316.   return @params;
  317. }
  318.  
  319. sub client_gate {
  320.   local($clientno, $prefix, @params) = @_;
  321.   local($lno, $host, $port, $sno);
  322.   $sno = $'server[$clientno];
  323.   if ("\L$params[0]\E" eq 'send' || "\L$params[0]\E" eq 'chat') {
  324.     $lno = &'listen(0, 1) || return @params;
  325.     $userno[$lno] = $'userno[$clientno];
  326.     $request[$lno] = &'list(@params);
  327.     $dcclistenlist = &'add($dcclistenlist, $lno);
  328.     $params[2] = (&'sockname($sno))[1];
  329.     $params[3] = (&'sockname($lno))[0];
  330.   } elsif ("\L$params[0]\E" eq 'cancel') {
  331.     foreach $lno (&'array($dcclistenlist)) {
  332.       $port = (&'sockname($lno))[0];
  333.       next unless $port == $params[3];
  334.       foreach $cno (&'array($'clientlist)) {
  335.         next unless $'avail[$cno];
  336.         next unless $'server[$cno] == $sno;
  337.         $host = (&'sockname($cno))[1];
  338.         next unless $host == $params[2];
  339.         &'close($lno);
  340.         $dcclistenlist = &'remove($dcclistenlist, $lno);
  341.         &'close($peer[$lno]);
  342.         return ();
  343.       }
  344.     }
  345.   }
  346.   return @params;
  347. }
  348.  
  349. sub check_mask {
  350.   local($userno, $prefix, $chan) = @_;
  351.   local($user, $chlist, $list);
  352.   foreach $mask (&'property($userno, 'mask')) {
  353.     ($user, $chlist) = split(/\s+/, $mask);
  354.     $list = '';
  355.     foreach $vchan (split(/\,/, $chlist || '')) {
  356.       $list = &'add($list, &'real($vchan));
  357.     }
  358.     if (&'channel($chan)) {
  359.       next unless (!$list || &'exist($list, $chan));
  360.     } else {
  361.       next unless (!$list || &'exist($list, '*'));
  362.     }
  363.     if ($user =~ /^\-/) {
  364.       $regex = &'regex(substr($user, 1));
  365.       return 0 if $prefix =~ /$regex/i;
  366.     }
  367.     if ($user =~ /^\+/) {
  368.       $regex = &'regex(substr($user, 1));
  369.     } else {
  370.       $regex = &'regex($user);
  371.     }
  372.     return 1 if $prefix =~ /$regex/i;
  373.   }
  374.   return 0;
  375. }
  376.  
  377. __END__
  378. --><HTML><HEAD>
  379. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  380. <LINK REV="made" HREF="mailto:hasegawa@madoka.org">
  381. <TITLE>ctcp/dcc.gate.plm</TITLE></HEAD><BODY>
  382.  
  383. $B%*%s%i%$%s%I%-%e%a%s%H(B
  384.  
  385.  
  386. <HR><H3>$BL>A0(B</H3>
  387.  
  388. ctcp/dcc/gate.plm - CTCP DCC SEND$B$KH?1~$7$FE>Aw$NCf7Q$r9T$&(B
  389.  
  390.  
  391. <HR><H3>$B@bL@(B</H3>
  392.  
  393. CTCP DCC SNED$B$,Aw$i$l$F$-$?$H$-!"(B
  394. $BAw$j85$H%/%i%$%"%s%H$N4V$N%U%!%$%k$NAw<u?.$NCf7Q$r9T$$$^$9!#(B
  395.  
  396.  
  397. <HR><H3>$B%W%m%Q%F%#(B</H3>
  398.  
  399. <DL>
  400. <DT>  ctcp.dcc.gate.mask* $B%f!<%6%^%9%/(B [($B%A%c%s%M%kL>(B)]
  401. </DT>
  402. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i!"(B
  403.         $B%U%!%$%k$NE>Aw$rCf7Q$7$^$9!#(B
  404. </DD>
  405. <DT>  ctcp.dcc.gate.known $B%f!<%6>pJs(B ($B%K%C%/%M!<%`(B)
  406. </DT>
  407. <DD>    DCC$B$rAw$kAj<j$N%f!<%6>pJs$,$o$+$i$J$$$?$a$K!"E>Aw$r(B
  408.         $BCf7Q$7$F$$$$$+$I$&$+H=CG$G$-$J$$$H$-!"$3$3$G;XDj%f!<%6>pJs$r(B
  409.         $B;2>H$7$FH=CG$7$^$9!#$3$3$G$bH=CG$G$-$J$+$C$?>l9g$OBe$o$j$K<+J,$N(B
  410.         $B%f!<%6>pJs$r;2>H$7$^$9!#(B
  411. </DD>
  412. </DL>
  413.  
  414.  
  415. <HR><H3>$B@_DjNc(B</H3>
  416.  
  417. <PRE>
  418. + ctcp/dcc/gate.plm
  419. ctcp.dcc.gate.mask: -*!*@*.nagoya-u.ac.jp
  420. ctcp.dcc.gate.mask: *!*@*
  421. ctcp.dcc.gate.known: plum!plum@agusa.nuie.nagoya-u.ac.jp plum,plum_d
  422. ctcp.dcc.gate.known: unknown!unknown@unknown.jp
  423. </PRE>
  424.  
  425. $B%U%!%$%k$rAw$C$F$-$??M!"$b$7$/$OAw$m$&$H$7$??M$,(B
  426. $B!V(B*!*@*.nagoya-u.ac.jp$B!W$K%^%C%A$7$J$1$l$P!"E>Aw$NCf7Q$r9T$$$^$9!#(B
  427. $B$^$?!"%U%!%$%k$rAw$m$&$H$7$??M$N%f!<%6>pJs$,$o$+$i$J$$$H$-!"(B
  428. $B$=$N?M$N%K%C%/%M!<%`$,!V(Bplum$B!W$+!V(Bplum_d$B!W$J$i$P!"%f!<%6>pJs$H$7$F!"(B
  429. $B!V(Bplum!plum@agusa.nuie.nagoya-u.ac.jp$B!W$r;HMQ$7$^$9!#(B
  430. $B$=$l0J30$N%K%C%/%M!<%`$N?M$KBP$7$F$O!V(Bunknown!unknown@unknown.jp$B!W$r(B
  431. $B;HMQ$7$^$9!#(B
  432.  
  433.  
  434. </BODY></HTML>
  435.