Completed
Push — master ( 49662f...f67d94 )
by Joas
99:38 queued 81:58
created
apps/files_external/lib/Command/Config.php 1 patch
Indentation   +77 added lines, -77 removed lines patch added patch discarded remove patch
@@ -32,87 +32,87 @@
 block discarded – undo
32 32
 use Symfony\Component\Console\Output\OutputInterface;
33 33
 
34 34
 class Config extends Base {
35
-	/**
36
-	 * @var GlobalStoragesService
37
-	 */
38
-	protected $globalService;
35
+    /**
36
+     * @var GlobalStoragesService
37
+     */
38
+    protected $globalService;
39 39
 
40
-	function __construct(GlobalStoragesService $globalService) {
41
-		parent::__construct();
42
-		$this->globalService = $globalService;
43
-	}
40
+    function __construct(GlobalStoragesService $globalService) {
41
+        parent::__construct();
42
+        $this->globalService = $globalService;
43
+    }
44 44
 
45
-	protected function configure() {
46
-		$this
47
-			->setName('files_external:config')
48
-			->setDescription('Manage backend configuration for a mount')
49
-			->addArgument(
50
-				'mount_id',
51
-				InputArgument::REQUIRED,
52
-				'The id of the mount to edit'
53
-			)->addArgument(
54
-				'key',
55
-				InputArgument::REQUIRED,
56
-				'key of the config option to set/get'
57
-			)->addArgument(
58
-				'value',
59
-				InputArgument::OPTIONAL,
60
-				'value to set the config option to, when no value is provided the existing value will be printed'
61
-			);
62
-		parent::configure();
63
-	}
45
+    protected function configure() {
46
+        $this
47
+            ->setName('files_external:config')
48
+            ->setDescription('Manage backend configuration for a mount')
49
+            ->addArgument(
50
+                'mount_id',
51
+                InputArgument::REQUIRED,
52
+                'The id of the mount to edit'
53
+            )->addArgument(
54
+                'key',
55
+                InputArgument::REQUIRED,
56
+                'key of the config option to set/get'
57
+            )->addArgument(
58
+                'value',
59
+                InputArgument::OPTIONAL,
60
+                'value to set the config option to, when no value is provided the existing value will be printed'
61
+            );
62
+        parent::configure();
63
+    }
64 64
 
65
-	protected function execute(InputInterface $input, OutputInterface $output) {
66
-		$mountId = $input->getArgument('mount_id');
67
-		$key = $input->getArgument('key');
68
-		try {
69
-			$mount = $this->globalService->getStorage($mountId);
70
-		} catch (NotFoundException $e) {
71
-			$output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>');
72
-			return 404;
73
-		}
65
+    protected function execute(InputInterface $input, OutputInterface $output) {
66
+        $mountId = $input->getArgument('mount_id');
67
+        $key = $input->getArgument('key');
68
+        try {
69
+            $mount = $this->globalService->getStorage($mountId);
70
+        } catch (NotFoundException $e) {
71
+            $output->writeln('<error>Mount with id "' . $mountId . ' not found, check "occ files_external:list" to get available mounts"</error>');
72
+            return 404;
73
+        }
74 74
 
75
-		$value = $input->getArgument('value');
76
-		if ($value) {
77
-			$this->setOption($mount, $key, $value, $output);
78
-		} else {
79
-			$this->getOption($mount, $key, $output);
80
-		}
81
-	}
75
+        $value = $input->getArgument('value');
76
+        if ($value) {
77
+            $this->setOption($mount, $key, $value, $output);
78
+        } else {
79
+            $this->getOption($mount, $key, $output);
80
+        }
81
+    }
82 82
 
83
-	/**
84
-	 * @param StorageConfig $mount
85
-	 * @param string $key
86
-	 * @param OutputInterface $output
87
-	 */
88
-	protected function getOption(StorageConfig $mount, $key, OutputInterface $output) {
89
-		if ($key === 'mountpoint' || $key === 'mount_point') {
90
-			$value = $mount->getMountPoint();
91
-		} else {
92
-			$value = $mount->getBackendOption($key);
93
-		}
94
-		if (!is_string($value) && json_decode(json_encode($value)) === $value) { // show bools and objects correctly
95
- 			$value = json_encode($value);
96
- 		}
97
-		$output->writeln($value);
98
-	}
83
+    /**
84
+     * @param StorageConfig $mount
85
+     * @param string $key
86
+     * @param OutputInterface $output
87
+     */
88
+    protected function getOption(StorageConfig $mount, $key, OutputInterface $output) {
89
+        if ($key === 'mountpoint' || $key === 'mount_point') {
90
+            $value = $mount->getMountPoint();
91
+        } else {
92
+            $value = $mount->getBackendOption($key);
93
+        }
94
+        if (!is_string($value) && json_decode(json_encode($value)) === $value) { // show bools and objects correctly
95
+                $value = json_encode($value);
96
+            }
97
+        $output->writeln($value);
98
+    }
99 99
 
100
-	/**
101
-	 * @param StorageConfig $mount
102
-	 * @param string $key
103
-	 * @param string $value
104
-	 * @param OutputInterface $output
105
-	 */
106
-	protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) {
107
-		$decoded = json_decode($value, true);
108
- 		if (!is_null($decoded) && json_encode($decoded) === $value) {
109
- 			$value = $decoded;
110
- 		}
111
-		if ($key === 'mountpoint' || $key === 'mount_point') {
112
-			$mount->setMountPoint($value);
113
-		} else {
114
-			$mount->setBackendOption($key, $value);
115
-		}
116
-		$this->globalService->updateStorage($mount);
117
-	}
100
+    /**
101
+     * @param StorageConfig $mount
102
+     * @param string $key
103
+     * @param string $value
104
+     * @param OutputInterface $output
105
+     */
106
+    protected function setOption(StorageConfig $mount, $key, $value, OutputInterface $output) {
107
+        $decoded = json_decode($value, true);
108
+            if (!is_null($decoded) && json_encode($decoded) === $value) {
109
+                $value = $decoded;
110
+            }
111
+        if ($key === 'mountpoint' || $key === 'mount_point') {
112
+            $mount->setMountPoint($value);
113
+        } else {
114
+            $mount->setBackendOption($key, $value);
115
+        }
116
+        $this->globalService->updateStorage($mount);
117
+    }
118 118
 }
Please login to merge, or discard this patch.
lib/private/Accounts/Hooks.php 1 patch
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -27,73 +27,73 @@
 block discarded – undo
27 27
 
28 28
 class Hooks {
29 29
 
30
-	/** @var  AccountManager */
31
-	private $accountManager = null;
32
-
33
-	/** @var ILogger */
34
-	private $logger;
35
-
36
-	/**
37
-	 * Hooks constructor.
38
-	 *
39
-	 * @param ILogger $logger
40
-	 */
41
-	public function __construct(ILogger $logger) {
42
-		$this->logger = $logger;
43
-	}
44
-
45
-	/**
46
-	 * update accounts table if email address or display name was changed from outside
47
-	 *
48
-	 * @param array $params
49
-	 */
50
-	public function changeUserHook($params) {
51
-
52
-		$accountManager = $this->getAccountManager();
53
-
54
-		/** @var IUser $user */
55
-		$user = isset($params['user']) ? $params['user'] : null;
56
-		$feature = isset($params['feature']) ? $params['feature'] : null;
57
-		$newValue = isset($params['value']) ? $params['value'] : null;
58
-
59
-		if (is_null($user) || is_null($feature) || is_null($newValue)) {
60
-			$this->logger->warning('Missing expected parameters in change user hook');
61
-			return;
62
-		}
63
-
64
-		$accountData = $accountManager->getUser($user);
65
-
66
-		switch ($feature) {
67
-			case 'eMailAddress':
68
-				if ($accountData[AccountManager::PROPERTY_EMAIL]['value'] !== $newValue) {
69
-					$accountData[AccountManager::PROPERTY_EMAIL]['value'] = $newValue;
70
-					$accountManager->updateUser($user, $accountData);
71
-				}
72
-				break;
73
-			case 'displayName':
74
-				if ($accountData[AccountManager::PROPERTY_DISPLAYNAME]['value'] !== $newValue) {
75
-					$accountData[AccountManager::PROPERTY_DISPLAYNAME]['value'] = $newValue;
76
-					$accountManager->updateUser($user, $accountData);
77
-				}
78
-				break;
79
-		}
80
-
81
-	}
82
-
83
-	/**
84
-	 * return instance of accountManager
85
-	 *
86
-	 * @return AccountManager
87
-	 */
88
-	protected function getAccountManager() {
89
-		if (is_null($this->accountManager)) {
90
-			$this->accountManager = new AccountManager(
91
-				\OC::$server->getDatabaseConnection(),
92
-				\OC::$server->getEventDispatcher(),
93
-				\OC::$server->getJobList()
94
-			);
95
-		}
96
-		return $this->accountManager;
97
-	}
30
+    /** @var  AccountManager */
31
+    private $accountManager = null;
32
+
33
+    /** @var ILogger */
34
+    private $logger;
35
+
36
+    /**
37
+     * Hooks constructor.
38
+     *
39
+     * @param ILogger $logger
40
+     */
41
+    public function __construct(ILogger $logger) {
42
+        $this->logger = $logger;
43
+    }
44
+
45
+    /**
46
+     * update accounts table if email address or display name was changed from outside
47
+     *
48
+     * @param array $params
49
+     */
50
+    public function changeUserHook($params) {
51
+
52
+        $accountManager = $this->getAccountManager();
53
+
54
+        /** @var IUser $user */
55
+        $user = isset($params['user']) ? $params['user'] : null;
56
+        $feature = isset($params['feature']) ? $params['feature'] : null;
57
+        $newValue = isset($params['value']) ? $params['value'] : null;
58
+
59
+        if (is_null($user) || is_null($feature) || is_null($newValue)) {
60
+            $this->logger->warning('Missing expected parameters in change user hook');
61
+            return;
62
+        }
63
+
64
+        $accountData = $accountManager->getUser($user);
65
+
66
+        switch ($feature) {
67
+            case 'eMailAddress':
68
+                if ($accountData[AccountManager::PROPERTY_EMAIL]['value'] !== $newValue) {
69
+                    $accountData[AccountManager::PROPERTY_EMAIL]['value'] = $newValue;
70
+                    $accountManager->updateUser($user, $accountData);
71
+                }
72
+                break;
73
+            case 'displayName':
74
+                if ($accountData[AccountManager::PROPERTY_DISPLAYNAME]['value'] !== $newValue) {
75
+                    $accountData[AccountManager::PROPERTY_DISPLAYNAME]['value'] = $newValue;
76
+                    $accountManager->updateUser($user, $accountData);
77
+                }
78
+                break;
79
+        }
80
+
81
+    }
82
+
83
+    /**
84
+     * return instance of accountManager
85
+     *
86
+     * @return AccountManager
87
+     */
88
+    protected function getAccountManager() {
89
+        if (is_null($this->accountManager)) {
90
+            $this->accountManager = new AccountManager(
91
+                \OC::$server->getDatabaseConnection(),
92
+                \OC::$server->getEventDispatcher(),
93
+                \OC::$server->getJobList()
94
+            );
95
+        }
96
+        return $this->accountManager;
97
+    }
98 98
 
99 99
 }
Please login to merge, or discard this patch.
apps/dav/lib/Migration/BuildCalendarSearchIndex.php 1 patch
Indentation   +45 added lines, -45 removed lines patch added patch discarded remove patch
@@ -30,57 +30,57 @@
 block discarded – undo
30 30
 
31 31
 class BuildCalendarSearchIndex implements IRepairStep {
32 32
 
33
-	/** @var IDBConnection */
34
-	private $db;
33
+    /** @var IDBConnection */
34
+    private $db;
35 35
 
36
-	/** @var IJobList */
37
-	private $jobList;
36
+    /** @var IJobList */
37
+    private $jobList;
38 38
 
39
-	/** @var IConfig */
40
-	private $config;
39
+    /** @var IConfig */
40
+    private $config;
41 41
 
42
-	/**
43
-	 * @param IDBConnection $db
44
-	 * @param IJobList $jobList
45
-	 * @param IConfig $config
46
-	 */
47
-	public function __construct(IDBConnection $db,
48
-								IJobList $jobList,
49
-								IConfig $config) {
50
-		$this->db = $db;
51
-		$this->jobList = $jobList;
52
-		$this->config = $config;
53
-	}
42
+    /**
43
+     * @param IDBConnection $db
44
+     * @param IJobList $jobList
45
+     * @param IConfig $config
46
+     */
47
+    public function __construct(IDBConnection $db,
48
+                                IJobList $jobList,
49
+                                IConfig $config) {
50
+        $this->db = $db;
51
+        $this->jobList = $jobList;
52
+        $this->config = $config;
53
+    }
54 54
 
55
-	/**
56
-	 * @return string
57
-	 */
58
-	public function getName() {
59
-		return 'Registering building of calendar search index as background job';
60
-	}
55
+    /**
56
+     * @return string
57
+     */
58
+    public function getName() {
59
+        return 'Registering building of calendar search index as background job';
60
+    }
61 61
 
62
-	/**
63
-	 * @param IOutput $output
64
-	 */
65
-	public function run(IOutput $output) {
66
-		// only run once
67
-		if ($this->config->getAppValue('dav', 'buildCalendarSearchIndex') === 'yes') {
68
-			$output->info('Repair step already executed');
69
-			return;
70
-		}
62
+    /**
63
+     * @param IOutput $output
64
+     */
65
+    public function run(IOutput $output) {
66
+        // only run once
67
+        if ($this->config->getAppValue('dav', 'buildCalendarSearchIndex') === 'yes') {
68
+            $output->info('Repair step already executed');
69
+            return;
70
+        }
71 71
 
72
-		$query = $this->db->getQueryBuilder();
73
-		$query->select($query->createFunction('MAX(id)'))
74
-			->from('calendarobjects');
75
-		$maxId = (int)$query->execute()->fetchColumn();
72
+        $query = $this->db->getQueryBuilder();
73
+        $query->select($query->createFunction('MAX(id)'))
74
+            ->from('calendarobjects');
75
+        $maxId = (int)$query->execute()->fetchColumn();
76 76
 
77
-		$output->info('Add background job');
78
-		$this->jobList->add(BuildCalendarSearchIndexBackgroundJob::class, [
79
-			'offset' => 0,
80
-			'stopAt' => $maxId
81
-		]);
77
+        $output->info('Add background job');
78
+        $this->jobList->add(BuildCalendarSearchIndexBackgroundJob::class, [
79
+            'offset' => 0,
80
+            'stopAt' => $maxId
81
+        ]);
82 82
 
83
-		// if all were done, no need to redo the repair during next upgrade
84
-		$this->config->setAppValue('dav', 'buildCalendarSearchIndex', 'yes');
85
-	}
83
+        // if all were done, no need to redo the repair during next upgrade
84
+        $this->config->setAppValue('dav', 'buildCalendarSearchIndex', 'yes');
85
+    }
86 86
 }
87 87
\ No newline at end of file
Please login to merge, or discard this patch.
apps/dav/lib/SystemTag/SystemTagPlugin.php 1 patch
Indentation   +276 added lines, -276 removed lines patch added patch discarded remove patch
@@ -46,280 +46,280 @@
 block discarded – undo
46 46
  */
47 47
 class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
48 48
 
49
-	// namespace
50
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
51
-	const ID_PROPERTYNAME = '{http://owncloud.org/ns}id';
52
-	const DISPLAYNAME_PROPERTYNAME = '{http://owncloud.org/ns}display-name';
53
-	const USERVISIBLE_PROPERTYNAME = '{http://owncloud.org/ns}user-visible';
54
-	const USERASSIGNABLE_PROPERTYNAME = '{http://owncloud.org/ns}user-assignable';
55
-	const GROUPS_PROPERTYNAME = '{http://owncloud.org/ns}groups';
56
-	const CANASSIGN_PROPERTYNAME = '{http://owncloud.org/ns}can-assign';
57
-
58
-	/**
59
-	 * @var \Sabre\DAV\Server $server
60
-	 */
61
-	private $server;
62
-
63
-	/**
64
-	 * @var ISystemTagManager
65
-	 */
66
-	protected $tagManager;
67
-
68
-	/**
69
-	 * @var IUserSession
70
-	 */
71
-	protected $userSession;
72
-
73
-	/**
74
-	 * @var IGroupManager
75
-	 */
76
-	protected $groupManager;
77
-
78
-	/**
79
-	 * @param ISystemTagManager $tagManager tag manager
80
-	 * @param IGroupManager $groupManager
81
-	 * @param IUserSession $userSession
82
-	 */
83
-	public function __construct(ISystemTagManager $tagManager,
84
-								IGroupManager $groupManager,
85
-								IUserSession $userSession) {
86
-		$this->tagManager = $tagManager;
87
-		$this->userSession = $userSession;
88
-		$this->groupManager = $groupManager;
89
-	}
90
-
91
-	/**
92
-	 * This initializes the plugin.
93
-	 *
94
-	 * This function is called by \Sabre\DAV\Server, after
95
-	 * addPlugin is called.
96
-	 *
97
-	 * This method should set up the required event subscriptions.
98
-	 *
99
-	 * @param \Sabre\DAV\Server $server
100
-	 * @return void
101
-	 */
102
-	public function initialize(\Sabre\DAV\Server $server) {
103
-
104
-		$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
105
-
106
-		$server->protectedProperties[] = self::ID_PROPERTYNAME;
107
-
108
-		$server->on('propFind', array($this, 'handleGetProperties'));
109
-		$server->on('propPatch', array($this, 'handleUpdateProperties'));
110
-		$server->on('method:POST', [$this, 'httpPost']);
111
-
112
-		$this->server = $server;
113
-	}
114
-
115
-	/**
116
-	 * POST operation on system tag collections
117
-	 *
118
-	 * @param RequestInterface $request request object
119
-	 * @param ResponseInterface $response response object
120
-	 * @return null|false
121
-	 */
122
-	public function httpPost(RequestInterface $request, ResponseInterface $response) {
123
-		$path = $request->getPath();
124
-
125
-		// Making sure the node exists
126
-		$node = $this->server->tree->getNodeForPath($path);
127
-		if ($node instanceof SystemTagsByIdCollection || $node instanceof SystemTagsObjectMappingCollection) {
128
-			$data = $request->getBodyAsString();
129
-
130
-			$tag = $this->createTag($data, $request->getHeader('Content-Type'));
131
-
132
-			if ($node instanceof SystemTagsObjectMappingCollection) {
133
-				// also add to collection
134
-				$node->createFile($tag->getId());
135
-				$url = $request->getBaseUrl() . 'systemtags/';
136
-			} else {
137
-				$url = $request->getUrl();
138
-			}
139
-
140
-			if ($url[strlen($url) - 1] !== '/') {
141
-				$url .= '/';
142
-			}
143
-
144
-			$response->setHeader('Content-Location', $url . $tag->getId());
145
-
146
-			// created
147
-			$response->setStatus(201);
148
-			return false;
149
-		}
150
-	}
151
-
152
-	/**
153
-	 * Creates a new tag
154
-	 *
155
-	 * @param string $data JSON encoded string containing the properties of the tag to create
156
-	 * @param string $contentType content type of the data
157
-	 * @return ISystemTag newly created system tag
158
-	 *
159
-	 * @throws BadRequest if a field was missing
160
-	 * @throws Conflict if a tag with the same properties already exists
161
-	 * @throws UnsupportedMediaType if the content type is not supported
162
-	 */
163
-	private function createTag($data, $contentType = 'application/json') {
164
-		if (explode(';', $contentType)[0] === 'application/json') {
165
-			$data = json_decode($data, true);
166
-		} else {
167
-			throw new UnsupportedMediaType();
168
-		}
169
-
170
-		if (!isset($data['name'])) {
171
-			throw new BadRequest('Missing "name" attribute');
172
-		}
173
-
174
-		$tagName = $data['name'];
175
-		$userVisible = true;
176
-		$userAssignable = true;
177
-
178
-		if (isset($data['userVisible'])) {
179
-			$userVisible = (bool)$data['userVisible'];
180
-		}
181
-
182
-		if (isset($data['userAssignable'])) {
183
-			$userAssignable = (bool)$data['userAssignable'];
184
-		}
185
-
186
-		$groups = [];
187
-		if (isset($data['groups'])) {
188
-			$groups = $data['groups'];
189
-			if (is_string($groups)) {
190
-				$groups = explode('|', $groups);
191
-			}
192
-		}
193
-
194
-		if($userVisible === false || $userAssignable === false || !empty($groups)) {
195
-			if(!$this->userSession->isLoggedIn() || !$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
196
-				throw new BadRequest('Not sufficient permissions');
197
-			}
198
-		}
199
-
200
-		try {
201
-			$tag = $this->tagManager->createTag($tagName, $userVisible, $userAssignable);
202
-			if (!empty($groups)) {
203
-				$this->tagManager->setTagGroups($tag, $groups);
204
-			}
205
-			return $tag;
206
-		} catch (TagAlreadyExistsException $e) {
207
-			throw new Conflict('Tag already exists', 0, $e);
208
-		}
209
-	}
210
-
211
-
212
-	/**
213
-	 * Retrieves system tag properties
214
-	 *
215
-	 * @param PropFind $propFind
216
-	 * @param \Sabre\DAV\INode $node
217
-	 */
218
-	public function handleGetProperties(
219
-		PropFind $propFind,
220
-		\Sabre\DAV\INode $node
221
-	) {
222
-		if (!($node instanceof SystemTagNode) && !($node instanceof SystemTagMappingNode)) {
223
-			return;
224
-		}
225
-
226
-		$propFind->handle(self::ID_PROPERTYNAME, function() use ($node) {
227
-			return $node->getSystemTag()->getId();
228
-		});
229
-
230
-		$propFind->handle(self::DISPLAYNAME_PROPERTYNAME, function() use ($node) {
231
-			return $node->getSystemTag()->getName();
232
-		});
233
-
234
-		$propFind->handle(self::USERVISIBLE_PROPERTYNAME, function() use ($node) {
235
-			return $node->getSystemTag()->isUserVisible() ? 'true' : 'false';
236
-		});
237
-
238
-		$propFind->handle(self::USERASSIGNABLE_PROPERTYNAME, function() use ($node) {
239
-			// this is the tag's inherent property "is user assignable"
240
-			return $node->getSystemTag()->isUserAssignable() ? 'true' : 'false';
241
-		});
242
-
243
-		$propFind->handle(self::CANASSIGN_PROPERTYNAME, function() use ($node) {
244
-			// this is the effective permission for the current user
245
-			return $this->tagManager->canUserAssignTag($node->getSystemTag(), $this->userSession->getUser()) ? 'true' : 'false';
246
-		});
247
-
248
-		$propFind->handle(self::GROUPS_PROPERTYNAME, function() use ($node) {
249
-			if (!$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
250
-				// property only available for admins
251
-				throw new Forbidden();
252
-			}
253
-			$groups = [];
254
-			// no need to retrieve groups for namespaces that don't qualify
255
-			if ($node->getSystemTag()->isUserVisible() && !$node->getSystemTag()->isUserAssignable()) {
256
-				$groups = $this->tagManager->getTagGroups($node->getSystemTag());
257
-			}
258
-			return implode('|', $groups);
259
-		});
260
-	}
261
-
262
-	/**
263
-	 * Updates tag attributes
264
-	 *
265
-	 * @param string $path
266
-	 * @param PropPatch $propPatch
267
-	 *
268
-	 * @return void
269
-	 */
270
-	public function handleUpdateProperties($path, PropPatch $propPatch) {
271
-		$node = $this->server->tree->getNodeForPath($path);
272
-		if (!($node instanceof SystemTagNode)) {
273
-			return;
274
-		}
275
-
276
-		$propPatch->handle([
277
-			self::DISPLAYNAME_PROPERTYNAME,
278
-			self::USERVISIBLE_PROPERTYNAME,
279
-			self::USERASSIGNABLE_PROPERTYNAME,
280
-			self::GROUPS_PROPERTYNAME,
281
-		], function($props) use ($node) {
282
-			$tag = $node->getSystemTag();
283
-			$name = $tag->getName();
284
-			$userVisible = $tag->isUserVisible();
285
-			$userAssignable = $tag->isUserAssignable();
286
-
287
-			$updateTag = false;
288
-
289
-			if (isset($props[self::DISPLAYNAME_PROPERTYNAME])) {
290
-				$name = $props[self::DISPLAYNAME_PROPERTYNAME];
291
-				$updateTag = true;
292
-			}
293
-
294
-			if (isset($props[self::USERVISIBLE_PROPERTYNAME])) {
295
-				$propValue = $props[self::USERVISIBLE_PROPERTYNAME];
296
-				$userVisible = ($propValue !== 'false' && $propValue !== '0');
297
-				$updateTag = true;
298
-			}
299
-
300
-			if (isset($props[self::USERASSIGNABLE_PROPERTYNAME])) {
301
-				$propValue = $props[self::USERASSIGNABLE_PROPERTYNAME];
302
-				$userAssignable = ($propValue !== 'false' && $propValue !== '0');
303
-				$updateTag = true;
304
-			}
305
-
306
-			if (isset($props[self::GROUPS_PROPERTYNAME])) {
307
-				if (!$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
308
-					// property only available for admins
309
-					throw new Forbidden();
310
-				}
311
-
312
-				$propValue = $props[self::GROUPS_PROPERTYNAME];
313
-				$groupIds = explode('|', $propValue);
314
-				$this->tagManager->setTagGroups($tag, $groupIds);
315
-			}
316
-
317
-			if ($updateTag) {
318
-				$node->update($name, $userVisible, $userAssignable);
319
-			}
320
-
321
-			return true;
322
-		});
323
-
324
-	}
49
+    // namespace
50
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
51
+    const ID_PROPERTYNAME = '{http://owncloud.org/ns}id';
52
+    const DISPLAYNAME_PROPERTYNAME = '{http://owncloud.org/ns}display-name';
53
+    const USERVISIBLE_PROPERTYNAME = '{http://owncloud.org/ns}user-visible';
54
+    const USERASSIGNABLE_PROPERTYNAME = '{http://owncloud.org/ns}user-assignable';
55
+    const GROUPS_PROPERTYNAME = '{http://owncloud.org/ns}groups';
56
+    const CANASSIGN_PROPERTYNAME = '{http://owncloud.org/ns}can-assign';
57
+
58
+    /**
59
+     * @var \Sabre\DAV\Server $server
60
+     */
61
+    private $server;
62
+
63
+    /**
64
+     * @var ISystemTagManager
65
+     */
66
+    protected $tagManager;
67
+
68
+    /**
69
+     * @var IUserSession
70
+     */
71
+    protected $userSession;
72
+
73
+    /**
74
+     * @var IGroupManager
75
+     */
76
+    protected $groupManager;
77
+
78
+    /**
79
+     * @param ISystemTagManager $tagManager tag manager
80
+     * @param IGroupManager $groupManager
81
+     * @param IUserSession $userSession
82
+     */
83
+    public function __construct(ISystemTagManager $tagManager,
84
+                                IGroupManager $groupManager,
85
+                                IUserSession $userSession) {
86
+        $this->tagManager = $tagManager;
87
+        $this->userSession = $userSession;
88
+        $this->groupManager = $groupManager;
89
+    }
90
+
91
+    /**
92
+     * This initializes the plugin.
93
+     *
94
+     * This function is called by \Sabre\DAV\Server, after
95
+     * addPlugin is called.
96
+     *
97
+     * This method should set up the required event subscriptions.
98
+     *
99
+     * @param \Sabre\DAV\Server $server
100
+     * @return void
101
+     */
102
+    public function initialize(\Sabre\DAV\Server $server) {
103
+
104
+        $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
105
+
106
+        $server->protectedProperties[] = self::ID_PROPERTYNAME;
107
+
108
+        $server->on('propFind', array($this, 'handleGetProperties'));
109
+        $server->on('propPatch', array($this, 'handleUpdateProperties'));
110
+        $server->on('method:POST', [$this, 'httpPost']);
111
+
112
+        $this->server = $server;
113
+    }
114
+
115
+    /**
116
+     * POST operation on system tag collections
117
+     *
118
+     * @param RequestInterface $request request object
119
+     * @param ResponseInterface $response response object
120
+     * @return null|false
121
+     */
122
+    public function httpPost(RequestInterface $request, ResponseInterface $response) {
123
+        $path = $request->getPath();
124
+
125
+        // Making sure the node exists
126
+        $node = $this->server->tree->getNodeForPath($path);
127
+        if ($node instanceof SystemTagsByIdCollection || $node instanceof SystemTagsObjectMappingCollection) {
128
+            $data = $request->getBodyAsString();
129
+
130
+            $tag = $this->createTag($data, $request->getHeader('Content-Type'));
131
+
132
+            if ($node instanceof SystemTagsObjectMappingCollection) {
133
+                // also add to collection
134
+                $node->createFile($tag->getId());
135
+                $url = $request->getBaseUrl() . 'systemtags/';
136
+            } else {
137
+                $url = $request->getUrl();
138
+            }
139
+
140
+            if ($url[strlen($url) - 1] !== '/') {
141
+                $url .= '/';
142
+            }
143
+
144
+            $response->setHeader('Content-Location', $url . $tag->getId());
145
+
146
+            // created
147
+            $response->setStatus(201);
148
+            return false;
149
+        }
150
+    }
151
+
152
+    /**
153
+     * Creates a new tag
154
+     *
155
+     * @param string $data JSON encoded string containing the properties of the tag to create
156
+     * @param string $contentType content type of the data
157
+     * @return ISystemTag newly created system tag
158
+     *
159
+     * @throws BadRequest if a field was missing
160
+     * @throws Conflict if a tag with the same properties already exists
161
+     * @throws UnsupportedMediaType if the content type is not supported
162
+     */
163
+    private function createTag($data, $contentType = 'application/json') {
164
+        if (explode(';', $contentType)[0] === 'application/json') {
165
+            $data = json_decode($data, true);
166
+        } else {
167
+            throw new UnsupportedMediaType();
168
+        }
169
+
170
+        if (!isset($data['name'])) {
171
+            throw new BadRequest('Missing "name" attribute');
172
+        }
173
+
174
+        $tagName = $data['name'];
175
+        $userVisible = true;
176
+        $userAssignable = true;
177
+
178
+        if (isset($data['userVisible'])) {
179
+            $userVisible = (bool)$data['userVisible'];
180
+        }
181
+
182
+        if (isset($data['userAssignable'])) {
183
+            $userAssignable = (bool)$data['userAssignable'];
184
+        }
185
+
186
+        $groups = [];
187
+        if (isset($data['groups'])) {
188
+            $groups = $data['groups'];
189
+            if (is_string($groups)) {
190
+                $groups = explode('|', $groups);
191
+            }
192
+        }
193
+
194
+        if($userVisible === false || $userAssignable === false || !empty($groups)) {
195
+            if(!$this->userSession->isLoggedIn() || !$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
196
+                throw new BadRequest('Not sufficient permissions');
197
+            }
198
+        }
199
+
200
+        try {
201
+            $tag = $this->tagManager->createTag($tagName, $userVisible, $userAssignable);
202
+            if (!empty($groups)) {
203
+                $this->tagManager->setTagGroups($tag, $groups);
204
+            }
205
+            return $tag;
206
+        } catch (TagAlreadyExistsException $e) {
207
+            throw new Conflict('Tag already exists', 0, $e);
208
+        }
209
+    }
210
+
211
+
212
+    /**
213
+     * Retrieves system tag properties
214
+     *
215
+     * @param PropFind $propFind
216
+     * @param \Sabre\DAV\INode $node
217
+     */
218
+    public function handleGetProperties(
219
+        PropFind $propFind,
220
+        \Sabre\DAV\INode $node
221
+    ) {
222
+        if (!($node instanceof SystemTagNode) && !($node instanceof SystemTagMappingNode)) {
223
+            return;
224
+        }
225
+
226
+        $propFind->handle(self::ID_PROPERTYNAME, function() use ($node) {
227
+            return $node->getSystemTag()->getId();
228
+        });
229
+
230
+        $propFind->handle(self::DISPLAYNAME_PROPERTYNAME, function() use ($node) {
231
+            return $node->getSystemTag()->getName();
232
+        });
233
+
234
+        $propFind->handle(self::USERVISIBLE_PROPERTYNAME, function() use ($node) {
235
+            return $node->getSystemTag()->isUserVisible() ? 'true' : 'false';
236
+        });
237
+
238
+        $propFind->handle(self::USERASSIGNABLE_PROPERTYNAME, function() use ($node) {
239
+            // this is the tag's inherent property "is user assignable"
240
+            return $node->getSystemTag()->isUserAssignable() ? 'true' : 'false';
241
+        });
242
+
243
+        $propFind->handle(self::CANASSIGN_PROPERTYNAME, function() use ($node) {
244
+            // this is the effective permission for the current user
245
+            return $this->tagManager->canUserAssignTag($node->getSystemTag(), $this->userSession->getUser()) ? 'true' : 'false';
246
+        });
247
+
248
+        $propFind->handle(self::GROUPS_PROPERTYNAME, function() use ($node) {
249
+            if (!$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
250
+                // property only available for admins
251
+                throw new Forbidden();
252
+            }
253
+            $groups = [];
254
+            // no need to retrieve groups for namespaces that don't qualify
255
+            if ($node->getSystemTag()->isUserVisible() && !$node->getSystemTag()->isUserAssignable()) {
256
+                $groups = $this->tagManager->getTagGroups($node->getSystemTag());
257
+            }
258
+            return implode('|', $groups);
259
+        });
260
+    }
261
+
262
+    /**
263
+     * Updates tag attributes
264
+     *
265
+     * @param string $path
266
+     * @param PropPatch $propPatch
267
+     *
268
+     * @return void
269
+     */
270
+    public function handleUpdateProperties($path, PropPatch $propPatch) {
271
+        $node = $this->server->tree->getNodeForPath($path);
272
+        if (!($node instanceof SystemTagNode)) {
273
+            return;
274
+        }
275
+
276
+        $propPatch->handle([
277
+            self::DISPLAYNAME_PROPERTYNAME,
278
+            self::USERVISIBLE_PROPERTYNAME,
279
+            self::USERASSIGNABLE_PROPERTYNAME,
280
+            self::GROUPS_PROPERTYNAME,
281
+        ], function($props) use ($node) {
282
+            $tag = $node->getSystemTag();
283
+            $name = $tag->getName();
284
+            $userVisible = $tag->isUserVisible();
285
+            $userAssignable = $tag->isUserAssignable();
286
+
287
+            $updateTag = false;
288
+
289
+            if (isset($props[self::DISPLAYNAME_PROPERTYNAME])) {
290
+                $name = $props[self::DISPLAYNAME_PROPERTYNAME];
291
+                $updateTag = true;
292
+            }
293
+
294
+            if (isset($props[self::USERVISIBLE_PROPERTYNAME])) {
295
+                $propValue = $props[self::USERVISIBLE_PROPERTYNAME];
296
+                $userVisible = ($propValue !== 'false' && $propValue !== '0');
297
+                $updateTag = true;
298
+            }
299
+
300
+            if (isset($props[self::USERASSIGNABLE_PROPERTYNAME])) {
301
+                $propValue = $props[self::USERASSIGNABLE_PROPERTYNAME];
302
+                $userAssignable = ($propValue !== 'false' && $propValue !== '0');
303
+                $updateTag = true;
304
+            }
305
+
306
+            if (isset($props[self::GROUPS_PROPERTYNAME])) {
307
+                if (!$this->groupManager->isAdmin($this->userSession->getUser()->getUID())) {
308
+                    // property only available for admins
309
+                    throw new Forbidden();
310
+                }
311
+
312
+                $propValue = $props[self::GROUPS_PROPERTYNAME];
313
+                $groupIds = explode('|', $propValue);
314
+                $this->tagManager->setTagGroups($tag, $groupIds);
315
+            }
316
+
317
+            if ($updateTag) {
318
+                $node->update($name, $userVisible, $userAssignable);
319
+            }
320
+
321
+            return true;
322
+        });
323
+
324
+    }
325 325
 }
Please login to merge, or discard this patch.
lib/public/BackgroundJob/IJobList.php 1 patch
Indentation   +86 added lines, -86 removed lines patch added patch discarded remove patch
@@ -32,100 +32,100 @@
 block discarded – undo
32 32
  * @since 7.0.0
33 33
  */
34 34
 interface IJobList {
35
-	/**
36
-	 * Add a job to the list
37
-	 *
38
-	 * @param \OCP\BackgroundJob\IJob|string $job
39
-	 * @param mixed $argument The argument to be passed to $job->run() when the job is exectured
40
-	 * @since 7.0.0
41
-	 */
42
-	public function add($job, $argument = null);
35
+    /**
36
+     * Add a job to the list
37
+     *
38
+     * @param \OCP\BackgroundJob\IJob|string $job
39
+     * @param mixed $argument The argument to be passed to $job->run() when the job is exectured
40
+     * @since 7.0.0
41
+     */
42
+    public function add($job, $argument = null);
43 43
 
44
-	/**
45
-	 * Remove a job from the list
46
-	 *
47
-	 * @param \OCP\BackgroundJob\IJob|string $job
48
-	 * @param mixed $argument
49
-	 * @since 7.0.0
50
-	 */
51
-	public function remove($job, $argument = null);
44
+    /**
45
+     * Remove a job from the list
46
+     *
47
+     * @param \OCP\BackgroundJob\IJob|string $job
48
+     * @param mixed $argument
49
+     * @since 7.0.0
50
+     */
51
+    public function remove($job, $argument = null);
52 52
 
53
-	/**
54
-	 * check if a job is in the list
55
-	 *
56
-	 * @param \OCP\BackgroundJob\IJob|string $job
57
-	 * @param mixed $argument
58
-	 * @return bool
59
-	 * @since 7.0.0
60
-	 */
61
-	public function has($job, $argument);
53
+    /**
54
+     * check if a job is in the list
55
+     *
56
+     * @param \OCP\BackgroundJob\IJob|string $job
57
+     * @param mixed $argument
58
+     * @return bool
59
+     * @since 7.0.0
60
+     */
61
+    public function has($job, $argument);
62 62
 
63
-	/**
64
-	 * get all jobs in the list
65
-	 *
66
-	 * @return \OCP\BackgroundJob\IJob[]
67
-	 * @since 7.0.0
68
-	 * @deprecated 9.0.0 - This method is dangerous since it can cause load and
69
-	 * memory problems when creating too many instances.
70
-	 */
71
-	public function getAll();
63
+    /**
64
+     * get all jobs in the list
65
+     *
66
+     * @return \OCP\BackgroundJob\IJob[]
67
+     * @since 7.0.0
68
+     * @deprecated 9.0.0 - This method is dangerous since it can cause load and
69
+     * memory problems when creating too many instances.
70
+     */
71
+    public function getAll();
72 72
 
73
-	/**
74
-	 * get the next job in the list
75
-	 *
76
-	 * @return \OCP\BackgroundJob\IJob|null
77
-	 * @since 7.0.0
78
-	 */
79
-	public function getNext();
73
+    /**
74
+     * get the next job in the list
75
+     *
76
+     * @return \OCP\BackgroundJob\IJob|null
77
+     * @since 7.0.0
78
+     */
79
+    public function getNext();
80 80
 
81
-	/**
82
-	 * @param int $id
83
-	 * @return \OCP\BackgroundJob\IJob|null
84
-	 * @since 7.0.0
85
-	 */
86
-	public function getById($id);
81
+    /**
82
+     * @param int $id
83
+     * @return \OCP\BackgroundJob\IJob|null
84
+     * @since 7.0.0
85
+     */
86
+    public function getById($id);
87 87
 
88
-	/**
89
-	 * set the job that was last ran to the current time
90
-	 *
91
-	 * @param \OCP\BackgroundJob\IJob $job
92
-	 * @since 7.0.0
93
-	 */
94
-	public function setLastJob(IJob $job);
88
+    /**
89
+     * set the job that was last ran to the current time
90
+     *
91
+     * @param \OCP\BackgroundJob\IJob $job
92
+     * @since 7.0.0
93
+     */
94
+    public function setLastJob(IJob $job);
95 95
 
96
-	/**
97
-	 * Remove the reservation for a job
98
-	 *
99
-	 * @param IJob $job
100
-	 * @since 9.1.0
101
-	 */
102
-	public function unlockJob(IJob $job);
96
+    /**
97
+     * Remove the reservation for a job
98
+     *
99
+     * @param IJob $job
100
+     * @since 9.1.0
101
+     */
102
+    public function unlockJob(IJob $job);
103 103
 
104
-	/**
105
-	 * get the id of the last ran job
106
-	 *
107
-	 * @return int
108
-	 * @since 7.0.0
109
-	 * @deprecated 9.1.0 - The functionality behind the value is deprecated, it
110
-	 *    only tells you which job finished last, but since we now allow multiple
111
-	 *    executors to run in parallel, it's not used to calculate the next job.
112
-	 */
113
-	public function getLastJob();
104
+    /**
105
+     * get the id of the last ran job
106
+     *
107
+     * @return int
108
+     * @since 7.0.0
109
+     * @deprecated 9.1.0 - The functionality behind the value is deprecated, it
110
+     *    only tells you which job finished last, but since we now allow multiple
111
+     *    executors to run in parallel, it's not used to calculate the next job.
112
+     */
113
+    public function getLastJob();
114 114
 
115
-	/**
116
-	 * set the lastRun of $job to now
117
-	 *
118
-	 * @param IJob $job
119
-	 * @since 7.0.0
120
-	 */
121
-	public function setLastRun(IJob $job);
115
+    /**
116
+     * set the lastRun of $job to now
117
+     *
118
+     * @param IJob $job
119
+     * @since 7.0.0
120
+     */
121
+    public function setLastRun(IJob $job);
122 122
 
123
-	/**
124
-	 * set the run duration of $job
125
-	 *
126
-	 * @param IJob $job
127
-	 * @param $timeTaken
128
-	 * @since 12.0.0
129
-	 */
130
-	public function setExecutionTime(IJob $job, $timeTaken);
123
+    /**
124
+     * set the run duration of $job
125
+     *
126
+     * @param IJob $job
127
+     * @param $timeTaken
128
+     * @since 12.0.0
129
+     */
130
+    public function setExecutionTime(IJob $job, $timeTaken);
131 131
 }
Please login to merge, or discard this patch.
apps/dav/lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php 1 patch
Indentation   +129 added lines, -129 removed lines patch added patch discarded remove patch
@@ -35,133 +35,133 @@
 block discarded – undo
35 35
  */
36 36
 class CalendarSearchReport implements XmlDeserializable {
37 37
 
38
-	/**
39
-	 * An array with requested properties.
40
-	 *
41
-	 * @var array
42
-	 */
43
-	public $properties;
44
-
45
-	/**
46
-	 * List of property/component filters.
47
-	 *
48
-	 * @var array
49
-	 */
50
-	public $filters;
51
-
52
-	/**
53
-	 * @var int
54
-	 */
55
-	public $limit;
56
-
57
-	/**
58
-	 * @var int
59
-	 */
60
-	public $offset;
61
-
62
-	/**
63
-	 * The deserialize method is called during xml parsing.
64
-	 *
65
-	 * This method is called statically, this is because in theory this method
66
-	 * may be used as a type of constructor, or factory method.
67
-	 *
68
-	 * Often you want to return an instance of the current class, but you are
69
-	 * free to return other data as well.
70
-	 *
71
-	 * You are responsible for advancing the reader to the next element. Not
72
-	 * doing anything will result in a never-ending loop.
73
-	 *
74
-	 * If you just want to skip parsing for this element altogether, you can
75
-	 * just call $reader->next();
76
-	 *
77
-	 * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
78
-	 * the next element.
79
-	 *
80
-	 * @param Reader $reader
81
-	 * @return mixed
82
-	 */
83
-	static function xmlDeserialize(Reader $reader) {
84
-		$elems = $reader->parseInnerTree([
85
-			'{http://nextcloud.com/ns}comp-filter'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\CompFilter',
86
-			'{http://nextcloud.com/ns}prop-filter'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\PropFilter',
87
-			'{http://nextcloud.com/ns}param-filter' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\ParamFilter',
88
-			'{http://nextcloud.com/ns}search-term'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\SearchTermFilter',
89
-			'{http://nextcloud.com/ns}limit'        => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\LimitFilter',
90
-			'{http://nextcloud.com/ns}offset'       => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\OffsetFilter',
91
-			'{DAV:}prop'                            => 'Sabre\\Xml\\Element\\KeyValue',
92
-		]);
93
-
94
-		$newProps = [
95
-			'filters'    => [],
96
-			'properties' => [],
97
-			'limit'      => null,
98
-			'offset'     => null
99
-		];
100
-
101
-		if (!is_array($elems)) {
102
-			$elems = [];
103
-		}
104
-
105
-		foreach ($elems as $elem) {
106
-			switch ($elem['name']) {
107
-				case '{DAV:}prop':
108
-					$newProps['properties'] = array_keys($elem['value']);
109
-					break;
110
-				case '{' . SearchPlugin::NS_Nextcloud . '}filter':
111
-					foreach ($elem['value'] as $subElem) {
112
-						if ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}comp-filter') {
113
-							if (!isset($newProps['filters']['comps']) || !is_array($newProps['filters']['comps'])) {
114
-								$newProps['filters']['comps'] = [];
115
-							}
116
-							$newProps['filters']['comps'][] = $subElem['value'];
117
-						} elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}prop-filter') {
118
-							if (!isset($newProps['filters']['props']) || !is_array($newProps['filters']['props'])) {
119
-								$newProps['filters']['props'] = [];
120
-							}
121
-							$newProps['filters']['props'][] = $subElem['value'];
122
-						} elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}param-filter') {
123
-							if (!isset($newProps['filters']['params']) || !is_array($newProps['filters']['params'])) {
124
-								$newProps['filters']['params'] = [];
125
-							}
126
-							$newProps['filters']['params'][] = $subElem['value'];
127
-						} elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}search-term') {
128
-							$newProps['filters']['search-term'] = $subElem['value'];
129
-						}
130
-					}
131
-					break;
132
-				case '{' . SearchPlugin::NS_Nextcloud . '}limit':
133
-					$newProps['limit'] = $elem['value'];
134
-					break;
135
-				case '{' . SearchPlugin::NS_Nextcloud . '}offset':
136
-					$newProps['offset'] = $elem['value'];
137
-					break;
138
-
139
-			}
140
-		}
141
-
142
-		if (empty($newProps['filters'])) {
143
-			throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}filter element is required for this request');
144
-		}
145
-
146
-		$propsOrParamsDefined = (!empty($newProps['filters']['props']) || !empty($newProps['filters']['params']));
147
-		$noCompsDefined = empty($newProps['filters']['comps']);
148
-		if ($propsOrParamsDefined && $noCompsDefined) {
149
-			throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter given without any {' . SearchPlugin::NS_Nextcloud . '}comp-filter');
150
-		}
151
-
152
-		if (!isset($newProps['filters']['search-term'])) {
153
-			throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}search-term is required for this request');
154
-		}
155
-
156
-		if (empty($newProps['filters']['props']) && empty($newProps['filters']['params'])) {
157
-			throw new BadRequest('At least one{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter is required for this request');
158
-		}
159
-
160
-
161
-		$obj = new self();
162
-		foreach ($newProps as $key => $value) {
163
-			$obj->$key = $value;
164
-		}
165
-		return $obj;
166
-	}
38
+    /**
39
+     * An array with requested properties.
40
+     *
41
+     * @var array
42
+     */
43
+    public $properties;
44
+
45
+    /**
46
+     * List of property/component filters.
47
+     *
48
+     * @var array
49
+     */
50
+    public $filters;
51
+
52
+    /**
53
+     * @var int
54
+     */
55
+    public $limit;
56
+
57
+    /**
58
+     * @var int
59
+     */
60
+    public $offset;
61
+
62
+    /**
63
+     * The deserialize method is called during xml parsing.
64
+     *
65
+     * This method is called statically, this is because in theory this method
66
+     * may be used as a type of constructor, or factory method.
67
+     *
68
+     * Often you want to return an instance of the current class, but you are
69
+     * free to return other data as well.
70
+     *
71
+     * You are responsible for advancing the reader to the next element. Not
72
+     * doing anything will result in a never-ending loop.
73
+     *
74
+     * If you just want to skip parsing for this element altogether, you can
75
+     * just call $reader->next();
76
+     *
77
+     * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
78
+     * the next element.
79
+     *
80
+     * @param Reader $reader
81
+     * @return mixed
82
+     */
83
+    static function xmlDeserialize(Reader $reader) {
84
+        $elems = $reader->parseInnerTree([
85
+            '{http://nextcloud.com/ns}comp-filter'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\CompFilter',
86
+            '{http://nextcloud.com/ns}prop-filter'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\PropFilter',
87
+            '{http://nextcloud.com/ns}param-filter' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\ParamFilter',
88
+            '{http://nextcloud.com/ns}search-term'  => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\SearchTermFilter',
89
+            '{http://nextcloud.com/ns}limit'        => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\LimitFilter',
90
+            '{http://nextcloud.com/ns}offset'       => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\OffsetFilter',
91
+            '{DAV:}prop'                            => 'Sabre\\Xml\\Element\\KeyValue',
92
+        ]);
93
+
94
+        $newProps = [
95
+            'filters'    => [],
96
+            'properties' => [],
97
+            'limit'      => null,
98
+            'offset'     => null
99
+        ];
100
+
101
+        if (!is_array($elems)) {
102
+            $elems = [];
103
+        }
104
+
105
+        foreach ($elems as $elem) {
106
+            switch ($elem['name']) {
107
+                case '{DAV:}prop':
108
+                    $newProps['properties'] = array_keys($elem['value']);
109
+                    break;
110
+                case '{' . SearchPlugin::NS_Nextcloud . '}filter':
111
+                    foreach ($elem['value'] as $subElem) {
112
+                        if ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}comp-filter') {
113
+                            if (!isset($newProps['filters']['comps']) || !is_array($newProps['filters']['comps'])) {
114
+                                $newProps['filters']['comps'] = [];
115
+                            }
116
+                            $newProps['filters']['comps'][] = $subElem['value'];
117
+                        } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}prop-filter') {
118
+                            if (!isset($newProps['filters']['props']) || !is_array($newProps['filters']['props'])) {
119
+                                $newProps['filters']['props'] = [];
120
+                            }
121
+                            $newProps['filters']['props'][] = $subElem['value'];
122
+                        } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}param-filter') {
123
+                            if (!isset($newProps['filters']['params']) || !is_array($newProps['filters']['params'])) {
124
+                                $newProps['filters']['params'] = [];
125
+                            }
126
+                            $newProps['filters']['params'][] = $subElem['value'];
127
+                        } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}search-term') {
128
+                            $newProps['filters']['search-term'] = $subElem['value'];
129
+                        }
130
+                    }
131
+                    break;
132
+                case '{' . SearchPlugin::NS_Nextcloud . '}limit':
133
+                    $newProps['limit'] = $elem['value'];
134
+                    break;
135
+                case '{' . SearchPlugin::NS_Nextcloud . '}offset':
136
+                    $newProps['offset'] = $elem['value'];
137
+                    break;
138
+
139
+            }
140
+        }
141
+
142
+        if (empty($newProps['filters'])) {
143
+            throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}filter element is required for this request');
144
+        }
145
+
146
+        $propsOrParamsDefined = (!empty($newProps['filters']['props']) || !empty($newProps['filters']['params']));
147
+        $noCompsDefined = empty($newProps['filters']['comps']);
148
+        if ($propsOrParamsDefined && $noCompsDefined) {
149
+            throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter given without any {' . SearchPlugin::NS_Nextcloud . '}comp-filter');
150
+        }
151
+
152
+        if (!isset($newProps['filters']['search-term'])) {
153
+            throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}search-term is required for this request');
154
+        }
155
+
156
+        if (empty($newProps['filters']['props']) && empty($newProps['filters']['params'])) {
157
+            throw new BadRequest('At least one{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter is required for this request');
158
+        }
159
+
160
+
161
+        $obj = new self();
162
+        foreach ($newProps as $key => $value) {
163
+            $obj->$key = $value;
164
+        }
165
+        return $obj;
166
+    }
167 167
 }
Please login to merge, or discard this patch.
lib/private/App/AppStore/Bundles/CoreBundle.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -23,20 +23,20 @@
 block discarded – undo
23 23
 
24 24
 class CoreBundle extends Bundle {
25 25
 
26
-	/**
27
-	 * {@inheritDoc}
28
-	 */
29
-	public function getName() {
30
-		return 'Core bundle';
31
-	}
26
+    /**
27
+     * {@inheritDoc}
28
+     */
29
+    public function getName() {
30
+        return 'Core bundle';
31
+    }
32 32
 
33
-	/**
34
-	 * {@inheritDoc}
35
-	 */
36
-	public function getAppIdentifiers() {
37
-		return [
38
-			'bruteforcesettings',
39
-		];
40
-	}
33
+    /**
34
+     * {@inheritDoc}
35
+     */
36
+    public function getAppIdentifiers() {
37
+        return [
38
+            'bruteforcesettings',
39
+        ];
40
+    }
41 41
 
42 42
 }
Please login to merge, or discard this patch.
lib/private/App/AppStore/Bundles/EnterpriseBundle.php 1 patch
Indentation   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -23,25 +23,25 @@
 block discarded – undo
23 23
 
24 24
 class EnterpriseBundle extends Bundle {
25 25
 
26
-	/**
27
-	 * {@inheritDoc}
28
-	 */
29
-	public function getName() {
30
-		return (string)$this->l10n->t('Enterprise bundle');
31
-	}
26
+    /**
27
+     * {@inheritDoc}
28
+     */
29
+    public function getName() {
30
+        return (string)$this->l10n->t('Enterprise bundle');
31
+    }
32 32
 
33
-	/**
34
-	 * {@inheritDoc}
35
-	 */
36
-	public function getAppIdentifiers() {
37
-		return [
38
-			'admin_audit',
39
-			'user_ldap',
40
-			'files_retention',
41
-			'files_automatedtagging',
42
-			'user_saml',
43
-			'files_accesscontrol',
44
-		];
45
-	}
33
+    /**
34
+     * {@inheritDoc}
35
+     */
36
+    public function getAppIdentifiers() {
37
+        return [
38
+            'admin_audit',
39
+            'user_ldap',
40
+            'files_retention',
41
+            'files_automatedtagging',
42
+            'user_saml',
43
+            'files_accesscontrol',
44
+        ];
45
+    }
46 46
 
47 47
 }
Please login to merge, or discard this patch.
lib/private/App/AppStore/Bundles/Bundle.php 1 patch
Indentation   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -24,36 +24,36 @@
 block discarded – undo
24 24
 use OCP\IL10N;
25 25
 
26 26
 abstract class Bundle {
27
-	/** @var IL10N */
28
-	protected $l10n;
27
+    /** @var IL10N */
28
+    protected $l10n;
29 29
 
30
-	/**
31
-	 * @param IL10N $l10n
32
-	 */
33
-	public function __construct(IL10N $l10n) {
34
-		$this->l10n = $l10n;
35
-	}
30
+    /**
31
+     * @param IL10N $l10n
32
+     */
33
+    public function __construct(IL10N $l10n) {
34
+        $this->l10n = $l10n;
35
+    }
36 36
 
37
-	/**
38
-	 * Get the identifier of the bundle
39
-	 *
40
-	 * @return string
41
-	 */
42
-	public final function getIdentifier() {
43
-		return substr(strrchr(get_class($this), '\\'), 1);
44
-	}
37
+    /**
38
+     * Get the identifier of the bundle
39
+     *
40
+     * @return string
41
+     */
42
+    public final function getIdentifier() {
43
+        return substr(strrchr(get_class($this), '\\'), 1);
44
+    }
45 45
 
46
-	/**
47
-	 * Get the name of the bundle
48
-	 *
49
-	 * @return string
50
-	 */
51
-	public abstract function getName();
46
+    /**
47
+     * Get the name of the bundle
48
+     *
49
+     * @return string
50
+     */
51
+    public abstract function getName();
52 52
 
53
-	/**
54
-	 * Get the list of app identifiers in the bundle
55
-	 *
56
-	 * @return array
57
-	 */
58
-	public abstract function getAppIdentifiers();
53
+    /**
54
+     * Get the list of app identifiers in the bundle
55
+     *
56
+     * @return array
57
+     */
58
+    public abstract function getAppIdentifiers();
59 59
 }
Please login to merge, or discard this patch.