Blame view

sources/apps/files_sharing/lib/share/file.php 6.08 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
63
  	public function generateTarget($filePath, $shareWith, $exclude = null) {
  		$target = '/'.basename($filePath);
6d9380f96   Cédric Dupont   Update sources OC...
64
65
66
67
  
  		// for group shares we return the target right away
  		if ($shareWith === false) {
  			return $target;
03e52840d   Kload   Init
68
  		}
6d9380f96   Cédric Dupont   Update sources OC...
69
70
71
72
73
74
75
76
77
  
  		\OC\Files\Filesystem::initMountPoints($shareWith);
  		$view = new \OC\Files\View('/' . $shareWith . '/files');
  		$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
78
79
80
81
82
83
84
85
86
87
  	}
  
  	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...
88
  				'uid_owner' => $items[key($items)]['uid_owner'],
03e52840d   Kload   Init
89
90
91
92
93
94
95
96
97
98
99
100
  			);
  		} 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
101
102
103
  				$file['mtime'] = $item['mtime'];
  				$file['encrypted'] = $item['encrypted'];
  				$file['etag'] = $item['etag'];
6d9380f96   Cédric Dupont   Update sources OC...
104
105
  				$file['uid_owner'] = $item['uid_owner'];
  				$file['displayname_owner'] = $item['displayname_owner'];
a293d369c   Kload   Update sources to...
106
107
108
109
110
111
112
113
  				$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
114
115
116
  				$files[] = $file;
  			}
  			return $files;
03e52840d   Kload   Init
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
  		} 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...
135
136
137
138
139
140
  		} else if ($format === self::FORMAT_TARGET_NAMES) {
  			$targets = array();
  			foreach ($items as $item) {
  				$targets[] = $item['file_target'];
  			}
  			return $targets;
03e52840d   Kload   Init
141
142
143
  		}
  		return array();
  	}
6d9380f96   Cédric Dupont   Update sources OC...
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
  	/**
  	 * 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
169
  		}
6d9380f96   Cédric Dupont   Update sources OC...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
  
  		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
185
186
  			}
  		} else {
6d9380f96   Cédric Dupont   Update sources OC...
187
  			$source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE);
03e52840d   Kload   Init
188
189
  		}
  		if ($source) {
6d9380f96   Cédric Dupont   Update sources OC...
190
  			return self::resolveReshares($source);
03e52840d   Kload   Init
191
  		}
6d9380f96   Cédric Dupont   Update sources OC...
192

a293d369c   Kload   Update sources to...
193
  		\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
03e52840d   Kload   Init
194
195
196
197
  		return false;
  	}
  
  }