ФорумПрограммирование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:[email protected]'). Там, где 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" трогать нельзя остальной. с капелькой интриги)

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

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