ФорумПрограммированиеPHP для идиотов → Сраный FTP (part 2)

Сраный FTP (part 2)

  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 5 марта 2014 г. 14:37

    Продолжение http://pyha.ru/forum/topic/8526
    Дядя Дуд оказался прав, видимо проблема таки в этом http://stackoverflow.com/questions/9574104/ftp-reports-644-on-file-but-is-writablefile-returns-false
    Примаунтить диск, конечно можно, но уж очень много маунтить придется. Другой сраный пазл заключается вот в чём:

    На сервере поднят FTP, есть обычный скрипт, который стучится на свой же FTP, и запрашивает права на файл (is_writable('ftp://user:pass@mysite/httpd')). Бочина в том, что если этот файл запускаешь из консоли (от root-а) эта хрень работает, от апача нет! Добавил пользователей user, ftp, www-data в группы ftp, www-data, один хрен никаких результатов. Обзваонил админов, они тоже в потерях, ведь по сути, реакция должна быть на user:pass а не на пользователя, запустившего скрипт. Может быть у кого есть any ideas?
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 5 марта 2014 г. 14:45, спустя 7 минут 44 секунды

    реакция должна быть на user:pass а не на пользователя, запустившего скрипт. Может быть у кого есть any ideas?

    Эрекция. вот тебе и "грабле-похапэ".

    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 5 марта 2014 г. 15:23, спустя 38 минут 21 секунду

    я думаю ты не решишь эту проблему. я бы на твоем месте уже альтернативы поискал)))

    банально оптимальный в ситуациия "нихочу ничо писать" это конечно mount какой либо сетевой фс на папку и работа с ней.

    Спустя 93 сек.

    либо можно быть охуевшим хитровыебаным гавнюком))))) и через PHP: stream_wrapper_register - Manual [th1.php.net] заимплементить свой ftp wrapper :D

    ну это я считаю классикой и пойдешь ли ты на это - тебе решать)))

    Спустя 144 сек.

    если пойдешь по этому пути, классец покажи, ну так, чисто поржать ))

    Сапожник без сапог
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 5 марта 2014 г. 15:30, спустя 6 минут 48 секунд

    О блять, Дуд, тебя точно донатить надо, хотя бы за то, что вьехал в проблему :) Ковырялся уже, сука, везде. Cli и apache конфиги одинаковые. Отпишусь чо и как, если победю
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 5 марта 2014 г. 15:33, спустя 3 минуты 31 секунду

    @Josh, давай, но я бы по пути "классики" пошел))) чтобы еще чтото запомнить среди этих серых будней 😺

    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 12 марта 2014 г. 18:23, спустя 7 дней 2 часа 50 минут

    решил проблему то?

    Сапожник без сапог
  • Josh

    Сообщения: 2008 Репутация: N Группа: Кто попало

    Spritz 14 марта 2014 г. 15:00, спустя 1 день 20 часов 36 минут

    вспомнил. Забыл отписатся. Да. Написал врапер. Криво, но исходя из ситуации и таска. обращаюсь теперь так: fopen('ttp://user:pass@host.com'). Там, где ftp работает корректно оставил, так как есть;

     function stream_open($path, $mode, $options, &$opened_path) {
    		$stream_options = array('ftp' => array('overwrite' => true));
    		$stream_context = stream_context_create($stream_options);
        	$this->handle = fopen(str_replace('ttp://', 'ftp://', $path), $mode, $options, $stream_context);
           	$url = parse_url($path);
           	$this->path = $path;
           	$this->conn_id = ftp_connect($url['host']);
            $this->url_path = $url['path'];
            $this->resource = ftp_login($this->conn_id, $url['user'], $url['pass']);
            return is_resource($this->conn_id);
        }


    public function stream_write($string){
       return fwrite($this->handle, $string);
    }


    function unlink($path){
    		return unlink(str_replace('ttp://', 'ftp://', $path));
    }


    Основная проблема это url_stat, которая некорректно отрабатывала, сначала прицепил заглушку, она отдавала всегда 777 (0040777 и 0777), при чём надо было понимать где dir, а где нет, потому как is_dir, использующий эту функцию так же криво работал. В итоге, решил ходить по http, и спрашивать права на удаленном сервере. Права апача, или нжинкса, сервере короче, конечно должнв быть такие же как и у фтп юзера:
    function url_stat($path) {
    		$url = parse_url($path);
    		$stat_path = 'http://' . $url['host'] . '/fstat/?p=' . $url['path'] ;
    		$stat = file_get_contents($stat_path);
    		$stat = unserialize($stat);
    		return $stat;
    		/*$stat = @stat(str_replace('ttp://', 'ftp://', $path));
    		if($stat){
    			$mode = $stat['mode'];
    			if($mode == 16804){//dir
    				$mode = 0040777;
    			} else {
    				$mode = 0777;
    			}
      			
    			$stat['mode'] = $mode;
    			return $stat;	
    		} else {
    			return false;
    		}
    		
    		//$perms = fileperms(str_replace('ttp://', 'ftp://', $path));
    		$mode = 0777; // There are no protections on this, so all writable.
    		$mode = 0040777; // There are no protections on this, so all writable.
    	    $return = array(
    	      'dev' => 1, 
    	      'ino' => 1, 
    	      'mode' => $mode, 
    	      'nlink' => 0, 
    	      'uid' => 0, 
    	      'gid' => 0, 
    	      'rdev' => 0, 
    	      'size' => 0, 
    	      'atime' => 0, 
    	      'mtime' => 0, 
    	      'ctime' => 0, 
    	      'blksize' => 0, 
    	      'blocks' => 0,
    	    );
    	  
    	  	return $return;*/
        }

    камменты оставил, возможно кому пригодятся
    и на сервере соответственно:
    $path = isset($_GET['p']) ? $_GET['p'] : null;
        	$result = false;
        	if($path){
        		$file = trim(trim(DOCROOT_PATH, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . trim($path, DIRECTORY_SEPARATOR), DIRECTORY_SEPARATOR);    		
        		if(file_exists($file)){
        			$result = stat($file);
        		}    		
        	}
        	echo serialize($result);
        	die();


    Весь код ложить в готовые решения, да и сюда, думаю смысла нет: писал быстро, и под конкретную цель.

    Спустя 136 сек.

    И да: ещё раз спасибо Дуду, за то, что показал пальцем куда смотреть
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 14 марта 2014 г. 15:03, спустя 2 минуты 50 секунд

    @Josh, ебать мой хуй))

    ну и костыль вышел, но это тру! харкор в самом непревзойденном виде, как я люблю! :-)

    красава, плюс не могу поставить, джангодевы проебали карму гдето. хоть вмз шли)

    Спустя 38 сек.

    а так, вполне себе хороший лайфхак с переопределением stream'а на мой взгляд. когда "back box" трогать нельзя остальной. с капелькой интриги)

    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!