summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/lib/connector/sabre/filesplugin.php2
-rw-r--r--apps/dav/lib/connector/sabre/tagsplugin.php2
-rw-r--r--apps/files/ajax/scan.php94
-rw-r--r--apps/files/appinfo/info.xml2
-rw-r--r--apps/files/appinfo/install.php26
-rw-r--r--apps/files/appinfo/routes.php2
-rw-r--r--apps/files/appinfo/update.php5
-rw-r--r--apps/files/js/files.js48
-rw-r--r--apps/files/l10n/de.js11
-rw-r--r--apps/files/l10n/de.json11
-rw-r--r--apps/files/l10n/es.js9
-rw-r--r--apps/files/l10n/es.json9
-rw-r--r--apps/files/lib/backgroundjob/scanfiles.php114
-rw-r--r--apps/files/tests/backgroundjob/ScanFilesTest.php134
-rw-r--r--apps/files_external/l10n/de.js2
-rw-r--r--apps/files_external/l10n/de.json2
-rw-r--r--apps/files_external/l10n/es.js2
-rw-r--r--apps/files_external/l10n/es.json2
-rw-r--r--apps/files_external/l10n/lt_LT.js1
-rw-r--r--apps/files_external/l10n/lt_LT.json1
-rw-r--r--build/integration/capabilities_features/capabilities.feature31
-rw-r--r--build/integration/config/behat.yml13
-rw-r--r--build/integration/features/bootstrap/CapabilitiesContext.php49
-rw-r--r--build/integration/federation_features/federated.feature (renamed from build/integration/federation/federated.feature)0
-rw-r--r--core/l10n/ast.js1
-rw-r--r--core/l10n/ast.json1
-rw-r--r--core/l10n/bg_BG.js1
-rw-r--r--core/l10n/bg_BG.json1
-rw-r--r--core/l10n/bs.js1
-rw-r--r--core/l10n/bs.json1
-rw-r--r--core/l10n/ca.js1
-rw-r--r--core/l10n/ca.json1
-rw-r--r--core/l10n/cs_CZ.js1
-rw-r--r--core/l10n/cs_CZ.json1
-rw-r--r--core/l10n/da.js1
-rw-r--r--core/l10n/da.json1
-rw-r--r--core/l10n/de.js3
-rw-r--r--core/l10n/de.json3
-rw-r--r--core/l10n/de_DE.js1
-rw-r--r--core/l10n/de_DE.json1
-rw-r--r--core/l10n/el.js1
-rw-r--r--core/l10n/el.json1
-rw-r--r--core/l10n/en_GB.js1
-rw-r--r--core/l10n/en_GB.json1
-rw-r--r--core/l10n/es.js2
-rw-r--r--core/l10n/es.json2
-rw-r--r--core/l10n/et_EE.js1
-rw-r--r--core/l10n/et_EE.json1
-rw-r--r--core/l10n/eu.js1
-rw-r--r--core/l10n/eu.json1
-rw-r--r--core/l10n/fi_FI.js1
-rw-r--r--core/l10n/fi_FI.json1
-rw-r--r--core/l10n/fr.js1
-rw-r--r--core/l10n/fr.json1
-rw-r--r--core/l10n/gl.js1
-rw-r--r--core/l10n/gl.json1
-rw-r--r--core/l10n/hr.js1
-rw-r--r--core/l10n/hr.json1
-rw-r--r--core/l10n/hu_HU.js1
-rw-r--r--core/l10n/hu_HU.json1
-rw-r--r--core/l10n/id.js1
-rw-r--r--core/l10n/id.json1
-rw-r--r--core/l10n/is.js1
-rw-r--r--core/l10n/is.json1
-rw-r--r--core/l10n/it.js1
-rw-r--r--core/l10n/it.json1
-rw-r--r--core/l10n/ja.js1
-rw-r--r--core/l10n/ja.json1
-rw-r--r--core/l10n/kn.js1
-rw-r--r--core/l10n/kn.json1
-rw-r--r--core/l10n/ko.js1
-rw-r--r--core/l10n/ko.json1
-rw-r--r--core/l10n/nb_NO.js1
-rw-r--r--core/l10n/nb_NO.json1
-rw-r--r--core/l10n/nl.js1
-rw-r--r--core/l10n/nl.json1
-rw-r--r--core/l10n/oc.js1
-rw-r--r--core/l10n/oc.json1
-rw-r--r--core/l10n/pl.js1
-rw-r--r--core/l10n/pl.json1
-rw-r--r--core/l10n/pt_BR.js1
-rw-r--r--core/l10n/pt_BR.json1
-rw-r--r--core/l10n/pt_PT.js1
-rw-r--r--core/l10n/pt_PT.json1
-rw-r--r--core/l10n/ru.js1
-rw-r--r--core/l10n/ru.json1
-rw-r--r--core/l10n/sk_SK.js1
-rw-r--r--core/l10n/sk_SK.json1
-rw-r--r--core/l10n/sl.js1
-rw-r--r--core/l10n/sl.json1
-rw-r--r--core/l10n/sq.js1
-rw-r--r--core/l10n/sq.json1
-rw-r--r--core/l10n/sr.js1
-rw-r--r--core/l10n/sr.json1
-rw-r--r--core/l10n/sr@latin.js1
-rw-r--r--core/l10n/sr@latin.json1
-rw-r--r--core/l10n/sv.js1
-rw-r--r--core/l10n/sv.json1
-rw-r--r--core/l10n/th_TH.js1
-rw-r--r--core/l10n/th_TH.json1
-rw-r--r--core/l10n/tr.js1
-rw-r--r--core/l10n/tr.json1
-rw-r--r--core/l10n/uk.js1
-rw-r--r--core/l10n/uk.json1
-rw-r--r--core/l10n/zh_CN.js1
-rw-r--r--core/l10n/zh_CN.json1
-rw-r--r--core/l10n/zh_TW.js1
-rw-r--r--core/l10n/zh_TW.json1
-rw-r--r--lib/l10n/lt_LT.js1
-rw-r--r--lib/l10n/lt_LT.json1
-rw-r--r--lib/private/appframework/middleware/security/corsmiddleware.php1
-rw-r--r--lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php36
-rw-r--r--lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php36
-rw-r--r--lib/private/appframework/middleware/security/exceptions/notadminexception.php36
-rw-r--r--lib/private/appframework/middleware/security/exceptions/notloggedinexception.php36
-rw-r--r--lib/private/appframework/middleware/security/exceptions/securityexception.php (renamed from lib/private/appframework/middleware/security/securityexception.php)23
-rw-r--r--lib/private/appframework/middleware/security/securitymiddleware.php47
-rw-r--r--lib/public/backgroundjob/ijoblist.php1
-rw-r--r--tests/lib/appframework/middleware/security/CORSMiddlewareTest.php6
-rw-r--r--tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php134
120 files changed, 715 insertions, 305 deletions
diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php
index e85a67a8759..1c78e9dc845 100644
--- a/apps/dav/lib/connector/sabre/filesplugin.php
+++ b/apps/dav/lib/connector/sabre/filesplugin.php
@@ -97,7 +97,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin {
*/
public function initialize(\Sabre\DAV\Server $server) {
- $server->xmlNamespaces[self::NS_OWNCLOUD] = 'oc';
+ $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
$server->protectedProperties[] = self::FILEID_PROPERTYNAME;
$server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
diff --git a/apps/dav/lib/connector/sabre/tagsplugin.php b/apps/dav/lib/connector/sabre/tagsplugin.php
index 2f5937da25a..778d43f1b3a 100644
--- a/apps/dav/lib/connector/sabre/tagsplugin.php
+++ b/apps/dav/lib/connector/sabre/tagsplugin.php
@@ -107,7 +107,7 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin
*/
public function initialize(\Sabre\DAV\Server $server) {
- $server->xmlNamespaces[self::NS_OWNCLOUD] = 'oc';
+ $server->xml->namespacesMap[self::NS_OWNCLOUD] = 'oc';
$server->propertyMap[self::TAGS_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\TagList';
$this->server = $server;
diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php
deleted file mode 100644
index 7710a28a8ca..00000000000
--- a/apps/files/ajax/scan.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Robin Appelman <icewind@owncloud.com>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-set_time_limit(0); //scanning can take ages
-
-\OCP\JSON::checkLoggedIn();
-\OCP\JSON::callCheck();
-
-\OC::$server->getSession()->close();
-
-$force = (isset($_GET['force']) and ($_GET['force'] === 'true'));
-$dir = isset($_GET['dir']) ? (string)$_GET['dir'] : '';
-if (isset($_GET['users'])) {
- \OCP\JSON::checkAdminUser();
- if ($_GET['users'] === 'all') {
- $users = OC_User::getUsers();
- } else {
- $users = json_decode($_GET['users']);
- }
-} else {
- $users = array(OC_User::getUser());
-}
-
-$eventSource = \OC::$server->createEventSource();
-$listener = new ScanListener($eventSource);
-
-foreach ($users as $user) {
- $eventSource->send('user', $user);
- $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', array($listener, 'file'));
- try {
- if ($force) {
- $scanner->scan($dir);
- } else {
- $scanner->backgroundScan($dir);
- }
- } catch (\Exception $e) {
- $eventSource->send('error', get_class($e) . ': ' . $e->getMessage());
- }
-}
-
-$eventSource->send('done', $listener->getCount());
-$eventSource->close();
-
-class ScanListener {
-
- private $fileCount = 0;
- private $lastCount = 0;
-
- /**
- * @var \OCP\IEventSource event source to pass events to
- */
- private $eventSource;
-
- /**
- * @param \OCP\IEventSource $eventSource
- */
- public function __construct($eventSource) {
- $this->eventSource = $eventSource;
- }
-
- public function file() {
- $this->fileCount++;
- if ($this->fileCount > $this->lastCount + 20) { //send a count update every 20 files
- $this->lastCount = $this->fileCount;
- $this->eventSource->send('count', $this->fileCount);
- }
- }
-
- public function getCount() {
- return $this->fileCount;
- }
-}
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index 4ab226f3968..df12b87397d 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -8,7 +8,7 @@
<shipped>true</shipped>
<standalone/>
<default_enable/>
- <version>1.4.0</version>
+ <version>1.4.1</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files/appinfo/install.php b/apps/files/appinfo/install.php
new file mode 100644
index 00000000000..b47bf6ac4b0
--- /dev/null
+++ b/apps/files/appinfo/install.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+// Cron job for scanning user storages
+$jobList = \OC::$server->getJobList();
+$job = 'OCA\Files\BackgroundJob\ScanFiles';
+\OC::$server->getJobList()->add($job);
+
diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php
index 2bb913c30a6..844b73b3c41 100644
--- a/apps/files/appinfo/routes.php
+++ b/apps/files/appinfo/routes.php
@@ -75,8 +75,6 @@ $this->create('files_ajax_newfolder', 'ajax/newfolder.php')
->actionInclude('files/ajax/newfolder.php');
$this->create('files_ajax_rename', 'ajax/rename.php')
->actionInclude('files/ajax/rename.php');
-$this->create('files_ajax_scan', 'ajax/scan.php')
- ->actionInclude('files/ajax/scan.php');
$this->create('files_ajax_upload', 'ajax/upload.php')
->actionInclude('files/ajax/upload.php');
diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php
index 6084435fa5a..d181dff560b 100644
--- a/apps/files/appinfo/update.php
+++ b/apps/files/appinfo/update.php
@@ -96,6 +96,11 @@ if ($installedVersion === '1.1.9' && (
}
}
+// Add cron job for scanning user storages
+$jobList = \OC::$server->getJobList();
+$job = 'OCA\Files\BackgroundJob\ScanFiles';
+\OC::$server->getJobList()->add($job);
+
/**
* migrate old constant DEBUG to new config value 'debug'
*
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index e33b8354437..6bf4a4cfe5a 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -243,9 +243,6 @@
e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
});
- //do a background scan if needed
- scanFiles();
-
// display storage warnings
setTimeout(Files.displayStorageWarnings, 100);
@@ -323,51 +320,6 @@
OCA.Files.Files = Files;
})();
-function scanFiles(force, dir, users) {
- if (!OC.currentUser) {
- return;
- }
-
- if (!dir) {
- dir = '';
- }
- force = !!force; //cast to bool
- scanFiles.scanning = true;
- var scannerEventSource;
- if (users) {
- var usersString;
- if (users === 'all') {
- usersString = users;
- } else {
- usersString = JSON.stringify(users);
- }
- scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir, users: usersString});
- } else {
- scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir});
- }
- scanFiles.cancel = scannerEventSource.close.bind(scannerEventSource);
- scannerEventSource.listen('count',function(count) {
- console.log(count + ' files scanned');
- });
- scannerEventSource.listen('folder',function(path) {
- console.log('now scanning ' + path);
- });
- scannerEventSource.listen('error',function(message) {
- console.error('Scanner error: ', message);
- });
- scannerEventSource.listen('done',function(count) {
- scanFiles.scanning=false;
- console.log('done after ' + count + ' files');
- if (OCA.Files.App) {
- OCA.Files.App.fileList.updateStorageStatistics(true);
- }
- });
- scannerEventSource.listen('user',function(user) {
- console.log('scanning files for ' + user);
- });
-}
-scanFiles.scanning=false;
-
// TODO: move to FileList
var createDragShadow = function(event) {
// FIXME: inject file list instance somehow
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index cec0cfda0ca..b4e853d4b2d 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -40,6 +40,17 @@ OC.L10N.register(
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
+ "Could not move \"{file}\", target exists" : "Konnte nicht verschieben \"{file}\", Ziel existiert bereits",
+ "Could not move \"{file}\"" : "Konnte nicht verschieben \"{file}\"",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Konnte nicht umbennen \"{fileName}\", da es nicht mehr existiert",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{targetName}\" wird bereits bereits in diesem Ordner benutzt \"{dir}\". Bitte nimm einen anderen Namen.",
+ "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da sie bereits existiert.",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert",
+ "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\"",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 4e7a6e1bf09..2176c57d0fc 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -38,6 +38,17 @@
"Unable to determine date" : "Datum konnte nicht ermittelt werden",
"This operation is forbidden" : "Diese Operation ist nicht erlaubt",
"This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator",
+ "Could not move \"{file}\", target exists" : "Konnte nicht verschieben \"{file}\", Ziel existiert bereits",
+ "Could not move \"{file}\"" : "Konnte nicht verschieben \"{file}\"",
+ "{newName} already exists" : "{newName} existiert bereits",
+ "Could not rename \"{fileName}\", it does not exist any more" : "Konnte nicht umbennen \"{fileName}\", da es nicht mehr existiert",
+ "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Der Name \"{targetName}\" wird bereits bereits in diesem Ordner benutzt \"{dir}\". Bitte nimm einen anderen Namen.",
+ "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"",
+ "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da sie bereits existiert.",
+ "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert",
+ "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\"",
"No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein",
"Name" : "Name",
"Size" : "Größe",
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index dd8759c3f0c..7bc628b8f9b 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -40,6 +40,15 @@ OC.L10N.register(
"Unable to determine date" : "No se pudo determinar la fecha",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
+ "Could not move \"{file}\", target exists" : "No se pudo mover \"{file}\", destino ya existe",
+ "Could not move \"{file}\"" : "No se pudo mover \"{file}\"",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not rename \"{fileName}\"" : "No se pudo renombrar \"{fileName}\"",
+ "Could not create file \"{file}\"" : "No se pudo crear archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\"" : "No se pudo crear la carpeta \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "No se pudo crear la carpeta \"{dir}\" porque ya existe",
+ "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
"No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'",
"Name" : "Nombre",
"Size" : "Tamaño",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index de4005ae515..27ebcb1da46 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -38,6 +38,15 @@
"Unable to determine date" : "No se pudo determinar la fecha",
"This operation is forbidden" : "Esta operación está prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador",
+ "Could not move \"{file}\", target exists" : "No se pudo mover \"{file}\", destino ya existe",
+ "Could not move \"{file}\"" : "No se pudo mover \"{file}\"",
+ "{newName} already exists" : "{newName} ya existe",
+ "Could not rename \"{fileName}\"" : "No se pudo renombrar \"{fileName}\"",
+ "Could not create file \"{file}\"" : "No se pudo crear archivo \"{file}\"",
+ "Could not create file \"{file}\" because it already exists" : "No se pudo crear archivo \"{file}\" porque ya existe",
+ "Could not create folder \"{dir}\"" : "No se pudo crear la carpeta \"{dir}\"",
+ "Could not create folder \"{dir}\" because it already exists" : "No se pudo crear la carpeta \"{dir}\" porque ya existe",
+ "Error deleting file \"{fileName}\"." : "Error al borrar el archivo \"{fileName}\".",
"No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'",
"Name" : "Nombre",
"Size" : "Tamaño",
diff --git a/apps/files/lib/backgroundjob/scanfiles.php b/apps/files/lib/backgroundjob/scanfiles.php
new file mode 100644
index 00000000000..7371429a268
--- /dev/null
+++ b/apps/files/lib/backgroundjob/scanfiles.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files\BackgroundJob;
+
+use OC\Files\Utils\Scanner;
+use OCP\IConfig;
+use OCP\IDBConnection;
+use OCP\ILogger;
+use OCP\IUser;
+use OCP\IUserManager;
+
+/**
+ * Class ScanFiles is a background job used to run the file scanner over the user
+ * accounts to ensure integrity of the file cache.
+ *
+ * @package OCA\Files\BackgroundJob
+ */
+class ScanFiles extends \OC\BackgroundJob\TimedJob {
+ /** @var IConfig */
+ private $config;
+ /** @var IUserManager */
+ private $userManager;
+ /** @var IDBConnection */
+ private $dbConnection;
+ /** @var ILogger */
+ private $logger;
+ /** Amount of users that should get scanned per execution */
+ const USERS_PER_SESSION = 500;
+
+ /**
+ * @param IConfig|null $config
+ * @param IUserManager|null $userManager
+ * @param IDBConnection|null $dbConnection
+ * @param ILogger|null $logger
+ */
+ public function __construct(IConfig $config = null,
+ IUserManager $userManager = null,
+ IDBConnection $dbConnection = null,
+ ILogger $logger = null) {
+ // Run once per 10 minutes
+ $this->setInterval(60 * 10);
+
+ if (is_null($userManager) || is_null($config)) {
+ $this->fixDIForJobs();
+ } else {
+ $this->config = $config;
+ $this->userManager = $userManager;
+ $this->logger = $logger;
+ }
+ }
+
+ protected function fixDIForJobs() {
+ $this->config = \OC::$server->getConfig();
+ $this->userManager = \OC::$server->getUserManager();
+ $this->logger = \OC::$server->getLogger();
+ }
+
+ /**
+ * @param IUser $user
+ */
+ protected function runScanner(IUser $user) {
+ try {
+ $scanner = new Scanner(
+ $user->getUID(),
+ $this->dbConnection,
+ $this->logger
+ );
+ $scanner->backgroundScan('');
+ } catch (\Exception $e) {
+ $this->logger->logException($e, ['app' => 'files']);
+ }
+ \OC_Util::tearDownFS();
+ }
+
+ /**
+ * @param $argument
+ * @throws \Exception
+ */
+ protected function run($argument) {
+ $offset = $this->config->getAppValue('files', 'cronjob_scan_files', 0);
+ $users = $this->userManager->search('', self::USERS_PER_SESSION, $offset);
+ if (!count($users)) {
+ // No users found, reset offset and retry
+ $offset = 0;
+ $users = $this->userManager->search('', self::USERS_PER_SESSION);
+ }
+
+ $offset += self::USERS_PER_SESSION;
+ $this->config->setAppValue('files', 'cronjob_scan_files', $offset);
+
+ foreach ($users as $user) {
+ $this->runScanner($user);
+ }
+ }
+}
diff --git a/apps/files/tests/backgroundjob/ScanFilesTest.php b/apps/files/tests/backgroundjob/ScanFilesTest.php
new file mode 100644
index 00000000000..907cad64f9e
--- /dev/null
+++ b/apps/files/tests/backgroundjob/ScanFilesTest.php
@@ -0,0 +1,134 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+namespace OCA\Files\Tests\BackgroundJob;
+
+use Test\TestCase;
+use OCP\IConfig;
+use OCP\IUserManager;
+use OCA\Files\BackgroundJob\ScanFiles;
+use OCP\ILogger;
+
+/**
+ * Class ScanFilesTest
+ *
+ * @package OCA\Files\Tests\BackgroundJob
+ */
+class ScanFilesTest extends TestCase {
+ /** @var IConfig */
+ private $config;
+ /** @var IUserManager */
+ private $userManager;
+ /** @var ScanFiles */
+ private $scanFiles;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->config = $this->getMock('\OCP\IConfig');
+ $this->userManager = $this->getMock('\OCP\IUserManager');
+
+ $this->scanFiles = $this->getMockBuilder('\OCA\Files\BackgroundJob\ScanFiles')
+ ->setConstructorArgs([
+ $this->config,
+ $this->userManager,
+ ])
+ ->setMethods(['runScanner'])
+ ->getMock();
+ }
+
+ public function testRunWithoutUsers() {
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('files', 'cronjob_scan_files', 0)
+ ->will($this->returnValue(50));
+ $this->userManager
+ ->expects($this->at(0))
+ ->method('search')
+ ->with('', 500, 50)
+ ->will($this->returnValue([]));
+ $this->userManager
+ ->expects($this->at(1))
+ ->method('search')
+ ->with('', 500)
+ ->will($this->returnValue([]));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('files', 'cronjob_scan_files', 500);
+
+ $this->invokePrivate($this->scanFiles, 'run', [[]]);
+ }
+
+ public function testRunWithUsers() {
+ $fakeUser = $this->getMock('\OCP\IUser');
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('files', 'cronjob_scan_files', 0)
+ ->will($this->returnValue(50));
+ $this->userManager
+ ->expects($this->at(0))
+ ->method('search')
+ ->with('', 500, 50)
+ ->will($this->returnValue([
+ $fakeUser
+ ]));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('files', 'cronjob_scan_files', 550);
+ $this->scanFiles
+ ->expects($this->once())
+ ->method('runScanner')
+ ->with($fakeUser);
+
+ $this->invokePrivate($this->scanFiles, 'run', [[]]);
+ }
+
+ public function testRunWithUsersAndOffsetAtEndOfUserList() {
+ $this->config
+ ->expects($this->at(0))
+ ->method('getAppValue')
+ ->with('files', 'cronjob_scan_files', 0)
+ ->will($this->returnValue(50));
+ $this->userManager
+ ->expects($this->at(0))
+ ->method('search')
+ ->with('', 500, 50)
+ ->will($this->returnValue([]));
+ $this->userManager
+ ->expects($this->at(1))
+ ->method('search')
+ ->with('', 500)
+ ->will($this->returnValue([]));
+ $this->config
+ ->expects($this->at(1))
+ ->method('setAppValue')
+ ->with('files', 'cronjob_scan_files', 500);
+ $this->scanFiles
+ ->expects($this->never())
+ ->method('runScanner');
+
+ $this->invokePrivate($this->scanFiles, 'run', [[]]);
+ }
+
+}
diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js
index 8fbbee567a7..d4d00e7f83e 100644
--- a/apps/files_external/l10n/de.js
+++ b/apps/files_external/l10n/de.js
@@ -38,6 +38,8 @@ OC.L10N.register(
"OpenStack" : "OpenStack",
"Username" : "Benutzername",
"Password" : "Passwort",
+ "Tenant name" : "Name des Mieters",
+ "Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "RSA öffentlicher Schlüssel",
diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json
index 02e495251a8..a65f58b0fdb 100644
--- a/apps/files_external/l10n/de.json
+++ b/apps/files_external/l10n/de.json
@@ -36,6 +36,8 @@
"OpenStack" : "OpenStack",
"Username" : "Benutzername",
"Password" : "Passwort",
+ "Tenant name" : "Name des Mieters",
+ "Rackspace" : "Rackspace",
"API key" : "API-Schlüssel",
"Username and password" : "Benutzername und Passwort",
"RSA public key" : "RSA öffentlicher Schlüssel",
diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js
index 46de520f55e..1d49d7b13b8 100644
--- a/apps/files_external/l10n/es.js
+++ b/apps/files_external/l10n/es.js
@@ -24,6 +24,7 @@ OC.L10N.register(
"Every time the filesystem is used" : "Cada vez que filesystem es utilizado",
"All users. Type to select user or group." : "Todos los usuarios. Teclee para seleccionar un usuario o grupo.",
"(group)" : "(grupo)",
+ "Admin defined" : "Admin definido",
"Saved" : "Guardado",
"Access key" : "Clave de acceso",
"Secret key" : "Clave secreta",
@@ -34,6 +35,7 @@ OC.L10N.register(
"OAuth2" : "OAuth2",
"Client ID" : "ID de Cliente",
"Client secret" : "Cliente secreto",
+ "OpenStack" : "OpenStack",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
"Tenant name" : "Nombre del inquilino",
diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json
index 3748040fdd4..1c60cd5fdea 100644
--- a/apps/files_external/l10n/es.json
+++ b/apps/files_external/l10n/es.json
@@ -22,6 +22,7 @@
"Every time the filesystem is used" : "Cada vez que filesystem es utilizado",
"All users. Type to select user or group." : "Todos los usuarios. Teclee para seleccionar un usuario o grupo.",
"(group)" : "(grupo)",
+ "Admin defined" : "Admin definido",
"Saved" : "Guardado",
"Access key" : "Clave de acceso",
"Secret key" : "Clave secreta",
@@ -32,6 +33,7 @@
"OAuth2" : "OAuth2",
"Client ID" : "ID de Cliente",
"Client secret" : "Cliente secreto",
+ "OpenStack" : "OpenStack",
"Username" : "Nombre de usuario",
"Password" : "Contraseña",
"Tenant name" : "Nombre del inquilino",
diff --git a/apps/files_external/l10n/lt_LT.js b/apps/files_external/l10n/lt_LT.js
index 0efbfa333b8..dabdeb8bd32 100644
--- a/apps/files_external/l10n/lt_LT.js
+++ b/apps/files_external/l10n/lt_LT.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Fetching request tokens failed. Verify that your app key and secret are correct." : "Nepavyko atsiųsti užklausos žymės. Patikrinkite savo programos raktą ir paslaptį.",
+ "Step 1 failed. Exception: %s" : "1 žingsnio klaida: %s",
"External storage" : "Išorinė saugykla",
"Personal" : "Asmeniniai",
"Grant access" : "Suteikti priėjimą",
diff --git a/apps/files_external/l10n/lt_LT.json b/apps/files_external/l10n/lt_LT.json
index 13c1543748f..2b05c277ee6 100644
--- a/apps/files_external/l10n/lt_LT.json
+++ b/apps/files_external/l10n/lt_LT.json
@@ -1,5 +1,6 @@
{ "translations": {
"Fetching request tokens failed. Verify that your app key and secret are correct." : "Nepavyko atsiųsti užklausos žymės. Patikrinkite savo programos raktą ir paslaptį.",
+ "Step 1 failed. Exception: %s" : "1 žingsnio klaida: %s",
"External storage" : "Išorinė saugykla",
"Personal" : "Asmeniniai",
"Grant access" : "Suteikti priėjimą",
diff --git a/build/integration/capabilities_features/capabilities.feature b/build/integration/capabilities_features/capabilities.feature
new file mode 100644
index 00000000000..6c1e727e7b3
--- /dev/null
+++ b/build/integration/capabilities_features/capabilities.feature
@@ -0,0 +1,31 @@
+Feature: capabilities
+ Background:
+ Given using api version "1"
+
+ Scenario: getting capabilities with admin user
+ Given As an "admin"
+ When sending "GET" to "/cloud/capabilities"
+ Then the HTTP status code should be "200"
+ And fields of capabilities match with
+ | capability | feature | value_or_subfeature | value |
+ | core | pollinterval | 60 | |
+ | core | webdav-root | remote.php/webdav | |
+ | files_sharing | api_enabled | 1 | |
+ | files_sharing | public | enabled | 1 |
+ | files_sharing | public | upload | 1 |
+ | files_sharing | resharing | 1 | |
+ | files_sharing | federation | outgoing | 1 |
+ | files_sharing | federation | incoming | 1 |
+ | files | bigfilechunking | 1 | |
+ | files | undelete | 1 | |
+ | files | versioning | 1 | |
+
+
+
+
+
+
+
+
+
+
diff --git a/build/integration/config/behat.yml b/build/integration/config/behat.yml
index 37ed2b117f3..42f5f88ac8a 100644
--- a/build/integration/config/behat.yml
+++ b/build/integration/config/behat.yml
@@ -14,7 +14,7 @@ default:
regular_user_password: 123456
federation:
paths:
- - %paths.base%/../federation
+ - %paths.base%/../federation_features
contexts:
- FederationContext:
baseUrl: http://localhost:8080/ocs/
@@ -22,6 +22,17 @@ default:
- admin
- admin
regular_user_password: 123456
+ capabilities:
+ paths:
+ - %paths.base%/../capabilities_features
+ contexts:
+ - CapabilitiesContext:
+ baseUrl: http://localhost:8080/ocs/
+ admin:
+ - admin
+ - admin
+ regular_user_password: 123456
+
extensions:
diff --git a/build/integration/features/bootstrap/CapabilitiesContext.php b/build/integration/features/bootstrap/CapabilitiesContext.php
new file mode 100644
index 00000000000..4e200bdf421
--- /dev/null
+++ b/build/integration/features/bootstrap/CapabilitiesContext.php
@@ -0,0 +1,49 @@
+<?php
+
+use Behat\Behat\Context\Context;
+use Behat\Behat\Context\SnippetAcceptingContext;
+use GuzzleHttp\Client;
+use GuzzleHttp\Message\ResponseInterface;
+
+require __DIR__ . '/../../vendor/autoload.php';
+
+/**
+ * Capabilities context.
+ */
+class CapabilitiesContext implements Context, SnippetAcceptingContext {
+
+ use BasicStructure;
+ use Provisioning;
+ use Sharing;
+
+ /**
+ * @Then /^fields of capabilities match with$/
+ * @param \Behat\Gherkin\Node\TableNode|null $formData
+ */
+ public function checkCapabilitiesResponse($formData){
+ if ($formData instanceof \Behat\Gherkin\Node\TableNode) {
+ $fd = $formData->getHash();
+ }
+
+ $capabilitiesXML = $this->response->xml()->data->capabilities;
+
+ foreach ($fd as $row) {
+ if ($row['value'] === ''){
+ $answeredValue = (string)$capabilitiesXML->$row['capability']->$row['feature'];
+ PHPUnit_Framework_Assert::assertEquals(
+ $answeredValue,
+ $row['value_or_subfeature'],
+ "Failed field " . $row['capability'] . " " . $row['feature']
+ );
+ } else{
+ $answeredValue = (string)$capabilitiesXML->$row['capability']->$row['feature']->$row['value_or_subfeature'];
+ PHPUnit_Framework_Assert::assertEquals(
+ $answeredValue,
+ $row['value'],
+ "Failed field: " . $row['capability'] . " " . $row['feature'] . " " . $row['value_or_subfeature']
+ );
+ }
+ }
+ }
+
+}
diff --git a/build/integration/federation/federated.feature b/build/integration/federation_features/federated.feature
index 5437d01dee2..5437d01dee2 100644
--- a/build/integration/federation/federated.feature
+++ b/build/integration/federation_features/federated.feature
diff --git a/core/l10n/ast.js b/core/l10n/ast.js
index e0775c75569..18274e59cbc 100644
--- a/core/l10n/ast.js
+++ b/core/l10n/ast.js
@@ -134,7 +134,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "L'anovamientu fízose con ésitu. Redirixiendo agora al to ownCloud.",
"Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu",
"Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nun pudo unviase'l corréu porque nun hai direición de corréu pa esti nome d'usuariu. Por favor, contauta col alministrador",
"%s password reset" : "%s restablecer contraseña",
"Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}",
"New password" : "Contraseña nueva",
diff --git a/core/l10n/ast.json b/core/l10n/ast.json
index a4324339829..39059c9a89a 100644
--- a/core/l10n/ast.json
+++ b/core/l10n/ast.json
@@ -132,7 +132,6 @@
"The update was successful. Redirecting you to ownCloud now." : "L'anovamientu fízose con ésitu. Redirixiendo agora al to ownCloud.",
"Couldn't reset password because the token is invalid" : "Nun pudo reaniciase la contraseña porque'l token ye inválidu",
"Couldn't send reset email. Please make sure your username is correct." : "Nun pudo unviase'l corréu. Por favor, asegurate que'l to nome d'usuariu seya correutu",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nun pudo unviase'l corréu porque nun hai direición de corréu pa esti nome d'usuariu. Por favor, contauta col alministrador",
"%s password reset" : "%s restablecer contraseña",
"Use the following link to reset your password: {link}" : "Usa'l siguiente enllaz pa restablecer la to contraseña: {link}",
"New password" : "Contraseña nueva",
diff --git a/core/l10n/bg_BG.js b/core/l10n/bg_BG.js
index 34df1311847..cdadedbf74b 100644
--- a/core/l10n/bg_BG.js
+++ b/core/l10n/bg_BG.js
@@ -145,7 +145,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Обновяването е успешно. Сега Ви пренасочваме към ownCloud.",
"Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна",
"Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Неуспешно изпращане на имейл за възстановяване на паролата, защото липсва имейл, свързан с това потребителско име. Моля, свържете се с администратора.",
"%s password reset" : "Паролата на %s е променена.",
"Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}",
"New password" : "Нова парола",
diff --git a/core/l10n/bg_BG.json b/core/l10n/bg_BG.json
index bcce1747bbd..c4f9a03757a 100644
--- a/core/l10n/bg_BG.json
+++ b/core/l10n/bg_BG.json
@@ -143,7 +143,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Обновяването е успешно. Сега Ви пренасочваме към ownCloud.",
"Couldn't reset password because the token is invalid" : "Промяната на паролата е невъзможно, защото връзката за удостоверение не е валидна",
"Couldn't send reset email. Please make sure your username is correct." : "Неуспешно изпращане на имейл за възстановяване на паролата. Моля, уверете се, че потребителското име е правилно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Неуспешно изпращане на имейл за възстановяване на паролата, защото липсва имейл, свързан с това потребителско име. Моля, свържете се с администратора.",
"%s password reset" : "Паролата на %s е променена.",
"Use the following link to reset your password: {link}" : "Използвайте следната връзка, за да възстановите паролата си: {link}",
"New password" : "Нова парола",
diff --git a/core/l10n/bs.js b/core/l10n/bs.js
index 7d0664e38ee..f3b39d5fb97 100644
--- a/core/l10n/bs.js
+++ b/core/l10n/bs.js
@@ -134,7 +134,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Preusmjeravam vas na ownCloud.",
"Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.",
"Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Slanje emaila resetovanja nije moguće jer za ovo korisničko ime ne postoji email adresa. Molim, kontaktirajte administratora.",
"%s password reset" : "%s lozinka resetovana",
"Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/bs.json b/core/l10n/bs.json
index e221dba005d..8105c2c9866 100644
--- a/core/l10n/bs.json
+++ b/core/l10n/bs.json
@@ -132,7 +132,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Preusmjeravam vas na ownCloud.",
"Couldn't reset password because the token is invalid" : "Nemoguće resetiranje lozinke jer znak nije validan.",
"Couldn't send reset email. Please make sure your username is correct." : "Slanje emaila resetovanja nije moguće. Osigurajte se da vam je ispravno korisničko ime.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Slanje emaila resetovanja nije moguće jer za ovo korisničko ime ne postoji email adresa. Molim, kontaktirajte administratora.",
"%s password reset" : "%s lozinka resetovana",
"Use the following link to reset your password: {link}" : "Za resetovanje vaše lozinke koristite slijedeću vezu: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/ca.js b/core/l10n/ca.js
index f1eb5f51db9..90b5c697de5 100644
--- a/core/l10n/ca.js
+++ b/core/l10n/ca.js
@@ -170,7 +170,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid",
"Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut",
"Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "No s'ha pogut enviar el correu de restabliment perquè no hi ha cap correu electrònic per aquest usuari. Contacteu amb l'administrador.",
"%s password reset" : "restableix la contrasenya %s",
"Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}",
"New password" : "Contrasenya nova",
diff --git a/core/l10n/ca.json b/core/l10n/ca.json
index 0b14ef2ff2a..eaa7fe37e82 100644
--- a/core/l10n/ca.json
+++ b/core/l10n/ca.json
@@ -168,7 +168,6 @@
"Couldn't reset password because the token is invalid" : "No es pot restablir la contrasenya perquè el testimoni no és vàlid",
"Couldn't reset password because the token is expired" : "No es pot restablir la contrasenya perquè el testimoni ha vençut",
"Couldn't send reset email. Please make sure your username is correct." : "No s'ha pogut enviar el correu de restabliment. Assegureu-vos que el vostre nom d'usuari és correcte.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "No s'ha pogut enviar el correu de restabliment perquè no hi ha cap correu electrònic per aquest usuari. Contacteu amb l'administrador.",
"%s password reset" : "restableix la contrasenya %s",
"Use the following link to reset your password: {link}" : "Useu l'enllaç següent per restablir la contrasenya: {link}",
"New password" : "Contrasenya nova",
diff --git a/core/l10n/cs_CZ.js b/core/l10n/cs_CZ.js
index 41f7782de3c..4f66fc7fdd2 100644
--- a/core/l10n/cs_CZ.js
+++ b/core/l10n/cs_CZ.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu",
"Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu",
"Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého správce systému.",
"%s password reset" : "reset hesla %s",
"Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}",
"New password" : "Nové heslo",
diff --git a/core/l10n/cs_CZ.json b/core/l10n/cs_CZ.json
index 321ac51f7e2..749eb5ce806 100644
--- a/core/l10n/cs_CZ.json
+++ b/core/l10n/cs_CZ.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "Heslo nebylo změněno kvůli neplatnému tokenu",
"Couldn't reset password because the token is expired" : "Heslo nebylo změněno z důvodu vypršení tokenu",
"Couldn't send reset email. Please make sure your username is correct." : "Nelze odeslat email pro změnu hesla. Ujistěte se prosím, že zadáváte správné uživatelské jméno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nelze odeslat email pro změnu hesla, protože u tohoto uživatelského jména není uvedena emailová adresa. Kontaktujte prosím svého správce systému.",
"%s password reset" : "reset hesla %s",
"Use the following link to reset your password: {link}" : "Heslo obnovíte použitím následujícího odkazu: {link}",
"New password" : "Nové heslo",
diff --git a/core/l10n/da.js b/core/l10n/da.js
index eed02acd3be..21dd4627814 100644
--- a/core/l10n/da.js
+++ b/core/l10n/da.js
@@ -186,7 +186,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt",
"Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet",
"Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Der ikke er nogen email adresse tilknyttet denne bruger konto. Kontakt venligst systemadministratoren",
"%s password reset" : "%s adgangskode nulstillet",
"Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}",
"New password" : "Ny adgangskode",
diff --git a/core/l10n/da.json b/core/l10n/da.json
index 35aff828922..84cd2e09ed7 100644
--- a/core/l10n/da.json
+++ b/core/l10n/da.json
@@ -184,7 +184,6 @@
"Couldn't reset password because the token is invalid" : "Kunne ikke nulstille kodeordet, fordi symboludtrykket er ugyldigt",
"Couldn't reset password because the token is expired" : "Kunne ikke nulstille kodeord, da tokenet er udløbet",
"Couldn't send reset email. Please make sure your username is correct." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Kontroller venligst om dit brugernavnet er korrekt",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Der opstod et problem under afsendelse af nulstillings-e-mailen. Der ikke er nogen email adresse tilknyttet denne bruger konto. Kontakt venligst systemadministratoren",
"%s password reset" : "%s adgangskode nulstillet",
"Use the following link to reset your password: {link}" : "Anvend følgende link til at nulstille din adgangskode: {link}",
"New password" : "Ny adgangskode",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 873ff7d1634..79527a46e0b 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -6,8 +6,10 @@ OC.L10N.register(
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
"Turned off maintenance mode" : "Wartungsmodus ausgeschaltet",
"Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten",
+ "Updating database schema" : "Datenbank-Schema wird upgedatet",
"Updated database" : "Datenbank aktualisiert",
"Checked database schema update" : "Datenbankschema-Aktualisierung überprüft",
+ "Checking updates of apps" : "Es wird nach Updates für die Apps gesucht",
"Checked database schema update for apps" : "Datenbankschema-Aktualisierung für Apps überprüft",
"Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert",
"Repair warning: " : "Reperaturwarnung:",
@@ -179,7 +181,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
"Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
"Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktiere Deinen Administrator.",
"%s password reset" : "%s-Passwort zurücksetzen",
"Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}",
"New password" : "Neues Passwort",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index dcaeb2ad1a5..b567d209a49 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -4,8 +4,10 @@
"Turned on maintenance mode" : "Wartungsmodus eingeschaltet",
"Turned off maintenance mode" : "Wartungsmodus ausgeschaltet",
"Maintenance mode is kept active" : "Wartungsmodus wird aktiv gehalten",
+ "Updating database schema" : "Datenbank-Schema wird upgedatet",
"Updated database" : "Datenbank aktualisiert",
"Checked database schema update" : "Datenbankschema-Aktualisierung überprüft",
+ "Checking updates of apps" : "Es wird nach Updates für die Apps gesucht",
"Checked database schema update for apps" : "Datenbankschema-Aktualisierung für Apps überprüft",
"Updated \"%s\" to %s" : "„%s“ zu %s aktualisiert",
"Repair warning: " : "Reperaturwarnung:",
@@ -177,7 +179,6 @@
"Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
"Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
"Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stelle sicher, dass Dein Benutzername korrekt ist.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktiere Deinen Administrator.",
"%s password reset" : "%s-Passwort zurücksetzen",
"Use the following link to reset your password: {link}" : "Benutze den folgenden Link, um Dein Passwort zurückzusetzen: {link}",
"New password" : "Neues Passwort",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index a3033722d95..5d200e2267c 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -179,7 +179,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
"Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
"Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktieren Sie Ihren Administrator.",
"%s password reset" : "%s-Passwort zurücksetzen",
"Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}",
"New password" : "Neues Passwort",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index a65673aa1e4..25e8daeaff7 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -177,7 +177,6 @@
"Couldn't reset password because the token is invalid" : "Das Passwort konnte aufgrund eines ungültigen Tokens nicht zurückgesetzt werden",
"Couldn't reset password because the token is expired" : "Das Passwort konnte nicht zurückgesetzt werden, da der Token abgelaufen ist",
"Couldn't send reset email. Please make sure your username is correct." : "E-Mail zum Zurücksetzen kann nicht versendet werden. Bitte stellen Sie sicher, dass Ihr Benutzername richtig ist.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Die E-Mail zum Zurücksetzen konnte nicht versandt werden, weil für diesen Benutzernamen keine E-Mail-Adresse hinterlegt ist. Bitte kontaktieren Sie Ihren Administrator.",
"%s password reset" : "%s-Passwort zurücksetzen",
"Use the following link to reset your password: {link}" : "Benutzen Sie den folgenden Link, um Ihr Passwort zurückzusetzen: {link}",
"New password" : "Neues Passwort",
diff --git a/core/l10n/el.js b/core/l10n/el.js
index 2f264730565..e075b123a57 100644
--- a/core/l10n/el.js
+++ b/core/l10n/el.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο",
"Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει",
"Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς καθώς δεν αντιστοιχεί καμμία διεύθυνση ηλ. ταχυδρομείου σε αυτό το όνομα χρήστη. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.",
"%s password reset" : "%s επαναφορά κωδικού πρόσβασης",
"Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}",
"New password" : "Νέο συνθηματικό",
diff --git a/core/l10n/el.json b/core/l10n/el.json
index cafa289fc32..7c203945b5e 100644
--- a/core/l10n/el.json
+++ b/core/l10n/el.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Αδυναμία επαναφοράς κωδικού πρόσβασης καθώς το τεκμήριο είναι άκυρο",
"Couldn't reset password because the token is expired" : "Αδυναμία επαναφοράς κωδικού πρόσβασης επειδή το token έχει λήξει",
"Couldn't send reset email. Please make sure your username is correct." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς. Παρακαλώ ελέγξτε ότι το όνομα χρήστη σας είναι ορθό.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Αδυναμία αποστολής ηλ. μηνύματος επαναφοράς καθώς δεν αντιστοιχεί καμμία διεύθυνση ηλ. ταχυδρομείου σε αυτό το όνομα χρήστη. Παρακαλώ επικοινωνήστε με το διαχειριστή σας.",
"%s password reset" : "%s επαναφορά κωδικού πρόσβασης",
"Use the following link to reset your password: {link}" : "Χρησιμοποιήστε τον ακόλουθο σύνδεσμο για να επανεκδόσετε τον κωδικό: {link}",
"New password" : "Νέο συνθηματικό",
diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js
index e8c85405d16..d51892019d0 100644
--- a/core/l10n/en_GB.js
+++ b/core/l10n/en_GB.js
@@ -155,7 +155,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "The update was successful. Redirecting you to ownCloud now.",
"Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid",
"Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Couldn't send reset email because there is no email address for this username. Please contact your administrator.",
"%s password reset" : "%s password reset",
"Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}",
"New password" : "New password",
diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json
index 1a2c794895a..9042f4d0c00 100644
--- a/core/l10n/en_GB.json
+++ b/core/l10n/en_GB.json
@@ -153,7 +153,6 @@
"The update was successful. Redirecting you to ownCloud now." : "The update was successful. Redirecting you to ownCloud now.",
"Couldn't reset password because the token is invalid" : "Couldn't reset password because the token is invalid",
"Couldn't send reset email. Please make sure your username is correct." : "Couldn't send reset email. Please make sure your username is correct.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Couldn't send reset email because there is no email address for this username. Please contact your administrator.",
"%s password reset" : "%s password reset",
"Use the following link to reset your password: {link}" : "Use the following link to reset your password: {link}",
"New password" : "New password",
diff --git a/core/l10n/es.js b/core/l10n/es.js
index 316f938798d..fd8df5f6c2f 100644
--- a/core/l10n/es.js
+++ b/core/l10n/es.js
@@ -72,6 +72,7 @@ OC.L10N.register(
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Ha habido problemas durante la comprobación de la integridad del código. Más información…</a>",
"Settings" : "Ajustes",
"Saving..." : "Guardando...",
"seconds ago" : "hace segundos",
@@ -181,7 +182,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.",
"Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.",
"Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico para el restablecimiento, porque no hay una dirección de correo electrónico asociada con este nombre de usuario. Por favor, contacte a su administrador.",
"%s password reset" : "%s restablecer contraseña",
"Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}",
"New password" : "Nueva contraseña",
diff --git a/core/l10n/es.json b/core/l10n/es.json
index aa865fbd542..a3ad1e2a9a4 100644
--- a/core/l10n/es.json
+++ b/core/l10n/es.json
@@ -70,6 +70,7 @@
"Oct." : "Oct.",
"Nov." : "Nov.",
"Dec." : "Dic.",
+ "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Ha habido problemas durante la comprobación de la integridad del código. Más información…</a>",
"Settings" : "Ajustes",
"Saving..." : "Guardando...",
"seconds ago" : "hace segundos",
@@ -179,7 +180,6 @@
"Couldn't reset password because the token is invalid" : "No se puede restablecer la contraseña porque el vale de identificación es inválido.",
"Couldn't reset password because the token is expired" : "No se puede restablecer la contraseña porque el vale de identificación ha caducado.",
"Couldn't send reset email. Please make sure your username is correct." : "No se pudo enviar el correo electrónico para el restablecimiento. Por favor, asegúrese de que su nombre de usuario es el correcto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "No se pudo enviar el correo electrónico para el restablecimiento, porque no hay una dirección de correo electrónico asociada con este nombre de usuario. Por favor, contacte a su administrador.",
"%s password reset" : "%s restablecer contraseña",
"Use the following link to reset your password: {link}" : "Utilice el siguiente enlace para restablecer su contraseña: {link}",
"New password" : "Nueva contraseña",
diff --git a/core/l10n/et_EE.js b/core/l10n/et_EE.js
index b782b43999a..7cb375149ac 100644
--- a/core/l10n/et_EE.js
+++ b/core/l10n/et_EE.js
@@ -158,7 +158,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Uuendus oli edukas. Kohe suunatakse Sind ownCloudi.",
"Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane",
"Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ei suutnud lähtestada e-maili, kuna sellel kasutajal pole e-posti määratud. Palun kontakteeru süsteemihalduriga.",
"%s password reset" : "%s parooli lähtestus",
"Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}",
"New password" : "Uus parool",
diff --git a/core/l10n/et_EE.json b/core/l10n/et_EE.json
index c25b9f166c9..d10decffc5d 100644
--- a/core/l10n/et_EE.json
+++ b/core/l10n/et_EE.json
@@ -156,7 +156,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Uuendus oli edukas. Kohe suunatakse Sind ownCloudi.",
"Couldn't reset password because the token is invalid" : "Ei saanud parooli taastada, kuna märgend on vigane",
"Couldn't send reset email. Please make sure your username is correct." : "Ei suutnud lähtestada e-maili. Palun veendu, et kasutajatunnus on õige.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ei suutnud lähtestada e-maili, kuna sellel kasutajal pole e-posti määratud. Palun kontakteeru süsteemihalduriga.",
"%s password reset" : "%s parooli lähtestus",
"Use the following link to reset your password: {link}" : "Kasuta järgnevat linki oma parooli taastamiseks: {link}",
"New password" : "Uus parool",
diff --git a/core/l10n/eu.js b/core/l10n/eu.js
index d24a7cd42e2..dd247c80e30 100644
--- a/core/l10n/eu.js
+++ b/core/l10n/eu.js
@@ -139,7 +139,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Eguneraketa ongi egin da. Orain zure ownClouderea berbideratua izango zara.",
"Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako",
"Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ezin izan da berrezartzeko eposta bidali erabiltzaile izen honetarako eposta helbiderik ez dagoelako. Mesedez harremanetan jarri kudeatzailearekin.",
"%s password reset" : "%s pasahitza berrezarri",
"Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}",
"New password" : "Pasahitz berria",
diff --git a/core/l10n/eu.json b/core/l10n/eu.json
index 81849897490..9a81a86df26 100644
--- a/core/l10n/eu.json
+++ b/core/l10n/eu.json
@@ -137,7 +137,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Eguneraketa ongi egin da. Orain zure ownClouderea berbideratua izango zara.",
"Couldn't reset password because the token is invalid" : "Ezin izan da pasahitza berrezarri tokena baliogabea delako",
"Couldn't send reset email. Please make sure your username is correct." : "Ezin izan da berrezartzeko eposta bidali. Ziurtatu zure erabiltzaile izena egokia dela.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ezin izan da berrezartzeko eposta bidali erabiltzaile izen honetarako eposta helbiderik ez dagoelako. Mesedez harremanetan jarri kudeatzailearekin.",
"%s password reset" : "%s pasahitza berrezarri",
"Use the following link to reset your password: {link}" : "Eribili hurrengo lotura zure pasahitza berrezartzeko: {link}",
"New password" : "Pasahitz berria",
diff --git a/core/l10n/fi_FI.js b/core/l10n/fi_FI.js
index ea79299a7d5..dd95057a551 100644
--- a/core/l10n/fi_FI.js
+++ b/core/l10n/fi_FI.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen",
"Couldn't reset password because the token is expired" : "Salasanan nollaaminen ei onnistunut, koska valtuutus on vanhentunut",
"Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut, koska tälle käyttäjätunnukselle ei ole määritelty sähköpostiosoitetta. Ota yhteys ylläpitäjään.",
"%s password reset" : "%s salasanan palautus",
"Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}",
"New password" : "Uusi salasana",
diff --git a/core/l10n/fi_FI.json b/core/l10n/fi_FI.json
index 94d83026ada..45ddbfb3570 100644
--- a/core/l10n/fi_FI.json
+++ b/core/l10n/fi_FI.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "Salasanaa ei voitu palauttaa koska valtuutus on virheellinen",
"Couldn't reset password because the token is expired" : "Salasanan nollaaminen ei onnistunut, koska valtuutus on vanhentunut",
"Couldn't send reset email. Please make sure your username is correct." : "Palautussähköpostin lähettäminen ei onnistunut. Varmista, että käyttäjätunnuksesi on oikein.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Palautussähköpostin lähettäminen ei onnistunut, koska tälle käyttäjätunnukselle ei ole määritelty sähköpostiosoitetta. Ota yhteys ylläpitäjään.",
"%s password reset" : "%s salasanan palautus",
"Use the following link to reset your password: {link}" : "Voit palauttaa salasanasi seuraavassa osoitteessa: {link}",
"New password" : "Uusi salasana",
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index cd5d68f6f5e..9dae27cd459 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.",
"Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.",
"Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.",
"%s password reset" : "Réinitialisation de votre mot de passe %s",
"Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}",
"New password" : "Nouveau mot de passe",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 2bfa6edc49e..ee8f44595e2 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "Impossible de réinitialiser le mot de passe car le jeton n'est pas valable.",
"Couldn't reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton a expiré.",
"Couldn't send reset email. Please make sure your username is correct." : "Impossible d'envoyer le courriel de réinitialisation. Veuillez vérifier que votre nom d'utilisateur est correct.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossible d'envoyer le courriel de réinitialisation car il n'y a aucune adresse de courriel pour cet utilisateur. Veuillez contacter votre administrateur.",
"%s password reset" : "Réinitialisation de votre mot de passe %s",
"Use the following link to reset your password: {link}" : "Utilisez le lien suivant pour réinitialiser votre mot de passe : {link}",
"New password" : "Nouveau mot de passe",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index 92fa9a74f35..eaef574eef3 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -168,7 +168,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "A actualización realizouse correctamente. Redirixíndoo agora á ownCloud.",
"Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta",
"Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Semella que este correo non corresponde con este nome de usuario. Póñase en contacto co administrador.",
"%s password reset" : "Restabelecer o contrasinal %s",
"Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}",
"New password" : "Novo contrasinal",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index ebc7313cccc..f72db710e89 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -166,7 +166,6 @@
"The update was successful. Redirecting you to ownCloud now." : "A actualización realizouse correctamente. Redirixíndoo agora á ownCloud.",
"Couldn't reset password because the token is invalid" : "No, foi posíbel restabelecer o contrasinal, a marca non é correcta",
"Couldn't send reset email. Please make sure your username is correct." : "Non foi posíbel enviar o correo do restabelecemento. Asegúrese de que o nome de usuario é o correcto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Non foi posíbel enviar o correo do restabelecemento. Semella que este correo non corresponde con este nome de usuario. Póñase en contacto co administrador.",
"%s password reset" : "Restabelecer o contrasinal %s",
"Use the following link to reset your password: {link}" : "Usa a seguinte ligazón para restabelecer o contrasinal: {link}",
"New password" : "Novo contrasinal",
diff --git a/core/l10n/hr.js b/core/l10n/hr.js
index 6bb9356a76b..647657629f4 100644
--- a/core/l10n/hr.js
+++ b/core/l10n/hr.js
@@ -143,7 +143,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Upravo ste preusmjeravani na ownCloud.",
"Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.",
"Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Resetiranu e-poštu nije moguće poslati jer za ovo korisničko ime ne postoji adresa.Molimo, kontaktirajte svog administratora.",
"%s password reset" : "%s lozinka resetirana",
"Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/hr.json b/core/l10n/hr.json
index 3e64259428c..9c9d7eff95f 100644
--- a/core/l10n/hr.json
+++ b/core/l10n/hr.json
@@ -141,7 +141,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspjelo. Upravo ste preusmjeravani na ownCloud.",
"Couldn't reset password because the token is invalid" : "Resetiranje lozinke nije moguće jer je token neispravan.",
"Couldn't send reset email. Please make sure your username is correct." : "Resetiranu e-poštu nije moguće poslati.Molimo provjerite ispravnost svoga korisničkog imena.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Resetiranu e-poštu nije moguće poslati jer za ovo korisničko ime ne postoji adresa.Molimo, kontaktirajte svog administratora.",
"%s password reset" : "%s lozinka resetirana",
"Use the following link to reset your password: {link}" : "Za resetiranje svoje lozinke koristite sljedeću vezu: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/hu_HU.js b/core/l10n/hu_HU.js
index 3d0276c1700..a9b84b6bcf9 100644
--- a/core/l10n/hu_HU.js
+++ b/core/l10n/hu_HU.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.",
"Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.",
"Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Visszaállítási e-mail nem küldhető, mert nem tartozik e-mail cím ehhez a felhasználóhoz. Kérjük, lépjen kapcsolatba a rendszergazdával.",
"%s password reset" : "%s jelszó visszaállítás",
"Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}",
"New password" : "Az új jelszó",
diff --git a/core/l10n/hu_HU.json b/core/l10n/hu_HU.json
index b1aa5f4c8ad..991851b5beb 100644
--- a/core/l10n/hu_HU.json
+++ b/core/l10n/hu_HU.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Nem lehet a jelszót törölni, mert a token érvénytelen.",
"Couldn't reset password because the token is expired" : "Nem lehet a jelszót törölni, mert a token lejárt.",
"Couldn't send reset email. Please make sure your username is correct." : "Visszaállítási e-mail nem küldhető. Kérjük, lépjen kapcsolatba a rendszergazdával. ",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Visszaállítási e-mail nem küldhető, mert nem tartozik e-mail cím ehhez a felhasználóhoz. Kérjük, lépjen kapcsolatba a rendszergazdával.",
"%s password reset" : "%s jelszó visszaállítás",
"Use the following link to reset your password: {link}" : "Használja ezt a linket a jelszó ismételt beállításához: {link}",
"New password" : "Az új jelszó",
diff --git a/core/l10n/id.js b/core/l10n/id.js
index 6306d0682e0..fb0fb7f4330 100644
--- a/core/l10n/id.js
+++ b/core/l10n/id.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah",
"Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa",
"Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Tidak dapat menyetel ulang email karena tidak ada alamat email untuk nama pengguna ini. Silakan hubungi Administrator Anda.",
"%s password reset" : "%s sandi disetel ulang",
"Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}",
"New password" : "Sandi baru",
diff --git a/core/l10n/id.json b/core/l10n/id.json
index 80eebfdaab4..2edd1f8b362 100644
--- a/core/l10n/id.json
+++ b/core/l10n/id.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Tidak dapat menyetel ulang sandi karena token tidak sah",
"Couldn't reset password because the token is expired" : "Tidak dapat menyetel ulang sandi karena token telah kadaluarsa",
"Couldn't send reset email. Please make sure your username is correct." : "Tidak dapat menyetel ulang email. Mohon pastikan nama pengguna Anda benar.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Tidak dapat menyetel ulang email karena tidak ada alamat email untuk nama pengguna ini. Silakan hubungi Administrator Anda.",
"%s password reset" : "%s sandi disetel ulang",
"Use the following link to reset your password: {link}" : "Gunakan tautan berikut untuk menyetel ulang sandi Anda: {link}",
"New password" : "Sandi baru",
diff --git a/core/l10n/is.js b/core/l10n/is.js
index a4f17b74f55..47f52e49d02 100644
--- a/core/l10n/is.js
+++ b/core/l10n/is.js
@@ -175,7 +175,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt",
"Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið",
"Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Gat ekki sent endurstillingu í tölvupóst vegna þess að það er ekkert netfang fyrir þetta notandanafn. Vinsamlegast hafðu samband við kerfisstjóra.",
"%s password reset" : "%s lykilorð endurstillt",
"Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}",
"New password" : "Nýtt lykilorð",
diff --git a/core/l10n/is.json b/core/l10n/is.json
index aebd0c756d2..04f1af7ab63 100644
--- a/core/l10n/is.json
+++ b/core/l10n/is.json
@@ -173,7 +173,6 @@
"Couldn't reset password because the token is invalid" : "Gat ekki endurstillt lykilorðið vegna þess að tóki ógilt",
"Couldn't reset password because the token is expired" : "Gat ekki endurstillt lykilorðið vegna þess að tóki er útrunnið",
"Couldn't send reset email. Please make sure your username is correct." : "Gat ekki sent endurstillingu í tölvupóst. Vinsamlegast gakktu úr skugga um að notandanafn þitt sé rétt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Gat ekki sent endurstillingu í tölvupóst vegna þess að það er ekkert netfang fyrir þetta notandanafn. Vinsamlegast hafðu samband við kerfisstjóra.",
"%s password reset" : "%s lykilorð endurstillt",
"Use the following link to reset your password: {link}" : "Notað eftirfarandi veftengil til að endursetja lykilorðið þitt: {link}",
"New password" : "Nýtt lykilorð",
diff --git a/core/l10n/it.js b/core/l10n/it.js
index 60b1620179e..987aed20d9c 100644
--- a/core/l10n/it.js
+++ b/core/l10n/it.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido",
"Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto",
"Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.",
"%s password reset" : "Ripristino password di %s",
"Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}",
"New password" : "Nuova password",
diff --git a/core/l10n/it.json b/core/l10n/it.json
index bede84fee8a..fc6811a71bd 100644
--- a/core/l10n/it.json
+++ b/core/l10n/it.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "Impossibile reimpostare la password poiché il token non è valido",
"Couldn't reset password because the token is expired" : "Impossibile reimpostare la password poiché il token è scaduto",
"Couldn't send reset email. Please make sure your username is correct." : "Impossibile inviare l'email di reimpostazione. Assicurati che il nome utente sia corretto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossibile inviare l'email di reimpostazione poiché non è presente un indirizzo email per questo nome utente. Contatta il tuo amministratore.",
"%s password reset" : "Ripristino password di %s",
"Use the following link to reset your password: {link}" : "Usa il collegamento seguente per ripristinare la password: {link}",
"New password" : "Nuova password",
diff --git a/core/l10n/ja.js b/core/l10n/ja.js
index d5eb22d42f7..375b8c8a789 100644
--- a/core/l10n/ja.js
+++ b/core/l10n/ja.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした",
"Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした",
"Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。",
"%s password reset" : "%s パスワードリセット",
"Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}",
"New password" : "新しいパスワードを入力",
diff --git a/core/l10n/ja.json b/core/l10n/ja.json
index 443b8038ea5..337358d57f7 100644
--- a/core/l10n/ja.json
+++ b/core/l10n/ja.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "トークンが無効なため、パスワードをリセットできませんでした",
"Couldn't reset password because the token is expired" : "トークンが期限切れのため、パスワードをリセットできませんでした",
"Couldn't send reset email. Please make sure your username is correct." : "リセットメールを送信できませんでした。ユーザー名が正しいことを確認してください。",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "このユーザー名に紐付けられたメールアドレスがないため、リセットメールを送信できませんでした。管理者に問い合わせてください。",
"%s password reset" : "%s パスワードリセット",
"Use the following link to reset your password: {link}" : "パスワードをリセットするには次のリンクをクリックしてください: {link}",
"New password" : "新しいパスワードを入力",
diff --git a/core/l10n/kn.js b/core/l10n/kn.js
index cf16300c759..97d90600a6d 100644
--- a/core/l10n/kn.js
+++ b/core/l10n/kn.js
@@ -111,7 +111,6 @@ OC.L10N.register(
"The update was unsuccessful. " : "ಆಧುನೀಕರಿಣೆ ಯಶಸ್ವಿಯಾಗಿಲ್ಲ.",
"Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
"Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ಈ ಬಳಕೆದಾರನ ಹೆಸರಿನ್ನಲ್ಲಿ ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇಲ್ಲದರಿರುವುದರಿಂದ ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.",
"%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ",
"Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}",
"New password" : "ಹೊಸ ಗುಪ್ತಪದ",
diff --git a/core/l10n/kn.json b/core/l10n/kn.json
index a7ea1bba098..0fef8e9abea 100644
--- a/core/l10n/kn.json
+++ b/core/l10n/kn.json
@@ -109,7 +109,6 @@
"The update was unsuccessful. " : "ಆಧುನೀಕರಿಣೆ ಯಶಸ್ವಿಯಾಗಿಲ್ಲ.",
"Couldn't reset password because the token is invalid" : "ಚಿಹ್ನೆ ಅಮಾನ್ಯವಾಗಿದೆ, ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ",
"Couldn't send reset email. Please make sure your username is correct." : "ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರು ಸರಿಯಾಗಿದೆ ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ಈ ಬಳಕೆದಾರನ ಹೆಸರಿನ್ನಲ್ಲಿ ಯಾವುದೇ ಇ-ಅಂಚೆ ವಿಳಾಸ ಇಲ್ಲದರಿರುವುದರಿಂದ ಬದಲಾವಣೆಯ ಇ-ಅಂಚೆಯನ್ನು ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.",
"%s password reset" : "%s ಗುಪ್ತ ಪದವನ್ನು ಮರುಹೊಂದಿಸಿ",
"Use the following link to reset your password: {link}" : "ನಿಮ್ಮ ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಲು ಕೆಳಗಿನ ಅಂತ್ರಜಾಲ ಕೊಂಡಿಯನ್ನು ಬಳಸಿ : {link}",
"New password" : "ಹೊಸ ಗುಪ್ತಪದ",
diff --git a/core/l10n/ko.js b/core/l10n/ko.js
index 97c6d5dcdec..f8d131fca29 100644
--- a/core/l10n/ko.js
+++ b/core/l10n/ko.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다",
"Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다",
"Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "해당 사용자 이름에 등록된 이메일 주소가 없어서 재설정 메일을 보낼 수 없습니다. 관리자에게 문의하십시오.",
"%s password reset" : "%s 암호 재설정",
"Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}",
"New password" : "새 암호",
diff --git a/core/l10n/ko.json b/core/l10n/ko.json
index 293242a2f62..64aec1d9d97 100644
--- a/core/l10n/ko.json
+++ b/core/l10n/ko.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "토큰이 잘못되었기 때문에 암호를 초기화할 수 없습니다",
"Couldn't reset password because the token is expired" : "토큰이 만료되어 암호를 초기화할 수 없습니다",
"Couldn't send reset email. Please make sure your username is correct." : "재설정 메일을 보낼 수 없습니다. 사용자 이름이 올바른지 확인하십시오.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "해당 사용자 이름에 등록된 이메일 주소가 없어서 재설정 메일을 보낼 수 없습니다. 관리자에게 문의하십시오.",
"%s password reset" : "%s 암호 재설정",
"Use the following link to reset your password: {link}" : "다음 링크를 사용하여 암호를 재설정할 수 있습니다: {link}",
"New password" : "새 암호",
diff --git a/core/l10n/nb_NO.js b/core/l10n/nb_NO.js
index b21e5d6b17c..d6a613ab48e 100644
--- a/core/l10n/nb_NO.js
+++ b/core/l10n/nb_NO.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.",
"Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.",
"Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.",
"%s password reset" : "%s tilbakestilling av passord",
"Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}",
"New password" : "Nytt passord",
diff --git a/core/l10n/nb_NO.json b/core/l10n/nb_NO.json
index cb67534cd01..58cad24f1a2 100644
--- a/core/l10n/nb_NO.json
+++ b/core/l10n/nb_NO.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Klarte ikke å tilbakestille passordet fordi token er ugyldig.",
"Couldn't reset password because the token is expired" : "Klarte ikke å tilbakestille passordet fordi token er utløpt.",
"Couldn't send reset email. Please make sure your username is correct." : "Klarte ikke å sende e-post for tilbakestilling av passord. Sjekk at brukernavnet ditt er korrekt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Klarte ikke å sende e-post for tilbakestilling av passord fordi det ikke finnes noen e-postadresse for dette brukernavnet. Kontakt administratoren din.",
"%s password reset" : "%s tilbakestilling av passord",
"Use the following link to reset your password: {link}" : "Bruk følgende lenke for å tilbakestille passordet ditt: {link}",
"New password" : "Nytt passord",
diff --git a/core/l10n/nl.js b/core/l10n/nl.js
index fe5f45c95ea..ffff693e95c 100644
--- a/core/l10n/nl.js
+++ b/core/l10n/nl.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is",
"Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is",
"Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.",
"%s password reset" : "%s wachtwoord reset",
"Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}",
"New password" : "Nieuw wachtwoord",
diff --git a/core/l10n/nl.json b/core/l10n/nl.json
index 117070e8399..a387d496092 100644
--- a/core/l10n/nl.json
+++ b/core/l10n/nl.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Kon het wachtwoord niet herstellen, omdat het token ongeldig is",
"Couldn't reset password because the token is expired" : "Kon het wachtwoord niet herstellen, omdat het token verlopen is",
"Couldn't send reset email. Please make sure your username is correct." : "Kon e-mail niet versturen. Verifieer of uw gebruikersnaam correct is.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kon geen herstel e-mail versturen, omdat er geen e-mailadres bekend is bij deze gebruikersnaam. Neem contact op met uw beheerder.",
"%s password reset" : "%s wachtwoord reset",
"Use the following link to reset your password: {link}" : "Gebruik de volgende link om uw wachtwoord te resetten: {link}",
"New password" : "Nieuw wachtwoord",
diff --git a/core/l10n/oc.js b/core/l10n/oc.js
index 6c27148b497..f9fdb8bea11 100644
--- a/core/l10n/oc.js
+++ b/core/l10n/oc.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.",
"Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.",
"Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion perque i a pas cap d'adreça de corrièl per aqueste utilizaire. Contactatz vòstre administrator.",
"%s password reset" : "Reïnicializacion de vòstre senhal %s",
"Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}",
"New password" : "Senhal novèl",
diff --git a/core/l10n/oc.json b/core/l10n/oc.json
index c73667e6f1c..bd34013f9e7 100644
--- a/core/l10n/oc.json
+++ b/core/l10n/oc.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Impossible de reïnicializar lo senhal perque lo geton es pas valable.",
"Couldn't reset password because the token is expired" : "Impossible de reïnicializar lo senhal perque lo geton a expirat.",
"Couldn't send reset email. Please make sure your username is correct." : "Impossible de mandar lo corrièl de reïnicializacion. Verificatz que vòstre nom d'utilizaire es corrècte.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Impossible de mandar lo corrièl de reïnicializacion perque i a pas cap d'adreça de corrièl per aqueste utilizaire. Contactatz vòstre administrator.",
"%s password reset" : "Reïnicializacion de vòstre senhal %s",
"Use the following link to reset your password: {link}" : "Utilizatz lo ligam seguent per reïnicializar vòstre senhal : {link}",
"New password" : "Senhal novèl",
diff --git a/core/l10n/pl.js b/core/l10n/pl.js
index 972506283e9..c55b25e3956 100644
--- a/core/l10n/pl.js
+++ b/core/l10n/pl.js
@@ -143,7 +143,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Aktualizacji zakończyła się powodzeniem. Przekierowuję do ownCloud.",
"Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny",
"Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika lub adres email jest poprawny. Skontaktuj się z administratorem.",
"%s password reset" : "%s reset hasła",
"Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}",
"New password" : "Nowe hasło",
diff --git a/core/l10n/pl.json b/core/l10n/pl.json
index 05c38bdcc0f..9e1d2b8a8f3 100644
--- a/core/l10n/pl.json
+++ b/core/l10n/pl.json
@@ -141,7 +141,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Aktualizacji zakończyła się powodzeniem. Przekierowuję do ownCloud.",
"Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny",
"Couldn't send reset email. Please make sure your username is correct." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika jest poprawna.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nie mogę wysłać maila resetującego. Sprawdź czy nazwa użytkownika lub adres email jest poprawny. Skontaktuj się z administratorem.",
"%s password reset" : "%s reset hasła",
"Use the following link to reset your password: {link}" : "Użyj tego odnośnika by zresetować hasło: {link}",
"New password" : "Nowe hasło",
diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js
index fec5b66d345..23963477f55 100644
--- a/core/l10n/pt_BR.js
+++ b/core/l10n/pt_BR.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido",
"Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou",
"Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição, porque não há nenhum endereço de e-mail para este nome de usuário. Por favor, contate o administrador.",
"%s password reset" : "%s redefinir senha",
"Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}",
"New password" : "Nova senha",
diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json
index d7735132e99..966ec449947 100644
--- a/core/l10n/pt_BR.json
+++ b/core/l10n/pt_BR.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "Não foi possível redefinir a senha porque o token é inválido",
"Couldn't reset password because the token is expired" : "Não foi possível redefinir a senha porque o token expirou",
"Couldn't send reset email. Please make sure your username is correct." : "Não foi possível enviar e-mail de redefinição. Verifique se o seu nome de usuário está correto.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Não foi possível enviar e-mail de redefinição, porque não há nenhum endereço de e-mail para este nome de usuário. Por favor, contate o administrador.",
"%s password reset" : "%s redefinir senha",
"Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}",
"New password" : "Nova senha",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 53b9ab0bf77..0d28361a2c7 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -179,7 +179,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou",
"Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ocorreu um problema com o envio do e-mail, por favor contacte o administrador.",
"%s password reset" : "%s reposição da palavra-passe",
"Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}",
"New password" : "Nova palavra-chave",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 8b7d483f270..e9cf78ce9a1 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -177,7 +177,6 @@
"Couldn't reset password because the token is invalid" : "Não foi possível repor a palavra-passe porque a senha é inválida",
"Couldn't reset password because the token is expired" : "Não foi possível repor a palavra-passe porque a senha expirou",
"Couldn't send reset email. Please make sure your username is correct." : "Ocorreu um problema com o envio do e-mail, por favor confirme o seu utilizador.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ocorreu um problema com o envio do e-mail, por favor contacte o administrador.",
"%s password reset" : "%s reposição da palavra-passe",
"Use the following link to reset your password: {link}" : "Utilize a seguinte hiperligação para repor a sua palavra-passe: {link}",
"New password" : "Nova palavra-chave",
diff --git a/core/l10n/ru.js b/core/l10n/ru.js
index 39302e9a18e..90a07917555 100644
--- a/core/l10n/ru.js
+++ b/core/l10n/ru.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Невозможно сбросить пароль из-за неверного токена",
"Couldn't reset password because the token is expired" : "Не удается сбросить пароль, так как токен истек.",
"Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Невозможно отправить письмо для сброса пароля, для вашей учетной записи не указан адрес электронной почты. Пожалуйста, свяжитесь с администратором.",
"%s password reset" : "Сброс пароля %s",
"Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}",
"New password" : "Новый пароль",
diff --git a/core/l10n/ru.json b/core/l10n/ru.json
index a24ee0831a0..93b8ce53dab 100644
--- a/core/l10n/ru.json
+++ b/core/l10n/ru.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Невозможно сбросить пароль из-за неверного токена",
"Couldn't reset password because the token is expired" : "Не удается сбросить пароль, так как токен истек.",
"Couldn't send reset email. Please make sure your username is correct." : "Не удалось отправить письмо для сброса пароля. Убедитесь, что имя пользователя указано верно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Невозможно отправить письмо для сброса пароля, для вашей учетной записи не указан адрес электронной почты. Пожалуйста, свяжитесь с администратором.",
"%s password reset" : "Сброс пароля %s",
"Use the following link to reset your password: {link}" : "Используйте следующую ссылку чтобы сбросить пароль: {link}",
"New password" : "Новый пароль",
diff --git a/core/l10n/sk_SK.js b/core/l10n/sk_SK.js
index 2968a570a25..af5e6ce415a 100644
--- a/core/l10n/sk_SK.js
+++ b/core/l10n/sk_SK.js
@@ -180,7 +180,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.",
"Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.",
"Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nemožno poslať email pre obnovu hesla, pretože pre tohoto používateľa nie je uvedená žiadna emailová adresa. Prosím, obráťte sa na administrátora.",
"%s password reset" : "reset hesla %s",
"Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}",
"New password" : "Nové heslo",
diff --git a/core/l10n/sk_SK.json b/core/l10n/sk_SK.json
index 537985d28ed..77b7ea8b89b 100644
--- a/core/l10n/sk_SK.json
+++ b/core/l10n/sk_SK.json
@@ -178,7 +178,6 @@
"Couldn't reset password because the token is invalid" : "Nemožno zmeniť heslo pre neplatnosť tokenu.",
"Couldn't reset password because the token is expired" : "Nepodarilo sa obnoviť heslo, pretože platnosť tokenu uplynula.",
"Couldn't send reset email. Please make sure your username is correct." : "Nemožno poslať email pre obnovu. Uistite sa, či vkladáte správne používateľské meno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nemožno poslať email pre obnovu hesla, pretože pre tohoto používateľa nie je uvedená žiadna emailová adresa. Prosím, obráťte sa na administrátora.",
"%s password reset" : "reset hesla %s",
"Use the following link to reset your password: {link}" : "Použite nasledujúci odkaz pre obnovenie vášho hesla: {link}",
"New password" : "Nové heslo",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index 7bd286c0c9b..46580d8c4ed 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -176,7 +176,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.",
"Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.",
"Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ni mogoče poslati elektronskega sporočila za ponastavitev gesla, ker ni navedenega elektronskega naslova. Stopite v stik s skrbnikom sistema.",
"%s password reset" : "Ponastavitev gesla %s",
"Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}",
"New password" : "Novo geslo",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index a63c829ac98..ae52da630ae 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -174,7 +174,6 @@
"Couldn't reset password because the token is invalid" : "Ni mogoče ponastaviti gesla zaradi neustreznega žetona.",
"Couldn't reset password because the token is expired" : "Ne moremo ponastaviti gesla, ker je ključ potekel.",
"Couldn't send reset email. Please make sure your username is correct." : "Ni mogoče poslati elektronskega sporočila. Prepričajte se, da je uporabniško ime pravilno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Ni mogoče poslati elektronskega sporočila za ponastavitev gesla, ker ni navedenega elektronskega naslova. Stopite v stik s skrbnikom sistema.",
"%s password reset" : "Ponastavitev gesla %s",
"Use the following link to reset your password: {link}" : "Za ponastavitev gesla uporabite povezavo: {link}",
"New password" : "Novo geslo",
diff --git a/core/l10n/sq.js b/core/l10n/sq.js
index 063cc97a631..ca938ce4015 100644
--- a/core/l10n/sq.js
+++ b/core/l10n/sq.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm",
"Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar",
"Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"%s password reset" : "U ricaktua fjalëkalimi për %s",
"Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}",
"New password" : "Fjalëkalim i ri",
diff --git a/core/l10n/sq.json b/core/l10n/sq.json
index 33efaa70b4f..aeb3c1d9dd7 100644
--- a/core/l10n/sq.json
+++ b/core/l10n/sq.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i është i pavlefshëm",
"Couldn't reset password because the token is expired" : "S’u ricaktua dot fjalëkalimi, ngaqë token-i ka skaduar",
"Couldn't send reset email. Please make sure your username is correct." : "S’u dërgua dot email ricaktimi. Ju lutemi, sigurohuni që emri juaj i përdoruesit është i saktë.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "S’u dërgua dot email ricaktimi, ngaqë s’ka adresë email për këtë përdoruesi. Ju lutemi, lidhuni me përgjegjësin tuaj.",
"%s password reset" : "U ricaktua fjalëkalimi për %s",
"Use the following link to reset your password: {link}" : "Që të ricaktoni fjalëkalimin tuaj, përdorni lidhjen vijuese: {link}",
"New password" : "Fjalëkalim i ri",
diff --git a/core/l10n/sr.js b/core/l10n/sr.js
index aac106e61ad..6a918528512 100644
--- a/core/l10n/sr.js
+++ b/core/l10n/sr.js
@@ -167,7 +167,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.",
"Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не могу да пошаљем поруку за ресетовање лозинке јер за ово корисничко име нема е-адресе. Контактирајте администратора.",
"%s password reset" : "%s лозинка ресетована",
"Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}",
"New password" : "Нова лозинка",
diff --git a/core/l10n/sr.json b/core/l10n/sr.json
index c3af2764d0b..6e66b1f770e 100644
--- a/core/l10n/sr.json
+++ b/core/l10n/sr.json
@@ -165,7 +165,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Ажурирање је успело. Преусмеравам вас на оунКлауд.",
"Couldn't reset password because the token is invalid" : "Није могуће ресетовати лозинку јер je токен неважећи",
"Couldn't send reset email. Please make sure your username is correct." : "Не могу да пошаљем поруку за ресетовање лозинке. Проверите да ли је корисничко име исправно.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не могу да пошаљем поруку за ресетовање лозинке јер за ово корисничко име нема е-адресе. Контактирајте администратора.",
"%s password reset" : "%s лозинка ресетована",
"Use the following link to reset your password: {link}" : "Употребите следећу везу да ресетујете своју лозинку: {link}",
"New password" : "Нова лозинка",
diff --git a/core/l10n/sr@latin.js b/core/l10n/sr@latin.js
index 18ab8513417..6b589324a9b 100644
--- a/core/l10n/sr@latin.js
+++ b/core/l10n/sr@latin.js
@@ -138,7 +138,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspelo. Prosleđivanje na ownCloud.",
"Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja",
"Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nije bilo moguće poslati Email za ponovno postavljanje lozinke jer nema Email adrese za ovo korisničko ime. Molimo Vas da kontaktirate Vašeg administratora.",
"%s password reset" : "%s lozinka ponovo postavljena",
"Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/sr@latin.json b/core/l10n/sr@latin.json
index 47b017d5a16..44f10846fec 100644
--- a/core/l10n/sr@latin.json
+++ b/core/l10n/sr@latin.json
@@ -136,7 +136,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Ažuriranje je uspelo. Prosleđivanje na ownCloud.",
"Couldn't reset password because the token is invalid" : "Nije bilo moguće ponovo postaviti lozinku zbog nevažećeg kontrolnog broja",
"Couldn't send reset email. Please make sure your username is correct." : "Nije bilo moguće poslati Email za ponovno postavljanje. Molimo Vas da proverite da li je Vaše korisničko ime ispravno.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Nije bilo moguće poslati Email za ponovno postavljanje lozinke jer nema Email adrese za ovo korisničko ime. Molimo Vas da kontaktirate Vašeg administratora.",
"%s password reset" : "%s lozinka ponovo postavljena",
"Use the following link to reset your password: {link}" : "Koristite sledeći link za reset lozinke: {link}",
"New password" : "Nova lozinka",
diff --git a/core/l10n/sv.js b/core/l10n/sv.js
index cde3ece247a..99c106887fa 100644
--- a/core/l10n/sv.js
+++ b/core/l10n/sv.js
@@ -144,7 +144,6 @@ OC.L10N.register(
"The update was successful. Redirecting you to ownCloud now." : "Uppdateringen lyckades. Du omdirigeras nu till OwnCloud.",
"Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token",
"Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kunde inte skicka något återställningsmail därför att det inte finns någon e-mailadress kopplad till detta användarnamn. Vänligen kontakta din administratör.",
"%s password reset" : "%s återställ lösenord",
"Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}",
"New password" : "Nytt lösenord",
diff --git a/core/l10n/sv.json b/core/l10n/sv.json
index 5c0666c2011..2e0651647f5 100644
--- a/core/l10n/sv.json
+++ b/core/l10n/sv.json
@@ -142,7 +142,6 @@
"The update was successful. Redirecting you to ownCloud now." : "Uppdateringen lyckades. Du omdirigeras nu till OwnCloud.",
"Couldn't reset password because the token is invalid" : "Kunde inte återställa lösenordet på grund av felaktig token",
"Couldn't send reset email. Please make sure your username is correct." : "Kunde inte skicka återställningsmail. Vänligen kontrollera att ditt användarnamn är korrekt.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Kunde inte skicka något återställningsmail därför att det inte finns någon e-mailadress kopplad till detta användarnamn. Vänligen kontakta din administratör.",
"%s password reset" : "%s återställ lösenord",
"Use the following link to reset your password: {link}" : "Använd följande länk för att återställa lösenordet: {link}",
"New password" : "Nytt lösenord",
diff --git a/core/l10n/th_TH.js b/core/l10n/th_TH.js
index 7697ba81d7b..33816cc7075 100644
--- a/core/l10n/th_TH.js
+++ b/core/l10n/th_TH.js
@@ -191,7 +191,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง",
"Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ",
"Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่เพราะไม่มีที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบ",
"%s password reset" : "%s ตั้งรหัสผ่านใหม่",
"Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}",
"New password" : "รหัสผ่านใหม่",
diff --git a/core/l10n/th_TH.json b/core/l10n/th_TH.json
index f26ef24b99a..aa2dbc993de 100644
--- a/core/l10n/th_TH.json
+++ b/core/l10n/th_TH.json
@@ -189,7 +189,6 @@
"Couldn't reset password because the token is invalid" : "ไม่สามารถตั้งรหัสผ่านใหม่เพราะโทเค็นไม่ถูกต้อง",
"Couldn't reset password because the token is expired" : "ไม่สามารถตั้งค่ารหัสผ่านเพราะโทเค็นหมดอายุ",
"Couldn't send reset email. Please make sure your username is correct." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่ กรุณาตรวจสอบชื่อผู้ใช้ของคุณให้ถูกต้อง",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "ไม่สามารถส่งการตั้งค่าอีเมลใหม่เพราะไม่มีที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบ",
"%s password reset" : "%s ตั้งรหัสผ่านใหม่",
"Use the following link to reset your password: {link}" : "ใช้ลิงค์ต่อไปนี้เพื่อเปลี่ยนรหัสผ่านของคุณใหม่: {link}",
"New password" : "รหัสผ่านใหม่",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index 9a92eac50a7..5cef8c0a89f 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı",
"Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı",
"Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Sıfırlama e-postası, bu kullanıcı için bir e-posta adresi olmadığından gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.",
"%s password reset" : "%s parola sıfırlama",
"Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}",
"New password" : "Yeni parola",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index bb547a1a5f3..0be5d60d6d6 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "Belirteç geçersiz olduğundan parola sıfırlanamadı",
"Couldn't reset password because the token is expired" : "Jeton zaman aşımına uğradığından parola sıfırlanamadı",
"Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Sıfırlama e-postası, bu kullanıcı için bir e-posta adresi olmadığından gönderilemedi. Lütfen yöneticiniz ile iletişime geçin.",
"%s password reset" : "%s parola sıfırlama",
"Use the following link to reset your password: {link}" : "Parolanızı sıfırlamak için bu bağlantıyı kullanın: {link}",
"New password" : "Yeni parola",
diff --git a/core/l10n/uk.js b/core/l10n/uk.js
index bd1c5f679e8..1b2d0e93f7b 100644
--- a/core/l10n/uk.js
+++ b/core/l10n/uk.js
@@ -171,7 +171,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
"Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
"%s password reset" : "%s скидання паролю",
"Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}",
"New password" : "Новий пароль",
diff --git a/core/l10n/uk.json b/core/l10n/uk.json
index 4b95c4a92cd..8fc606244e2 100644
--- a/core/l10n/uk.json
+++ b/core/l10n/uk.json
@@ -169,7 +169,6 @@
"Couldn't reset password because the token is invalid" : "Неможливо скинути пароль, бо маркер є недійсним",
"Couldn't reset password because the token is expired" : "Неможливо скинути пароль, бо маркер застарів",
"Couldn't send reset email. Please make sure your username is correct." : "Не вдалося відправити скидання паролю. Будь ласка, переконайтеся, що ваше ім'я користувача є правильним.",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "Не вдалося відправити скидання паролю, тому що немає адреси електронної пошти для цього користувача. Будь ласка, зверніться до адміністратора.",
"%s password reset" : "%s скидання паролю",
"Use the following link to reset your password: {link}" : "Використовуйте наступне посилання для скидання пароля: {link}",
"New password" : "Новий пароль",
diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js
index 4beaacd347b..9c2b8beb0f6 100644
--- a/core/l10n/zh_CN.js
+++ b/core/l10n/zh_CN.js
@@ -187,7 +187,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
"Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
"Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
"%s password reset" : "重置 %s 的密码",
"Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
"New password" : "新密码",
diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json
index 65474210a20..aff40a4dc2d 100644
--- a/core/l10n/zh_CN.json
+++ b/core/l10n/zh_CN.json
@@ -185,7 +185,6 @@
"Couldn't reset password because the token is invalid" : "令牌无效,无法重置密码",
"Couldn't reset password because the token is expired" : "无法重设密码,因为令牌已过期",
"Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件,请检查您的用户名是否正确。",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "此用户名的电子邮件地址不存在导致无法发送重置邮件,请联系管理员。",
"%s password reset" : "重置 %s 的密码",
"Use the following link to reset your password: {link}" : "使用以下链接重置您的密码:{link}",
"New password" : "新密码",
diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js
index bf83a8eb3db..9aecca34103 100644
--- a/core/l10n/zh_TW.js
+++ b/core/l10n/zh_TW.js
@@ -186,7 +186,6 @@ OC.L10N.register(
"Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效",
"Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期",
"Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員",
"%s password reset" : "%s 密碼重設",
"Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}",
"New password" : "新密碼",
diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json
index 89ed5f0c086..024aa29a4d5 100644
--- a/core/l10n/zh_TW.json
+++ b/core/l10n/zh_TW.json
@@ -184,7 +184,6 @@
"Couldn't reset password because the token is invalid" : "無法重設密碼因為 token 無效",
"Couldn't reset password because the token is expired" : "無法重設密碼,因為 token 過期",
"Couldn't send reset email. Please make sure your username is correct." : "無法寄送重設 email ,請確認您的帳號輸入正確",
- "Couldn't send reset email because there is no email address for this username. Please contact your administrator." : "無法寄送重設 email ,因為這個帳號沒有設定 email 地址,請聯絡您的系統管理員",
"%s password reset" : "%s 密碼重設",
"Use the following link to reset your password: {link}" : "請至以下連結重設您的密碼: {link}",
"New password" : "新密碼",
diff --git a/lib/l10n/lt_LT.js b/lib/l10n/lt_LT.js
index c93903ff75e..f73b1fdc871 100644
--- a/lib/l10n/lt_LT.js
+++ b/lib/l10n/lt_LT.js
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Cannot write into \"config\" directory!" : "Negalima rašyti į \"config\" aplanką!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Tai gali būti ištaisyta suteikiant web serveriui rašymo teises į config aplanką",
+ "See %s" : "Žiūrėk %s",
"PHP %s or higher is required." : "Reikalinga PHP %s arba aukštesnė.",
"Help" : "Pagalba",
"Personal" : "Asmeniniai",
diff --git a/lib/l10n/lt_LT.json b/lib/l10n/lt_LT.json
index 2784c3aefc1..e9acd6f2950 100644
--- a/lib/l10n/lt_LT.json
+++ b/lib/l10n/lt_LT.json
@@ -1,6 +1,7 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "Negalima rašyti į \"config\" aplanką!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Tai gali būti ištaisyta suteikiant web serveriui rašymo teises į config aplanką",
+ "See %s" : "Žiūrėk %s",
"PHP %s or higher is required." : "Reikalinga PHP %s arba aukštesnė.",
"Help" : "Pagalba",
"Personal" : "Asmeniniai",
diff --git a/lib/private/appframework/middleware/security/corsmiddleware.php b/lib/private/appframework/middleware/security/corsmiddleware.php
index 74b0dd09974..0e37e81c5be 100644
--- a/lib/private/appframework/middleware/security/corsmiddleware.php
+++ b/lib/private/appframework/middleware/security/corsmiddleware.php
@@ -23,6 +23,7 @@
namespace OC\AppFramework\Middleware\Security;
+use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
diff --git a/lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php b/lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php
new file mode 100644
index 00000000000..54cb08f4385
--- /dev/null
+++ b/lib/private/appframework/middleware/security/exceptions/appnotenabledexception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Appframework\Middleware\Security\Exceptions;
+
+use OCP\AppFramework\Http;
+
+/**
+ * Class AppNotEnabledException is thrown when a resource for an application is
+ * requested that is not enabled.
+ *
+ * @package OC\Appframework\Middleware\Security\Exceptions
+ */
+class AppNotEnabledException extends SecurityException {
+ public function __construct() {
+ parent::__construct('App is not enabled', Http::STATUS_PRECONDITION_FAILED);
+ }
+}
diff --git a/lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php b/lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php
new file mode 100644
index 00000000000..c59c921f5eb
--- /dev/null
+++ b/lib/private/appframework/middleware/security/exceptions/crosssiterequestforgeryexception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Appframework\Middleware\Security\Exceptions;
+
+use OCP\AppFramework\Http;
+
+/**
+ * Class CrossSiteRequestForgeryException is thrown when a CSRF exception has
+ * been encountered.
+ *
+ * @package OC\Appframework\Middleware\Security\Exceptions
+ */
+class CrossSiteRequestForgeryException extends SecurityException {
+ public function __construct() {
+ parent::__construct('CSRF check failed', Http::STATUS_PRECONDITION_FAILED);
+ }
+}
diff --git a/lib/private/appframework/middleware/security/exceptions/notadminexception.php b/lib/private/appframework/middleware/security/exceptions/notadminexception.php
new file mode 100644
index 00000000000..3fa03cae896
--- /dev/null
+++ b/lib/private/appframework/middleware/security/exceptions/notadminexception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Appframework\Middleware\Security\Exceptions;
+
+use OCP\AppFramework\Http;
+
+/**
+ * Class NotAdminException is thrown when a resource has been requested by a
+ * non-admin user that is not accessible to non-admin users.
+ *
+ * @package OC\Appframework\Middleware\Security\Exceptions
+ */
+class NotAdminException extends SecurityException {
+ public function __construct() {
+ parent::__construct('Logged in user must be an admin', Http::STATUS_FORBIDDEN);
+ }
+}
diff --git a/lib/private/appframework/middleware/security/exceptions/notloggedinexception.php b/lib/private/appframework/middleware/security/exceptions/notloggedinexception.php
new file mode 100644
index 00000000000..5f27625aa52
--- /dev/null
+++ b/lib/private/appframework/middleware/security/exceptions/notloggedinexception.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @author Lukas Reschke <lukas@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Appframework\Middleware\Security\Exceptions;
+
+use OCP\AppFramework\Http;
+
+/**
+ * Class NotLoggedInException is thrown when a resource has been requested by a
+ * guest user that is not accessible to the public.
+ *
+ * @package OC\Appframework\Middleware\Security\Exceptions
+ */
+class NotLoggedInException extends SecurityException {
+ public function __construct() {
+ parent::__construct('Current user is not logged in', Http::STATUS_UNAUTHORIZED);
+ }
+}
diff --git a/lib/private/appframework/middleware/security/securityexception.php b/lib/private/appframework/middleware/security/exceptions/securityexception.php
index 6f96b9a1d80..9b99282ce86 100644
--- a/lib/private/appframework/middleware/security/securityexception.php
+++ b/lib/private/appframework/middleware/security/exceptions/securityexception.php
@@ -1,7 +1,6 @@
<?php
/**
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Lukas Reschke <lukas@owncloud.com>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @license AGPL-3.0
@@ -20,20 +19,12 @@
*
*/
-
-namespace OC\AppFramework\Middleware\Security;
-
+namespace OC\AppFramework\Middleware\Security\Exceptions;
/**
- * Thrown when the security middleware encounters a security problem
+ * Class SecurityException is the base class for security exceptions thrown by
+ * the security middleware.
+ *
+ * @package OC\AppFramework\Middleware\Security\Exceptions
*/
-class SecurityException extends \Exception {
-
- /**
- * @param string $msg the security error message
- */
- public function __construct($msg, $code = 0) {
- parent::__construct($msg, $code);
- }
-
-}
+class SecurityException extends \Exception {}
diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/appframework/middleware/security/securitymiddleware.php
index 34c626ce8be..d0b7202a360 100644
--- a/lib/private/appframework/middleware/security/securitymiddleware.php
+++ b/lib/private/appframework/middleware/security/securitymiddleware.php
@@ -28,8 +28,13 @@
namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Http;
+use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException;
+use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
+use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
+use OC\Appframework\Middleware\Security\Exceptions\NotLoggedInException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\TemplateResponse;
use OCP\AppFramework\Middleware;
use OCP\AppFramework\Http\Response;
use OCP\AppFramework\Http\JSONResponse;
@@ -39,7 +44,7 @@ use OCP\IRequest;
use OCP\ILogger;
use OCP\AppFramework\Controller;
use OCP\Util;
-
+use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
/**
* Used to do all the authentication and checking stuff for a controller method
@@ -75,7 +80,7 @@ class SecurityMiddleware extends Middleware {
ILogger $logger,
$appName,
$isLoggedIn,
- $isAdminUser){
+ $isAdminUser) {
$this->navigationManager = $navigationManager;
$this->request = $request;
$this->reflector = $reflector;
@@ -95,7 +100,7 @@ class SecurityMiddleware extends Middleware {
* @param string $methodName the name of the method
* @throws SecurityException when a security check fails
*/
- public function beforeController($controller, $methodName){
+ public function beforeController($controller, $methodName) {
// this will set the current navigation entry of the app, use this only
// for normal HTML requests and not for AJAX requests
@@ -105,12 +110,12 @@ class SecurityMiddleware extends Middleware {
$isPublicPage = $this->reflector->hasAnnotation('PublicPage');
if(!$isPublicPage) {
if(!$this->isLoggedIn) {
- throw new SecurityException('Current user is not logged in', Http::STATUS_UNAUTHORIZED);
+ throw new NotLoggedInException();
}
if(!$this->reflector->hasAnnotation('NoAdminRequired')) {
if(!$this->isAdminUser) {
- throw new SecurityException('Logged in user must be an admin', Http::STATUS_FORBIDDEN);
+ throw new NotAdminException();
}
}
}
@@ -119,18 +124,18 @@ class SecurityMiddleware extends Middleware {
Util::callRegister();
if(!$this->reflector->hasAnnotation('NoCSRFRequired')) {
if(!$this->request->passesCSRFCheck()) {
- throw new SecurityException('CSRF check failed', Http::STATUS_PRECONDITION_FAILED);
+ throw new CrossSiteRequestForgeryException();
}
}
/**
* FIXME: Use DI once available
- * Checks if app is enabled (also inclues a check whether user is allowed to access the resource)
+ * Checks if app is enabled (also includes a check whether user is allowed to access the resource)
* The getAppPath() check is here since components such as settings also use the AppFramework and
* therefore won't pass this check.
*/
if(\OC_App::getAppPath($this->appName) !== false && !\OC_App::isEnabled($this->appName)) {
- throw new SecurityException('App is not enabled', Http::STATUS_PRECONDITION_FAILED);
+ throw new AppNotEnabledException();
}
}
@@ -146,28 +151,28 @@ class SecurityMiddleware extends Middleware {
* @throws \Exception the passed in exception if it cant handle it
* @return Response a Response object or null in case that the exception could not be handled
*/
- public function afterException($controller, $methodName, \Exception $exception){
- if($exception instanceof SecurityException){
-
- if (stripos($this->request->getHeader('Accept'),'html')===false) {
+ public function afterException($controller, $methodName, \Exception $exception) {
+ if($exception instanceof SecurityException) {
+ if (stripos($this->request->getHeader('Accept'),'html') === false) {
$response = new JSONResponse(
array('message' => $exception->getMessage()),
$exception->getCode()
);
- $this->logger->debug($exception->getMessage());
} else {
-
- // TODO: replace with link to route
- $url = $this->urlGenerator->getAbsoluteURL('index.php');
- // add redirect URL to redirect to the previous page after login
- $url .= '?redirect_url=' . urlencode($this->request->server['REQUEST_URI']);
- $response = new RedirectResponse($url);
- $this->logger->debug($exception->getMessage());
+ if($exception instanceof NotLoggedInException) {
+ // TODO: replace with link to route
+ $url = $this->urlGenerator->getAbsoluteURL('index.php');
+ $url .= '?redirect_url=' . urlencode($this->request->server['REQUEST_URI']);
+ $response = new RedirectResponse($url);
+ } else {
+ $response = new TemplateResponse('core', '403', ['file' => $exception->getMessage()], 'guest');
+ $response->setStatus($exception->getCode());
+ }
}
+ $this->logger->debug($exception->getMessage());
return $response;
-
}
throw $exception;
diff --git a/lib/public/backgroundjob/ijoblist.php b/lib/public/backgroundjob/ijoblist.php
index e2dc348e54d..384f8b3d801 100644
--- a/lib/public/backgroundjob/ijoblist.php
+++ b/lib/public/backgroundjob/ijoblist.php
@@ -36,7 +36,6 @@ interface IJobList {
*
* @param \OCP\BackgroundJob\IJob|string $job
* @param mixed $argument The argument to be passed to $job->run() when the job is exectured
- * @param string $job
* @return void
* @since 7.0.0
*/
diff --git a/tests/lib/appframework/middleware/security/CORSMiddlewareTest.php b/tests/lib/appframework/middleware/security/CORSMiddlewareTest.php
index ca526fb859c..cf5f97a046f 100644
--- a/tests/lib/appframework/middleware/security/CORSMiddlewareTest.php
+++ b/tests/lib/appframework/middleware/security/CORSMiddlewareTest.php
@@ -14,7 +14,7 @@ namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Http\Request;
use OC\AppFramework\Utility\ControllerMethodReflector;
-
+use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\Response;
@@ -91,7 +91,7 @@ class CORSMiddlewareTest extends \Test\TestCase {
/**
* @CORS
- * @expectedException \OC\AppFramework\Middleware\Security\SecurityException
+ * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\SecurityException
*/
public function testCorsIgnoredIfWithCredentialsHeaderPresent() {
$request = new Request(
@@ -160,7 +160,7 @@ class CORSMiddlewareTest extends \Test\TestCase {
/**
* @CORS
- * @expectedException \OC\AppFramework\Middleware\Security\SecurityException
+ * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\SecurityException
*/
public function testCORSShouldNotAllowCookieAuth() {
$request = new Request(
diff --git a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
index 347a0423ea6..62223bbc2d9 100644
--- a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
+++ b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
@@ -1,34 +1,40 @@
<?php
-
/**
- * ownCloud - App Framework
+ * @author Bernhard Posselt <dev@bernhard-posselt.com>
+ * @author Lukas Reschke <lukas@owncloud.com>
*
- * @author Bernhard Posselt
- * @copyright 2012 Bernhard Posselt <dev@bernhard-posselt.com>
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or any later version.
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
*
- * This library is distributed in the hope that it will be useful,
+ * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
*
- * You should have received a copy of the GNU Affero General Public
- * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
+
namespace OC\AppFramework\Middleware\Security;
use OC\AppFramework\Http;
use OC\AppFramework\Http\Request;
+use OC\Appframework\Middleware\Security\Exceptions\AppNotEnabledException;
+use OC\Appframework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException;
+use OC\Appframework\Middleware\Security\Exceptions\NotAdminException;
+use OC\Appframework\Middleware\Security\Exceptions\NotLoggedInException;
+use OC\AppFramework\Middleware\Security\Exceptions\SecurityException;
use OC\AppFramework\Utility\ControllerMethodReflector;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\JSONResponse;
+use OCP\AppFramework\Http\TemplateResponse;
class SecurityMiddlewareTest extends \Test\TestCase {
@@ -71,8 +77,12 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$this->secAjaxException = new SecurityException('hey', true);
}
-
- private function getMiddleware($isLoggedIn, $isAdminUser){
+ /**
+ * @param bool $isLoggedIn
+ * @param bool $isAdminUser
+ * @return SecurityMiddleware
+ */
+ private function getMiddleware($isLoggedIn, $isAdminUser) {
return new SecurityMiddleware(
$this->request,
$this->reader,
@@ -219,8 +229,8 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$sec = $this->getMiddleware($isLoggedIn, $isAdminUser);
- if($shouldFail){
- $this->setExpectedException('\OC\AppFramework\Middleware\Security\SecurityException');
+ if($shouldFail) {
+ $this->setExpectedException('\OC\AppFramework\Middleware\Security\Exceptions\SecurityException');
} else {
$this->assertTrue(true);
}
@@ -232,7 +242,7 @@ class SecurityMiddlewareTest extends \Test\TestCase {
/**
* @PublicPage
- * @expectedException \OC\AppFramework\Middleware\Security\SecurityException
+ * @expectedException \OC\AppFramework\Middleware\Security\Exceptions\CrossSiteRequestForgeryException
*/
public function testCsrfCheck(){
$this->request->expects($this->once())
@@ -311,25 +321,85 @@ class SecurityMiddlewareTest extends \Test\TestCase {
$this->middleware->afterException($this->controller, 'test', $ex);
}
-
- public function testAfterExceptionReturnsRedirect(){
+ public function testAfterExceptionReturnsRedirectForNotLoggedInUser() {
$this->request = new Request(
- [
- 'server' =>
[
- 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'REQUEST_URI' => 'owncloud/index.php/apps/specialapp'
- ]
+ 'server' =>
+ [
+ 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'REQUEST_URI' => 'owncloud/index.php/apps/specialapp'
+ ]
+ ],
+ $this->getMock('\OCP\Security\ISecureRandom'),
+ $this->getMock('\OCP\IConfig')
+ );
+ $this->middleware = $this->getMiddleware(false, false);
+ $this->urlGenerator
+ ->expects($this->once())
+ ->method('getAbsoluteURL')
+ ->with('index.php')
+ ->will($this->returnValue('http://localhost/index.php'));
+ $this->logger
+ ->expects($this->once())
+ ->method('debug')
+ ->with('Current user is not logged in');
+ $response = $this->middleware->afterException(
+ $this->controller,
+ 'test',
+ new NotLoggedInException()
+ );
+
+ $expected = new RedirectResponse('http://localhost/index.php?redirect_url=owncloud%2Findex.php%2Fapps%2Fspecialapp');
+ $this->assertEquals($expected , $response);
+ }
+
+ /**
+ * @return array
+ */
+ public function exceptionProvider() {
+ return [
+ [
+ new AppNotEnabledException(),
+ ],
+ [
+ new CrossSiteRequestForgeryException(),
],
- $this->getMock('\OCP\Security\ISecureRandom'),
- $this->getMock('\OCP\IConfig')
+ [
+ new NotAdminException(),
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider exceptionProvider
+ * @param SecurityException $exception
+ */
+ public function testAfterExceptionReturnsTemplateResponse(SecurityException $exception) {
+ $this->request = new Request(
+ [
+ 'server' =>
+ [
+ 'HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+ 'REQUEST_URI' => 'owncloud/index.php/apps/specialapp'
+ ]
+ ],
+ $this->getMock('\OCP\Security\ISecureRandom'),
+ $this->getMock('\OCP\IConfig')
+ );
+ $this->middleware = $this->getMiddleware(false, false);
+ $this->logger
+ ->expects($this->once())
+ ->method('debug')
+ ->with($exception->getMessage());
+ $response = $this->middleware->afterException(
+ $this->controller,
+ 'test',
+ $exception
);
- $this->middleware = $this->getMiddleware(true, true);
- $response = $this->middleware->afterException($this->controller, 'test',
- $this->secException);
- $this->assertTrue($response instanceof RedirectResponse);
- $this->assertEquals('?redirect_url=owncloud%2Findex.php%2Fapps%2Fspecialapp', $response->getRedirectURL());
+ $expected = new TemplateResponse('core', '403', ['file' => $exception->getMessage()], 'guest');
+ $expected->setStatus($exception->getCode());
+ $this->assertEquals($expected , $response);
}