summaryrefslogtreecommitdiffstats
path: root/lib/private/encryption/update.php
blob: 1cfe935e584468d6a127f779b7ec900ac6483b1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<?php

/**
 * ownCloud
 *
 * @copyright (C) 2015 ownCloud, Inc.
 *
 * @author Bjoern Schiessle <schiessle@owncloud.com>
 *
 * 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/>.
 */

namespace OC\Encryption;

use \OC\Files\Mount;
use \OC\Files\View;

/**
 * update encrypted files, e.g. because a file was shared
 */
class Update {

	/** @var \OC\Files\View */
	protected $view;

	/** @var \OC\Encryption\Util */
	protected $util;

	 /** @var \OC\Files\Mount\Manager */
	protected $mountManager;

	/** @var \OC\Encryption\Manager */
	protected $encryptionManager;

	/** @var string */
	protected $uid;

	/** @var \OC\Encryption\File */
	protected $file;

	/**
	 *
	 * @param \OC\Files\View $view
	 * @param \OC\Encryption\Util $util
	 * @param \OC\Files\Mount\Manager $mountManager
	 * @param \OC\Encryption\Manager $encryptionManager
	 * @param \OC\Encryption\File $file
	 * @param string $uid
	 */
	public function __construct(
			View $view,
			Util $util,
			Mount\Manager $mountManager,
			Manager $encryptionManager,
			File $file,
			$uid
		) {

		$this->view = $view;
		$this->util = $util;
		$this->mountManager = $mountManager;
		$this->encryptionManager = $encryptionManager;
		$this->file = $file;
		$this->uid = $uid;
	}

	public function postShared($params) {
		if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
			$this->update($params['fileSource']);
		}
	}

	public function postUnshared($params) {
		if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
			$this->update($params['fileSource']);
		}
	}

	/**
	 * update keyfiles and share keys recursively
	 *
	 * @param int $fileSource file source id
	 */
	private function update($fileSource) {
		$path = \OC\Files\Filesystem::getPath($fileSource);
		$info = \OC\Files\Filesystem::getFileInfo($path);
		$owner = \OC\Files\Filesystem::getOwner($path);
		$view = new \OC\Files\View('/' . $owner . '/files');
		$ownerPath = $view->getPath($info->getId());
		$absPath = '/' . $owner . '/files' . $ownerPath;

		$mount = $this->mountManager->find($path);
		$mountPoint = $mount->getMountPoint();

		// if a folder was shared, get a list of all (sub-)folders
		if ($this->view->is_dir($absPath)) {
			$allFiles = $this->util->getAllFiles($absPath, $mountPoint);
		} else {
			$allFiles = array($absPath);
		}

		$encryptionModule = $this->encryptionManager->getDefaultEncryptionModule();

		foreach ($allFiles as $path) {
			$usersSharing = $this->file->getAccessList($path);
			$encryptionModule->update($path, $this->uid, $usersSharing);
		}
	}

}