Skip to content

Commit

Permalink
Merge pull request #47940 from nextcloud/backport/47933/stable30
Browse files Browse the repository at this point in the history
[stable30] fix(config): Throw PreconditionException always when it didn't match
  • Loading branch information
AndyScherzinger authored Sep 15, 2024
2 parents fa35538 + 66a6b44 commit 90a6b82
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 3 deletions.
6 changes: 3 additions & 3 deletions lib/private/AllConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,10 @@ public function setUserValue($userId, $appName, $key, $value, $preCondition = nu
$prevValue = $this->getUserValue($userId, $appName, $key, null);

if ($prevValue !== null) {
if ($prevValue === (string)$value) {
return;
} elseif ($preCondition !== null && $prevValue !== (string)$preCondition) {
if ($preCondition !== null && $prevValue !== (string)$preCondition) {
throw new PreConditionNotMetException();
} elseif ($prevValue === (string)$value) {
return;
} else {
$qb = $this->connection->getQueryBuilder();
$qb->update('preferences')
Expand Down
36 changes: 36 additions & 0 deletions tests/lib/AllConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,42 @@ public function testSetUserValueWithPreConditionFailure() {
$config->deleteUserValue('userPreCond1', 'appPreCond', 'keyPreCond');
}

public function testSetUserValueWithPreConditionFailureWhenResultStillMatches(): void {
$this->expectException(\OCP\PreConditionNotMetException::class);

$config = $this->getConfig();

$selectAllSQL = 'SELECT `userid`, `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';

$config->setUserValue('userPreCond1', 'appPreCond', 'keyPreCond', 'valuePreCond');

$result = $this->connection->executeQuery($selectAllSQL, ['userPreCond1'])->fetchAll();

$this->assertCount(1, $result);
$this->assertEquals([
'userid' => 'userPreCond1',
'appid' => 'appPreCond',
'configkey' => 'keyPreCond',
'configvalue' => 'valuePreCond'
], $result[0]);

// test if the method throws with invalid precondition when the value is the same
$config->setUserValue('userPreCond1', 'appPreCond', 'keyPreCond', 'valuePreCond', 'valuePreCond3');

$result = $this->connection->executeQuery($selectAllSQL, ['userPreCond1'])->fetchAll();

$this->assertCount(1, $result);
$this->assertEquals([
'userid' => 'userPreCond1',
'appid' => 'appPreCond',
'configkey' => 'keyPreCond',
'configvalue' => 'valuePreCond'
], $result[0]);

// cleanup
$config->deleteUserValue('userPreCond1', 'appPreCond', 'keyPreCond');
}

public function testSetUserValueUnchanged() {
// TODO - FIXME until the dependency injection is handled properly (in AllConfig)
$this->markTestSkipped('Skipped because this is just testable if database connection can be injected');
Expand Down

0 comments on commit 90a6b82

Please sign in to comment.