sThread
[ class tree: sThread ] [ index: sThread ] [ all elements ]

Source for file ftp.php

Documentation is available at ftp.php

  1. <?php
  2. /**
  3.  * sThread FTP module
  4.  * 
  5.  * @category    Network
  6.  * @package     sThread
  7.  * @subpackage  sThread_Module
  8.  * @author      JoungKyun.Kim <http://oops.org>
  9.  * @copyright   (c) 2015 OOPS.ORG
  10.  * @license     BSD License
  11.  * @version     $Id$
  12.  * @link        http://pear.oops.org/package/sThread
  13.  * @filesource
  14.  */
  15.  
  16. /**
  17.  * FTP module Class
  18.  * 
  19.  * 이 모듈은 로그인 인증까지만 테스트 한다. 데이터 커넥션
  20.  * 부분은 구현이 되어 있지 않다. 역시 ssl은 지원하지 않는다.
  21.  *
  22.  * FTP 모듈에 사용할 수 있는 모듈 option은 다음과 같다.
  23.  *
  24.  * <ul>
  25.  *     <li><b>user:</b> 로그인 유저</li>
  26.  *     <li><b>pass:</b> 로그인 암호</li>
  27.  * </ul>
  28.  *
  29.  * 예제:
  30.  * <code>
  31.  *   sThread::execute ('domain.com:21:ftp|user=>username,pass=password', 2, 'udp');
  32.  * </code>
  33.  *
  34.  * @category    Network
  35.  * @package     sThread
  36.  * @subpackage  sThread_Module
  37.  * @author      JoungKyun.Kim <http://oops.org>
  38.  * @copyright   (c) 2015 OOPS.ORG
  39.  * @license     BSD License
  40.  * @link        http://pear.oops.org/package/sThread
  41.  */
  42. Class sThread_FTP {
  43.     // {{{ Base properteis
  44.     /**#@+
  45.      * @access public
  46.      */
  47.     /**
  48.      * 이 변수의 값이 true로 셋팅이 되면, clear_session
  49.      * method를 만들어 줘야 한다. 반대로 false 상태에서는
  50.      * clear_session method가 존재하지 않아도 상관이 없다.
  51.      *
  52.      * @var bool 
  53.      */
  54.     static public $clearsession;
  55.     /**
  56.      * FTP 모듈이 사용하는 protocol
  57.      * @var string 
  58.      */
  59.     static public $protocol;
  60.     /**
  61.      * FTP 모듈이 사용하는 기본 포트 번호
  62.      * @var int 
  63.      */
  64.     static public $port;
  65.  
  66.     const FTP_BANNER      1;
  67.     const FTP_SENDUSER    2;
  68.     const FTP_USERBANNER  3;
  69.     const FTP_SENDPASS    4;
  70.     const FTP_COMFIRMAUTH 5;
  71.     /**
  72.      * 에러가 발생했을 경우, FTP_QUIT 메소드가 정의가 되어있으면,
  73.      * parent::socketColose에 의해서 자동으로 FTP_QUIT이 호출이
  74.      * 된다.
  75.      */
  76.     const FTP_QUIT        6;
  77.     const FTP_CLOSE       7;
  78.     /**#@-*/
  79.     // }}}
  80.  
  81.     // {{{ (void) sThread_FTP::__construct (void)
  82.     /**
  83.      * Class OOP 형식 초기화 메소드
  84.      * @access public
  85.      * @return sThread_FTP 
  86.      */
  87.     function __construct ({
  88.         self::init ();
  89.         $this->clearsession = &self::$clearsession;
  90.         $this->port         = &self::$port;
  91.         $this->protocol     = &self::$protocol;
  92.     }
  93.     // }}}
  94.  
  95.     // {{{ (void) sThread_FTP::init (void)
  96.     /**
  97.      * FTP 모듈을 초기화 한다.
  98.      *
  99.      * @access public
  100.      * @return void 
  101.      */
  102.     function init ({
  103.         self::$clearsession false;
  104.         self::$port         21;
  105.         self::$protocol     'tcp';
  106.     }
  107.     // }}}
  108.  
  109.     // {{{ (int) sThread_FTP::check_buf_status ($status)
  110.     /**
  111.      * 현재 상태가 event read 상태인지 event write 상태인지
  112.      * 를 판단한다.
  113.      *
  114.      * @access public
  115.      * @return int 
  116.      * @param  int    현재 status
  117.      */
  118.     function check_buf_status ($status{
  119.         switch ($status{
  120.             case :
  121.             case self::FTP_BANNER :
  122.                 return Vari::EVENT_READY_RECV;
  123.                 break;
  124.             case self::FTP_SENDUSER :
  125.                 return Vari::EVENT_READY_SEND;
  126.                 break;
  127.             case self::FTP_USERBANNER :
  128.                 return Vari::EVENT_READY_RECV;
  129.                 break;
  130.             case self::FTP_SENDPASS :
  131.                 return Vari::EVENT_READY_SEND;
  132.                 break;
  133.             case self::FTP_COMFIRMAUTH :
  134.                 return Vari::EVENT_READY_RECV;
  135.                 break;
  136.             case self::FTP_QUIT :
  137.                 return Vari::EVENT_READY_SEND;
  138.                 break;
  139.             case self::FTP_CLOSE :
  140.                 return Vari::EVENT_READY_CLOSE;
  141.                 break;
  142.             default :
  143.                 return Vari::EVENT_UNKNOWN;
  144.         }
  145.     }
  146.     // }}}
  147.  
  148.     // {{{ (string) sThread_FTP::call_status ($status, $call = false)
  149.     /**
  150.      * 현재의 status(integer) 또는 현재 status의 handler 이름을
  151.      * 반환한다.
  152.      *
  153.      * @access public
  154.      * @return int|string
  155.      * @param  int        현재 status
  156.      * @param  boolean    true로 설정했을 경우 현재 status의 handler
  157.      *                     이름을 반환한다.
  158.      */
  159.     function call_status ($status$call false{
  160.         switch ($status{
  161.             case self::FTP_BANNER :
  162.                 $r 'FTP_BANNER';
  163.                 break;
  164.             case self::FTP_SENDUSER :
  165.                 $r 'FTP_SENDUSER';
  166.                 break;
  167.             case self::FTP_USERBANNER :
  168.                 $r 'FTP_USERBANNER';
  169.                 break;
  170.             case self::FTP_SENDPASS :
  171.                 $r 'FTP_SENDPASS';
  172.                 break;
  173.             case self::FTP_COMFIRMAUTH :
  174.                 $r 'FTP_COMFIRMAUTH';
  175.                 break;
  176.             case self::FTP_QUIT:
  177.                 $r 'FTP_QUIT';
  178.                 break;
  179.             default:
  180.                 $r Vari::EVENT_UNKNOWN;
  181.         }
  182.  
  183.         if $call !== false && $r !== Vari::EVENT_UNKNOWN )
  184.             $r strtolower ($r);
  185.  
  186.         return $r;
  187.     }
  188.     // }}}
  189.  
  190.     // {{{ (boolean) sThread_FTP::change_status (&$sess, $key)
  191.     /**
  192.      * 세션의 상태를 단계로 변경한다.
  193.      *
  194.      * @access public
  195.      * @param  boolean  변경한 상태가 마지막 단계일 경우 false를
  196.      *                   반환한다.
  197.      * @param  stdClass sThread 세션 변수 reference
  198.      * @param  int      세션 키
  199.      */
  200.     function change_status (&$sess$key{
  201.         ++$sess->status[$key];
  202.  
  203.         if $sess->status[$key=== self::FTP_CLOSE )
  204.             return false;
  205.  
  206.         return true;
  207.     }
  208.     // }}}
  209.  
  210.     // {{{ (void) sThread_FTP::set_last_status (&$sess, $key)
  211.     /**
  212.      * 세션의 상태를 마지막 단계로 변경한다.
  213.      *
  214.      * @access public
  215.      * @param  stdClass sThread 세션 변수 reference
  216.      * @param  int      세션 키
  217.      */
  218.     function set_last_status (&$sess$key{
  219.         $sess->status[$keyself::FTP_CLOSE;
  220.     }
  221.     // }}}
  222.  
  223.     // {{{ (boolean) sThread_FTP::clear_session ($key) {
  224.     /**
  225.      * session에서 사용한 변수(self::$sess)의 값을 정리한다.
  226.      *
  227.      * self::$clearsession == false 일 경우, clear_session method
  228.      * 는 존재하지 않아도 된다.
  229.      *
  230.      * @access public
  231.      * @return void 
  232.      * @param  int    세션 키
  233.      */
  234.     function clear_session ($key{
  235.         return;
  236.     }
  237.     // }}}
  238.  
  239.     /*
  240.      * Handler 정의
  241.      *
  242.      * Handler는 call_status 메소드에 정의된 값들 중
  243.      * Vari::EVENT_UNKNOWN를 제외한 모든 status의 constant string을
  244.      * 소문자로해서 만들어야 한다.
  245.      *
  246.      * Handler 이름은 sThread_MODULE::call_status 메소드를
  247.      * 통해서 구할 수 있다.
  248.      *
  249.      * handler는 다음의 구조를 가지며, 실제로 전송을 하거나 받는
  250.      * 것은 libevent가 한다.
  251.      *
  252.      * write handler:
  253.      *       handler_name (&$ses, $key)
  254.      *
  255.      *       write handler는 실제로 전송을 하지 않고 전송할
  256.      *       데이터를 생성해서 반환만 한다.
  257.      *
  258.      * read handler:
  259.      *       handler_name (&$sess, $key, $recv) 
  260.      *
  261.      *       read handler의 반환값은 다음과 같이 지정을 해야 한다.
  262.      *
  263.      *       true  => 모든 전송이 완료
  264.      *       false => 전송 받을 것이 남아 있음
  265.      *       null  => 전송 중 에러 발생
  266.      *
  267.      *       이 의미는 sThread가 read handler에서 결과값에 따라
  268.      *       true는 다음 단계로 전환을 하고, false는 현 status를
  269.      *       유지하며, null의 경우 connection을 종료를 한다.
  270.      */
  271.  
  272.     // {{{ (boolean) sThread_FTP::ftp_banner (&$sess, $key, $recv)
  273.     /**
  274.      * 전송 받은 서버 배너 확인
  275.      *
  276.      * @access public
  277.      * @return bool|null
  278.      * @param  stdClass 세션 object
  279.      * @param  int      세션 키
  280.      * @param  mixed  read callback에서 전송받은 누적 데이터
  281.      */
  282.     function ftp_banner (&$sess$key$recv{
  283.         if $recv )
  284.             return false;
  285.  
  286.         list ($host$port$type$sess->addr[$key];
  287.         $sess->recv[$key.= $recv;
  288.  
  289.         if preg_match ('/^220 /'$sess->recv[$key]) )
  290.             return false;
  291.  
  292.         $sess->recv[$key'';
  293.         return true;
  294.     // }}}
  295.  
  296.     // {{{ (string) function ftp_senduser (&$sess, $key)
  297.     /**
  298.      * 전송할 유저 정보 반환
  299.      *
  300.      * @access public
  301.      * @return void 
  302.      * @param  stdCLass 세션 object
  303.      * @param  int      세션 키
  304.      */
  305.     function ftp_senduser (&$sess$key{
  306.         list ($host$port$type$sess->addr[$key];
  307.         $opt $sess->opt[$key];
  308.  
  309.         if $opt->user {
  310.             Vari::$res->status[$keyarray (
  311.                 "{$host}:{$port}",
  312.                 false,
  313.                 '[FTP] Configration error: ftp user does not set!'
  314.             );
  315.             return false;
  316.         }
  317.  
  318.         return 'User ' $opt->user "\r\n";
  319.     // }}}
  320.  
  321.     // {{{ (boolean) function ftp_comfirmauth (&$sess, $key, $recv)
  322.     /**
  323.      * 유저 정보 전송 결과 확인
  324.      *
  325.      * @access public
  326.      * @return bool|null
  327.      * @param  stdClass 세션 object
  328.      * @param  int      세션 키
  329.      * @param  mixed  read callback에서 전송받은 누적 데이터
  330.      */
  331.     function ftp_userbanner (&$sess$key$recv{
  332.         if $recv )
  333.             return false;
  334.  
  335.         list ($host$port$type$sess->addr[$key];
  336.         $sess->recv[$key.= $recv;
  337.  
  338.         if preg_match ('/^([0-9]{3}) /'$sess->recv[$key]) )
  339.             return false;
  340.  
  341.         if preg_match ('/^331 /'$sess->recv[$key]) ) {
  342.             Vari::$res->status[$keyarray (
  343.                 "{$host}:{$port}",
  344.                 false,
  345.                 '[FTP] Unknown command: '
  346.             );
  347.             $sess->recv[$key'';
  348.             return null;
  349.         }
  350.  
  351.         $sess->recv[$key'';
  352.         return true;
  353.     // }}}
  354.  
  355.     // {{{ function ftp_sendpass (&$ses, $key)
  356.     /**
  357.      * 인증 정보 반환
  358.      *
  359.      * @access public
  360.      * @return void 
  361.      * @param  stdClass 세션 object
  362.      * @param  int      세션 키
  363.      */
  364.     function ftp_sendpass (&$ses$key{
  365.         return 'Pass ' $ses->opt[$key]->pass "\r\n";
  366.     // }}}
  367.  
  368.     // {{{ (boolean) function ftp_comfirmauth (&$sess, $key, $recv)
  369.     /**
  370.      * 인증 결과 확인
  371.      *
  372.      * @access public
  373.      * @return bool|null
  374.      * @param  stdClass 세션 object
  375.      * @param  int      세션 키
  376.      * @param  mixed  read callback에서 전송받은 누적 데이터
  377.      */
  378.     function ftp_comfirmauth (&$sess$key$recv{
  379.         if $recv )
  380.             return false;
  381.  
  382.         list ($host$port$type$sess->addr[$key];
  383.         $sess->recv[$key.= $recv;
  384.  
  385.         if preg_match ('/^[0-9]{3} /m'$sess->recv[$key]) ) {
  386.             return false;
  387.         }
  388.  
  389.         if preg_match ('/^(530|500) /m'$sess->recv[$key]$m) ) {
  390.             $err ($m[1== 530'Unmatched password' 'Unknown command';
  391.             Vari::$res->status[$keyarray (
  392.                 "{$host}:{$port}",
  393.                 false,
  394.                 '[FTP] Protocol error: ' $err
  395.             );
  396.             return null;
  397.         }
  398.  
  399.         $sess->recv[$key'';
  400.         return true;
  401.     // }}}
  402.  
  403.     // {{{ (string) sThread_FTP::ftp_quit (&$sess, $key)
  404.     /**
  405.      * 종료 명령 반환
  406.      *
  407.      * @access public
  408.      * @return void 
  409.      * @param  stdClass 세션 object
  410.      * @param  int      세션 키
  411.      */
  412.     function ftp_quit (&$sess$key{
  413.         return "quit\r\n";
  414.     }
  415.     // }}}
  416. }
  417.  
  418. ?>

Documentation generated on Tue, 14 May 2019 02:00:02 +0900 by phpDocumentor 1.4.4