Source for file ftp.php
Documentation is available at ftp.php
* @subpackage sThread_Module
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2015 OOPS.ORG
* @link http://pear.oops.org/package/sThread
* 이 모듈은 로그인 인증까지만 테스트 한다. 데이터 커넥션
* 부분은 구현이 되어 있지 않다. 역시 ssl은 지원하지 않는다.
* FTP 모듈에 사용할 수 있는 모듈 option은 다음과 같다.
* <li><b>user:</b> 로그인 유저</li>
* <li><b>pass:</b> 로그인 암호</li>
* sThread::execute ('domain.com:21:ftp|user=>username,pass=password', 2, 'udp');
* @subpackage sThread_Module
* @author JoungKyun.Kim <http://oops.org>
* @copyright (c) 2015 OOPS.ORG
* @link http://pear.oops.org/package/sThread
* 이 변수의 값이 true로 셋팅이 되면, clear_session
* method를 만들어 줘야 한다. 반대로 false 상태에서는
* clear_session method가 존재하지 않아도 상관이 없다.
const FTP_USERBANNER = 3;
const FTP_COMFIRMAUTH = 5;
* 에러가 발생했을 경우, FTP_QUIT 메소드가 정의가 되어있으면,
* parent::socketColose에 의해서 자동으로 FTP_QUIT이 호출이
// {{{ (void) sThread_FTP::__construct (void)
$this->port = &self::$port;
// {{{ (void) sThread_FTP::init (void)
self::$clearsession = false;
// {{{ (int) sThread_FTP::check_buf_status ($status)
* 현재 상태가 event read 상태인지 event write 상태인지
return Vari::EVENT_READY_RECV;
case self::FTP_SENDUSER :
return Vari::EVENT_READY_SEND;
case self::FTP_USERBANNER :
return Vari::EVENT_READY_RECV;
case self::FTP_SENDPASS :
return Vari::EVENT_READY_SEND;
case self::FTP_COMFIRMAUTH :
return Vari::EVENT_READY_RECV;
return Vari::EVENT_READY_SEND;
return Vari::EVENT_READY_CLOSE;
return Vari::EVENT_UNKNOWN;
// {{{ (string) sThread_FTP::call_status ($status, $call = false)
* 현재의 status(integer) 또는 현재 status의 handler 이름을
* @param boolean true로 설정했을 경우 현재 status의 handler
case self::FTP_SENDUSER :
case self::FTP_USERBANNER :
case self::FTP_SENDPASS :
case self::FTP_COMFIRMAUTH :
$r = Vari::EVENT_UNKNOWN;
if ( $call !== false && $r !== Vari::EVENT_UNKNOWN )
// {{{ (boolean) sThread_FTP::change_status (&$sess, $key)
* @param boolean 변경한 상태가 마지막 단계일 경우 false를
* @param stdClass sThread 세션 변수 reference
if ( $sess->status[$key] === self::FTP_CLOSE )
// {{{ (void) sThread_FTP::set_last_status (&$sess, $key)
* @param stdClass sThread 세션 변수 reference
$sess->status[$key] = self::FTP_CLOSE;
// {{{ (boolean) sThread_FTP::clear_session ($key) {
* session에서 사용한 변수(self::$sess)의 값을 정리한다.
* self::$clearsession == false 일 경우, clear_session method
* Handler는 call_status 메소드에 정의된 값들 중
* Vari::EVENT_UNKNOWN를 제외한 모든 status의 constant string을
* Handler 이름은 sThread_MODULE::call_status 메소드를
* handler는 다음의 구조를 가지며, 실제로 전송을 하거나 받는
* handler_name (&$ses, $key)
* write handler는 실제로 전송을 하지 않고 전송할
* handler_name (&$sess, $key, $recv)
* read handler의 반환값은 다음과 같이 지정을 해야 한다.
* false => 전송 받을 것이 남아 있음
* 이 의미는 sThread가 read handler에서 결과값에 따라
* true는 다음 단계로 전환을 하고, false는 현 status를
* 유지하며, null의 경우 connection을 종료를 한다.
// {{{ (boolean) sThread_FTP::ftp_banner (&$sess, $key, $recv)
* @param stdClass 세션 object
* @param mixed read callback에서 전송받은 누적 데이터
list ($host, $port, $type) = $sess->addr[$key];
$sess->recv[$key] .= $recv;
if ( ! preg_match ('/^220 /', $sess->recv[$key]) )
// {{{ (string) function ftp_senduser (&$sess, $key)
* @param stdCLass 세션 object
list ($host, $port, $type) = $sess->addr[$key];
Vari::$res->status[$key] = array (
'[FTP] Configration error: ftp user does not set!'
return 'User ' . $opt->user . "\r\n";
// {{{ (boolean) function ftp_comfirmauth (&$sess, $key, $recv)
* @param stdClass 세션 object
* @param mixed read callback에서 전송받은 누적 데이터
list ($host, $port, $type) = $sess->addr[$key];
$sess->recv[$key] .= $recv;
if ( ! preg_match ('/^([0-9]{3}) /', $sess->recv[$key]) )
if ( ! preg_match ('/^331 /', $sess->recv[$key]) ) {
Vari::$res->status[$key] = array (
'[FTP] Unknown command: '
// {{{ function ftp_sendpass (&$ses, $key)
* @param stdClass 세션 object
return 'Pass ' . $ses->opt[$key]->pass . "\r\n";
// {{{ (boolean) function ftp_comfirmauth (&$sess, $key, $recv)
* @param stdClass 세션 object
* @param mixed read callback에서 전송받은 누적 데이터
list ($host, $port, $type) = $sess->addr[$key];
$sess->recv[$key] .= $recv;
if ( ! preg_match ('/^[0-9]{3} /m', $sess->recv[$key]) ) {
if ( preg_match ('/^(530|500) /m', $sess->recv[$key], $m) ) {
$err = ($m[1] == 530) ? 'Unmatched password' : 'Unknown command';
Vari::$res->status[$key] = array (
'[FTP] Protocol error: ' . $err
// {{{ (string) sThread_FTP::ftp_quit (&$sess, $key)
* @param stdClass 세션 object
|