Blame view

sources/apps/files_sharing/lib/share/file.php 6.42 KB
03e52840d   Kload   Init
1
2
3
4
  <?php
  /**
  * ownCloud
  *
6d9380f96   Cédric Dupont   Update sources OC...
5
6
7
  * @author Bjoern Schiessle, Michael Gapczynski
  * @copyright 2012 Michael Gapczynski <mtgap@owncloud.com>
   *           2014 Bjoern Schiessle <schiessle@owncloud.com>
03e52840d   Kload   Init
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  * License as published by the Free Software Foundation; either
  * version 3 of the License, or any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  *
  * You should have received a copy of the GNU Affero General Public
  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
  */
  
  class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
  
  	const FORMAT_SHARED_STORAGE = 0;
  	const FORMAT_GET_FOLDER_CONTENTS = 1;
  	const FORMAT_FILE_APP_ROOT = 2;
  	const FORMAT_OPENDIR = 3;
  	const FORMAT_GET_ALL = 4;
  	const FORMAT_PERMISSIONS = 5;
6d9380f96   Cédric Dupont   Update sources OC...
31
  	const FORMAT_TARGET_NAMES = 6;
03e52840d   Kload   Init
32
33
34
35
  
  	private $path;
  
  	public function isValidSource($itemSource, $uidOwner) {
6d9380f96   Cédric Dupont   Update sources OC...
36
37
38
39
40
41
  		$path = \OC\Files\Filesystem::getPath($itemSource);
  		if ($path) {
  			// FIXME: attributes should not be set here,
  			// keeping this pattern for now to avoid unexpected
  			// regressions
  			$this->path = basename($path);
03e52840d   Kload   Init
42
43
44
45
46
47
48
49
50
51
52
53
54
  			return true;
  		}
  		return false;
  	}
  
  	public function getFilePath($itemSource, $uidOwner) {
  		if (isset($this->path)) {
  			$path = $this->path;
  			$this->path = null;
  			return $path;
  		}
  		return false;
  	}
6d9380f96   Cédric Dupont   Update sources OC...
55
56
57
58
59
60
61
  	/**
  	 * create unique target
  	 * @param string $filePath
  	 * @param string $shareWith
  	 * @param string $exclude
  	 * @return string
  	 */
03e52840d   Kload   Init
62
  	public function generateTarget($filePath, $shareWith, $exclude = null) {
f7d878ff1   kload   [enh] Update to 7...
63
64
  		$shareFolder = \OCA\Files_Sharing\Helper::getShareFolder();
  		$target = \OC\Files\Filesystem::normalizePath($shareFolder . '/' . basename($filePath));
6d9380f96   Cédric Dupont   Update sources OC...
65
66
67
68
  
  		// for group shares we return the target right away
  		if ($shareWith === false) {
  			return $target;
03e52840d   Kload   Init
69
  		}
6d9380f96   Cédric Dupont   Update sources OC...
70
71
72
  
  		\OC\Files\Filesystem::initMountPoints($shareWith);
  		$view = new \OC\Files\View('/' . $shareWith . '/files');
f7d878ff1   kload   [enh] Update to 7...
73
74
75
76
77
78
79
80
81
82
83
  
  		if (!$view->is_dir($shareFolder)) {
  			$dir = '';
  			$subdirs = explode('/', $shareFolder);
  			foreach ($subdirs as $subdir) {
  				$dir = $dir . '/' . $subdir;
  				if (!$view->is_dir($dir)) {
  					$view->mkdir($dir);
  				}
  			}
  		}
6d9380f96   Cédric Dupont   Update sources OC...
84
85
86
87
88
89
  		$excludeList = \OCP\Share::getItemsSharedWithUser('file', $shareWith, self::FORMAT_TARGET_NAMES);
  		if (is_array($exclude)) {
  			$excludeList = array_merge($excludeList, $exclude);
  		}
  
  		return \OCA\Files_Sharing\Helper::generateUniqueTarget($target, $excludeList, $view);
03e52840d   Kload   Init
90
91
92
93
94
95
96
97
98
99
  	}
  
  	public function formatItems($items, $format, $parameters = null) {
  		if ($format == self::FORMAT_SHARED_STORAGE) {
  			// Only 1 item should come through for this format call
  			return array(
  				'parent' => $items[key($items)]['parent'],
  				'path' => $items[key($items)]['path'],
  				'storage' => $items[key($items)]['storage'],
  				'permissions' => $items[key($items)]['permissions'],
6d9380f96   Cédric Dupont   Update sources OC...
100
  				'uid_owner' => $items[key($items)]['uid_owner'],
03e52840d   Kload   Init
101
102
103
104
105
106
107
108
109
110
111
112
  			);
  		} else if ($format == self::FORMAT_GET_FOLDER_CONTENTS) {
  			$files = array();
  			foreach ($items as $item) {
  				$file = array();
  				$file['fileid'] = $item['file_source'];
  				$file['storage'] = $item['storage'];
  				$file['path'] = $item['file_target'];
  				$file['parent'] = $item['file_parent'];
  				$file['name'] = basename($item['file_target']);
  				$file['mimetype'] = $item['mimetype'];
  				$file['mimepart'] = $item['mimepart'];
03e52840d   Kload   Init
113
114
115
  				$file['mtime'] = $item['mtime'];
  				$file['encrypted'] = $item['encrypted'];
  				$file['etag'] = $item['etag'];
6d9380f96   Cédric Dupont   Update sources OC...
116
117
  				$file['uid_owner'] = $item['uid_owner'];
  				$file['displayname_owner'] = $item['displayname_owner'];
a293d369c   Kload   Update sources to...
118
119
120
121
122
123
124
125
  				$storage = \OC\Files\Filesystem::getStorage('/');
  				$cache = $storage->getCache();
  				if ($item['encrypted'] or ($item['unencrypted_size'] > 0 and $cache->getMimetype($item['mimetype']) === 'httpd/unix-directory')) {
  					$file['size'] = $item['unencrypted_size'];
  					$file['encrypted_size'] = $item['size'];
  				} else {
  					$file['size'] = $item['size'];
  				}
03e52840d   Kload   Init
126
127
128
  				$files[] = $file;
  			}
  			return $files;
03e52840d   Kload   Init
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
  		} else if ($format == self::FORMAT_OPENDIR) {
  			$files = array();
  			foreach ($items as $item) {
  				$files[] = basename($item['file_target']);
  			}
  			return $files;
  		} else if ($format == self::FORMAT_GET_ALL) {
  			$ids = array();
  			foreach ($items as $item) {
  				$ids[] = $item['file_source'];
  			}
  			return $ids;
  		} else if ($format === self::FORMAT_PERMISSIONS) {
  			$filePermissions = array();
  			foreach ($items as $item) {
  				$filePermissions[$item['file_source']] = $item['permissions'];
  			}
  			return $filePermissions;
6d9380f96   Cédric Dupont   Update sources OC...
147
148
149
150
151
152
  		} else if ($format === self::FORMAT_TARGET_NAMES) {
  			$targets = array();
  			foreach ($items as $item) {
  				$targets[] = $item['file_target'];
  			}
  			return $targets;
03e52840d   Kload   Init
153
154
155
  		}
  		return array();
  	}
6d9380f96   Cédric Dupont   Update sources OC...
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
  	/**
  	 * resolve reshares to return the correct source item
  	 * @param array $source
  	 * @return array source item
  	 */
  	protected static function resolveReshares($source) {
  		if (isset($source['parent'])) {
  			$parent = $source['parent'];
  			while (isset($parent)) {
  				$query = \OC_DB::prepare('SELECT `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `id` = ?', 1);
  				$item = $query->execute(array($parent))->fetchRow();
  				if (isset($item['parent'])) {
  					$parent = $item['parent'];
  				} else {
  					$fileOwner = $item['uid_owner'];
  					break;
  				}
  			}
  		} else {
  			$fileOwner = $source['uid_owner'];
  		}
  		if (isset($fileOwner)) {
  			$source['fileOwner'] = $fileOwner;
  		} else {
  			\OCP\Util::writeLog('files_sharing', "No owner found for reshare", \OCP\Util::ERROR);
03e52840d   Kload   Init
181
  		}
6d9380f96   Cédric Dupont   Update sources OC...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
  
  		return $source;
  	}
  
  	/**
  	 * @param string $target
  	 * @param string $mountPoint
  	 * @param string $itemType
  	 * @return array|false source item
  	 */
  	public static function getSource($target, $mountPoint, $itemType) {
  		if ($itemType === 'folder') {
  			$source = \OCP\Share::getItemSharedWith('folder', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
  			if ($source && $target !== '') {
  				$source['path'] = $source['path'].'/'.$target;
03e52840d   Kload   Init
197
198
  			}
  		} else {
6d9380f96   Cédric Dupont   Update sources OC...
199
  			$source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
03e52840d   Kload   Init
200
201
  		}
  		if ($source) {
6d9380f96   Cédric Dupont   Update sources OC...
202
  			return self::resolveReshares($source);
03e52840d   Kload   Init
203
  		}
6d9380f96   Cédric Dupont   Update sources OC...
204

a293d369c   Kload   Update sources to...
205
  		\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
03e52840d   Kload   Init
206
207
208
209
  		return false;
  	}
  
  }