From 1beffa058a493a0c9f36a0280fb9e5e354e0d066 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Mon, 18 Dec 2017 21:40:17 +0100
Subject: [PATCH] Cache final result of update check

If the parsed data is not a valid response we should not cache it and only cache the preprocessed result set.

Fixes #7442

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
---
 lib/private/Updater/VersionCheck.php   |  4 +-
 tests/lib/Updater/VersionCheckTest.php | 53 +++++++++++++++++++++++++-
 2 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/lib/private/Updater/VersionCheck.php b/lib/private/Updater/VersionCheck.php
index 6774ef307b5..c7b829c9ec5 100644
--- a/lib/private/Updater/VersionCheck.php
+++ b/lib/private/Updater/VersionCheck.php
@@ -101,12 +101,10 @@ class VersionCheck {
 			} else {
 				libxml_clear_errors();
 			}
-		} else {
-			$data = [];
 		}
 
 		// Cache the result
-		$this->config->setAppValue('core', 'lastupdateResult', json_encode($data));
+		$this->config->setAppValue('core', 'lastupdateResult', json_encode($tmp));
 		return $tmp;
 	}
 
diff --git a/tests/lib/Updater/VersionCheckTest.php b/tests/lib/Updater/VersionCheckTest.php
index ff04aa17681..89a335722d7 100644
--- a/tests/lib/Updater/VersionCheckTest.php
+++ b/tests/lib/Updater/VersionCheckTest.php
@@ -161,7 +161,7 @@ class VersionCheckTest extends \Test\TestCase {
 		$this->config
 			->expects($this->at(6))
 			->method('setAppValue')
-			->with('core', 'lastupdateResult', 'false');
+			->with('core', 'lastupdateResult', '[]');
 
 		$updateXml = 'Invalid XML Response!';
 		$this->updater
@@ -265,4 +265,55 @@ class VersionCheckTest extends \Test\TestCase {
 
 		$this->assertSame($expectedResult, $this->updater->check());
 	}
+
+	public function testCheckWithMissingAttributeXmlResponse() {
+		$expectedResult = [
+			'version' => '',
+			'versionstring' => '',
+			'url' => '',
+			'web' => '',
+			'autoupdater' => '',
+		];
+
+		$this->config
+			->expects($this->at(0))
+			->method('getAppValue')
+			->with('core', 'lastupdatedat')
+			->will($this->returnValue(0));
+		$this->config
+			->expects($this->at(1))
+			->method('getSystemValue')
+			->with('updater.server.url', 'https://updates.nextcloud.com/updater_server/')
+			->willReturnArgument(1);
+		$this->config
+			->expects($this->at(2))
+			->method('setAppValue')
+			->with('core', 'lastupdatedat', $this->isType('integer'));
+		$this->config
+			->expects($this->at(4))
+			->method('getAppValue')
+			->with('core', 'installedat')
+			->will($this->returnValue('installedat'));
+		$this->config
+			->expects($this->at(5))
+			->method('getAppValue')
+			->with('core', 'lastupdatedat')
+			->will($this->returnValue('lastupdatedat'));
+
+		// missing autoupdater element should still not fail
+		$updateXml = '<?xml version="1.0"?>
+<owncloud>
+  <version></version>
+  <versionstring></versionstring>
+  <url></url>
+  <web></web>
+</owncloud>';
+		$this->updater
+			->expects($this->once())
+			->method('getUrlContent')
+			->with($this->buildUpdateUrl('https://updates.nextcloud.com/updater_server/'))
+			->will($this->returnValue($updateXml));
+
+		$this->assertSame($expectedResult, $this->updater->check());
+	}
 }
-- 
GitLab