home *** CD-ROM | disk | FTP | other *** search
/ ftp.madoka.org / 2014.12.ftp.madoka.org.tar / ftp.madoka.org / pub / plum / 2.x / plum2_28_2.lzh / module / ctcp / dcc / http.plm < prev    next >
Text File  |  1998-10-15  |  12KB  |  372 lines

  1. <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><!-- $_ if 0; # -*- perl -*-
  2. # $Id: http.plm,v 2.9 1998/09/26 14:21:40 hasegawa Exp $
  3. # copyright (c)1998 pupu_j <hasegawa@agusa.nuie.nagoya-u.ac.jp>
  4.  
  5. package ctcp_dcc_http;
  6.  
  7. $READSIZE = 4096;
  8. $CLIENTINFO = 'DCC';
  9. $SOCKADDR = 'S n N x8';
  10. $TIMEOUT = 3600;
  11.  
  12. $_ = 'ctcp_dcc_http';
  13.  
  14. sub main_loop {
  15.   local($userno) = @_;
  16.   foreach $cno (&'array($dccclientlist)) {
  17.     if (vec($'rout, $cno, 1)) {
  18.       &dcc_client($cno);
  19.       vec($'rout, $cno, 1) = 0;
  20.     } elsif (time() - $'access[$cno] > $TIMEOUT) {
  21.       &'close($cno);
  22.       $dccclientlist = &'remove($dccclientlist, $cno);
  23.       &'close($peer[$cno]);
  24.       $httpserverlist = &'remove($httpserverlist, $peer[$cno]);
  25.       $peer[$peer[$cno]] = 0;
  26.       $peer[$cno] = 0;
  27.     }
  28.   }
  29.   foreach $sno (&'array($dccserverlist)) {
  30.     if (vec($'rout, $sno, 1)) {
  31.       &dcc_server($sno);
  32.       vec($'rout, $sno, 1) = 0;
  33.     } elsif (time() - $'access[$sno] > $TIMEOUT) {
  34.       &'close($sno);
  35.       $dccserverlist = &'remove($dccserverlist, $sno);
  36.       &'close($peer[$sno]);
  37.       $httpserverlist = &'remove($httpserverlist, $peer[$sno]);
  38.       $peer[$peer[$sno]] = 0;
  39.       $peer[$sno] = 0;
  40.     }
  41.   }
  42.   foreach $sno (&'array($httpserverlist)) {
  43.     if (vec($'rout, $sno, 1)) {
  44.       &http_server($sno);
  45.       vec($'rout, $sno, 1) = 0;
  46.     } elsif (time() - $'access[$sno] > $TIMEOUT) {
  47.       &http_close($sno);
  48.     }
  49.   }
  50.   foreach $lno (&'array($dcclistenlist)) {
  51.     if (vec($'rout, $lno, 1)) {
  52.       &dcc_listen($lno);
  53.       vec($'rout, $lno, 1) = 0;
  54.     } elsif (time() - $'access[$lno] > $TIMEOUT) {
  55.       &'close($lno);
  56.       $dcclistenlist = &'remove($dcclistenlist, $lno);
  57.       &'close($peer[$lno]);
  58.       $httpserverlist = &'remove($httpserverlist, $peer[$lno]);
  59.       $peer[$peer[$lno]] = 0;
  60.       $peer[$lno] = 0;
  61.     }
  62.   }
  63. }
  64.  
  65. sub cpss_dcc {
  66.   local($serverno, $prefix, $cmd, @params) = @_;
  67.   local($userno, @msg);
  68.   $userno = $'userno[$serverno];
  69.   if (&checkmask($userno, $prefix, $params[0])) {
  70.     @msg = &server_gate($serverno, $prefix, $params[0], split(/\s+/, $params[1]));
  71.     if (@msg) {
  72.       return ($prefix, $cmd, $params[0], join(' ', @msg));
  73.     } else {
  74.       return ();
  75.     }
  76.   }
  77.   return ($prefix, $cmd, @params);
  78. }
  79.  
  80. sub cpcs_dcc {
  81.   local($clientno, $prefix, $cmd, @params) = @_;
  82.   local($userno, @msg);
  83.   $userno = $'userno[$clientno];
  84.   if (&checkmask($userno, '*!*@*', $params[0])) {
  85.     @msg = &client_gate($clientno, $prefix, $params[0], split(/\s+/, $params[1]));
  86.     if (@params) {
  87.       return ($prefix, $cmd, $params[0], join(' ', @msg));
  88.     } else {
  89.       return ();
  90.     }
  91.   }
  92.   return ($prefix, $cmd, @params);
  93. }
  94.  
  95. sub server_gate {
  96.   local($serverno, $prefix, $chan, @params) = @_;
  97.   local($lno);
  98.   return @params if scalar(@params) < 4;
  99.   if ("\L$params[0]\E" eq 'send' || "\L$params[0]\E" eq 'chat') {
  100.     $lno = &'listen(0, 1) || return @params;
  101.     $param[$lno] = &'list(@params);
  102.     $server[$lno] = $serverno;
  103.     $userno[$lno] = $'userno[$serverno];
  104.     $dcclistenlist = &'add($dcclistenlist, $lno);
  105.     $params[3] = (unpack($SOCKADDR, getsockname($'socket[$lno])))[1];
  106.     foreach $cno (&'array($'clientlist)) {
  107.       next unless $'avail[$cno];
  108.       next unless $'server[$cno] == $serverno;
  109.       $params[2] = (unpack($SOCKADDR, getsockname($'socket[$cno])))[2];
  110.       &'c_print($cno, $prefix, 'PRIVMSG', $'nick[$cno], "\cA" . join(' ', 'DCC', @params) . "\cA");
  111.     }
  112.     return ();
  113.   }
  114.   return @params;
  115. }
  116.  
  117. sub client_gate {
  118.   local($clientno, $prefix, $chan, @params) = @_;
  119.   local($userno, $proxy, $gate, $host, $port, $sno, $socket);
  120.   return @params if scalar(@params) < 4;
  121.   $userno = $'userno[$clientno];
  122.   $proxy = &'property($userno, 'proxy');
  123.   ($host, $port) = split(/\:/, $proxy);
  124.   $gate = &'property($userno, 'gateway');
  125.   if ($host && $port && $gate && ($sno = &'connect($host, $port))) {
  126.     $socket = $'socket[$sno];
  127.     print $socket 'HEAD http://', $gate, '/ HTTP/1.0', "\r\n";
  128.     print $socket "\r\n";
  129.     $param[$sno] = &'list(@params);
  130.     $server[$sno] = $'server[$clientno];
  131.     $http[$sno] = 1;
  132.     $userno[$sno] = $userno;
  133.     $rbuf[$sno] = '';
  134.     $reply[$sno] = '';
  135.     $chan[$sno] = $chan;
  136.     $httpserverlist = &'add($httpserverlist, $sno);
  137.     return ();
  138.   }
  139.   return @params;
  140. }
  141.  
  142. sub dcc_client {
  143.   local($clientno) = @_;
  144.   local($tmp, $socket);
  145.   $tmp = '';
  146.   if (sysread($'socket[$clientno], $tmp, $READSIZE)) {
  147.     $socket = $'socket[$peer[$clientno]];
  148.     print $socket $tmp if fileno($socket);
  149.   } else {
  150.     &'close($clientno);
  151.     $dccclientlist = &'remove($dccclientlist, $clientno);
  152.     &'close($peer[$clientno]);
  153.     $httpserverlist = &'remove($httpserverlist, $peer[$clientno]);
  154.     $peer[$peer[$clientno]] = 0;
  155.     $peer[$clientno] = 0;
  156.   }
  157. }
  158.  
  159. sub dcc_server {
  160.   local($serverno) = @_;
  161.   local($tmp, $socket);
  162.   $tmp = '';
  163.   if (sysread($'socket[$serverno], $tmp, $READSIZE)) {
  164.     $socket = $'socket[$peer[$serverno]];
  165.     print $socket $tmp if fileno($socket);
  166.   } else {
  167.     &'close($serverno);
  168.     $dccserverlist = &'remove($dccserverlist, $serverno);
  169.     &'close($peer[$serverno]);
  170.     $httpserverlist = &'remove($httpserverlist, $peer[$serverno]);
  171.     $peer[$peer[$serverno]] = 0;
  172.     $peer[$serverno] = 0;
  173.   }
  174. }
  175.  
  176. sub http_server {
  177.   local($serverno) = @_;
  178.   local($tmp, $next, $rest, $socket, $stat, $cno, $sno, $var, $val, $host, $port, $gate, @params);
  179.   $tmp = '';
  180.   if (sysread($'socket[$serverno], $tmp, $READSIZE)) {
  181.     if ($http[$serverno]) {
  182.       $socket = $'socket[$serverno];
  183.       $rbuf[$serverno] .= $tmp;
  184.       while ((($next, $rest) = split(/\r\n/, $rbuf[$serverno], 2)) == 2) {
  185.         $rbuf[$serverno] = $rest;
  186.         if ($next) {
  187.           $reply[$serverno] = &'add($reply[$serverno], $next);
  188.         } else {
  189.           $stat = (split(/\s+/, (&'array($reply[$serverno]))[0]))[1];
  190.           if ($stat eq '201') {
  191.             foreach $reply (&'array($reply[$serverno])) {
  192.               ($var, $val) = split(/\s*\:\s*/, $reply, 2);
  193.               if ("\L$var\E" eq 'listen') {
  194.                 ($host, $port) = split(/\//, $val);
  195.                 last;
  196.               }
  197.             }
  198.             @params = &'array($param[$serverno]);
  199.             $params[2] = $host;
  200.             $params[3] = $port;
  201.             &'s_print($server[$serverno], '', 'PRIVMSG', $chan[$serverno], "\cA" . join(' ', 'DCC', @params) . "\cA");
  202.             $gate = &'property($'userno[$server[$serverno]], 'gateway');
  203.             print $socket 'POST http://', $gate, '/ HTTP/1.0', "\r\n";
  204.             print $socket "\r\n";
  205.             $reply[$serverno] = '';
  206.           } elsif ($stat eq '202') {
  207.             @params = &'array($param[$serverno]);
  208.             if ($sno = &'connect($params[2], $params[3])) {
  209.               $http[$serverno] = 0;
  210.               $userno[$sno] = $userno[$serverno];
  211.               $dccserverlist = &'add($dccserverlist, $sno);
  212.               $peer[$serverno] = $sno;
  213.               $peer[$sno] = $serverno;
  214.               $socket = $'socket[$sno];
  215.               print $socket $rbuf[$serverno] if fileno($socket);
  216.             } else {
  217.               &http_close($serverno);
  218.             }
  219.             last;
  220.           } elsif ($stat eq '204') {
  221.             if ($cno = &'accept($peer[$serverno])) {
  222.               &'close($peer[$serverno]);
  223.               $http[$serverno] = 0;
  224.               $userno[$cno] = $userno[$serverno];
  225.               $dccclientlist = &'add($dccclientlist, $cno);
  226.               $peer[$serverno] = $cno;
  227.               $peer[$cno] = $serverno;
  228.               $socket = $'socket[$cno];
  229.               print $socket $rbuf[$serverno] if fileno($socket);
  230.             } else {
  231.               &http_close($serverno);
  232.             }
  233.             last;
  234.           } else {
  235.             &http_close($serverno);
  236.             last;
  237.           }
  238.         }
  239.       }
  240.       $rbuf[$serverno] = $next || '';
  241.     } else {
  242.       $socket = $'socket[$peer[$serverno]];
  243.       print $socket $tmp if fileno($socket);
  244.     }
  245.   } else {
  246.     &http_close($serverno);
  247.   }
  248. }
  249.  
  250. sub http_close {
  251.   local($serverno) = @_;
  252.   &'close($serverno);
  253.   $httpserverlist = &'remove($httpserverlist, $serverno);
  254.   if ($peer[$serverno]) {
  255.     &'close($peer[$serverno]);
  256.     $dcclistenlist = &'remove($dcclistenlist, $peer[$serverno]);
  257.     $dccclientlist = &'remove($dccclientlist, $peer[$serverno]);
  258.     $dccserverlist = &'remove($dccserverlist, $peer[$serverno]);
  259.     $peer[$peer[$serverno]] = 0;
  260.     $peer[$serverno] = 0;
  261.   }
  262. }
  263.  
  264. sub dcc_listen {
  265.   local($listenno) = @_;
  266.   local($cno, $sno, $userno, $proxy, $gate, $host, $port, $socket, @params);
  267.   $userno = $'userno[$server[$listenno]];
  268.   $proxy = &'property($userno, 'proxy');
  269.   ($host, $port) = split(/\:/, $proxy);
  270.   $gate = &'property($userno, 'gateway');
  271.   if ($host && $port && $gate && ($sno = &'connect($host, $port))) {
  272.     $socket = $'socket[$sno];
  273.     @params = &'array($param[$listenno]);
  274.     print $socket 'POST http://', $gate, '/', join('/', @params[2, 3]), ' HTTP/1.0', "\r\n";
  275.     print $socket "\r\n";
  276.     $http[$sno] = 1;
  277.     $userno[$sno] = $userno[$listenno];
  278.     $rbuf[$sno] = '';
  279.     $reply[$sno] = '';
  280.     $peer[$sno] = $listenno;
  281.     $peer[$listenno] = $sno;
  282.     $httpserverlist = &'add($httpserverlist, $sno);
  283.   } else {
  284.     &'close($listenno);
  285.   }
  286.   $dcclistenlist = &'remove($dcclistenlist, $lno);
  287. }
  288.  
  289. sub checkmask {
  290.   local($userno, $prefix, $chan) = @_;
  291.   local($user, $chlist, $list);
  292.   foreach $mask (&'property($userno, 'mask')) {
  293.     ($user, $chlist) = split(/\s+/, $mask);
  294.     $list = '';
  295.     foreach $vchan (split(/\,/, $chlist || '')) {
  296.       $list = &'add($list, &'real($vchan));
  297.     }
  298.     if ($chan =~ /^[\#\&\+]/) {
  299.       next unless (!$list || &'exist($list, $chan));
  300.     } else {
  301.       next unless (!$list || &'exist($list, '*'));
  302.     }
  303.     if ($user =~ /^\-/) {
  304.       $regex = &'regex(substr($user, 1));
  305.       return 0 if $prefix =~ /$regex/i;
  306.     }
  307.     if ($user =~ /^\+/) {
  308.       $regex = &'regex(substr($user, 1));
  309.     } else {
  310.       $regex = &'regex($user);
  311.     }
  312.     return 1 if $prefix =~ /$regex/i;
  313.   }
  314.   return 0;
  315. }
  316.  
  317. __END__
  318. --><HTML><HEAD>
  319. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-2022-JP">
  320. <LINK REV="made" HREF="mailto:hasegawa@agusa.nuie.nagoya-u.ac.jp">
  321. <TITLE>ctcp/dcc/http.plm</TITLE></HEAD><BODY>
  322.  
  323. $B%*%s%i%$%s%I%-%e%a%s%H(B
  324.  
  325.  
  326. <HR><H3>$BL>A0(B</H3>
  327.  
  328. ctcp/dcc/http.plm - DCC SEND$B$H(BDCC CHAT$B$r(BHTTP$B$r;H$C$FCf7Q$9$k(B
  329.  
  330.  
  331. <HR><H3>$B@bL@(B</H3>
  332.  
  333. DCC SEND$B$H(BDCC CHAT$B$N%j%/%(%9%H$,Aw$i$l$F$-$?$H$-$K!"(B
  334. HTTP$B$N(BProxy$B$rDL$7$F@\B3$rCf7Q$7$^$9!#(B
  335. $BAw$i$l$?%U%!%$%k$r(BDCC$B$H(BHTTP$B$rJQ49$9$k%2!<%H%&%'%$$rMQ$$$F(B
  336. HTTP$B$KJQ49$7!"$=$l$r$5$i$K(BDCC$B$KJQ49$7$F%/%i%$%"%s%H$KAw$j$^$9!#(B
  337.  
  338.  
  339. <HR><H3>$B%W%m%Q%F%#(B</H3>
  340.  
  341. <DL>
  342. <DT>  ctcp.dcc.http.proxy $B%[%9%HL>(B:$B%]!<%HHV9f(B
  343. </DT>
  344. <DD>    HTTP$B$N(BProxy$B$r;XDj$7$^$9!#(B
  345. </DD>
  346. <DT>  ctcp.dcc.http.gateway $B%[%9%HL>(B:$B%]!<%HHV9f(B
  347. </DT>
  348. <DD>    HTTP$B$H(BDCC$B$rJQ49$9$k%2!<%H%&%'%$$r;XDj$7$^$9!#(B
  349. </DD>
  350. <DT>  ctcp.dcc.http.mask* $B%f!<%6%^%9%/(B [($B%A%c%s%M%kL>(B)]
  351. </DT>
  352. <DD>    $B%U%!%$%k$rAw?.$7$F$-$??M$,!"$3$3$G;XDj$5$l$?$b$N$K%^%C%A$7$?$i(B
  353.         $BE>Aw$NCf7Q$r9T$$$^$9!#(B
  354. </DD>
  355. </DL>
  356.  
  357.  
  358. <HR><H3>$B@_DjNc(B</H3>
  359.  
  360. <PRE>
  361. + ctcp/dcc/http.plm
  362. ctcp.dcc.http.proxy: proxy:10080
  363. ctcp.dcc.http.gateway: caviar.agusa.nuie.nagoya-u.ac.jp:18080
  364. ctcp.dcc.http.mask: *!*@*
  365. </PRE>
  366.  
  367. HTTP$B$N(BProxy$B$H$7$F!V(Bproxy:10080$B!W$r;H$$!"(BDCC-HTTP$BJQ49$N(B
  368. $B%2!<%H%&%'%$$H$7$F!V(Bcaviar.agusa.nuie.nagoya-u.ac.jp:18080$B!W$r;HMQ$7$^$9!#(B
  369. $BC/$+$iAw?.$5$l$?$b$N$G$"$C$F$b!"E>Aw$NCf7Q$r9T$$$^$9!#(B
  370.  
  371. </BODY></HTML>
  372.