Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\FileTransfer;
|
Chris@0
|
4
|
Chris@0
|
5 /**
|
Chris@0
|
6 * Defines a file transfer class using the PHP FTP extension.
|
Chris@0
|
7 */
|
Chris@0
|
8 class FTPExtension extends FTP implements ChmodInterface {
|
Chris@0
|
9
|
Chris@0
|
10 /**
|
Chris@0
|
11 * {@inheritdoc}
|
Chris@0
|
12 */
|
Chris@0
|
13 public function connect() {
|
Chris@0
|
14 $this->connection = ftp_connect($this->hostname, $this->port);
|
Chris@0
|
15
|
Chris@0
|
16 if (!$this->connection) {
|
Chris@0
|
17 throw new FileTransferException("Cannot connect to FTP Server, check settings");
|
Chris@0
|
18 }
|
Chris@0
|
19 if (!ftp_login($this->connection, $this->username, $this->password)) {
|
Chris@0
|
20 throw new FileTransferException("Cannot log in to FTP server. Check username and password");
|
Chris@0
|
21 }
|
Chris@0
|
22 }
|
Chris@0
|
23
|
Chris@0
|
24 /**
|
Chris@0
|
25 * {@inheritdoc}
|
Chris@0
|
26 */
|
Chris@0
|
27 protected function copyFileJailed($source, $destination) {
|
Chris@0
|
28 if (!@ftp_put($this->connection, $destination, $source, FTP_BINARY)) {
|
Chris@0
|
29 throw new FileTransferException("Cannot move @source to @destination", NULL, ["@source" => $source, "@destination" => $destination]);
|
Chris@0
|
30 }
|
Chris@0
|
31 }
|
Chris@0
|
32
|
Chris@0
|
33 /**
|
Chris@0
|
34 * {@inheritdoc}
|
Chris@0
|
35 */
|
Chris@0
|
36 protected function createDirectoryJailed($directory) {
|
Chris@0
|
37 if (!ftp_mkdir($this->connection, $directory)) {
|
Chris@0
|
38 throw new FileTransferException("Cannot create directory @directory", NULL, ["@directory" => $directory]);
|
Chris@0
|
39 }
|
Chris@0
|
40 }
|
Chris@0
|
41
|
Chris@0
|
42 /**
|
Chris@0
|
43 * {@inheritdoc}
|
Chris@0
|
44 */
|
Chris@0
|
45 protected function removeDirectoryJailed($directory) {
|
Chris@0
|
46 $pwd = ftp_pwd($this->connection);
|
Chris@0
|
47 if (!ftp_chdir($this->connection, $directory)) {
|
Chris@0
|
48 throw new FileTransferException("Unable to change the current directory to @directory", NULL, ['@directory' => $directory]);
|
Chris@0
|
49 }
|
Chris@0
|
50 $list = @ftp_nlist($this->connection, '.');
|
Chris@0
|
51 if (!$list) {
|
Chris@0
|
52 $list = [];
|
Chris@0
|
53 }
|
Chris@0
|
54 foreach ($list as $item) {
|
Chris@0
|
55 if ($item == '.' || $item == '..') {
|
Chris@0
|
56 continue;
|
Chris@0
|
57 }
|
Chris@0
|
58 if (@ftp_chdir($this->connection, $item)) {
|
Chris@0
|
59 ftp_cdup($this->connection);
|
Chris@0
|
60 $this->removeDirectory(ftp_pwd($this->connection) . '/' . $item);
|
Chris@0
|
61 }
|
Chris@0
|
62 else {
|
Chris@0
|
63 $this->removeFile(ftp_pwd($this->connection) . '/' . $item);
|
Chris@0
|
64 }
|
Chris@0
|
65 }
|
Chris@0
|
66 ftp_chdir($this->connection, $pwd);
|
Chris@0
|
67 if (!ftp_rmdir($this->connection, $directory)) {
|
Chris@0
|
68 throw new FileTransferException("Unable to remove the directory @directory", NULL, ['@directory' => $directory]);
|
Chris@0
|
69 }
|
Chris@0
|
70 }
|
Chris@0
|
71
|
Chris@0
|
72 /**
|
Chris@0
|
73 * {@inheritdoc}
|
Chris@0
|
74 */
|
Chris@0
|
75 protected function removeFileJailed($destination) {
|
Chris@0
|
76 if (!ftp_delete($this->connection, $destination)) {
|
Chris@0
|
77 throw new FileTransferException("Unable to remove the file @file", NULL, ['@file' => $destination]);
|
Chris@0
|
78 }
|
Chris@0
|
79 }
|
Chris@0
|
80
|
Chris@0
|
81 /**
|
Chris@0
|
82 * {@inheritdoc}
|
Chris@0
|
83 */
|
Chris@0
|
84 public function isDirectory($path) {
|
Chris@0
|
85 $result = FALSE;
|
Chris@0
|
86 $curr = ftp_pwd($this->connection);
|
Chris@0
|
87 if (@ftp_chdir($this->connection, $path)) {
|
Chris@0
|
88 $result = TRUE;
|
Chris@0
|
89 }
|
Chris@0
|
90 ftp_chdir($this->connection, $curr);
|
Chris@0
|
91 return $result;
|
Chris@0
|
92 }
|
Chris@0
|
93
|
Chris@0
|
94 /**
|
Chris@0
|
95 * {@inheritdoc}
|
Chris@0
|
96 */
|
Chris@0
|
97 public function isFile($path) {
|
Chris@0
|
98 return ftp_size($this->connection, $path) != -1;
|
Chris@0
|
99 }
|
Chris@0
|
100
|
Chris@0
|
101 /**
|
Chris@0
|
102 * {@inheritdoc}
|
Chris@0
|
103 */
|
Chris@0
|
104 public function chmodJailed($path, $mode, $recursive) {
|
Chris@0
|
105 if (!ftp_chmod($this->connection, $mode, $path)) {
|
Chris@0
|
106 throw new FileTransferException("Unable to set permissions on %file", NULL, ['%file' => $path]);
|
Chris@0
|
107 }
|
Chris@0
|
108 if ($this->isDirectory($path) && $recursive) {
|
Chris@0
|
109 $filelist = @ftp_nlist($this->connection, $path);
|
Chris@0
|
110 if (!$filelist) {
|
Chris@0
|
111 // empty directory - returns false
|
Chris@0
|
112 return;
|
Chris@0
|
113 }
|
Chris@0
|
114 foreach ($filelist as $file) {
|
Chris@0
|
115 $this->chmodJailed($file, $mode, $recursive);
|
Chris@0
|
116 }
|
Chris@0
|
117 }
|
Chris@0
|
118 }
|
Chris@0
|
119
|
Chris@0
|
120 }
|