aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnna <anna@nextcloud.com>2024-08-22 17:01:28 +0200
committerGitHub <noreply@github.com>2024-08-22 17:01:28 +0200
commit1b39abb5014f70c60aeed93ee726491d05380122 (patch)
treead468d494db3399961d1abce00a0a2e5a93383ce
parent4eebf471e570c29156e6ebacc82aa8bedbdd8a98 (diff)
parent3c3667fe18c3263f6e51ebeefdf5b1086e11f23a (diff)
downloadnextcloud-server-1b39abb5014f70c60aeed93ee726491d05380122.tar.gz
nextcloud-server-1b39abb5014f70c60aeed93ee726491d05380122.zip
Merge pull request #47415 from nextcloud/Fix/trusted-server-icon-recovery-without-addressbook-change
fix: Trusted server icon recovery without addressbook change
-rw-r--r--apps/federation/lib/BackgroundJob/GetSharedSecret.php1
-rw-r--r--apps/federation/lib/BackgroundJob/RequestSharedSecret.php1
-rw-r--r--apps/federation/lib/SyncFederationAddressBooks.php4
-rw-r--r--apps/federation/tests/SyncFederationAddressbooksTest.php31
4 files changed, 37 insertions, 0 deletions
diff --git a/apps/federation/lib/BackgroundJob/GetSharedSecret.php b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
index f07e0d8c2a7..1a23d58a7d1 100644
--- a/apps/federation/lib/BackgroundJob/GetSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
@@ -90,6 +90,7 @@ class GetSharedSecret extends Job {
// kill job after 30 days of trying
$deadline = $currentTime - $this->maxLifespan;
if ($created < $deadline) {
+ $this->logger->warning("The job to get the shared secret job is too old and gets stopped now without retention. Setting server status of '{$target}' to failure.");
$this->retainJob = false;
$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
return;
diff --git a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
index 07243f5c94d..a1d0d2b0df0 100644
--- a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
@@ -93,6 +93,7 @@ class RequestSharedSecret extends Job {
// kill job after 30 days of trying
$deadline = $currentTime - $this->maxLifespan;
if ($created < $deadline) {
+ $this->logger->warning("The job to request the shared secret job is too old and gets stopped now without retention. Setting server status of '{$target}' to failure.");
$this->retainJob = false;
$this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE);
return;
diff --git a/apps/federation/lib/SyncFederationAddressBooks.php b/apps/federation/lib/SyncFederationAddressBooks.php
index 46a6a8c40a5..1b47c92db1a 100644
--- a/apps/federation/lib/SyncFederationAddressBooks.php
+++ b/apps/federation/lib/SyncFederationAddressBooks.php
@@ -60,6 +60,10 @@ class SyncFederationAddressBooks {
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
} else {
$this->logger->debug("Sync Token for $url unchanged from previous sync");
+ // The server status might have been changed to a failure status in previous runs.
+ if ($this->dbHandler->getServerStatus($url) !== TrustedServers::STATUS_OK) {
+ $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK);
+ }
}
} catch (\Exception $ex) {
if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) {
diff --git a/apps/federation/tests/SyncFederationAddressbooksTest.php b/apps/federation/tests/SyncFederationAddressbooksTest.php
index 1ebca2f6a0f..1b53f238bfa 100644
--- a/apps/federation/tests/SyncFederationAddressbooksTest.php
+++ b/apps/federation/tests/SyncFederationAddressbooksTest.php
@@ -90,4 +90,35 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
});
$this->assertEquals(2, count($this->callBacks));
}
+
+ public function testSuccessfulSyncWithoutChangesAfterFailure() {
+ /** @var DbHandler | MockObject $dbHandler */
+ $dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $dbHandler->method('getAllServer')
+ ->willReturn([
+ [
+ 'url' => 'https://cloud.drop.box',
+ 'url_hash' => 'sha1',
+ 'shared_secret' => 'ilovenextcloud',
+ 'sync_token' => '0'
+ ]
+ ]);
+ $dbHandler->method('getServerStatus')->willReturn(\OCA\Federation\TrustedServers::STATUS_FAILURE);
+ $dbHandler->expects($this->once())->method('setServerStatus')->
+ with('https://cloud.drop.box', 1);
+ $syncService = $this->getMockBuilder('OCA\DAV\CardDAV\SyncService')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $syncService->expects($this->once())->method('syncRemoteAddressBook')
+ ->willReturn('0');
+
+ /** @var \OCA\DAV\CardDAV\SyncService $syncService */
+ $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService, $this->logger);
+ $s->syncThemAll(function ($url, $ex) {
+ $this->callBacks[] = [$url, $ex];
+ });
+ $this->assertEquals('1', count($this->callBacks));
+ }
}