123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- <?php
- namespace Drupal\Core\FileTransfer;
- /**
- * Defines a file transfer class using the PHP FTP extension.
- */
- class FTPExtension extends FTP implements ChmodInterface {
- /**
- * {@inheritdoc}
- */
- public function connect() {
- $this->connection = ftp_connect($this->hostname, $this->port);
- if (!$this->connection) {
- throw new FileTransferException("Cannot connect to FTP Server, check settings");
- }
- if (!ftp_login($this->connection, $this->username, $this->password)) {
- throw new FileTransferException("Cannot log in to FTP server. Check username and password");
- }
- }
- /**
- * {@inheritdoc}
- */
- protected function copyFileJailed($source, $destination) {
- if (!@ftp_put($this->connection, $destination, $source, FTP_BINARY)) {
- throw new FileTransferException("Cannot move @source to @destination", NULL, ["@source" => $source, "@destination" => $destination]);
- }
- }
- /**
- * {@inheritdoc}
- */
- protected function createDirectoryJailed($directory) {
- if (!ftp_mkdir($this->connection, $directory)) {
- throw new FileTransferException("Cannot create directory @directory", NULL, ["@directory" => $directory]);
- }
- }
- /**
- * {@inheritdoc}
- */
- protected function removeDirectoryJailed($directory) {
- $pwd = ftp_pwd($this->connection);
- if (!ftp_chdir($this->connection, $directory)) {
- throw new FileTransferException("Unable to change the current directory to @directory", NULL, ['@directory' => $directory]);
- }
- $list = @ftp_nlist($this->connection, '.');
- if (!$list) {
- $list = [];
- }
- foreach ($list as $item) {
- if ($item == '.' || $item == '..') {
- continue;
- }
- if (@ftp_chdir($this->connection, $item)) {
- ftp_cdup($this->connection);
- $this->removeDirectory(ftp_pwd($this->connection) . '/' . $item);
- }
- else {
- $this->removeFile(ftp_pwd($this->connection) . '/' . $item);
- }
- }
- ftp_chdir($this->connection, $pwd);
- if (!ftp_rmdir($this->connection, $directory)) {
- throw new FileTransferException("Unable to remove the directory @directory", NULL, ['@directory' => $directory]);
- }
- }
- /**
- * {@inheritdoc}
- */
- protected function removeFileJailed($destination) {
- if (!ftp_delete($this->connection, $destination)) {
- throw new FileTransferException("Unable to remove the file @file", NULL, ['@file' => $destination]);
- }
- }
- /**
- * {@inheritdoc}
- */
- public function isDirectory($path) {
- $result = FALSE;
- $curr = ftp_pwd($this->connection);
- if (@ftp_chdir($this->connection, $path)) {
- $result = TRUE;
- }
- ftp_chdir($this->connection, $curr);
- return $result;
- }
- /**
- * {@inheritdoc}
- */
- public function isFile($path) {
- return ftp_size($this->connection, $path) != -1;
- }
- /**
- * {@inheritdoc}
- */
- public function chmodJailed($path, $mode, $recursive) {
- if (!ftp_chmod($this->connection, $mode, $path)) {
- throw new FileTransferException("Unable to set permissions on %file", NULL, ['%file' => $path]);
- }
- if ($this->isDirectory($path) && $recursive) {
- $filelist = @ftp_nlist($this->connection, $path);
- if (!$filelist) {
- // empty directory - returns false
- return;
- }
- foreach ($filelist as $file) {
- $this->chmodJailed($file, $mode, $recursive);
- }
- }
- }
- }
|