Skip to content

Commit 655c14e

Browse files
committed
fix: ensure all object store configuration have distict bucket names
Signed-off-by: Robin Appelman <[email protected]>
1 parent 37fc6cd commit 655c14e

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public function getObjectStoreConfigs(): ?array {
115115
// new-style multibucket config uses the same 'objectstore' key but sets `'multibucket' => true`, transparently upgrade older style config
116116
if ($objectStoreMultiBucket) {
117117
$objectStoreMultiBucket['arguments']['multibucket'] = true;
118-
return [
118+
$configs = [
119119
'default' => 'server1',
120120
'server1' => $this->validateObjectStoreConfig($objectStoreMultiBucket),
121121
'root' => 'server1',
@@ -135,10 +135,23 @@ public function getObjectStoreConfigs(): ?array {
135135
if (!is_string($objectStore['default'])) {
136136
throw new InvalidObjectStoreConfigurationException('The \'default\' object storage configuration is required to be a reference to another configuration.');
137137
}
138-
return array_map($this->validateObjectStoreConfig(...), $objectStore);
138+
$configs = array_map([$this, 'validateObjectStoreConfig'], $objectStore);
139139
} else {
140140
return null;
141141
}
142+
143+
$usedBuckets = [];
144+
foreach ($configs as $config) {
145+
if (is_array($config)) {
146+
$bucket = $config['arguments']['bucket'] ?? '';
147+
if (in_array($bucket, $usedBuckets)) {
148+
throw new InvalidObjectStoreConfigurationException('Each object store configuration must use distinct bucket names');
149+
}
150+
$usedBuckets[] = $bucket;
151+
}
152+
}
153+
154+
return $configs;
142155
}
143156

144157
/**

tests/lib/Files/ObjectStore/PrimaryObjectStoreConfigTest.php

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,14 @@ public function testExistingUserKeepsStorage() {
9393
'class' => StorageObjectStore::class,
9494
'arguments' => [
9595
'host' => 'server1',
96+
'bucket' => '1',
9697
],
9798
],
9899
'server2' => [
99100
'class' => StorageObjectStore::class,
100101
'arguments' => [
101102
'host' => 'server2',
103+
'bucket' => '2',
102104
],
103105
],
104106
]);
@@ -121,6 +123,7 @@ public function testNestedAliases() {
121123
'class' => StorageObjectStore::class,
122124
'arguments' => [
123125
'host' => 'server1',
126+
'bucket' => '1',
124127
],
125128
],
126129
]);
@@ -136,14 +139,14 @@ public function testMultibucketChangedConfig() {
136139
'host' => 'server1',
137140
'multibucket' => true,
138141
'num_buckets' => 8,
139-
'bucket' => 'bucket-'
142+
'bucket' => 'bucket1-'
140143
],
141144
],
142145
]);
143146

144147
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
145148
$this->assertEquals('server1', $result['arguments']['host']);
146-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
149+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
147150

148151
$this->setConfig('objectstore', [
149152
'default' => 'server1',
@@ -153,18 +156,18 @@ public function testMultibucketChangedConfig() {
153156
'host' => 'server1',
154157
'multibucket' => true,
155158
'num_buckets' => 64,
156-
'bucket' => 'bucket-'
159+
'bucket' => 'bucket1-'
157160
],
158161
],
159162
]);
160163

161164
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
162165
$this->assertEquals('server1', $result['arguments']['host']);
163-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
166+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
164167

165168
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-foo'));
166169
$this->assertEquals('server1', $result['arguments']['host']);
167-
$this->assertEquals('bucket-40', $result['arguments']['bucket']);
170+
$this->assertEquals('bucket1-40', $result['arguments']['bucket']);
168171

169172
$this->setConfig('objectstore', [
170173
'default' => 'server2',
@@ -174,7 +177,7 @@ public function testMultibucketChangedConfig() {
174177
'host' => 'server1',
175178
'multibucket' => true,
176179
'num_buckets' => 64,
177-
'bucket' => 'bucket-'
180+
'bucket' => 'bucket1-'
178181
],
179182
],
180183
'server2' => [
@@ -183,18 +186,18 @@ public function testMultibucketChangedConfig() {
183186
'host' => 'server2',
184187
'multibucket' => true,
185188
'num_buckets' => 16,
186-
'bucket' => 'bucket-'
189+
'bucket' => 'bucket2-'
187190
],
188191
],
189192
]);
190193

191194
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test'));
192195
$this->assertEquals('server1', $result['arguments']['host']);
193-
$this->assertEquals('bucket-7', $result['arguments']['bucket']);
196+
$this->assertEquals('bucket1-7', $result['arguments']['bucket']);
194197

195198
$result = $this->objectStoreConfig->getObjectStoreConfigForUser($this->getUser('test-bar'));
196199
$this->assertEquals('server2', $result['arguments']['host']);
197-
$this->assertEquals('bucket-4', $result['arguments']['bucket']);
200+
$this->assertEquals('bucket2-4', $result['arguments']['bucket']);
198201
}
199202

200203
public function testMultibucketOldConfig() {
@@ -251,12 +254,14 @@ public function testRoot() {
251254
'class' => StorageObjectStore::class,
252255
'arguments' => [
253256
'host' => 'server1',
257+
'bucket' => '1',
254258
],
255259
],
256260
'server2' => [
257261
'class' => StorageObjectStore::class,
258262
'arguments' => [
259263
'host' => 'server2',
264+
'bucket' => '2',
260265
],
261266
],
262267
]);
@@ -271,12 +276,14 @@ public function testRoot() {
271276
'class' => StorageObjectStore::class,
272277
'arguments' => [
273278
'host' => 'server1',
279+
'bucket' => '1',
274280
],
275281
],
276282
'server2' => [
277283
'class' => StorageObjectStore::class,
278284
'arguments' => [
279285
'host' => 'server2',
286+
'bucket' => '2',
280287
],
281288
],
282289
]);

0 commit comments

Comments
 (0)