Completed
Pull Request — master (#8359)
by Robin
50:24 queued 32:18
created
apps/files_external/lib/Lib/Storage/Swift.php 3 patches
Doc Comments   +4 added lines, -1 removed lines patch added patch discarded remove patch
@@ -83,7 +83,7 @@  discard block
 block discarded – undo
83 83
 
84 84
 	/**
85 85
 	 * @param string $path
86
-	 * @return mixed|string
86
+	 * @return string
87 87
 	 */
88 88
 	private function normalizePath(string $path) {
89 89
 		$path = trim($path, '/');
@@ -570,6 +570,9 @@  discard block
 block discarded – undo
570 570
 		return $this->container;
571 571
 	}
572 572
 
573
+	/**
574
+	 * @param string $path
575
+	 */
573 576
 	public function writeBack($tmpFile, $path) {
574 577
 		$fileData = fopen($tmpFile, 'r');
575 578
 		$this->objectStore->writeObject($path, $fileData);
Please login to merge, or discard this patch.
Indentation   +562 added lines, -562 removed lines patch added patch discarded remove patch
@@ -49,570 +49,570 @@
 block discarded – undo
49 49
 use OpenStack\ObjectStore\v1\Models\StorageObject;
50 50
 
51 51
 class Swift extends \OC\Files\Storage\Common {
52
-	/** @var SwiftFactory */
53
-	private $connectionFactory;
54
-	/**
55
-	 * @var \OpenStack\ObjectStore\v1\Models\Container
56
-	 */
57
-	private $container;
58
-	/**
59
-	 * @var string
60
-	 */
61
-	private $bucket;
62
-	/**
63
-	 * Connection parameters
64
-	 *
65
-	 * @var array
66
-	 */
67
-	private $params;
68
-
69
-	/** @var string */
70
-	private $id;
71
-
72
-	/** @var \OC\Files\ObjectStore\Swift */
73
-	private $objectStore;
74
-
75
-	/**
76
-	 * Key value cache mapping path to data object. Maps path to
77
-	 * \OpenCloud\OpenStack\ObjectStorage\Resource\DataObject for existing
78
-	 * paths and path to false for not existing paths.
79
-	 *
80
-	 * @var \OCP\ICache
81
-	 */
82
-	private $objectCache;
83
-
84
-	/**
85
-	 * @param string $path
86
-	 * @return mixed|string
87
-	 */
88
-	private function normalizePath(string $path) {
89
-		$path = trim($path, '/');
90
-
91
-		if (!$path) {
92
-			$path = '.';
93
-		}
94
-
95
-		$path = str_replace('#', '%23', $path);
96
-
97
-		return $path;
98
-	}
99
-
100
-	const SUBCONTAINER_FILE = '.subcontainers';
101
-
102
-	/**
103
-	 * translate directory path to container name
104
-	 *
105
-	 * @param string $path
106
-	 * @return string
107
-	 */
108
-
109
-	/**
110
-	 * Fetches an object from the API.
111
-	 * If the object is cached already or a
112
-	 * failed "doesn't exist" response was cached,
113
-	 * that one will be returned.
114
-	 *
115
-	 * @param string $path
116
-	 * @return StorageObject|bool object
117
-	 * or false if the object did not exist
118
-	 * @throws \OCP\Files\StorageAuthException
119
-	 * @throws \OCP\Files\StorageNotAvailableException
120
-	 */
121
-	private function fetchObject(string $path) {
122
-		if ($this->objectCache->hasKey($path)) {
123
-			// might be "false" if object did not exist from last check
124
-			return $this->objectCache->get($path);
125
-		}
126
-		try {
127
-			$object = $this->getContainer()->getObject($path);
128
-			$object->retrieve();
129
-			$this->objectCache->set($path, $object);
130
-			return $object;
131
-		} catch (BadResponseError $e) {
132
-			// Expected response is "404 Not Found", so only log if it isn't
133
-			if ($e->getResponse()->getStatusCode() !== 404) {
134
-				\OC::$server->getLogger()->logException($e, [
135
-					'level' => \OCP\Util::ERROR,
136
-					'app' => 'files_external',
137
-				]);
138
-			}
139
-			$this->objectCache->set($path, false);
140
-			return false;
141
-		}
142
-	}
143
-
144
-	/**
145
-	 * Returns whether the given path exists.
146
-	 *
147
-	 * @param string $path
148
-	 *
149
-	 * @return bool true if the object exist, false otherwise
150
-	 * @throws \OCP\Files\StorageAuthException
151
-	 * @throws \OCP\Files\StorageNotAvailableException
152
-	 */
153
-	private function doesObjectExist($path) {
154
-		return $this->fetchObject($path) !== false;
155
-	}
156
-
157
-	public function __construct($params) {
158
-		if ((empty($params['key']) and empty($params['password']))
159
-			or (empty($params['user']) && empty($params['userid'])) or empty($params['bucket'])
160
-			or empty($params['region'])
161
-		) {
162
-			throw new StorageBadConfigException("API Key or password, Username, Bucket and Region have to be configured.");
163
-		}
164
-
165
-		$user = isset($params['user']) ? $params['user'] : $params['userid'];
166
-		$this->id = 'swift::' . $user . md5($params['bucket']);
167
-
168
-		$bucketUrl = new Uri($params['bucket']);
169
-		if ($bucketUrl->getHost()) {
170
-			$params['bucket'] = basename($bucketUrl->getPath());
171
-			$params['endpoint_url'] = (string)$bucketUrl->withPath(dirname($bucketUrl->getPath()));
172
-		}
173
-
174
-		if (empty($params['url'])) {
175
-			$params['url'] = 'https://identity.api.rackspacecloud.com/v2.0/';
176
-		}
177
-
178
-		if (empty($params['service_name'])) {
179
-			$params['service_name'] = 'cloudFiles';
180
-		}
181
-
182
-		$params['autocreate'] = true;
183
-
184
-		if (isset($params['userid'])) {
185
-			$params['user'] = [
186
-				'id' => $params['userid'],
187
-				'password' => $params['password']
188
-			];
189
-		}
190
-
191
-		$this->params = $params;
192
-		// FIXME: private class...
193
-		$this->objectCache = new \OC\Cache\CappedMemoryCache();
194
-		$this->connectionFactory = new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift/'), $this->params);
195
-		$this->objectStore = new \OC\Files\ObjectStore\Swift($this->params, $this->connectionFactory);
196
-		$this->bucket = $params['bucket'];
197
-	}
198
-
199
-	public function mkdir($path) {
200
-		$path = $this->normalizePath($path);
201
-
202
-		if ($this->is_dir($path)) {
203
-			return false;
204
-		}
205
-
206
-		if ($path !== '.') {
207
-			$path .= '/';
208
-		}
209
-
210
-		try {
211
-			$this->getContainer()->createObject([
212
-				'name' => $path,
213
-				'content' => '',
214
-				'headers' => ['content-type' => 'httpd/unix-directory']
215
-			]);
216
-			// invalidate so that the next access gets the real object
217
-			// with all properties
218
-			$this->objectCache->remove($path);
219
-		} catch (BadResponseError $e) {
220
-			\OC::$server->getLogger()->logException($e, [
221
-				'level' => \OCP\Util::ERROR,
222
-				'app' => 'files_external',
223
-			]);
224
-			return false;
225
-		}
226
-
227
-		return true;
228
-	}
229
-
230
-	public function file_exists($path) {
231
-		$path = $this->normalizePath($path);
232
-
233
-		if ($path !== '.' && $this->is_dir($path)) {
234
-			$path .= '/';
235
-		}
236
-
237
-		return $this->doesObjectExist($path);
238
-	}
239
-
240
-	public function rmdir($path) {
241
-		$path = $this->normalizePath($path);
242
-
243
-		if (!$this->is_dir($path) || !$this->isDeletable($path)) {
244
-			return false;
245
-		}
246
-
247
-		$dh = $this->opendir($path);
248
-		while ($file = readdir($dh)) {
249
-			if (\OC\Files\Filesystem::isIgnoredDir($file)) {
250
-				continue;
251
-			}
252
-
253
-			if ($this->is_dir($path . '/' . $file)) {
254
-				$this->rmdir($path . '/' . $file);
255
-			} else {
256
-				$this->unlink($path . '/' . $file);
257
-			}
258
-		}
259
-
260
-		try {
261
-			$this->objectStore->deleteObject($path . '/');
262
-			$this->objectCache->remove($path . '/');
263
-		} catch (BadResponseError $e) {
264
-			\OC::$server->getLogger()->logException($e, [
265
-				'level' => \OCP\Util::ERROR,
266
-				'app' => 'files_external',
267
-			]);
268
-			return false;
269
-		}
270
-
271
-		return true;
272
-	}
273
-
274
-	public function opendir($path) {
275
-		$path = $this->normalizePath($path);
276
-
277
-		if ($path === '.') {
278
-			$path = '';
279
-		} else {
280
-			$path .= '/';
281
-		}
52
+    /** @var SwiftFactory */
53
+    private $connectionFactory;
54
+    /**
55
+     * @var \OpenStack\ObjectStore\v1\Models\Container
56
+     */
57
+    private $container;
58
+    /**
59
+     * @var string
60
+     */
61
+    private $bucket;
62
+    /**
63
+     * Connection parameters
64
+     *
65
+     * @var array
66
+     */
67
+    private $params;
68
+
69
+    /** @var string */
70
+    private $id;
71
+
72
+    /** @var \OC\Files\ObjectStore\Swift */
73
+    private $objectStore;
74
+
75
+    /**
76
+     * Key value cache mapping path to data object. Maps path to
77
+     * \OpenCloud\OpenStack\ObjectStorage\Resource\DataObject for existing
78
+     * paths and path to false for not existing paths.
79
+     *
80
+     * @var \OCP\ICache
81
+     */
82
+    private $objectCache;
83
+
84
+    /**
85
+     * @param string $path
86
+     * @return mixed|string
87
+     */
88
+    private function normalizePath(string $path) {
89
+        $path = trim($path, '/');
90
+
91
+        if (!$path) {
92
+            $path = '.';
93
+        }
94
+
95
+        $path = str_replace('#', '%23', $path);
96
+
97
+        return $path;
98
+    }
99
+
100
+    const SUBCONTAINER_FILE = '.subcontainers';
101
+
102
+    /**
103
+     * translate directory path to container name
104
+     *
105
+     * @param string $path
106
+     * @return string
107
+     */
108
+
109
+    /**
110
+     * Fetches an object from the API.
111
+     * If the object is cached already or a
112
+     * failed "doesn't exist" response was cached,
113
+     * that one will be returned.
114
+     *
115
+     * @param string $path
116
+     * @return StorageObject|bool object
117
+     * or false if the object did not exist
118
+     * @throws \OCP\Files\StorageAuthException
119
+     * @throws \OCP\Files\StorageNotAvailableException
120
+     */
121
+    private function fetchObject(string $path) {
122
+        if ($this->objectCache->hasKey($path)) {
123
+            // might be "false" if object did not exist from last check
124
+            return $this->objectCache->get($path);
125
+        }
126
+        try {
127
+            $object = $this->getContainer()->getObject($path);
128
+            $object->retrieve();
129
+            $this->objectCache->set($path, $object);
130
+            return $object;
131
+        } catch (BadResponseError $e) {
132
+            // Expected response is "404 Not Found", so only log if it isn't
133
+            if ($e->getResponse()->getStatusCode() !== 404) {
134
+                \OC::$server->getLogger()->logException($e, [
135
+                    'level' => \OCP\Util::ERROR,
136
+                    'app' => 'files_external',
137
+                ]);
138
+            }
139
+            $this->objectCache->set($path, false);
140
+            return false;
141
+        }
142
+    }
143
+
144
+    /**
145
+     * Returns whether the given path exists.
146
+     *
147
+     * @param string $path
148
+     *
149
+     * @return bool true if the object exist, false otherwise
150
+     * @throws \OCP\Files\StorageAuthException
151
+     * @throws \OCP\Files\StorageNotAvailableException
152
+     */
153
+    private function doesObjectExist($path) {
154
+        return $this->fetchObject($path) !== false;
155
+    }
156
+
157
+    public function __construct($params) {
158
+        if ((empty($params['key']) and empty($params['password']))
159
+            or (empty($params['user']) && empty($params['userid'])) or empty($params['bucket'])
160
+            or empty($params['region'])
161
+        ) {
162
+            throw new StorageBadConfigException("API Key or password, Username, Bucket and Region have to be configured.");
163
+        }
164
+
165
+        $user = isset($params['user']) ? $params['user'] : $params['userid'];
166
+        $this->id = 'swift::' . $user . md5($params['bucket']);
167
+
168
+        $bucketUrl = new Uri($params['bucket']);
169
+        if ($bucketUrl->getHost()) {
170
+            $params['bucket'] = basename($bucketUrl->getPath());
171
+            $params['endpoint_url'] = (string)$bucketUrl->withPath(dirname($bucketUrl->getPath()));
172
+        }
173
+
174
+        if (empty($params['url'])) {
175
+            $params['url'] = 'https://identity.api.rackspacecloud.com/v2.0/';
176
+        }
177
+
178
+        if (empty($params['service_name'])) {
179
+            $params['service_name'] = 'cloudFiles';
180
+        }
181
+
182
+        $params['autocreate'] = true;
183
+
184
+        if (isset($params['userid'])) {
185
+            $params['user'] = [
186
+                'id' => $params['userid'],
187
+                'password' => $params['password']
188
+            ];
189
+        }
190
+
191
+        $this->params = $params;
192
+        // FIXME: private class...
193
+        $this->objectCache = new \OC\Cache\CappedMemoryCache();
194
+        $this->connectionFactory = new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift/'), $this->params);
195
+        $this->objectStore = new \OC\Files\ObjectStore\Swift($this->params, $this->connectionFactory);
196
+        $this->bucket = $params['bucket'];
197
+    }
198
+
199
+    public function mkdir($path) {
200
+        $path = $this->normalizePath($path);
201
+
202
+        if ($this->is_dir($path)) {
203
+            return false;
204
+        }
205
+
206
+        if ($path !== '.') {
207
+            $path .= '/';
208
+        }
209
+
210
+        try {
211
+            $this->getContainer()->createObject([
212
+                'name' => $path,
213
+                'content' => '',
214
+                'headers' => ['content-type' => 'httpd/unix-directory']
215
+            ]);
216
+            // invalidate so that the next access gets the real object
217
+            // with all properties
218
+            $this->objectCache->remove($path);
219
+        } catch (BadResponseError $e) {
220
+            \OC::$server->getLogger()->logException($e, [
221
+                'level' => \OCP\Util::ERROR,
222
+                'app' => 'files_external',
223
+            ]);
224
+            return false;
225
+        }
226
+
227
+        return true;
228
+    }
229
+
230
+    public function file_exists($path) {
231
+        $path = $this->normalizePath($path);
232
+
233
+        if ($path !== '.' && $this->is_dir($path)) {
234
+            $path .= '/';
235
+        }
236
+
237
+        return $this->doesObjectExist($path);
238
+    }
239
+
240
+    public function rmdir($path) {
241
+        $path = $this->normalizePath($path);
242
+
243
+        if (!$this->is_dir($path) || !$this->isDeletable($path)) {
244
+            return false;
245
+        }
246
+
247
+        $dh = $this->opendir($path);
248
+        while ($file = readdir($dh)) {
249
+            if (\OC\Files\Filesystem::isIgnoredDir($file)) {
250
+                continue;
251
+            }
252
+
253
+            if ($this->is_dir($path . '/' . $file)) {
254
+                $this->rmdir($path . '/' . $file);
255
+            } else {
256
+                $this->unlink($path . '/' . $file);
257
+            }
258
+        }
259
+
260
+        try {
261
+            $this->objectStore->deleteObject($path . '/');
262
+            $this->objectCache->remove($path . '/');
263
+        } catch (BadResponseError $e) {
264
+            \OC::$server->getLogger()->logException($e, [
265
+                'level' => \OCP\Util::ERROR,
266
+                'app' => 'files_external',
267
+            ]);
268
+            return false;
269
+        }
270
+
271
+        return true;
272
+    }
273
+
274
+    public function opendir($path) {
275
+        $path = $this->normalizePath($path);
276
+
277
+        if ($path === '.') {
278
+            $path = '';
279
+        } else {
280
+            $path .= '/';
281
+        }
282 282
 
283 283
 //		$path = str_replace('%23', '#', $path); // the prefix is sent as a query param, so revert the encoding of #
284 284
 
285
-		try {
286
-			$files = [];
287
-			$objects = $this->getContainer()->listObjects([
288
-				'prefix' => $path,
289
-				'delimiter' => '/'
290
-			]);
291
-
292
-			/** @var StorageObject $object */
293
-			foreach ($objects as $object) {
294
-				$file = basename($object->name);
295
-				if ($file !== basename($path) && $file !== '.') {
296
-					$files[] = $file;
297
-				}
298
-			}
299
-
300
-			return IteratorDirectory::wrap($files);
301
-		} catch (\Exception $e) {
302
-			\OC::$server->getLogger()->logException($e, [
303
-				'level' => \OCP\Util::ERROR,
304
-				'app' => 'files_external',
305
-			]);
306
-			return false;
307
-		}
308
-
309
-	}
310
-
311
-	public function stat($path) {
312
-		$path = $this->normalizePath($path);
313
-
314
-		if ($path === '.') {
315
-			$path = '';
316
-		} else if ($this->is_dir($path)) {
317
-			$path .= '/';
318
-		}
319
-
320
-		try {
321
-			$object = $this->fetchObject($path);
322
-			if (!$object) {
323
-				return false;
324
-			}
325
-		} catch (BadResponseError $e) {
326
-			\OC::$server->getLogger()->logException($e, [
327
-				'level' => \OCP\Util::ERROR,
328
-				'app' => 'files_external',
329
-			]);
330
-			return false;
331
-		}
332
-
333
-		$dateTime = $object->lastModified ? \DateTime::createFromFormat(\DateTime::RFC1123, $object->lastModified) : false;
334
-		$mtime = $dateTime ? $dateTime->getTimestamp() : null;
335
-		$objectMetadata = $object->getMetadata();
336
-		if (isset($objectMetadata['timestamp'])) {
337
-			$mtime = $objectMetadata['timestamp'];
338
-		}
339
-
340
-		if (!empty($mtime)) {
341
-			$mtime = floor($mtime);
342
-		}
343
-
344
-		$stat = array();
345
-		$stat['size'] = (int)$object->contentLength;
346
-		$stat['mtime'] = $mtime;
347
-		$stat['atime'] = time();
348
-		return $stat;
349
-	}
350
-
351
-	public function filetype($path) {
352
-		$path = $this->normalizePath($path);
353
-
354
-		if ($path !== '.' && $this->doesObjectExist($path)) {
355
-			return 'file';
356
-		}
357
-
358
-		if ($path !== '.') {
359
-			$path .= '/';
360
-		}
361
-
362
-		if ($this->doesObjectExist($path)) {
363
-			return 'dir';
364
-		}
365
-	}
366
-
367
-	public function unlink($path) {
368
-		$path = $this->normalizePath($path);
369
-
370
-		if ($this->is_dir($path)) {
371
-			return $this->rmdir($path);
372
-		}
373
-
374
-		try {
375
-			$this->objectStore->deleteObject($path);
376
-			$this->objectCache->remove($path);
377
-			$this->objectCache->remove($path . '/');
378
-		} catch (BadResponseError $e) {
379
-			if ($e->getResponse()->getStatusCode() !== 404) {
380
-				\OC::$server->getLogger()->logException($e, [
381
-					'level' => \OCP\Util::ERROR,
382
-					'app' => 'files_external',
383
-				]);
384
-				throw $e;
385
-			}
386
-		}
387
-
388
-		return true;
389
-	}
390
-
391
-	public function fopen($path, $mode) {
392
-		$path = $this->normalizePath($path);
393
-
394
-		switch ($mode) {
395
-			case 'a':
396
-			case 'ab':
397
-			case 'a+':
398
-				return false;
399
-			case 'r':
400
-			case 'rb':
401
-				try {
402
-					return $this->objectStore->readObject($path);
403
-				} catch (BadResponseError $e) {
404
-					\OC::$server->getLogger()->logException($e, [
405
-						'level' => \OCP\Util::ERROR,
406
-						'app' => 'files_external',
407
-					]);
408
-					return false;
409
-				}
410
-			case 'w':
411
-			case 'wb':
412
-			case 'r+':
413
-			case 'w+':
414
-			case 'wb+':
415
-			case 'x':
416
-			case 'x+':
417
-			case 'c':
418
-			case 'c+':
419
-				if (strrpos($path, '.') !== false) {
420
-					$ext = substr($path, strrpos($path, '.'));
421
-				} else {
422
-					$ext = '';
423
-				}
424
-				$tmpFile = \OCP\Files::tmpFile($ext);
425
-				// Fetch existing file if required
426
-				if ($mode[0] !== 'w' && $this->file_exists($path)) {
427
-					if ($mode[0] === 'x') {
428
-						// File cannot already exist
429
-						return false;
430
-					}
431
-					$source = $this->fopen($path, 'r');
432
-					file_put_contents($tmpFile, $source);
433
-				}
434
-				$handle = fopen($tmpFile, $mode);
435
-				return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
436
-					$this->writeBack($tmpFile, $path);
437
-				});
438
-		}
439
-	}
440
-
441
-	public function touch($path, $mtime = null) {
442
-		$path = $this->normalizePath($path);
443
-		if (is_null($mtime)) {
444
-			$mtime = time();
445
-		}
446
-		$metadata = ['timestamp' => $mtime];
447
-		if ($this->file_exists($path)) {
448
-			if ($this->is_dir($path) && $path !== '.') {
449
-				$path .= '/';
450
-			}
451
-
452
-			$object = $this->fetchObject($path);
453
-			if ($object->mergeMetadata($metadata)) {
454
-				// invalidate target object to force repopulation on fetch
455
-				$this->objectCache->remove($path);
456
-			}
457
-			return true;
458
-		} else {
459
-			$mimeType = \OC::$server->getMimeTypeDetector()->detectPath($path);
460
-			$this->getContainer()->createObject([
461
-				'name' => $path,
462
-				'content' => '',
463
-				'headers' => ['content-type' => 'httpd/unix-directory']
464
-			]);
465
-			// invalidate target object to force repopulation on fetch
466
-			$this->objectCache->remove($path);
467
-			return true;
468
-		}
469
-	}
470
-
471
-	public function copy($path1, $path2) {
472
-		$path1 = $this->normalizePath($path1);
473
-		$path2 = $this->normalizePath($path2);
474
-
475
-		$fileType = $this->filetype($path1);
476
-		if ($fileType) {
477
-			// make way
478
-			$this->unlink($path2);
479
-		}
480
-
481
-		if ($fileType === 'file') {
482
-			try {
483
-				$source = $this->fetchObject($path1);
484
-				$source->copy([
485
-					'destination' => $this->bucket . '/' . $path2
486
-				]);
487
-				// invalidate target object to force repopulation on fetch
488
-				$this->objectCache->remove($path2);
489
-				$this->objectCache->remove($path2 . '/');
490
-			} catch (BadResponseError $e) {
491
-				\OC::$server->getLogger()->logException($e, [
492
-					'level' => \OCP\Util::ERROR,
493
-					'app' => 'files_external',
494
-				]);
495
-				return false;
496
-			}
497
-
498
-		} else if ($fileType === 'dir') {
499
-			try {
500
-				$source = $this->fetchObject($path1 . '/');
501
-				$source->copy([
502
-					'destination' => $this->bucket . '/' . $path2 . '/'
503
-				]);
504
-				// invalidate target object to force repopulation on fetch
505
-				$this->objectCache->remove($path2);
506
-				$this->objectCache->remove($path2 . '/');
507
-			} catch (BadResponseError $e) {
508
-				\OC::$server->getLogger()->logException($e, [
509
-					'level' => \OCP\Util::ERROR,
510
-					'app' => 'files_external',
511
-				]);
512
-				return false;
513
-			}
514
-
515
-			$dh = $this->opendir($path1);
516
-			while ($file = readdir($dh)) {
517
-				if (\OC\Files\Filesystem::isIgnoredDir($file)) {
518
-					continue;
519
-				}
520
-
521
-				$source = $path1 . '/' . $file;
522
-				$target = $path2 . '/' . $file;
523
-				$this->copy($source, $target);
524
-			}
525
-
526
-		} else {
527
-			//file does not exist
528
-			return false;
529
-		}
530
-
531
-		return true;
532
-	}
533
-
534
-	public function rename($path1, $path2) {
535
-		$path1 = $this->normalizePath($path1);
536
-		$path2 = $this->normalizePath($path2);
537
-
538
-		$fileType = $this->filetype($path1);
539
-
540
-		if ($fileType === 'dir' || $fileType === 'file') {
541
-			// copy
542
-			if ($this->copy($path1, $path2) === false) {
543
-				return false;
544
-			}
545
-
546
-			// cleanup
547
-			if ($this->unlink($path1) === false) {
548
-				throw new \Exception('failed to remove original');
549
-				$this->unlink($path2);
550
-				return false;
551
-			}
552
-
553
-			return true;
554
-		}
555
-
556
-		return false;
557
-	}
558
-
559
-	public function getId() {
560
-		return $this->id;
561
-	}
562
-
563
-	/**
564
-	 * Returns the initialized object store container.
565
-	 *
566
-	 * @return \OpenStack\ObjectStore\v1\Models\Container
567
-	 * @throws \OCP\Files\StorageAuthException
568
-	 * @throws \OCP\Files\StorageNotAvailableException
569
-	 */
570
-	public function getContainer() {
571
-		if (is_null($this->container)) {
572
-			$this->container = $this->connectionFactory->getContainer();
573
-
574
-			if (!$this->file_exists('.')) {
575
-				$this->mkdir('.');
576
-			}
577
-		}
578
-		return $this->container;
579
-	}
580
-
581
-	public function writeBack($tmpFile, $path) {
582
-		$fileData = fopen($tmpFile, 'r');
583
-		$this->objectStore->writeObject($path, $fileData);
584
-		// invalidate target object to force repopulation on fetch
585
-		$this->objectCache->remove($path);
586
-		unlink($tmpFile);
587
-	}
588
-
589
-	public function hasUpdated($path, $time) {
590
-		if ($this->is_file($path)) {
591
-			return parent::hasUpdated($path, $time);
592
-		}
593
-		$path = $this->normalizePath($path);
594
-		$dh = $this->opendir($path);
595
-		$content = array();
596
-		while (($file = readdir($dh)) !== false) {
597
-			$content[] = $file;
598
-		}
599
-		if ($path === '.') {
600
-			$path = '';
601
-		}
602
-		$cachedContent = $this->getCache()->getFolderContents($path);
603
-		$cachedNames = array_map(function ($content) {
604
-			return $content['name'];
605
-		}, $cachedContent);
606
-		sort($cachedNames);
607
-		sort($content);
608
-		return $cachedNames !== $content;
609
-	}
610
-
611
-	/**
612
-	 * check if curl is installed
613
-	 */
614
-	public static function checkDependencies() {
615
-		return true;
616
-	}
285
+        try {
286
+            $files = [];
287
+            $objects = $this->getContainer()->listObjects([
288
+                'prefix' => $path,
289
+                'delimiter' => '/'
290
+            ]);
291
+
292
+            /** @var StorageObject $object */
293
+            foreach ($objects as $object) {
294
+                $file = basename($object->name);
295
+                if ($file !== basename($path) && $file !== '.') {
296
+                    $files[] = $file;
297
+                }
298
+            }
299
+
300
+            return IteratorDirectory::wrap($files);
301
+        } catch (\Exception $e) {
302
+            \OC::$server->getLogger()->logException($e, [
303
+                'level' => \OCP\Util::ERROR,
304
+                'app' => 'files_external',
305
+            ]);
306
+            return false;
307
+        }
308
+
309
+    }
310
+
311
+    public function stat($path) {
312
+        $path = $this->normalizePath($path);
313
+
314
+        if ($path === '.') {
315
+            $path = '';
316
+        } else if ($this->is_dir($path)) {
317
+            $path .= '/';
318
+        }
319
+
320
+        try {
321
+            $object = $this->fetchObject($path);
322
+            if (!$object) {
323
+                return false;
324
+            }
325
+        } catch (BadResponseError $e) {
326
+            \OC::$server->getLogger()->logException($e, [
327
+                'level' => \OCP\Util::ERROR,
328
+                'app' => 'files_external',
329
+            ]);
330
+            return false;
331
+        }
332
+
333
+        $dateTime = $object->lastModified ? \DateTime::createFromFormat(\DateTime::RFC1123, $object->lastModified) : false;
334
+        $mtime = $dateTime ? $dateTime->getTimestamp() : null;
335
+        $objectMetadata = $object->getMetadata();
336
+        if (isset($objectMetadata['timestamp'])) {
337
+            $mtime = $objectMetadata['timestamp'];
338
+        }
339
+
340
+        if (!empty($mtime)) {
341
+            $mtime = floor($mtime);
342
+        }
343
+
344
+        $stat = array();
345
+        $stat['size'] = (int)$object->contentLength;
346
+        $stat['mtime'] = $mtime;
347
+        $stat['atime'] = time();
348
+        return $stat;
349
+    }
350
+
351
+    public function filetype($path) {
352
+        $path = $this->normalizePath($path);
353
+
354
+        if ($path !== '.' && $this->doesObjectExist($path)) {
355
+            return 'file';
356
+        }
357
+
358
+        if ($path !== '.') {
359
+            $path .= '/';
360
+        }
361
+
362
+        if ($this->doesObjectExist($path)) {
363
+            return 'dir';
364
+        }
365
+    }
366
+
367
+    public function unlink($path) {
368
+        $path = $this->normalizePath($path);
369
+
370
+        if ($this->is_dir($path)) {
371
+            return $this->rmdir($path);
372
+        }
373
+
374
+        try {
375
+            $this->objectStore->deleteObject($path);
376
+            $this->objectCache->remove($path);
377
+            $this->objectCache->remove($path . '/');
378
+        } catch (BadResponseError $e) {
379
+            if ($e->getResponse()->getStatusCode() !== 404) {
380
+                \OC::$server->getLogger()->logException($e, [
381
+                    'level' => \OCP\Util::ERROR,
382
+                    'app' => 'files_external',
383
+                ]);
384
+                throw $e;
385
+            }
386
+        }
387
+
388
+        return true;
389
+    }
390
+
391
+    public function fopen($path, $mode) {
392
+        $path = $this->normalizePath($path);
393
+
394
+        switch ($mode) {
395
+            case 'a':
396
+            case 'ab':
397
+            case 'a+':
398
+                return false;
399
+            case 'r':
400
+            case 'rb':
401
+                try {
402
+                    return $this->objectStore->readObject($path);
403
+                } catch (BadResponseError $e) {
404
+                    \OC::$server->getLogger()->logException($e, [
405
+                        'level' => \OCP\Util::ERROR,
406
+                        'app' => 'files_external',
407
+                    ]);
408
+                    return false;
409
+                }
410
+            case 'w':
411
+            case 'wb':
412
+            case 'r+':
413
+            case 'w+':
414
+            case 'wb+':
415
+            case 'x':
416
+            case 'x+':
417
+            case 'c':
418
+            case 'c+':
419
+                if (strrpos($path, '.') !== false) {
420
+                    $ext = substr($path, strrpos($path, '.'));
421
+                } else {
422
+                    $ext = '';
423
+                }
424
+                $tmpFile = \OCP\Files::tmpFile($ext);
425
+                // Fetch existing file if required
426
+                if ($mode[0] !== 'w' && $this->file_exists($path)) {
427
+                    if ($mode[0] === 'x') {
428
+                        // File cannot already exist
429
+                        return false;
430
+                    }
431
+                    $source = $this->fopen($path, 'r');
432
+                    file_put_contents($tmpFile, $source);
433
+                }
434
+                $handle = fopen($tmpFile, $mode);
435
+                return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
436
+                    $this->writeBack($tmpFile, $path);
437
+                });
438
+        }
439
+    }
440
+
441
+    public function touch($path, $mtime = null) {
442
+        $path = $this->normalizePath($path);
443
+        if (is_null($mtime)) {
444
+            $mtime = time();
445
+        }
446
+        $metadata = ['timestamp' => $mtime];
447
+        if ($this->file_exists($path)) {
448
+            if ($this->is_dir($path) && $path !== '.') {
449
+                $path .= '/';
450
+            }
451
+
452
+            $object = $this->fetchObject($path);
453
+            if ($object->mergeMetadata($metadata)) {
454
+                // invalidate target object to force repopulation on fetch
455
+                $this->objectCache->remove($path);
456
+            }
457
+            return true;
458
+        } else {
459
+            $mimeType = \OC::$server->getMimeTypeDetector()->detectPath($path);
460
+            $this->getContainer()->createObject([
461
+                'name' => $path,
462
+                'content' => '',
463
+                'headers' => ['content-type' => 'httpd/unix-directory']
464
+            ]);
465
+            // invalidate target object to force repopulation on fetch
466
+            $this->objectCache->remove($path);
467
+            return true;
468
+        }
469
+    }
470
+
471
+    public function copy($path1, $path2) {
472
+        $path1 = $this->normalizePath($path1);
473
+        $path2 = $this->normalizePath($path2);
474
+
475
+        $fileType = $this->filetype($path1);
476
+        if ($fileType) {
477
+            // make way
478
+            $this->unlink($path2);
479
+        }
480
+
481
+        if ($fileType === 'file') {
482
+            try {
483
+                $source = $this->fetchObject($path1);
484
+                $source->copy([
485
+                    'destination' => $this->bucket . '/' . $path2
486
+                ]);
487
+                // invalidate target object to force repopulation on fetch
488
+                $this->objectCache->remove($path2);
489
+                $this->objectCache->remove($path2 . '/');
490
+            } catch (BadResponseError $e) {
491
+                \OC::$server->getLogger()->logException($e, [
492
+                    'level' => \OCP\Util::ERROR,
493
+                    'app' => 'files_external',
494
+                ]);
495
+                return false;
496
+            }
497
+
498
+        } else if ($fileType === 'dir') {
499
+            try {
500
+                $source = $this->fetchObject($path1 . '/');
501
+                $source->copy([
502
+                    'destination' => $this->bucket . '/' . $path2 . '/'
503
+                ]);
504
+                // invalidate target object to force repopulation on fetch
505
+                $this->objectCache->remove($path2);
506
+                $this->objectCache->remove($path2 . '/');
507
+            } catch (BadResponseError $e) {
508
+                \OC::$server->getLogger()->logException($e, [
509
+                    'level' => \OCP\Util::ERROR,
510
+                    'app' => 'files_external',
511
+                ]);
512
+                return false;
513
+            }
514
+
515
+            $dh = $this->opendir($path1);
516
+            while ($file = readdir($dh)) {
517
+                if (\OC\Files\Filesystem::isIgnoredDir($file)) {
518
+                    continue;
519
+                }
520
+
521
+                $source = $path1 . '/' . $file;
522
+                $target = $path2 . '/' . $file;
523
+                $this->copy($source, $target);
524
+            }
525
+
526
+        } else {
527
+            //file does not exist
528
+            return false;
529
+        }
530
+
531
+        return true;
532
+    }
533
+
534
+    public function rename($path1, $path2) {
535
+        $path1 = $this->normalizePath($path1);
536
+        $path2 = $this->normalizePath($path2);
537
+
538
+        $fileType = $this->filetype($path1);
539
+
540
+        if ($fileType === 'dir' || $fileType === 'file') {
541
+            // copy
542
+            if ($this->copy($path1, $path2) === false) {
543
+                return false;
544
+            }
545
+
546
+            // cleanup
547
+            if ($this->unlink($path1) === false) {
548
+                throw new \Exception('failed to remove original');
549
+                $this->unlink($path2);
550
+                return false;
551
+            }
552
+
553
+            return true;
554
+        }
555
+
556
+        return false;
557
+    }
558
+
559
+    public function getId() {
560
+        return $this->id;
561
+    }
562
+
563
+    /**
564
+     * Returns the initialized object store container.
565
+     *
566
+     * @return \OpenStack\ObjectStore\v1\Models\Container
567
+     * @throws \OCP\Files\StorageAuthException
568
+     * @throws \OCP\Files\StorageNotAvailableException
569
+     */
570
+    public function getContainer() {
571
+        if (is_null($this->container)) {
572
+            $this->container = $this->connectionFactory->getContainer();
573
+
574
+            if (!$this->file_exists('.')) {
575
+                $this->mkdir('.');
576
+            }
577
+        }
578
+        return $this->container;
579
+    }
580
+
581
+    public function writeBack($tmpFile, $path) {
582
+        $fileData = fopen($tmpFile, 'r');
583
+        $this->objectStore->writeObject($path, $fileData);
584
+        // invalidate target object to force repopulation on fetch
585
+        $this->objectCache->remove($path);
586
+        unlink($tmpFile);
587
+    }
588
+
589
+    public function hasUpdated($path, $time) {
590
+        if ($this->is_file($path)) {
591
+            return parent::hasUpdated($path, $time);
592
+        }
593
+        $path = $this->normalizePath($path);
594
+        $dh = $this->opendir($path);
595
+        $content = array();
596
+        while (($file = readdir($dh)) !== false) {
597
+            $content[] = $file;
598
+        }
599
+        if ($path === '.') {
600
+            $path = '';
601
+        }
602
+        $cachedContent = $this->getCache()->getFolderContents($path);
603
+        $cachedNames = array_map(function ($content) {
604
+            return $content['name'];
605
+        }, $cachedContent);
606
+        sort($cachedNames);
607
+        sort($content);
608
+        return $cachedNames !== $content;
609
+    }
610
+
611
+    /**
612
+     * check if curl is installed
613
+     */
614
+    public static function checkDependencies() {
615
+        return true;
616
+    }
617 617
 
618 618
 }
Please login to merge, or discard this patch.
Spacing   +19 added lines, -19 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-declare(strict_types=1);
2
+declare(strict_types = 1);
3 3
 /**
4 4
  * @copyright Copyright (c) 2016, ownCloud, Inc.
5 5
  *
@@ -163,12 +163,12 @@  discard block
 block discarded – undo
163 163
 		}
164 164
 
165 165
 		$user = isset($params['user']) ? $params['user'] : $params['userid'];
166
-		$this->id = 'swift::' . $user . md5($params['bucket']);
166
+		$this->id = 'swift::'.$user.md5($params['bucket']);
167 167
 
168 168
 		$bucketUrl = new Uri($params['bucket']);
169 169
 		if ($bucketUrl->getHost()) {
170 170
 			$params['bucket'] = basename($bucketUrl->getPath());
171
-			$params['endpoint_url'] = (string)$bucketUrl->withPath(dirname($bucketUrl->getPath()));
171
+			$params['endpoint_url'] = (string) $bucketUrl->withPath(dirname($bucketUrl->getPath()));
172 172
 		}
173 173
 
174 174
 		if (empty($params['url'])) {
@@ -250,16 +250,16 @@  discard block
 block discarded – undo
250 250
 				continue;
251 251
 			}
252 252
 
253
-			if ($this->is_dir($path . '/' . $file)) {
254
-				$this->rmdir($path . '/' . $file);
253
+			if ($this->is_dir($path.'/'.$file)) {
254
+				$this->rmdir($path.'/'.$file);
255 255
 			} else {
256
-				$this->unlink($path . '/' . $file);
256
+				$this->unlink($path.'/'.$file);
257 257
 			}
258 258
 		}
259 259
 
260 260
 		try {
261
-			$this->objectStore->deleteObject($path . '/');
262
-			$this->objectCache->remove($path . '/');
261
+			$this->objectStore->deleteObject($path.'/');
262
+			$this->objectCache->remove($path.'/');
263 263
 		} catch (BadResponseError $e) {
264 264
 			\OC::$server->getLogger()->logException($e, [
265 265
 				'level' => \OCP\Util::ERROR,
@@ -342,7 +342,7 @@  discard block
 block discarded – undo
342 342
 		}
343 343
 
344 344
 		$stat = array();
345
-		$stat['size'] = (int)$object->contentLength;
345
+		$stat['size'] = (int) $object->contentLength;
346 346
 		$stat['mtime'] = $mtime;
347 347
 		$stat['atime'] = time();
348 348
 		return $stat;
@@ -374,7 +374,7 @@  discard block
 block discarded – undo
374 374
 		try {
375 375
 			$this->objectStore->deleteObject($path);
376 376
 			$this->objectCache->remove($path);
377
-			$this->objectCache->remove($path . '/');
377
+			$this->objectCache->remove($path.'/');
378 378
 		} catch (BadResponseError $e) {
379 379
 			if ($e->getResponse()->getStatusCode() !== 404) {
380 380
 				\OC::$server->getLogger()->logException($e, [
@@ -432,7 +432,7 @@  discard block
 block discarded – undo
432 432
 					file_put_contents($tmpFile, $source);
433 433
 				}
434 434
 				$handle = fopen($tmpFile, $mode);
435
-				return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
435
+				return CallbackWrapper::wrap($handle, null, null, function() use ($path, $tmpFile) {
436 436
 					$this->writeBack($tmpFile, $path);
437 437
 				});
438 438
 		}
@@ -482,11 +482,11 @@  discard block
 block discarded – undo
482 482
 			try {
483 483
 				$source = $this->fetchObject($path1);
484 484
 				$source->copy([
485
-					'destination' => $this->bucket . '/' . $path2
485
+					'destination' => $this->bucket.'/'.$path2
486 486
 				]);
487 487
 				// invalidate target object to force repopulation on fetch
488 488
 				$this->objectCache->remove($path2);
489
-				$this->objectCache->remove($path2 . '/');
489
+				$this->objectCache->remove($path2.'/');
490 490
 			} catch (BadResponseError $e) {
491 491
 				\OC::$server->getLogger()->logException($e, [
492 492
 					'level' => \OCP\Util::ERROR,
@@ -497,13 +497,13 @@  discard block
 block discarded – undo
497 497
 
498 498
 		} else if ($fileType === 'dir') {
499 499
 			try {
500
-				$source = $this->fetchObject($path1 . '/');
500
+				$source = $this->fetchObject($path1.'/');
501 501
 				$source->copy([
502
-					'destination' => $this->bucket . '/' . $path2 . '/'
502
+					'destination' => $this->bucket.'/'.$path2.'/'
503 503
 				]);
504 504
 				// invalidate target object to force repopulation on fetch
505 505
 				$this->objectCache->remove($path2);
506
-				$this->objectCache->remove($path2 . '/');
506
+				$this->objectCache->remove($path2.'/');
507 507
 			} catch (BadResponseError $e) {
508 508
 				\OC::$server->getLogger()->logException($e, [
509 509
 					'level' => \OCP\Util::ERROR,
@@ -518,8 +518,8 @@  discard block
 block discarded – undo
518 518
 					continue;
519 519
 				}
520 520
 
521
-				$source = $path1 . '/' . $file;
522
-				$target = $path2 . '/' . $file;
521
+				$source = $path1.'/'.$file;
522
+				$target = $path2.'/'.$file;
523 523
 				$this->copy($source, $target);
524 524
 			}
525 525
 
@@ -600,7 +600,7 @@  discard block
 block discarded – undo
600 600
 			$path = '';
601 601
 		}
602 602
 		$cachedContent = $this->getCache()->getFolderContents($path);
603
-		$cachedNames = array_map(function ($content) {
603
+		$cachedNames = array_map(function($content) {
604 604
 			return $content['name'];
605 605
 		}, $cachedContent);
606 606
 		sort($cachedNames);
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/Swift.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -31,87 +31,87 @@
 block discarded – undo
31 31
 use OCP\Files\StorageAuthException;
32 32
 
33 33
 class Swift implements IObjectStore {
34
-	/**
35
-	 * @var array
36
-	 */
37
-	private $params;
38
-
39
-	/**
40
-	 * @var \OpenStack\ObjectStore\v1\Models\Container|null
41
-	 */
42
-	private $container = null;
43
-
44
-	/** @var SwiftFactory */
45
-	private $swiftFactory;
46
-
47
-	public function __construct($params, SwiftFactory $connectionFactory = null) {
48
-		$this->swiftFactory = $connectionFactory ?: new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift::'), $params);
49
-		$this->params = $params;
50
-	}
51
-
52
-	/**
53
-	 * @return \OpenStack\ObjectStore\v1\Models\Container
54
-	 * @throws StorageAuthException
55
-	 * @throws \OCP\Files\StorageNotAvailableException
56
-	 */
57
-	private function getContainer() {
58
-		return $this->swiftFactory->getContainer();
59
-	}
60
-
61
-	/**
62
-	 * @return string the container name where objects are stored
63
-	 */
64
-	public function getStorageId() {
65
-		return $this->params['container'];
66
-	}
67
-
68
-	/**
69
-	 * @param string $urn the unified resource name used to identify the object
70
-	 * @param resource $stream stream with the data to write
71
-	 * @throws \Exception from openstack lib when something goes wrong
72
-	 */
73
-	public function writeObject($urn, $stream) {
74
-		$this->getContainer()->createObject([
75
-			'name' => $urn,
76
-			'stream' => stream_for($stream)
77
-		]);
78
-	}
79
-
80
-	/**
81
-	 * @param string $urn the unified resource name used to identify the object
82
-	 * @return resource stream with the read data
83
-	 * @throws \Exception from openstack lib when something goes wrong
84
-	 */
85
-	public function readObject($urn) {
86
-		$object = $this->getContainer()->getObject($urn);
87
-
88
-		// we need to keep a reference to objectContent or
89
-		// the stream will be closed before we can do anything with it
90
-		$objectContent = $object->download();
91
-		$objectContent->rewind();
92
-
93
-		$stream = $objectContent->detach();
94
-		// save the object content in the context of the stream to prevent it being gc'd until the stream is closed
95
-		stream_context_set_option($stream, 'swift', 'content', $objectContent);
96
-
97
-		return RetryWrapper::wrap($stream);
98
-	}
99
-
100
-	/**
101
-	 * @param string $urn Unified Resource Name
102
-	 * @return void
103
-	 * @throws \Exception from openstack lib when something goes wrong
104
-	 */
105
-	public function deleteObject($urn) {
106
-		$this->getContainer()->getObject($urn)->delete();
107
-	}
108
-
109
-	/**
110
-	 * @return void
111
-	 * @throws \Exception from openstack lib when something goes wrong
112
-	 */
113
-	public function deleteContainer() {
114
-		$this->getContainer()->delete();
115
-	}
34
+    /**
35
+     * @var array
36
+     */
37
+    private $params;
38
+
39
+    /**
40
+     * @var \OpenStack\ObjectStore\v1\Models\Container|null
41
+     */
42
+    private $container = null;
43
+
44
+    /** @var SwiftFactory */
45
+    private $swiftFactory;
46
+
47
+    public function __construct($params, SwiftFactory $connectionFactory = null) {
48
+        $this->swiftFactory = $connectionFactory ?: new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift::'), $params);
49
+        $this->params = $params;
50
+    }
51
+
52
+    /**
53
+     * @return \OpenStack\ObjectStore\v1\Models\Container
54
+     * @throws StorageAuthException
55
+     * @throws \OCP\Files\StorageNotAvailableException
56
+     */
57
+    private function getContainer() {
58
+        return $this->swiftFactory->getContainer();
59
+    }
60
+
61
+    /**
62
+     * @return string the container name where objects are stored
63
+     */
64
+    public function getStorageId() {
65
+        return $this->params['container'];
66
+    }
67
+
68
+    /**
69
+     * @param string $urn the unified resource name used to identify the object
70
+     * @param resource $stream stream with the data to write
71
+     * @throws \Exception from openstack lib when something goes wrong
72
+     */
73
+    public function writeObject($urn, $stream) {
74
+        $this->getContainer()->createObject([
75
+            'name' => $urn,
76
+            'stream' => stream_for($stream)
77
+        ]);
78
+    }
79
+
80
+    /**
81
+     * @param string $urn the unified resource name used to identify the object
82
+     * @return resource stream with the read data
83
+     * @throws \Exception from openstack lib when something goes wrong
84
+     */
85
+    public function readObject($urn) {
86
+        $object = $this->getContainer()->getObject($urn);
87
+
88
+        // we need to keep a reference to objectContent or
89
+        // the stream will be closed before we can do anything with it
90
+        $objectContent = $object->download();
91
+        $objectContent->rewind();
92
+
93
+        $stream = $objectContent->detach();
94
+        // save the object content in the context of the stream to prevent it being gc'd until the stream is closed
95
+        stream_context_set_option($stream, 'swift', 'content', $objectContent);
96
+
97
+        return RetryWrapper::wrap($stream);
98
+    }
99
+
100
+    /**
101
+     * @param string $urn Unified Resource Name
102
+     * @return void
103
+     * @throws \Exception from openstack lib when something goes wrong
104
+     */
105
+    public function deleteObject($urn) {
106
+        $this->getContainer()->getObject($urn)->delete();
107
+    }
108
+
109
+    /**
110
+     * @return void
111
+     * @throws \Exception from openstack lib when something goes wrong
112
+     */
113
+    public function deleteContainer() {
114
+        $this->getContainer()->delete();
115
+    }
116 116
 
117 117
 }
Please login to merge, or discard this patch.
lib/private/Files/ObjectStore/SwiftFactory.php 2 patches
Indentation   +151 added lines, -151 removed lines patch added patch discarded remove patch
@@ -40,155 +40,155 @@
 block discarded – undo
40 40
 use OpenStack\ObjectStore\v1\Models\Container;
41 41
 
42 42
 class SwiftFactory {
43
-	private $cache;
44
-	private $params;
45
-	/** @var Container|null */
46
-	private $container = null;
47
-
48
-	public function __construct(ICache $cache, array $params) {
49
-		$this->cache = $cache;
50
-		$this->params = $params;
51
-	}
52
-
53
-	private function getCachedToken(string $cacheKey) {
54
-		$cachedTokenString = $this->cache->get($cacheKey . '/token');
55
-		if ($cachedTokenString) {
56
-			return json_decode($cachedTokenString);
57
-		} else {
58
-			return null;
59
-		}
60
-	}
61
-
62
-	private function cacheToken(Token $token, string $cacheKey) {
63
-		$this->cache->set($cacheKey . '/token', json_encode($token));
64
-	}
65
-
66
-	/**
67
-	 * @return OpenStack
68
-	 * @throws StorageAuthException
69
-	 */
70
-	private function getClient() {
71
-		if (isset($this->params['bucket'])) {
72
-			$this->params['container'] = $this->params['bucket'];
73
-		}
74
-		if (!isset($this->params['container'])) {
75
-			$this->params['container'] = 'owncloud';
76
-		}
77
-		if (!isset($this->params['autocreate'])) {
78
-			// should only be true for tests
79
-			$this->params['autocreate'] = false;
80
-		}
81
-		if (isset($this->params['user']) && is_array($this->params['user'])) {
82
-			$userName = $this->params['user']['id'];
83
-		} else {
84
-			if (!isset($this->params['username']) && isset($this->params['user'])) {
85
-				$this->params['username'] = $this->params['user'];
86
-			}
87
-			$userName = $this->params['username'];
88
-		}
89
-		if (!isset($this->params['tenantName']) && isset($this->params['tenant'])) {
90
-			$this->params['tenantName'] = $this->params['tenant'];
91
-		}
92
-
93
-		$cacheKey = $userName . '@' . $this->params['url'] . '/' . $this->params['bucket'];
94
-		$token = $this->getCachedToken($cacheKey);
95
-		$hasToken = is_array($token) && (new \DateTimeImmutable($token['expires_at'])) > (new \DateTimeImmutable('now'));
96
-		if ($hasToken) {
97
-			$this->params['cachedToken'] = $token;
98
-		}
99
-
100
-		$httpClient = new Client([
101
-			'base_uri' => TransportUtils::normalizeUrl($this->params['url']),
102
-			'handler' => HandlerStack::create()
103
-		]);
104
-
105
-		if (isset($this->params['user']) && isset($this->params['user']['id'])) {
106
-			return $this->auth(IdentityV3Service::factory($httpClient), $cacheKey);
107
-		} else {
108
-			return $this->auth(IdentityV2Service::factory($httpClient), $cacheKey);
109
-		}
110
-	}
111
-
112
-	/**
113
-	 * @param IdentityV2Service|IdentityV3Service $authService
114
-	 * @param string $cacheKey
115
-	 * @return OpenStack
116
-	 * @throws StorageAuthException
117
-	 */
118
-	private function auth($authService, string $cacheKey) {
119
-		$this->params['identityService'] = $authService;
120
-		$this->params['authUrl'] = $this->params['url'];
121
-		$client = new OpenStack($this->params);
122
-
123
-		if (!isset($this->params['cachedToken'])) {
124
-			try {
125
-				$token = $authService->generateToken($this->params);
126
-				$this->cacheToken($token, $cacheKey);
127
-			} catch (ConnectException $e) {
128
-				throw new StorageAuthException('Failed to connect to keystone, verify the keystone url', $e);
129
-			} catch (ClientException $e) {
130
-				$statusCode = $e->getResponse()->getStatusCode();
131
-				if ($statusCode === 404) {
132
-					throw new StorageAuthException('Keystone not found, verify the keystone url', $e);
133
-				} else if ($statusCode === 412) {
134
-					throw new StorageAuthException('Precondition failed, verify the keystone url', $e);
135
-				} else if ($statusCode === 401) {
136
-					throw new StorageAuthException('Authentication failed, verify the username, password and possibly tenant', $e);
137
-				} else {
138
-					throw new StorageAuthException('Unknown error', $e);
139
-				}
140
-			} catch (RequestException $e) {
141
-				throw new StorageAuthException('Connection reset while connecting to keystone, verify the keystone url', $e);
142
-			}
143
-		}
144
-
145
-		return $client;
146
-	}
147
-
148
-	/**
149
-	 * @return \OpenStack\ObjectStore\v1\Models\Container
150
-	 * @throws StorageAuthException
151
-	 * @throws StorageNotAvailableException
152
-	 */
153
-	public function getContainer() {
154
-		if (is_null($this->container)) {
155
-			$this->container = $this->createContainer();
156
-		}
157
-
158
-		return $this->container;
159
-	}
160
-
161
-	/**
162
-	 * @return \OpenStack\ObjectStore\v1\Models\Container
163
-	 * @throws StorageAuthException
164
-	 * @throws StorageNotAvailableException
165
-	 */
166
-	private function createContainer() {
167
-		$client = $this->getClient();
168
-		$objectStoreService = $client->objectStoreV1();
169
-
170
-		$autoCreate = isset($this->params['autocreate']) && $this->params['autocreate'] === true;
171
-		try {
172
-			$container = $objectStoreService->getContainer($this->params['container']);
173
-			if ($autoCreate) {
174
-				$container->getMetadata();
175
-			}
176
-			return $container;
177
-		} catch (BadResponseError $ex) {
178
-			// if the container does not exist and autocreate is true try to create the container on the fly
179
-			if ($ex->getResponse()->getStatusCode() === 404 && $autoCreate) {
180
-				return $objectStoreService->createContainer([
181
-					'name' => $this->params['container']
182
-				]);
183
-			} else {
184
-				throw new StorageNotAvailableException('Invalid response while trying to get container info', StorageNotAvailableException::STATUS_ERROR, $e);
185
-			}
186
-		} catch (ConnectException $e) {
187
-			/** @var RequestInterface $request */
188
-			$request = $e->getRequest();
189
-			$host = $request->getUri()->getHost() . ':' . $request->getUri()->getPort();
190
-			\OC::$server->getLogger()->error("Can't connect to object storage server at $host");
191
-			throw new StorageNotAvailableException("Can't connect to object storage server at $host", StorageNotAvailableException::STATUS_ERROR, $e);
192
-		}
193
-	}
43
+    private $cache;
44
+    private $params;
45
+    /** @var Container|null */
46
+    private $container = null;
47
+
48
+    public function __construct(ICache $cache, array $params) {
49
+        $this->cache = $cache;
50
+        $this->params = $params;
51
+    }
52
+
53
+    private function getCachedToken(string $cacheKey) {
54
+        $cachedTokenString = $this->cache->get($cacheKey . '/token');
55
+        if ($cachedTokenString) {
56
+            return json_decode($cachedTokenString);
57
+        } else {
58
+            return null;
59
+        }
60
+    }
61
+
62
+    private function cacheToken(Token $token, string $cacheKey) {
63
+        $this->cache->set($cacheKey . '/token', json_encode($token));
64
+    }
65
+
66
+    /**
67
+     * @return OpenStack
68
+     * @throws StorageAuthException
69
+     */
70
+    private function getClient() {
71
+        if (isset($this->params['bucket'])) {
72
+            $this->params['container'] = $this->params['bucket'];
73
+        }
74
+        if (!isset($this->params['container'])) {
75
+            $this->params['container'] = 'owncloud';
76
+        }
77
+        if (!isset($this->params['autocreate'])) {
78
+            // should only be true for tests
79
+            $this->params['autocreate'] = false;
80
+        }
81
+        if (isset($this->params['user']) && is_array($this->params['user'])) {
82
+            $userName = $this->params['user']['id'];
83
+        } else {
84
+            if (!isset($this->params['username']) && isset($this->params['user'])) {
85
+                $this->params['username'] = $this->params['user'];
86
+            }
87
+            $userName = $this->params['username'];
88
+        }
89
+        if (!isset($this->params['tenantName']) && isset($this->params['tenant'])) {
90
+            $this->params['tenantName'] = $this->params['tenant'];
91
+        }
92
+
93
+        $cacheKey = $userName . '@' . $this->params['url'] . '/' . $this->params['bucket'];
94
+        $token = $this->getCachedToken($cacheKey);
95
+        $hasToken = is_array($token) && (new \DateTimeImmutable($token['expires_at'])) > (new \DateTimeImmutable('now'));
96
+        if ($hasToken) {
97
+            $this->params['cachedToken'] = $token;
98
+        }
99
+
100
+        $httpClient = new Client([
101
+            'base_uri' => TransportUtils::normalizeUrl($this->params['url']),
102
+            'handler' => HandlerStack::create()
103
+        ]);
104
+
105
+        if (isset($this->params['user']) && isset($this->params['user']['id'])) {
106
+            return $this->auth(IdentityV3Service::factory($httpClient), $cacheKey);
107
+        } else {
108
+            return $this->auth(IdentityV2Service::factory($httpClient), $cacheKey);
109
+        }
110
+    }
111
+
112
+    /**
113
+     * @param IdentityV2Service|IdentityV3Service $authService
114
+     * @param string $cacheKey
115
+     * @return OpenStack
116
+     * @throws StorageAuthException
117
+     */
118
+    private function auth($authService, string $cacheKey) {
119
+        $this->params['identityService'] = $authService;
120
+        $this->params['authUrl'] = $this->params['url'];
121
+        $client = new OpenStack($this->params);
122
+
123
+        if (!isset($this->params['cachedToken'])) {
124
+            try {
125
+                $token = $authService->generateToken($this->params);
126
+                $this->cacheToken($token, $cacheKey);
127
+            } catch (ConnectException $e) {
128
+                throw new StorageAuthException('Failed to connect to keystone, verify the keystone url', $e);
129
+            } catch (ClientException $e) {
130
+                $statusCode = $e->getResponse()->getStatusCode();
131
+                if ($statusCode === 404) {
132
+                    throw new StorageAuthException('Keystone not found, verify the keystone url', $e);
133
+                } else if ($statusCode === 412) {
134
+                    throw new StorageAuthException('Precondition failed, verify the keystone url', $e);
135
+                } else if ($statusCode === 401) {
136
+                    throw new StorageAuthException('Authentication failed, verify the username, password and possibly tenant', $e);
137
+                } else {
138
+                    throw new StorageAuthException('Unknown error', $e);
139
+                }
140
+            } catch (RequestException $e) {
141
+                throw new StorageAuthException('Connection reset while connecting to keystone, verify the keystone url', $e);
142
+            }
143
+        }
144
+
145
+        return $client;
146
+    }
147
+
148
+    /**
149
+     * @return \OpenStack\ObjectStore\v1\Models\Container
150
+     * @throws StorageAuthException
151
+     * @throws StorageNotAvailableException
152
+     */
153
+    public function getContainer() {
154
+        if (is_null($this->container)) {
155
+            $this->container = $this->createContainer();
156
+        }
157
+
158
+        return $this->container;
159
+    }
160
+
161
+    /**
162
+     * @return \OpenStack\ObjectStore\v1\Models\Container
163
+     * @throws StorageAuthException
164
+     * @throws StorageNotAvailableException
165
+     */
166
+    private function createContainer() {
167
+        $client = $this->getClient();
168
+        $objectStoreService = $client->objectStoreV1();
169
+
170
+        $autoCreate = isset($this->params['autocreate']) && $this->params['autocreate'] === true;
171
+        try {
172
+            $container = $objectStoreService->getContainer($this->params['container']);
173
+            if ($autoCreate) {
174
+                $container->getMetadata();
175
+            }
176
+            return $container;
177
+        } catch (BadResponseError $ex) {
178
+            // if the container does not exist and autocreate is true try to create the container on the fly
179
+            if ($ex->getResponse()->getStatusCode() === 404 && $autoCreate) {
180
+                return $objectStoreService->createContainer([
181
+                    'name' => $this->params['container']
182
+                ]);
183
+            } else {
184
+                throw new StorageNotAvailableException('Invalid response while trying to get container info', StorageNotAvailableException::STATUS_ERROR, $e);
185
+            }
186
+        } catch (ConnectException $e) {
187
+            /** @var RequestInterface $request */
188
+            $request = $e->getRequest();
189
+            $host = $request->getUri()->getHost() . ':' . $request->getUri()->getPort();
190
+            \OC::$server->getLogger()->error("Can't connect to object storage server at $host");
191
+            throw new StorageNotAvailableException("Can't connect to object storage server at $host", StorageNotAvailableException::STATUS_ERROR, $e);
192
+        }
193
+    }
194 194
 }
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@  discard block
 block discarded – undo
1 1
 <?php
2
-declare(strict_types=1);
2
+declare(strict_types = 1);
3 3
 /**
4 4
  * @copyright Copyright (c) 2018 Robin Appelman <[email protected]>
5 5
  *
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
 	}
52 52
 
53 53
 	private function getCachedToken(string $cacheKey) {
54
-		$cachedTokenString = $this->cache->get($cacheKey . '/token');
54
+		$cachedTokenString = $this->cache->get($cacheKey.'/token');
55 55
 		if ($cachedTokenString) {
56 56
 			return json_decode($cachedTokenString);
57 57
 		} else {
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
 	}
61 61
 
62 62
 	private function cacheToken(Token $token, string $cacheKey) {
63
-		$this->cache->set($cacheKey . '/token', json_encode($token));
63
+		$this->cache->set($cacheKey.'/token', json_encode($token));
64 64
 	}
65 65
 
66 66
 	/**
@@ -90,7 +90,7 @@  discard block
 block discarded – undo
90 90
 			$this->params['tenantName'] = $this->params['tenant'];
91 91
 		}
92 92
 
93
-		$cacheKey = $userName . '@' . $this->params['url'] . '/' . $this->params['bucket'];
93
+		$cacheKey = $userName.'@'.$this->params['url'].'/'.$this->params['bucket'];
94 94
 		$token = $this->getCachedToken($cacheKey);
95 95
 		$hasToken = is_array($token) && (new \DateTimeImmutable($token['expires_at'])) > (new \DateTimeImmutable('now'));
96 96
 		if ($hasToken) {
@@ -186,7 +186,7 @@  discard block
 block discarded – undo
186 186
 		} catch (ConnectException $e) {
187 187
 			/** @var RequestInterface $request */
188 188
 			$request = $e->getRequest();
189
-			$host = $request->getUri()->getHost() . ':' . $request->getUri()->getPort();
189
+			$host = $request->getUri()->getHost().':'.$request->getUri()->getPort();
190 190
 			\OC::$server->getLogger()->error("Can't connect to object storage server at $host");
191 191
 			throw new StorageNotAvailableException("Can't connect to object storage server at $host", StorageNotAvailableException::STATUS_ERROR, $e);
192 192
 		}
Please login to merge, or discard this patch.
apps/files_external/lib/AppInfo/Application.php 1 patch
Indentation   +83 added lines, -83 removed lines patch added patch discarded remove patch
@@ -66,88 +66,88 @@
 block discarded – undo
66 66
  */
67 67
 class Application extends App implements IBackendProvider, IAuthMechanismProvider {
68 68
 
69
-	public function __construct(array $urlParams = array()) {
70
-		parent::__construct('files_external', $urlParams);
71
-
72
-		$container = $this->getContainer();
73
-
74
-		$container->registerService(IUserMountCache::class, function (IAppContainer $c) {
75
-			return $c->getServer()->query('UserMountCache');
76
-		});
77
-
78
-		$backendService = $container->query(BackendService::class);
79
-		$backendService->registerBackendProvider($this);
80
-		$backendService->registerAuthMechanismProvider($this);
81
-
82
-		// force-load auth mechanisms since some will register hooks
83
-		// TODO: obsolete these and use the TokenProvider to get the user's password from the session
84
-		$this->getAuthMechanisms();
85
-
86
-		// app developers: do NOT depend on this! it will disappear with oC 9.0!
87
-		\OC::$server->getEventDispatcher()->dispatch(
88
-			'OCA\\Files_External::loadAdditionalBackends'
89
-		);
90
-	}
91
-
92
-	/**
93
-	 * @{inheritdoc}
94
-	 */
95
-	public function getBackends() {
96
-		$container = $this->getContainer();
97
-
98
-		$backends = [
99
-			$container->query(Local::class),
100
-			$container->query(FTP::class),
101
-			$container->query(DAV::class),
102
-			$container->query(OwnCloud::class),
103
-			$container->query(SFTP::class),
104
-			$container->query(AmazonS3::class),
105
-			$container->query(Swift::class),
106
-			$container->query(SFTP_Key::class),
107
-			$container->query(SMB::class),
108
-			$container->query(SMB_OC::class),
109
-		];
110
-
111
-		return $backends;
112
-	}
113
-
114
-	/**
115
-	 * @{inheritdoc}
116
-	 */
117
-	public function getAuthMechanisms() {
118
-		$container = $this->getContainer();
119
-
120
-		return [
121
-			// AuthMechanism::SCHEME_NULL mechanism
122
-			$container->query(NullMechanism::class),
123
-
124
-			// AuthMechanism::SCHEME_BUILTIN mechanism
125
-			$container->query(Builtin::class),
126
-
127
-			// AuthMechanism::SCHEME_PASSWORD mechanisms
128
-			$container->query(Password::class),
129
-			$container->query(SessionCredentials::class),
130
-			$container->query(LoginCredentials::class),
131
-			$container->query(UserProvided::class),
132
-			$container->query(GlobalAuth::class),
133
-
134
-			// AuthMechanism::SCHEME_OAUTH1 mechanisms
135
-			$container->query(OAuth1::class),
136
-
137
-			// AuthMechanism::SCHEME_OAUTH2 mechanisms
138
-			$container->query(OAuth2::class),
139
-
140
-			// AuthMechanism::SCHEME_PUBLICKEY mechanisms
141
-			$container->query(RSA::class),
142
-
143
-			// AuthMechanism::SCHEME_OPENSTACK mechanisms
144
-			$container->query(OpenStackV2::class),
145
-			$container->query(OpenStackV3::class),
146
-			$container->query(Rackspace::class),
147
-
148
-			// Specialized mechanisms
149
-			$container->query(AccessKey::class),
150
-		];
151
-	}
69
+    public function __construct(array $urlParams = array()) {
70
+        parent::__construct('files_external', $urlParams);
71
+
72
+        $container = $this->getContainer();
73
+
74
+        $container->registerService(IUserMountCache::class, function (IAppContainer $c) {
75
+            return $c->getServer()->query('UserMountCache');
76
+        });
77
+
78
+        $backendService = $container->query(BackendService::class);
79
+        $backendService->registerBackendProvider($this);
80
+        $backendService->registerAuthMechanismProvider($this);
81
+
82
+        // force-load auth mechanisms since some will register hooks
83
+        // TODO: obsolete these and use the TokenProvider to get the user's password from the session
84
+        $this->getAuthMechanisms();
85
+
86
+        // app developers: do NOT depend on this! it will disappear with oC 9.0!
87
+        \OC::$server->getEventDispatcher()->dispatch(
88
+            'OCA\\Files_External::loadAdditionalBackends'
89
+        );
90
+    }
91
+
92
+    /**
93
+     * @{inheritdoc}
94
+     */
95
+    public function getBackends() {
96
+        $container = $this->getContainer();
97
+
98
+        $backends = [
99
+            $container->query(Local::class),
100
+            $container->query(FTP::class),
101
+            $container->query(DAV::class),
102
+            $container->query(OwnCloud::class),
103
+            $container->query(SFTP::class),
104
+            $container->query(AmazonS3::class),
105
+            $container->query(Swift::class),
106
+            $container->query(SFTP_Key::class),
107
+            $container->query(SMB::class),
108
+            $container->query(SMB_OC::class),
109
+        ];
110
+
111
+        return $backends;
112
+    }
113
+
114
+    /**
115
+     * @{inheritdoc}
116
+     */
117
+    public function getAuthMechanisms() {
118
+        $container = $this->getContainer();
119
+
120
+        return [
121
+            // AuthMechanism::SCHEME_NULL mechanism
122
+            $container->query(NullMechanism::class),
123
+
124
+            // AuthMechanism::SCHEME_BUILTIN mechanism
125
+            $container->query(Builtin::class),
126
+
127
+            // AuthMechanism::SCHEME_PASSWORD mechanisms
128
+            $container->query(Password::class),
129
+            $container->query(SessionCredentials::class),
130
+            $container->query(LoginCredentials::class),
131
+            $container->query(UserProvided::class),
132
+            $container->query(GlobalAuth::class),
133
+
134
+            // AuthMechanism::SCHEME_OAUTH1 mechanisms
135
+            $container->query(OAuth1::class),
136
+
137
+            // AuthMechanism::SCHEME_OAUTH2 mechanisms
138
+            $container->query(OAuth2::class),
139
+
140
+            // AuthMechanism::SCHEME_PUBLICKEY mechanisms
141
+            $container->query(RSA::class),
142
+
143
+            // AuthMechanism::SCHEME_OPENSTACK mechanisms
144
+            $container->query(OpenStackV2::class),
145
+            $container->query(OpenStackV3::class),
146
+            $container->query(Rackspace::class),
147
+
148
+            // Specialized mechanisms
149
+            $container->query(AccessKey::class),
150
+        ];
151
+    }
152 152
 
153 153
 }
Please login to merge, or discard this patch.
apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV2.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -31,19 +31,19 @@
 block discarded – undo
31 31
  */
32 32
 class OpenStackV2 extends AuthMechanism {
33 33
 
34
-	public function __construct(IL10N $l) {
35
-		$this
36
-			->setIdentifier('openstack::openstack')
37
-			->setScheme(self::SCHEME_OPENSTACK)
38
-			->setText($l->t('OpenStack v2'))
39
-			->addParameters([
40
-				new DefinitionParameter('user', $l->t('Username')),
41
-				(new DefinitionParameter('password', $l->t('Password')))
42
-					->setType(DefinitionParameter::VALUE_PASSWORD),
43
-				new DefinitionParameter('tenant', $l->t('Tenant name')),
44
-				new DefinitionParameter('url', $l->t('Identity endpoint URL')),
45
-			])
46
-		;
47
-	}
34
+    public function __construct(IL10N $l) {
35
+        $this
36
+            ->setIdentifier('openstack::openstack')
37
+            ->setScheme(self::SCHEME_OPENSTACK)
38
+            ->setText($l->t('OpenStack v2'))
39
+            ->addParameters([
40
+                new DefinitionParameter('user', $l->t('Username')),
41
+                (new DefinitionParameter('password', $l->t('Password')))
42
+                    ->setType(DefinitionParameter::VALUE_PASSWORD),
43
+                new DefinitionParameter('tenant', $l->t('Tenant name')),
44
+                new DefinitionParameter('url', $l->t('Identity endpoint URL')),
45
+            ])
46
+        ;
47
+    }
48 48
 
49 49
 }
Please login to merge, or discard this patch.
apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV3.php 2 patches
Indentation   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -31,18 +31,18 @@
 block discarded – undo
31 31
  */
32 32
 class OpenStackV3 extends AuthMechanism {
33 33
 
34
-	public function __construct(IL10N $l) {
35
-		$this
36
-			->setIdentifier('openstack::openstackv3')
37
-			->setScheme(self::SCHEME_OPENSTACK)
38
-			->setText($l->t('OpenStack v3'))
39
-			->addParameters([
40
-				new DefinitionParameter('userid', $l->t('User Id')),
41
-				(new DefinitionParameter('password', $l->t('Password')))
42
-					->setType(DefinitionParameter::VALUE_PASSWORD),
43
-				new DefinitionParameter('url', $l->t('Identity endpoint URL'))
44
-			])
45
-		;
46
-	}
34
+    public function __construct(IL10N $l) {
35
+        $this
36
+            ->setIdentifier('openstack::openstackv3')
37
+            ->setScheme(self::SCHEME_OPENSTACK)
38
+            ->setText($l->t('OpenStack v3'))
39
+            ->addParameters([
40
+                new DefinitionParameter('userid', $l->t('User Id')),
41
+                (new DefinitionParameter('password', $l->t('Password')))
42
+                    ->setType(DefinitionParameter::VALUE_PASSWORD),
43
+                new DefinitionParameter('url', $l->t('Identity endpoint URL'))
44
+            ])
45
+        ;
46
+    }
47 47
 
48 48
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -1,5 +1,5 @@
 block discarded – undo
1 1
 <?php
2
-declare(strict_types=1);
2
+declare(strict_types = 1);
3 3
 /**
4 4
  * @copyright Copyright (c) 2018 Robin Appelman <[email protected]>
5 5
  *
Please login to merge, or discard this patch.
apps/files_external/lib/Lib/Backend/Swift.php 1 patch
Indentation   +25 added lines, -25 removed lines patch added patch discarded remove patch
@@ -33,31 +33,31 @@
 block discarded – undo
33 33
 
34 34
 class Swift extends Backend {
35 35
 
36
-	use LegacyDependencyCheckPolyfill;
36
+    use LegacyDependencyCheckPolyfill;
37 37
 
38
-	public function __construct(IL10N $l, OpenStackV2 $openstackAuth, Rackspace $rackspaceAuth) {
39
-		$this
40
-			->setIdentifier('swift')
41
-			->addIdentifierAlias('\OC\Files\Storage\Swift') // legacy compat
42
-			->setStorageClass('\OCA\Files_External\Lib\Storage\Swift')
43
-			->setText($l->t('OpenStack Object Storage'))
44
-			->addParameters([
45
-				(new DefinitionParameter('service_name', $l->t('Service name')))
46
-					->setFlag(DefinitionParameter::FLAG_OPTIONAL),
47
-				(new DefinitionParameter('region', $l->t('Region')))
48
-					->setFlag(DefinitionParameter::FLAG_OPTIONAL),
49
-				new DefinitionParameter('bucket', $l->t('Bucket')),
50
-				(new DefinitionParameter('timeout', $l->t('Request timeout (seconds)')))
51
-					->setFlag(DefinitionParameter::FLAG_OPTIONAL),
52
-			])
53
-			->addAuthScheme(AuthMechanism::SCHEME_OPENSTACK)
54
-			->setLegacyAuthMechanismCallback(function(array $params) use ($openstackAuth, $rackspaceAuth) {
55
-				if (isset($params['options']['key']) && $params['options']['key']) {
56
-					return $rackspaceAuth;
57
-				}
58
-				return $openstackAuth;
59
-			})
60
-		;
61
-	}
38
+    public function __construct(IL10N $l, OpenStackV2 $openstackAuth, Rackspace $rackspaceAuth) {
39
+        $this
40
+            ->setIdentifier('swift')
41
+            ->addIdentifierAlias('\OC\Files\Storage\Swift') // legacy compat
42
+            ->setStorageClass('\OCA\Files_External\Lib\Storage\Swift')
43
+            ->setText($l->t('OpenStack Object Storage'))
44
+            ->addParameters([
45
+                (new DefinitionParameter('service_name', $l->t('Service name')))
46
+                    ->setFlag(DefinitionParameter::FLAG_OPTIONAL),
47
+                (new DefinitionParameter('region', $l->t('Region')))
48
+                    ->setFlag(DefinitionParameter::FLAG_OPTIONAL),
49
+                new DefinitionParameter('bucket', $l->t('Bucket')),
50
+                (new DefinitionParameter('timeout', $l->t('Request timeout (seconds)')))
51
+                    ->setFlag(DefinitionParameter::FLAG_OPTIONAL),
52
+            ])
53
+            ->addAuthScheme(AuthMechanism::SCHEME_OPENSTACK)
54
+            ->setLegacyAuthMechanismCallback(function(array $params) use ($openstackAuth, $rackspaceAuth) {
55
+                if (isset($params['options']['key']) && $params['options']['key']) {
56
+                    return $rackspaceAuth;
57
+                }
58
+                return $openstackAuth;
59
+            })
60
+        ;
61
+    }
62 62
 
63 63
 }
Please login to merge, or discard this patch.