summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/appinfo/info.xml3
-rw-r--r--apps/dav/appinfo/update.php26
-rw-r--r--apps/dav/lib/AppInfo/Application.php25
-rw-r--r--apps/dav/lib/Migration/GenerateBirthdays.php70
-rw-r--r--apps/files_external/lib/Lib/Storage/Dropbox.php5
-rw-r--r--apps/files_sharing/lib/External/Storage.php11
-rw-r--r--apps/files_sharing/lib/External/Watcher.php (renamed from apps/dav/appinfo/install.php)17
-rw-r--r--build/integration/features/bootstrap/WebDav.php50
-rw-r--r--build/integration/features/favorites.feature42
-rw-r--r--core/css/styles.css26
-rw-r--r--core/js/setup.js3
-rw-r--r--lib/private/App/AppManager.php2
-rw-r--r--ocs/v1.php2
13 files changed, 219 insertions, 63 deletions
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index 26e37e6bb86..df147a032fe 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -24,5 +24,8 @@
<post-migration>
<job>OCA\DAV\Migration\Classification</job>
</post-migration>
+ <live-migration>
+ <job>OCA\DAV\Migration\GenerateBirthdays</job>
+ </live-migration>
</repair-steps>
</info>
diff --git a/apps/dav/appinfo/update.php b/apps/dav/appinfo/update.php
deleted file mode 100644
index d2ee06cc9fe..00000000000
--- a/apps/dav/appinfo/update.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, 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/>
- *
- */
-
-use OCA\DAV\AppInfo\Application;
-
-$app = new Application();
-$app->generateBirthdays();
diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php
index 9e0d2da4e17..de2056ebc35 100644
--- a/apps/dav/lib/AppInfo/Application.php
+++ b/apps/dav/lib/AppInfo/Application.php
@@ -32,6 +32,7 @@ use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\GroupPrincipalBackend;
use OCA\DAV\HookManager;
use OCA\DAV\Migration\Classification;
+use OCA\DAV\Migration\GenerateBirthdays;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
use OCP\Contacts\IManager;
@@ -116,6 +117,16 @@ class Application extends App {
$c->getServer()->getUserManager()
);
});
+
+ $container->registerService('OCA\DAV\Migration\GenerateBirthdays', function ($c) {
+ /** @var IAppContainer $c */
+ /** @var BirthdayService $b */
+ $b = $c->query('BirthdayService');
+ return new GenerateBirthdays(
+ $b,
+ $c->getServer()->getUserManager()
+ );
+ });
}
/**
@@ -164,18 +175,4 @@ class Application extends App {
return $this->getContainer()->query('SyncService');
}
- public function generateBirthdays() {
- try {
- /** @var BirthdayService $migration */
- $migration = $this->getContainer()->query('BirthdayService');
- $userManager = $this->getContainer()->getServer()->getUserManager();
-
- $userManager->callForAllUsers(function($user) use($migration) {
- /** @var IUser $user */
- $migration->syncUser($user->getUID());
- });
- } catch (\Exception $ex) {
- $this->getContainer()->getServer()->getLogger()->logException($ex);
- }
- }
}
diff --git a/apps/dav/lib/Migration/GenerateBirthdays.php b/apps/dav/lib/Migration/GenerateBirthdays.php
new file mode 100644
index 00000000000..dfc8838bcbb
--- /dev/null
+++ b/apps/dav/lib/Migration/GenerateBirthdays.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @copyright Copyright (c) 2016, 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\DAV\Migration;
+
+use OCA\DAV\CalDAV\BirthdayService;
+use OCP\IUser;
+use OCP\IUserManager;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+class GenerateBirthdays implements IRepairStep {
+
+ /** @var BirthdayService */
+ private $birthdayService;
+
+ /** @var IUserManager */
+ private $userManager;
+
+ /**
+ * GenerateBirthdays constructor.
+ *
+ * @param BirthdayService $birthdayService
+ * @param IUserManager $userManager
+ */
+ public function __construct(BirthdayService $birthdayService, IUserManager $userManager) {
+ $this->birthdayService = $birthdayService;
+ $this->userManager = $userManager;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getName() {
+ return 'Regenerate birthday calendar for all users';
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function run(IOutput $output) {
+
+ $output->startProgress();
+ $this->userManager->callForAllUsers(function($user) use ($output) {
+ /** @var IUser $user */
+ $output->advance(1, $user->getDisplayName());
+ $this->birthdayService->syncUser($user->getUID());
+ });
+ $output->finishProgress();
+ }
+}
diff --git a/apps/files_external/lib/Lib/Storage/Dropbox.php b/apps/files_external/lib/Lib/Storage/Dropbox.php
index f15cbba0469..f0f62f9f35a 100644
--- a/apps/files_external/lib/Lib/Storage/Dropbox.php
+++ b/apps/files_external/lib/Lib/Storage/Dropbox.php
@@ -32,6 +32,7 @@ namespace OCA\Files_External\Lib\Storage;
use GuzzleHttp\Exception\RequestException;
use Icewind\Streams\IteratorDirectory;
use Icewind\Streams\RetryWrapper;
+use OCP\Files\StorageNotAvailableException;
require_once __DIR__ . '/../../../3rdparty/Dropbox/autoload.php';
@@ -94,6 +95,8 @@ class Dropbox extends \OC\Files\Storage\Common {
if ($list) {
try {
$response = $this->dropbox->getMetaData($path);
+ } catch (\Dropbox_Exception_Forbidden $e) {
+ throw new StorageNotAvailableException('Dropbox API rate limit exceeded', StorageNotAvailableException::STATUS_ERROR, $e);
} catch (\Exception $exception) {
\OCP\Util::writeLog('files_external', $exception->getMessage(), \OCP\Util::ERROR);
return false;
@@ -127,6 +130,8 @@ class Dropbox extends \OC\Files\Storage\Common {
return $response;
}
return null;
+ } catch (\Dropbox_Exception_Forbidden $e) {
+ throw new StorageNotAvailableException('Dropbox API rate limit exceeded', StorageNotAvailableException::STATUS_ERROR, $e);
} catch (\Exception $exception) {
if ($exception instanceof \Dropbox_Exception_NotFound) {
// don't log, might be a file_exist check
diff --git a/apps/files_sharing/lib/External/Storage.php b/apps/files_sharing/lib/External/Storage.php
index a12b9597dbd..ca99393a1e0 100644
--- a/apps/files_sharing/lib/External/Storage.php
+++ b/apps/files_sharing/lib/External/Storage.php
@@ -89,8 +89,17 @@ class Storage extends DAV implements ISharedStorage {
'user' => $options['token'],
'password' => (string)$options['password']
));
+ }
- $this->getWatcher()->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE);
+ public function getWatcher($path = '', $storage = null) {
+ if (!$storage) {
+ $storage = $this;
+ }
+ if (!isset($this->watcher)) {
+ $this->watcher = new Watcher($storage);
+ $this->watcher->setPolicy(\OC\Files\Cache\Watcher::CHECK_ONCE);
+ }
+ return $this->watcher;
}
public function getRemoteUser() {
diff --git a/apps/dav/appinfo/install.php b/apps/files_sharing/lib/External/Watcher.php
index d2ee06cc9fe..6be35bdeb3b 100644
--- a/apps/dav/appinfo/install.php
+++ b/apps/files_sharing/lib/External/Watcher.php
@@ -1,7 +1,6 @@
<?php
/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @author Robin Appelman <icewind@owncloud.com>
*
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @license AGPL-3.0
@@ -20,7 +19,15 @@
*
*/
-use OCA\DAV\AppInfo\Application;
+namespace OCA\Files_Sharing\External;
-$app = new Application();
-$app->generateBirthdays();
+class Watcher extends \OC\Files\Cache\Watcher {
+ /**
+ * remove deleted files in $path from the cache
+ *
+ * @param string $path
+ */
+ public function cleanFolder($path) {
+ // not needed, the scanner takes care of this
+ }
+}
diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php
index cd9584ad186..0abb8667739 100644
--- a/build/integration/features/bootstrap/WebDav.php
+++ b/build/integration/features/bootstrap/WebDav.php
@@ -214,7 +214,7 @@ trait WebDav {
}
$value = $keys[$key];
- if ($value !== $expectedValue) {
+ if ($value != $expectedValue) {
throw new \Exception("Property \"$key\" found with value \"$value\", expected \"$expectedValue\"");
}
}
@@ -434,5 +434,51 @@ trait WebDav {
$this->response = $ex->getResponse();
}
}
-}
+ /**
+ * @When user :user favorites element :path
+ */
+ public function userFavoritesElement($user, $path){
+ $this->response = $this->changeFavStateOfAnElement($user, $path, 1, 0, null);
+ }
+
+ /**
+ * @When user :user unfavorites element :path
+ */
+ public function userUnfavoritesElement($user, $path){
+ $this->response = $this->changeFavStateOfAnElement($user, $path, 0, 0, null);
+ }
+
+ /*Set the elements of a proppatch, $folderDepth requires 1 to see elements without children*/
+ public function changeFavStateOfAnElement($user, $path, $favOrUnfav, $folderDepth, $properties = null){
+ $fullUrl = substr($this->baseUrl, 0, -4);
+ $settings = array(
+ 'baseUri' => $fullUrl,
+ 'userName' => $user,
+ );
+ if ($user === 'admin') {
+ $settings['password'] = $this->adminUser[1];
+ } else {
+ $settings['password'] = $this->regularUser;
+ }
+ $client = new SClient($settings);
+ if (!$properties) {
+ $properties = [
+ '{http://owncloud.org/ns}favorite' => $favOrUnfav
+ ];
+ }
+
+ $response = $client->proppatch($this->davPath . '/' . ltrim($path, '/'), $properties, $folderDepth);
+ return $response;
+ }
+
+ /**
+ * @Then /^as "([^"]*)" gets properties of file "([^"]*)" with$/
+ * @param string $user
+ * @param string $path
+ * @param \Behat\Gherkin\Node\TableNode|null $propertiesTable
+ */
+ public function asGetsPropertiesOfFileWith($user, $path, $propertiesTable) {
+ $this->asGetsPropertiesOfFolderWith($user, $path, $propertiesTable);
+ }
+}
diff --git a/build/integration/features/favorites.feature b/build/integration/features/favorites.feature
new file mode 100644
index 00000000000..86643fdd1e2
--- /dev/null
+++ b/build/integration/features/favorites.feature
@@ -0,0 +1,42 @@
+Feature: favorite
+ Background:
+ Given using api version "1"
+
+ Scenario: Favorite a folder
+ Given using dav path "remote.php/webdav"
+ And As an "admin"
+ And user "user0" exists
+ When user "user0" favorites element "/FOLDER"
+ Then as "user0" gets properties of folder "/FOLDER" with
+ |{http://owncloud.org/ns}favorite|
+ And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1"
+
+ Scenario: Favorite and unfavorite a folder
+ Given using dav path "remote.php/webdav"
+ And As an "admin"
+ And user "user0" exists
+ When user "user0" favorites element "/FOLDER"
+ And user "user0" unfavorites element "/FOLDER"
+ Then as "user0" gets properties of folder "/FOLDER" with
+ |{http://owncloud.org/ns}favorite|
+ And the single response should contain a property "{http://owncloud.org/ns}favorite" with value ""
+
+ Scenario: Favorite a file
+ Given using dav path "remote.php/webdav"
+ And As an "admin"
+ And user "user0" exists
+ When user "user0" favorites element "/textfile0.txt"
+ Then as "user0" gets properties of file "/textfile0.txt" with
+ |{http://owncloud.org/ns}favorite|
+ And the single response should contain a property "{http://owncloud.org/ns}favorite" with value "1"
+
+ Scenario: Favorite and unfavorite a file
+ Given using dav path "remote.php/webdav"
+ And As an "admin"
+ And user "user0" exists
+ When user "user0" favorites element "/textfile0.txt"
+ And user "user0" unfavorites element "/textfile0.txt"
+ Then as "user0" gets properties of file "/textfile0.txt" with
+ |{http://owncloud.org/ns}favorite|
+ And the single response should contain a property "{http://owncloud.org/ns}favorite" with value ""
+
diff --git a/core/css/styles.css b/core/css/styles.css
index 0d7a5576e0c..32d4deb79e3 100644
--- a/core/css/styles.css
+++ b/core/css/styles.css
@@ -374,26 +374,26 @@ a.two-factor-cancel {
}
#body-login .grouptop input,
.grouptop input {
- margin-bottom: 0;
- border-bottom: 0;
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
+ margin-bottom: 0 !important;
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
}
#body-login .groupmiddle input,
.groupmiddle input {
- margin-top: 0;
- margin-bottom: 0;
- border-top: 0;
- border-bottom: 0;
- border-radius: 0;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+ border-top: 0 !important;
+ border-bottom: 0 !important;
+ border-radius: 0 !important;
box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important;
}
#body-login .groupbottom input,
.groupbottom input {
- margin-top: 0;
- border-top: 0;
- border-top-right-radius: 0;
- border-top-left-radius: 0;
+ margin-top: 0 !important;
+ border-top: 0 !important;
+ border-top-right-radius: 0 !important;
+ border-top-left-radius: 0 !important;
box-shadow: 0 1px 0 rgba(0,0,0,.1) inset !important;
}
#body-login .groupbottom input[type=submit] {
diff --git a/core/js/setup.js b/core/js/setup.js
index cb299597451..636e41fddea 100644
--- a/core/js/setup.js
+++ b/core/js/setup.js
@@ -43,7 +43,8 @@ $(document).ready(function() {
$('input[checked]').trigger('click');
- $('#showAdvanced').click(function() {
+ $('#showAdvanced').click(function(e) {
+ e.preventDefault();
$('#datadirContent').slideToggle(250);
$('#databaseBackend').slideToggle(250);
$('#databaseField').slideToggle(250);
diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php
index 475ecba2b8e..636f43c8c57 100644
--- a/lib/private/App/AppManager.php
+++ b/lib/private/App/AppManager.php
@@ -257,7 +257,7 @@ class AppManager implements IAppManager {
}
unset($this->installedAppsCache[$appId]);
$this->appConfig->setValue($appId, 'enabled', 'no');
- $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_ENABLE, new ManagerEvent(
+ $this->dispatcher->dispatch(ManagerEvent::EVENT_APP_DISABLE, new ManagerEvent(
ManagerEvent::EVENT_APP_DISABLE, $appId
));
$this->clearAppsCache();
diff --git a/ocs/v1.php b/ocs/v1.php
index 9a09efc1de9..bbc2adf39b6 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -43,6 +43,8 @@ use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
try {
+ OC_App::loadApps(['session']);
+ OC_App::loadApps(['authentication']);
// load all apps to get all api routes properly setup
OC_App::loadApps();