aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/admin_audit/appinfo/info.xml16
-rw-r--r--apps/comments/appinfo/info.xml17
-rw-r--r--apps/comments/lib/Activity/Listener.php7
-rw-r--r--apps/comments/lib/EventHandler.php1
-rw-r--r--apps/comments/tests/Unit/Activity/ListenerTest.php187
-rw-r--r--apps/dav/appinfo/info.xml37
-rw-r--r--apps/dav/l10n/hu.js1
-rw-r--r--apps/dav/l10n/hu.json1
-rw-r--r--apps/dav/l10n/ru.js1
-rw-r--r--apps/dav/l10n/ru.json1
-rw-r--r--apps/dav/l10n/sv.js4
-rw-r--r--apps/dav/l10n/sv.json4
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php2
-rw-r--r--apps/dav/lib/CalDAV/Plugin.php2
-rw-r--r--apps/dav/lib/CalDAV/Principal/Collection.php1
-rw-r--r--apps/dav/lib/CalDAV/Schedule/IMipPlugin.php1
-rw-r--r--apps/dav/lib/CardDAV/CardDavBackend.php1
-rw-r--r--apps/dav/lib/CardDAV/ImageExportPlugin.php1
-rw-r--r--apps/dav/lib/CardDAV/Plugin.php1
-rw-r--r--apps/dav/lib/Connector/LegacyDAVACL.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/ObjectTree.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/Principal.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/QuotaPlugin.php3
-rw-r--r--apps/dav/lib/Connector/Sabre/ServerFactory.php1
-rw-r--r--apps/dav/lib/DAV/SystemPrincipalBackend.php1
-rw-r--r--apps/dav/lib/Files/FilesHome.php1
-rw-r--r--apps/dav/lib/Files/RootCollection.php1
-rw-r--r--apps/dav/lib/Server.php2
-rw-r--r--apps/dav/lib/Upload/ChunkingPlugin.php2
-rw-r--r--apps/dav/tests/unit/ServerTest.php2
-rw-r--r--apps/encryption/appinfo/info.xml40
-rw-r--r--apps/encryption/l10n/es.js8
-rw-r--r--apps/encryption/l10n/es.json8
-rw-r--r--apps/encryption/l10n/pt_PT.js7
-rw-r--r--apps/encryption/l10n/pt_PT.json7
-rw-r--r--apps/encryption/lib/AppInfo/Application.php1
-rw-r--r--apps/encryption/lib/Hooks/UserHooks.php1
-rw-r--r--apps/federatedfilesharing/appinfo/info.xml14
-rw-r--r--apps/federatedfilesharing/l10n/hu.js1
-rw-r--r--apps/federatedfilesharing/l10n/hu.json1
-rw-r--r--apps/federatedfilesharing/l10n/ja.js1
-rw-r--r--apps/federatedfilesharing/l10n/ja.json1
-rw-r--r--apps/federatedfilesharing/l10n/lv.js2
-rw-r--r--apps/federatedfilesharing/l10n/lv.json2
-rw-r--r--apps/federatedfilesharing/l10n/nl.js1
-rw-r--r--apps/federatedfilesharing/l10n/nl.json1
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.js41
-rw-r--r--apps/federatedfilesharing/l10n/pt_PT.json41
-rw-r--r--apps/federatedfilesharing/l10n/ru.js1
-rw-r--r--apps/federatedfilesharing/l10n/ru.json1
-rw-r--r--apps/federatedfilesharing/l10n/sk.js1
-rw-r--r--apps/federatedfilesharing/l10n/sk.json1
-rw-r--r--apps/federatedfilesharing/l10n/sv.js1
-rw-r--r--apps/federatedfilesharing/l10n/sv.json1
-rw-r--r--apps/federation/appinfo/info.xml27
-rw-r--r--apps/federation/l10n/hu.js1
-rw-r--r--apps/federation/l10n/hu.json1
-rw-r--r--apps/federation/l10n/nl.js1
-rw-r--r--apps/federation/l10n/nl.json1
-rw-r--r--apps/federation/l10n/ru.js1
-rw-r--r--apps/federation/l10n/ru.json1
-rw-r--r--apps/federation/l10n/sk.js1
-rw-r--r--apps/federation/l10n/sk.json1
-rw-r--r--apps/federation/l10n/sv.js1
-rw-r--r--apps/federation/l10n/sv.json1
-rw-r--r--apps/federation/lib/BackgroundJob/GetSharedSecret.php1
-rw-r--r--apps/federation/lib/BackgroundJob/RequestSharedSecret.php1
-rw-r--r--apps/federation/lib/SyncJob.php1
-rw-r--r--apps/files/appinfo/info.xml50
-rw-r--r--apps/files/download.php4
-rw-r--r--apps/files/img/change.pngbin594 -> 560 bytes
-rw-r--r--apps/files/img/change.svg2
-rw-r--r--apps/files/js/fileactions.js17
-rw-r--r--apps/files/js/filelist.js34
-rw-r--r--apps/files/l10n/es.js4
-rw-r--r--apps/files/l10n/es.json4
-rw-r--r--apps/files/l10n/ja.js14
-rw-r--r--apps/files/l10n/ja.json14
-rw-r--r--apps/files/l10n/lt_LT.js1
-rw-r--r--apps/files/l10n/lt_LT.json1
-rw-r--r--apps/files/l10n/lv.js2
-rw-r--r--apps/files/l10n/lv.json2
-rw-r--r--apps/files/l10n/nl.js5
-rw-r--r--apps/files/l10n/nl.json5
-rw-r--r--apps/files/l10n/pt_PT.js2
-rw-r--r--apps/files/l10n/pt_PT.json2
-rw-r--r--apps/files/l10n/ru.js2
-rw-r--r--apps/files/l10n/ru.json2
-rw-r--r--apps/files/l10n/sk.js8
-rw-r--r--apps/files/l10n/sk.json8
-rw-r--r--apps/files/l10n/sv.js3
-rw-r--r--apps/files/l10n/sv.json3
-rw-r--r--apps/files/l10n/zh_CN.js7
-rw-r--r--apps/files/l10n/zh_CN.json7
-rw-r--r--apps/files/templates/list.php2
-rw-r--r--apps/files/tests/js/fileactionsmenuSpec.js3
-rw-r--r--apps/files/tests/js/filelistSpec.js9
-rw-r--r--apps/files_external/appinfo/info.xml35
-rw-r--r--apps/files_external/js/settings.js1
-rw-r--r--apps/files_external/l10n/ast.js1
-rw-r--r--apps/files_external/l10n/ast.json1
-rw-r--r--apps/files_external/l10n/hu.js1
-rw-r--r--apps/files_external/l10n/hu.json1
-rw-r--r--apps/files_external/l10n/ja.js12
-rw-r--r--apps/files_external/l10n/ja.json12
-rw-r--r--apps/files_external/l10n/nl.js7
-rw-r--r--apps/files_external/l10n/nl.json7
-rw-r--r--apps/files_external/l10n/pt_PT.js27
-rw-r--r--apps/files_external/l10n/pt_PT.json27
-rw-r--r--apps/files_external/l10n/ru.js8
-rw-r--r--apps/files_external/l10n/ru.json8
-rw-r--r--apps/files_external/lib/AppInfo/Application.php7
-rw-r--r--apps/files_external/lib/Config/ConfigAdapter.php2
-rw-r--r--apps/files_external/lib/Controller/AjaxController.php2
-rw-r--r--apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV2.php (renamed from apps/files_external/lib/Lib/Auth/OpenStack/OpenStack.php)4
-rw-r--r--apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV3.php49
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php1
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php3
-rw-r--r--apps/files_external/lib/Lib/Auth/Password/UserProvided.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/AmazonS3.php4
-rw-r--r--apps/files_external/lib/Lib/Backend/DAV.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/FTP.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/LegacyBackend.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/Local.php1
-rw-r--r--apps/files_external/lib/Lib/Backend/OwnCloud.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/SFTP_Key.php3
-rw-r--r--apps/files_external/lib/Lib/Backend/SMB.php2
-rw-r--r--apps/files_external/lib/Lib/Backend/SMB_OC.php2
-rw-r--r--apps/files_external/lib/Lib/Backend/Swift.php5
-rw-r--r--apps/files_external/lib/Lib/DependencyTrait.php2
-rw-r--r--apps/files_external/lib/Lib/FrontendDefinitionTrait.php2
-rw-r--r--apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php1
-rw-r--r--apps/files_external/lib/Lib/PersonalMount.php4
-rw-r--r--apps/files_external/lib/Lib/SessionStorageWrapper.php1
-rw-r--r--apps/files_external/lib/Lib/Storage/AmazonS3.php11
-rw-r--r--apps/files_external/lib/Lib/Storage/Swift.php263
-rw-r--r--apps/files_external/lib/Lib/StorageModifierTrait.php2
-rw-r--r--apps/files_external/lib/Migration/StorageMigrator.php1
-rw-r--r--apps/files_external/lib/Service/UserStoragesService.php2
-rw-r--r--apps/files_external/lib/Settings/Personal.php1
-rw-r--r--apps/files_external/templates/list.php3
-rw-r--r--apps/files_external/templates/settings.php5
-rw-r--r--apps/files_external/tests/Storage/SwiftTest.php16
-rw-r--r--apps/files_sharing/appinfo/info.xml52
-rw-r--r--apps/files_sharing/js/share.js4
-rw-r--r--apps/files_sharing/l10n/hu.js1
-rw-r--r--apps/files_sharing/l10n/hu.json1
-rw-r--r--apps/files_sharing/l10n/ja.js4
-rw-r--r--apps/files_sharing/l10n/ja.json4
-rw-r--r--apps/files_sharing/l10n/lv.js8
-rw-r--r--apps/files_sharing/l10n/lv.json8
-rw-r--r--apps/files_sharing/l10n/nl.js4
-rw-r--r--apps/files_sharing/l10n/nl.json4
-rw-r--r--apps/files_sharing/l10n/pt_PT.js4
-rw-r--r--apps/files_sharing/l10n/pt_PT.json4
-rw-r--r--apps/files_sharing/l10n/ru.js18
-rw-r--r--apps/files_sharing/l10n/ru.json18
-rw-r--r--apps/files_sharing/l10n/zh_CN.js6
-rw-r--r--apps/files_sharing/l10n/zh_CN.json6
-rw-r--r--apps/files_sharing/lib/Controller/ShareController.php1
-rw-r--r--apps/files_sharing/lib/Controller/ShareInfoController.php1
-rw-r--r--apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php1
-rw-r--r--apps/files_trashbin/appinfo/info.xml18
-rw-r--r--apps/files_versions/appinfo/info.xml26
-rw-r--r--apps/files_versions/download.php4
-rw-r--r--apps/files_versions/l10n/fa.js5
-rw-r--r--apps/files_versions/l10n/fa.json5
-rw-r--r--apps/lookup_server_connector/appinfo/info.xml18
-rw-r--r--apps/oauth2/appinfo/info.xml9
-rw-r--r--apps/oauth2/l10n/ast.js1
-rw-r--r--apps/oauth2/l10n/ast.json1
-rw-r--r--apps/oauth2/l10n/hu.js1
-rw-r--r--apps/oauth2/l10n/hu.json1
-rw-r--r--apps/oauth2/l10n/pt_PT.js14
-rw-r--r--apps/oauth2/l10n/pt_PT.json12
-rw-r--r--apps/oauth2/l10n/ru.js1
-rw-r--r--apps/oauth2/l10n/ru.json1
-rw-r--r--apps/oauth2/l10n/sv.js1
-rw-r--r--apps/oauth2/l10n/sv.json1
-rw-r--r--apps/provisioning_api/appinfo/info.xml20
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php12
-rw-r--r--apps/sharebymail/appinfo/info.xml51
-rw-r--r--apps/sharebymail/l10n/fr.js16
-rw-r--r--apps/sharebymail/l10n/fr.json16
-rw-r--r--apps/sharebymail/lib/ShareByMailProvider.php4
-rw-r--r--apps/sharebymail/templates/settings-admin.php1
-rw-r--r--apps/systemtags/appinfo/info.xml19
-rw-r--r--apps/systemtags/l10n/lv.js8
-rw-r--r--apps/systemtags/l10n/lv.json8
-rw-r--r--apps/systemtags/l10n/nl.js14
-rw-r--r--apps/systemtags/l10n/nl.json14
-rw-r--r--apps/systemtags/l10n/sk.js58
-rw-r--r--apps/systemtags/l10n/sk.json56
-rw-r--r--apps/systemtags/lib/Activity/Listener.php6
-rw-r--r--apps/testing/appinfo/info.xml18
-rw-r--r--apps/theming/appinfo/info.xml20
-rw-r--r--apps/theming/l10n/ar.js3
-rw-r--r--apps/theming/l10n/ar.json3
-rw-r--r--apps/theming/l10n/ast.js2
-rw-r--r--apps/theming/l10n/ast.json2
-rw-r--r--apps/theming/l10n/lv.js2
-rw-r--r--apps/theming/l10n/lv.json2
-rw-r--r--apps/theming/l10n/nl.js2
-rw-r--r--apps/theming/l10n/nl.json2
-rw-r--r--apps/theming/l10n/pt_PT.js39
-rw-r--r--apps/theming/l10n/pt_PT.json37
-rw-r--r--apps/theming/lib/Controller/ThemingController.php15
-rw-r--r--apps/theming/lib/Util.php1
-rw-r--r--apps/theming/tests/Controller/ThemingControllerTest.php26
-rw-r--r--apps/twofactor_backupcodes/appinfo/info.xml23
-rw-r--r--apps/twofactor_backupcodes/l10n/es.js2
-rw-r--r--apps/twofactor_backupcodes/l10n/es.json2
-rw-r--r--apps/twofactor_backupcodes/l10n/hu.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/hu.json1
-rw-r--r--apps/twofactor_backupcodes/l10n/nb.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/nb.json1
-rw-r--r--apps/twofactor_backupcodes/l10n/nl.js1
-rw-r--r--apps/twofactor_backupcodes/l10n/nl.json1
-rw-r--r--apps/updatenotification/Makefile47
-rw-r--r--apps/updatenotification/appinfo/info.xml10
-rw-r--r--apps/updatenotification/css/admin.css1
-rw-r--r--apps/updatenotification/js-src/app.js53
-rw-r--r--apps/updatenotification/js-src/components/root.vue180
-rw-r--r--apps/updatenotification/js-src/init.js31
-rw-r--r--apps/updatenotification/js-src/webpack.config.js56
-rw-r--r--apps/updatenotification/js/admin.js84
-rw-r--r--apps/updatenotification/js/legacy-notification.js (renamed from apps/updatenotification/js/notification.js)2
-rw-r--r--apps/updatenotification/l10n/es.js6
-rw-r--r--apps/updatenotification/l10n/es.json6
-rw-r--r--apps/updatenotification/l10n/hu.js1
-rw-r--r--apps/updatenotification/l10n/hu.json1
-rw-r--r--apps/updatenotification/l10n/nl.js1
-rw-r--r--apps/updatenotification/l10n/nl.json1
-rw-r--r--apps/updatenotification/l10n/ru.js7
-rw-r--r--apps/updatenotification/l10n/ru.json7
-rw-r--r--apps/updatenotification/l10n/sk.js3
-rw-r--r--apps/updatenotification/l10n/sk.json3
-rw-r--r--apps/updatenotification/l10n/sv.js1
-rw-r--r--apps/updatenotification/l10n/sv.json1
-rw-r--r--apps/updatenotification/lib/AppInfo/Application.php2
-rw-r--r--apps/updatenotification/lib/Settings/Admin.php38
-rw-r--r--apps/updatenotification/package-lock.json6127
-rw-r--r--apps/updatenotification/package.json37
-rw-r--r--apps/updatenotification/templates/admin.php84
-rw-r--r--apps/updatenotification/tests/Settings/AdminTest.php50
-rw-r--r--apps/user_ldap/appinfo/info.xml23
-rw-r--r--apps/user_ldap/l10n/es.js4
-rw-r--r--apps/user_ldap/l10n/es.json4
-rw-r--r--apps/user_ldap/l10n/lt_LT.js9
-rw-r--r--apps/user_ldap/l10n/lt_LT.json9
-rw-r--r--apps/user_ldap/lib/Connection.php31
-rw-r--r--apps/user_ldap/lib/Controller/RenewPasswordController.php1
-rw-r--r--apps/user_ldap/lib/Group_LDAP.php13
-rw-r--r--apps/user_ldap/lib/Jobs/Sync.php2
-rw-r--r--apps/user_ldap/lib/Notification/Notifier.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-groupfilter.php4
-rw-r--r--apps/user_ldap/templates/part.wizard-loginfilter.php2
-rw-r--r--apps/user_ldap/templates/part.wizard-userfilter.php2
-rw-r--r--apps/user_ldap/templates/settings.php2
-rw-r--r--apps/user_ldap/tests/ConnectionTest.php2
-rw-r--r--apps/user_ldap/tests/Group_LDAPTest.php87
-rw-r--r--apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php2
-rw-r--r--apps/workflowengine/appinfo/info.xml20
-rw-r--r--apps/workflowengine/l10n/es.js2
-rw-r--r--apps/workflowengine/l10n/es.json2
-rw-r--r--apps/workflowengine/l10n/hu.js1
-rw-r--r--apps/workflowengine/l10n/hu.json1
-rw-r--r--apps/workflowengine/l10n/ja.js1
-rw-r--r--apps/workflowengine/l10n/ja.json1
-rw-r--r--apps/workflowengine/l10n/lv.js6
-rw-r--r--apps/workflowengine/l10n/lv.json6
-rw-r--r--apps/workflowengine/l10n/nl.js3
-rw-r--r--apps/workflowengine/l10n/nl.json3
-rw-r--r--apps/workflowengine/l10n/ru.js3
-rw-r--r--apps/workflowengine/l10n/ru.json3
-rw-r--r--apps/workflowengine/l10n/sk.js1
-rw-r--r--apps/workflowengine/l10n/sk.json1
277 files changed, 8282 insertions, 890 deletions
diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml
index 44abc85f105..054ed9580f2 100644
--- a/apps/admin_audit/appinfo/info.xml
+++ b/apps/admin_audit/appinfo/info.xml
@@ -1,16 +1,20 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>admin_audit</id>
<name>Auditing / Logging</name>
+ <summary>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</summary>
<description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
- <licence>AGPL</licence>
- <author>Nextcloud</author>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Nextcloud</author>
<namespace>AdminAudit</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<types>
<logging/>
</types>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/comments/appinfo/info.xml b/apps/comments/appinfo/info.xml
index 61a23cf65f8..bc2cfe03054 100644
--- a/apps/comments/appinfo/info.xml
+++ b/apps/comments/appinfo/info.xml
@@ -1,19 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>comments</id>
<name>Comments</name>
+ <summary>Files app plugin to add comments to files</summary>
<description>Files app plugin to add comments to files</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Arthur Schiwon</author>
<author>Vincent Petry</author>
<default_enable/>
- <version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<types>
<logging/>
</types>
+ <category>office</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<activity>
<settings>
diff --git a/apps/comments/lib/Activity/Listener.php b/apps/comments/lib/Activity/Listener.php
index 1dec28c8250..b5378e996dc 100644
--- a/apps/comments/lib/Activity/Listener.php
+++ b/apps/comments/lib/Activity/Listener.php
@@ -31,7 +31,6 @@ use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\IUser;
use OCP\IUserSession;
-use OCP\Share;
use OCP\Share\IShareHelper;
class Listener {
@@ -99,7 +98,7 @@ class Listener {
/** @var Node $node */
$node = array_shift($nodes);
$al = $this->shareHelper->getPathsForAccessList($node);
- $users = array_merge($users, $al['users']);
+ $users += $al['users'];
}
}
@@ -120,7 +119,9 @@ class Listener {
]);
foreach ($users as $user => $path) {
- $activity->setAffectedUser($user);
+ // numerical user ids end up as integers from array keys, but string
+ // is required
+ $activity->setAffectedUser((string)$user);
$activity->setSubject('add_comment_subject', [
'actor' => $actor,
diff --git a/apps/comments/lib/EventHandler.php b/apps/comments/lib/EventHandler.php
index 0fc6de7bf49..d2b31e809c1 100644
--- a/apps/comments/lib/EventHandler.php
+++ b/apps/comments/lib/EventHandler.php
@@ -24,7 +24,6 @@
namespace OCA\Comments;
use OCA\Comments\Activity\Listener as ActivityListener;
-use OCA\Comments\AppInfo\Application;
use OCA\Comments\Notification\Listener as NotificationListener;
use OCP\Comments\CommentsEvent;
use OCP\Comments\ICommentsEventHandler;
diff --git a/apps/comments/tests/Unit/Activity/ListenerTest.php b/apps/comments/tests/Unit/Activity/ListenerTest.php
new file mode 100644
index 00000000000..4454101bb38
--- /dev/null
+++ b/apps/comments/tests/Unit/Activity/ListenerTest.php
@@ -0,0 +1,187 @@
+<?php
+/**
+ * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @author Arthur Schiwon <blizzz@arthur-schiwon.de>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Comments\Tests\Unit\Activity;
+
+use OCA\Comments\Activity\Listener;
+use OCP\Activity\IEvent;
+use OCP\Activity\IManager;
+use OCP\App\IAppManager;
+use OCP\Comments\CommentsEvent;
+use OCP\Comments\IComment;
+use OCP\Files\Config\ICachedMountFileInfo;
+use OCP\Files\Config\IMountProviderCollection;
+use OCP\Files\Config\IUserMountCache;
+use OCP\Files\Folder;
+use OCP\Files\IRootFolder;
+use OCP\Files\Node;
+use OCP\IUser;
+use OCP\IUserSession;
+use OCP\Share\IShareHelper;
+use Test\TestCase;
+
+class ListenerTest extends TestCase {
+
+ /** @var Listener */
+ protected $listener;
+
+ /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */
+ protected $activityManager;
+
+ /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */
+ protected $session;
+
+ /** @var IAppManager|\PHPUnit_Framework_MockObject_MockObject */
+ protected $appManager;
+
+ /** @var IMountProviderCollection|\PHPUnit_Framework_MockObject_MockObject */
+ protected $mountProviderCollection;
+
+ /** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */
+ protected $rootFolder;
+
+ /** @var IShareHelper|\PHPUnit_Framework_MockObject_MockObject */
+ protected $shareHelper;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->activityManager = $this->createMock(IManager::class);
+ $this->session = $this->createMock(IUserSession::class);
+ $this->appManager = $this->createMock(IAppManager::class);
+ $this->mountProviderCollection = $this->createMock(IMountProviderCollection::class);
+ $this->rootFolder = $this->createMock(IRootFolder::class);
+ $this->shareHelper = $this->createMock(IShareHelper::class);
+
+ $this->listener = new Listener(
+ $this->activityManager,
+ $this->session,
+ $this->appManager,
+ $this->mountProviderCollection,
+ $this->rootFolder,
+ $this->shareHelper
+ );
+ }
+
+ public function testCommentEvent() {
+ $this->appManager->expects($this->any())
+ ->method('isInstalled')
+ ->with('activity')
+ ->willReturn(true);
+
+ $comment = $this->createMock(IComment::class);
+ $comment->expects($this->any())
+ ->method('getObjectType')
+ ->willReturn('files');
+
+ /** @var CommentsEvent|\PHPUnit_Framework_MockObject_MockObject $event */
+ $event = $this->createMock(CommentsEvent::class);
+ $event->expects($this->any())
+ ->method('getComment')
+ ->willReturn($comment);
+ $event->expects($this->any())
+ ->method('getEvent')
+ ->willReturn(CommentsEvent::EVENT_ADD);
+
+ /** @var IUser|\PHPUnit_Framework_MockObject_MockObject $ownerUser */
+ $ownerUser = $this->createMock(IUser::class);
+ $ownerUser->expects($this->any())
+ ->method('getUID')
+ ->willReturn('937393');
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject $mount */
+ $mount = $this->createMock(ICachedMountFileInfo::class);
+ $mount->expects($this->any())
+ ->method('getUser')
+ ->willReturn($ownerUser); // perhaps not the right user, but does not matter in this scenario
+
+ $mounts = [ $mount, $mount ]; // to make sure duplicates are dealt with
+
+ $userMountCache = $this->createMock(IUserMountCache::class);
+ $userMountCache->expects($this->any())
+ ->method('getMountsForFileId')
+ ->willReturn($mounts);
+
+ $this->mountProviderCollection->expects($this->any())
+ ->method('getMountCache')
+ ->willReturn($userMountCache);
+
+ $node = $this->createMock(Node::class);
+ $nodes = [ $node ];
+
+ $ownerFolder = $this->createMock(Folder::class);
+ $ownerFolder->expects($this->any())
+ ->method('getById')
+ ->willReturn($nodes);
+
+ $this->rootFolder->expects($this->any())
+ ->method('getUserFolder')
+ ->willReturn($ownerFolder);
+
+ $al = [ 'users' => [
+ '873304' => 'i/got/it/here',
+ '254342' => 'there/i/have/it',
+ 'sandra' => 'and/here/i/placed/it'
+ ]];
+ $this->shareHelper->expects($this->any())
+ ->method('getPathsForAccessList')
+ ->willReturn($al);
+
+ $this->session->expects($this->any())
+ ->method('getUser')
+ ->willReturn($ownerUser);
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject $activity */
+ $activity = $this->createMock(IEvent::class);
+ $activity->expects($this->exactly(count($al['users'])))
+ ->method('setAffectedUser');
+ $activity->expects($this->once())
+ ->method('setApp')
+ ->with('comments')
+ ->willReturnSelf();
+ $activity->expects($this->once())
+ ->method('setType')
+ ->with('comments')
+ ->willReturnSelf();
+ $activity->expects($this->once())
+ ->method('setAuthor')
+ ->with($ownerUser->getUID())
+ ->willReturnSelf();
+ $activity->expects($this->once())
+ ->method('setObject')
+ ->with('files', $this->anything())
+ ->willReturnSelf();
+ $activity->expects($this->once())
+ ->method('setMessage')
+ ->with('add_comment_message', $this->anything())
+ ->willReturnSelf();
+
+ $this->activityManager->expects($this->once())
+ ->method('generateEvent')
+ ->willReturn($activity);
+ $this->activityManager->expects($this->exactly(count($al['users'])))
+ ->method('publish');
+
+ $this->listener->commentEvent($event);
+ }
+}
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml
index 7115cacfef2..3afef530e7a 100644
--- a/apps/dav/appinfo/info.xml
+++ b/apps/dav/appinfo/info.xml
@@ -1,22 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>dav</id>
<name>WebDAV</name>
+ <summary>WebDAV endpoint</summary>
<description>WebDAV endpoint</description>
- <licence>AGPL</licence>
- <author>owncloud.org</author>
<version>1.5.0</version>
+ <licence>agpl</licence>
+ <author>owncloud.org</author>
+ <namespace>DAV</namespace>
<default_enable/>
<types>
<filesystem/>
</types>
- <namespace>DAV</namespace>
- <public>
- <webdav>appinfo/v1/publicwebdav.php</webdav>
- </public>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
+
<repair-steps>
<post-migration>
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
@@ -24,6 +26,7 @@
<step>OCA\DAV\Migration\BuildCalendarSearchIndex</step>
</post-migration>
</repair-steps>
+
<commands>
<command>OCA\DAV\Command\CreateAddressBook</command>
<command>OCA\DAV\Command\CreateCalendar</command>
@@ -31,18 +34,22 @@
<command>OCA\DAV\Command\SyncSystemAddressBook</command>
</commands>
- <activity>
- <filters>
- <filter>OCA\DAV\CalDAV\Activity\Filter\Calendar</filter>
- <filter>OCA\DAV\CalDAV\Activity\Filter\Todo</filter>
- </filters>
+ <settings>
+ <admin>OCA\DAV\Settings\CalDAVSettings</admin>
+ </settings>
+ <activity>
<settings>
<setting>OCA\DAV\CalDAV\Activity\Setting\Calendar</setting>
<setting>OCA\DAV\CalDAV\Activity\Setting\Event</setting>
<setting>OCA\DAV\CalDAV\Activity\Setting\Todo</setting>
</settings>
+ <filters>
+ <filter>OCA\DAV\CalDAV\Activity\Filter\Calendar</filter>
+ <filter>OCA\DAV\CalDAV\Activity\Filter\Todo</filter>
+ </filters>
+
<providers>
<provider>OCA\DAV\CalDAV\Activity\Provider\Calendar</provider>
<provider>OCA\DAV\CalDAV\Activity\Provider\Event</provider>
@@ -50,7 +57,7 @@
</providers>
</activity>
- <settings>
- <admin>OCA\DAV\Settings\CalDAVSettings</admin>
- </settings>
+ <public>
+ <webdav>appinfo/v1/publicwebdav.php</webdav>
+ </public>
</info>
diff --git a/apps/dav/l10n/hu.js b/apps/dav/l10n/hu.js
index e028e61e787..88c86a874a3 100644
--- a/apps/dav/l10n/hu.js
+++ b/apps/dav/l10n/hu.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Leírás:",
"Link:" : "Link:",
"Contacts" : "Névjegyek",
+ "WebDAV" : "WebDAV",
"Technical details" : "Technikai adatok",
"Remote Address: %s" : "Távoli cím: %s",
"Request ID: %s" : "Kérelem azonosító: %s",
diff --git a/apps/dav/l10n/hu.json b/apps/dav/l10n/hu.json
index 2f507d46aa9..cd9af191756 100644
--- a/apps/dav/l10n/hu.json
+++ b/apps/dav/l10n/hu.json
@@ -53,6 +53,7 @@
"Description:" : "Leírás:",
"Link:" : "Link:",
"Contacts" : "Névjegyek",
+ "WebDAV" : "WebDAV",
"Technical details" : "Technikai adatok",
"Remote Address: %s" : "Távoli cím: %s",
"Request ID: %s" : "Kérelem azonosító: %s",
diff --git a/apps/dav/l10n/ru.js b/apps/dav/l10n/ru.js
index 86082e3f8c6..70cfd8050a6 100644
--- a/apps/dav/l10n/ru.js
+++ b/apps/dav/l10n/ru.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Описание:",
"Link:" : "Ссылка:",
"Contacts" : "Контакты",
+ "WebDAV" : "WebDAV",
"Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s",
diff --git a/apps/dav/l10n/ru.json b/apps/dav/l10n/ru.json
index 8c53fede2aa..934bcaa719e 100644
--- a/apps/dav/l10n/ru.json
+++ b/apps/dav/l10n/ru.json
@@ -53,6 +53,7 @@
"Description:" : "Описание:",
"Link:" : "Ссылка:",
"Contacts" : "Контакты",
+ "WebDAV" : "WebDAV",
"Technical details" : "Технические подробности",
"Remote Address: %s" : "Удаленный адрес: %s",
"Request ID: %s" : "ID запроса: %s",
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index cc93613e2b0..f6af2bf93f3 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -55,6 +55,7 @@ OC.L10N.register(
"Description:" : "Beskrivning:",
"Link:" : "Länk:",
"Contacts" : "Kontakter",
+ "WebDAV" : "WebDAV",
"Technical details" : "Tekniska detaljer",
"Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s",
@@ -62,6 +63,7 @@ OC.L10N.register(
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Please make sure to properly set up the email settings above." : "Vänligen säkerställ att epost-inställningarna ovan är korrekt angivna",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
- "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb."
+ "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb.",
+ "Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid."
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index df7d8faa22a..4c256ddb1aa 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -53,6 +53,7 @@
"Description:" : "Beskrivning:",
"Link:" : "Länk:",
"Contacts" : "Kontakter",
+ "WebDAV" : "WebDAV",
"Technical details" : "Tekniska detaljer",
"Remote Address: %s" : "Extern adress: %s",
"Request ID: %s" : "Begär ID: %s",
@@ -60,6 +61,7 @@
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Please make sure to properly set up the email settings above." : "Vänligen säkerställ att epost-inställningarna ovan är korrekt angivna",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
- "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb."
+ "Birthday calendars will be generated by a background job." : "Födelsedagskalender kommer skapas som ett bakgrundsjobb.",
+ "Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index a936cb6aeba..290d6027006 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -51,10 +51,8 @@ use Sabre\DAV;
use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\PropPatch;
-use Sabre\HTTP\URLUtil;
use Sabre\VObject\Component;
use Sabre\VObject\Component\VCalendar;
-use Sabre\VObject\Component\VEvent;
use Sabre\VObject\Component\VTimeZone;
use Sabre\VObject\DateTimeParser;
use Sabre\VObject\InvalidDataException;
diff --git a/apps/dav/lib/CalDAV/Plugin.php b/apps/dav/lib/CalDAV/Plugin.php
index 0d793f929b3..4aa9762899f 100644
--- a/apps/dav/lib/CalDAV/Plugin.php
+++ b/apps/dav/lib/CalDAV/Plugin.php
@@ -23,8 +23,6 @@
namespace OCA\DAV\CalDAV;
-use Sabre\HTTP\URLUtil;
-
class Plugin extends \Sabre\CalDAV\Plugin {
/**
diff --git a/apps/dav/lib/CalDAV/Principal/Collection.php b/apps/dav/lib/CalDAV/Principal/Collection.php
index cadfc66c26b..e4389a1c726 100644
--- a/apps/dav/lib/CalDAV/Principal/Collection.php
+++ b/apps/dav/lib/CalDAV/Principal/Collection.php
@@ -23,7 +23,6 @@
namespace OCA\DAV\CalDAV\Principal;
-use OCA\DAV\CalDAV\Principal\User;
/**
* Class Collection
diff --git a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
index 781baa2032d..85973a8be12 100644
--- a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
+++ b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php
@@ -35,7 +35,6 @@ use OCP\L10N\IFactory as L10NFactory;
use OCP\Mail\IEMailTemplate;
use OCP\Mail\IMailer;
use Sabre\CalDAV\Schedule\IMipPlugin as SabreIMipPlugin;
-use Sabre\DAV\Xml\Element\Prop;
use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VEvent;
use Sabre\VObject\DateTimeParser;
diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php
index be92f16f772..a2d3b03147b 100644
--- a/apps/dav/lib/CardDAV/CardDavBackend.php
+++ b/apps/dav/lib/CardDAV/CardDavBackend.php
@@ -46,7 +46,6 @@ use Sabre\CardDAV\Backend\BackendInterface;
use Sabre\CardDAV\Backend\SyncSupport;
use Sabre\CardDAV\Plugin;
use Sabre\DAV\Exception\BadRequest;
-use Sabre\HTTP\URLUtil;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Reader;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php
index 069239326ba..cac8e795747 100644
--- a/apps/dav/lib/CardDAV/ImageExportPlugin.php
+++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php
@@ -24,7 +24,6 @@
namespace OCA\DAV\CardDAV;
use OCP\Files\NotFoundException;
-use OCP\ILogger;
use Sabre\CardDAV\Card;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
diff --git a/apps/dav/lib/CardDAV/Plugin.php b/apps/dav/lib/CardDAV/Plugin.php
index 2dca3585f35..cd303a394ed 100644
--- a/apps/dav/lib/CardDAV/Plugin.php
+++ b/apps/dav/lib/CardDAV/Plugin.php
@@ -27,7 +27,6 @@ use OCA\DAV\CardDAV\Xml\Groups;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
use Sabre\DAV\Server;
-use Sabre\HTTP\URLUtil;
class Plugin extends \Sabre\CardDAV\Plugin {
diff --git a/apps/dav/lib/Connector/LegacyDAVACL.php b/apps/dav/lib/Connector/LegacyDAVACL.php
index f96d75a2486..6c55eb0765f 100644
--- a/apps/dav/lib/Connector/LegacyDAVACL.php
+++ b/apps/dav/lib/Connector/LegacyDAVACL.php
@@ -28,7 +28,6 @@ namespace OCA\DAV\Connector;
use OCA\DAV\Connector\Sabre\DavAclPlugin;
use Sabre\DAV\INode;
use Sabre\DAV\PropFind;
-use Sabre\HTTP\URLUtil;
use Sabre\DAVACL\Xml\Property\Principal;
class LegacyDAVACL extends DavAclPlugin {
diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php
index 25db1d5028c..15988cdadb4 100644
--- a/apps/dav/lib/Connector/Sabre/ObjectTree.php
+++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php
@@ -34,7 +34,6 @@ use OCA\DAV\Connector\Sabre\Exception\Forbidden;
use OCA\DAV\Connector\Sabre\Exception\InvalidPath;
use OCA\DAV\Connector\Sabre\Exception\FileLocked;
use OC\Files\FileInfo;
-use OC\Files\Mount\MoveableMount;
use OCP\Files\ForbiddenException;
use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
diff --git a/apps/dav/lib/Connector/Sabre/Principal.php b/apps/dav/lib/Connector/Sabre/Principal.php
index 06fb10f7e2c..b2f57cf715c 100644
--- a/apps/dav/lib/Connector/Sabre/Principal.php
+++ b/apps/dav/lib/Connector/Sabre/Principal.php
@@ -39,7 +39,6 @@ use OCP\Share\IManager as IShareManager;
use Sabre\DAV\Exception;
use \Sabre\DAV\PropPatch;
use Sabre\DAVACL\PrincipalBackend\BackendInterface;
-use Sabre\HTTP\URLUtil;
class Principal implements BackendInterface {
diff --git a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
index af45f526831..5222986cb5c 100644
--- a/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/QuotaPlugin.php
@@ -26,15 +26,12 @@
*
*/
namespace OCA\DAV\Connector\Sabre;
-use OCA\DAV\Files\FilesHome;
use OCA\DAV\Upload\FutureFile;
-use OCA\DAV\Upload\UploadFolder;
use OCP\Files\FileInfo;
use OCP\Files\StorageNotAvailableException;
use Sabre\DAV\Exception\InsufficientStorage;
use Sabre\DAV\Exception\ServiceUnavailable;
use Sabre\DAV\INode;
-use Sabre\HTTP\URLUtil;
/**
* This plugin check user quota and deny creating files when they exceeds the quota.
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index c120b0be2e2..73969865a86 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -39,7 +39,6 @@ use OCP\IPreview;
use OCP\IRequest;
use OCP\ITagManager;
use OCP\IUserSession;
-use Sabre\DAV\Auth\Backend\BackendInterface;
use Sabre\DAV\Auth\Plugin;
class ServerFactory {
diff --git a/apps/dav/lib/DAV/SystemPrincipalBackend.php b/apps/dav/lib/DAV/SystemPrincipalBackend.php
index e3b9302886e..77dd5c77caf 100644
--- a/apps/dav/lib/DAV/SystemPrincipalBackend.php
+++ b/apps/dav/lib/DAV/SystemPrincipalBackend.php
@@ -24,7 +24,6 @@
namespace OCA\DAV\DAV;
use Sabre\DAVACL\PrincipalBackend\AbstractBackend;
-use Sabre\HTTP\URLUtil;
class SystemPrincipalBackend extends AbstractBackend {
diff --git a/apps/dav/lib/Files/FilesHome.php b/apps/dav/lib/Files/FilesHome.php
index 8820ef6ffb7..63e7916edcf 100644
--- a/apps/dav/lib/Files/FilesHome.php
+++ b/apps/dav/lib/Files/FilesHome.php
@@ -27,7 +27,6 @@ namespace OCA\DAV\Files;
use OCA\DAV\Connector\Sabre\Directory;
use OCP\Files\FileInfo;
use Sabre\DAV\Exception\Forbidden;
-use Sabre\HTTP\URLUtil;
class FilesHome extends Directory {
diff --git a/apps/dav/lib/Files/RootCollection.php b/apps/dav/lib/Files/RootCollection.php
index 28f98483c4c..59b6690a026 100644
--- a/apps/dav/lib/Files/RootCollection.php
+++ b/apps/dav/lib/Files/RootCollection.php
@@ -25,7 +25,6 @@ namespace OCA\DAV\Files;
use Sabre\DAV\INode;
use Sabre\DAVACL\AbstractPrincipalCollection;
-use Sabre\HTTP\URLUtil;
use Sabre\DAV\SimpleCollection;
class RootCollection extends AbstractPrincipalCollection {
diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php
index dfa19467e5e..84426db04cb 100644
--- a/apps/dav/lib/Server.php
+++ b/apps/dav/lib/Server.php
@@ -32,9 +32,7 @@
*/
namespace OCA\DAV;
-use OC\AppFramework\Utility\TimeFactory;
use OCA\DAV\CalDAV\BirthdayService;
-use OCA\DAV\CalDAV\Schedule\IMipPlugin;
use OCA\DAV\CardDAV\ImageExportPlugin;
use OCA\DAV\CardDAV\PhotoCache;
use OCA\DAV\Comments\CommentsPlugin;
diff --git a/apps/dav/lib/Upload/ChunkingPlugin.php b/apps/dav/lib/Upload/ChunkingPlugin.php
index 5768f53c2b4..a3f6e528c6b 100644
--- a/apps/dav/lib/Upload/ChunkingPlugin.php
+++ b/apps/dav/lib/Upload/ChunkingPlugin.php
@@ -22,8 +22,6 @@
namespace OCA\DAV\Upload;
-
-use OCA\DAV\Connector\Sabre\File;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\Server;
use Sabre\DAV\ServerPlugin;
diff --git a/apps/dav/tests/unit/ServerTest.php b/apps/dav/tests/unit/ServerTest.php
index d502b24adcf..58c77c1b0ec 100644
--- a/apps/dav/tests/unit/ServerTest.php
+++ b/apps/dav/tests/unit/ServerTest.php
@@ -41,6 +41,8 @@ class ServerTest extends \Test\TestCase {
public function test() {
/** @var IRequest $r */
$r = $this->createMock(IRequest::class);
+ $r->method('getRequestUri')
+ ->willReturn('/');
$s = new Server($r, '/');
$this->assertInstanceOf('OCA\DAV\Server', $s);
}
diff --git a/apps/encryption/appinfo/info.xml b/apps/encryption/appinfo/info.xml
index 5744e5d2d66..2859043e72b 100644
--- a/apps/encryption/appinfo/info.xml
+++ b/apps/encryption/appinfo/info.xml
@@ -1,6 +1,9 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>encryption</id>
+ <name>Default encryption module</name>
+ <summary>Default encryption module for server-side encryption</summary>
<description>
In order to use this encryption module you need to enable server-side
encryption in the admin settings. Once enabled this module will encrypt
@@ -11,35 +14,40 @@
Please read the documentation to know all implications before you decide
to enable server-side encryption.
</description>
- <name>Default encryption module</name>
- <licence>AGPL</licence>
+ <version>2.1.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<author>Clark Tomlinson</author>
+ <types>
+ <filesystem/>
+ </types>
<documentation>
<user>user-encryption</user>
<admin>admin-encryption</admin>
</documentation>
- <version>2.1.0</version>
- <types>
- <filesystem/>
- </types>
+ <category>files</category>
+ <category>security</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
<dependencies>
<lib>openssl</lib>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <settings>
- <admin>OCA\Encryption\Settings\Admin</admin>
- <personal>OCA\Encryption\Settings\Personal</personal>
- </settings>
- <commands>
- <command>OCA\Encryption\Command\EnableMasterKey</command>
- <command>OCA\Encryption\Command\DisableMasterKey</command>
- <command>OCA\Encryption\Command\MigrateKeys</command>
- </commands>
<repair-steps>
<post-migration>
<step>OCA\Encryption\Migration\SetMasterKeyStatus</step>
</post-migration>
</repair-steps>
+
+ <commands>
+ <command>OCA\Encryption\Command\EnableMasterKey</command>
+ <command>OCA\Encryption\Command\DisableMasterKey</command>
+ <command>OCA\Encryption\Command\MigrateKeys</command>
+ </commands>
+
+ <settings>
+ <admin>OCA\Encryption\Settings\Admin</admin>
+ <personal>OCA\Encryption\Settings\Personal</personal>
+ </settings>
</info>
diff --git a/apps/encryption/l10n/es.js b/apps/encryption/l10n/es.js
index 35ef819d2d1..d7d0f4af1e7 100644
--- a/apps/encryption/l10n/es.js
+++ b/apps/encryption/l10n/es.js
@@ -1,22 +1,22 @@
OC.L10N.register(
"encryption",
{
- "Missing recovery key password" : "Falta contraseña de recuperación",
+ "Missing recovery key password" : "Falta la contraseña de recuperación",
"Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada",
"Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
+ "Could not enable recovery key. Please check your recovery key password!" : "No se ha podido habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
"Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
"Missing parameters" : "Faltan parámetros",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
+ "Please provide the old recovery password" : "Por favor, introduzca su antigua contraseña de recuperación",
"Please provide a new recovery password" : "Por favor, provea una nueva contraseña de recuperación",
"Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
"Password successfully changed." : "Su contraseña ha sido cambiada",
"Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
"Recovery Key disabled" : "Desactivada la clave de recuperación",
"Recovery Key enabled" : "Recuperación de clave habilitada",
- "Could not enable the recovery key, please try again or contact your administrator" : "No se pudo habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
+ "Could not enable the recovery key, please try again or contact your administrator" : "No se ha podido habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
"Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
"The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor inténtelo de nuevo.",
"The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.",
diff --git a/apps/encryption/l10n/es.json b/apps/encryption/l10n/es.json
index 0ab95ab9247..17ba43a1bf0 100644
--- a/apps/encryption/l10n/es.json
+++ b/apps/encryption/l10n/es.json
@@ -1,20 +1,20 @@
{ "translations": {
- "Missing recovery key password" : "Falta contraseña de recuperación",
+ "Missing recovery key password" : "Falta la contraseña de recuperación",
"Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación",
"Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada",
"Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos",
- "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
+ "Could not enable recovery key. Please check your recovery key password!" : "No se ha podido habilitar la contraseña de recuperación. Por favor, ¡compruebe su contraseña de recuperación!",
"Recovery key successfully disabled" : "Clave de recuperación deshabilitada",
"Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor, ¡compruebe su contraseña!",
"Missing parameters" : "Faltan parámetros",
- "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación",
+ "Please provide the old recovery password" : "Por favor, introduzca su antigua contraseña de recuperación",
"Please provide a new recovery password" : "Por favor, provea una nueva contraseña de recuperación",
"Please repeat the new recovery password" : "Por favor, repita su nueva contraseña de recuperación",
"Password successfully changed." : "Su contraseña ha sido cambiada",
"Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
"Recovery Key disabled" : "Desactivada la clave de recuperación",
"Recovery Key enabled" : "Recuperación de clave habilitada",
- "Could not enable the recovery key, please try again or contact your administrator" : "No se pudo habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
+ "Could not enable the recovery key, please try again or contact your administrator" : "No se ha podido habilitar la clave de recuperación, por favor vuelva a intentarlo o póngase en contacto con su administrador",
"Could not update the private key password." : "No se pudo actualizar la contraseña de la clave privada.",
"The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor inténtelo de nuevo.",
"The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcta, por favor inténtelo de nuevo.",
diff --git a/apps/encryption/l10n/pt_PT.js b/apps/encryption/l10n/pt_PT.js
index b5b26cefd07..99d3ab28b9a 100644
--- a/apps/encryption/l10n/pt_PT.js
+++ b/apps/encryption/l10n/pt_PT.js
@@ -22,15 +22,21 @@ OC.L10N.register(
"The current log-in password was not correct, please try again." : "A palavra-passe de iniciar a sessão atual não estava correta, por favor, tente de novo.",
"Private key password successfully updated." : "A palavra-passe da chave privada foi atualizada com sucesso. ",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, execute 'occ encryption:migrate' ou contacte o seu administrador",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para a aplicação de cifra. Por favor actualize a sua chave privada nas definições pessoais para recuperar acesso aos seus ficheiros cifrados.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Por favor active cifragem no servidor nas definições de administrador para usar o módulo de cifra.",
+ "Encryption app is enabled and ready" : "Aplicação de cifra activa e pronta a usar",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
"one-time password for server-side-encryption" : "palavra-passe de utilização única para a encriptação do lado do servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.",
+ "Default encryption module" : "Módulo de cifra padrão",
"Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n",
"The share will expire on %s." : "Esta partilha irá expirar em %s.",
"Cheers!" : "Parabéns!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
"Encrypt the home storage" : "Encriptar o armazenamento do início",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo",
"Enable recovery key" : "Ativar a chave de recuperação",
@@ -43,6 +49,7 @@ OC.L10N.register(
"New recovery key password" : "Nova palavra-passe da chave de recuperação",
"Repeat new recovery key password" : "Repetir palavra-passe da chave de recuperação",
"Change Password" : "Alterar Palavra-passe",
+ "Basic encryption module" : "Módulo de cifra básica",
"Your private key password no longer matches your log-in password." : "A palavra-passe da sua chave privada já não coincide com a palavra-passe da sua sessão.",
"Set your old private key password to your current log-in password:" : "Defina a sua palavra-passe antiga da chave privada para a sua palavra-passe atual da sessão:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da palavra-passe antiga pode pedir ao seu administrador para recuperar os seus ficheiros. ",
diff --git a/apps/encryption/l10n/pt_PT.json b/apps/encryption/l10n/pt_PT.json
index 2dbaaaf1dbf..050c8b1710c 100644
--- a/apps/encryption/l10n/pt_PT.json
+++ b/apps/encryption/l10n/pt_PT.json
@@ -20,15 +20,21 @@
"The current log-in password was not correct, please try again." : "A palavra-passe de iniciar a sessão atual não estava correta, por favor, tente de novo.",
"Private key password successfully updated." : "A palavra-passe da chave privada foi atualizada com sucesso. ",
"You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Precisa de migrar as suas chaves de encriptação da encriptação antiga (ownCloud <= 8.0) para a nova. Por favor, execute 'occ encryption:migrate' ou contacte o seu administrador",
+ "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para a aplicação de cifra. Por favor actualize a sua chave privada nas definições pessoais para recuperar acesso aos seus ficheiros cifrados.",
+ "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
+ "Please enable server side encryption in the admin settings in order to use the encryption module." : "Por favor active cifragem no servidor nas definições de administrador para usar o módulo de cifra.",
+ "Encryption app is enabled and ready" : "Aplicação de cifra activa e pronta a usar",
"Bad Signature" : "Má Assinatura",
"Missing Signature" : "Assinatura em Falta",
"one-time password for server-side-encryption" : "palavra-passe de utilização única para a encriptação do lado do servidor",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.",
"Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este ficheiro, provavelmente isto é um ficheiro compartilhado. Por favor, peça ao dono do ficheiro para voltar a partilhar o ficheiro consigo.",
+ "Default encryption module" : "Módulo de cifra padrão",
"Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Olá,\n\no administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe '%s'.\n\nPor favor, faz login via browser, vai à secção 'Módulo de encriptação básica' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.\n\n",
"The share will expire on %s." : "Esta partilha irá expirar em %s.",
"Cheers!" : "Parabéns!",
"Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Olá,<br><br>o administrador ativou a encriptação do lado do servidor. Os teus ficheiros foram encriptados usando a palavra-passe <strong>%s</strong>.<br><br>Por favor, faz login via browser, vai à secção 'Módulo de encriptação básica' nas tuas definições pessoais e atualiza a tua palavra-passe de encriptação ao introduzir esta palavra-passe no campo 'palavra-passe antiga' e também a tua palavra-passe atual.<br><br>",
+ "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicação de cifra está activa, mas as suas chaves não estão inicializaras. Por favor, faça logout e autentique-se novamente.",
"Encrypt the home storage" : "Encriptar o armazenamento do início",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativando esta opção todos os ficheiros armazenados no armazenamento principal serão encriptados, senão serão encriptados todos os ficheiros no armazenamento externo",
"Enable recovery key" : "Ativar a chave de recuperação",
@@ -41,6 +47,7 @@
"New recovery key password" : "Nova palavra-passe da chave de recuperação",
"Repeat new recovery key password" : "Repetir palavra-passe da chave de recuperação",
"Change Password" : "Alterar Palavra-passe",
+ "Basic encryption module" : "Módulo de cifra básica",
"Your private key password no longer matches your log-in password." : "A palavra-passe da sua chave privada já não coincide com a palavra-passe da sua sessão.",
"Set your old private key password to your current log-in password:" : "Defina a sua palavra-passe antiga da chave privada para a sua palavra-passe atual da sessão:",
" If you don't remember your old password you can ask your administrator to recover your files." : "Se não se lembra da palavra-passe antiga pode pedir ao seu administrador para recuperar os seus ficheiros. ",
diff --git a/apps/encryption/lib/AppInfo/Application.php b/apps/encryption/lib/AppInfo/Application.php
index 2130044d1f4..da59169694b 100644
--- a/apps/encryption/lib/AppInfo/Application.php
+++ b/apps/encryption/lib/AppInfo/Application.php
@@ -40,7 +40,6 @@ use OCA\Encryption\Recovery;
use OCA\Encryption\Session;
use OCA\Encryption\Users\Setup;
use OCA\Encryption\Util;
-use OCP\App;
use OCP\AppFramework\IAppContainer;
use OCP\Encryption\IManager;
use OCP\IConfig;
diff --git a/apps/encryption/lib/Hooks/UserHooks.php b/apps/encryption/lib/Hooks/UserHooks.php
index 1dade9f782f..dc3a4d3c428 100644
--- a/apps/encryption/lib/Hooks/UserHooks.php
+++ b/apps/encryption/lib/Hooks/UserHooks.php
@@ -34,7 +34,6 @@ use OCA\Encryption\Hooks\Contracts\IHook;
use OCA\Encryption\KeyManager;
use OCA\Encryption\Crypto\Crypt;
use OCA\Encryption\Users\Setup;
-use OCP\App;
use OCP\ILogger;
use OCP\IUserSession;
use OCA\Encryption\Util;
diff --git a/apps/federatedfilesharing/appinfo/info.xml b/apps/federatedfilesharing/appinfo/info.xml
index ac5e3f45e95..027e62ed183 100644
--- a/apps/federatedfilesharing/appinfo/info.xml
+++ b/apps/federatedfilesharing/appinfo/info.xml
@@ -1,17 +1,23 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>federatedfilesharing</id>
<name>Federated file sharing</name>
+ <summary>Provide federated file sharing across servers</summary>
<description>Provide federated file sharing across servers</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<author>Roeland Jago Douma</author>
- <version>1.4.0</version>
<namespace>FederatedFileSharing</namespace>
- <category>other</category>
+ <category>files</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
+
<settings>
<admin>OCA\FederatedFileSharing\Settings\Admin</admin>
<personal>OCA\FederatedFileSharing\Settings\Personal</personal>
diff --git a/apps/federatedfilesharing/l10n/hu.js b/apps/federatedfilesharing/l10n/hu.js
index ec462c190c1..0f57f27e5fa 100644
--- a/apps/federatedfilesharing/l10n/hu.js
+++ b/apps/federatedfilesharing/l10n/hu.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével ",
"Sharing" : "Megosztás",
+ "Federated file sharing" : "Egyesített fájlmegosztás",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Open documentation" : "Dokumentáció megnyitása",
"Adjust how people can share between servers." : "A szerverek közti megosztási lehetőségek beállítása",
diff --git a/apps/federatedfilesharing/l10n/hu.json b/apps/federatedfilesharing/l10n/hu.json
index e4c4094be26..5315c6593b5 100644
--- a/apps/federatedfilesharing/l10n/hu.json
+++ b/apps/federatedfilesharing/l10n/hu.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével, lásd %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem az #Nextcloud Egyesített Felhő Azonosító segítségével ",
"Sharing" : "Megosztás",
+ "Federated file sharing" : "Egyesített fájlmegosztás",
"Federated Cloud Sharing" : "Megosztás Egyesített Felhőben",
"Open documentation" : "Dokumentáció megnyitása",
"Adjust how people can share between servers." : "A szerverek közti megosztási lehetőségek beállítása",
diff --git a/apps/federatedfilesharing/l10n/ja.js b/apps/federatedfilesharing/l10n/ja.js
index c25ab82bc3c..a310958d709 100644
--- a/apps/federatedfilesharing/l10n/ja.js
+++ b/apps/federatedfilesharing/l10n/ja.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "#Nextcloud の「クラウド共有ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
"Sharing" : "共有中",
+ "Federated file sharing" : "連携共有",
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Adjust how people can share between servers." : "サーバー間でどうやって共有するかを調整する",
diff --git a/apps/federatedfilesharing/l10n/ja.json b/apps/federatedfilesharing/l10n/ja.json
index 67870054631..89c5c06bf1b 100644
--- a/apps/federatedfilesharing/l10n/ja.json
+++ b/apps/federatedfilesharing/l10n/ja.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "#Nextcloud の「クラウド共有ID」で私と共有できます。こちらを見てください。%s",
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
"Sharing" : "共有中",
+ "Federated file sharing" : "連携共有",
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Adjust how people can share between servers." : "サーバー間でどうやって共有するかを調整する",
diff --git a/apps/federatedfilesharing/l10n/lv.js b/apps/federatedfilesharing/l10n/lv.js
index b432c74285f..29e26c409db 100644
--- a/apps/federatedfilesharing/l10n/lv.js
+++ b/apps/federatedfilesharing/l10n/lv.js
@@ -19,7 +19,7 @@ OC.L10N.register(
"Invalid or untrusted SSL certificate" : "Nederīgs vai neuzticams SSL sertifikāts",
"Storage not valid" : "Nederīga krātuve",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "File is already shared with %s" : "Fails ir jau koplietots ar %s",
+ "File is already shared with %s" : "Datne ir jau koplietota ar %s",
"Could not find share" : "Nevarēja atrast koplietojumu",
"Accept" : "Akceptēt",
"Decline" : "Noraidīt",
diff --git a/apps/federatedfilesharing/l10n/lv.json b/apps/federatedfilesharing/l10n/lv.json
index d036b879573..472df869385 100644
--- a/apps/federatedfilesharing/l10n/lv.json
+++ b/apps/federatedfilesharing/l10n/lv.json
@@ -17,7 +17,7 @@
"Invalid or untrusted SSL certificate" : "Nederīgs vai neuzticams SSL sertifikāts",
"Storage not valid" : "Nederīga krātuve",
"Couldn't add remote share" : "Nevarēja pievienot attālināto koplietotni",
- "File is already shared with %s" : "Fails ir jau koplietots ar %s",
+ "File is already shared with %s" : "Datne ir jau koplietota ar %s",
"Could not find share" : "Nevarēja atrast koplietojumu",
"Accept" : "Akceptēt",
"Decline" : "Noraidīt",
diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js
index 985df3fb9eb..5538dea0d41 100644
--- a/apps/federatedfilesharing/l10n/nl.js
+++ b/apps/federatedfilesharing/l10n/nl.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID, zie %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID",
"Sharing" : "Delen",
+ "Federated file sharing" : "Gefedereerd delen",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Open documentatie",
"Adjust how people can share between servers." : "Aanpassen hoe mensen tussen servers kunnen delen.",
diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json
index d3c1e3bc1cd..5006ccb35c9 100644
--- a/apps/federatedfilesharing/l10n/nl.json
+++ b/apps/federatedfilesharing/l10n/nl.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID, zie %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud ID",
"Sharing" : "Delen",
+ "Federated file sharing" : "Gefedereerd delen",
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Open documentatie",
"Adjust how people can share between servers." : "Aanpassen hoe mensen tussen servers kunnen delen.",
diff --git a/apps/federatedfilesharing/l10n/pt_PT.js b/apps/federatedfilesharing/l10n/pt_PT.js
index 974e4988006..b88c8dbb9c8 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.js
+++ b/apps/federatedfilesharing/l10n/pt_PT.js
@@ -2,26 +2,57 @@ OC.L10N.register(
"federatedfilesharing",
{
"Federated sharing" : "Partilha Federada",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Pretende adicionar a partilha remota {nome} de {proprietório}@{remoto}?",
+ "Remote share" : "Partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
+ "Cancel" : "Cancelar",
+ "Add remote share" : "Adicionar partilha remota",
+ "Copy" : "Copiar",
+ "Copied!" : "Copiado!",
+ "Not supported!" : "Não suportado!",
+ "Press ⌘-C to copy." : "Pressione ⌘-C para copiar.",
+ "Press Ctrl-C to copy." : "Pressione Ctrl-C para copiar.",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
+ "Server to server sharing is not enabled on this server" : "Partilha servidor-para-servidor não está activa neste servidor",
+ "Couldn't establish a federated share." : "Não foi possível estabelecer uma partilha federada.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Não foi possível estabelecer a partilha federada, a palavra-passe talvez esteja incorrecta.",
+ "Federated Share request sent, you will receive an invitation. Check your notifications." : "Pedido de Partilha Federada enviado, irá receber o convite. Confira as suas notificações.",
+ "The mountpoint name contains invalid characters." : "O ponto de montagem (mountpoint) contem caracteres inválidos.",
+ "Not allowed to create a federated share with the owner." : "Não é permitido criar partilha federada com o proprietário. ",
+ "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável",
+ "Could not authenticate to remote share, password might be wrong" : "Não foi possível a autenticação na partilha remota, a palavra passe talvez esteja incorrecta",
+ "Storage not valid" : "Armazenamento inválido",
+ "Federated share added" : "Partilha federada adicionada",
+ "Couldn't add remote share" : "Não foi possível adicionar partilha remota",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque este item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
"File is already shared with %s" : "O ficheiro já foi partilhado com %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s (por conta de %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Partilha %s falhou, não foi possível encontrar %s, o servidor pode estar actualmente inatingível ou usa um certificado auto-assinado. ",
+ "Could not find share" : "Não foi possível encontrar partilha",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"%3$s\" como uma partilha remota de %1$s (em nome de %2$s)",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Recebeu {partilha} como uma partilha remota de {utilizador} (em nome de {behalf})",
+ "You received \"%3$s\" as a remote share from %1$s" : "Recebeu \"%3$s\" como uma partilha remota de %1$s",
+ "You received {share} as a remote share from {user}" : "Recebeu {partilha} como uma partilha remota de {utilizador}",
"Accept" : "Aceitar",
"Decline" : "Recusar",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud, veja %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud",
+ "Sharing" : "Partilha",
+ "Federated file sharing" : "Partilha federada de ficheiros",
"Federated Cloud Sharing" : "Partilha de Nuvem Federada",
"Open documentation" : "Abrir documentação",
+ "Adjust how people can share between servers." : "Ajustar como as pessoas podem partilhar entre servidores.",
"Allow users on this server to send shares to other servers" : "Permitir que os utilizadores neste servidor enviem as partilhas para outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir que os utilizadores neste servidor recebam as partilhas de outros servidores",
+ "Search global and public address book for users" : "Pesquisar lista global e pública de contactos de utilizadores ",
+ "Allow users to publish their data to a global and public address book" : "Permitir que os utilizadores publiquem os seus dados para uma lista de contactos global e pública",
"Federated Cloud" : "Nuvem Federada",
+ "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode partilhar com qualquer pessoa que use Nextcloud, ownCloud ou Pydio! Basta inserir Cloud ID federado no diálogo de partilha. Deve ser idêntico a pessoa@cloud.exemplo.com",
"Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
- "Share it:" : "Partilhe-a:",
+ "Share it so your friends can share files with you:" : "Partilhe para que os seus amigos possam partilhar ficheiros consigo:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via Nextcloud" : "Partilhe comigo via Nextcloud",
- "HTML Code:" : "Código HTML:"
+ "HTML Code:" : "Código HTML:",
+ "Search global and public address book for users and let local users publish their data" : "Pesquisar por utilizadores na lista de endereços global e pública e permita que utilizadores locais publiquem os seus dados"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/federatedfilesharing/l10n/pt_PT.json b/apps/federatedfilesharing/l10n/pt_PT.json
index 9cdd87376f4..75d8104e635 100644
--- a/apps/federatedfilesharing/l10n/pt_PT.json
+++ b/apps/federatedfilesharing/l10n/pt_PT.json
@@ -1,25 +1,56 @@
{ "translations": {
"Federated sharing" : "Partilha Federada",
+ "Do you want to add the remote share {name} from {owner}@{remote}?" : "Pretende adicionar a partilha remota {nome} de {proprietório}@{remoto}?",
+ "Remote share" : "Partilha remota",
+ "Remote share password" : "Palavra-passe da partilha remota",
+ "Cancel" : "Cancelar",
+ "Add remote share" : "Adicionar partilha remota",
+ "Copy" : "Copiar",
+ "Copied!" : "Copiado!",
+ "Not supported!" : "Não suportado!",
+ "Press ⌘-C to copy." : "Pressione ⌘-C para copiar.",
+ "Press Ctrl-C to copy." : "Pressione Ctrl-C para copiar.",
"Invalid Federated Cloud ID" : "Id. de Nuvem Federada Inválida",
+ "Server to server sharing is not enabled on this server" : "Partilha servidor-para-servidor não está activa neste servidor",
+ "Couldn't establish a federated share." : "Não foi possível estabelecer uma partilha federada.",
+ "Couldn't establish a federated share, maybe the password was wrong." : "Não foi possível estabelecer a partilha federada, a palavra-passe talvez esteja incorrecta.",
+ "Federated Share request sent, you will receive an invitation. Check your notifications." : "Pedido de Partilha Federada enviado, irá receber o convite. Confira as suas notificações.",
+ "The mountpoint name contains invalid characters." : "O ponto de montagem (mountpoint) contem caracteres inválidos.",
+ "Not allowed to create a federated share with the owner." : "Não é permitido criar partilha federada com o proprietário. ",
+ "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável",
+ "Could not authenticate to remote share, password might be wrong" : "Não foi possível a autenticação na partilha remota, a palavra passe talvez esteja incorrecta",
+ "Storage not valid" : "Armazenamento inválido",
+ "Federated share added" : "Partilha federada adicionada",
+ "Couldn't add remote share" : "Não foi possível adicionar partilha remota",
"Sharing %s failed, because this item is already shared with %s" : "A partilha %s falhou, porque este item já está a ser partilhado com %s",
"Not allowed to create a federated share with the same user" : "Não é possível criar uma partilha federada com o mesmo utilizador",
"File is already shared with %s" : "O ficheiro já foi partilhado com %s",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "A partilha de %s falhou, não foi possível encontrar %s. É possível que o servidor esteja inacessível.",
- "You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s (por conta de %2$s)",
- "You received \"/%3$s\" as a remote share from %1$s" : "Recebeu \"/%3$s\" como uma partilha remota de %1$s",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Partilha %s falhou, não foi possível encontrar %s, o servidor pode estar actualmente inatingível ou usa um certificado auto-assinado. ",
+ "Could not find share" : "Não foi possível encontrar partilha",
+ "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Recebeu \"%3$s\" como uma partilha remota de %1$s (em nome de %2$s)",
+ "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Recebeu {partilha} como uma partilha remota de {utilizador} (em nome de {behalf})",
+ "You received \"%3$s\" as a remote share from %1$s" : "Recebeu \"%3$s\" como uma partilha remota de %1$s",
+ "You received {share} as a remote share from {user}" : "Recebeu {partilha} como uma partilha remota de {utilizador}",
"Accept" : "Aceitar",
"Decline" : "Recusar",
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud, veja %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Partilhe comigo através da minha Id. da Nuvem Federada #Nextcloud",
+ "Sharing" : "Partilha",
+ "Federated file sharing" : "Partilha federada de ficheiros",
"Federated Cloud Sharing" : "Partilha de Nuvem Federada",
"Open documentation" : "Abrir documentação",
+ "Adjust how people can share between servers." : "Ajustar como as pessoas podem partilhar entre servidores.",
"Allow users on this server to send shares to other servers" : "Permitir que os utilizadores neste servidor enviem as partilhas para outros servidores",
"Allow users on this server to receive shares from other servers" : "Permitir que os utilizadores neste servidor recebam as partilhas de outros servidores",
+ "Search global and public address book for users" : "Pesquisar lista global e pública de contactos de utilizadores ",
+ "Allow users to publish their data to a global and public address book" : "Permitir que os utilizadores publiquem os seus dados para uma lista de contactos global e pública",
"Federated Cloud" : "Nuvem Federada",
+ "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pode partilhar com qualquer pessoa que use Nextcloud, ownCloud ou Pydio! Basta inserir Cloud ID federado no diálogo de partilha. Deve ser idêntico a pessoa@cloud.exemplo.com",
"Your Federated Cloud ID:" : "A sua id. da Nuvem Federada:",
- "Share it:" : "Partilhe-a:",
+ "Share it so your friends can share files with you:" : "Partilhe para que os seus amigos possam partilhar ficheiros consigo:",
"Add to your website" : "Adicione ao seu site da Web",
"Share with me via Nextcloud" : "Partilhe comigo via Nextcloud",
- "HTML Code:" : "Código HTML:"
+ "HTML Code:" : "Código HTML:",
+ "Search global and public address book for users and let local users publish their data" : "Pesquisar por utilizadores na lista de endereços global e pública e permita que utilizadores locais publiquem os seus dados"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js
index 9d0d769ff80..4c3e6fcf251 100644
--- a/apps/federatedfilesharing/l10n/ru.js
+++ b/apps/federatedfilesharing/l10n/ru.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ, смотрите %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
"Sharing" : "Общий доступ",
+ "Federated file sharing" : "Федеративный обмен файлами",
"Federated Cloud Sharing" : "Федерация облачных хранилищ",
"Open documentation" : "Открыть документацию",
"Adjust how people can share between servers." : "Настройте общий доступ между серверами.",
diff --git a/apps/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json
index 2b676154840..5d42815329d 100644
--- a/apps/federatedfilesharing/l10n/ru.json
+++ b/apps/federatedfilesharing/l10n/ru.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ, смотрите %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
"Sharing" : "Общий доступ",
+ "Federated file sharing" : "Федеративный обмен файлами",
"Federated Cloud Sharing" : "Федерация облачных хранилищ",
"Open documentation" : "Открыть документацию",
"Adjust how people can share between servers." : "Настройте общий доступ между серверами.",
diff --git a/apps/federatedfilesharing/l10n/sk.js b/apps/federatedfilesharing/l10n/sk.js
index e0844f3e57f..ae3c60a3135 100644
--- a/apps/federatedfilesharing/l10n/sk.js
+++ b/apps/federatedfilesharing/l10n/sk.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID, viac na %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID",
"Sharing" : "Sprístupnenie",
+ "Federated file sharing" : "Združené sprístupňovanie súborov",
"Federated Cloud Sharing" : "Sprístupnenie prostredníctvom Federated Cloud",
"Open documentation" : "Otvoriť dokumentáciu",
"Adjust how people can share between servers." : "Nastavte ako môžu ľudia medzi sebou zdieľať servery.",
diff --git a/apps/federatedfilesharing/l10n/sk.json b/apps/federatedfilesharing/l10n/sk.json
index 0bc24068a60..2263551d316 100644
--- a/apps/federatedfilesharing/l10n/sk.json
+++ b/apps/federatedfilesharing/l10n/sk.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID, viac na %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #Nextcloud Federated Cloud ID",
"Sharing" : "Sprístupnenie",
+ "Federated file sharing" : "Združené sprístupňovanie súborov",
"Federated Cloud Sharing" : "Sprístupnenie prostredníctvom Federated Cloud",
"Open documentation" : "Otvoriť dokumentáciu",
"Adjust how people can share between servers." : "Nastavte ako môžu ľudia medzi sebou zdieľať servery.",
diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js
index 95117b897d2..d2cee743295 100644
--- a/apps/federatedfilesharing/l10n/sv.js
+++ b/apps/federatedfilesharing/l10n/sv.js
@@ -38,6 +38,7 @@ OC.L10N.register(
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID, se %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID",
"Sharing" : "Delar",
+ "Federated file sharing" : "Federerad fildelning",
"Federated Cloud Sharing" : "Federerad Moln-delning",
"Open documentation" : "Öppna dokumentation",
"Adjust how people can share between servers." : "Justera hur användare kan dela genom servrar.",
diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json
index 2e64e36b1dc..61679494e33 100644
--- a/apps/federatedfilesharing/l10n/sv.json
+++ b/apps/federatedfilesharing/l10n/sv.json
@@ -36,6 +36,7 @@
"Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID, se %s",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud Federerade Moln-ID",
"Sharing" : "Delar",
+ "Federated file sharing" : "Federerad fildelning",
"Federated Cloud Sharing" : "Federerad Moln-delning",
"Open documentation" : "Öppna dokumentation",
"Adjust how people can share between servers." : "Justera hur användare kan dela genom servrar.",
diff --git a/apps/federation/appinfo/info.xml b/apps/federation/appinfo/info.xml
index c7fc2f2431a..e96c50479ae 100644
--- a/apps/federation/appinfo/info.xml
+++ b/apps/federation/appinfo/info.xml
@@ -1,30 +1,35 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>federation</id>
<name>Federation</name>
+ <summary>Federation allows you to connect with other trusted servers to exchange the user directory.</summary>
<description>Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.</description>
- <licence>AGPL</licence>
- <author>Bjoern Schiessle</author>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Bjoern Schiessle</author>
<namespace>Federation</namespace>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<default_enable/>
+
<types>
<authentication/>
</types>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Federation\SyncJob</job>
</background-jobs>
- <settings>
- <admin>OCA\Federation\Settings\Admin</admin>
- </settings>
-
<commands>
<command>OCA\Federation\Command\SyncFederationAddressBooks</command>
</commands>
+
+ <settings>
+ <admin>OCA\Federation\Settings\Admin</admin>
+ </settings>
</info>
diff --git a/apps/federation/l10n/hu.js b/apps/federation/l10n/hu.js
index 3050ffe0e69..70a86b87b27 100644
--- a/apps/federation/l10n/hu.js
+++ b/apps/federation/l10n/hu.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "A szerver már a megbízható szerverek közt van.",
"No server to federate with found" : "Nem található egyesíthető szerver",
"Could not add server" : "Nem lehet hozzáadni a szervert",
+ "Federation" : "Egyesítés",
"Trusted servers" : "Megbízható szerverek",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Az egyesítés lehetővé teszi a kapcsolódást más megbízható szerverekhez a felhasználói könyvtárak kicseréléséhez. Például ennek segítségével lesznek automatikusan kiegészítve a külső felhasználók az egyesített megosztáshoz.",
"Add server automatically once a federated share was created successfully" : "Szerver automatikus hozzáadása, ha az egyesített megosztás létrehozása sikeres",
diff --git a/apps/federation/l10n/hu.json b/apps/federation/l10n/hu.json
index 08db887b348..49c8d704a7f 100644
--- a/apps/federation/l10n/hu.json
+++ b/apps/federation/l10n/hu.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "A szerver már a megbízható szerverek közt van.",
"No server to federate with found" : "Nem található egyesíthető szerver",
"Could not add server" : "Nem lehet hozzáadni a szervert",
+ "Federation" : "Egyesítés",
"Trusted servers" : "Megbízható szerverek",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Az egyesítés lehetővé teszi a kapcsolódást más megbízható szerverekhez a felhasználói könyvtárak kicseréléséhez. Például ennek segítségével lesznek automatikusan kiegészítve a külső felhasználók az egyesített megosztáshoz.",
"Add server automatically once a federated share was created successfully" : "Szerver automatikus hozzáadása, ha az egyesített megosztás létrehozása sikeres",
diff --git a/apps/federation/l10n/nl.js b/apps/federation/l10n/nl.js
index fa714a8c718..b85a8f00876 100644
--- a/apps/federation/l10n/nl.js
+++ b/apps/federation/l10n/nl.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Server bestaat reeds in de lijst van vertrouwde servers.",
"No server to federate with found" : "Geen server gevonden om mee te federeren",
"Could not add server" : "Kon server niet toevoegen",
+ "Federation" : "Federatie",
"Trusted servers" : "Vertrouwde servers",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federatie maakt het mogelijk om te verbinden met vertrouwde servers en de gebuikersadministratie te delen. Zo kun je automatisch externe gebruikers toevoegen voor federatief delen.",
"Add server automatically once a federated share was created successfully" : "Voeg server automatisch toe zodra een gefedereerde share succesvol gecreëerd is",
diff --git a/apps/federation/l10n/nl.json b/apps/federation/l10n/nl.json
index 9d22b153f72..31ab6dcee21 100644
--- a/apps/federation/l10n/nl.json
+++ b/apps/federation/l10n/nl.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Server bestaat reeds in de lijst van vertrouwde servers.",
"No server to federate with found" : "Geen server gevonden om mee te federeren",
"Could not add server" : "Kon server niet toevoegen",
+ "Federation" : "Federatie",
"Trusted servers" : "Vertrouwde servers",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federatie maakt het mogelijk om te verbinden met vertrouwde servers en de gebuikersadministratie te delen. Zo kun je automatisch externe gebruikers toevoegen voor federatief delen.",
"Add server automatically once a federated share was created successfully" : "Voeg server automatisch toe zodra een gefedereerde share succesvol gecreëerd is",
diff --git a/apps/federation/l10n/ru.js b/apps/federation/l10n/ru.js
index 52ffdc0af95..d465c97ddfa 100644
--- a/apps/federation/l10n/ru.js
+++ b/apps/federation/l10n/ru.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Сервер уже есть в списке доверенных серверов.",
"No server to federate with found" : "Сервер для объединения не найден",
"Could not add server" : "Не удалось добавить сервер",
+ "Federation" : "Федерация",
"Trusted servers" : "Доверенные серверы",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Федерация серверов позволит Вам подключиться к другим доверенным серверам для обмена каталогами пользователей. Это будет использовано, например, для автодополнения имён пользователей при открытии федеративного общего доступа.",
"Add server automatically once a federated share was created successfully" : "Добавить сервер автоматически после успешного создания федеративного ресурса общего доступа",
diff --git a/apps/federation/l10n/ru.json b/apps/federation/l10n/ru.json
index 2470668f1f9..fbb14ff083f 100644
--- a/apps/federation/l10n/ru.json
+++ b/apps/federation/l10n/ru.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Сервер уже есть в списке доверенных серверов.",
"No server to federate with found" : "Сервер для объединения не найден",
"Could not add server" : "Не удалось добавить сервер",
+ "Federation" : "Федерация",
"Trusted servers" : "Доверенные серверы",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Федерация серверов позволит Вам подключиться к другим доверенным серверам для обмена каталогами пользователей. Это будет использовано, например, для автодополнения имён пользователей при открытии федеративного общего доступа.",
"Add server automatically once a federated share was created successfully" : "Добавить сервер автоматически после успешного создания федеративного ресурса общего доступа",
diff --git a/apps/federation/l10n/sk.js b/apps/federation/l10n/sk.js
index 4b82f2c9b60..7a842a3961a 100644
--- a/apps/federation/l10n/sk.js
+++ b/apps/federation/l10n/sk.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Server sa už nachádza v zozname dôveryhodných serverov",
"No server to federate with found" : "Server pre združenie sa nenašiel",
"Could not add server" : "Nebolo možné pridať server",
+ "Federation" : "Združovanie",
"Trusted servers" : "Dôveryhodné servery",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Združovanie vám umožňuje sa pripojiť k iným dôveryhodným serverom za účelom výmeny adresára používateľov. Používa sa to napr. pre automatické doplňovanie používateľov pri združenom zdieľaní.",
"Add server automatically once a federated share was created successfully" : "Pridať server automaticky akonáhle je úspešne vytvorené združené zdieľanie",
diff --git a/apps/federation/l10n/sk.json b/apps/federation/l10n/sk.json
index 48e06ce374f..16da9ab4022 100644
--- a/apps/federation/l10n/sk.json
+++ b/apps/federation/l10n/sk.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Server sa už nachádza v zozname dôveryhodných serverov",
"No server to federate with found" : "Server pre združenie sa nenašiel",
"Could not add server" : "Nebolo možné pridať server",
+ "Federation" : "Združovanie",
"Trusted servers" : "Dôveryhodné servery",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Združovanie vám umožňuje sa pripojiť k iným dôveryhodným serverom za účelom výmeny adresára používateľov. Používa sa to napr. pre automatické doplňovanie používateľov pri združenom zdieľaní.",
"Add server automatically once a federated share was created successfully" : "Pridať server automaticky akonáhle je úspešne vytvorené združené zdieľanie",
diff --git a/apps/federation/l10n/sv.js b/apps/federation/l10n/sv.js
index 676df6798da..eba25bbd93f 100644
--- a/apps/federation/l10n/sv.js
+++ b/apps/federation/l10n/sv.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Server is already in the list of trusted servers." : "Servern finns redan i listan",
"No server to federate with found" : "Ingen server att federera med hittades",
"Could not add server" : "Kunde inte lägga till server",
+ "Federation" : "Federation",
"Trusted servers" : "Betrodda servrar",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
"Add server automatically once a federated share was created successfully" : "Lägg till servern automatiskt så fort en lyckad federerad delning skapats",
diff --git a/apps/federation/l10n/sv.json b/apps/federation/l10n/sv.json
index 5e7379d9317..1f27bbe7303 100644
--- a/apps/federation/l10n/sv.json
+++ b/apps/federation/l10n/sv.json
@@ -3,6 +3,7 @@
"Server is already in the list of trusted servers." : "Servern finns redan i listan",
"No server to federate with found" : "Ingen server att federera med hittades",
"Could not add server" : "Kunde inte lägga till server",
+ "Federation" : "Federation",
"Trusted servers" : "Betrodda servrar",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
"Add server automatically once a federated share was created successfully" : "Lägg till servern automatiskt så fort en lyckad federerad delning skapats",
diff --git a/apps/federation/lib/BackgroundJob/GetSharedSecret.php b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
index 829e04ddb28..e5e30406f0d 100644
--- a/apps/federation/lib/BackgroundJob/GetSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/GetSharedSecret.php
@@ -31,7 +31,6 @@
namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
-use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Ring\Exception\RingException;
use OC\BackgroundJob\JobList;
diff --git a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
index ad7504da7ad..e165c24bdf2 100644
--- a/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
+++ b/apps/federation/lib/BackgroundJob/RequestSharedSecret.php
@@ -32,7 +32,6 @@ namespace OCA\Federation\BackgroundJob;
use GuzzleHttp\Exception\ClientException;
-use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Ring\Exception\RingException;
use OC\BackgroundJob\JobList;
diff --git a/apps/federation/lib/SyncJob.php b/apps/federation/lib/SyncJob.php
index 23255f2a441..258d0f2fc9c 100644
--- a/apps/federation/lib/SyncJob.php
+++ b/apps/federation/lib/SyncJob.php
@@ -24,7 +24,6 @@
namespace OCA\Federation;
use OC\BackgroundJob\TimedJob;
-use OCA\Federation\AppInfo\Application;
use OCP\ILogger;
class SyncJob extends TimedJob {
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml
index 1faf2c80adc..f5b43070cee 100644
--- a/apps/files/appinfo/info.xml
+++ b/apps/files/appinfo/info.xml
@@ -1,22 +1,43 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files</id>
<name>Files</name>
+ <summary>File Management</summary>
<description>File Management</description>
- <licence>AGPL</licence>
+ <version>1.9.0</version>
+ <licence>agpl</licence>
<author>Robin Appelman</author>
<author>Vincent Petry</author>
<default_enable/>
- <version>1.9.0</version>
<types>
<filesystem/>
</types>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-files</user>
</documentation>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
+
+ <background-jobs>
+ <job>OCA\Files\BackgroundJob\ScanFiles</job>
+ <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
+ <job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
+ </background-jobs>
+
+ <commands>
+ <command>OCA\Files\Command\Scan</command>
+ <command>OCA\Files\Command\DeleteOrphanedFiles</command>
+ <command>OCA\Files\Command\TransferOwnership</command>
+ <command>OCA\Files\Command\ScanAppData</command>
+ </commands>
+
+ <settings>
+ <admin>OCA\Files\Settings\Admin</admin>
+ </settings>
<activity>
<settings>
@@ -39,23 +60,6 @@
</providers>
</activity>
- <background-jobs>
- <job>OCA\Files\BackgroundJob\ScanFiles</job>
- <job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
- <job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
- </background-jobs>
-
- <settings>
- <admin>OCA\Files\Settings\Admin</admin>
- </settings>
-
- <commands>
- <command>OCA\Files\Command\Scan</command>
- <command>OCA\Files\Command\DeleteOrphanedFiles</command>
- <command>OCA\Files\Command\TransferOwnership</command>
- <command>OCA\Files\Command\ScanAppData</command>
- </commands>
-
<navigations>
<navigation>
<name>Files</name>
diff --git a/apps/files/download.php b/apps/files/download.php
index 60f386f50f0..2389c9b535e 100644
--- a/apps/files/download.php
+++ b/apps/files/download.php
@@ -41,7 +41,9 @@ $ftype=\OC::$server->getMimeTypeDetector()->getSecureMimeType(\OC\Files\Filesyst
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
-OCP\Response::disableCaching();
+header('Pragma: public');// enable caching in IE
+header('Expires: 0');
+header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
OCP\Response::setContentLengthHeader(\OC\Files\Filesystem::filesize($filename));
OC_Util::obEnd();
diff --git a/apps/files/img/change.png b/apps/files/img/change.png
index 9f64e60d565..ca77a8844f6 100644
--- a/apps/files/img/change.png
+++ b/apps/files/img/change.png
Binary files differ
diff --git a/apps/files/img/change.svg b/apps/files/img/change.svg
index b3404d2ef84..12071422b7f 100644
--- a/apps/files/img/change.svg
+++ b/apps/files/img/change.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"><path d="m8 0c-2.8557-3.771e-8 -5.4999 1.5269-6.9277 4l2.5976 1.5c0.8944-1.5491 2.5413-2.5 4.3301-2.5 1.5874 0 3.0628 0.74877 4 2l-2 2h6v-6l-1.875 1.875c-1.505-1.797-3.736-2.875-6.125-2.875z"/><path d="m0 9v6l1.877-1.877c1.4882 1.778 3.7559 2.857 6.123 2.877 2.8797 0.02436 5.4878-1.506 6.9277-4l-2.598-1.5c-0.902 1.562-2.5261 2.515-4.33 2.5-1.5737-0.013-3.0729-0.762-4-2l2-2z"/></svg>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" version="1.1" height="16"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index 2fb7dfba29f..a6d376aa2a9 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -625,12 +625,23 @@
this.registerAction({
name: 'MoveCopy',
- displayName: t('files', 'Move or copy'),
+ displayName: function(context) {
+ var permissions = context.fileInfoModel.attributes.permissions;
+ if (permissions & OC.PERMISSION_UPDATE) {
+ return t('files', 'Move or copy');
+ }
+ return t('files', 'Copy');
+ },
mime: 'all',
order: -25,
- permissions: OC.PERMISSION_UPDATE,
+ permissions: $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ,
iconClass: 'icon-external',
actionHandler: function (filename, context) {
+ var permissions = context.fileInfoModel.attributes.permissions;
+ var actions = OC.dialogs.FILEPICKER_TYPE_COPY;
+ if (permissions & OC.PERMISSION_UPDATE) {
+ actions = OC.dialogs.FILEPICKER_TYPE_COPY_MOVE;
+ }
OC.dialogs.filepicker(t('files', 'Target folder'), function(targetPath, type) {
if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
context.fileList.copy(filename, targetPath);
@@ -638,7 +649,7 @@
if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
context.fileList.move(filename, targetPath);
}
- }, false, "httpd/unix-directory", true, OC.dialogs.FILEPICKER_TYPE_COPY_MOVE);
+ }, false, "httpd/unix-directory", true, actions);
}
});
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 6fa57325bd4..e1a0491cdc8 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -798,6 +798,7 @@
OCA.Files.FileActions.updateFileActionSpinner(moveFileAction, false);
};
+ var actions = this.isSelectedMovable() ? OC.dialogs.FILEPICKER_TYPE_COPY_MOVE : OC.dialogs.FILEPICKER_TYPE_COPY;
OC.dialogs.filepicker(t('files', 'Target folder'), function(targetPath, type) {
if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
self.copy(files, targetPath, disableLoadingState);
@@ -805,7 +806,7 @@
if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
self.move(files, targetPath, disableLoadingState);
}
- }, false, "httpd/unix-directory", true, OC.dialogs.FILEPICKER_TYPE_COPY_MOVE);
+ }, false, "httpd/unix-directory", true, actions);
return false;
},
@@ -2875,18 +2876,39 @@
this.$el.find('#headerName a.name>span:first').text(selection);
this.$el.find('#modified a>span:first').text('');
this.$el.find('table').addClass('multiselect');
- this.$el.find('.selectedActions .copy-move').toggleClass('hidden', !this.isSelectedCopiableOrMovable());
this.$el.find('.selectedActions .download').toggleClass('hidden', !this.isSelectedDownloadable());
this.$el.find('.delete-selected').toggleClass('hidden', !this.isSelectedDeletable());
+
+ var $copyMove = this.$el.find('.selectedActions .copy-move');
+ if (this.isSelectedCopiable()) {
+ $copyMove.toggleClass('hidden', false);
+ if (this.isSelectedMovable()) {
+ $copyMove.find('.label').text(t('files', 'Move or copy'));
+ } else {
+ $copyMove.find('.label').text(t('files', 'Copy'));
+ }
+ } else {
+ $copyMove.toggleClass('hidden', true);
+ }
}
},
/**
- * Check whether all selected files are copiable or movable
+ * Check whether all selected files are copiable
+ */
+ isSelectedCopiable: function() {
+ return _.reduce(this.getSelectedFiles(), function(copiable, file) {
+ var requiredPermission = $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ;
+ return copiable && (file.permissions & requiredPermission);
+ }, true);
+ },
+
+ /**
+ * Check whether all selected files are movable
*/
- isSelectedCopiableOrMovable: function() {
- return _.reduce(this.getSelectedFiles(), function(copiableOrMovable, file) {
- return copiableOrMovable && (file.permissions & OC.PERMISSION_UPDATE);
+ isSelectedMovable: function() {
+ return _.reduce(this.getSelectedFiles(), function(movable, file) {
+ return movable && (file.permissions & OC.PERMISSION_UPDATE);
}, true);
},
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index d83d2ee3c95..ec3708417d8 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -1,8 +1,8 @@
OC.L10N.register(
"files",
{
- "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
- "Storage invalid" : "Almacenamiento inválido",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Storage invalid" : "Almacenamiento no válido",
"Unknown error" : "Error desconocido",
"All files" : "Todos los archivos",
"Recent" : "Reciente",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 212da33a515..f7982515bab 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
- "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
- "Storage invalid" : "Almacenamiento inválido",
+ "Storage is temporarily not available" : "El almacenamiento no está disponible temporalmente",
+ "Storage invalid" : "Almacenamiento no válido",
"Unknown error" : "Error desconocido",
"All files" : "Todos los archivos",
"Recent" : "Reciente",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 7629e273784..e7e754f5ead 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -16,7 +16,10 @@ OC.L10N.register(
"Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
"Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
"Not enough free space" : "十分な空き容量がありません",
+ "Uploading …" : "アップロード中...",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
"Actions" : "アクション",
"Download" : "ダウンロード",
"Rename" : "名前の変更",
@@ -56,8 +59,11 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "ここにファイルをアップロードもしくは作成する権限がありません",
"_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
"New" : "新規作成",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{used} used" : "{used} 使用中",
"\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
"File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
"\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はもうできません!",
"Your storage is full, files can not be updated or synced anymore!" : "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
@@ -73,6 +79,9 @@ OC.L10N.register(
"Favorite" : "お気に入り",
"New folder" : "新しいフォルダー",
"Upload file" : "ファイルをアップロード",
+ "Not favorited" : "お気に入りではありません",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
@@ -118,6 +127,8 @@ OC.L10N.register(
"Settings" : "設定",
"Show hidden files" : "隠しファイルを表示",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">WebDAV 経由でファイルにアクセス</a>するにはこのアドレスを利用してください",
+ "Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
@@ -132,6 +143,7 @@ OC.L10N.register(
"Tags" : "タグ",
"Deleted files" : "ゴミ箱",
"Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成"
+ "New text file.txt" : "新規のテキストファイル作成",
+ "Move" : "移動"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 1af3dbeb40b..a643d750f1c 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -14,7 +14,10 @@
"Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。",
"Target folder \"{dir}\" does not exist any more" : "対象フォルダー \"{dir}\" がもう存在しません",
"Not enough free space" : "十分な空き容量がありません",
+ "Uploading …" : "アップロード中...",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{totalSize} 中 {loadedSize} ({bitrate})",
+ "Target folder does not exist any more" : "対象フォルダーがもう存在しません",
"Actions" : "アクション",
"Download" : "ダウンロード",
"Rename" : "名前の変更",
@@ -54,8 +57,11 @@
"You don’t have permission to upload or create files here" : "ここにファイルをアップロードもしくは作成する権限がありません",
"_Uploading %n file_::_Uploading %n files_" : ["%n 個のファイルをアップロード中"],
"New" : "新規作成",
+ "{used} of {quota} used" : "{used} / {quota} 使用中",
+ "{used} used" : "{used} 使用中",
"\"{name}\" is an invalid file name." : "\"{name}\" は無効なファイル名です。",
"File name cannot be empty." : "ファイル名を空にすることはできません。",
+ "\"/\" is not allowed inside a file name." : "\"/\" はファイル名に利用できません。",
"\"{name}\" is not an allowed filetype" : "\"{name}\" は無効なファイル形式です",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} のストレージは一杯です。ファイルの更新と同期はもうできません!",
"Your storage is full, files can not be updated or synced anymore!" : "あなたのストレージは一杯です。ファイルの更新と同期はもうできません!",
@@ -71,6 +77,9 @@
"Favorite" : "お気に入り",
"New folder" : "新しいフォルダー",
"Upload file" : "ファイルをアップロード",
+ "Not favorited" : "お気に入りではありません",
+ "Remove from favorites" : "お気に入りから削除",
+ "Add to favorites" : "お気に入りに追加",
"An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました",
"Added to favorites" : "お気に入りに追加",
"Removed from favorites" : "お気に入りから削除",
@@ -116,6 +125,8 @@
"Settings" : "設定",
"Show hidden files" : "隠しファイルを表示",
"WebDAV" : "WebDAV",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\" rel=\"noreferrer noopener\">WebDAV 経由でファイルにアクセス</a>するにはこのアドレスを利用してください",
+ "Cancel upload" : "アップロードをキャンセル",
"No files in here" : "ファイルがありません",
"Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。",
"No entries found in this folder" : "このフォルダーにはエントリーがありません",
@@ -130,6 +141,7 @@
"Tags" : "タグ",
"Deleted files" : "ゴミ箱",
"Text file" : "テキストファイル",
- "New text file.txt" : "新規のテキストファイル作成"
+ "New text file.txt" : "新規のテキストファイル作成",
+ "Move" : "移動"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index e3e69bb3a84..a30e7272c5d 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -54,6 +54,7 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"New" : "Naujas",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nėra leidžiamas failo tipas",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index 6bb6ff51681..78aec5fd463 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -52,6 +52,7 @@
"You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus",
"_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"],
"New" : "Naujas",
+ "{used} of {quota} used" : "panaudota {used} iš {quota}",
"\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas bylos pavadinimas.",
"File name cannot be empty." : "Failo pavadinimas negali būti tuščias.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nėra leidžiamas failo tipas",
diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js
index 7c15a6bf95d..616c39fff8b 100644
--- a/apps/files/l10n/lv.js
+++ b/apps/files/l10n/lv.js
@@ -24,7 +24,7 @@ OC.L10N.register(
"Delete" : "Dzēst",
"Disconnect storage" : "Atvienot glabātuvi",
"Unshare" : "Pārtraukt koplietošanu",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par failu \"{file}\"",
+ "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
"Files" : "Datnes",
"Details" : "Detaļas",
"Select" : "Norādīt",
diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json
index ed2b04ac59d..cc8ecb6bb0d 100644
--- a/apps/files/l10n/lv.json
+++ b/apps/files/l10n/lv.json
@@ -22,7 +22,7 @@
"Delete" : "Dzēst",
"Disconnect storage" : "Atvienot glabātuvi",
"Unshare" : "Pārtraukt koplietošanu",
- "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par failu \"{file}\"",
+ "Could not load info for file \"{file}\"" : "Nevar ielādēt informāciju par datni \"{file}\"",
"Files" : "Datnes",
"Details" : "Detaļas",
"Select" : "Norādīt",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index aacae19af41..6adfb86aee1 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -147,6 +147,9 @@ OC.L10N.register(
"Deleted files" : "Verwijderde bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Move" : "Verplaatsen"
+ "Move" : "Verplaatsen",
+ "A new file or folder has been <strong>deleted</strong>" : "Een nieuw bestand of nieuwe map is <strong>verwijderd</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Een nieuw bestand of een nieuwe map is <strong>hersteld</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link om je <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bestanden via WebDAV te benaderen</a>"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index de059f16f08..ca422e8d07b 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -145,6 +145,9 @@
"Deleted files" : "Verwijderde bestanden",
"Text file" : "Tekstbestand",
"New text file.txt" : "Nieuw tekstbestand.txt",
- "Move" : "Verplaatsen"
+ "Move" : "Verplaatsen",
+ "A new file or folder has been <strong>deleted</strong>" : "Een nieuw bestand of nieuwe map is <strong>verwijderd</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Een nieuw bestand of een nieuwe map is <strong>hersteld</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Gebruik deze link om je <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">bestanden via WebDAV te benaderen</a>"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index feb43aced76..ffa95f4b93c 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -17,8 +17,10 @@ OC.L10N.register(
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
"Not enough free space" : "Espaço insuficiente",
"Uploading …" : "A carregar ...",
+ "…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {estado}",
"Actions" : "Ações",
"Download" : "Transferir",
"Rename" : "Renomear",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 97d4308cab4..31ecc0ef67d 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -15,8 +15,10 @@
"Target folder \"{dir}\" does not exist any more" : "A pasta de destino \"{dir}\" já não existe",
"Not enough free space" : "Espaço insuficiente",
"Uploading …" : "A carregar ...",
+ "…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Target folder does not exist any more" : "A pasta de destino já não existe",
+ "Error when assembling chunks, status code {status}" : "Erro ao agregar partições, código de estado: {estado}",
"Actions" : "Ações",
"Download" : "Transferir",
"Rename" : "Renomear",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index d4bce72110e..5f4912587b7 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -81,7 +81,7 @@ OC.L10N.register(
"Favorited" : "Избранное",
"Favorite" : "Добавить в избранное",
"New folder" : "Новый каталог",
- "Upload file" : "Зарузить файл",
+ "Upload file" : "Загрузить файл",
"Not favorited" : "Не избранное",
"Remove from favorites" : "Удалить из избранных",
"Add to favorites" : "Добавить в избранное",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 705a2a75c7c..65cc92c052e 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -79,7 +79,7 @@
"Favorited" : "Избранное",
"Favorite" : "Добавить в избранное",
"New folder" : "Новый каталог",
- "Upload file" : "Зарузить файл",
+ "Upload file" : "Загрузить файл",
"Not favorited" : "Не избранное",
"Remove from favorites" : "Удалить из избранных",
"Add to favorites" : "Добавить в избранное",
diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js
index 89da1860307..c609ee92197 100644
--- a/apps/files/l10n/sk.js
+++ b/apps/files/l10n/sk.js
@@ -20,6 +20,7 @@ OC.L10N.register(
"…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
"Rename" : "Premenovať",
@@ -65,6 +66,7 @@ OC.L10N.register(
"{used} used" : "{used} použitých",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
@@ -144,6 +146,10 @@ OC.L10N.register(
"Tags" : "Štítky",
"Deleted files" : "Zmazané súbory",
"Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt"
+ "New text file.txt" : "Nový text file.txt",
+ "Move" : "Presunúť",
+ "A new file or folder has been <strong>deleted</strong>" : "Nový súbor alebo priečinok bol <strong>zmazaný</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Nový súbor alebo priečinok bol<strong>obnovený</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použi túto adresu pre <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">prístup ku svojím súborom cez WebDAV</a>"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json
index 7e764476c8b..59d387b91b1 100644
--- a/apps/files/l10n/sk.json
+++ b/apps/files/l10n/sk.json
@@ -18,6 +18,7 @@
"…" : "...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} z {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Cieľový priečinok už neexistuje",
+ "Error when assembling chunks, status code {status}" : "Chyba pri zostavovaní kusov, kód chyby {status}",
"Actions" : "Akcie",
"Download" : "Sťahovanie",
"Rename" : "Premenovať",
@@ -63,6 +64,7 @@
"{used} used" : "{used} použitých",
"\"{name}\" is an invalid file name." : "\"{name}\" je neplatné meno súboru.",
"File name cannot be empty." : "Meno súboru nemôže byť prázdne",
+ "\"/\" is not allowed inside a file name." : "Znak \"/\" nie je povolený v názve súboru.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" nie je povolený typ súboru",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Úložisko používateľa {owner} je plné, súbory sa viac nedajú aktualizovať ani synchronizovať.",
"Your storage is full, files can not be updated or synced anymore!" : "Vaše úložisko je plné. Súbory nemožno aktualizovať ani synchronizovať!",
@@ -142,6 +144,10 @@
"Tags" : "Štítky",
"Deleted files" : "Zmazané súbory",
"Text file" : "Textový súbor",
- "New text file.txt" : "Nový text file.txt"
+ "New text file.txt" : "Nový text file.txt",
+ "Move" : "Presunúť",
+ "A new file or folder has been <strong>deleted</strong>" : "Nový súbor alebo priečinok bol <strong>zmazaný</strong>",
+ "A new file or folder has been <strong>restored</strong>" : "Nový súbor alebo priečinok bol<strong>obnovený</strong>",
+ "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Použi túto adresu pre <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">prístup ku svojím súborom cez WebDAV</a>"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index 8bfc3c23027..c893216a3bf 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -62,8 +62,11 @@ OC.L10N.register(
"You don’t have permission to upload or create files here" : "Du har ej tillåtelse att ladda upp eller skapa filer här",
"_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
"New" : "Ny",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{used} used" : "{used} använt",
"\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
"File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
"Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index a33455084d9..24586c07bbf 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -60,8 +60,11 @@
"You don’t have permission to upload or create files here" : "Du har ej tillåtelse att ladda upp eller skapa filer här",
"_Uploading %n file_::_Uploading %n files_" : ["Laddar upp %n fil","Laddar upp %n filer"],
"New" : "Ny",
+ "{used} of {quota} used" : "{used} av {quota} använt",
+ "{used} used" : "{used} använt",
"\"{name}\" is an invalid file name." : "\"{name}\" är ett ogiltigt filnamn.",
"File name cannot be empty." : "Filnamn kan inte vara tomt.",
+ "\"/\" is not allowed inside a file name." : "\"/\" är inte tillåtet i ett filnamn.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" är inte en tillåten filtyp",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Lagring av {owner} är full, filer kan inte uppdateras eller synkroniseras längre!",
"Your storage is full, files can not be updated or synced anymore!" : "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 66766641618..f1e0d376991 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -17,7 +17,7 @@ OC.L10N.register(
"Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
"Not enough free space" : "可用空间不足",
"Uploading …" : "上传中…",
- "…" : "undefined",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
"Target folder does not exist any more" : "目标文件夹不存在",
"Actions" : "操作",
@@ -124,7 +124,7 @@ OC.L10N.register(
"Save" : "保存",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
"Missing permissions to edit from here." : "没有权限编辑",
- "%s of %s used" : " %s 的%s 已使用",
+ "%s of %s used" : "%s 已使用 (共 %s)",
"%s used" : "%s 已使用",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
@@ -144,6 +144,7 @@ OC.L10N.register(
"Tags" : "标签",
"Deleted files" : "已删除的文件",
"Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt"
+ "New text file.txt" : "新建文本文件.txt",
+ "Move" : "移动"
},
"nplurals=1; plural=0;");
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 17f074d5faf..f2396a979ec 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -15,7 +15,7 @@
"Target folder \"{dir}\" does not exist any more" : "目标目录 \"{dir}\" 不存在",
"Not enough free space" : "可用空间不足",
"Uploading …" : "上传中…",
- "…" : "undefined",
+ "…" : "…",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} / {totalSize} ({bitrate})",
"Target folder does not exist any more" : "目标文件夹不存在",
"Actions" : "操作",
@@ -122,7 +122,7 @@
"Save" : "保存",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效.",
"Missing permissions to edit from here." : "没有权限编辑",
- "%s of %s used" : " %s 的%s 已使用",
+ "%s of %s used" : "%s 已使用 (共 %s)",
"%s used" : "%s 已使用",
"Settings" : "设置",
"Show hidden files" : "显示隐藏文件",
@@ -142,6 +142,7 @@
"Tags" : "标签",
"Deleted files" : "已删除的文件",
"Text file" : "文本文件",
- "New text file.txt" : "创建文本文件 .txt"
+ "New text file.txt" : "新建文本文件.txt",
+ "Move" : "移动"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php
index fd5423c334f..e6b1e54d389 100644
--- a/apps/files/templates/list.php
+++ b/apps/files/templates/list.php
@@ -53,7 +53,7 @@
<span id="selectedActionsList" class="selectedActions">
<a href="" class="copy-move">
<span class="icon icon-external"></span>
- <span><?php p($l->t('Move or copy'))?></span>
+ <span class="label"><?php p($l->t('Move or copy'))?></span>
</a>
<a href="" class="download">
<span class="icon icon-download"></span>
diff --git a/apps/files/tests/js/fileactionsmenuSpec.js b/apps/files/tests/js/fileactionsmenuSpec.js
index 926516b3043..c678d166153 100644
--- a/apps/files/tests/js/fileactionsmenuSpec.js
+++ b/apps/files/tests/js/fileactionsmenuSpec.js
@@ -271,6 +271,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: fileList.getCurrentDirectory()
};
menu = new OCA.Files.FileActionsMenu();
@@ -304,6 +305,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: '/anotherpath/there'
};
menu = new OCA.Files.FileActionsMenu();
@@ -336,6 +338,7 @@ describe('OCA.Files.FileActionsMenu tests', function() {
$file: $tr,
fileList: fileList,
fileActions: fileActions,
+ fileInfoModel: new OCA.Files.FileInfoModel(fileData),
dir: '/somepath/dir'
};
menu = new OCA.Files.FileActionsMenu();
diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js
index 08da15b8a88..1b26a468172 100644
--- a/apps/files/tests/js/filelistSpec.js
+++ b/apps/files/tests/js/filelistSpec.js
@@ -94,7 +94,7 @@ describe('OCA.Files.FileList tests', function() {
'<input type="checkbox" id="select_all_files" class="select-all checkbox">' +
'<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' +
'<span id="selectedActionsList" class="selectedActions hidden">' +
- '<a href class="copy-move">Move or copy</a>' +
+ '<a href class="copy-move"><span class="label">Move or copy</span></a>' +
'<a href class="download"><img src="actions/download.svg">Download</a>' +
'<a href class="delete-selected">Delete</a></span>' +
'</th>' +
@@ -2101,10 +2101,17 @@ describe('OCA.Files.FileList tests', function() {
$('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_UPDATE);
$('.select-all').click();
expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(false);
+ expect(fileList.$el.find('.selectedActions .copy-move .label').text()).toEqual('Move or copy');
testFiles[0].permissions = OC.PERMISSION_READ;
$('.select-all').click();
fileList.setFiles(testFiles);
$('.select-all').click();
+ expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(false);
+ expect(fileList.$el.find('.selectedActions .copy-move .label').text()).toEqual('Copy');
+ testFiles[0].permissions = OC.PERMISSION_NONE;
+ $('.select-all').click();
+ fileList.setFiles(testFiles);
+ $('.select-all').click();
expect(fileList.$el.find('.selectedActions .copy-move').hasClass('hidden')).toEqual(true);
});
it('show doesnt show the download action if one or more files are not downloadable', function () {
diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml
index a924c32ba25..795c63a60f0 100644
--- a/apps/files_external/appinfo/info.xml
+++ b/apps/files_external/appinfo/info.xml
@@ -1,38 +1,36 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_external</id>
<name>External storage support</name>
+ <summary>Adds basic external storage support</summary>
<description>
This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.
External storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.5.0</version>
+ <licence>agpl</licence>
<author>Robin Appelman</author>
<author>Michael Gapczynski</author>
<author>Vincent Petry</author>
- <documentation>
- <admin>admin-external-storage</admin>
- </documentation>
- <version>1.5.0</version>
+ <namespace>Files_External</namespace>
+
<types>
<filesystem/>
</types>
- <ocsid>166048</ocsid>
- <namespace>Files_External</namespace>
+ <documentation>
+ <admin>admin-external-storage</admin>
+ </documentation>
+ <category>files</category>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <settings>
- <admin>OCA\Files_External\Settings\Admin</admin>
- <admin-section>OCA\Files_External\Settings\Section</admin-section>
- <personal>OCA\Files_External\Settings\Personal</personal>
- <personal-section>OCA\Files_External\Settings\PersonalSection</personal-section>
- </settings>
-
<commands>
<command>OCA\Files_External\Command\ListCommand</command>
<command>OCA\Files_External\Command\Config</command>
@@ -46,4 +44,11 @@ External storage can be configured using the GUI or at the command line. This se
<command>OCA\Files_External\Command\Verify</command>
<command>OCA\Files_External\Command\Notify</command>
</commands>
+
+ <settings>
+ <admin>OCA\Files_External\Settings\Admin</admin>
+ <admin-section>OCA\Files_External\Settings\Section</admin-section>
+ <personal>OCA\Files_External\Settings\Personal</personal>
+ <personal-section>OCA\Files_External\Settings\PersonalSection</personal-section>
+ </settings>
</info>
diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js
index cb9b7ad6822..12ad285c52b 100644
--- a/apps/files_external/js/settings.js
+++ b/apps/files_external/js/settings.js
@@ -960,6 +960,7 @@ MountConfigListView.prototype = _.extend({
if (result.length === 0 && mainForm.attr('data-can-create') === 'false') {
mainForm.hide();
$('a[href="#external-storage"]').parent().hide();
+ $('#emptycontent').show();
}
onCompletion.resolve();
}
diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js
index 294c3f38b53..28d44e12b6d 100644
--- a/apps/files_external/l10n/ast.js
+++ b/apps/files_external/l10n/ast.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Error generating key pair" : "Fallu xenerando'l par de claves",
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
+ "Delete storage?" : "¿Desaniciar almacenamientu?",
"Saved" : "Guardáu",
"Saving..." : "Guardando...",
"Save" : "Guardar",
diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json
index 1f30910b745..7898a38e01d 100644
--- a/apps/files_external/l10n/ast.json
+++ b/apps/files_external/l10n/ast.json
@@ -9,6 +9,7 @@
"Error generating key pair" : "Fallu xenerando'l par de claves",
"All users. Type to select user or group." : "Tolos usuarios. Escribe pa seleccionar usuariu o grupu.",
"(group)" : "(grupu)",
+ "Delete storage?" : "¿Desaniciar almacenamientu?",
"Saved" : "Guardáu",
"Saving..." : "Guardando...",
"Save" : "Guardar",
diff --git a/apps/files_external/l10n/hu.js b/apps/files_external/l10n/hu.js
index ce9b36cc0f4..c9f112fd8f5 100644
--- a/apps/files_external/l10n/hu.js
+++ b/apps/files_external/l10n/hu.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
+ "External storage support" : "Külső tároló támogatás",
"No external storage configured" : "Nincs külső tároló beállítva.",
"You can add external storages in the personal settings" : "Hozzáadhatsz külső tárolókat a személyes beállítások közt.",
"Name" : "Név",
diff --git a/apps/files_external/l10n/hu.json b/apps/files_external/l10n/hu.json
index 67ce98c0fc6..c4de7b558af 100644
--- a/apps/files_external/l10n/hu.json
+++ b/apps/files_external/l10n/hu.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.",
+ "External storage support" : "Külső tároló támogatás",
"No external storage configured" : "Nincs külső tároló beállítva.",
"You can add external storages in the personal settings" : "Hozzáadhatsz külső tárolókat a személyes beállítások közt.",
"Name" : "Név",
diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js
index 4cb446d6305..fc9ceed9ca5 100644
--- a/apps/files_external/l10n/ja.js
+++ b/apps/files_external/l10n/ja.js
@@ -75,6 +75,7 @@ OC.L10N.register(
"Region" : "リージョン",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
+ "Legacy (v2) authentication" : "レガシー認証(v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "リモートサブフォルダー",
@@ -99,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
+ "External storage support" : "外部ストレージのサポート",
"No external storage configured" : "外部ストレージは設定されていません",
"You can add external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。",
"Name" : "名前",
@@ -119,6 +121,14 @@ OC.L10N.register(
"Advanced settings" : "詳細設定",
"Delete" : "削除",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
- "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
+ "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "リクエストトークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "アクセストークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s",
+ "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s",
+ "Dropbox App Configuration" : "Dropbox アプリ設定",
+ "Google Drive App Configuration" : "Google アプリ設定",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json
index cb5e680a8b4..ed1d339368d 100644
--- a/apps/files_external/l10n/ja.json
+++ b/apps/files_external/l10n/ja.json
@@ -73,6 +73,7 @@
"Region" : "リージョン",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
+ "Legacy (v2) authentication" : "レガシー認証(v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "リモートサブフォルダー",
@@ -97,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。",
+ "External storage support" : "外部ストレージのサポート",
"No external storage configured" : "外部ストレージは設定されていません",
"You can add external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。",
"Name" : "名前",
@@ -117,6 +119,14 @@
"Advanced settings" : "詳細設定",
"Delete" : "削除",
"Allow users to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
- "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する"
+ "Allow users to mount the following external storage" : "ユーザーに以下の外部ストレージのマウントを許可する",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "リクエストトークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "アクセストークンの取得に失敗しました。アプリのキーとパスワードが正しいことを確認してください。",
+ "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s",
+ "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s",
+ "Dropbox App Configuration" : "Dropbox アプリ設定",
+ "Google Drive App Configuration" : "Google アプリ設定",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js
index 9d91f42aa6b..8095903e1e3 100644
--- a/apps/files_external/l10n/nl.js
+++ b/apps/files_external/l10n/nl.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.",
+ "External storage support" : "Externe opslag ondersteuning",
"No external storage configured" : "Geen externe opslag geconfigureerd",
"You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen",
"Name" : "Naam",
@@ -121,6 +122,12 @@ OC.L10N.register(
"Delete" : "Verwijder",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de aanvraag token is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de toegangstoken is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Step 1 failed. Exception: %s" : "Stap 1 mislukt. Uitzondering: %s",
+ "Step 2 failed. Exception: %s" : "Stap 2 mislukt. Uitzondering: %s",
+ "Dropbox App Configuration" : "Dropbox App Configuratie",
+ "Google Drive App Configuration" : "Google Drive App Configuratie",
"Dropbox" : "Dropbox",
"Google Drive" : "Google Drive"
},
diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json
index d66ad379696..0582c01052c 100644
--- a/apps/files_external/l10n/nl.json
+++ b/apps/files_external/l10n/nl.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.",
+ "External storage support" : "Externe opslag ondersteuning",
"No external storage configured" : "Geen externe opslag geconfigureerd",
"You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen",
"Name" : "Naam",
@@ -119,6 +120,12 @@
"Delete" : "Verwijder",
"Allow users to mount external storage" : "Sta gebruikers toe om een externe opslag aan te koppelen",
"Allow users to mount the following external storage" : "Sta gebruikers toe de volgende externe opslag aan te koppelen",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de aanvraag token is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Binnenhalen van de toegangstoken is mislukt. Controleer dat je app sleutel en geheim correct zijn.",
+ "Step 1 failed. Exception: %s" : "Stap 1 mislukt. Uitzondering: %s",
+ "Step 2 failed. Exception: %s" : "Stap 2 mislukt. Uitzondering: %s",
+ "Dropbox App Configuration" : "Dropbox App Configuratie",
+ "Google Drive App Configuration" : "Google Drive App Configuratie",
"Dropbox" : "Dropbox",
"Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js
index 5f119553b57..a81b857eba5 100644
--- a/apps/files_external/l10n/pt_PT.js
+++ b/apps/files_external/l10n/pt_PT.js
@@ -14,13 +14,19 @@ OC.L10N.register(
"(group)" : "(grupo)",
"Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação NFD Mac (lenta)",
"Admin defined" : "Administrador definido",
+ "Are you sure you want to delete this external storage" : "De certeza que quer apagar este armazenamento externo",
+ "Delete storage?" : "Apagar armazenamento?",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
"Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
+ "Couldn't access. Please log out and in again to activate this mount point" : "Não foi possível aceder. Por favor faça logout e volte-se a autenticar para activar este ponto de montagem.",
+ "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter informação do servidor remoto: {código}{tipo}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
"external-storage" : "armazenamento externo",
+ "Couldn't fetch list of Windows network drive mount points: Empty response from server" : "Não fo possível obter lista de pontos de montagem de rede Windows: Resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
"Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
"Username" : "Nome de utilizador",
@@ -28,6 +34,7 @@ OC.L10N.register(
"Credentials saved" : "Credenciais guardadas",
"Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
+ "Storage with ID \"%d\" not found" : "Armazenamento com ID \"%d\" não encontrado",
"Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos",
"Invalid mount point" : "Ponto de montagem inválido",
"Objectstore forbidden" : "Objectstore proibido",
@@ -38,6 +45,7 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos",
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
+ "Storage with ID \"%d\" is not user editable" : "Armazenamento com ID \"%d\" não é evitável por utilizadores",
"Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -53,8 +61,11 @@ OC.L10N.register(
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global credentials" : "Credenciais globais",
+ "Log-in credentials, save in database" : "Credenciais de Log-in, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
+ "User entered, store in database" : "Inseridos pelo utilizador, armazenar na base de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -64,6 +75,7 @@ OC.L10N.register(
"Region" : "Região",
"Enable SSL" : "Ativar SSL",
"Enable Path Style" : "Ativar Estilo do Caminho",
+ "Legacy (v2) authentication" : "Autenticação obsoleta (v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Subpasta remota ",
@@ -73,6 +85,7 @@ OC.L10N.register(
"Secure ftps://" : "ftps:// Seguro",
"Local" : "Local",
"Location" : "Localização:",
+ "Nextcloud" : "Nextcloud",
"SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP com login por chave secreta",
@@ -84,6 +97,10 @@ OC.L10N.register(
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
"Request timeout (seconds)" : "Pedido expira (segundos)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte cURL em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporteF TP em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Não é possível montar %s. Por favor peça ao seu administrador que o instale.",
+ "External storage support" : "Suporte para armazenamento externo",
"No external storage configured" : "Sem armazenamentos externos configurados",
"You can add external storages in the personal settings" : "Pode adicionar armazenamentos externos nas definições pessoais",
"Name" : "Nome",
@@ -104,6 +121,14 @@ OC.L10N.register(
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
"Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo",
- "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
+ "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de pedido. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de acesso. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Step 1 failed. Exception: %s" : "Passo 1 falhou. Excepção: %s",
+ "Step 2 failed. Exception: %s" : "Passo 2 falhou. Excepção: %s",
+ "Dropbox App Configuration" : "configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json
index 88600ac5eaf..4efae622222 100644
--- a/apps/files_external/l10n/pt_PT.json
+++ b/apps/files_external/l10n/pt_PT.json
@@ -12,13 +12,19 @@
"(group)" : "(grupo)",
"Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação NFD Mac (lenta)",
"Admin defined" : "Administrador definido",
+ "Are you sure you want to delete this external storage" : "De certeza que quer apagar este armazenamento externo",
+ "Delete storage?" : "Apagar armazenamento?",
"Saved" : "Guardado",
+ "Saving..." : "A guardar...",
"Save" : "Guardar",
"Empty response from the server" : "Resposta vazia a partir do servidor",
+ "Couldn't access. Please log out and in again to activate this mount point" : "Não foi possível aceder. Por favor faça logout e volte-se a autenticar para activar este ponto de montagem.",
+ "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter informação do servidor remoto: {código}{tipo}",
"Couldn't get the list of external mount points: {type}" : "Não foi possível conseguir a lista de pontos de montagem externos: {type}",
"There was an error with message: " : "Houve um erro com a mensagem:",
"External mount error" : "Erro de montagem externa",
"external-storage" : "armazenamento externo",
+ "Couldn't fetch list of Windows network drive mount points: Empty response from server" : "Não fo possível obter lista de pontos de montagem de rede Windows: Resposta vazia do servidor",
"Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Por favor, clique na fila vermelha para mais informação",
"Please enter the credentials for the {mount} mount" : "Por favor, introduza as credenciais para {mount}",
"Username" : "Nome de utilizador",
@@ -26,6 +32,7 @@
"Credentials saved" : "Credenciais guardadas",
"Credentials saving failed" : "Falha ao guardar as credenciais",
"Credentials required" : "Credenciais necessárias",
+ "Storage with ID \"%d\" not found" : "Armazenamento com ID \"%d\" não encontrado",
"Invalid backend or authentication mechanism class" : "Parâmetros do mecanismo de autenticação inválidos",
"Invalid mount point" : "Ponto de montagem inválido",
"Objectstore forbidden" : "Objectstore proibido",
@@ -36,6 +43,7 @@
"Unsatisfied authentication mechanism parameters" : "Parâmetros do mecanismo de autenticação inválidos",
"Insufficient data: %s" : "Dados insuficientes: %s",
"%s" : "%s",
+ "Storage with ID \"%d\" is not user editable" : "Armazenamento com ID \"%d\" não é evitável por utilizadores",
"Access key" : "Chave de acesso",
"Secret key" : "Código secreto",
"Builtin" : "Integrado",
@@ -51,8 +59,11 @@
"Identity endpoint URL" : "Identidade URL endpoint",
"Rackspace" : "Rackspace",
"API key" : "Chave API",
+ "Global credentials" : "Credenciais globais",
+ "Log-in credentials, save in database" : "Credenciais de Log-in, guardar na base de dados",
"Username and password" : "Nome de utilizador e palavra-passe",
"Log-in credentials, save in session" : "Credenciais de login, guardar na sessão",
+ "User entered, store in database" : "Inseridos pelo utilizador, armazenar na base de dados",
"RSA public key" : "Chave pública RSA",
"Public key" : "Chave pública",
"Amazon S3" : "Amazon S3",
@@ -62,6 +73,7 @@
"Region" : "Região",
"Enable SSL" : "Ativar SSL",
"Enable Path Style" : "Ativar Estilo do Caminho",
+ "Legacy (v2) authentication" : "Autenticação obsoleta (v2)",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Subpasta remota ",
@@ -71,6 +83,7 @@
"Secure ftps://" : "ftps:// Seguro",
"Local" : "Local",
"Location" : "Localização:",
+ "Nextcloud" : "Nextcloud",
"SFTP" : "SFTP",
"Root" : "Root",
"SFTP with secret key login" : "SFTP com login por chave secreta",
@@ -82,6 +95,10 @@
"OpenStack Object Storage" : "Armazenamento de Objetos OpenStack",
"Service name" : "Nome do serviço",
"Request timeout (seconds)" : "Pedido expira (segundos)",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte cURL em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporteF TP em PHP não está activo ou instalado. Não é possível montar %s. Por favor peça ao seu administrador de sistema que o instale.",
+ "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Não é possível montar %s. Por favor peça ao seu administrador que o instale.",
+ "External storage support" : "Suporte para armazenamento externo",
"No external storage configured" : "Sem armazenamentos externos configurados",
"You can add external storages in the personal settings" : "Pode adicionar armazenamentos externos nas definições pessoais",
"Name" : "Nome",
@@ -102,6 +119,14 @@
"Advanced settings" : "Definições avançadas",
"Delete" : "Apagar",
"Allow users to mount external storage" : "Permitir que os utilizadores montem armazenamento externo",
- "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo"
+ "Allow users to mount the following external storage" : "Permitir que os utilizadores montem o seguinte armazenamento externo",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de pedido. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Fetching access tokens failed. Verify that your app key and secret are correct." : "Falhou a obter tokens de acesso. Verifique se a sua chave de aplicação e segredo estão correctos.",
+ "Step 1 failed. Exception: %s" : "Passo 1 falhou. Excepção: %s",
+ "Step 2 failed. Exception: %s" : "Passo 2 falhou. Excepção: %s",
+ "Dropbox App Configuration" : "configuração da aplicação Dropbox",
+ "Google Drive App Configuration" : "Configuração da aplicação Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js
index 90ad73d8e31..db9bfd567a8 100644
--- a/apps/files_external/l10n/ru.js
+++ b/apps/files_external/l10n/ru.js
@@ -100,6 +100,7 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "«%s» не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
+ "External storage support" : "Поддержка внешних хранилищ",
"No external storage configured" : "Внешние хранилища не настроены",
"You can add external storages in the personal settings" : "Вы можете добавить внешние хранилища в личных настройках",
"Name" : "Имя",
@@ -120,6 +121,11 @@ OC.L10N.register(
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
- "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
+ "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.",
+ "Dropbox App Configuration" : "Настройка приложения Dropbox",
+ "Google Drive App Configuration" : "Настройка приложения Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json
index f0eb6d1e231..5ffee5598ed 100644
--- a/apps/files_external/l10n/ru.json
+++ b/apps/files_external/l10n/ru.json
@@ -98,6 +98,7 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
"\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "«%s» не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.",
+ "External storage support" : "Поддержка внешних хранилищ",
"No external storage configured" : "Внешние хранилища не настроены",
"You can add external storages in the personal settings" : "Вы можете добавить внешние хранилища в личных настройках",
"Name" : "Имя",
@@ -118,6 +119,11 @@
"Advanced settings" : "Расширенные настройки",
"Delete" : "Удалить",
"Allow users to mount external storage" : "Разрешить пользователями монтировать внешние накопители",
- "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных"
+ "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных",
+ "Fetching request tokens failed. Verify that your app key and secret are correct." : "Ошибка получения токенов запроса. Проверьте корректность ключа и секрета приложения.",
+ "Dropbox App Configuration" : "Настройка приложения Dropbox",
+ "Google Drive App Configuration" : "Настройка приложения Google Drive",
+ "Dropbox" : "Dropbox",
+ "Google Drive" : "Google Drive"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_external/lib/AppInfo/Application.php b/apps/files_external/lib/AppInfo/Application.php
index e32828fbf4e..f312e065114 100644
--- a/apps/files_external/lib/AppInfo/Application.php
+++ b/apps/files_external/lib/AppInfo/Application.php
@@ -31,13 +31,13 @@ namespace OCA\Files_External\AppInfo;
use \OCP\AppFramework\App;
use OCP\AppFramework\IAppContainer;
-use \OCP\IContainer;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Config\IBackendProvider;
use \OCA\Files_External\Lib\Config\IAuthMechanismProvider;
use OCA\Files_External\Lib\Auth\AmazonS3\AccessKey;
use OCA\Files_External\Lib\Auth\OpenStack\Rackspace;
-use OCA\Files_External\Lib\Auth\OpenStack\OpenStack;
+use OCA\Files_External\Lib\Auth\OpenStack\OpenStackV2;
+use OCA\Files_External\Lib\Auth\OpenStack\OpenStackV3;
use OCA\Files_External\Lib\Auth\PublicKey\RSA;
use OCA\Files_External\Lib\Auth\OAuth2\OAuth2;
use OCA\Files_External\Lib\Auth\OAuth1\OAuth1;
@@ -140,7 +140,8 @@ class Application extends App implements IBackendProvider, IAuthMechanismProvide
$container->query(RSA::class),
// AuthMechanism::SCHEME_OPENSTACK mechanisms
- $container->query(OpenStack::class),
+ $container->query(OpenStackV2::class),
+ $container->query(OpenStackV3::class),
$container->query(Rackspace::class),
// Specialized mechanisms
diff --git a/apps/files_external/lib/Config/ConfigAdapter.php b/apps/files_external/lib/Config/ConfigAdapter.php
index efeb3d75586..34e96df0441 100644
--- a/apps/files_external/lib/Config/ConfigAdapter.php
+++ b/apps/files_external/lib/Config/ConfigAdapter.php
@@ -168,7 +168,7 @@ class ConfigAdapter implements IMountProvider {
$storageConfig->getMountOptions()
);
} else {
- return new MountPoint(
+ return new ExternalMountPoint(
$storage,
'/' . $user->getUID() . '/files' . $storageConfig->getMountPoint(),
null,
diff --git a/apps/files_external/lib/Controller/AjaxController.php b/apps/files_external/lib/Controller/AjaxController.php
index 66cbcae3e8f..6404fb9de51 100644
--- a/apps/files_external/lib/Controller/AjaxController.php
+++ b/apps/files_external/lib/Controller/AjaxController.php
@@ -30,8 +30,6 @@ namespace OCA\Files_External\Controller;
use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCP\AppFramework\Controller;
-use OCP\AppFramework\Http;
-use OCP\AppFramework\Http\Response;
use OCP\IGroupManager;
use OCP\IRequest;
use OCP\AppFramework\Http\JSONResponse;
diff --git a/apps/files_external/lib/Lib/Auth/OpenStack/OpenStack.php b/apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV2.php
index ca1e0a08ae9..f25918561f8 100644
--- a/apps/files_external/lib/Lib/Auth/OpenStack/OpenStack.php
+++ b/apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV2.php
@@ -29,13 +29,13 @@ use \OCA\Files_External\Lib\Auth\AuthMechanism;
/**
* OpenStack Keystone authentication
*/
-class OpenStack extends AuthMechanism {
+class OpenStackV2 extends AuthMechanism {
public function __construct(IL10N $l) {
$this
->setIdentifier('openstack::openstack')
->setScheme(self::SCHEME_OPENSTACK)
- ->setText($l->t('OpenStack'))
+ ->setText($l->t('OpenStack v2'))
->addParameters([
new DefinitionParameter('user', $l->t('Username')),
(new DefinitionParameter('password', $l->t('Password')))
diff --git a/apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV3.php b/apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV3.php
new file mode 100644
index 00000000000..ead790e0ab5
--- /dev/null
+++ b/apps/files_external/lib/Lib/Auth/OpenStack/OpenStackV3.php
@@ -0,0 +1,49 @@
+<?php
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files_External\Lib\Auth\OpenStack;
+
+use \OCP\IL10N;
+use \OCA\Files_External\Lib\DefinitionParameter;
+use \OCA\Files_External\Lib\Auth\AuthMechanism;
+
+/**
+ * OpenStack Keystone authentication
+ */
+class OpenStackV3 extends AuthMechanism {
+
+ public function __construct(IL10N $l) {
+ $this
+ ->setIdentifier('openstack::openstackv3')
+ ->setScheme(self::SCHEME_OPENSTACK)
+ ->setText($l->t('OpenStack v3'))
+ ->addParameters([
+ new DefinitionParameter('user', $l->t('Username')),
+ new DefinitionParameter('domain', $l->t('Domain')),
+ (new DefinitionParameter('password', $l->t('Password')))
+ ->setType(DefinitionParameter::VALUE_PASSWORD),
+ new DefinitionParameter('url', $l->t('Identity endpoint URL'))
+ ])
+ ;
+ }
+
+}
diff --git a/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php b/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
index 3c5798ccee7..c1397ae8f8c 100644
--- a/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
+++ b/apps/files_external/lib/Lib/Auth/Password/GlobalAuth.php
@@ -29,7 +29,6 @@ use OCP\IUser;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\StorageConfig;
use OCP\Security\ICredentialsManager;
-use OCP\Files\Storage;
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
index 80703b52a9a..dfdfd072980 100644
--- a/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
+++ b/apps/files_external/lib/Lib/Auth/Password/LoginCredentials.php
@@ -24,13 +24,10 @@ namespace OCA\Files_External\Lib\Auth\Password;
use \OCP\IL10N;
use \OCP\IUser;
-use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Lib\StorageConfig;
use \OCP\ISession;
use \OCP\Security\ICredentialsManager;
-use \OCP\Files\Storage;
-use \OCA\Files_External\Lib\SessionStorageWrapper;
use \OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Auth/Password/UserProvided.php b/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
index 7eb2f63e7d3..6bac2bd9c18 100644
--- a/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
+++ b/apps/files_external/lib/Lib/Auth/Password/UserProvided.php
@@ -30,7 +30,6 @@ use OCP\IUser;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\StorageConfig;
use OCP\Security\ICredentialsManager;
-use OCP\Files\Storage;
use OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
/**
diff --git a/apps/files_external/lib/Lib/Backend/AmazonS3.php b/apps/files_external/lib/Lib/Backend/AmazonS3.php
index d21794a6847..509c6453dc9 100644
--- a/apps/files_external/lib/Lib/Backend/AmazonS3.php
+++ b/apps/files_external/lib/Lib/Backend/AmazonS3.php
@@ -23,12 +23,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\AmazonS3\AccessKey;
class AmazonS3 extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/DAV.php b/apps/files_external/lib/Lib/Backend/DAV.php
index 95d804ba943..2863a33c2c0 100644
--- a/apps/files_external/lib/Lib/Backend/DAV.php
+++ b/apps/files_external/lib/Lib/Backend/DAV.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class DAV extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/FTP.php b/apps/files_external/lib/Lib/Backend/FTP.php
index 12aee8114f3..d224d231281 100644
--- a/apps/files_external/lib/Lib/Backend/FTP.php
+++ b/apps/files_external/lib/Lib/Backend/FTP.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class FTP extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/LegacyBackend.php b/apps/files_external/lib/Lib/Backend/LegacyBackend.php
index 4d3aa3e7e93..3fc073b842d 100644
--- a/apps/files_external/lib/Lib/Backend/LegacyBackend.php
+++ b/apps/files_external/lib/Lib/Backend/LegacyBackend.php
@@ -23,7 +23,6 @@
namespace OCA\Files_External\Lib\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\Auth\Builtin;
use \OCA\Files_External\Lib\MissingDependency;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
diff --git a/apps/files_external/lib/Lib/Backend/Local.php b/apps/files_external/lib/Lib/Backend/Local.php
index 528528f2923..e0a2734d7ba 100644
--- a/apps/files_external/lib/Lib/Backend/Local.php
+++ b/apps/files_external/lib/Lib/Backend/Local.php
@@ -23,7 +23,6 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
diff --git a/apps/files_external/lib/Lib/Backend/OwnCloud.php b/apps/files_external/lib/Lib/Backend/OwnCloud.php
index 7dcd1f27212..cbf28be2bf2 100644
--- a/apps/files_external/lib/Lib/Backend/OwnCloud.php
+++ b/apps/files_external/lib/Lib/Backend/OwnCloud.php
@@ -24,11 +24,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
-
use \OCA\Files_External\Lib\Auth\Password\Password;
class OwnCloud extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/SFTP_Key.php b/apps/files_external/lib/Lib/Backend/SFTP_Key.php
index 62f108cd9dd..73d3acd3565 100644
--- a/apps/files_external/lib/Lib/Backend/SFTP_Key.php
+++ b/apps/files_external/lib/Lib/Backend/SFTP_Key.php
@@ -23,12 +23,9 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\PublicKey\RSA;
-use \OCA\Files_External\Lib\Backend\SFTP;
class SFTP_Key extends Backend {
diff --git a/apps/files_external/lib/Lib/Backend/SMB.php b/apps/files_external/lib/Lib/Backend/SMB.php
index 38e386005ad..f5335f4940c 100644
--- a/apps/files_external/lib/Lib/Backend/SMB.php
+++ b/apps/files_external/lib/Lib/Backend/SMB.php
@@ -23,10 +23,8 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
-use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\StorageConfig;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
diff --git a/apps/files_external/lib/Lib/Backend/SMB_OC.php b/apps/files_external/lib/Lib/Backend/SMB_OC.php
index 54d941ff1db..074c729b429 100644
--- a/apps/files_external/lib/Lib/Backend/SMB_OC.php
+++ b/apps/files_external/lib/Lib/Backend/SMB_OC.php
@@ -23,14 +23,12 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
use \OCA\Files_External\Lib\Auth\Password\SessionCredentials;
use \OCA\Files_External\Lib\StorageConfig;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
-use \OCA\Files_External\Lib\Backend\SMB;
use OCP\IUser;
/**
diff --git a/apps/files_external/lib/Lib/Backend/Swift.php b/apps/files_external/lib/Lib/Backend/Swift.php
index b0a69ae51e0..72fc236bcdc 100644
--- a/apps/files_external/lib/Lib/Backend/Swift.php
+++ b/apps/files_external/lib/Lib/Backend/Swift.php
@@ -23,11 +23,10 @@
namespace OCA\Files_External\Lib\Backend;
use \OCP\IL10N;
-use \OCA\Files_External\Lib\Backend\Backend;
use \OCA\Files_External\Lib\DefinitionParameter;
use \OCA\Files_External\Lib\Auth\AuthMechanism;
use \OCA\Files_External\Service\BackendService;
-use \OCA\Files_External\Lib\Auth\OpenStack\OpenStack;
+use \OCA\Files_External\Lib\Auth\OpenStack\OpenStackV2;
use \OCA\Files_External\Lib\Auth\OpenStack\Rackspace;
use \OCA\Files_External\Lib\LegacyDependencyCheckPolyfill;
@@ -35,7 +34,7 @@ class Swift extends Backend {
use LegacyDependencyCheckPolyfill;
- public function __construct(IL10N $l, OpenStack $openstackAuth, Rackspace $rackspaceAuth) {
+ public function __construct(IL10N $l, OpenStackV2 $openstackAuth, Rackspace $rackspaceAuth) {
$this
->setIdentifier('swift')
->addIdentifierAlias('\OC\Files\Storage\Swift') // legacy compat
diff --git a/apps/files_external/lib/Lib/DependencyTrait.php b/apps/files_external/lib/Lib/DependencyTrait.php
index bae2d277a59..1d99fa9c162 100644
--- a/apps/files_external/lib/Lib/DependencyTrait.php
+++ b/apps/files_external/lib/Lib/DependencyTrait.php
@@ -22,8 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\MissingDependency;
-
/**
* Trait for objects that have dependencies for use
*/
diff --git a/apps/files_external/lib/Lib/FrontendDefinitionTrait.php b/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
index 25b3cb4fc29..89fb62932ad 100644
--- a/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
+++ b/apps/files_external/lib/Lib/FrontendDefinitionTrait.php
@@ -24,8 +24,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\DefinitionParameter;
-use \OCA\Files_External\Lib\StorageConfig;
/**
* Trait for objects that have a frontend representation
diff --git a/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php b/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
index 4db4e6d74de..07fe99f9406 100644
--- a/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
+++ b/apps/files_external/lib/Lib/LegacyDependencyCheckPolyfill.php
@@ -22,7 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCA\Files_External\Lib\MissingDependency;
/**
* Polyfill for checking dependencies using legacy Storage::checkDependencies()
diff --git a/apps/files_external/lib/Lib/PersonalMount.php b/apps/files_external/lib/Lib/PersonalMount.php
index c54ed0a79f3..8c8ac0893f6 100644
--- a/apps/files_external/lib/Lib/PersonalMount.php
+++ b/apps/files_external/lib/Lib/PersonalMount.php
@@ -24,14 +24,14 @@
namespace OCA\Files_External\Lib;
-use OC\Files\Mount\MountPoint;
use OC\Files\Mount\MoveableMount;
+use OCA\Files_External\Config\ExternalMountPoint;
use OCA\Files_External\Service\UserStoragesService;
/**
* Person mount points can be moved by the user
*/
-class PersonalMount extends MountPoint implements MoveableMount {
+class PersonalMount extends ExternalMountPoint implements MoveableMount {
/** @var UserStoragesService */
protected $storagesService;
diff --git a/apps/files_external/lib/Lib/SessionStorageWrapper.php b/apps/files_external/lib/Lib/SessionStorageWrapper.php
index ba0f68b4e11..37cd0eae9ea 100644
--- a/apps/files_external/lib/Lib/SessionStorageWrapper.php
+++ b/apps/files_external/lib/Lib/SessionStorageWrapper.php
@@ -22,7 +22,6 @@
namespace OCA\Files_External\Lib;
-use \OCP\Files\Storage;
use \OC\Files\Storage\Wrapper\PermissionsMask;
use \OCP\Constants;
diff --git a/apps/files_external/lib/Lib/Storage/AmazonS3.php b/apps/files_external/lib/Lib/Storage/AmazonS3.php
index f06247c3690..459f9b80e12 100644
--- a/apps/files_external/lib/Lib/Storage/AmazonS3.php
+++ b/apps/files_external/lib/Lib/Storage/AmazonS3.php
@@ -571,13 +571,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
}
public function test() {
- $test = $this->getConnection()->getBucketAcl(array(
- 'Bucket' => $this->bucket,
- ));
- if (isset($test) && !is_null($test->getPath('Owner/ID'))) {
- return true;
- }
- return false;
+ $this->getConnection()->headBucket([
+ 'Bucket' => $this->bucket
+ ]);
+ return true;
}
public function getId() {
diff --git a/apps/files_external/lib/Lib/Storage/Swift.php b/apps/files_external/lib/Lib/Storage/Swift.php
index aaa7e95bbdf..a638169dcb2 100644
--- a/apps/files_external/lib/Lib/Storage/Swift.php
+++ b/apps/files_external/lib/Lib/Storage/Swift.php
@@ -1,4 +1,5 @@
<?php
+declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -39,33 +40,22 @@
namespace OCA\Files_External\Lib\Storage;
-use Guzzle\Http\Url;
-use Guzzle\Http\Exception\ClientErrorResponseException;
+use GuzzleHttp\Psr7\Uri;
use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
-use Icewind\Streams\RetryWrapper;
-use OpenCloud;
-use OpenCloud\Common\Exceptions;
-use OpenCloud\OpenStack;
-use OpenCloud\Rackspace;
-use OpenCloud\ObjectStore\Resource\DataObject;
-use OpenCloud\ObjectStore\Exception;
+use OC\Files\ObjectStore\SwiftFactory;
+use OCP\Files\StorageBadConfigException;
+use OpenStack\Common\Error\BadResponseError;
+use OpenStack\ObjectStore\v1\Models\StorageObject;
class Swift extends \OC\Files\Storage\Common {
-
- /**
- * @var \OpenCloud\ObjectStore\Service
- */
- private $connection;
+ /** @var SwiftFactory */
+ private $connectionFactory;
/**
- * @var \OpenCloud\ObjectStore\Resource\Container
+ * @var \OpenStack\ObjectStore\v1\Models\Container
*/
private $container;
/**
- * @var \OpenCloud\OpenStack
- */
- private $anchor;
- /**
* @var string
*/
private $bucket;
@@ -76,21 +66,26 @@ class Swift extends \OC\Files\Storage\Common {
*/
private $params;
- /** @var string */
+ /** @var string */
private $id;
+ /** @var \OC\Files\ObjectStore\Swift */
+ private $objectStore;
+
/**
* Key value cache mapping path to data object. Maps path to
* \OpenCloud\OpenStack\ObjectStorage\Resource\DataObject for existing
* paths and path to false for not existing paths.
+ *
* @var \OCP\ICache
*/
private $objectCache;
/**
* @param string $path
+ * @return mixed|string
*/
- private function normalizePath($path) {
+ private function normalizePath(string $path) {
$path = trim($path, '/');
if (!$path) {
@@ -118,24 +113,22 @@ class Swift extends \OC\Files\Storage\Common {
* that one will be returned.
*
* @param string $path
- * @return \OpenCloud\ObjectStore\Resource\DataObject|bool object
+ * @return StorageObject|bool object
* or false if the object did not exist
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
- private function fetchObject($path) {
+ private function fetchObject(string $path) {
if ($this->objectCache->hasKey($path)) {
// might be "false" if object did not exist from last check
return $this->objectCache->get($path);
}
try {
- $object = $this->getContainer()->getPartialObject($path);
+ $object = $this->getContainer()->getObject($path);
+ $object->retrieve();
$this->objectCache->set($path, $object);
return $object;
- } catch (ClientErrorResponseException $e) {
- // this exception happens when the object does not exist, which
- // is expected in most cases
- $this->objectCache->set($path, false);
- return false;
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
// Expected response is "404 Not Found", so only log if it isn't
if ($e->getResponse()->getStatusCode() !== 404) {
\OC::$server->getLogger()->logException($e, [
@@ -143,6 +136,7 @@ class Swift extends \OC\Files\Storage\Common {
'app' => 'files_external',
]);
}
+ $this->objectCache->set($path, false);
return false;
}
}
@@ -153,6 +147,8 @@ class Swift extends \OC\Files\Storage\Common {
* @param string $path
*
* @return bool true if the object exist, false otherwise
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
private function doesObjectExist($path) {
return $this->fetchObject($path) !== false;
@@ -160,20 +156,19 @@ class Swift extends \OC\Files\Storage\Common {
public function __construct($params) {
if ((empty($params['key']) and empty($params['password']))
- or empty($params['user']) or empty($params['bucket'])
+ or (empty($params['user']) && empty($params['userid'])) or empty($params['bucket'])
or empty($params['region'])
) {
- throw new \Exception("API Key or password, Username, Bucket and Region have to be configured.");
+ throw new StorageBadConfigException("API Key or password, Username, Bucket and Region have to be configured.");
}
- $this->id = 'swift::' . $params['user'] . md5($params['bucket']);
+ $user = $params['user'];
+ $this->id = 'swift::' . $user . md5($params['bucket']);
- $bucketUrl = Url::factory($params['bucket']);
- if ($bucketUrl->isAbsolute()) {
- $this->bucket = end($bucketUrl->getPathSegments());
- $params['endpoint_url'] = $bucketUrl->addPath('..')->normalizePath();
- } else {
- $this->bucket = $params['bucket'];
+ $bucketUrl = new Uri($params['bucket']);
+ if ($bucketUrl->getHost()) {
+ $params['bucket'] = basename($bucketUrl->getPath());
+ $params['endpoint_url'] = (string)$bucketUrl->withPath(dirname($bucketUrl->getPath()));
}
if (empty($params['url'])) {
@@ -184,9 +179,24 @@ class Swift extends \OC\Files\Storage\Common {
$params['service_name'] = 'cloudFiles';
}
+ $params['autocreate'] = true;
+
+ if (isset($params['domain'])) {
+ $params['user'] = [
+ 'name' => $params['user'],
+ 'password' => $params['password'],
+ 'domain' => [
+ 'name' => $params['domain'],
+ ]
+ ];
+ }
+
$this->params = $params;
// FIXME: private class...
$this->objectCache = new \OC\Cache\CappedMemoryCache();
+ $this->connectionFactory = new SwiftFactory(\OC::$server->getMemCacheFactory()->createDistributed('swift/'), $this->params);
+ $this->objectStore = new \OC\Files\ObjectStore\Swift($this->params, $this->connectionFactory);
+ $this->bucket = $params['bucket'];
}
public function mkdir($path) {
@@ -201,14 +211,15 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $customHeaders = array('content-type' => 'httpd/unix-directory');
- $metadataHeaders = DataObject::stockHeaders(array());
- $allHeaders = $customHeaders + $metadataHeaders;
- $this->getContainer()->uploadObject($path, '', $allHeaders);
+ $this->getContainer()->createObject([
+ 'name' => $path,
+ 'content' => '',
+ 'headers' => ['content-type' => 'httpd/unix-directory']
+ ]);
// invalidate so that the next access gets the real object
// with all properties
$this->objectCache->remove($path);
- } catch (Exceptions\CreateUpdateError $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -250,9 +261,9 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $this->getContainer()->dataObject()->setName($path . '/')->delete();
+ $this->objectStore->deleteObject($path . '/');
$this->objectCache->remove($path . '/');
- } catch (Exceptions\DeleteError $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -272,19 +283,18 @@ class Swift extends \OC\Files\Storage\Common {
$path .= '/';
}
- $path = str_replace('%23', '#', $path); // the prefix is sent as a query param, so revert the encoding of #
+// $path = str_replace('%23', '#', $path); // the prefix is sent as a query param, so revert the encoding of #
try {
- $files = array();
- /** @var OpenCloud\Common\Collection $objects */
- $objects = $this->getContainer()->objectList(array(
+ $files = [];
+ $objects = $this->getContainer()->listObjects([
'prefix' => $path,
'delimiter' => '/'
- ));
+ ]);
- /** @var OpenCloud\ObjectStore\Resource\DataObject $object */
+ /** @var StorageObject $object */
foreach ($objects as $object) {
- $file = basename($object->getName());
+ $file = basename($object->name);
if ($file !== basename($path) && $file !== '.') {
$files[] = $file;
}
@@ -311,12 +321,11 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- /** @var DataObject $object */
$object = $this->fetchObject($path);
if (!$object) {
return false;
}
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -324,16 +333,11 @@ class Swift extends \OC\Files\Storage\Common {
return false;
}
- $dateTime = \DateTime::createFromFormat(\DateTime::RFC1123, $object->getLastModified());
- if ($dateTime !== false) {
- $mtime = $dateTime->getTimestamp();
- } else {
- $mtime = null;
- }
+ $dateTime = $object->lastModified ? \DateTime::createFromFormat(\DateTime::RFC1123, $object->lastModified) : false;
+ $mtime = $dateTime ? $dateTime->getTimestamp() : null;
$objectMetadata = $object->getMetadata();
- $metaTimestamp = $objectMetadata->getProperty('timestamp');
- if (isset($metaTimestamp)) {
- $mtime = $metaTimestamp;
+ if (isset($objectMetadata['timestamp'])) {
+ $mtime = $objectMetadata['timestamp'];
}
if (!empty($mtime)) {
@@ -341,7 +345,7 @@ class Swift extends \OC\Files\Storage\Common {
}
$stat = array();
- $stat['size'] = (int)$object->getContentLength();
+ $stat['size'] = (int)$object->contentLength;
$stat['mtime'] = $mtime;
$stat['atime'] = time();
return $stat;
@@ -371,17 +375,17 @@ class Swift extends \OC\Files\Storage\Common {
}
try {
- $this->getContainer()->dataObject()->setName($path)->delete();
+ $this->objectStore->deleteObject($path);
$this->objectCache->remove($path);
$this->objectCache->remove($path . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
if ($e->getResponse()->getStatusCode() !== 404) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
]);
+ throw $e;
}
- return false;
}
return true;
@@ -398,20 +402,8 @@ class Swift extends \OC\Files\Storage\Common {
case 'r':
case 'rb':
try {
- $c = $this->getContainer();
- $streamFactory = new \Guzzle\Stream\PhpStreamRequestFactory();
- /** @var \OpenCloud\Common\Http\Client $client */
- $client = $c->getClient();
- $streamInterface = $streamFactory->fromRequest($client->get($c->getUrl($path)));
- $streamInterface->rewind();
- $stream = $streamInterface->getStream();
- stream_context_set_option($stream, 'swift','content', $streamInterface);
- if(!strrpos($streamInterface
- ->getMetaData('wrapper_data')[0], '404 Not Found')) {
- return RetryWrapper::wrap($stream);
- }
- return false;
- } catch (\Guzzle\Http\Exception\BadResponseException $e) {
+ return $this->objectStore->readObject($path);
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -454,24 +446,25 @@ class Swift extends \OC\Files\Storage\Common {
if (is_null($mtime)) {
$mtime = time();
}
- $metadata = array('timestamp' => $mtime);
+ $metadata = ['timestamp' => $mtime];
if ($this->file_exists($path)) {
if ($this->is_dir($path) && $path !== '.') {
$path .= '/';
}
$object = $this->fetchObject($path);
- if ($object->saveMetadata($metadata)) {
+ if ($object->mergeMetadata($metadata)) {
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
}
return true;
} else {
$mimeType = \OC::$server->getMimeTypeDetector()->detectPath($path);
- $customHeaders = array('content-type' => $mimeType);
- $metadataHeaders = DataObject::stockHeaders($metadata);
- $allHeaders = $customHeaders + $metadataHeaders;
- $this->getContainer()->uploadObject($path, '', $allHeaders);
+ $this->getContainer()->createObject([
+ 'name' => $path,
+ 'content' => '',
+ 'headers' => ['content-type' => 'httpd/unix-directory']
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
return true;
@@ -483,18 +476,21 @@ class Swift extends \OC\Files\Storage\Common {
$path2 = $this->normalizePath($path2);
$fileType = $this->filetype($path1);
- if ($fileType === 'file') {
-
+ if ($fileType) {
// make way
$this->unlink($path2);
+ }
+ if ($fileType === 'file') {
try {
$source = $this->fetchObject($path1);
- $source->copy($this->bucket . '/' . $path2);
+ $source->copy([
+ 'destination' => $this->bucket . '/' . $path2
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path2);
$this->objectCache->remove($path2 . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -503,17 +499,15 @@ class Swift extends \OC\Files\Storage\Common {
}
} else if ($fileType === 'dir') {
-
- // make way
- $this->unlink($path2);
-
try {
$source = $this->fetchObject($path1 . '/');
- $source->copy($this->bucket . '/' . $path2 . '/');
+ $source->copy([
+ 'destination' => $this->bucket . '/' . $path2 . '/'
+ ]);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path2);
$this->objectCache->remove($path2 . '/');
- } catch (ClientErrorResponseException $e) {
+ } catch (BadResponseError $e) {
\OC::$server->getLogger()->logException($e, [
'level' => \OCP\Util::ERROR,
'app' => 'files_external',
@@ -554,6 +548,7 @@ class Swift extends \OC\Files\Storage\Common {
// cleanup
if ($this->unlink($path1) === false) {
+ throw new \Exception('failed to remove original');
$this->unlink($path2);
return false;
}
@@ -569,80 +564,26 @@ class Swift extends \OC\Files\Storage\Common {
}
/**
- * Returns the connection
- *
- * @return OpenCloud\ObjectStore\Service connected client
- * @throws \Exception if connection could not be made
- */
- public function getConnection() {
- if (!is_null($this->connection)) {
- return $this->connection;
- }
-
- $settings = array(
- 'username' => $this->params['user'],
- );
-
- if (!empty($this->params['password'])) {
- $settings['password'] = $this->params['password'];
- } else if (!empty($this->params['key'])) {
- $settings['apiKey'] = $this->params['key'];
- }
-
- if (!empty($this->params['tenant'])) {
- $settings['tenantName'] = $this->params['tenant'];
- }
-
- if (!empty($this->params['timeout'])) {
- $settings['timeout'] = $this->params['timeout'];
- }
-
- if (isset($settings['apiKey'])) {
- $this->anchor = new Rackspace($this->params['url'], $settings);
- } else {
- $this->anchor = new OpenStack($this->params['url'], $settings);
- }
-
- $connection = $this->anchor->objectStoreService($this->params['service_name'], $this->params['region']);
-
- if (!empty($this->params['endpoint_url'])) {
- $endpoint = $connection->getEndpoint();
- $endpoint->setPublicUrl($this->params['endpoint_url']);
- $endpoint->setPrivateUrl($this->params['endpoint_url']);
- $connection->setEndpoint($endpoint);
- }
-
- $this->connection = $connection;
-
- return $this->connection;
- }
-
- /**
* Returns the initialized object store container.
*
- * @return OpenCloud\ObjectStore\Resource\Container
+ * @return \OpenStack\ObjectStore\v1\Models\Container
+ * @throws \OCP\Files\StorageAuthException
+ * @throws \OCP\Files\StorageNotAvailableException
*/
public function getContainer() {
- if (!is_null($this->container)) {
- return $this->container;
- }
+ if (is_null($this->container)) {
+ $this->container = $this->connectionFactory->getContainer();
- try {
- $this->container = $this->getConnection()->getContainer($this->bucket);
- } catch (ClientErrorResponseException $e) {
- $this->container = $this->getConnection()->createContainer($this->bucket);
- }
-
- if (!$this->file_exists('.')) {
- $this->mkdir('.');
+ if (!$this->file_exists('.')) {
+ $this->mkdir('.');
+ }
}
-
return $this->container;
}
public function writeBack($tmpFile, $path) {
$fileData = fopen($tmpFile, 'r');
- $this->getContainer()->uploadObject($path, $fileData);
+ $this->objectStore->writeObject($path, $fileData);
// invalidate target object to force repopulation on fetch
$this->objectCache->remove($path);
unlink($tmpFile);
diff --git a/apps/files_external/lib/Lib/StorageModifierTrait.php b/apps/files_external/lib/Lib/StorageModifierTrait.php
index 3327869e1a3..a0f5c53382e 100644
--- a/apps/files_external/lib/Lib/StorageModifierTrait.php
+++ b/apps/files_external/lib/Lib/StorageModifierTrait.php
@@ -24,8 +24,6 @@ namespace OCA\Files_External\Lib;
use \OCP\IUser;
use \OCP\Files\Storage;
-use \OCA\Files_External\Lib\StorageConfig;
-use \OCA\Files_External\Lib\InsufficientDataForMeaningfulAnswerException;
use \OCP\Files\StorageNotAvailableException;
/**
diff --git a/apps/files_external/lib/Migration/StorageMigrator.php b/apps/files_external/lib/Migration/StorageMigrator.php
index 2ecc5d6cd66..ceb5f4a2bda 100644
--- a/apps/files_external/lib/Migration/StorageMigrator.php
+++ b/apps/files_external/lib/Migration/StorageMigrator.php
@@ -27,7 +27,6 @@ namespace OCA\Files_External\Migration;
use OCA\Files_External\Service\BackendService;
use OCA\Files_External\Service\DBConfigService;
use OCA\Files_External\Service\GlobalLegacyStoragesService;
-use OCA\Files_External\Service\GlobalStoragesService;
use OCA\Files_External\Service\LegacyStoragesService;
use OCA\Files_External\Service\StoragesService;
use OCA\Files_External\Service\UserLegacyStoragesService;
diff --git a/apps/files_external/lib/Service/UserStoragesService.php b/apps/files_external/lib/Service/UserStoragesService.php
index db03befa852..0c422b2b85e 100644
--- a/apps/files_external/lib/Service/UserStoragesService.php
+++ b/apps/files_external/lib/Service/UserStoragesService.php
@@ -32,8 +32,6 @@ use \OC\Files\Filesystem;
use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\NotFoundException;
-use \OCA\Files_External\Service\BackendService;
-use \OCA\Files_External\Service\UserTrait;
/**
* Service class to manage user external storages
diff --git a/apps/files_external/lib/Settings/Personal.php b/apps/files_external/lib/Settings/Personal.php
index 7aec459bfb7..1bd140f0b35 100644
--- a/apps/files_external/lib/Settings/Personal.php
+++ b/apps/files_external/lib/Settings/Personal.php
@@ -25,7 +25,6 @@ namespace OCA\Files_External\Settings;
use OCA\Files_External\Lib\Auth\Password\GlobalAuth;
use OCA\Files_External\Service\BackendService;
-use OCA\Files_External\Service\GlobalStoragesService;
use OCA\Files_External\Service\UserGlobalStoragesService;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\Encryption\IManager;
diff --git a/apps/files_external/templates/list.php b/apps/files_external/templates/list.php
index d006514bcde..ed13ed83701 100644
--- a/apps/files_external/templates/list.php
+++ b/apps/files_external/templates/list.php
@@ -6,8 +6,7 @@
<div id="emptycontent" class="hidden">
<div class="icon-external"></div>
- <h2><?php p($l->t('No external storage configured')); ?></h2>
- <p><a href="<?php p(link_to('', 'index.php/settings/personal#files_external' )); ?>"><?php p($l->t('You can add external storages in the personal settings')); ?></a></p>
+ <h2><?php p($l->t('No external storage configured or you don\'t have the permission to configure them')); ?></h2>
</div>
<input type="hidden" name="dir" value="" id="dir">
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index 237985bfd0f..11b3451c32e 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -87,6 +87,11 @@
}
?>
+<div id="emptycontent" class="hidden">
+ <div class="icon-external"></div>
+ <h2><?php p($l->t('No external storage configured or you don\'t have the permission to configure them')); ?></h2>
+</div>
+
<form data-can-create="<?php echo $canCreateMounts?'true':'false' ?>" id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>">
<h2 data-anchor-name="external-storage"><?php p($l->t('External storages')); ?></h2>
<?php if (isset($_['dependencies']) and ($_['dependencies'] !== '') and $canCreateMounts) print_unescaped(''.$_['dependencies'].''); ?>
diff --git a/apps/files_external/tests/Storage/SwiftTest.php b/apps/files_external/tests/Storage/SwiftTest.php
index 19f185ed033..fdda8baace8 100644
--- a/apps/files_external/tests/Storage/SwiftTest.php
+++ b/apps/files_external/tests/Storage/SwiftTest.php
@@ -27,6 +27,7 @@
namespace OCA\Files_External\Tests\Storage;
+use GuzzleHttp\Exception\ClientException;
use \OCA\Files_External\Lib\Storage\Swift;
/**
@@ -40,6 +41,11 @@ class SwiftTest extends \Test\Files\Storage\Storage {
private $config;
+ /**
+ * @var Swift instance
+ */
+ protected $instance;
+
protected function setUp() {
parent::setUp();
@@ -53,17 +59,15 @@ class SwiftTest extends \Test\Files\Storage\Storage {
protected function tearDown() {
if ($this->instance) {
try {
- $connection = $this->instance->getConnection();
- $container = $connection->getContainer($this->config['bucket']);
+ $container = $this->instance->getContainer();
- $objects = $container->objectList();
- while($object = $objects->next()) {
- $object->setName(str_replace('#','%23',$object->getName()));
+ $objects = $container->listObjects();
+ foreach ($objects as $object) {
$object->delete();
}
$container->delete();
- } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) {
+ } catch (ClientException $e) {
// container didn't exist, so we don't need to delete it
}
}
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index 326bd49e9bc..b4c54247267 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -1,28 +1,46 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_sharing</id>
<name>File sharing</name>
+ <summary>File sharing</summary>
<description>
This application enables users to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable users can then share files and folders with other users and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other users outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.
Turning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.6.0</version>
+ <licence>agpl</licence>
<author>Michael Gapczynski</author>
<author>Bjoern Schiessle</author>
+ <namespace>Files_Sharing</namespace>
<default_enable/>
- <version>1.6.0</version>
<types>
<filesystem/>
</types>
+
+ <category>files</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <public>
- <files>public.php</files>
- </public>
- <namespace>Files_Sharing</namespace>
+ <background-jobs>
+ <job>OCA\Files_Sharing\DeleteOrphanedSharesJob</job>
+ <job>OCA\Files_Sharing\ExpireSharesJob</job>
+ </background-jobs>
+
+ <repair-steps>
+ <post-migration>
+ <step>OCA\Files_Sharing\Migration\OwncloudGuestShareType</step>
+ <step>OCA\Files_Sharing\Migration\SetPasswordColumn</step>
+ </post-migration>
+ </repair-steps>
+
+ <commands>
+ <command>OCA\Files_Sharing\Command\CleanupRemoteStorages</command>
+ </commands>
<activity>
<settings>
@@ -44,25 +62,13 @@ Turning the feature off removes shared files and folders on the server for all s
</providers>
</activity>
- <background-jobs>
- <job>OCA\Files_Sharing\DeleteOrphanedSharesJob</job>
- <job>OCA\Files_Sharing\ExpireSharesJob</job>
- </background-jobs>
-
- <commands>
- <command>OCA\Files_Sharing\Command\CleanupRemoteStorages</command>
- </commands>
-
- <repair-steps>
- <post-migration>
- <step>OCA\Files_Sharing\Migration\OwncloudGuestShareType</step>
- <step>OCA\Files_Sharing\Migration\SetPasswordColumn</step>
- </post-migration>
- </repair-steps>
-
<collaboration>
<plugins>
<plugin type="autocomplete-sort">OCA\Files_Sharing\Collaboration\ShareRecipientSorter</plugin>
</plugins>
</collaboration>
+
+ <public>
+ <files>public.php</files>
+ </public>
</info>
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index aa0803c491b..b2715912d3b 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -12,6 +12,7 @@
_.extend(OC.Files.Client, {
PROPERTY_SHARE_TYPES: '{' + OC.Files.Client.NS_OWNCLOUD + '}share-types',
+ PROPERTY_OWNER_ID: '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-id',
PROPERTY_OWNER_DISPLAY_NAME: '{' + OC.Files.Client.NS_OWNCLOUD + '}owner-display-name'
});
@@ -66,6 +67,7 @@
var fileInfo = oldElementToFile.apply(this, arguments);
fileInfo.sharePermissions = $el.attr('data-share-permissions') || undefined;
fileInfo.shareOwner = $el.attr('data-share-owner') || undefined;
+ fileInfo.shareOwnerId = $el.attr('data-share-owner-id') || undefined;
if( $el.attr('data-share-types')){
fileInfo.shareTypes = $el.attr('data-share-types').split(',');
@@ -83,6 +85,7 @@
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function() {
var props = oldGetWebdavProperties.apply(this, arguments);
+ props.push(OC.Files.Client.PROPERTY_OWNER_ID);
props.push(OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME);
props.push(OC.Files.Client.PROPERTY_SHARE_TYPES);
return props;
@@ -95,6 +98,7 @@
if (permissionsProp && permissionsProp.indexOf('S') >= 0) {
data.shareOwner = props[OC.Files.Client.PROPERTY_OWNER_DISPLAY_NAME];
+ data.shareOwnerId = props[OC.Files.Client.PROPERTY_OWNER_ID];
}
var shareTypesProp = props[OC.Files.Client.PROPERTY_SHARE_TYPES];
diff --git a/apps/files_sharing/l10n/hu.js b/apps/files_sharing/l10n/hu.js
index 9705d709fa6..df038f6f38f 100644
--- a/apps/files_sharing/l10n/hu.js
+++ b/apps/files_sharing/l10n/hu.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Nem lehet módosítani a nyilvános megosztási hivatkozások jogosultságait",
"Cannot increase permissions" : "Nem lehet növelni az engedélyeket",
"Share API is disabled" : "Megosztás API letiltva",
+ "File sharing" : "Fájlmegosztás",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
diff --git a/apps/files_sharing/l10n/hu.json b/apps/files_sharing/l10n/hu.json
index 628741239dd..1b65474cda2 100644
--- a/apps/files_sharing/l10n/hu.json
+++ b/apps/files_sharing/l10n/hu.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Nem lehet módosítani a nyilvános megosztási hivatkozások jogosultságait",
"Cannot increase permissions" : "Nem lehet növelni az engedélyeket",
"Share API is disabled" : "Megosztás API letiltva",
+ "File sharing" : "Fájlmegosztás",
"This share is password-protected" : "Ez egy jelszóval védett megosztás",
"The password is wrong. Try again." : "A megadott jelszó nem megfelelő. Próbálja újra!",
"Password" : "Jelszó",
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index a9df4eb22da..e0ea814ebd7 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
"Cannot increase permissions" : "パーミッションを追加できません",
"Share API is disabled" : "共有APIが無効です。",
+ "File sharing" : "ファイル共有",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "%s にファイルをアップロード",
"Select or drop files" : "ファイルを選択するか、ドラッグ&ドロップしてください",
"Uploading files…" : "ファイルをアップロード中...",
- "Uploaded files:" : "アップロード済ファイル:"
+ "Uploaded files:" : "アップロード済ファイル:",
+ "%s is publicly shared" : "%s が公開共有されました"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index dbb7604ee6a..0ed2739e522 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "URLリンク共有のパーミッションを変更できません",
"Cannot increase permissions" : "パーミッションを追加できません",
"Share API is disabled" : "共有APIが無効です。",
+ "File sharing" : "ファイル共有",
"This share is password-protected" : "この共有はパスワードで保護されています",
"The password is wrong. Try again." : "パスワードが間違っています。再試行してください。",
"Password" : "パスワード",
@@ -107,6 +108,7 @@
"Upload files to %s" : "%s にファイルをアップロード",
"Select or drop files" : "ファイルを選択するか、ドラッグ&ドロップしてください",
"Uploading files…" : "ファイルをアップロード中...",
- "Uploaded files:" : "アップロード済ファイル:"
+ "Uploaded files:" : "アップロード済ファイル:",
+ "%s is publicly shared" : "%s が公開共有されました"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/lv.js b/apps/files_sharing/l10n/lv.js
index 2c6d990ed76..cfed9516baf 100644
--- a/apps/files_sharing/l10n/lv.js
+++ b/apps/files_sharing/l10n/lv.js
@@ -5,11 +5,11 @@ OC.L10N.register(
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
"Nothing shared with you yet" : "Nekas vēl nav koplietots",
- "Files and folders others share with you will show up here" : "Faili un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
+ "Files and folders others share with you will show up here" : "Datnes un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
"Nothing shared yet" : "Nekas vēl nav koplietots",
- "Files and folders you share will show up here" : "Faili un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
+ "Files and folders you share will show up here" : "Datnes un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
"No shared links" : "Nav koplietotu saišu",
- "Files and folders you share by link will show up here" : "Faili un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
+ "Files and folders you share by link will show up here" : "Datnes un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
"You can upload into this folder" : "Jūs variet augšuplādēt šajā mapē",
"No compatible server found at {remote}" : "Nav atrasts neviens saderīgs serveris {remote}",
"Invalid server URL" : "Nederīgs servera url",
@@ -18,7 +18,7 @@ OC.L10N.register(
"No expiration date set" : "Nav noteikts derīguma termiņa beigu datums",
"Shared by" : "Koplietoja",
"Sharing" : "Koplietošana",
- "File shares" : "Failu koplietojumi",
+ "File shares" : "Datņu koplietojumi",
"Downloaded via public link" : "Lejupielādēt izmantojot publisku saiti",
"Downloaded by {email}" : "Lejupielādēts {email}",
"{file} downloaded via public link" : "{file} lejupielādēts izmantojot publisku saiti",
diff --git a/apps/files_sharing/l10n/lv.json b/apps/files_sharing/l10n/lv.json
index 831a042dd7f..7ea92586707 100644
--- a/apps/files_sharing/l10n/lv.json
+++ b/apps/files_sharing/l10n/lv.json
@@ -3,11 +3,11 @@
"Shared with others" : "Koplietots ar citiem",
"Shared by link" : "Koplietots ar saiti",
"Nothing shared with you yet" : "Nekas vēl nav koplietots",
- "Files and folders others share with you will show up here" : "Faili un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
+ "Files and folders others share with you will show up here" : "Datnes un mapes, ko citi koplietos ar tevi, tiks rādīti šeit",
"Nothing shared yet" : "Nekas vēl nav koplietots",
- "Files and folders you share will show up here" : "Faili un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
+ "Files and folders you share will show up here" : "Datnes un mapes, ko koplietosi ar citiem, tiks rādīti šeit",
"No shared links" : "Nav koplietotu saišu",
- "Files and folders you share by link will show up here" : "Faili un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
+ "Files and folders you share by link will show up here" : "Datnes un mapes, ko koplietosi ar saitēm, tiks rādīti šeit",
"You can upload into this folder" : "Jūs variet augšuplādēt šajā mapē",
"No compatible server found at {remote}" : "Nav atrasts neviens saderīgs serveris {remote}",
"Invalid server URL" : "Nederīgs servera url",
@@ -16,7 +16,7 @@
"No expiration date set" : "Nav noteikts derīguma termiņa beigu datums",
"Shared by" : "Koplietoja",
"Sharing" : "Koplietošana",
- "File shares" : "Failu koplietojumi",
+ "File shares" : "Datņu koplietojumi",
"Downloaded via public link" : "Lejupielādēt izmantojot publisku saiti",
"Downloaded by {email}" : "Lejupielādēts {email}",
"{file} downloaded via public link" : "{file} lejupielādēts izmantojot publisku saiti",
diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js
index a54c1d46224..0a35c91d20a 100644
--- a/apps/files_sharing/l10n/nl.js
+++ b/apps/files_sharing/l10n/nl.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Kan rechten voor openbaar gedeelde links niet wijzigen",
"Cannot increase permissions" : "Kan de rechten niet verruimen",
"Share API is disabled" : "Delen API is uitgeschakeld",
+ "File sharing" : "Bestand delen",
"This share is password-protected" : "Deze gedeelde folder is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "Upload bestanden naar %s",
"Select or drop files" : "Selecteer bestanden of sleep ze naar dit venster",
"Uploading files…" : "Uploaden bestanden...",
- "Uploaded files:" : "Geüploade bestanden"
+ "Uploaded files:" : "Geüploade bestanden",
+ "%s is publicly shared" : "%s is openbaar gedeeld"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json
index 237257a9dbe..859c6652e47 100644
--- a/apps/files_sharing/l10n/nl.json
+++ b/apps/files_sharing/l10n/nl.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Kan rechten voor openbaar gedeelde links niet wijzigen",
"Cannot increase permissions" : "Kan de rechten niet verruimen",
"Share API is disabled" : "Delen API is uitgeschakeld",
+ "File sharing" : "Bestand delen",
"This share is password-protected" : "Deze gedeelde folder is met een wachtwoord beveiligd",
"The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.",
"Password" : "Wachtwoord",
@@ -107,6 +108,7 @@
"Upload files to %s" : "Upload bestanden naar %s",
"Select or drop files" : "Selecteer bestanden of sleep ze naar dit venster",
"Uploading files…" : "Uploaden bestanden...",
- "Uploaded files:" : "Geüploade bestanden"
+ "Uploaded files:" : "Geüploade bestanden",
+ "%s is publicly shared" : "%s is openbaar gedeeld"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js
index f2c387e7591..a1af9e5d1c8 100644
--- a/apps/files_sharing/l10n/pt_PT.js
+++ b/apps/files_sharing/l10n/pt_PT.js
@@ -79,6 +79,8 @@ OC.L10N.register(
"Public upload is only possible for publicly shared folders" : "O envio público só é possível para as pastas partilhadas publicamente",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Sharing %s failed because the back end does not allow shares from type %s" : "A partilha de %s falhou porque \"back end\" não permite partilhas do tipo %s",
+ "You cannot share to a Circle if the app is not enabled" : "Não pode partilhar um Círculo se a aplicação não estiver activa",
+ "Please specify a valid circle" : "Por favor especifique um círculo válido",
"Unknown share type" : "Tipo de partilha desconhecido",
"Not a directory" : "Não é uma diretoria",
"Could not lock path" : "Não foi possível bloquear o caminho",
@@ -86,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Não é possível alterar as permissões para as hiperligações de partilha pública",
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"Share API is disabled" : "A partilha de API está desativada",
+ "File sharing" : "Partilha de ficheiro",
"This share is password-protected" : "Esta partilha está protegida por palavra-passe",
"The password is wrong. Try again." : "A palavra-passe está errada. Por favor, tente de novo.",
"Password" : "Palavra-passe",
@@ -102,6 +105,7 @@ OC.L10N.register(
"shared by %s" : "partilhado por %s",
"Download" : "Transferir",
"Direct link" : "Hiperligação direta",
+ "Add to your Nextcloud" : "Adicionar à sua Nextcloud",
"Download %s" : "Transferir %s",
"Upload files to %s" : "Enviar ficheiros para %s",
"Select or drop files" : "Seleccione ou solte ficheiros",
diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json
index c6ce44a9f88..40d57e3ffe8 100644
--- a/apps/files_sharing/l10n/pt_PT.json
+++ b/apps/files_sharing/l10n/pt_PT.json
@@ -77,6 +77,8 @@
"Public upload is only possible for publicly shared folders" : "O envio público só é possível para as pastas partilhadas publicamente",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Sharing %s failed because the back end does not allow shares from type %s" : "A partilha de %s falhou porque \"back end\" não permite partilhas do tipo %s",
+ "You cannot share to a Circle if the app is not enabled" : "Não pode partilhar um Círculo se a aplicação não estiver activa",
+ "Please specify a valid circle" : "Por favor especifique um círculo válido",
"Unknown share type" : "Tipo de partilha desconhecido",
"Not a directory" : "Não é uma diretoria",
"Could not lock path" : "Não foi possível bloquear o caminho",
@@ -84,6 +86,7 @@
"Can't change permissions for public share links" : "Não é possível alterar as permissões para as hiperligações de partilha pública",
"Cannot increase permissions" : "Não é possível incrementar as permissões",
"Share API is disabled" : "A partilha de API está desativada",
+ "File sharing" : "Partilha de ficheiro",
"This share is password-protected" : "Esta partilha está protegida por palavra-passe",
"The password is wrong. Try again." : "A palavra-passe está errada. Por favor, tente de novo.",
"Password" : "Palavra-passe",
@@ -100,6 +103,7 @@
"shared by %s" : "partilhado por %s",
"Download" : "Transferir",
"Direct link" : "Hiperligação direta",
+ "Add to your Nextcloud" : "Adicionar à sua Nextcloud",
"Download %s" : "Transferir %s",
"Upload files to %s" : "Enviar ficheiros para %s",
"Select or drop files" : "Seleccione ou solte ficheiros",
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 72cefe4c4b8..1e59cc3779e 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -34,13 +34,13 @@ OC.L10N.register(
"Shared as public link" : "Предоставлен доступ общедоступной ссылкой",
"Removed public link" : "Общедоступная ссылка удалена",
"Public link expired" : "Истёк срок действия общедоступной ссылки",
- "{actor} shared as public link" : "{actor} поделился(ась) общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} открыл(а) общий доступ созданием общедоступной ссылки",
"{actor} removed public link" : "{actor} удалил(а) общедоступную ссылку",
"Public link of {actor} expired" : "Истёк срок действия общедоступной ссылки пользователя {actor}",
"You shared {file} as public link" : "Вы предоставили общий доступ к «{file}» созданием общедоступной ссылки",
"You removed public link for {file}" : "Вы удалили общедоступную ссылку на «{file}»",
"Public link expired for {file}" : "Истёк срок действия общедоступной ссылки на «{file}»",
- "{actor} shared {file} as public link" : "{actor} открыл(а) общий доступ к «{file}» в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} предоставил(а) общий доступ к «{file}» созданием общедоступной ссылки",
"{actor} removed public link for {file}" : "{actor} удалил(а) общедоступную ссылку на «{file}»",
"Public link of {actor} for {file} expired" : "Истёк срок действия общедоступной ссылки на «{file}», созданной {actor}.",
"{user} accepted the remote share" : "{user} принял(а) общий ресурс другого сервера",
@@ -55,11 +55,11 @@ OC.L10N.register(
"{actor} removed share for {user}" : "{actor} закрыл(а) общий доступ пользователю {user}",
"Shared by {actor}" : "Общий доступ был открыт пользователем {actor}",
"{actor} removed share" : "{actor} закрыл(а) общий доступ",
- "You shared {file} with {user}" : "Вы поделились «{file}» с пользователем {user}",
+ "You shared {file} with {user}" : "Вы предоставили пользователю {user} общий доступ к «{file}»",
"You removed {user} from {file}" : "Вы закрыли пользователю {user} общий доступ к «{file}»",
- "{actor} shared {file} with {user}" : "{actor} поделился(ась) «{file}» с пользователем {user}",
- "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю общий доступ к «{file}»",
- "{actor} shared {file} with you" : "{actor} открыл(а) вам общий доступ к «{file}»",
+ "{actor} shared {file} with {user}" : "{actor} предоставил(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} shared {file} with you" : "{actor} предоставил(а) вам общий доступ к «{file}»",
"{actor} removed you from {file}" : "{actor} закрыл(а) вам общий доступ к «{file}»",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Общий доступ к файлу или каталогу был открыт <strong>с другого сервера</strong>",
@@ -79,7 +79,7 @@ OC.L10N.register(
"Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в общедоступные папки",
"Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД",
"Sharing %s failed because the back end does not allow shares from type %s" : "Не удалось предоставить общий доступ к «%s», поскольку механизм удалённого обмена не разрешает публикации типа %s",
- "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
+ "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
"Please specify a valid circle" : "Укажите верный круг",
"Unknown share type" : "Общий доступ неизвестного типа",
"Not a directory" : "Это не каталог",
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "Для общедоступных ссылок изменение прав невозможно",
"Cannot increase permissions" : "Нельзя увеличить права",
"Share API is disabled" : "API общего доступа отключён",
+ "File sharing" : "Обмен файлами",
"This share is password-protected" : "Общий ресурс защищён паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте ещё раз.",
"Password" : "Пароль",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "Загрузка файлов пользователю %s",
"Select or drop files" : "Выберите или перетащите файлы",
"Uploading files…" : "Файлы передаются на сервер...",
- "Uploaded files:" : "Отправленные файлы:"
+ "Uploaded files:" : "Отправленные файлы:",
+ "%s is publicly shared" : "«%s» опубликован "
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 268b97ab7b1..171f690d8da 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -32,13 +32,13 @@
"Shared as public link" : "Предоставлен доступ общедоступной ссылкой",
"Removed public link" : "Общедоступная ссылка удалена",
"Public link expired" : "Истёк срок действия общедоступной ссылки",
- "{actor} shared as public link" : "{actor} поделился(ась) общедоступной ссылкой",
+ "{actor} shared as public link" : "{actor} открыл(а) общий доступ созданием общедоступной ссылки",
"{actor} removed public link" : "{actor} удалил(а) общедоступную ссылку",
"Public link of {actor} expired" : "Истёк срок действия общедоступной ссылки пользователя {actor}",
"You shared {file} as public link" : "Вы предоставили общий доступ к «{file}» созданием общедоступной ссылки",
"You removed public link for {file}" : "Вы удалили общедоступную ссылку на «{file}»",
"Public link expired for {file}" : "Истёк срок действия общедоступной ссылки на «{file}»",
- "{actor} shared {file} as public link" : "{actor} открыл(а) общий доступ к «{file}» в виде общедоступной ссылки",
+ "{actor} shared {file} as public link" : "{actor} предоставил(а) общий доступ к «{file}» созданием общедоступной ссылки",
"{actor} removed public link for {file}" : "{actor} удалил(а) общедоступную ссылку на «{file}»",
"Public link of {actor} for {file} expired" : "Истёк срок действия общедоступной ссылки на «{file}», созданной {actor}.",
"{user} accepted the remote share" : "{user} принял(а) общий ресурс другого сервера",
@@ -53,11 +53,11 @@
"{actor} removed share for {user}" : "{actor} закрыл(а) общий доступ пользователю {user}",
"Shared by {actor}" : "Общий доступ был открыт пользователем {actor}",
"{actor} removed share" : "{actor} закрыл(а) общий доступ",
- "You shared {file} with {user}" : "Вы поделились «{file}» с пользователем {user}",
+ "You shared {file} with {user}" : "Вы предоставили пользователю {user} общий доступ к «{file}»",
"You removed {user} from {file}" : "Вы закрыли пользователю {user} общий доступ к «{file}»",
- "{actor} shared {file} with {user}" : "{actor} поделился(ась) «{file}» с пользователем {user}",
- "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю общий доступ к «{file}»",
- "{actor} shared {file} with you" : "{actor} открыл(а) вам общий доступ к «{file}»",
+ "{actor} shared {file} with {user}" : "{actor} предоставил(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} removed {user} from {file}" : "{actor} закрыл(а) пользователю {user} общий доступ к «{file}»",
+ "{actor} shared {file} with you" : "{actor} предоставил(а) вам общий доступ к «{file}»",
"{actor} removed you from {file}" : "{actor} закрыл(а) вам общий доступ к «{file}»",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Файл или папка, которыми поделились по электронной почте или общедоступной ссылке, были <strong>скачаны</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Общий доступ к файлу или каталогу был открыт <strong>с другого сервера</strong>",
@@ -77,7 +77,7 @@
"Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в общедоступные папки",
"Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД",
"Sharing %s failed because the back end does not allow shares from type %s" : "Не удалось предоставить общий доступ к «%s», поскольку механизм удалённого обмена не разрешает публикации типа %s",
- "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
+ "You cannot share to a Circle if the app is not enabled" : "Вы не можете поделиться с кругом, если приложение «Круг» не включено",
"Please specify a valid circle" : "Укажите верный круг",
"Unknown share type" : "Общий доступ неизвестного типа",
"Not a directory" : "Это не каталог",
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "Для общедоступных ссылок изменение прав невозможно",
"Cannot increase permissions" : "Нельзя увеличить права",
"Share API is disabled" : "API общего доступа отключён",
+ "File sharing" : "Обмен файлами",
"This share is password-protected" : "Общий ресурс защищён паролем",
"The password is wrong. Try again." : "Неверный пароль. Попробуйте ещё раз.",
"Password" : "Пароль",
@@ -107,6 +108,7 @@
"Upload files to %s" : "Загрузка файлов пользователю %s",
"Select or drop files" : "Выберите или перетащите файлы",
"Uploading files…" : "Файлы передаются на сервер...",
- "Uploaded files:" : "Отправленные файлы:"
+ "Uploaded files:" : "Отправленные файлы:",
+ "%s is publicly shared" : "«%s» опубликован "
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js
index de33a357fbb..1b7a35ccf4c 100644
--- a/apps/files_sharing/l10n/zh_CN.js
+++ b/apps/files_sharing/l10n/zh_CN.js
@@ -88,6 +88,7 @@ OC.L10N.register(
"Can't change permissions for public share links" : "不能改变公共分享链接权限",
"Cannot increase permissions" : "不能增加权限",
"Share API is disabled" : "共享 API 已被禁用",
+ "File sharing" : "文件共享",
"This share is password-protected" : "这是一个密码保护的共享",
"The password is wrong. Try again." : "用户名或密码错误!请重试",
"Password" : "密码",
@@ -99,7 +100,7 @@ OC.L10N.register(
"Reasons might be:" : "可能原因是:",
"the item was removed" : "此项已移除",
"the link expired" : "链接过期",
- "sharing is disabled" : "分享已禁用",
+ "sharing is disabled" : "已禁用共享",
"For more info, please ask the person who sent this link." : "欲知详情,请联系发给你链接的人。",
"shared by %s" : "共享者 %s",
"Download" : "下载",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Upload files to %s" : "上传文件到 %s",
"Select or drop files" : "选择或删除文件",
"Uploading files…" : "上传文件 … ",
- "Uploaded files:" : "上传的文件: "
+ "Uploaded files:" : "上传的文件: ",
+ "%s is publicly shared" : "%s 是公开共享"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json
index 982d0bd238a..c76961670a3 100644
--- a/apps/files_sharing/l10n/zh_CN.json
+++ b/apps/files_sharing/l10n/zh_CN.json
@@ -86,6 +86,7 @@
"Can't change permissions for public share links" : "不能改变公共分享链接权限",
"Cannot increase permissions" : "不能增加权限",
"Share API is disabled" : "共享 API 已被禁用",
+ "File sharing" : "文件共享",
"This share is password-protected" : "这是一个密码保护的共享",
"The password is wrong. Try again." : "用户名或密码错误!请重试",
"Password" : "密码",
@@ -97,7 +98,7 @@
"Reasons might be:" : "可能原因是:",
"the item was removed" : "此项已移除",
"the link expired" : "链接过期",
- "sharing is disabled" : "分享已禁用",
+ "sharing is disabled" : "已禁用共享",
"For more info, please ask the person who sent this link." : "欲知详情,请联系发给你链接的人。",
"shared by %s" : "共享者 %s",
"Download" : "下载",
@@ -107,6 +108,7 @@
"Upload files to %s" : "上传文件到 %s",
"Select or drop files" : "选择或删除文件",
"Uploading files…" : "上传文件 … ",
- "Uploaded files:" : "上传的文件: "
+ "Uploaded files:" : "上传的文件: ",
+ "%s is publicly shared" : "%s 是公开共享"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php
index b5b2979ec6b..795d069c1b8 100644
--- a/apps/files_sharing/lib/Controller/ShareController.php
+++ b/apps/files_sharing/lib/Controller/ShareController.php
@@ -35,7 +35,6 @@
namespace OCA\Files_Sharing\Controller;
-use OC\Files\Node\Folder;
use OC_Files;
use OC_Util;
use OCA\FederatedFileSharing\FederatedShareProvider;
diff --git a/apps/files_sharing/lib/Controller/ShareInfoController.php b/apps/files_sharing/lib/Controller/ShareInfoController.php
index 28bfcd12c24..14b56d28954 100644
--- a/apps/files_sharing/lib/Controller/ShareInfoController.php
+++ b/apps/files_sharing/lib/Controller/ShareInfoController.php
@@ -31,7 +31,6 @@ use OCP\Constants;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\Node;
-use OCP\ILogger;
use OCP\IRequest;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
diff --git a/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php b/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
index 74a5db4f308..7a6ecc483e8 100644
--- a/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
+++ b/apps/files_sharing/lib/Middleware/ShareInfoMiddleware.php
@@ -23,7 +23,6 @@
*/
namespace OCA\Files_Sharing\Middleware;
-use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\Files_Sharing\Controller\ShareInfoController;
use OCA\Files_Sharing\Exceptions\S2SException;
use OCP\AppFramework\Controller;
diff --git a/apps/files_trashbin/appinfo/info.xml b/apps/files_trashbin/appinfo/info.xml
index 305906a5446..585e61fe1e8 100644
--- a/apps/files_trashbin/appinfo/info.xml
+++ b/apps/files_trashbin/appinfo/info.xml
@@ -1,26 +1,30 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_trashbin</id>
<name>Deleted files</name>
+ <summary>This application enables users to restore files that were deleted from the system.</summary>
<description>
This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.
To prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
+ <namespace>Files_Trashbin</namespace>
<default_enable/>
- <version>1.4.0</version>
<types>
<filesystem/>
</types>
- <namespace>Files_Trashbin</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-trashbin</user>
</documentation>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Files_Trashbin\BackgroundJob\ExpireTrash</job>
diff --git a/apps/files_versions/appinfo/info.xml b/apps/files_versions/appinfo/info.xml
index 511b1713cb1..8f7e4d7b716 100644
--- a/apps/files_versions/appinfo/info.xml
+++ b/apps/files_versions/appinfo/info.xml
@@ -1,26 +1,30 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files_versions</id>
<name>Versions</name>
- <licence>AGPL</licence>
- <author>Frank Karlitschek</author>
- <author>Bjoern Schiessle</author>
+ <summary>This application automatically maintains older versions of files that are changed.</summary>
<description>
- This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.
-In addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation.
+ This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.
+ In addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation.
</description>
<version>1.7.0</version>
+ <licence>agpl</licence>
+ <author>Frank Karlitschek</author>
+ <author>Bjoern Schiessle</author>
+ <namespace>Files_Versions</namespace>
+ <default_enable/>
<types>
<filesystem/>
</types>
- <namespace>Files_Versions</namespace>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<documentation>
<user>user-versions</user>
</documentation>
- <default_enable/>
+ <category>files</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<background-jobs>
<job>OCA\Files_Versions\BackgroundJob\ExpireVersions</job>
diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php
index e5c70dd2bc5..833077fbcce 100644
--- a/apps/files_versions/download.php
+++ b/apps/files_versions/download.php
@@ -49,7 +49,9 @@ $ftype = \OC::$server->getMimeTypeDetector()->getSecureMimeType($view->getMimeTy
header('Content-Type:'.$ftype);
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
-OCP\Response::disableCaching();
+header('Pragma: public');// enable caching in IE
+header('Expires: 0');
+header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
OCP\Response::setContentLengthHeader($view->filesize($versionName));
OC_Util::obEnd();
diff --git a/apps/files_versions/l10n/fa.js b/apps/files_versions/l10n/fa.js
index 08ad3dd3254..35332939df1 100644
--- a/apps/files_versions/l10n/fa.js
+++ b/apps/files_versions/l10n/fa.js
@@ -4,6 +4,9 @@ OC.L10N.register(
"Could not revert: %s" : "بازگردانی امکان ناپذیر است: %s",
"Versions" : "نسخه ها",
"Failed to revert {file} to revision {timestamp}." : "برگرداندن {file} به نسخه {timestamp} با شکست روبرو شد",
- "Restore" : "بازیابی"
+ "_%n byte_::_%n bytes_" : ["%n بایت"],
+ "Restore" : "بازیابی",
+ "No earlier versions available" : "هیچ نسخه قدیمی تری در دسترس نیست",
+ "More versions …" : "نسخه های بیشتر ..."
},
"nplurals=1; plural=0;");
diff --git a/apps/files_versions/l10n/fa.json b/apps/files_versions/l10n/fa.json
index f25ecb00445..2618427c674 100644
--- a/apps/files_versions/l10n/fa.json
+++ b/apps/files_versions/l10n/fa.json
@@ -2,6 +2,9 @@
"Could not revert: %s" : "بازگردانی امکان ناپذیر است: %s",
"Versions" : "نسخه ها",
"Failed to revert {file} to revision {timestamp}." : "برگرداندن {file} به نسخه {timestamp} با شکست روبرو شد",
- "Restore" : "بازیابی"
+ "_%n byte_::_%n bytes_" : ["%n بایت"],
+ "Restore" : "بازیابی",
+ "No earlier versions available" : "هیچ نسخه قدیمی تری در دسترس نیست",
+ "More versions …" : "نسخه های بیشتر ..."
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/lookup_server_connector/appinfo/info.xml b/apps/lookup_server_connector/appinfo/info.xml
index 31fc4fe8e5f..19ffeb4de1c 100644
--- a/apps/lookup_server_connector/appinfo/info.xml
+++ b/apps/lookup_server_connector/appinfo/info.xml
@@ -1,18 +1,22 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>lookup_server_connector</id>
<name>Lookup Server Connector</name>
+ <summary>Sync public user information with the lookup server</summary>
<description>Sync public user information with the lookup server</description>
- <licence>AGPL</licence>
+ <version>1.2.0</version>
+ <licence>agpl</licence>
<author>Bjoern Schiessle</author>
<namespace>LookupServerConnector</namespace>
- <version>1.2.0</version>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<default_enable/>
<types>
<authentication/>
</types>
+ <category>integration</category>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/oauth2/appinfo/info.xml b/apps/oauth2/appinfo/info.xml
index 0bbad31dab3..ac18b5cdb94 100644
--- a/apps/oauth2/appinfo/info.xml
+++ b/apps/oauth2/appinfo/info.xml
@@ -1,16 +1,21 @@
<?xml version="1.0"?>
-<info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>oauth2</id>
<name>OAuth 2.0</name>
+ <summary>Allows OAuth2 compatible authentication from other web applications.</summary>
<description>The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications.</description>
+ <version>1.2.0</version>
<licence>agpl</licence>
<author>Lukas Reschke</author>
<namespace>OAuth2</namespace>
- <version>1.2.0</version>
<default_enable/>
<types>
<authentication/>
</types>
+
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/oauth2/l10n/ast.js b/apps/oauth2/l10n/ast.js
index ddb11d0b9ed..07a7510eda6 100644
--- a/apps/oauth2/l10n/ast.js
+++ b/apps/oauth2/l10n/ast.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 permite a los servicios esternos solicitar accesu a %s.",
"Name" : "Nome",
diff --git a/apps/oauth2/l10n/ast.json b/apps/oauth2/l10n/ast.json
index 5e2db794420..53ac163ef17 100644
--- a/apps/oauth2/l10n/ast.json
+++ b/apps/oauth2/l10n/ast.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Veceros d'OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 permite a los servicios esternos solicitar accesu a %s.",
"Name" : "Nome",
diff --git a/apps/oauth2/l10n/hu.js b/apps/oauth2/l10n/hu.js
index 48747669a31..64124c7a5d4 100644
--- a/apps/oauth2/l10n/hu.js
+++ b/apps/oauth2/l10n/hu.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 megengedi külső szolgáltatásoknak, hogy hozzáférést kérjenek ehhez: %s.",
"Name" : "Név",
diff --git a/apps/oauth2/l10n/hu.json b/apps/oauth2/l10n/hu.json
index c69fbb0fcd8..8c07c53e66f 100644
--- a/apps/oauth2/l10n/hu.json
+++ b/apps/oauth2/l10n/hu.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 kliensek",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 megengedi külső szolgáltatásoknak, hogy hozzáférést kérjenek ehhez: %s.",
"Name" : "Név",
diff --git a/apps/oauth2/l10n/pt_PT.js b/apps/oauth2/l10n/pt_PT.js
new file mode 100644
index 00000000000..f89a56c39d1
--- /dev/null
+++ b/apps/oauth2/l10n/pt_PT.js
@@ -0,0 +1,14 @@
+OC.L10N.register(
+ "oauth2",
+ {
+ "OAuth 2.0" : "OAuth 2.0",
+ "OAuth 2.0 clients" : "Clientes OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to %s." : "OAuth2.0 permite que dispositivos externos peçam acesso a %s.",
+ "Name" : "Nome",
+ "Redirection URI" : "URI de redireccionamento",
+ "Client Identifier" : "Identificador de Cliente",
+ "Secret" : "Segredo",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/pt_PT.json b/apps/oauth2/l10n/pt_PT.json
new file mode 100644
index 00000000000..15f16743e78
--- /dev/null
+++ b/apps/oauth2/l10n/pt_PT.json
@@ -0,0 +1,12 @@
+{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
+ "OAuth 2.0 clients" : "Clientes OAuth 2.0",
+ "OAuth 2.0 allows external services to request access to %s." : "OAuth2.0 permite que dispositivos externos peçam acesso a %s.",
+ "Name" : "Nome",
+ "Redirection URI" : "URI de redireccionamento",
+ "Client Identifier" : "Identificador de Cliente",
+ "Secret" : "Segredo",
+ "Add client" : "Adicionar cliente",
+ "Add" : "Adicionar"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/oauth2/l10n/ru.js b/apps/oauth2/l10n/ru.js
index 7edd72964cd..4adf2f65ceb 100644
--- a/apps/oauth2/l10n/ru.js
+++ b/apps/oauth2/l10n/ru.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к %s.",
"Name" : "Имя",
diff --git a/apps/oauth2/l10n/ru.json b/apps/oauth2/l10n/ru.json
index f83068d6097..793dd149678 100644
--- a/apps/oauth2/l10n/ru.json
+++ b/apps/oauth2/l10n/ru.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "Клиенты OAuth 2.0",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 позволяет внешним службам запрашивать доступ к %s.",
"Name" : "Имя",
diff --git a/apps/oauth2/l10n/sv.js b/apps/oauth2/l10n/sv.js
index 6008633294f..5d2946a1d22 100644
--- a/apps/oauth2/l10n/sv.js
+++ b/apps/oauth2/l10n/sv.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"oauth2",
{
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 tillåter externa tjänster att efterfråga tillgång till %s.",
"Name" : "Namn",
diff --git a/apps/oauth2/l10n/sv.json b/apps/oauth2/l10n/sv.json
index 6fa51297312..464282a4491 100644
--- a/apps/oauth2/l10n/sv.json
+++ b/apps/oauth2/l10n/sv.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "OAuth 2.0" : "OAuth 2.0",
"OAuth 2.0 clients" : "OAuth 2.0 klienter",
"OAuth 2.0 allows external services to request access to %s." : "OAuth 2.0 tillåter externa tjänster att efterfråga tillgång till %s.",
"Name" : "Namn",
diff --git a/apps/provisioning_api/appinfo/info.xml b/apps/provisioning_api/appinfo/info.xml
index 849e74432f0..05e805c1170 100644
--- a/apps/provisioning_api/appinfo/info.xml
+++ b/apps/provisioning_api/appinfo/info.xml
@@ -1,7 +1,9 @@
-<?xml version="1.0"?>
-<info>
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>provisioning_api</id>
<name>Provisioning API</name>
+ <summary>This application enables a set of APIs that external systems can use to manage users, groups and apps.</summary>
<description>
This application enables a set of APIs that external systems can use to create, edit, delete and query user
attributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users
@@ -11,17 +13,19 @@
listed above. More information is available in the Provisioning API documentation, including example calls
and server responses.
</description>
- <licence>AGPL</licence>
- <author>Tom Needham</author>
- <default_enable/>
- <documentation>
- <admin>admin-provisioning-api</admin>
- </documentation>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Tom Needham</author>
<namespace>Provisioning_API</namespace>
+ <default_enable/>
<types>
<prevent_group_restriction/>
</types>
+ <documentation>
+ <admin>admin-provisioning-api</admin>
+ </documentation>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 99f1a0ddd57..402381ab58a 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -31,6 +31,7 @@
namespace OCA\Provisioning_API\Controller;
use OC\Accounts\AccountManager;
+use OC\HintException;
use OC\Settings\Mailer\NewUserMailHelper;
use OC_Helper;
use OCA\Provisioning_API\FederatedFileSharingFactory;
@@ -193,15 +194,22 @@ class UsersController extends OCSController {
try {
$newUser = $this->userManager->createUser($userid, $password);
- $this->logger->info('Successful addUser call with userid: '.$userid, ['app' => 'ocs_api']);
+ $this->logger->info('Successful addUser call with userid: ' . $userid, ['app' => 'ocs_api']);
if (is_array($groups)) {
foreach ($groups as $group) {
$this->groupManager->get($group)->addUser($newUser);
- $this->logger->info('Added userid '.$userid.' to group '.$group, ['app' => 'ocs_api']);
+ $this->logger->info('Added userid ' . $userid . ' to group ' . $group, ['app' => 'ocs_api']);
}
}
return new DataResponse();
+ } catch (HintException $e ) {
+ $this->logger->logException($e, [
+ 'message' => 'Failed addUser attempt with hint exception.',
+ 'level' => \OCP\Util::WARN,
+ 'app' => 'ocs_api',
+ ]);
+ throw new OCSException($e->getHint(), 107);
} catch (\Exception $e) {
$this->logger->logException($e, [
'message' => 'Failed addUser attempt with exception.',
diff --git a/apps/sharebymail/appinfo/info.xml b/apps/sharebymail/appinfo/info.xml
index f1cd70a66b3..6bec13e819b 100644
--- a/apps/sharebymail/appinfo/info.xml
+++ b/apps/sharebymail/appinfo/info.xml
@@ -1,29 +1,32 @@
<?xml version="1.0"?>
-<info>
- <id>sharebymail</id>
- <name>Share by mail</name>
- <description>Share provider which allows you to share files by mail</description>
- <licence>AGPL</licence>
- <author>Bjoern Schiessle</author>
- <version>1.4.0</version>
- <namespace>ShareByMail</namespace>
- <category>other</category>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
- <default_enable/>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
+ <id>sharebymail</id>
+ <name>Share by mail</name>
+ <summary>Share provider which allows you to share files by mail</summary>
+ <description>Share provider which allows you to share files by mail</description>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Bjoern Schiessle</author>
+ <namespace>ShareByMail</namespace>
+ <default_enable/>
- <types>
- <filesystem/>
- </types>
+ <types>
+ <filesystem/>
+ </types>
+ <category>social</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
- <settings>
- <admin>OCA\ShareByMail\Settings\Admin</admin>
- </settings>
+ <settings>
+ <admin>OCA\ShareByMail\Settings\Admin</admin>
+ </settings>
- <activity>
- <providers>
- <provider>OCA\ShareByMail\Activity</provider>
- </providers>
- </activity>
+ <activity>
+ <providers>
+ <provider>OCA\ShareByMail\Activity</provider>
+ </providers>
+ </activity>
</info>
diff --git a/apps/sharebymail/l10n/fr.js b/apps/sharebymail/l10n/fr.js
index 25aef7b560a..0a66fce6b54 100644
--- a/apps/sharebymail/l10n/fr.js
+++ b/apps/sharebymail/l10n/fr.js
@@ -18,26 +18,26 @@ OC.L10N.register(
"Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé",
"Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s",
"We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.",
- "Failed to send share by email" : "Erreur lors de l'envoi du partage par e-mail",
+ "Failed to send share by email" : "Échec lors de l'envoi du partage par e-mail",
"%s shared »%s« with you" : "%s a partagé «%s» avec vous",
"%s shared »%s« with you." : "%s a partagé «%s» avec vous.",
"Click the button below to open it." : "Cliquez sur le bouton ci-dessous pour l'ouvrir.",
"Open »%s«" : "Ouvrir «%s»",
"%s via %s" : "%s via %s",
- "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n",
- "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.",
- "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s",
- "Password to access »%s«" : "Mot de passe pour accèder à «%s»",
+ "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.\n",
+ "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.",
+ "Password to access »%s« shared to you by %s" : "Mot de passe pour accéder à «%s» partagé avec vous par %s",
+ "Password to access »%s«" : "Mot de passe pour accéder à «%s»",
"It is protected with the following password: %s" : "Il est protégé avec le mot de passe suivant : %s",
"You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Vous venez de partager «%s» avec %s. Le partage a déjà été envoyé au destinataire. En raison de la politique de sécurité définie par l'administrateur de %s, chaque partage a besoin d'être protégé par mot de passe et il n'est pas autorisé d'envoyer le mot de passe directement au destinataire. C'est pourquoi vous devez transmettre le mot de passe manuellement au destinataire.",
"Password to access »%s« shared with %s" : "Mot de passe pour accèder à «%s» partagé avec %s",
"This is the password: %s" : "Voici le mot de passe : %s",
"You can choose a different password at any time in the share dialog." : "Vous pouvez choisir un mot de passe différent à n'importe quel moment dans la boîte de dialogue de partage.",
"Could not find share" : "Impossible de trouver le partage",
- "Share by mail" : "Partage par email",
+ "Share by mail" : "Partage par e-mail",
"Allows users to share a personalized link to a file or folder by putting in an email address." : "Autoriser les utilisateurs de partager un lien personnalisé vers un fichier ou un dossier en renseignant une adresse e-mail.",
- "Send password by mail" : "Envoyer le mot de passe par email",
+ "Send password by mail" : "Envoyer le mot de passe par e-mail",
"Enforce password protection" : "Imposer la protection par mot de passe",
- "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email"
+ "Failed to send share by E-mail" : "Échec lors de l'envoi du partage par e-mail"
},
"nplurals=2; plural=(n > 1);");
diff --git a/apps/sharebymail/l10n/fr.json b/apps/sharebymail/l10n/fr.json
index e1d44b155f9..23cd35032a3 100644
--- a/apps/sharebymail/l10n/fr.json
+++ b/apps/sharebymail/l10n/fr.json
@@ -16,26 +16,26 @@
"Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé",
"Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s",
"We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.",
- "Failed to send share by email" : "Erreur lors de l'envoi du partage par e-mail",
+ "Failed to send share by email" : "Échec lors de l'envoi du partage par e-mail",
"%s shared »%s« with you" : "%s a partagé «%s» avec vous",
"%s shared »%s« with you." : "%s a partagé «%s» avec vous.",
"Click the button below to open it." : "Cliquez sur le bouton ci-dessous pour l'ouvrir.",
"Open »%s«" : "Ouvrir «%s»",
"%s via %s" : "%s via %s",
- "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n",
- "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.",
- "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s",
- "Password to access »%s«" : "Mot de passe pour accèder à «%s»",
+ "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.\n",
+ "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s a partagé «%s» avec vous. Vous avez normalement déjà reçu un autre e-mail avec un lien pour y accéder.",
+ "Password to access »%s« shared to you by %s" : "Mot de passe pour accéder à «%s» partagé avec vous par %s",
+ "Password to access »%s«" : "Mot de passe pour accéder à «%s»",
"It is protected with the following password: %s" : "Il est protégé avec le mot de passe suivant : %s",
"You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Vous venez de partager «%s» avec %s. Le partage a déjà été envoyé au destinataire. En raison de la politique de sécurité définie par l'administrateur de %s, chaque partage a besoin d'être protégé par mot de passe et il n'est pas autorisé d'envoyer le mot de passe directement au destinataire. C'est pourquoi vous devez transmettre le mot de passe manuellement au destinataire.",
"Password to access »%s« shared with %s" : "Mot de passe pour accèder à «%s» partagé avec %s",
"This is the password: %s" : "Voici le mot de passe : %s",
"You can choose a different password at any time in the share dialog." : "Vous pouvez choisir un mot de passe différent à n'importe quel moment dans la boîte de dialogue de partage.",
"Could not find share" : "Impossible de trouver le partage",
- "Share by mail" : "Partage par email",
+ "Share by mail" : "Partage par e-mail",
"Allows users to share a personalized link to a file or folder by putting in an email address." : "Autoriser les utilisateurs de partager un lien personnalisé vers un fichier ou un dossier en renseignant une adresse e-mail.",
- "Send password by mail" : "Envoyer le mot de passe par email",
+ "Send password by mail" : "Envoyer le mot de passe par e-mail",
"Enforce password protection" : "Imposer la protection par mot de passe",
- "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email"
+ "Failed to send share by E-mail" : "Échec lors de l'envoi du partage par e-mail"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php
index 31df8a18951..61c9c01e9ab 100644
--- a/apps/sharebymail/lib/ShareByMailProvider.php
+++ b/apps/sharebymail/lib/ShareByMailProvider.php
@@ -404,7 +404,7 @@ class ShareByMailProvider implements IShareProvider {
$text = $this->l->t('%s shared »%s« with you.', [$initiatorDisplayName, $filename]);
$emailTemplate->addBodyText(
- $text . ' ' . $this->l->t('Click the button below to open it.'),
+ htmlspecialchars($text . ' ' . $this->l->t('Click the button below to open it.')),
$text
);
$emailTemplate->addBodyButton(
@@ -476,7 +476,7 @@ class ShareByMailProvider implements IShareProvider {
$emailTemplate->setSubject($this->l->t('Password to access »%s« shared to you by %s', [$filename, $initiatorDisplayName]));
$emailTemplate->addHeader();
$emailTemplate->addHeading($this->l->t('Password to access »%s«', [$filename]), false);
- $emailTemplate->addBodyText($htmlBodyPart, $plainBodyPart);
+ $emailTemplate->addBodyText(htmlspecialchars($htmlBodyPart), $plainBodyPart);
$emailTemplate->addBodyText($this->l->t('It is protected with the following password: %s', [$password]));
// The "From" contains the sharers name
diff --git a/apps/sharebymail/templates/settings-admin.php b/apps/sharebymail/templates/settings-admin.php
index 50fede86685..5b16f551a56 100644
--- a/apps/sharebymail/templates/settings-admin.php
+++ b/apps/sharebymail/templates/settings-admin.php
@@ -1,6 +1,5 @@
<?php
/** @var array $_ */
-use OCA\Federation\TrustedServers;
/** @var \OCP\IL10N $l */
script('sharebymail', 'settings-admin');
diff --git a/apps/systemtags/appinfo/info.xml b/apps/systemtags/appinfo/info.xml
index e46daf4b042..6484cd450ca 100644
--- a/apps/systemtags/appinfo/info.xml
+++ b/apps/systemtags/appinfo/info.xml
@@ -1,21 +1,26 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>systemtags</id>
<name>Collaborative tags</name>
+ <summary>Collaborative tagging functionality which shares tags among users.</summary>
<description>Collaborative tagging functionality which shares tags among users. Great for teams.
(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Vincent Petry</author>
<author>Joas Schilling</author>
- <default_enable/>
- <version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
<namespace>SystemTags</namespace>
+ <default_enable/>
<types>
<logging/>
</types>
+ <category>files</category>
+ <category>organization</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<settings>
<admin>OCA\SystemTags\Settings\Admin</admin>
</settings>
diff --git a/apps/systemtags/l10n/lv.js b/apps/systemtags/l10n/lv.js
index 116f7a366ec..cc3f8f49898 100644
--- a/apps/systemtags/l10n/lv.js
+++ b/apps/systemtags/l10n/lv.js
@@ -9,7 +9,7 @@ OC.L10N.register(
"Select tags to filter by" : "Izvēlies atzīmes pēc kā filtrēt",
"No tags found" : "Netika atrasta neviena atzīme",
"Please select tags to filter by" : "Lūdzu izvēlies atzīmes pēc kā filtrēt",
- "No files found for the selected tags" : "Faili netika atrasti ar atlasītām atzīmēm",
+ "No files found for the selected tags" : "Datnes ar atlasītām atzīmēm netika atrastas",
"Added system tag %1$s" : "Pievienota sistēmas atzīme %1$s",
"Added system tag {systemtag}" : "Pievienota sistēmas atzīme {systemtag}",
"%1$s added system tag %2$s" : "%1$s pievienota sistēmas atzīme %2$s",
@@ -31,11 +31,11 @@ OC.L10N.register(
"%1$s updated system tag %3$s to %2$s" : "%1$spārmainija sistēmas atzīmi %3$s uz %2$s",
"{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} atjaunināja sistēmas atzīmi {oldsystemtag} uz {newsystemtag}",
"You added system tag %2$s to %1$s" : "Tu pievienoji sistēmas atzīmi %2$s uz %1$s",
- "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} failam {file}",
+ "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} datnei {file}",
"%1$s added system tag %3$s to %2$s" : "%1$spievienoja sistēmas atzīmi %3$s uz %2$s",
- "{actor} added system tag {systemtag} to {file}" : "{actor} added system tag {systemtag} to {file}",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} pievienoja sistēmas atzīmi {systemtag} {file}",
"You removed system tag %2$s from %1$s" : "Tu noņēmi sistēmas atzīmi %2$s no %1$s",
- "You removed system tag {systemtag} from {file}" : "TU noņēmi sistēmas atzīmi {systemtag} no {file}",
+ "You removed system tag {systemtag} from {file}" : "Tu noņēmi sistēmas atzīmi {systemtag} no {file}",
"%1$s removed system tag %3$s from %2$s" : "%1$s noņēma sistēmas atzīmi %3$s no %2$s",
"{actor} removed system tag {systemtag} from {file}" : "{actor} noņēma sistēmas atzīmi {systemtag} no {file}",
"%s (restricted)" : "%s (ierobežots)",
diff --git a/apps/systemtags/l10n/lv.json b/apps/systemtags/l10n/lv.json
index 7359422ea9e..9dd5a05233b 100644
--- a/apps/systemtags/l10n/lv.json
+++ b/apps/systemtags/l10n/lv.json
@@ -7,7 +7,7 @@
"Select tags to filter by" : "Izvēlies atzīmes pēc kā filtrēt",
"No tags found" : "Netika atrasta neviena atzīme",
"Please select tags to filter by" : "Lūdzu izvēlies atzīmes pēc kā filtrēt",
- "No files found for the selected tags" : "Faili netika atrasti ar atlasītām atzīmēm",
+ "No files found for the selected tags" : "Datnes ar atlasītām atzīmēm netika atrastas",
"Added system tag %1$s" : "Pievienota sistēmas atzīme %1$s",
"Added system tag {systemtag}" : "Pievienota sistēmas atzīme {systemtag}",
"%1$s added system tag %2$s" : "%1$s pievienota sistēmas atzīme %2$s",
@@ -29,11 +29,11 @@
"%1$s updated system tag %3$s to %2$s" : "%1$spārmainija sistēmas atzīmi %3$s uz %2$s",
"{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} atjaunināja sistēmas atzīmi {oldsystemtag} uz {newsystemtag}",
"You added system tag %2$s to %1$s" : "Tu pievienoji sistēmas atzīmi %2$s uz %1$s",
- "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} failam {file}",
+ "You added system tag {systemtag} to {file}" : "Tu pievienoji sistēmas atzīmi {systemtag} datnei {file}",
"%1$s added system tag %3$s to %2$s" : "%1$spievienoja sistēmas atzīmi %3$s uz %2$s",
- "{actor} added system tag {systemtag} to {file}" : "{actor} added system tag {systemtag} to {file}",
+ "{actor} added system tag {systemtag} to {file}" : "{actor} pievienoja sistēmas atzīmi {systemtag} {file}",
"You removed system tag %2$s from %1$s" : "Tu noņēmi sistēmas atzīmi %2$s no %1$s",
- "You removed system tag {systemtag} from {file}" : "TU noņēmi sistēmas atzīmi {systemtag} no {file}",
+ "You removed system tag {systemtag} from {file}" : "Tu noņēmi sistēmas atzīmi {systemtag} no {file}",
"%1$s removed system tag %3$s from %2$s" : "%1$s noņēma sistēmas atzīmi %3$s no %2$s",
"{actor} removed system tag {systemtag} from {file}" : "{actor} noņēma sistēmas atzīmi {systemtag} no {file}",
"%s (restricted)" : "%s (ierobežots)",
diff --git a/apps/systemtags/l10n/nl.js b/apps/systemtags/l10n/nl.js
index a778fc7ce7d..0f7aed6ffc5 100644
--- a/apps/systemtags/l10n/nl.js
+++ b/apps/systemtags/l10n/nl.js
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Tags" : "Markering",
"Update" : "Update",
- "Create" : "Creeër",
+ "Create" : "Opslaan",
"Select tag…" : "Selecteren markering…",
"Tagged files" : "Gemarkeerde bestanden",
"Select tags to filter by" : "Selecteer markering om op te filteren",
@@ -41,15 +41,15 @@ OC.L10N.register(
"%s (restricted)" : "%s (beperkt)",
"%s (invisible)" : "%s (onzichtbaar)",
"<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd",
- "Collaborative tags" : "Samenwerk markeringen",
- "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk samenwerkingstags. Deze tags gelden voor alle gebruikers.",
+ "Collaborative tags" : "Systeemtags",
+ "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk systeemtags. Deze tags raken alle gebruikers.",
"Select tag …" : "Selecteer tag …",
- "Name" : "Naam",
+ "Name" : "Tag",
"Delete" : "Verwijder",
- "Public" : "Openbaar",
- "Restricted" : "Beperkt",
+ "Public" : "Standaard",
+ "Restricted" : "Beschermd",
"Invisible" : "Verborgen",
- "Reset" : "Reset",
+ "Reset" : "Herstellen",
"No files in here" : "Hier geen bestanden",
"No entries found in this folder" : "Niets gevonden in deze map",
"Size" : "Grootte",
diff --git a/apps/systemtags/l10n/nl.json b/apps/systemtags/l10n/nl.json
index 1915c7550b0..feac7b8cc93 100644
--- a/apps/systemtags/l10n/nl.json
+++ b/apps/systemtags/l10n/nl.json
@@ -1,7 +1,7 @@
{ "translations": {
"Tags" : "Markering",
"Update" : "Update",
- "Create" : "Creeër",
+ "Create" : "Opslaan",
"Select tag…" : "Selecteren markering…",
"Tagged files" : "Gemarkeerde bestanden",
"Select tags to filter by" : "Selecteer markering om op te filteren",
@@ -39,15 +39,15 @@
"%s (restricted)" : "%s (beperkt)",
"%s (invisible)" : "%s (onzichtbaar)",
"<strong>System tags</strong> for a file have been modified" : "<strong>Systeemmarkeringen</strong> voor een bestand zijn gewijzigd",
- "Collaborative tags" : "Samenwerk markeringen",
- "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk samenwerkingstags. Deze tags gelden voor alle gebruikers.",
+ "Collaborative tags" : "Systeemtags",
+ "Create and edit collaborative tags. These tags affect all users." : "Maak en bewerk systeemtags. Deze tags raken alle gebruikers.",
"Select tag …" : "Selecteer tag …",
- "Name" : "Naam",
+ "Name" : "Tag",
"Delete" : "Verwijder",
- "Public" : "Openbaar",
- "Restricted" : "Beperkt",
+ "Public" : "Standaard",
+ "Restricted" : "Beschermd",
"Invisible" : "Verborgen",
- "Reset" : "Reset",
+ "Reset" : "Herstellen",
"No files in here" : "Hier geen bestanden",
"No entries found in this folder" : "Niets gevonden in deze map",
"Size" : "Grootte",
diff --git a/apps/systemtags/l10n/sk.js b/apps/systemtags/l10n/sk.js
new file mode 100644
index 00000000000..77ddf39e4bb
--- /dev/null
+++ b/apps/systemtags/l10n/sk.js
@@ -0,0 +1,58 @@
+OC.L10N.register(
+ "systemtags",
+ {
+ "Tags" : "Štítky",
+ "Update" : "Aktualizovať",
+ "Create" : "Vytvoriť",
+ "Select tag…" : "Vyber štítok...",
+ "Tagged files" : "Súbory so štítkom",
+ "Select tags to filter by" : "Vybrať štítky pre filter",
+ "No tags found" : "Štítky sa nenašli",
+ "Please select tags to filter by" : "Vyberte štítky pre filtrovanie",
+ "No files found for the selected tags" : "Neboli nájdené žiadne súbory označené vybranými štítkami",
+ "Added system tag %1$s" : "Pridaný systémový štítok %1$s",
+ "Added system tag {systemtag}" : "Pridaný systémový štítok {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s pridal(a) systémový štítok %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} pridal(a) systémový štítok {systemtag}",
+ "Removed system tag %1$s" : "Odstránený systémový štítok %1$s",
+ "Removed system tag {systemtag}" : "Odstránený systémový štítok {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstránil(a) systémový štítok %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You created system tag %1$s" : "Vytvorili ste systémový štítok %1$s",
+ "You created system tag {systemtag}" : "Vytvorili ste systémový štítok {systemtag}",
+ "%1$s created system tag %2$s" : "%1$s vytvoril systémový štítok %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvoril(a) systémový štítok {systemtag}",
+ "You deleted system tag %1$s" : "Zmazali ste systémový štítok %1$s",
+ "You deleted system tag {systemtag}" : "Odstránili ste systémový štítok {systemtag}",
+ "%1$s deleted system tag %2$s" : "%1$s zmazal(a) systémový štítok %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizovali ste systémový štítok %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizovali ste systémový štítok {oldsystemtag} na {newsystemtag}",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval(a) systémový štítok %3$s na %2$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový štítok {oldsystemtag} na {newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Pridali ste systémový štítok %2$s na %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} ste pridali systémový štítok {systemtag}",
+ "%1$s added system tag %3$s to %2$s" : "%1$s k %2$s pridal(a) systémový štítok %3$s",
+ "{actor} added system tag {systemtag} to {file}" : " {actor} k {file} pridal(a) systémový štítok {systemtag}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s ste odstránili systémový štítok %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} ste odstránili systémový štítok {systemtag}",
+ "%1$s removed system tag %3$s from %2$s" : "%1$s odstránil(a) systémový štítok %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstránil(a) systémový štítok {systemtag} z {file}",
+ "%s (restricted)" : "%s (obmedzené)",
+ "%s (invisible)" : "%s (neviditeľné)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové štítky</strong> súboru boli upravené",
+ "Collaborative tags" : "Značky pre spoluprácu",
+ "Create and edit collaborative tags. These tags affect all users." : "Vytvárajte a upravujte štítky pre spoluprácu. Tieto značky ovplyvnia všetkých používateľov.",
+ "Select tag …" : "Vybrať štítok ...",
+ "Name" : "Názov",
+ "Delete" : "Zmazať",
+ "Public" : "Verejné",
+ "Restricted" : "Obmedzené",
+ "Invisible" : "Neviditeľné",
+ "Reset" : "Vynulovať",
+ "No files in here" : "Žiadne súbory",
+ "No entries found in this folder" : "V tomto priečinku sa nič nenašlo",
+ "Size" : "Veľkosť",
+ "Modified" : "Upravené"
+},
+"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/apps/systemtags/l10n/sk.json b/apps/systemtags/l10n/sk.json
new file mode 100644
index 00000000000..a4d4bb32264
--- /dev/null
+++ b/apps/systemtags/l10n/sk.json
@@ -0,0 +1,56 @@
+{ "translations": {
+ "Tags" : "Štítky",
+ "Update" : "Aktualizovať",
+ "Create" : "Vytvoriť",
+ "Select tag…" : "Vyber štítok...",
+ "Tagged files" : "Súbory so štítkom",
+ "Select tags to filter by" : "Vybrať štítky pre filter",
+ "No tags found" : "Štítky sa nenašli",
+ "Please select tags to filter by" : "Vyberte štítky pre filtrovanie",
+ "No files found for the selected tags" : "Neboli nájdené žiadne súbory označené vybranými štítkami",
+ "Added system tag %1$s" : "Pridaný systémový štítok %1$s",
+ "Added system tag {systemtag}" : "Pridaný systémový štítok {systemtag}",
+ "%1$s added system tag %2$s" : "%1$s pridal(a) systémový štítok %2$s",
+ "{actor} added system tag {systemtag}" : "{actor} pridal(a) systémový štítok {systemtag}",
+ "Removed system tag %1$s" : "Odstránený systémový štítok %1$s",
+ "Removed system tag {systemtag}" : "Odstránený systémový štítok {systemtag}",
+ "%1$s removed system tag %2$s" : "%1$s odstránil(a) systémový štítok %2$s",
+ "{actor} removed system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You created system tag %1$s" : "Vytvorili ste systémový štítok %1$s",
+ "You created system tag {systemtag}" : "Vytvorili ste systémový štítok {systemtag}",
+ "%1$s created system tag %2$s" : "%1$s vytvoril systémový štítok %2$s",
+ "{actor} created system tag {systemtag}" : "{actor} vytvoril(a) systémový štítok {systemtag}",
+ "You deleted system tag %1$s" : "Zmazali ste systémový štítok %1$s",
+ "You deleted system tag {systemtag}" : "Odstránili ste systémový štítok {systemtag}",
+ "%1$s deleted system tag %2$s" : "%1$s zmazal(a) systémový štítok %2$s",
+ "{actor} deleted system tag {systemtag}" : "{actor} odstránil(a) systémový štítok {systemtag}",
+ "You updated system tag %2$s to %1$s" : "Aktualizovali ste systémový štítok %2$s na %1$s",
+ "You updated system tag {oldsystemtag} to {newsystemtag}" : "Aktualizovali ste systémový štítok {oldsystemtag} na {newsystemtag}",
+ "%1$s updated system tag %3$s to %2$s" : "%1$s aktualizoval(a) systémový štítok %3$s na %2$s",
+ "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} aktualizoval(a) systémový štítok {oldsystemtag} na {newsystemtag}",
+ "You added system tag %2$s to %1$s" : "Pridali ste systémový štítok %2$s na %1$s",
+ "You added system tag {systemtag} to {file}" : "K {file} ste pridali systémový štítok {systemtag}",
+ "%1$s added system tag %3$s to %2$s" : "%1$s k %2$s pridal(a) systémový štítok %3$s",
+ "{actor} added system tag {systemtag} to {file}" : " {actor} k {file} pridal(a) systémový štítok {systemtag}",
+ "You removed system tag %2$s from %1$s" : "Z %2$s ste odstránili systémový štítok %1$s",
+ "You removed system tag {systemtag} from {file}" : "Z {file} ste odstránili systémový štítok {systemtag}",
+ "%1$s removed system tag %3$s from %2$s" : "%1$s odstránil(a) systémový štítok %3$s z %2$s",
+ "{actor} removed system tag {systemtag} from {file}" : "{actor} odstránil(a) systémový štítok {systemtag} z {file}",
+ "%s (restricted)" : "%s (obmedzené)",
+ "%s (invisible)" : "%s (neviditeľné)",
+ "<strong>System tags</strong> for a file have been modified" : "<strong>Systémové štítky</strong> súboru boli upravené",
+ "Collaborative tags" : "Značky pre spoluprácu",
+ "Create and edit collaborative tags. These tags affect all users." : "Vytvárajte a upravujte štítky pre spoluprácu. Tieto značky ovplyvnia všetkých používateľov.",
+ "Select tag …" : "Vybrať štítok ...",
+ "Name" : "Názov",
+ "Delete" : "Zmazať",
+ "Public" : "Verejné",
+ "Restricted" : "Obmedzené",
+ "Invisible" : "Neviditeľné",
+ "Reset" : "Vynulovať",
+ "No files in here" : "Žiadne súbory",
+ "No entries found in this folder" : "V tomto priečinku sa nič nenašlo",
+ "Size" : "Veľkosť",
+ "Modified" : "Upravené"
+},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
+} \ No newline at end of file
diff --git a/apps/systemtags/lib/Activity/Listener.php b/apps/systemtags/lib/Activity/Listener.php
index 766e08ee8c3..7d84726d537 100644
--- a/apps/systemtags/lib/Activity/Listener.php
+++ b/apps/systemtags/lib/Activity/Listener.php
@@ -34,7 +34,6 @@ use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserSession;
-use OCP\Share;
use OCP\Share\IShareHelper;
use OCP\SystemTag\ISystemTag;
use OCP\SystemTag\ISystemTagManager;
@@ -111,7 +110,7 @@ class Listener {
$activity->setApp('systemtags')
->setType('systemtags')
->setAuthor($actor)
- ->setObject('systemtag', $tag->getId(), $tag->getName());
+ ->setObject('systemtag', (int)$tag->getId(), $tag->getName());
if ($event->getEvent() === ManagerEvent::EVENT_CREATE) {
$activity->setSubject(Provider::CREATE_TAG, [
$actor,
@@ -185,7 +184,7 @@ class Listener {
/** @var Node $node */
$node = array_shift($nodes);
$al = $this->shareHelper->getPathsForAccessList($node);
- $users = array_merge($users, $al['users']);
+ $users += $al['users'];
}
}
@@ -203,6 +202,7 @@ class Listener {
->setObject($event->getObjectType(), (int) $event->getObjectId());
foreach ($users as $user => $path) {
+ $user = (string)$user; // numerical ids could be ints which are not accepted everywhere
$activity->setAffectedUser($user);
foreach ($tags as $tag) {
diff --git a/apps/testing/appinfo/info.xml b/apps/testing/appinfo/info.xml
index d0d350a0364..81be7649d8e 100644
--- a/apps/testing/appinfo/info.xml
+++ b/apps/testing/appinfo/info.xml
@@ -1,15 +1,19 @@
-<?xml version="1.0"?>
-<info>
+<?xml version="1.0"?>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>testing</id>
<name>QA testing</name>
+ <summary>This app is only for testing! It is dangerous to have it enabled in a live instance</summary>
<description>This app is only for testing! It is dangerous to have it enabled in a live instance</description>
- <licence>AGPL</licence>
- <author>Joas Schilling</author>
<version>1.4.0</version>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <licence>agpl</licence>
+ <author>Joas Schilling</author>
<types>
<authentication/>
</types>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
</info>
diff --git a/apps/theming/appinfo/info.xml b/apps/theming/appinfo/info.xml
index d2eacea77b3..63ae7d196c1 100644
--- a/apps/theming/appinfo/info.xml
+++ b/apps/theming/appinfo/info.xml
@@ -1,23 +1,25 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>theming</id>
<name>Theming</name>
+ <summary>Adjust the Nextcloud theme</summary>
<description>Adjust the Nextcloud theme</description>
- <licence>AGPL</licence>
- <author>Nextcloud</author>
<version>1.5.0</version>
+ <licence>agpl</licence>
+ <author>Nextcloud</author>
<namespace>Theming</namespace>
- <category>other</category>
-
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <default_enable/>
<types>
<logging/>
</types>
- <default_enable/>
+ <category>customization</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<settings>
<admin>OCA\Theming\Settings\Admin</admin>
diff --git a/apps/theming/l10n/ar.js b/apps/theming/l10n/ar.js
index fb3c083e51a..a6e648fbec5 100644
--- a/apps/theming/l10n/ar.js
+++ b/apps/theming/l10n/ar.js
@@ -9,6 +9,9 @@ OC.L10N.register(
"The given web address is too long" : "هذا العنوان أطول مما يجب",
"The given slogan is too long" : "هذا الشعار أطول مما يجب",
"The given color is invalid" : "هناك خطأ في اللون",
+ "No file was uploaded" : "لم يتم رفع أي ملف",
+ "Missing a temporary folder" : "المجلد المؤقت غير موجود",
+ "Failed to write file to disk." : "خطأ في الكتابة على القرص الصلب.",
"No file uploaded" : "لم يتم رفع الملف",
"Unsupported image type" : "صيغة الصورة غير مقبولة",
"You are already using a custom theme" : "انت تستعمل قالب مخصص",
diff --git a/apps/theming/l10n/ar.json b/apps/theming/l10n/ar.json
index 940cdb418ba..5616648dd7e 100644
--- a/apps/theming/l10n/ar.json
+++ b/apps/theming/l10n/ar.json
@@ -7,6 +7,9 @@
"The given web address is too long" : "هذا العنوان أطول مما يجب",
"The given slogan is too long" : "هذا الشعار أطول مما يجب",
"The given color is invalid" : "هناك خطأ في اللون",
+ "No file was uploaded" : "لم يتم رفع أي ملف",
+ "Missing a temporary folder" : "المجلد المؤقت غير موجود",
+ "Failed to write file to disk." : "خطأ في الكتابة على القرص الصلب.",
"No file uploaded" : "لم يتم رفع الملف",
"Unsupported image type" : "صيغة الصورة غير مقبولة",
"You are already using a custom theme" : "انت تستعمل قالب مخصص",
diff --git a/apps/theming/l10n/ast.js b/apps/theming/l10n/ast.js
index 7d205db32a0..1155c63b78c 100644
--- a/apps/theming/l10n/ast.js
+++ b/apps/theming/l10n/ast.js
@@ -8,6 +8,8 @@ OC.L10N.register(
"The given web address is too long" : "La direición web dada ye perllarga",
"The given slogan is too long" : "La conseña dada ye perllarga",
"The given color is invalid" : "El color dau ye perllargu",
+ "No file was uploaded" : "Nun se xubieron fichjeros",
+ "Failed to write file to disk." : "Fallu al escribir el ficheru nel discu",
"No file uploaded" : "Nun se xubieron ficheros",
"Unsupported image type" : "Triba non sofitada d'imaxe",
"You are already using a custom theme" : "Yá tas usando un tema personalizáu",
diff --git a/apps/theming/l10n/ast.json b/apps/theming/l10n/ast.json
index e6a8a2e718a..d652ff9d5f5 100644
--- a/apps/theming/l10n/ast.json
+++ b/apps/theming/l10n/ast.json
@@ -6,6 +6,8 @@
"The given web address is too long" : "La direición web dada ye perllarga",
"The given slogan is too long" : "La conseña dada ye perllarga",
"The given color is invalid" : "El color dau ye perllargu",
+ "No file was uploaded" : "Nun se xubieron fichjeros",
+ "Failed to write file to disk." : "Fallu al escribir el ficheru nel discu",
"No file uploaded" : "Nun se xubieron ficheros",
"Unsupported image type" : "Triba non sofitada d'imaxe",
"You are already using a custom theme" : "Yá tas usando un tema personalizáu",
diff --git a/apps/theming/l10n/lv.js b/apps/theming/l10n/lv.js
index 474c584bd53..b4d012e5c63 100644
--- a/apps/theming/l10n/lv.js
+++ b/apps/theming/l10n/lv.js
@@ -9,7 +9,7 @@ OC.L10N.register(
"The given web address is too long" : "Norādītā adrese ir pārāk gara",
"The given slogan is too long" : "Norādītais teiciens ir pārāk garšs",
"The given color is invalid" : "Norādītā krāsa ir nederīga",
- "No file uploaded" : "Nav augšupielādēta faila",
+ "No file uploaded" : "Nav augšupielādēta datne",
"Unsupported image type" : "Neatbalstīts attēla tips",
"You are already using a custom theme" : "Tu jau izmanto pielāgotu tēmu",
"Theming" : "Dizains",
diff --git a/apps/theming/l10n/lv.json b/apps/theming/l10n/lv.json
index 2b38f8b5d5d..3a2e29f8d88 100644
--- a/apps/theming/l10n/lv.json
+++ b/apps/theming/l10n/lv.json
@@ -7,7 +7,7 @@
"The given web address is too long" : "Norādītā adrese ir pārāk gara",
"The given slogan is too long" : "Norādītais teiciens ir pārāk garšs",
"The given color is invalid" : "Norādītā krāsa ir nederīga",
- "No file uploaded" : "Nav augšupielādēta faila",
+ "No file uploaded" : "Nav augšupielādēta datne",
"Unsupported image type" : "Neatbalstīts attēla tips",
"You are already using a custom theme" : "Tu jau izmanto pielāgotu tēmu",
"Theming" : "Dizains",
diff --git a/apps/theming/l10n/nl.js b/apps/theming/l10n/nl.js
index a257a6ed683..5039188df9f 100644
--- a/apps/theming/l10n/nl.js
+++ b/apps/theming/l10n/nl.js
@@ -20,7 +20,7 @@ OC.L10N.register(
"No file uploaded" : "Geen bestand geüpload",
"Unsupported image type" : "Afbeeldingstype wordt niet ondersteund",
"You are already using a custom theme" : "Je gebruikt al een maatwerkthema",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.",
"Name" : "Naam",
"Reset to default" : "Herstellen naar standaard",
diff --git a/apps/theming/l10n/nl.json b/apps/theming/l10n/nl.json
index cd0f5fd0751..28607407e1d 100644
--- a/apps/theming/l10n/nl.json
+++ b/apps/theming/l10n/nl.json
@@ -18,7 +18,7 @@
"No file uploaded" : "Geen bestand geüpload",
"Unsupported image type" : "Afbeeldingstype wordt niet ondersteund",
"You are already using a custom theme" : "Je gebruikt al een maatwerkthema",
- "Theming" : "Thema's",
+ "Theming" : "Uiterlijk",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Thematiseren maakt het mogelijk om uiterlijk en gevoel van je systeem en ondersteunde clients aan te passen. Dit wordt zichtbaar voor alle gebruikers.",
"Name" : "Naam",
"Reset to default" : "Herstellen naar standaard",
diff --git a/apps/theming/l10n/pt_PT.js b/apps/theming/l10n/pt_PT.js
new file mode 100644
index 00000000000..8404ae98ca4
--- /dev/null
+++ b/apps/theming/l10n/pt_PT.js
@@ -0,0 +1,39 @@
+OC.L10N.register(
+ "theming",
+ {
+ "Loading preview…" : "A carregar pre-visualização...",
+ "Saved" : "Guardado",
+ "Admin" : "Administrador",
+ "a safe home for all your data" : "Um local seguro para todos os seus dados",
+ "The given name is too long" : "O nome atribuído é demasiado longo",
+ "The given web address is too long" : "O endereço web atribuído é demasiado longo",
+ "The given slogan is too long" : "O slogan atribuído é demasiado longo",
+ "The given color is invalid" : "A cor atribuída é inválida",
+ "There is no error, the file uploaded with success" : "Não ocorreu nenhum erro, o ficheiro foi carregado com sucesso",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a directiva upload_max_filesize no php.ini ",
+ "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excedo a directiva MAX_FILE_SIZE especificada no formulário HTML",
+ "The uploaded file was only partially uploaded" : "O ficheiro escolhido foi apenas parcialmente carregado",
+ "No file was uploaded" : "O ficheiro foi carregado",
+ "Missing a temporary folder" : "Falta uma pasta temporária",
+ "Failed to write file to disk." : "Falhou a escrever o ficheiro no disco.",
+ "A PHP extension stopped the file upload." : "Uma extensão PHP parou o carregamento do ficheiro.",
+ "No file uploaded" : "Nenhum ficheiro carregado",
+ "Unsupported image type" : "Tipo de imagem não suportado",
+ "You are already using a custom theme" : "Já está a usar um tema personalizado",
+ "Theming" : "Temática",
+ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A tematização possibilita a fácil personalização da aparência da sua instância e clientes suportados. Isto será visível para todos os utilizadores",
+ "Name" : "Nome",
+ "Reset to default" : "Repor original",
+ "Web address" : "Endereço Web",
+ "Web address https://…" : "Endereço Web https::// ...",
+ "Slogan" : "Slogan",
+ "Color" : "Cor",
+ "Logo" : "Logótipo",
+ "Upload new logo" : "Carregar novo logótipo",
+ "Login image" : "Imagem de Login",
+ "Upload new login background" : "Carregar imagem de segundo plano de Login",
+ "Remove background image" : "Remover imagem de segundo plano",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP Imagemagick com suporte para imagens SVG para gerar automaticamente favicons com base na cor e no logotipo carregado.",
+ "reset to default" : "restaurar valor padrão"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/theming/l10n/pt_PT.json b/apps/theming/l10n/pt_PT.json
new file mode 100644
index 00000000000..f71dd3a1962
--- /dev/null
+++ b/apps/theming/l10n/pt_PT.json
@@ -0,0 +1,37 @@
+{ "translations": {
+ "Loading preview…" : "A carregar pre-visualização...",
+ "Saved" : "Guardado",
+ "Admin" : "Administrador",
+ "a safe home for all your data" : "Um local seguro para todos os seus dados",
+ "The given name is too long" : "O nome atribuído é demasiado longo",
+ "The given web address is too long" : "O endereço web atribuído é demasiado longo",
+ "The given slogan is too long" : "O slogan atribuído é demasiado longo",
+ "The given color is invalid" : "A cor atribuída é inválida",
+ "There is no error, the file uploaded with success" : "Não ocorreu nenhum erro, o ficheiro foi carregado com sucesso",
+ "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "O ficheiro carregado excede a directiva upload_max_filesize no php.ini ",
+ "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "O ficheiro carregado excedo a directiva MAX_FILE_SIZE especificada no formulário HTML",
+ "The uploaded file was only partially uploaded" : "O ficheiro escolhido foi apenas parcialmente carregado",
+ "No file was uploaded" : "O ficheiro foi carregado",
+ "Missing a temporary folder" : "Falta uma pasta temporária",
+ "Failed to write file to disk." : "Falhou a escrever o ficheiro no disco.",
+ "A PHP extension stopped the file upload." : "Uma extensão PHP parou o carregamento do ficheiro.",
+ "No file uploaded" : "Nenhum ficheiro carregado",
+ "Unsupported image type" : "Tipo de imagem não suportado",
+ "You are already using a custom theme" : "Já está a usar um tema personalizado",
+ "Theming" : "Temática",
+ "Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "A tematização possibilita a fácil personalização da aparência da sua instância e clientes suportados. Isto será visível para todos os utilizadores",
+ "Name" : "Nome",
+ "Reset to default" : "Repor original",
+ "Web address" : "Endereço Web",
+ "Web address https://…" : "Endereço Web https::// ...",
+ "Slogan" : "Slogan",
+ "Color" : "Cor",
+ "Logo" : "Logótipo",
+ "Upload new logo" : "Carregar novo logótipo",
+ "Login image" : "Imagem de Login",
+ "Upload new login background" : "Carregar imagem de segundo plano de Login",
+ "Remove background image" : "Remover imagem de segundo plano",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Instale a extensão PHP Imagemagick com suporte para imagens SVG para gerar automaticamente favicons com base na cor e no logotipo carregado.",
+ "reset to default" : "restaurar valor padrão"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index f27841c0042..e7865b90cf0 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -32,7 +32,6 @@
namespace OCA\Theming\Controller;
-use OC\Files\AppData\Factory;
use OC\Template\SCSSCacher;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller;
@@ -48,11 +47,11 @@ use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IConfig;
use OCP\IL10N;
-use OCP\ILogger;
use OCP\IRequest;
use OCA\Theming\Util;
use OCP\ITempManager;
use OCP\IURLGenerator;
+use OCP\App\IAppManager;
/**
* Class ThemingController
@@ -80,6 +79,8 @@ class ThemingController extends Controller {
private $scssCacher;
/** @var IURLGenerator */
private $urlGenerator;
+ /** @var IAppManager */
+ private $appManager;
/**
* ThemingController constructor.
@@ -95,6 +96,7 @@ class ThemingController extends Controller {
* @param IAppData $appData
* @param SCSSCacher $scssCacher
* @param IURLGenerator $urlGenerator
+ * @param IAppManager $appManager
*/
public function __construct(
$appName,
@@ -107,7 +109,8 @@ class ThemingController extends Controller {
ITempManager $tempManager,
IAppData $appData,
SCSSCacher $scssCacher,
- IURLGenerator $urlGenerator
+ IURLGenerator $urlGenerator,
+ IAppManager $appManager
) {
parent::__construct($appName, $request);
@@ -120,6 +123,7 @@ class ThemingController extends Controller {
$this->appData = $appData;
$this->scssCacher = $scssCacher;
$this->urlGenerator = $urlGenerator;
+ $this->appManager = $appManager;
}
/**
@@ -411,12 +415,13 @@ class ThemingController extends Controller {
* @return FileDisplayResponse|NotFoundResponse
*/
public function getStylesheet() {
- $appPath = substr(\OC::$server->getAppManager()->getAppPath('theming'), strlen(\OC::$SERVERROOT) + 1);
+ $appPath = $this->appManager->getAppPath('theming');
+
/* SCSSCacher is required here
* We cannot rely on automatic caching done by \OC_Util::addStyle,
* since we need to add the cacheBuster value to the url
*/
- $cssCached = $this->scssCacher->process(\OC::$SERVERROOT, $appPath . '/css/theming.scss', 'theming');
+ $cssCached = $this->scssCacher->process($appPath, 'css/theming.scss', 'theming');
if(!$cssCached) {
return new NotFoundResponse();
}
diff --git a/apps/theming/lib/Util.php b/apps/theming/lib/Util.php
index 2f6f4128365..b72cc5b8996 100644
--- a/apps/theming/lib/Util.php
+++ b/apps/theming/lib/Util.php
@@ -31,7 +31,6 @@ use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\IConfig;
-use OCP\Files\IRootFolder;
use Leafo\ScssPhp\Compiler;
class Util {
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index 54b842bc4e8..debc1b71e47 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -106,7 +106,8 @@ class ThemingControllerTest extends TestCase {
$this->tempManager,
$this->appData,
$this->scssCacher,
- $this->urlGenerator
+ $this->urlGenerator,
+ $this->appManager
);
return parent::setUp();
@@ -798,7 +799,7 @@ class ThemingControllerTest extends TestCase {
public function testGetStylesheet() {
-
+ $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->any())->method('getName')->willReturn('theming.css');
$file->expects($this->any())->method('getContent')->willReturn('compiled');
@@ -818,6 +819,7 @@ class ThemingControllerTest extends TestCase {
}
public function testGetStylesheetFails() {
+ $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn(\OC::$SERVERROOT . '/theming');
$file = $this->createMock(ISimpleFile::class);
$file->expects($this->any())->method('getName')->willReturn('theming.css');
$file->expects($this->any())->method('getContent')->willReturn('compiled');
@@ -829,6 +831,26 @@ class ThemingControllerTest extends TestCase {
$this->assertEquals($response, $actual);
}
+ public function testGetStylesheetOutsideServerroot() {
+ $this->appManager->expects($this->once())->method('getAppPath')->with('theming')->willReturn('/outside/serverroot/theming');
+ $file = $this->createMock(ISimpleFile::class);
+ $file->expects($this->any())->method('getName')->willReturn('theming.css');
+ $file->expects($this->any())->method('getContent')->willReturn('compiled');
+ $this->scssCacher->expects($this->once())->method('process')->with('/outside/serverroot/theming', 'css/theming.scss', 'theming')->willReturn(true);
+ $this->scssCacher->expects($this->once())->method('getCachedCSS')->willReturn($file);
+
+ $response = new Http\FileDisplayResponse($file, Http::STATUS_OK, ['Content-Type' => 'text/css']);
+ $response->cacheFor(86400);
+ $expires = new \DateTime();
+ $expires->setTimestamp($this->timeFactory->getTime());
+ $expires->add(new \DateInterval('PT24H'));
+ $response->addHeader('Expires', $expires->format(\DateTime::RFC1123));
+ $response->addHeader('Pragma', 'cache');
+
+ $actual = $this->themingController->getStylesheet();
+ $this->assertEquals($response, $actual);
+ }
+
public function testGetJavascript() {
$this->themingDefaults
->expects($this->at(0))
diff --git a/apps/twofactor_backupcodes/appinfo/info.xml b/apps/twofactor_backupcodes/appinfo/info.xml
index f2581de63e0..9fe0071a442 100644
--- a/apps/twofactor_backupcodes/appinfo/info.xml
+++ b/apps/twofactor_backupcodes/appinfo/info.xml
@@ -1,29 +1,32 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>twofactor_backupcodes</id>
<name>Two factor backup codes</name>
+ <summary>A two-factor auth backup codes provider</summary>
<description>A two-factor auth backup codes provider</description>
+ <version>1.3.0</version>
<licence>agpl</licence>
<author>Christoph Wurst</author>
- <version>1.3.0</version>
<namespace>TwoFactorBackupCodes</namespace>
- <category>other</category>
+ <category>integration</category>
+ <category>security</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <dependencies>
+ <nextcloud min-version="14" max-version="14" />
+ </dependencies>
<two-factor-providers>
<provider>OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider</provider>
</two-factor-providers>
- <dependencies>
- <nextcloud min-version="14" max-version="14" />
- </dependencies>
+ <settings>
+ <personal>OCA\TwoFactorBackupCodes\Settings\Personal</personal>
+ </settings>
<activity>
<providers>
<provider>OCA\TwoFactorBackupCodes\Activity\Provider</provider>
</providers>
</activity>
-
- <settings>
- <personal>OCA\TwoFactorBackupCodes\Settings\Personal</personal>
- </settings>
</info>
diff --git a/apps/twofactor_backupcodes/l10n/es.js b/apps/twofactor_backupcodes/l10n/es.js
index ef8ae363717..1e168e68dea 100644
--- a/apps/twofactor_backupcodes/l10n/es.js
+++ b/apps/twofactor_backupcodes/l10n/es.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"twofactor_backupcodes",
{
"Generate backup codes" : "Generar códigos de respaldo",
- "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. Ha usado {{used}} de {{total}}.",
+ "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Se han generado los códigos de respaldo. Estás usando {{used}} de {{total}}.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá optenerlos nuevamente después.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
diff --git a/apps/twofactor_backupcodes/l10n/es.json b/apps/twofactor_backupcodes/l10n/es.json
index 9c034570262..51a6e8253f6 100644
--- a/apps/twofactor_backupcodes/l10n/es.json
+++ b/apps/twofactor_backupcodes/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
"Generate backup codes" : "Generar códigos de respaldo",
- "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. Ha usado {{used}} de {{total}}.",
+ "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Se han generado los códigos de respaldo. Estás usando {{used}} de {{total}}.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Por favor guardelos y/o imprimalos ya que no podrá optenerlos nuevamente después.",
"Save backup codes" : "Guardar códigos de respaldo",
"Print backup codes" : "Imprimir códigos de respaldo",
diff --git a/apps/twofactor_backupcodes/l10n/hu.js b/apps/twofactor_backupcodes/l10n/hu.js
index 0d168f9f62b..c363ce82326 100644
--- a/apps/twofactor_backupcodes/l10n/hu.js
+++ b/apps/twofactor_backupcodes/l10n/hu.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Kétfaktoros helyreállítási kódot hoztál létre a fiókodhoz",
"Backup code" : "Biztonsági kód",
"Use backup code" : "Biztonsági kód használata",
+ "Two factor backup codes" : "Kétfaktoros biztonsági mentési kódok",
"Second-factor backup codes" : "Második lépcsős biztonsági kódok"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/hu.json b/apps/twofactor_backupcodes/l10n/hu.json
index 4e981a9acc6..fba5f6f594e 100644
--- a/apps/twofactor_backupcodes/l10n/hu.json
+++ b/apps/twofactor_backupcodes/l10n/hu.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Kétfaktoros helyreállítási kódot hoztál létre a fiókodhoz",
"Backup code" : "Biztonsági kód",
"Use backup code" : "Biztonsági kód használata",
+ "Two factor backup codes" : "Kétfaktoros biztonsági mentési kódok",
"Second-factor backup codes" : "Második lépcsős biztonsági kódok"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/nb.js b/apps/twofactor_backupcodes/l10n/nb.js
index 82ce6520eb0..42fc5031948 100644
--- a/apps/twofactor_backupcodes/l10n/nb.js
+++ b/apps/twofactor_backupcodes/l10n/nb.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Du opprettet to-trinns bekreftelse sikkerhetskopi-koder",
"Backup code" : "Sikkerhetskopi-kode",
"Use backup code" : "Bruker sikkerhetskopi-kode",
+ "Two factor backup codes" : "Sikkerhetskopikoder for tofaktor",
"Second-factor backup codes" : "To-trinns bekreftelse sikkerhetskopi-koder"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/nb.json b/apps/twofactor_backupcodes/l10n/nb.json
index a5d95f4be41..25927e0f6e8 100644
--- a/apps/twofactor_backupcodes/l10n/nb.json
+++ b/apps/twofactor_backupcodes/l10n/nb.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Du opprettet to-trinns bekreftelse sikkerhetskopi-koder",
"Backup code" : "Sikkerhetskopi-kode",
"Use backup code" : "Bruker sikkerhetskopi-kode",
+ "Two factor backup codes" : "Sikkerhetskopikoder for tofaktor",
"Second-factor backup codes" : "To-trinns bekreftelse sikkerhetskopi-koder"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/nl.js b/apps/twofactor_backupcodes/l10n/nl.js
index 968e9cdb1a6..3bad60ac7cc 100644
--- a/apps/twofactor_backupcodes/l10n/nl.js
+++ b/apps/twofactor_backupcodes/l10n/nl.js
@@ -13,6 +13,7 @@ OC.L10N.register(
"You created two-factor backup codes for your account" : "Je creëerde tweefactor back-up codes voor je account",
"Backup code" : "Backup code",
"Use backup code" : "Gebruik backup code",
+ "Two factor backup codes" : "Twee-factor backupcode",
"Second-factor backup codes" : "Twee-factor backup code"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/twofactor_backupcodes/l10n/nl.json b/apps/twofactor_backupcodes/l10n/nl.json
index e3db86e4d93..02881d944b2 100644
--- a/apps/twofactor_backupcodes/l10n/nl.json
+++ b/apps/twofactor_backupcodes/l10n/nl.json
@@ -11,6 +11,7 @@
"You created two-factor backup codes for your account" : "Je creëerde tweefactor back-up codes voor je account",
"Backup code" : "Backup code",
"Use backup code" : "Gebruik backup code",
+ "Two factor backup codes" : "Twee-factor backupcode",
"Second-factor backup codes" : "Twee-factor backup code"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/updatenotification/Makefile b/apps/updatenotification/Makefile
new file mode 100644
index 00000000000..49f84eab32f
--- /dev/null
+++ b/apps/updatenotification/Makefile
@@ -0,0 +1,47 @@
+app_name=updatenotification
+
+project_dir=$(CURDIR)/../$(app_name)
+build_dir=$(CURDIR)/build
+source_dir=$(build_dir)/$(app_name)
+sign_dir=$(build_dir)/sign
+
+all: package
+
+dev-setup: clean npm-update build-js
+
+npm-update:
+ rm -rf node_modules
+ npm update
+
+build-js:
+ npm run dev
+
+build-js-production:
+ npm run build
+
+clean:
+ rm -rf $(build_dir)
+
+package: clean build-js-production
+ mkdir -p $(source_dir)
+ rsync -a \
+ --exclude=/build \
+ --exclude=/docs \
+ --exclude=/js-src \
+ --exclude=/l10n/.tx \
+ --exclude=/tests \
+ --exclude=/.git \
+ --exclude=/.github \
+ --exclude=/CONTRIBUTING.md \
+ --exclude=/issue_template.md \
+ --exclude=/README.md \
+ --exclude=/.gitignore \
+ --exclude=/.scrutinizer.yml \
+ --exclude=/.travis.yml \
+ --exclude=/.drone.yml \
+ --exclude=/node_modules \
+ --exclude=/npm-debug.log \
+ --exclude=/package.json \
+ --exclude=/package-lock.json \
+ --exclude=/Makefile \
+ $(project_dir)/ $(source_dir)
diff --git a/apps/updatenotification/appinfo/info.xml b/apps/updatenotification/appinfo/info.xml
index 14ec98916ab..a227ccd6557 100644
--- a/apps/updatenotification/appinfo/info.xml
+++ b/apps/updatenotification/appinfo/info.xml
@@ -1,13 +1,17 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>updatenotification</id>
<name>Update notification</name>
+ <summary>Displays update notifications for Nextcloud and provides the SSO for the updater.</summary>
<description>Displays update notifications for Nextcloud and provides the SSO for the updater.</description>
- <licence>AGPL</licence>
- <author>Lukas Reschke</author>
<version>1.4.1</version>
+ <licence>agpl</licence>
+ <author>Lukas Reschke</author>
<namespace>UpdateNotification</namespace>
<default_enable/>
+ <category>monitoring</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/updatenotification/css/admin.css b/apps/updatenotification/css/admin.css
index 59c8f056fbc..c136b61d097 100644
--- a/apps/updatenotification/css/admin.css
+++ b/apps/updatenotification/css/admin.css
@@ -1,3 +1,4 @@
+#updatenotification p,
#oca_updatenotification_section p {
margin: 25px 0;
}
diff --git a/apps/updatenotification/js-src/app.js b/apps/updatenotification/js-src/app.js
new file mode 100644
index 00000000000..bf96a2ff326
--- /dev/null
+++ b/apps/updatenotification/js-src/app.js
@@ -0,0 +1,53 @@
+/**
+ * @copyright (c) 2018 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+
+/* global $, define */
+
+define(function (require) {
+ "use strict";
+
+ return {
+
+ /** @type {Vue|null} */
+ vm: null,
+
+ /**
+ * Initialise the app
+ */
+ initialise: function() {
+ var data = JSON.parse($('#updatenotification').attr('data-json'));
+ var Vue = require('vue');
+ var vSelect = require('vue-select');
+ Vue.component('v-select', vSelect.VueSelect);
+ Vue.mixin({
+ methods: {
+ t: function(app, text, vars, count, options) {
+ return OC.L10N.translate(app, text, vars, count, options);
+ },
+ n: function(app, textSingular, textPlural, count, vars, options) {
+ return OC.L10N.translatePlural(app, textSingular, textPlural, count, vars, options);
+ }
+ }
+ });
+ this.vm = new Vue(require('./components/root.vue'));
+
+ this.vm.newVersionString = data.newVersionString;
+ this.vm.lastCheckedDate = data.lastChecked;
+ this.vm.isUpdateChecked = data.isUpdateChecked;
+ this.vm.updaterEnabled = data.updaterEnabled;
+ this.vm.downloadLink = data.downloadLink;
+ this.vm.isNewVersionAvailable = data.isNewVersionAvailable;
+ this.vm.updateServerURL = data.updateServerURL;
+ this.vm.currentChannel = data.currentChannel;
+ this.vm.channels = data.channels;
+ this.vm.notifyGroups = data.notifyGroups;
+ this.vm.isDefaultUpdateServerURL = data.isDefaultUpdateServerURL;
+ }
+ };
+});
diff --git a/apps/updatenotification/js-src/components/root.vue b/apps/updatenotification/js-src/components/root.vue
new file mode 100644
index 00000000000..a6c78d9cdf0
--- /dev/null
+++ b/apps/updatenotification/js-src/components/root.vue
@@ -0,0 +1,180 @@
+<template>
+ <div id="updatenotification" class="followupsection">
+ <p>
+ <template v-if="isNewVersionAvailable">
+ <strong>{{newVersionAvailableString}}</strong>
+ <input v-if="updaterEnabled" type="button" @click="clickUpdaterButton" id="oca_updatenotification_button" :value="t('updatenotification', 'Open updater')">
+ <a v-if="downloadLink" :href="downloadLink" class="button" :class="{ hidden: !updaterEnabled }">{{ t('updatenotification', 'Download now') }}</a>
+ </template>
+ <template v-else-if="!isUpdateChecked">{{ t('updatenotification', 'The update check is not yet finished. Please refresh the page.') }}</template>
+ <template v-else>
+ {{ t('updatenotification', 'Your version is up to date.') }}
+ <span class="icon-info svg" :title="lastCheckedOnString"></span>
+ </template>
+
+ <template v-if="!isDefaultUpdateServerURL">
+ <br />
+ <em>{{ t('updatenotification', 'A non-default update server is in use to be checked for updates:') }} <code>{{updateServerURL}}</code></em>
+ </template>
+ </p>
+
+ <p>
+ <label for="release-channel">{{ t('updatenotification', 'Update channel:') }}</label>
+ <select id="release-channel" v-model="currentChannel" @change="changeReleaseChannel">
+ <option v-for="channel in channels" :value="channel">{{channel}}</option>
+ </select>
+ <span id="channel_save_msg" class="msg"></span><br />
+ <em>{{ t('updatenotification', 'You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel.') }}</em><br />
+ <em>{{ t('updatenotification', 'Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found.') }}</em>
+ </p>
+
+ <p id="oca_updatenotification_groups">
+ {{ t('updatenotification', 'Notify members of the following groups about available updates:') }}
+ <v-select multiple :value="notifyGroups" :options="availableGroups"></v-select><br />
+ <em v-if="currentChannel === 'daily' || currentChannel === 'git'">{{ t('updatenotification', 'Only notification for app updates are available.') }}</em>
+ <em v-if="currentChannel === 'daily'">{{ t('updatenotification', 'The selected update channel makes dedicated notifications for the server obsolete.') }}</em>
+ <em v-if="currentChannel === 'git'">{{ t('updatenotification', 'The selected update channel does not support updates of the server.') }}</em>
+ </p>
+ </div>
+</template>
+
+<script>
+ export default {
+ name: "root",
+
+ el: '#updatenotification',
+
+ data: function () {
+ return {
+ newVersionString: '',
+ lastCheckedDate: '',
+ isUpdateChecked: false,
+ updaterEnabled: true,
+ downloadLink: '',
+ isNewVersionAvailable: false,
+ updateServerURL: '',
+ currentChannel: '',
+ channels: [],
+ notifyGroups: '',
+ availableGroups: [],
+ isDefaultUpdateServerURL: true,
+ enableChangeWatcher: false
+ };
+ },
+
+ _$el: null,
+ _$releaseChannel: null,
+ _$notifyGroups: null,
+
+ watch: {
+ notifyGroups: function(selectedOptions) {
+ if (!this.enableChangeWatcher) {
+ return;
+ }
+
+ var selectedGroups = [];
+ _.each(selectedOptions, function(group) {
+ selectedGroups.push(group.value);
+ });
+
+ OCP.AppConfig.setValue('updatenotification', 'notify_groups', JSON.stringify(selectedGroups));
+ }
+ },
+
+ computed: {
+ newVersionAvailableString: function() {
+ return t('updatenotification', 'A new version is available: {newVersionString}', {
+ newVersionString: this.newVersionString
+ });
+ },
+ lastCheckedOnString: function() {
+ return t('updatenotification', 'Checked on {lastCheckedDate}', {
+ lastCheckedDate: this.lastCheckedDate
+ });
+ }
+ },
+
+ methods: {
+ /**
+ * Creates a new authentication token and loads the updater URL
+ */
+ clickUpdaterButton: function() {
+ $.ajax({
+ url: OC.generateUrl('/apps/updatenotification/credentials')
+ }).success(function(data) {
+ $.ajax({
+ url: OC.getRootPath()+'/updater/',
+ headers: {
+ 'X-Updater-Auth': data
+ },
+ method: 'POST',
+ success: function(data){
+ if(data !== 'false') {
+ var body = $('body');
+ $('head').remove();
+ body.html(data);
+
+ // Eval the script elements in the response
+ var dom = $(data);
+ dom.filter('script').each(function() {
+ eval(this.text || this.textContent || this.innerHTML || '');
+ });
+
+ body.removeAttr('id');
+ body.attr('id', 'body-settings');
+ }
+ },
+ error: function() {
+ OC.Notification.showTemporary(t('updatenotification', 'Could not start updater, please try the manual update'));
+ this.updaterEnabled = false;
+ }.bind(this)
+ });
+ }.bind(this));
+ },
+ changeReleaseChannel: function() {
+ this.currentChannel = this._$releaseChannel.val();
+
+ $.ajax({
+ url: OC.generateUrl('/apps/updatenotification/channel'),
+ type: 'POST',
+ data: {
+ 'channel': this.currentChannel
+ },
+ success: function (data) {
+ OC.msg.finishedAction('#channel_save_msg', data);
+ }
+ });
+ }
+ },
+
+ mounted: function () {
+ this._$el = $(this.$el);
+ this._$releaseChannel = this._$el.find('#release-channel');
+ this._$notifyGroups = this._$el.find('#oca_updatenotification_groups_list');
+ this._$notifyGroups.on('change', function () {
+ this.$emit('input');
+ }.bind(this));
+
+ $.ajax({
+ url: OC.generateUrl('/settings/users/groups'),
+ dataType: 'json',
+ success: function(data) {
+ var results = [];
+ $.each(data.data.adminGroups, function(i, group) {
+ results.push({value: group.id, label: group.name});
+ });
+ $.each(data.data.groups, function(i, group) {
+ results.push({value: group.id, label: group.name});
+ });
+
+ this.availableGroups = results;
+ this.enableChangeWatcher = true;
+ }.bind(this)
+ });
+ },
+
+ updated: function () {
+ this._$el.find('.icon-info').tooltip({placement: 'right'});
+ }
+ }
+</script>
diff --git a/apps/updatenotification/js-src/init.js b/apps/updatenotification/js-src/init.js
new file mode 100644
index 00000000000..7730affb527
--- /dev/null
+++ b/apps/updatenotification/js-src/init.js
@@ -0,0 +1,31 @@
+/**
+ * @copyright Copyright (c) 2018 Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/* global define, $ */
+
+define(function(require) {
+ 'use strict';
+
+ var App = require('./app');
+
+ $(function() {
+ App.initialise();
+ });
+});
diff --git a/apps/updatenotification/js-src/webpack.config.js b/apps/updatenotification/js-src/webpack.config.js
new file mode 100644
index 00000000000..1e62a3de9c9
--- /dev/null
+++ b/apps/updatenotification/js-src/webpack.config.js
@@ -0,0 +1,56 @@
+var path = require('path');
+var webpack = require('webpack');
+
+module.exports = {
+ entry: './js-src/init.js',
+ output: {
+ path: path.resolve(__dirname, '../js'),
+ publicPath: '/',
+ filename: 'merged.js'
+ },
+ module: {
+ rules: [
+ {
+ test: /\.vue$/,
+ loader: 'vue-loader',
+ options: {
+ loaders: {
+ },
+ esModule: false
+ // other vue-loader options go here
+ }
+ }
+ ]
+ },
+ resolve: {
+ alias: {
+ 'vue-select': 'vue-select/dist/vue-select.js',
+ 'vue': process.env.NODE_ENV === 'production' ? 'vue/dist/vue.min.js' : 'vue/dist/vue.js'
+ }
+ },
+ performance: {
+ hints: false
+ },
+ devtool: '#eval-source-map'
+};
+
+if (process.env.NODE_ENV === 'production') {
+ module.exports.devtool = '#source-map';
+ // http://vue-loader.vuejs.org/en/workflow/production.html
+ module.exports.plugins = (module.exports.plugins || []).concat([
+ new webpack.DefinePlugin({
+ 'process.env': {
+ NODE_ENV: '"production"'
+ }
+ }),
+ new webpack.optimize.UglifyJsPlugin({
+ sourceMap: true,
+ compress: {
+ warnings: false
+ }
+ }),
+ new webpack.LoaderOptionsPlugin({
+ minimize: true
+ })
+ ]);
+}
diff --git a/apps/updatenotification/js/admin.js b/apps/updatenotification/js/admin.js
deleted file mode 100644
index 93b42295a23..00000000000
--- a/apps/updatenotification/js/admin.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright (c) 2016 ownCloud Inc
- *
- * @author Lukas Reschke <lukas@owncloud.com>
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-
-/**
- * Creates a new authentication token and loads the updater URL
- */
-var loginToken = '';
-$(document).ready(function(){
- $('#oca_updatenotification_button').click(function() {
- // Load the new token
- $.ajax({
- url: OC.generateUrl('/apps/updatenotification/credentials')
- }).success(function(data) {
- loginToken = data;
- $.ajax({
- url: OC.webroot+'/updater/',
- headers: {
- 'X-Updater-Auth': loginToken
- },
- method: 'POST',
- success: function(data){
- if(data !== 'false') {
- var body = $('body');
- $('head').remove();
- body.html(data);
-
- // Eval the script elements in the response
- var dom = $(data);
- dom.filter('script').each(function() {
- eval(this.text || this.textContent || this.innerHTML || '');
- });
-
- body.removeAttr('id');
- body.attr('id', 'body-settings');
- }
- },
- error: function(){
- OC.Notification.showTemporary(t('updatenotification', 'Could not start updater, please try the manual update'));
- $('#oca_updatenotification_button').addClass('hidden');
- $('#oca_updatenotification_section .button').removeClass('hidden');
- }
- });
- });
- });
-
- $('#release-channel').change(function() {
- var newChannel = $('#release-channel').find(":selected").val();
-
- if (newChannel === 'git' || newChannel === 'daily') {
- $('#oca_updatenotification_groups em').removeClass('hidden');
- } else {
- $('#oca_updatenotification_groups em').addClass('hidden');
- }
-
- $.post(
- OC.generateUrl('/apps/updatenotification/channel'),
- {
- 'channel': newChannel
- },
- function(data){
- OC.msg.finishedAction('#channel_save_msg', data);
- }
- );
- });
-
- var $notificationTargetGroups = $('#oca_updatenotification_groups_list');
- OC.Settings.setupGroupsSelect($notificationTargetGroups);
- $notificationTargetGroups.change(function(ev) {
- var groups = ev.val || [];
- groups = JSON.stringify(groups);
- OCP.AppConfig.setValue('updatenotification', 'notify_groups', groups);
- });
-
- $('#oca_updatenotification_section .icon-info').tooltip({placement: 'right'});
-});
diff --git a/apps/updatenotification/js/notification.js b/apps/updatenotification/js/legacy-notification.js
index a588ede5ffd..d45ba8793c4 100644
--- a/apps/updatenotification/js/notification.js
+++ b/apps/updatenotification/js/legacy-notification.js
@@ -11,7 +11,7 @@
*/
/**
- * this gets only loaded if an update is available and then shows a temporary notification
+ * This only gets loaded if an update is available and the notifications app is not enabled for the user.
*/
$(document).ready(function(){
var text = t('core', '{version} is available. Get more information on how to update.', {version: oc_updateState.updateVersion}),
diff --git a/apps/updatenotification/l10n/es.js b/apps/updatenotification/l10n/es.js
index fa2038ea0b8..baf5215988c 100644
--- a/apps/updatenotification/l10n/es.js
+++ b/apps/updatenotification/l10n/es.js
@@ -1,12 +1,12 @@
OC.L10N.register(
"updatenotification",
{
- "Could not start updater, please try the manual update" : "No se pudo iniciar el actualizador, por favor inténtalo de forma manual la actualización",
+ "Could not start updater, please try the manual update" : "No se ha podido iniciar el actualizador. Por favor, prueba a realizar la actualización de forma manual",
"{version} is available. Get more information on how to update." : "{version} está disponible. Obtenga más información sobre cómo actualizar.",
"Update notifications" : "Actualizar notificaciones",
"Channel updated" : "Canal actualizado",
- "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no se ha podido alcanzar desde hace %d días para comprobar nuevas actualizaciones.",
- "Please check the Nextcloud and server log files for errors." : "Por favor revise los archivos de registros para Nextcloud y el servidor en búsca de errores.",
+ "The update server could not be reached since %d days to check for new updates." : "No se ha podido contactar con el servidor de actualizaciones desde hace %d días para comprobar nuevas actualizaciones.",
+ "Please check the Nextcloud and server log files for errors." : "Por favor, revisa que no haya errores en Nextcloud y en los archivos de registro.",
"Update to %1$s is available." : "Actualización a %1$s esta disponible.",
"Update for %1$s to version %2$s is available." : "La actualización de %1$s a la versión %2$s está disponible.",
"Update for {app} to version %s is available." : "Actualización de {app} a la versión %s disponible.",
diff --git a/apps/updatenotification/l10n/es.json b/apps/updatenotification/l10n/es.json
index 6a8f4f87d5b..cca1c7e53fc 100644
--- a/apps/updatenotification/l10n/es.json
+++ b/apps/updatenotification/l10n/es.json
@@ -1,10 +1,10 @@
{ "translations": {
- "Could not start updater, please try the manual update" : "No se pudo iniciar el actualizador, por favor inténtalo de forma manual la actualización",
+ "Could not start updater, please try the manual update" : "No se ha podido iniciar el actualizador. Por favor, prueba a realizar la actualización de forma manual",
"{version} is available. Get more information on how to update." : "{version} está disponible. Obtenga más información sobre cómo actualizar.",
"Update notifications" : "Actualizar notificaciones",
"Channel updated" : "Canal actualizado",
- "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no se ha podido alcanzar desde hace %d días para comprobar nuevas actualizaciones.",
- "Please check the Nextcloud and server log files for errors." : "Por favor revise los archivos de registros para Nextcloud y el servidor en búsca de errores.",
+ "The update server could not be reached since %d days to check for new updates." : "No se ha podido contactar con el servidor de actualizaciones desde hace %d días para comprobar nuevas actualizaciones.",
+ "Please check the Nextcloud and server log files for errors." : "Por favor, revisa que no haya errores en Nextcloud y en los archivos de registro.",
"Update to %1$s is available." : "Actualización a %1$s esta disponible.",
"Update for %1$s to version %2$s is available." : "La actualización de %1$s a la versión %2$s está disponible.",
"Update for {app} to version %s is available." : "Actualización de {app} a la versión %s disponible.",
diff --git a/apps/updatenotification/l10n/hu.js b/apps/updatenotification/l10n/hu.js
index d9a9d308f63..a78f684ba0f 100644
--- a/apps/updatenotification/l10n/hu.js
+++ b/apps/updatenotification/l10n/hu.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "%1$s frissítés elérhető.",
"Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Update for {app} to version %s is available." : "{app} %s verzió frissítése elérhető",
+ "Update notification" : "Frissítési értesítés",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
"Download now" : "Letöltés most",
diff --git a/apps/updatenotification/l10n/hu.json b/apps/updatenotification/l10n/hu.json
index f800931c2dc..823d230615a 100644
--- a/apps/updatenotification/l10n/hu.json
+++ b/apps/updatenotification/l10n/hu.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "%1$s frissítés elérhető.",
"Update for %1$s to version %2$s is available." : "%1$s frissíthető %2$s verzióra.",
"Update for {app} to version %s is available." : "{app} %s verzió frissítése elérhető",
+ "Update notification" : "Frissítési értesítés",
"A new version is available: %s" : "Új verzió érhető el: %s",
"Open updater" : "Frissítő megnyitása",
"Download now" : "Letöltés most",
diff --git a/apps/updatenotification/l10n/nl.js b/apps/updatenotification/l10n/nl.js
index 89e6ecf2f14..49df2ea15b3 100644
--- a/apps/updatenotification/l10n/nl.js
+++ b/apps/updatenotification/l10n/nl.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "Update naar %1$s is beschikbaar.",
"Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.",
"Update for {app} to version %s is available." : "Update voor {app} naar versie %s is beschikbaar.",
+ "Update notification" : "Bijwerkmelding",
"A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s",
"Open updater" : "Open updater",
"Download now" : "Download nu",
diff --git a/apps/updatenotification/l10n/nl.json b/apps/updatenotification/l10n/nl.json
index 44e63a8c181..7bf173e3b1e 100644
--- a/apps/updatenotification/l10n/nl.json
+++ b/apps/updatenotification/l10n/nl.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "Update naar %1$s is beschikbaar.",
"Update for %1$s to version %2$s is available." : "Update voor %1$s naar versie %2$s is beschikbaar.",
"Update for {app} to version %s is available." : "Update voor {app} naar versie %s is beschikbaar.",
+ "Update notification" : "Bijwerkmelding",
"A new version is available: %s" : "Er is een nieuwe versie beschikbaar: %s",
"Open updater" : "Open updater",
"Download now" : "Download nu",
diff --git a/apps/updatenotification/l10n/ru.js b/apps/updatenotification/l10n/ru.js
index 7f5a0833cdc..d223ecc3ba2 100644
--- a/apps/updatenotification/l10n/ru.js
+++ b/apps/updatenotification/l10n/ru.js
@@ -1,15 +1,16 @@
OC.L10N.register(
"updatenotification",
{
- "Could not start updater, please try the manual update" : "Не удалось обновить. Пожалуйста, выполните обновление вручную.",
+ "Could not start updater, please try the manual update" : "Не удалось обновить. Выполните обновление вручную.",
"{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.",
"Update notifications" : "Уведомления об обновлениях",
"Channel updated" : "Канал обновлен.",
"The update server could not be reached since %d days to check for new updates." : "Сервер обновлений недоступен для проверки наличия обновлений дней: %d.",
- "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
+ "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
"Update to %1$s is available." : "Доступно обновление до версии %1$s.",
"Update for %1$s to version %2$s is available." : "Для приложения «%1$s» доступно обновление до версии %2$s.",
"Update for {app} to version %s is available." : "Для приложения «{app}» доступно обновление до версии %s.",
+ "Update notification" : "Уведомление о новой версии",
"A new version is available: %s" : "Доступна новая версия: %s",
"Open updater" : "Открыть окно обновления",
"Download now" : "Скачать сейчас",
@@ -19,7 +20,7 @@ OC.L10N.register(
"A non-default update server is in use to be checked for updates:" : "Не сервер по умолчанию используется как сервер для проверки обновлений:",
"Update channel:" : "Канал обновлений:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Вы всегда можете переключиться на экспериментальный канал обновлений для получения новейших версий. Но учтите, что вы не сможете переключиться обратно на канал обновлений для стабильных версий.",
- "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что от момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
+ "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что с момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
"Notify members of the following groups about available updates:" : "Уведомить членов следующих групп о наличии доступных обновлений:",
"Only notification for app updates are available." : "Только уведомления об обновлении приложений доступны.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Выбранный канал обновлений высылает специальные уведомления, если сервер устарел.",
diff --git a/apps/updatenotification/l10n/ru.json b/apps/updatenotification/l10n/ru.json
index cb11fc0f0d0..85f02374b24 100644
--- a/apps/updatenotification/l10n/ru.json
+++ b/apps/updatenotification/l10n/ru.json
@@ -1,13 +1,14 @@
{ "translations": {
- "Could not start updater, please try the manual update" : "Не удалось обновить. Пожалуйста, выполните обновление вручную.",
+ "Could not start updater, please try the manual update" : "Не удалось обновить. Выполните обновление вручную.",
"{version} is available. Get more information on how to update." : "Доступна версия {version}. Получить дополнительную информацию о порядке обновления.",
"Update notifications" : "Уведомления об обновлениях",
"Channel updated" : "Канал обновлен.",
"The update server could not be reached since %d days to check for new updates." : "Сервер обновлений недоступен для проверки наличия обновлений дней: %d.",
- "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
+ "Please check the Nextcloud and server log files for errors." : "Проверьте наличие ошибок в файлах журналов Nextcloud и сервера.",
"Update to %1$s is available." : "Доступно обновление до версии %1$s.",
"Update for %1$s to version %2$s is available." : "Для приложения «%1$s» доступно обновление до версии %2$s.",
"Update for {app} to version %s is available." : "Для приложения «{app}» доступно обновление до версии %s.",
+ "Update notification" : "Уведомление о новой версии",
"A new version is available: %s" : "Доступна новая версия: %s",
"Open updater" : "Открыть окно обновления",
"Download now" : "Скачать сейчас",
@@ -17,7 +18,7 @@
"A non-default update server is in use to be checked for updates:" : "Не сервер по умолчанию используется как сервер для проверки обновлений:",
"Update channel:" : "Канал обновлений:",
"You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Вы всегда можете переключиться на экспериментальный канал обновлений для получения новейших версий. Но учтите, что вы не сможете переключиться обратно на канал обновлений для стабильных версий.",
- "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что от момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
+ "Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found." : "Обратите внимание, что с момента выпуска новой версии до её появления здесь может пройти некоторое время. Мы растягиваем во времени распространение новых версий и иногда, при обнаружении проблем, пропускаем версию.",
"Notify members of the following groups about available updates:" : "Уведомить членов следующих групп о наличии доступных обновлений:",
"Only notification for app updates are available." : "Только уведомления об обновлении приложений доступны.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Выбранный канал обновлений высылает специальные уведомления, если сервер устарел.",
diff --git a/apps/updatenotification/l10n/sk.js b/apps/updatenotification/l10n/sk.js
index aaa96cebf0c..e03b9ebb29e 100644
--- a/apps/updatenotification/l10n/sk.js
+++ b/apps/updatenotification/l10n/sk.js
@@ -3,13 +3,14 @@ OC.L10N.register(
{
"Could not start updater, please try the manual update" : "Nebolo možné spustiť aktualizátor, skúste prosím manuálnu aktualizáciu",
"{version} is available. Get more information on how to update." : "{version} je dostupná. Získajte viac informácií o postupe aktualizácie.",
- "Update notifications" : "Upozornenia aktualizácií",
+ "Update notifications" : "Aktualizovať hlásenia",
"Channel updated" : "Kanál bol aktualizovaný",
"The update server could not be reached since %d days to check for new updates." : "Aktualizačný server je nedostupný %d dní pre kontrolu aktualizácií.",
"Please check the Nextcloud and server log files for errors." : "Chyby skontrolujte prosím v logoch Nextcloud a webového servera",
"Update to %1$s is available." : "Je dostupná aktualizácia na verziu %1$s.",
"Update for %1$s to version %2$s is available." : "Pre %1$s je dostupná aktualizácia na verziu %2$s.",
"Update for {app} to version %s is available." : "Pre {app} je dostupná aktualizácia na verziu %s.",
+ "Update notification" : "Aktualizovať hlásenie",
"A new version is available: %s" : "Je dostupná nová verzia: %s",
"Open updater" : "Otvoriť aktualizátor",
"Download now" : "Stiahnuť teraz",
diff --git a/apps/updatenotification/l10n/sk.json b/apps/updatenotification/l10n/sk.json
index 67391c3c882..c9ab08aa98f 100644
--- a/apps/updatenotification/l10n/sk.json
+++ b/apps/updatenotification/l10n/sk.json
@@ -1,13 +1,14 @@
{ "translations": {
"Could not start updater, please try the manual update" : "Nebolo možné spustiť aktualizátor, skúste prosím manuálnu aktualizáciu",
"{version} is available. Get more information on how to update." : "{version} je dostupná. Získajte viac informácií o postupe aktualizácie.",
- "Update notifications" : "Upozornenia aktualizácií",
+ "Update notifications" : "Aktualizovať hlásenia",
"Channel updated" : "Kanál bol aktualizovaný",
"The update server could not be reached since %d days to check for new updates." : "Aktualizačný server je nedostupný %d dní pre kontrolu aktualizácií.",
"Please check the Nextcloud and server log files for errors." : "Chyby skontrolujte prosím v logoch Nextcloud a webového servera",
"Update to %1$s is available." : "Je dostupná aktualizácia na verziu %1$s.",
"Update for %1$s to version %2$s is available." : "Pre %1$s je dostupná aktualizácia na verziu %2$s.",
"Update for {app} to version %s is available." : "Pre {app} je dostupná aktualizácia na verziu %s.",
+ "Update notification" : "Aktualizovať hlásenie",
"A new version is available: %s" : "Je dostupná nová verzia: %s",
"Open updater" : "Otvoriť aktualizátor",
"Download now" : "Stiahnuť teraz",
diff --git a/apps/updatenotification/l10n/sv.js b/apps/updatenotification/l10n/sv.js
index a360615d947..8d5ccfdc525 100644
--- a/apps/updatenotification/l10n/sv.js
+++ b/apps/updatenotification/l10n/sv.js
@@ -10,6 +10,7 @@ OC.L10N.register(
"Update to %1$s is available." : "Uppdatering till %1$s är tillgänglig.",
"Update for %1$s to version %2$s is available." : "Uppdatering för %1$s till version %2$s är tillgänglig.",
"Update for {app} to version %s is available." : "Uppdatering för {app} till version %s är tillgänglig.",
+ "Update notification" : "Uppdatera notifikation",
"A new version is available: %s" : "En ny version är tillgänglig: %s",
"Open updater" : "Öppna uppdateraren",
"Download now" : "Ladda ned nu",
diff --git a/apps/updatenotification/l10n/sv.json b/apps/updatenotification/l10n/sv.json
index 62451abf15e..3a6f4186f1f 100644
--- a/apps/updatenotification/l10n/sv.json
+++ b/apps/updatenotification/l10n/sv.json
@@ -8,6 +8,7 @@
"Update to %1$s is available." : "Uppdatering till %1$s är tillgänglig.",
"Update for %1$s to version %2$s is available." : "Uppdatering för %1$s till version %2$s är tillgänglig.",
"Update for {app} to version %s is available." : "Uppdatering för {app} till version %s är tillgänglig.",
+ "Update notification" : "Uppdatera notifikation",
"A new version is available: %s" : "En ny version är tillgänglig: %s",
"Open updater" : "Öppna uppdateraren",
"Download now" : "Ladda ned nu",
diff --git a/apps/updatenotification/lib/AppInfo/Application.php b/apps/updatenotification/lib/AppInfo/Application.php
index d79f14764de..369b6e3f07d 100644
--- a/apps/updatenotification/lib/AppInfo/Application.php
+++ b/apps/updatenotification/lib/AppInfo/Application.php
@@ -63,7 +63,7 @@ class Application extends App {
}
if ($updateChecker->getUpdateState() !== []) {
- Util::addScript('updatenotification', 'notification');
+ Util::addScript('updatenotification', 'legacy-notification');
\OC_Hook::connect('\OCP\Config', 'js', $updateChecker, 'populateJavaScriptVariables');
}
}
diff --git a/apps/updatenotification/lib/Settings/Admin.php b/apps/updatenotification/lib/Settings/Admin.php
index cf65aed5e2c..258cba35e80 100644
--- a/apps/updatenotification/lib/Settings/Admin.php
+++ b/apps/updatenotification/lib/Settings/Admin.php
@@ -30,6 +30,7 @@ use OCA\UpdateNotification\UpdateChecker;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IDateTimeFormatter;
+use OCP\IGroupManager;
use OCP\Settings\ISettings;
use OCP\Util;
@@ -38,19 +39,24 @@ class Admin implements ISettings {
private $config;
/** @var UpdateChecker */
private $updateChecker;
+ /** @var IGroupManager */
+ private $groupManager;
/** @var IDateTimeFormatter */
private $dateTimeFormatter;
/**
* @param IConfig $config
* @param UpdateChecker $updateChecker
+ * @param IGroupManager $groupManager
* @param IDateTimeFormatter $dateTimeFormatter
*/
public function __construct(IConfig $config,
UpdateChecker $updateChecker,
+ IGroupManager $groupManager,
IDateTimeFormatter $dateTimeFormatter) {
$this->config = $config;
$this->updateChecker = $updateChecker;
+ $this->groupManager = $groupManager;
$this->dateTimeFormatter = $dateTimeFormatter;
}
@@ -68,11 +74,10 @@ class Admin implements ISettings {
'production',
];
$currentChannel = Util::getChannel();
-
- // Remove the currently used channel from the channels list
- if(($key = array_search($currentChannel, $channels, true)) !== false) {
- unset($channels[$key]);
+ if ($currentChannel === 'git') {
+ $channels[] = 'git';
}
+
$updateState = $this->updateChecker->getUpdateState();
$notifyGroups = json_decode($this->config->getAppValue('updatenotification', 'notify_groups', '["admin"]'), true);
@@ -91,13 +96,36 @@ class Admin implements ISettings {
'updaterEnabled' => empty($updateState['updaterEnabled']) ? false : $updateState['updaterEnabled'],
'isDefaultUpdateServerURL' => $updateServerURL === $defaultUpdateServerURL,
'updateServerURL' => $updateServerURL,
- 'notify_groups' => implode('|', $notifyGroups),
+ 'notifyGroups' => $this->getSelectedGroups($notifyGroups),
+ ];
+
+ $params = [
+ 'json' => json_encode($params),
];
return new TemplateResponse('updatenotification', 'admin', $params, '');
}
/**
+ * @param array $groupIds
+ * @return array
+ */
+ protected function getSelectedGroups(array $groupIds): array {
+ $result = [];
+ foreach ($groupIds as $groupId) {
+ $group = $this->groupManager->get($groupId);
+
+ if ($group === null) {
+ continue;
+ }
+
+ $result[] = ['value' => $group->getGID(), 'label' => $group->getDisplayName()];
+ }
+
+ return $result;
+ }
+
+ /**
* @return string the section ID, e.g. 'sharing'
*/
public function getSection(): string {
diff --git a/apps/updatenotification/package-lock.json b/apps/updatenotification/package-lock.json
new file mode 100644
index 00000000000..ec478c67819
--- /dev/null
+++ b/apps/updatenotification/package-lock.json
@@ -0,0 +1,6127 @@
+{
+ "name": "notifications",
+ "version": "2.2.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "acorn": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.3.0.tgz",
+ "integrity": "sha1-dEbTlFnFT7SagObuZHgUm5QOyCI=",
+ "dev": true
+ },
+ "acorn-dynamic-import": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz",
+ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=",
+ "dev": true,
+ "requires": {
+ "acorn": "4.0.13"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+ "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
+ "dev": true
+ }
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.0.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ajv-keywords": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+ "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+ "dev": true
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "alphanum-sort": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=",
+ "dev": true,
+ "requires": {
+ "color-convert": "1.9.1"
+ }
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+ "dev": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "1.0.3"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "asn1.js": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz",
+ "integrity": "sha1-gRfvT37YfNj4kES1v/l6wkOhbJo=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "assert": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+ "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+ "dev": true,
+ "requires": {
+ "util": "0.10.3"
+ }
+ },
+ "async": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz",
+ "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.4"
+ }
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "6.7.7",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz",
+ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=",
+ "dev": true,
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-db": "1.0.30000795",
+ "normalize-range": "0.1.2",
+ "num2fraction": "1.2.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "esutils": "2.0.2",
+ "js-tokens": "3.0.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
+ "integrity": "sha1-qRlH2h9KUW6jjltOwOw3c2deCIY=",
+ "dev": true
+ },
+ "big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha1-pfwpi4G54Nyi5FiCR4S2XFK6WI4=",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=",
+ "dev": true
+ },
+ "bn.js": {
+ "version": "4.11.8",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+ "integrity": "sha1-LN4J617jQfSEdGuwMJsyU7GxRC8=",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "browserify-aes": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz",
+ "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=",
+ "dev": true,
+ "requires": {
+ "buffer-xor": "1.0.3",
+ "cipher-base": "1.0.4",
+ "create-hash": "1.1.3",
+ "evp_bytestokey": "1.0.3",
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "browserify-cipher": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+ "dev": true,
+ "requires": {
+ "browserify-aes": "1.1.1",
+ "browserify-des": "1.0.0",
+ "evp_bytestokey": "1.0.3"
+ }
+ },
+ "browserify-des": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+ "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+ "dev": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "des.js": "1.0.0",
+ "inherits": "2.0.3"
+ }
+ },
+ "browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "randombytes": "2.0.6"
+ }
+ },
+ "browserify-sign": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "elliptic": "6.4.0",
+ "inherits": "2.0.3",
+ "parse-asn1": "5.1.0"
+ }
+ },
+ "browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=",
+ "dev": true,
+ "requires": {
+ "pako": "1.0.6"
+ }
+ },
+ "browserslist": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz",
+ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
+ "dev": true,
+ "requires": {
+ "caniuse-db": "1.0.30000795",
+ "electron-to-chromium": "1.3.31"
+ }
+ },
+ "buffer": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
+ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
+ "dev": true,
+ "requires": {
+ "base64-js": "1.2.1",
+ "ieee754": "1.1.8",
+ "isarray": "1.0.0"
+ }
+ },
+ "buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true
+ },
+ "caniuse-api": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz",
+ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=",
+ "dev": true,
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-db": "1.0.30000795",
+ "lodash.memoize": "4.1.2",
+ "lodash.uniq": "4.5.0"
+ }
+ },
+ "caniuse-db": {
+ "version": "1.0.30000795",
+ "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000795.tgz",
+ "integrity": "sha1-ZE8D+rAN2L0Wk+Xh5w2Gsxxc/s4=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "supports-color": "4.5.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.1.3",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "clap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
+ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ }
+ },
+ "clone": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz",
+ "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "coa": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz",
+ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=",
+ "dev": true,
+ "requires": {
+ "q": "1.5.1"
+ }
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true
+ },
+ "color": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz",
+ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.3",
+ "color-convert": "1.9.1",
+ "color-string": "0.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "color-string": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz",
+ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "colormin": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz",
+ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=",
+ "dev": true,
+ "requires": {
+ "color": "0.11.4",
+ "css-color-names": "0.0.4",
+ "has": "1.0.1"
+ }
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "console-browserify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
+ "requires": {
+ "date-now": "0.1.4"
+ }
+ },
+ "consolidate": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz",
+ "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=",
+ "dev": true,
+ "requires": {
+ "bluebird": "3.5.1"
+ }
+ },
+ "constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz",
+ "integrity": "sha1-YXPOvVb6wELB9DkO33r2wHx8uJI=",
+ "dev": true,
+ "requires": {
+ "is-directory": "0.3.1",
+ "js-yaml": "3.10.0",
+ "minimist": "1.2.0",
+ "object-assign": "4.1.1",
+ "os-homedir": "1.0.2",
+ "parse-json": "2.2.0",
+ "require-from-string": "1.2.1"
+ }
+ },
+ "create-ecdh": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+ "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "elliptic": "6.4.0"
+ }
+ },
+ "create-hash": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+ "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+ "dev": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "create-hmac": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+ "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+ "dev": true,
+ "requires": {
+ "cipher-base": "1.0.4",
+ "create-hash": "1.1.3",
+ "inherits": "2.0.3",
+ "ripemd160": "2.0.1",
+ "safe-buffer": "5.1.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "cross-env": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz",
+ "integrity": "sha1-+K4Y+qyHaSsKi00vcADU7DqF39c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "is-windows": "1.0.1"
+ }
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=",
+ "dev": true,
+ "requires": {
+ "browserify-cipher": "1.0.0",
+ "browserify-sign": "4.0.4",
+ "create-ecdh": "4.0.0",
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "diffie-hellman": "5.0.2",
+ "inherits": "2.0.3",
+ "pbkdf2": "3.0.14",
+ "public-encrypt": "4.0.0",
+ "randombytes": "2.0.6",
+ "randomfill": "1.0.3"
+ }
+ },
+ "css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+ "dev": true
+ },
+ "css-loader": {
+ "version": "0.28.9",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.9.tgz",
+ "integrity": "sha512-r3dgelMm/mkPz5Y7m9SeiGE46i2VsEU/OYbez+1llfxtv8b2y5/b5StaeEvPK3S5tlNQI+tDW/xDIhKJoZgDtw==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "6.26.0",
+ "css-selector-tokenizer": "0.7.0",
+ "cssnano": "3.10.0",
+ "icss-utils": "2.1.0",
+ "loader-utils": "1.1.0",
+ "lodash.camelcase": "4.3.0",
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-modules-extract-imports": "1.2.0",
+ "postcss-modules-local-by-default": "1.2.0",
+ "postcss-modules-scope": "1.1.0",
+ "postcss-modules-values": "1.3.0",
+ "postcss-value-parser": "3.3.0",
+ "source-list-map": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "css-selector-tokenizer": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz",
+ "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=",
+ "dev": true,
+ "requires": {
+ "cssesc": "0.1.0",
+ "fastparse": "1.1.1",
+ "regexpu-core": "1.0.0"
+ }
+ },
+ "cssesc": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz",
+ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=",
+ "dev": true
+ },
+ "cssnano": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz",
+ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=",
+ "dev": true,
+ "requires": {
+ "autoprefixer": "6.7.7",
+ "decamelize": "1.2.0",
+ "defined": "1.0.0",
+ "has": "1.0.1",
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-calc": "5.3.1",
+ "postcss-colormin": "2.2.2",
+ "postcss-convert-values": "2.6.1",
+ "postcss-discard-comments": "2.0.4",
+ "postcss-discard-duplicates": "2.1.0",
+ "postcss-discard-empty": "2.1.0",
+ "postcss-discard-overridden": "0.1.1",
+ "postcss-discard-unused": "2.2.3",
+ "postcss-filter-plugins": "2.0.2",
+ "postcss-merge-idents": "2.1.7",
+ "postcss-merge-longhand": "2.0.2",
+ "postcss-merge-rules": "2.1.2",
+ "postcss-minify-font-values": "1.0.5",
+ "postcss-minify-gradients": "1.0.5",
+ "postcss-minify-params": "1.2.2",
+ "postcss-minify-selectors": "2.1.1",
+ "postcss-normalize-charset": "1.1.1",
+ "postcss-normalize-url": "3.0.8",
+ "postcss-ordered-values": "2.2.3",
+ "postcss-reduce-idents": "2.4.0",
+ "postcss-reduce-initial": "1.0.1",
+ "postcss-reduce-transforms": "1.0.4",
+ "postcss-svgo": "2.1.6",
+ "postcss-unique-selectors": "2.0.2",
+ "postcss-value-parser": "3.3.0",
+ "postcss-zindex": "2.2.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "csso": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz",
+ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=",
+ "dev": true,
+ "requires": {
+ "clap": "1.2.3",
+ "source-map": "0.5.7"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "d": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz",
+ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=",
+ "dev": true,
+ "requires": {
+ "es5-ext": "0.10.38"
+ }
+ },
+ "date-now": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
+ },
+ "de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "defined": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+ "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
+ "dev": true
+ },
+ "des.js": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "diffie-hellman": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+ "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "miller-rabin": "4.0.1",
+ "randombytes": "2.0.6"
+ }
+ },
+ "domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha1-PTH1AZGmdJ3RN1p/Ui6CPULlTto=",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.3.31",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz",
+ "integrity": "sha512-XE4CLbswkZgZFn34cKFy1xaX+F5LHxeDLjY1+rsK9asDzknhbrd9g/n/01/acbU25KTsUSiLKwvlLyA+6XLUOA==",
+ "dev": true
+ },
+ "elliptic": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+ "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0",
+ "hash.js": "1.1.3",
+ "hmac-drbg": "1.0.1",
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz",
+ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "memory-fs": "0.4.1",
+ "object-assign": "4.1.1",
+ "tapable": "0.2.8"
+ }
+ },
+ "errno": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz",
+ "integrity": "sha1-w4bOimKD8U/AlWO3FWCQjJv1MCY=",
+ "dev": true,
+ "requires": {
+ "prr": "1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "0.2.1"
+ }
+ },
+ "es5-ext": {
+ "version": "0.10.38",
+ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.38.tgz",
+ "integrity": "sha1-+n1A1lu8m7imfh0/nMZWoAUw7tM=",
+ "dev": true,
+ "requires": {
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-iterator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
+ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "es6-map": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz",
+ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-set": "0.1.5",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-set": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz",
+ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1",
+ "event-emitter": "0.3.5"
+ }
+ },
+ "es6-symbol": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz",
+ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "es6-weak-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz",
+ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38",
+ "es6-iterator": "2.0.3",
+ "es6-symbol": "3.1.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "escope": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz",
+ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=",
+ "dev": true,
+ "requires": {
+ "es6-map": "0.1.5",
+ "es6-weak-map": "2.0.2",
+ "esrecurse": "4.2.0",
+ "estraverse": "4.2.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+ "dev": true
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "dev": true,
+ "requires": {
+ "estraverse": "4.2.0",
+ "object-assign": "4.1.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "event-emitter": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
+ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
+ "dev": true,
+ "requires": {
+ "d": "1.0.0",
+ "es5-ext": "0.10.38"
+ }
+ },
+ "events": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+ "dev": true
+ },
+ "evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=",
+ "dev": true,
+ "requires": {
+ "md5.js": "1.3.4",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "execa": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
+ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "5.1.0",
+ "get-stream": "3.0.0",
+ "is-stream": "1.1.0",
+ "npm-run-path": "2.0.2",
+ "p-finally": "1.0.0",
+ "signal-exit": "3.0.2",
+ "strip-eof": "1.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.3"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz",
+ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fastparse": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz",
+ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=",
+ "dev": true
+ },
+ "file-loader": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz",
+ "integrity": "sha512-873ztuL+/hfvXbLDJ262PGO6XjERnybJu2gW1/5j8HUfxSiFJI9Hj/DhZ50ZGRUxBvuNiazb/cM2rh9pqrxP6Q==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "1.1.0",
+ "schema-utils": "0.3.0"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
+ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "find-up": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+ "dev": true,
+ "requires": {
+ "locate-path": "2.0.0"
+ }
+ },
+ "flatten": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "fsevents": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
+ "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.8.0",
+ "node-pre-gyp": "0.6.39"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ajv": {
+ "version": "4.11.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "co": "4.6.0",
+ "json-stable-stringify": "1.0.1"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.2.9"
+ }
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "assert-plus": {
+ "version": "0.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "balanced-match": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "block-stream": {
+ "version": "0.0.9",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.7",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "concat-map": "0.0.1"
+ }
+ },
+ "buffer-shims": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "debug": {
+ "version": "2.6.8",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "form-data": {
+ "version": "2.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.5",
+ "mime-types": "2.1.15"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "fstream": {
+ "version": "1.0.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "inherits": "2.0.3",
+ "mkdirp": "0.5.1",
+ "rimraf": "2.6.1"
+ }
+ },
+ "fstream-ignore": {
+ "version": "1.0.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fstream": "1.0.11",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4"
+ }
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.1.1",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "bundled": true,
+ "dev": true
+ },
+ "har-schema": {
+ "version": "1.0.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "har-validator": {
+ "version": "4.2.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ajv": "4.11.8",
+ "har-schema": "1.0.5"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "hoek": {
+ "version": "2.16.3",
+ "bundled": true,
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.0",
+ "sshpk": "1.13.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "json-stable-stringify": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsonify": "0.0.0"
+ }
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.0.2",
+ "json-schema": "0.2.3",
+ "verror": "1.3.6"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.27.0",
+ "bundled": true,
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.15",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "mime-db": "1.27.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "node-pre-gyp": {
+ "version": "0.6.39",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.2",
+ "hawk": "3.1.3",
+ "mkdirp": "0.5.1",
+ "nopt": "4.0.1",
+ "npmlog": "4.1.0",
+ "rc": "1.2.1",
+ "request": "2.81.0",
+ "rimraf": "2.6.1",
+ "semver": "5.3.0",
+ "tar": "2.2.1",
+ "tar-pack": "3.4.0"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.0",
+ "osenv": "0.1.4"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "performance-now": {
+ "version": "0.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "bundled": true,
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "qs": {
+ "version": "6.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.4.2",
+ "ini": "1.3.4",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.2.9",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "buffer-shims": "1.0.0",
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "string_decoder": "1.0.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "request": {
+ "version": "2.81.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.6.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.5",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "4.2.1",
+ "hawk": "3.1.3",
+ "http-signature": "1.1.1",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.15",
+ "oauth-sign": "0.8.2",
+ "performance-now": "0.2.0",
+ "qs": "6.4.0",
+ "safe-buffer": "5.0.1",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.2",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.0.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "semver": {
+ "version": "5.3.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "sshpk": {
+ "version": "1.13.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.1",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jodid25519": "1.0.2",
+ "jsbn": "0.1.1",
+ "tweetnacl": "0.14.5"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "2.2.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "block-stream": "0.0.9",
+ "fstream": "1.0.11",
+ "inherits": "2.0.3"
+ }
+ },
+ "tar-pack": {
+ "version": "3.4.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.8",
+ "fstream": "1.0.11",
+ "fstream-ignore": "1.0.5",
+ "once": "1.4.0",
+ "readable-stream": "2.2.9",
+ "rimraf": "2.6.1",
+ "tar": "2.2.1",
+ "uid-number": "0.0.6"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "uid-number": {
+ "version": "0.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "verror": {
+ "version": "1.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extsprintf": "1.0.2"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+ "dev": true,
+ "requires": {
+ "function-bind": "1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "hash-base": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+ "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "hash-sum": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
+ "dev": true
+ },
+ "hash.js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+ "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "minimalistic-assert": "1.0.0"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "requires": {
+ "hash.js": "1.1.3",
+ "minimalistic-assert": "1.0.0",
+ "minimalistic-crypto-utils": "1.0.1"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+ "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=",
+ "dev": true
+ },
+ "html-comment-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
+ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=",
+ "dev": true
+ },
+ "https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true
+ },
+ "icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+ "dev": true
+ },
+ "icss-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+ "dev": true,
+ "requires": {
+ "postcss": "6.0.16"
+ }
+ },
+ "ieee754": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
+ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=",
+ "dev": true
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "interpret": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz",
+ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-absolute-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "1.1.1"
+ }
+ },
+ "is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+ "dev": true
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+ "dev": true
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-svg": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
+ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
+ "dev": true,
+ "requires": {
+ "html-comment-regex": "1.1.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz",
+ "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "js-base64": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.2.tgz",
+ "integrity": "sha512-lLkz3IRPTNeATsKQGeltbzRK/5+bWsXBHfpZrxJAi4N30RtCtNA+rJznp4uR2+4OgkBsoeeFwONVLr4gzIVErQ==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz",
+ "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "4.0.0"
+ }
+ },
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ },
+ "json-loader": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
+ "integrity": "sha1-3KFKcCNf+C8KyaOr62DTN6NlGF0=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "parse-json": "2.2.0",
+ "pify": "2.3.0",
+ "strip-bom": "3.0.0"
+ }
+ },
+ "loader-runner": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz",
+ "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz",
+ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=",
+ "dev": true,
+ "requires": {
+ "big.js": "3.2.0",
+ "emojis-list": "2.1.0",
+ "json5": "0.5.1"
+ }
+ },
+ "locate-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+ "dev": true,
+ "requires": {
+ "p-locate": "2.0.0",
+ "path-exists": "3.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "dev": true
+ },
+ "lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
+ "lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+ "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "macaddress": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz",
+ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=",
+ "dev": true
+ },
+ "math-expression-evaluator": {
+ "version": "1.2.17",
+ "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz",
+ "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=",
+ "dev": true
+ },
+ "md5.js": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
+ "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=",
+ "dev": true,
+ "requires": {
+ "hash-base": "3.0.4",
+ "inherits": "2.0.3"
+ },
+ "dependencies": {
+ "hash-base": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ }
+ }
+ },
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "1.1.0"
+ }
+ },
+ "memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dev": true,
+ "requires": {
+ "errno": "0.1.6",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "brorand": "1.1.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=",
+ "dev": true
+ },
+ "minimalistic-assert": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+ "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=",
+ "dev": true
+ },
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.8"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "nan": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz",
+ "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
+ "dev": true,
+ "optional": true
+ },
+ "node-libs-browser": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz",
+ "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=",
+ "dev": true,
+ "requires": {
+ "assert": "1.4.1",
+ "browserify-zlib": "0.2.0",
+ "buffer": "4.9.1",
+ "console-browserify": "1.1.0",
+ "constants-browserify": "1.0.0",
+ "crypto-browserify": "3.12.0",
+ "domain-browser": "1.2.0",
+ "events": "1.1.1",
+ "https-browserify": "1.0.0",
+ "os-browserify": "0.3.0",
+ "path-browserify": "0.0.0",
+ "process": "0.11.10",
+ "punycode": "1.4.1",
+ "querystring-es3": "0.2.1",
+ "readable-stream": "2.3.3",
+ "stream-browserify": "2.0.1",
+ "stream-http": "2.8.0",
+ "string_decoder": "1.0.3",
+ "timers-browserify": "2.0.6",
+ "tty-browserify": "0.0.0",
+ "url": "0.11.0",
+ "util": "0.10.3",
+ "vm-browserify": "0.0.4"
+ }
+ },
+ "normalize-package-data": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+ "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "2.5.0",
+ "is-builtin-module": "1.0.0",
+ "semver": "5.5.0",
+ "validate-npm-package-license": "3.0.1"
+ }
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
+ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1",
+ "prepend-http": "1.0.4",
+ "query-string": "4.3.4",
+ "sort-keys": "1.1.2"
+ }
+ },
+ "npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "requires": {
+ "path-key": "2.0.1"
+ }
+ },
+ "num2fraction": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
+ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+ "dev": true
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-locale": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
+ "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=",
+ "dev": true,
+ "requires": {
+ "execa": "0.7.0",
+ "lcid": "1.0.0",
+ "mem": "1.1.0"
+ }
+ },
+ "p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz",
+ "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=",
+ "dev": true,
+ "requires": {
+ "p-try": "1.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+ "dev": true,
+ "requires": {
+ "p-limit": "1.2.0"
+ }
+ },
+ "p-try": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+ "dev": true
+ },
+ "pako": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
+ "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=",
+ "dev": true
+ },
+ "parse-asn1": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
+ "dev": true,
+ "requires": {
+ "asn1.js": "4.9.2",
+ "browserify-aes": "1.1.1",
+ "create-hash": "1.1.3",
+ "evp_bytestokey": "1.0.3",
+ "pbkdf2": "3.0.14"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "1.3.1"
+ }
+ },
+ "path-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+ "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+ "dev": true,
+ "requires": {
+ "pify": "2.3.0"
+ }
+ },
+ "pbkdf2": {
+ "version": "3.0.14",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz",
+ "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=",
+ "dev": true,
+ "requires": {
+ "create-hash": "1.1.3",
+ "create-hmac": "1.1.6",
+ "ripemd160": "2.0.1",
+ "safe-buffer": "5.1.1",
+ "sha.js": "2.4.10"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "6.0.16",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.16.tgz",
+ "integrity": "sha1-ES4v4qbSEJvglXaHJDFw6lWJ4UY=",
+ "dev": true,
+ "requires": {
+ "chalk": "2.3.0",
+ "source-map": "0.6.1",
+ "supports-color": "5.1.0"
+ }
+ },
+ "postcss-calc": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz",
+ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-message-helpers": "2.0.0",
+ "reduce-css-calc": "1.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-colormin": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz",
+ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=",
+ "dev": true,
+ "requires": {
+ "colormin": "1.1.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-convert-values": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz",
+ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-discard-comments": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz",
+ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-discard-duplicates": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz",
+ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-discard-empty": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz",
+ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-discard-overridden": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz",
+ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-discard-unused": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz",
+ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-filter-plugins": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz",
+ "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "uniqid": "4.1.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-load-config": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz",
+ "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "2.2.2",
+ "object-assign": "4.1.1",
+ "postcss-load-options": "1.2.0",
+ "postcss-load-plugins": "2.3.0"
+ }
+ },
+ "postcss-load-options": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz",
+ "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "2.2.2",
+ "object-assign": "4.1.1"
+ }
+ },
+ "postcss-load-plugins": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz",
+ "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "2.2.2",
+ "object-assign": "4.1.1"
+ }
+ },
+ "postcss-merge-idents": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz",
+ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=",
+ "dev": true,
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-merge-longhand": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz",
+ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-merge-rules": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz",
+ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=",
+ "dev": true,
+ "requires": {
+ "browserslist": "1.7.7",
+ "caniuse-api": "1.6.1",
+ "postcss": "5.2.18",
+ "postcss-selector-parser": "2.2.3",
+ "vendors": "1.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-message-helpers": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz",
+ "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=",
+ "dev": true
+ },
+ "postcss-minify-font-values": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz",
+ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-minify-gradients": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz",
+ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-minify-params": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz",
+ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0",
+ "uniqs": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-minify-selectors": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz",
+ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-selector-parser": "2.2.3"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz",
+ "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=",
+ "dev": true,
+ "requires": {
+ "postcss": "6.0.16"
+ }
+ },
+ "postcss-modules-local-by-default": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+ "dev": true,
+ "requires": {
+ "css-selector-tokenizer": "0.7.0",
+ "postcss": "6.0.16"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+ "dev": true,
+ "requires": {
+ "css-selector-tokenizer": "0.7.0",
+ "postcss": "6.0.16"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+ "dev": true,
+ "requires": {
+ "icss-replace-symbols": "1.1.0",
+ "postcss": "6.0.16"
+ }
+ },
+ "postcss-normalize-charset": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz",
+ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-normalize-url": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz",
+ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=",
+ "dev": true,
+ "requires": {
+ "is-absolute-url": "2.1.0",
+ "normalize-url": "1.9.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-ordered-values": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz",
+ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-reduce-idents": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz",
+ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-reduce-initial": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz",
+ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=",
+ "dev": true,
+ "requires": {
+ "postcss": "5.2.18"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-reduce-transforms": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz",
+ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=",
+ "dev": true,
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
+ "dev": true,
+ "requires": {
+ "flatten": "1.0.2",
+ "indexes-of": "1.0.1",
+ "uniq": "1.0.1"
+ }
+ },
+ "postcss-svgo": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz",
+ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=",
+ "dev": true,
+ "requires": {
+ "is-svg": "2.1.0",
+ "postcss": "5.2.18",
+ "postcss-value-parser": "3.3.0",
+ "svgo": "0.7.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-unique-selectors": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz",
+ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=",
+ "dev": true,
+ "requires": {
+ "alphanum-sort": "1.0.2",
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "postcss-value-parser": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
+ "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
+ "dev": true
+ },
+ "postcss-zindex": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz",
+ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=",
+ "dev": true,
+ "requires": {
+ "has": "1.0.1",
+ "postcss": "5.2.18",
+ "uniqs": "2.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "5.2.18",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz",
+ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "js-base64": "2.4.2",
+ "source-map": "0.5.7",
+ "supports-color": "3.2.3"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ }
+ }
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": true
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "prettier": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.10.2.tgz",
+ "integrity": "sha1-Gvg1bRhCJ2qZpbVSnILdnprTzJM=",
+ "dev": true
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "dev": true
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "public-encrypt": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
+ "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
+ "dev": true,
+ "requires": {
+ "bn.js": "4.11.8",
+ "browserify-rsa": "4.0.1",
+ "create-hash": "1.1.3",
+ "parse-asn1": "5.1.0",
+ "randombytes": "2.0.6"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true
+ },
+ "query-string": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
+ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+ "dev": true,
+ "requires": {
+ "object-assign": "4.1.1",
+ "strict-uri-encode": "1.1.0"
+ }
+ },
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true
+ },
+ "querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "randombytes": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
+ "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "randomfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz",
+ "integrity": "sha1-uWt99YfwHdkXJsQY8wVTsUGOPWI=",
+ "dev": true,
+ "requires": {
+ "randombytes": "2.0.6",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "read-pkg": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "2.0.0",
+ "normalize-package-data": "2.4.0",
+ "path-type": "2.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+ "dev": true,
+ "requires": {
+ "find-up": "2.1.0",
+ "read-pkg": "2.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+ "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "1.0.7",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.0.3",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.3",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "reduce-css-calc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
+ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "0.4.2",
+ "math-expression-evaluator": "1.2.17",
+ "reduce-function-call": "1.0.2"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+ "dev": true
+ }
+ }
+ },
+ "reduce-function-call": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz",
+ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "0.4.2"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
+ "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
+ "dev": true
+ }
+ }
+ },
+ "regenerate": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
+ "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==",
+ "dev": true
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "regexpu-core": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz",
+ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=",
+ "dev": true,
+ "requires": {
+ "regenerate": "1.3.3",
+ "regjsgen": "0.2.0",
+ "regjsparser": "0.1.5"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "0.5.0"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-from-string": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz",
+ "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz",
+ "integrity": "sha1-HwmsznlsmnYlefMbLBzEw83fnzY=",
+ "dev": true,
+ "requires": {
+ "path-parse": "1.0.5"
+ }
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "ripemd160": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+ "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+ "dev": true,
+ "requires": {
+ "hash-base": "2.0.2",
+ "inherits": "2.0.3"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "schema-utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz",
+ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2"
+ }
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=",
+ "dev": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+ "dev": true
+ },
+ "sha.js": {
+ "version": "2.4.10",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz",
+ "integrity": "sha1-sf3lzX0RpWJmOKB8YEq5Cc+jH5s=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "sort-keys": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
+ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+ "dev": true,
+ "requires": {
+ "is-plain-obj": "1.1.0"
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz",
+ "integrity": "sha1-qqR0A/eyRakvvJfqCPJQ1gh+0IU=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+ "dev": true
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "1.2.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+ "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3"
+ }
+ },
+ "stream-http": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz",
+ "integrity": "sha1-/YZUbaybHJGv+PxdKHuY+vtBvBA=",
+ "dev": true,
+ "requires": {
+ "builtin-status-codes": "3.0.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.3",
+ "to-arraybuffer": "1.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "strict-uri-encode": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "2.0.0",
+ "strip-ansi": "4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "3.0.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+ "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz",
+ "integrity": "sha1-BYoCHRthn33fOYDXEuo1kM5949U=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ },
+ "svgo": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz",
+ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=",
+ "dev": true,
+ "requires": {
+ "coa": "1.0.4",
+ "colors": "1.1.2",
+ "csso": "2.3.2",
+ "js-yaml": "3.7.0",
+ "mkdirp": "0.5.1",
+ "sax": "1.2.4",
+ "whet.extend": "0.9.9"
+ },
+ "dependencies": {
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz",
+ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=",
+ "dev": true,
+ "requires": {
+ "argparse": "1.0.9",
+ "esprima": "2.7.3"
+ }
+ }
+ }
+ },
+ "tapable": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz",
+ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=",
+ "dev": true
+ },
+ "timers-browserify": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz",
+ "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=",
+ "dev": true,
+ "requires": {
+ "setimmediate": "1.0.5"
+ }
+ },
+ "to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "uglifyjs-webpack-plugin": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
+ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
+ "dev": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-js": "2.8.29",
+ "webpack-sources": "1.1.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "uniqid": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz",
+ "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=",
+ "dev": true,
+ "requires": {
+ "macaddress": "0.2.8"
+ }
+ },
+ "uniqs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+ "dev": true
+ },
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ }
+ }
+ },
+ "util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ }
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "1.0.2",
+ "spdx-expression-parse": "1.0.4"
+ }
+ },
+ "vendors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz",
+ "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=",
+ "dev": true
+ },
+ "vm-browserify": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+ "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+ "dev": true,
+ "requires": {
+ "indexof": "0.0.1"
+ }
+ },
+ "vue": {
+ "version": "2.5.13",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.13.tgz",
+ "integrity": "sha512-3D+lY7HTkKbtswDM4BBHgqyq+qo8IAEE8lz8va1dz3LLmttjgo0FxairO4r1iN2OBqk8o1FyL4hvzzTFEdQSEw=="
+ },
+ "vue-hot-reload-api": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.2.4.tgz",
+ "integrity": "sha1-aDvR0CbA07PJN9WHVnnpqH7GzY8=",
+ "dev": true
+ },
+ "vue-loader": {
+ "version": "13.7.0",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-13.7.0.tgz",
+ "integrity": "sha1-TWo1sWnCoKSIhC+5XIUFIQX6lyk=",
+ "dev": true,
+ "requires": {
+ "consolidate": "0.14.5",
+ "hash-sum": "1.0.2",
+ "loader-utils": "1.1.0",
+ "lru-cache": "4.1.1",
+ "postcss": "6.0.16",
+ "postcss-load-config": "1.2.0",
+ "postcss-selector-parser": "2.2.3",
+ "prettier": "1.10.2",
+ "resolve": "1.5.0",
+ "source-map": "0.6.1",
+ "vue-hot-reload-api": "2.2.4",
+ "vue-style-loader": "3.1.1",
+ "vue-template-es2015-compiler": "1.6.0"
+ }
+ },
+ "vue-select": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/vue-select/-/vue-select-2.4.0.tgz",
+ "integrity": "sha512-WxQc7t65ht3YSwSgcSdHFU8cSOWKpvH6n1B/Z9ua44hMB2oVcy0Mieu4qjMPrYx3AQQ8Y8F+pfNIylRZ0t3IVA=="
+ },
+ "vue-style-loader": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-3.1.1.tgz",
+ "integrity": "sha1-dP3vkagdOLwBJXRqG1UF5i1p4yw=",
+ "dev": true,
+ "requires": {
+ "hash-sum": "1.0.2",
+ "loader-utils": "1.1.0"
+ }
+ },
+ "vue-template-compiler": {
+ "version": "2.5.13",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.5.13.tgz",
+ "integrity": "sha1-EqKqDs1hWKxeXxTSlLCZPzmcPTg=",
+ "dev": true,
+ "requires": {
+ "de-indent": "1.0.2",
+ "he": "1.1.1"
+ }
+ },
+ "vue-template-es2015-compiler": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz",
+ "integrity": "sha1-3EJpcTMwLOMBdSQ1amxht7abShg=",
+ "dev": true
+ },
+ "watchpack": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz",
+ "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=",
+ "dev": true,
+ "requires": {
+ "async": "2.6.0",
+ "chokidar": "1.7.0",
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "webpack": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz",
+ "integrity": "sha1-UpG4dQeM8qv0K90jr+P4+WwX1yU=",
+ "dev": true,
+ "requires": {
+ "acorn": "5.3.0",
+ "acorn-dynamic-import": "2.0.2",
+ "ajv": "5.5.2",
+ "ajv-keywords": "2.1.1",
+ "async": "2.6.0",
+ "enhanced-resolve": "3.4.1",
+ "escope": "3.6.0",
+ "interpret": "1.1.0",
+ "json-loader": "0.5.7",
+ "json5": "0.5.1",
+ "loader-runner": "2.3.0",
+ "loader-utils": "1.1.0",
+ "memory-fs": "0.4.1",
+ "mkdirp": "0.5.1",
+ "node-libs-browser": "2.1.0",
+ "source-map": "0.5.7",
+ "supports-color": "4.5.0",
+ "tapable": "0.2.8",
+ "uglifyjs-webpack-plugin": "0.4.6",
+ "watchpack": "1.4.0",
+ "webpack-sources": "1.1.0",
+ "yargs": "8.0.2"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "webpack-sources": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz",
+ "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=",
+ "dev": true,
+ "requires": {
+ "source-list-map": "2.0.0",
+ "source-map": "0.6.1"
+ }
+ },
+ "whet.extend": {
+ "version": "0.9.9",
+ "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
+ "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz",
+ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0",
+ "cliui": "3.2.0",
+ "decamelize": "1.2.0",
+ "get-caller-file": "1.0.2",
+ "os-locale": "2.1.0",
+ "read-pkg-up": "2.0.0",
+ "require-directory": "2.1.1",
+ "require-main-filename": "1.0.1",
+ "set-blocking": "2.0.0",
+ "string-width": "2.1.1",
+ "which-module": "2.0.0",
+ "y18n": "3.2.1",
+ "yargs-parser": "7.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wrap-ansi": "2.1.0"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ }
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz",
+ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=",
+ "dev": true,
+ "requires": {
+ "camelcase": "4.1.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ }
+ }
+ }
+ }
+}
diff --git a/apps/updatenotification/package.json b/apps/updatenotification/package.json
new file mode 100644
index 00000000000..afdd9b08c60
--- /dev/null
+++ b/apps/updatenotification/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "notifications",
+ "version": "2.2.0",
+ "description": "This app provides a backend and frontend for the notification API available in Nextcloud.",
+ "main": "init.js",
+ "directories": {
+ "lib": "lib",
+ "test": "tests"
+ },
+ "scripts": {
+ "dev": "cross-env NODE_ENV=development webpack --progress --hot --config js-src/webpack.config.js --watch",
+ "build": "cross-env NODE_ENV=production webpack --progress --hide-modules --config js-src/webpack.config.js",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/nextcloud/notifications.git"
+ },
+ "author": "Joas Schilling",
+ "license": "AGPL-3.0",
+ "bugs": {
+ "url": "https://github.com/nextcloud/notifications/issues"
+ },
+ "homepage": "https://github.com/nextcloud/notifications#readme",
+ "dependencies": {
+ "vue": "^2.5.13",
+ "vue-select": "^2.4.0"
+ },
+ "devDependencies": {
+ "cross-env": "^5.1.3",
+ "css-loader": "^0.28.8",
+ "file-loader": "^1.1.6",
+ "vue-loader": "^13.7.0",
+ "vue-template-compiler": "^2.5.13",
+ "webpack": "^3.6.0"
+ }
+}
diff --git a/apps/updatenotification/templates/admin.php b/apps/updatenotification/templates/admin.php
index 19bbec769d0..dd53ea27eeb 100644
--- a/apps/updatenotification/templates/admin.php
+++ b/apps/updatenotification/templates/admin.php
@@ -1,75 +1,15 @@
<?php
declare(strict_types=1);
- script('updatenotification', 'admin');
- style('updatenotification', 'admin');
-
- /** @var array $_ */
- /** @var bool $isNewVersionAvailable */
- $isNewVersionAvailable = $_['isNewVersionAvailable'];
- /** @var string $newVersionString */
- $newVersionString = $_['newVersionString'];
- /** @var bool $isUpdateChecked */
- $isUpdateChecked = $_['isUpdateChecked'];
- /** @var string $lastCheckedDate */
- $lastCheckedDate = $_['lastChecked'];
- /** @var array $channels */
- $channels = $_['channels'];
- /** @var string $currentChannel */
- $currentChannel = $_['currentChannel'];
- /** @var string $updateServerURL */
- $updateServerURL = $_['updateServerURL'];
- /** @var bool $isDefaultUpdateServerURL */
- $isDefaultUpdateServerURL = $_['isDefaultUpdateServerURL'];
+/**
+ * @copyright (c) 2018 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ */
+script('updatenotification', 'merged');
+style('updatenotification', 'admin');
+/** @var array $_ */
?>
-<form id="oca_updatenotification_section" class="followupsection">
- <p>
- <?php if ($isNewVersionAvailable === true) { ?>
- <strong><?php p($l->t('A new version is available: %s', [$newVersionString])); ?></strong>
- <?php if ($_['updaterEnabled']) { ?>
- <input type="button" id="oca_updatenotification_button" value="<?php p($l->t('Open updater')) ?>">
- <?php } ?>
- <?php if (!empty($_['downloadLink'])) { ?>
- <a href="<?php p($_['downloadLink']); ?>" class="button<?php if ($_['updaterEnabled']) { p(' hidden'); } ?>"><?php p($l->t('Download now')) ?></a>
- <?php } ?>
- <?php } elseif (!$isUpdateChecked) { ?>
- <?php p($l->t('The update check is not yet finished. Please refresh the page.')); ?>
- <?php } else { ?>
- <?php p($l->t('Your version is up to date.')); ?>
- <span class="icon-info svg" title="<?php p($l->t('Checked on %s', [$lastCheckedDate])) ?>"></span>
- <?php } ?>
-
- <?php if (!$isDefaultUpdateServerURL) { ?>
- <br />
- <em>
- <?php p($l->t('A non-default update server is in use to be checked for updates:')); ?>
- <code><?php p($updateServerURL); ?></code>
- </em>
- <?php } ?>
- </p>
-
- <p>
- <label for="release-channel"><?php p($l->t('Update channel:')) ?></label>
- <select id="release-channel">
- <option value="<?php p($currentChannel); ?>"><?php p($currentChannel); ?></option>
- <?php foreach ($channels as $channel => $channelTitle){ ?>
- <option value="<?php p($channelTitle) ?>">
- <?php p($channelTitle) ?>
- </option>
- <?php } ?>
- </select>
- <span id="channel_save_msg" class="msg"></span><br />
- <em><?php p($l->t('You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel.')); ?></em><br />
- <em><?php p($l->t('Note that after a new release it can take some time before it shows up here. We roll out new versions spread out over time to our users and sometimes skip a version when issues are found.')); ?></em>
- </p>
-
-
- <p id="oca_updatenotification_groups">
- <?php p($l->t('Notify members of the following groups about available updates:')); ?>
- <input name="oca_updatenotification_groups_list" type="hidden" id="oca_updatenotification_groups_list" value="<?php p($_['notify_groups']) ?>" style="width: 400px"><br />
- <em class="<?php if (!\in_array($currentChannel, ['daily', 'git'], true)) { p('hidden'); } ?>">
- <?php p($l->t('Only notification for app updates are available.')); ?>
- <?php if ($currentChannel === 'daily') { p($l->t('The selected update channel makes dedicated notifications for the server obsolete.')); } ?>
- <?php if ($currentChannel === 'git') { p($l->t('The selected update channel does not support updates of the server.')); } ?>
- </em>
- </p>
-</form>
+<div id="updatenotification" data-json="<?php p($_['json']); ?>"></div>
diff --git a/apps/updatenotification/tests/Settings/AdminTest.php b/apps/updatenotification/tests/Settings/AdminTest.php
index 02f505517e1..440e26cfd33 100644
--- a/apps/updatenotification/tests/Settings/AdminTest.php
+++ b/apps/updatenotification/tests/Settings/AdminTest.php
@@ -30,6 +30,8 @@ use OCA\UpdateNotification\UpdateChecker;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IConfig;
use OCP\IDateTimeFormatter;
+use OCP\IGroup;
+use OCP\IGroupManager;
use OCP\Util;
use Test\TestCase;
@@ -40,6 +42,8 @@ class AdminTest extends TestCase {
private $config;
/** @var UpdateChecker|\PHPUnit_Framework_MockObject_MockObject */
private $updateChecker;
+ /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */
+ private $groupManager;
/** @var IDateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */
private $dateTimeFormatter;
@@ -48,11 +52,13 @@ class AdminTest extends TestCase {
$this->config = $this->createMock(IConfig::class);
$this->updateChecker = $this->createMock(UpdateChecker::class);
+ $this->groupManager = $this->createMock(IGroupManager::class);
$this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
$this->admin = new Admin(
$this->config,
$this->updateChecker,
+ $this->groupManager,
$this->dateTimeFormatter
);
}
@@ -65,10 +71,8 @@ class AdminTest extends TestCase {
'production',
];
$currentChannel = Util::getChannel();
-
- // Remove the currently used channel from the channels list
- if(($key = array_search($currentChannel, $channels, true)) !== false) {
- unset($channels[$key]);
+ if ($currentChannel === 'git') {
+ $channels[] = 'git';
}
$this->config
@@ -98,18 +102,34 @@ class AdminTest extends TestCase {
'updaterEnabled' => true,
]);
+ $group = $this->createMock(IGroup::class);
+ $group->expects($this->any())
+ ->method('getDisplayName')
+ ->willReturn('Administrators');
+ $group->expects($this->any())
+ ->method('getGID')
+ ->willReturn('admin');
+ $this->groupManager->expects($this->once())
+ ->method('get')
+ ->with('admin')
+ ->willReturn($group);
+
$params = [
- 'isNewVersionAvailable' => true,
- 'isUpdateChecked' => true,
- 'lastChecked' => 'LastCheckedReturnValue',
- 'currentChannel' => Util::getChannel(),
- 'channels' => $channels,
- 'newVersionString' => '8.1.2',
- 'downloadLink' => 'https://downloads.nextcloud.org/server',
- 'updaterEnabled' => true,
- 'isDefaultUpdateServerURL' => true,
- 'updateServerURL' => 'https://updates.nextcloud.com/updater_server/',
- 'notify_groups' => 'admin',
+ 'json' => json_encode([
+ 'isNewVersionAvailable' => true,
+ 'isUpdateChecked' => true,
+ 'lastChecked' => 'LastCheckedReturnValue',
+ 'currentChannel' => Util::getChannel(),
+ 'channels' => $channels,
+ 'newVersionString' => '8.1.2',
+ 'downloadLink' => 'https://downloads.nextcloud.org/server',
+ 'updaterEnabled' => true,
+ 'isDefaultUpdateServerURL' => true,
+ 'updateServerURL' => 'https://updates.nextcloud.com/updater_server/',
+ 'notifyGroups' => [
+ ['value' => 'admin', 'label' => 'Administrators'],
+ ],
+ ]),
];
$expected = new TemplateResponse('updatenotification', 'admin', $params, '');
diff --git a/apps/user_ldap/appinfo/info.xml b/apps/user_ldap/appinfo/info.xml
index dbf9a736899..bb5ebce4fc5 100644
--- a/apps/user_ldap/appinfo/info.xml
+++ b/apps/user_ldap/appinfo/info.xml
@@ -1,43 +1,46 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>user_ldap</id>
<name>LDAP user and group backend</name>
+ <summary>This application enables administrators to connect Nextcloud to an LDAP-based user directory.</summary>
<description>This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.
A user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation.
</description>
- <licence>AGPL</licence>
+ <version>1.4.0</version>
+ <licence>agpl</licence>
<author>Dominik Schmidt</author>
<author>Arthur Schiwon</author>
- <version>1.4.0</version>
+ <namespace>User_LDAP</namespace>
<types>
<authentication/>
</types>
<documentation>
<admin>admin-ldap</admin>
</documentation>
+ <category>integration</category>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<lib>ldap</lib>
<nextcloud min-version="14" max-version="14" />
</dependencies>
- <namespace>User_LDAP</namespace>
-
<background-jobs>
<job>OCA\User_LDAP\Jobs\UpdateGroups</job>
<job>OCA\User_LDAP\Jobs\CleanUp</job>
<job>OCA\User_LDAP\Jobs\Sync</job>
</background-jobs>
- <settings>
- <admin>OCA\User_LDAP\Settings\Admin</admin>
- <admin-section>OCA\User_LDAP\Settings\Section</admin-section>
- </settings>
-
<repair-steps>
<post-migration>
<step>OCA\User_LDAP\Migration\UUIDFixInsert</step>
</post-migration>
</repair-steps>
+
+ <settings>
+ <admin>OCA\User_LDAP\Settings\Admin</admin>
+ <admin-section>OCA\User_LDAP\Settings\Section</admin-section>
+ </settings>
</info>
diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js
index a23a7d8a9f3..1f51667ca20 100644
--- a/apps/user_ldap/l10n/es.js
+++ b/apps/user_ldap/l10n/es.js
@@ -1,7 +1,7 @@
OC.L10N.register(
"user_ldap",
{
- "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.",
+ "Failed to clear the mappings." : "Se ha producido un fallo al borrar las asignaciones.",
"Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor",
"Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.",
"Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!",
@@ -105,7 +105,7 @@ OC.L10N.register(
"Detect Base DN" : "Detectar Base DN",
"Test Base DN" : "Probar Base DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Introduzca manualmente los filtros LDAP (recomendado para directorios grandes)",
"Listing and searching for users is constrained by these criteria:" : "El listado y la búsqueda de usuarios es restringido por estos criterios:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Los objetos de clases más comunes para los usuarios son organizationalPerson, persona, usuario y inetOrgPerson. Si no está seguro de qué objeto de clase seleccionar, por favor, consulte con su administrador de directorio. ",
"The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json
index 7538f0a0b0d..5d7352fd0c8 100644
--- a/apps/user_ldap/l10n/es.json
+++ b/apps/user_ldap/l10n/es.json
@@ -1,5 +1,5 @@
{ "translations": {
- "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.",
+ "Failed to clear the mappings." : "Se ha producido un fallo al borrar las asignaciones.",
"Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor",
"Invalid configuration: Anonymous binding is not allowed." : "Configuración no válida: No se permite enlazado anónimo.",
"Valid configuration, connection established!" : "Configuración válida. ¡Conexión establecida!",
@@ -103,7 +103,7 @@
"Detect Base DN" : "Detectar Base DN",
"Test Base DN" : "Probar Base DN",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.",
- "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)",
+ "Manually enter LDAP filters (recommended for large directories)" : "Introduzca manualmente los filtros LDAP (recomendado para directorios grandes)",
"Listing and searching for users is constrained by these criteria:" : "El listado y la búsqueda de usuarios es restringido por estos criterios:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Los objetos de clases más comunes para los usuarios son organizationalPerson, persona, usuario y inetOrgPerson. Si no está seguro de qué objeto de clase seleccionar, por favor, consulte con su administrador de directorio. ",
"The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.",
diff --git a/apps/user_ldap/l10n/lt_LT.js b/apps/user_ldap/l10n/lt_LT.js
index 8bfd3fb123d..e0fc8e17149 100644
--- a/apps/user_ldap/l10n/lt_LT.js
+++ b/apps/user_ldap/l10n/lt_LT.js
@@ -158,15 +158,16 @@ OC.L10N.register(
"Default password policy DN" : "Numatytų slaptažodžio taisyklių DN.",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Numatytų slaptažodžio taisyklių DN, kuris bus naudojamas tvarkant slaptažodžio galiojimą. Veikia tik tada, kai yra įjungtas LDAP vartotojo slaptažodžio keitimas ir yra palaikomas tik OpenLDAP. Palikite tuščią, jei norite išjungti slaptažodžio galiojimo tvarkymą.",
"Special Attributes" : "Specialūs atributai",
- "Quota Field" : "Kvotos laukas",
- "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytoji naudotojų kvota. Kitu atveju, nurodykite LDAP/AD atributą.",
- "Quota Default" : "Numatyta kvota",
+ "Quota Field" : "Leidžiamo duomenų kiekio laukas",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytasis naudotojui leidžiamas duomenų kiekis. Kitu atveju, nurodykite LDAP/AD atributą.",
+ "Quota Default" : "Leidžiamo duomenų kiekio numatytoji reikšmė",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nustelbti numatytąjį leidžiamą duomenų kiekį LDAP naudotojams, kurie leidžiamo duomenų kiekio lauke neturi nustatyto leidžiamo duomenų kiekio.",
"Email Field" : "El. pašto laukas",
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Naudotojų el. paštą nustatykite pagal jų LDAP atributą. Palikite tuščią jei norite, kad veiktų pagal numatytuosius parametrus.",
"User Home Folder Naming Rule" : "Naudotojo namų aplanko pavadinimo taisyklė",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią naudotojo vardui (numatytoji reikšmė). Kitu atveju, nurodykite LDAP/AD atributą.",
"Internal Username" : "Vidinis naudotojo vardas",
- "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal nutylėjimą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir kad nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [a-zA-Z0-9 _. @ -]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas naudojamas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis vartotojo aplanko pavadinimas. Taip pat tai nuotolinių URL dalis, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti panaikinta. Palikite tuščią, jei norite kad galiotų numatytąjį reikšmė. Pakeitimai įtakoja tik naujai priskirtiems (pridedamiems) LDAP vartotojams.",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams.",
"Internal Username Attribute:" : "Vidinis naudotojo vardo atributas:",
"Override UUID detection" : "Perrašyti UUID aptikimą",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "naudotojo vardasnaudotojo vardasPagal nutylėjimą, UUID atributas yra automatiškai aptinkamas. UUID atributas yra naudojamas identifikuoti LDAP vartotojus ir grupes. Taigi, vidinis naudotojo vardas bus sukurtas remiantis UUID, jei nenurodyta kitaip. Jūs galite pakeisti nustatymus ir perduoti pasirinktus atributus. Turite įsitikinti, kad jūsų pasirinktas atributas gali būti rastas tiek prie vartotojų, tiek prie grupių, ir yra unikalus. Jei norite, kad veiktų pagal numatytuosius parametrus, palikite tuščią. Pakeitimai turės įtakos tik naujai susietiems (pridedamiems) LDAP naudotojams ir grupėms.",
diff --git a/apps/user_ldap/l10n/lt_LT.json b/apps/user_ldap/l10n/lt_LT.json
index bcd52d00e1c..15a2f4529c9 100644
--- a/apps/user_ldap/l10n/lt_LT.json
+++ b/apps/user_ldap/l10n/lt_LT.json
@@ -156,15 +156,16 @@
"Default password policy DN" : "Numatytų slaptažodžio taisyklių DN.",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Numatytų slaptažodžio taisyklių DN, kuris bus naudojamas tvarkant slaptažodžio galiojimą. Veikia tik tada, kai yra įjungtas LDAP vartotojo slaptažodžio keitimas ir yra palaikomas tik OpenLDAP. Palikite tuščią, jei norite išjungti slaptažodžio galiojimo tvarkymą.",
"Special Attributes" : "Specialūs atributai",
- "Quota Field" : "Kvotos laukas",
- "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytoji naudotojų kvota. Kitu atveju, nurodykite LDAP/AD atributą.",
- "Quota Default" : "Numatyta kvota",
+ "Quota Field" : "Leidžiamo duomenų kiekio laukas",
+ "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią, jei norite, kad galiotų numatytasis naudotojui leidžiamas duomenų kiekis. Kitu atveju, nurodykite LDAP/AD atributą.",
+ "Quota Default" : "Leidžiamo duomenų kiekio numatytoji reikšmė",
+ "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nustelbti numatytąjį leidžiamą duomenų kiekį LDAP naudotojams, kurie leidžiamo duomenų kiekio lauke neturi nustatyto leidžiamo duomenų kiekio.",
"Email Field" : "El. pašto laukas",
"Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Naudotojų el. paštą nustatykite pagal jų LDAP atributą. Palikite tuščią jei norite, kad veiktų pagal numatytuosius parametrus.",
"User Home Folder Naming Rule" : "Naudotojo namų aplanko pavadinimo taisyklė",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Palikite tuščią naudotojo vardui (numatytoji reikšmė). Kitu atveju, nurodykite LDAP/AD atributą.",
"Internal Username" : "Vidinis naudotojo vardas",
- "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal nutylėjimą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir kad nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [a-zA-Z0-9 _. @ -]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas naudojamas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis vartotojo aplanko pavadinimas. Taip pat tai nuotolinių URL dalis, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti panaikinta. Palikite tuščią, jei norite kad galiotų numatytąjį reikšmė. Pakeitimai įtakoja tik naujai priskirtiems (pridedamiems) LDAP vartotojams.",
+ "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Pagal numatymą vidinis naudotojo vardas bus sukurtas iš UUID atributo. Tai užtikrina naudotojo vardo unikalumą ir tuo pačiu nereikia konvertuoti simbolių. Vidinis naudotojo vardas turi apribojimą, leidžiantį tik šiuos simbolius: [ a-zA-Z0-9 _. @ - ]. Kiti simboliai pakeičiami ASCII atitikmenimis arba tiesiog praleidžiami. Sutapimų konflikto atveju yra pridedamas/padidinamas skaičius. Vidinis naudotojo vardas yra naudojamas identifikuoti naudotoją viduje. Tai kartu yra numatytasis naudotojo aplanko pavadinimas. Taip pat jis yra nuotolinių URL dalimi, pavyzdžiui, visoms *DAV paslaugoms. Naudojant šį nustatymą, numatytoji elgsena gali būti nustelbta. Palikite tuščią, jei norite kad galiotų numatytoji elgsena. Pakeitimai įsigalios tik naujai priskirtiems (pridėtiems) LDAP naudotojams.",
"Internal Username Attribute:" : "Vidinis naudotojo vardo atributas:",
"Override UUID detection" : "Perrašyti UUID aptikimą",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "naudotojo vardasnaudotojo vardasPagal nutylėjimą, UUID atributas yra automatiškai aptinkamas. UUID atributas yra naudojamas identifikuoti LDAP vartotojus ir grupes. Taigi, vidinis naudotojo vardas bus sukurtas remiantis UUID, jei nenurodyta kitaip. Jūs galite pakeisti nustatymus ir perduoti pasirinktus atributus. Turite įsitikinti, kad jūsų pasirinktas atributas gali būti rastas tiek prie vartotojų, tiek prie grupių, ir yra unikalus. Jei norite, kad veiktų pagal numatytuosius parametrus, palikite tuščią. Pakeitimai turės įtakos tik naujai susietiems (pridedamiems) LDAP naudotojams ir grupėms.",
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 1ea3cc67303..d2d8bc7395e 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -86,6 +86,8 @@ class Connection extends LDAPUtility {
protected $ignoreValidation = false;
+ protected $bindResult = [];
+
/**
* Constructor
* @param ILDAPWrapper $ldap
@@ -113,6 +115,7 @@ class Connection extends LDAPUtility {
public function __destruct() {
if(!$this->dontDestruct && $this->ldap->isResource($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
+ $this->bindResult = [];
}
}
@@ -202,6 +205,7 @@ class Connection extends LDAPUtility {
if(!is_null($this->ldapConnectionRes)) {
@$this->ldap->unbind($this->ldapConnectionRes);
$this->ldapConnectionRes = null;
+ $this->bindResult = [];
}
}
@@ -560,6 +564,7 @@ class Connection extends LDAPUtility {
if($isBackupHost && ($error !== 0 || $isOverrideMainServer)) {
$this->doConnect($this->configuration->ldapBackupHost,
$this->configuration->ldapBackupPort);
+ $this->bindResult = [];
$bindStatus = $this->bind();
$error = $this->ldap->isResource($this->ldapConnectionRes) ?
$this->ldap->errno($this->ldapConnectionRes) : -1;
@@ -612,13 +617,35 @@ class Connection extends LDAPUtility {
if(!$this->configuration->ldapConfigurationActive) {
return false;
}
- $cr = $this->getConnectionResource();
+ $cr = $this->ldapConnectionRes;
if(!$this->ldap->isResource($cr)) {
- return false;
+ $cr = $this->getConnectionResource();
+ }
+
+ if(
+ count($this->bindResult) !== 0
+ && $this->bindResult['dn'] === $this->configuration->ldapAgentName
+ && \OC::$server->getHasher()->verify(
+ $this->configPrefix . $this->configuration->ldapAgentPassword,
+ $this->bindResult['hash']
+ )
+ ) {
+ // don't attempt to bind again with the same data as before
+ // bind might have been invoked via getConnectionResource(),
+ // but we need results specifically for e.g. user login
+ return $this->bindResult['result'];
}
+
$ldapLogin = @$this->ldap->bind($cr,
$this->configuration->ldapAgentName,
$this->configuration->ldapAgentPassword);
+
+ $this->bindResult = [
+ 'dn' => $this->configuration->ldapAgentName,
+ 'hash' => \OC::$server->getHasher()->hash($this->configPrefix . $this->configuration->ldapAgentPassword),
+ 'result' => $ldapLogin,
+ ];
+
if(!$ldapLogin) {
$errno = $this->ldap->errno($cr);
diff --git a/apps/user_ldap/lib/Controller/RenewPasswordController.php b/apps/user_ldap/lib/Controller/RenewPasswordController.php
index 9cdcdddb141..f6b7ae12f0f 100644
--- a/apps/user_ldap/lib/Controller/RenewPasswordController.php
+++ b/apps/user_ldap/lib/Controller/RenewPasswordController.php
@@ -24,7 +24,6 @@
namespace OCA\User_LDAP\Controller;
use OC\HintException;
-use OC_Util;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
diff --git a/apps/user_ldap/lib/Group_LDAP.php b/apps/user_ldap/lib/Group_LDAP.php
index 6cb56941463..2e7bddb9c4d 100644
--- a/apps/user_ldap/lib/Group_LDAP.php
+++ b/apps/user_ldap/lib/Group_LDAP.php
@@ -207,6 +207,7 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
* @param string $dnGroup
* @param array|null &$seen
* @return array|mixed|null
+ * @throws \OC\ServerNotAvailableException
*/
private function _groupMembers($dnGroup, &$seen = null) {
if ($seen === null) {
@@ -220,26 +221,26 @@ class Group_LDAP extends BackendUtility implements \OCP\GroupInterface, IGroupLD
// used extensively in cron job, caching makes sense for nested groups
$cacheKey = '_groupMembers'.$dnGroup;
$groupMembers = $this->access->connection->getFromCache($cacheKey);
- if(!is_null($groupMembers)) {
+ if($groupMembers !== null) {
return $groupMembers;
}
$seen[$dnGroup] = 1;
$members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr,
$this->access->connection->ldapGroupFilter);
if (is_array($members)) {
- foreach ($members as $memberDN) {
- $allMembers[$memberDN] = 1;
+ foreach ($members as $member) {
+ $allMembers[$member] = 1;
$nestedGroups = $this->access->connection->ldapNestedGroups;
if (!empty($nestedGroups)) {
- $subMembers = $this->_groupMembers($memberDN, $seen);
+ $subMembers = $this->_groupMembers($member, $seen);
if ($subMembers) {
- $allMembers = array_merge($allMembers, $subMembers);
+ $allMembers += $subMembers;
}
}
}
}
- $allMembers = array_merge($allMembers, $this->getDynamicGroupMembers($dnGroup));
+ $allMembers += $this->getDynamicGroupMembers($dnGroup);
$this->access->connection->writeToCache($cacheKey, $allMembers);
return $allMembers;
diff --git a/apps/user_ldap/lib/Jobs/Sync.php b/apps/user_ldap/lib/Jobs/Sync.php
index 0cc0be7d3ca..4ef0636a2eb 100644
--- a/apps/user_ldap/lib/Jobs/Sync.php
+++ b/apps/user_ldap/lib/Jobs/Sync.php
@@ -25,10 +25,8 @@ namespace OCA\User_LDAP\Jobs;
use OC\BackgroundJob\TimedJob;
use OC\ServerNotAvailableException;
-use OCA\User_LDAP\Access;
use OCA\User_LDAP\AccessFactory;
use OCA\User_LDAP\Configuration;
-use OCA\User_LDAP\Connection;
use OCA\User_LDAP\ConnectionFactory;
use OCA\User_LDAP\FilesystemHelper;
use OCA\User_LDAP\Helper;
diff --git a/apps/user_ldap/lib/Notification/Notifier.php b/apps/user_ldap/lib/Notification/Notifier.php
index 8c9d20c12dc..34625a3bef4 100644
--- a/apps/user_ldap/lib/Notification/Notifier.php
+++ b/apps/user_ldap/lib/Notification/Notifier.php
@@ -26,8 +26,6 @@
namespace OCA\User_LDAP\Notification;
-use OCP\IUser;
-use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Notification\INotification;
use OCP\Notification\INotifier;
diff --git a/apps/user_ldap/templates/part.wizard-groupfilter.php b/apps/user_ldap/templates/part.wizard-groupfilter.php
index 640b0bccb8a..a059b466812 100644
--- a/apps/user_ldap/templates/part.wizard-groupfilter.php
+++ b/apps/user_ldap/templates/part.wizard-groupfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard4">
<div>
<p>
- <?php p($l->t('Groups meeting these criteria are available in %s:', $theme->getName()));?>
+ <?php p($l->t('Groups meeting these criteria are available in %s:', [$theme->getName()]));?>
</p>
<p>
<label for="ldap_groupfilter_objectclass">
@@ -45,7 +45,7 @@
<p id="rawGroupFilterContainer" class="invisible">
<textarea type="text" id="ldap_group_filter" name="ldap_group_filter"
placeholder="<?php p($l->t('Edit LDAP Query'));?>"
- title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', $theme->getName()));?>">
+ title="<?php p($l->t('The filter specifies which LDAP groups shall have access to the %s instance.', [$theme->getName()]));?>">
</textarea>
</p>
<p>
diff --git a/apps/user_ldap/templates/part.wizard-loginfilter.php b/apps/user_ldap/templates/part.wizard-loginfilter.php
index 2b0bd3f230d..c7cbabb7aba 100644
--- a/apps/user_ldap/templates/part.wizard-loginfilter.php
+++ b/apps/user_ldap/templates/part.wizard-loginfilter.php
@@ -1,7 +1,7 @@
<fieldset id="ldapWizard3">
<div>
<p>
- <?php p($l->t('When logging in, %s will find the user based on the following attributes:', $theme->getName()));?>
+ <?php p($l->t('When logging in, %s will find the user based on the following attributes:', [$theme->getName()]));?>
</p>
<p>
<label for="ldap_loginfilter_username">
diff --git a/apps/user_ldap/templates/part.wizard-userfilter.php b/apps/user_ldap/templates/part.wizard-userfilter.php
index ebac944e56f..2b8c3adb686 100644
--- a/apps/user_ldap/templates/part.wizard-userfilter.php
+++ b/apps/user_ldap/templates/part.wizard-userfilter.php
@@ -49,7 +49,7 @@
<textarea type="text" id="ldap_userlist_filter" name="ldap_userlist_filter"
class="ldapFilterInputElement"
placeholder="<?php p($l->t('Edit LDAP Query'));?>"
- title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', $theme->getName()));?>">
+ title="<?php p($l->t('The filter specifies which LDAP users shall have access to the %s instance.', [$theme->getName()]));?>">
</textarea>
</p>
<p>
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 1e1c85db247..d22b31ac333 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -83,7 +83,7 @@ style('user_ldap', 'settings');
<p><label for="ldap_backup_host"><?php p($l->t('Backup (Replica) Host'));?></label><input type="text" id="ldap_backup_host" name="ldap_backup_host" data-default="<?php p($_['ldap_backup_host_default']); ?>" title="<?php p($l->t('Give an optional backup host. It must be a replica of the main LDAP/AD server.'));?>"></p>
<p><label for="ldap_backup_port"><?php p($l->t('Backup (Replica) Port'));?></label><input type="number" id="ldap_backup_port" name="ldap_backup_port" data-default="<?php p($_['ldap_backup_port_default']); ?>" /></p>
<p><label for="ldap_override_main_server"><?php p($l->t('Disable Main Server'));?></label><input type="checkbox" id="ldap_override_main_server" name="ldap_override_main_server" value="1" data-default="<?php p($_['ldap_override_main_server_default']); ?>" title="<?php p($l->t('Only connect to the replica server.'));?>" /></p>
- <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', $theme->getName() ));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p>
+ <p><label for="ldap_turn_off_cert_check"><?php p($l->t('Turn off SSL certificate validation.'));?></label><input type="checkbox" id="ldap_turn_off_cert_check" name="ldap_turn_off_cert_check" title="<?php p($l->t('Not recommended, use it for testing only! If connection only works with this option, import the LDAP server\'s SSL certificate in your %s server.', [$theme->getName()] ));?>" data-default="<?php p($_['ldap_turn_off_cert_check_default']); ?>" value="1"><br/></p>
<p><label for="ldap_cache_ttl"><?php p($l->t('Cache Time-To-Live'));?></label><input type="number" id="ldap_cache_ttl" name="ldap_cache_ttl" title="<?php p($l->t('in seconds. A change empties the cache.'));?>" data-default="<?php p($_['ldap_cache_ttl_default']); ?>" /></p>
</div>
<h3><?php p($l->t('Directory Settings'));?></h3>
diff --git a/apps/user_ldap/tests/ConnectionTest.php b/apps/user_ldap/tests/ConnectionTest.php
index c0f91d25d39..cead84b05b0 100644
--- a/apps/user_ldap/tests/ConnectionTest.php
+++ b/apps/user_ldap/tests/ConnectionTest.php
@@ -174,7 +174,7 @@ class ConnectionTest extends \Test\TestCase {
->method('connect')
->will($this->returnValue('ldapResource'));
- $this->ldap->expects($this->exactly(2))
+ $this->ldap->expects($this->once())
->method('bind')
->will($this->returnValue(false));
diff --git a/apps/user_ldap/tests/Group_LDAPTest.php b/apps/user_ldap/tests/Group_LDAPTest.php
index 03fd73f261f..ec8d888e2a0 100644
--- a/apps/user_ldap/tests/Group_LDAPTest.php
+++ b/apps/user_ldap/tests/Group_LDAPTest.php
@@ -39,6 +39,7 @@ use OCA\User_LDAP\Connection;
use OCA\User_LDAP\Group_LDAP as GroupLDAP;
use OCA\User_LDAP\ILDAPWrapper;
use OCA\User_LDAP\User\Manager;
+use Test\TestCase;
/**
* Class GroupLDAPTest
@@ -47,7 +48,7 @@ use OCA\User_LDAP\User\Manager;
*
* @package OCA\User_LDAP\Tests
*/
-class Group_LDAPTest extends \Test\TestCase {
+class Group_LDAPTest extends TestCase {
/**
* @return \PHPUnit_Framework_MockObject_MockObject|Access
*/
@@ -965,6 +966,88 @@ class Group_LDAPTest extends \Test\TestCase {
$ldap = new GroupLDAP($access, $pluginManager);
$ldap->getGroupDetails('gid');
- }
+ }
+
+ public function groupMemberProvider() {
+ $base = 'dc=species,dc=earth';
+
+ $groups0 = [
+ 'uid=3723,' . $base,
+ 'uid=8372,' . $base,
+ 'uid=8427,' . $base,
+ 'uid=2333,' . $base,
+ 'uid=4754,' . $base,
+ ];
+ $groups1 = [
+ '3723',
+ '8372',
+ '8427',
+ '2333',
+ '4754',
+ ];
+ $groups2Nested = ['6642', '1424'];
+ $expGroups2 = array_merge($groups1, $groups2Nested);
+
+ return [
+ [ #0 – test DNs
+ 'cn=Birds,' . $base,
+ $groups0,
+ ['cn=Birds,' . $base => $groups0]
+ ],
+ [ #1 – test uids
+ 'cn=Birds,' . $base,
+ $groups1,
+ ['cn=Birds,' . $base => $groups1]
+ ],
+ [ #2 – test uids with nested groups
+ 'cn=Birds,' . $base,
+ $expGroups2,
+ [
+ 'cn=Birds,' . $base => $groups1,
+ '8427' => $groups2Nested, // simplified - nested groups would work with DNs
+ ],
+ ],
+ ];
+ }
+
+ /**
+ * @param string $groupDN
+ * @param string[] $expectedMembers
+ * @param array $groupsInfo
+ * @dataProvider groupMemberProvider
+ */
+ public function testGroupMembers($groupDN, $expectedMembers, $groupsInfo = null) {
+ $access = $this->getAccessMock();
+ $access->expects($this->any())
+ ->method('readAttribute')
+ ->willReturnCallback(function($group) use ($groupDN, $expectedMembers, $groupsInfo) {
+ if(isset($groupsInfo[$group])) {
+ return $groupsInfo[$group];
+ }
+ return [];
+ });
+
+ $access->connection = $this->createMock(Connection::class);
+ if(count($groupsInfo) > 1) {
+ $access->connection->expects($this->any())
+ ->method('__get')
+ ->willReturnCallback(function($name) {
+ if($name === 'ldapNestedGroups') {
+ return 1;
+ }
+ return null;
+ });
+ }
+
+ /** @var GroupPluginManager $pluginManager */
+ $pluginManager = $this->createMock(GroupPluginManager::class);
+
+ $ldap = new GroupLDAP($access, $pluginManager);
+ $resultingMembers = $this->invokePrivate($ldap, '_groupMembers', [$groupDN]);
+
+ $expected = array_keys(array_flip($expectedMembers));
+
+ $this->assertEquals($expected, array_keys($resultingMembers), '', 0.0, 10, true);
+ }
}
diff --git a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
index 32dfb72d9c1..764c14bafe7 100644
--- a/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
+++ b/apps/user_ldap/tests/Integration/ExceptionOnLostConnection.php
@@ -96,7 +96,7 @@ class ExceptionOnLostConnection {
*/
public function setUp() {
require_once __DIR__ . '/../../../../lib/base.php';
- \OC_App::loadApps('user_ldap');
+ \OC_App::loadApps(['user_ldap']);
$ch = $this->getCurl();
$proxyInfoJson = curl_exec($ch);
diff --git a/apps/workflowengine/appinfo/info.xml b/apps/workflowengine/appinfo/info.xml
index 5d51333f750..1c069ca5432 100644
--- a/apps/workflowengine/appinfo/info.xml
+++ b/apps/workflowengine/appinfo/info.xml
@@ -1,22 +1,24 @@
<?xml version="1.0"?>
-<info>
+<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
+ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>workflowengine</id>
<name>Files workflow engine</name>
- <description></description>
- <licence>AGPL</licence>
- <author>Morris Jobke</author>
+ <summary>Files workflow engine</summary>
+ <description>Files workflow engine</description>
<version>1.4.0</version>
+ <licence>agpl</licence>
+ <author>Morris Jobke</author>
<namespace>WorkflowEngine</namespace>
- <category>other</category>
- <website>https://github.com/nextcloud/server</website>
- <bugs>https://github.com/nextcloud/server/issues</bugs>
- <repository type="git">https://github.com/nextcloud/server.git</repository>
-
<types>
<filesystem/>
</types>
+ <category>files</category>
+ <website>https://github.com/nextcloud/server</website>
+ <bugs>https://github.com/nextcloud/server/issues</bugs>
+ <repository>https://github.com/nextcloud/server.git</repository>
+
<dependencies>
<nextcloud min-version="14" max-version="14" />
</dependencies>
diff --git a/apps/workflowengine/l10n/es.js b/apps/workflowengine/l10n/es.js
index c882ece0107..3dea8a6319c 100644
--- a/apps/workflowengine/l10n/es.js
+++ b/apps/workflowengine/l10n/es.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"workflowengine",
{
"Saved" : "Guardado",
- "Saving failed:" : "Guardado fallido:",
+ "Saving failed:" : "Fallo al guardar:",
"File MIME type" : "Tipo MIME del archivo",
"is" : "es/esta",
"is not" : "no es/esta",
diff --git a/apps/workflowengine/l10n/es.json b/apps/workflowengine/l10n/es.json
index fd0e54bddae..47a76e1125c 100644
--- a/apps/workflowengine/l10n/es.json
+++ b/apps/workflowengine/l10n/es.json
@@ -1,6 +1,6 @@
{ "translations": {
"Saved" : "Guardado",
- "Saving failed:" : "Guardado fallido:",
+ "Saving failed:" : "Fallo al guardar:",
"File MIME type" : "Tipo MIME del archivo",
"is" : "es/esta",
"is not" : "no es/esta",
diff --git a/apps/workflowengine/l10n/hu.js b/apps/workflowengine/l10n/hu.js
index 8148a34b6a0..25190f7f619 100644
--- a/apps/workflowengine/l10n/hu.js
+++ b/apps/workflowengine/l10n/hu.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "%s érvénytelen, ellenőrizd",
"Check #%s does not exist" : "#%s nem létezik, ellenőrizd",
"Workflow" : "Munkafolyamat",
+ "Files workflow engine" : "Fájl munkafolyamat motor",
"Open documentation" : "Dokumentáció megnyitása",
"Add rule group" : "Szabály csoport hozzáadás",
"Short rule description" : "A szabály rövid leírása",
diff --git a/apps/workflowengine/l10n/hu.json b/apps/workflowengine/l10n/hu.json
index 98909aab244..9bae6fb384b 100644
--- a/apps/workflowengine/l10n/hu.json
+++ b/apps/workflowengine/l10n/hu.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "%s érvénytelen, ellenőrizd",
"Check #%s does not exist" : "#%s nem létezik, ellenőrizd",
"Workflow" : "Munkafolyamat",
+ "Files workflow engine" : "Fájl munkafolyamat motor",
"Open documentation" : "Dokumentáció megnyitása",
"Add rule group" : "Szabály csoport hozzáadás",
"Short rule description" : "A szabály rövid leírása",
diff --git a/apps/workflowengine/l10n/ja.js b/apps/workflowengine/l10n/ja.js
index 77f73ff7956..a6eca63cbc9 100644
--- a/apps/workflowengine/l10n/ja.js
+++ b/apps/workflowengine/l10n/ja.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "チェック %s は無効です",
"Check #%s does not exist" : "チェック #%s は存在しません",
"Workflow" : "ワークフロー",
+ "Files workflow engine" : "ファイルワークフローエンジン",
"Open documentation" : "ドキュメントを開く",
"Add rule group" : "ルールグループを追加する",
"Short rule description" : "ルールの簡潔な説明",
diff --git a/apps/workflowengine/l10n/ja.json b/apps/workflowengine/l10n/ja.json
index ecaf3af32f5..3f3b5673a24 100644
--- a/apps/workflowengine/l10n/ja.json
+++ b/apps/workflowengine/l10n/ja.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "チェック %s は無効です",
"Check #%s does not exist" : "チェック #%s は存在しません",
"Workflow" : "ワークフロー",
+ "Files workflow engine" : "ファイルワークフローエンジン",
"Open documentation" : "ドキュメントを開く",
"Add rule group" : "ルールグループを追加する",
"Short rule description" : "ルールの簡潔な説明",
diff --git a/apps/workflowengine/l10n/lv.js b/apps/workflowengine/l10n/lv.js
index 066d0254ac7..01d92d143a3 100644
--- a/apps/workflowengine/l10n/lv.js
+++ b/apps/workflowengine/l10n/lv.js
@@ -3,13 +3,13 @@ OC.L10N.register(
{
"Saved" : "Saglabāts",
"Saving failed:" : "Saglabāšana neizdevās:",
- "File MIME type" : "Faila MIME tips",
+ "File MIME type" : "Datnes MIME tips",
"is" : "ir",
"is not" : "nav",
"matches" : "atbilst",
"does not match" : "neatbilst",
"Example: {placeholder}" : "Piemērs: {placeholder}",
- "File size (upload)" : "Faila lielums (augšupielādēt)",
+ "File size (upload)" : "Datnes lielums (augšupielādēt)",
"less" : "mazāk",
"less or equals" : "mazāks vai vienāds ar",
"greater or equals" : "lielāks vai vienāds ar",
@@ -31,7 +31,7 @@ OC.L10N.register(
"Select timezone…" : "Izvēlieties laika joslu...",
"Request URL" : "Pieprasījuma URL",
"Predefined URLs" : "Standarta URLs",
- "Files WebDAV" : "WebDAV faili",
+ "Files WebDAV" : "WebDAV datnes",
"Request user agent" : "Nepieciešams lietotāja aģents",
"Sync clients" : "Sync klients",
"Android client" : "Android klients",
diff --git a/apps/workflowengine/l10n/lv.json b/apps/workflowengine/l10n/lv.json
index ad6792a57de..31f589674c2 100644
--- a/apps/workflowengine/l10n/lv.json
+++ b/apps/workflowengine/l10n/lv.json
@@ -1,13 +1,13 @@
{ "translations": {
"Saved" : "Saglabāts",
"Saving failed:" : "Saglabāšana neizdevās:",
- "File MIME type" : "Faila MIME tips",
+ "File MIME type" : "Datnes MIME tips",
"is" : "ir",
"is not" : "nav",
"matches" : "atbilst",
"does not match" : "neatbilst",
"Example: {placeholder}" : "Piemērs: {placeholder}",
- "File size (upload)" : "Faila lielums (augšupielādēt)",
+ "File size (upload)" : "Datnes lielums (augšupielādēt)",
"less" : "mazāk",
"less or equals" : "mazāks vai vienāds ar",
"greater or equals" : "lielāks vai vienāds ar",
@@ -29,7 +29,7 @@
"Select timezone…" : "Izvēlieties laika joslu...",
"Request URL" : "Pieprasījuma URL",
"Predefined URLs" : "Standarta URLs",
- "Files WebDAV" : "WebDAV faili",
+ "Files WebDAV" : "WebDAV datnes",
"Request user agent" : "Nepieciešams lietotāja aģents",
"Sync clients" : "Sync klients",
"Android client" : "Android klients",
diff --git a/apps/workflowengine/l10n/nl.js b/apps/workflowengine/l10n/nl.js
index ed5d36b0ea5..3a95f5f551d 100644
--- a/apps/workflowengine/l10n/nl.js
+++ b/apps/workflowengine/l10n/nl.js
@@ -58,7 +58,8 @@ OC.L10N.register(
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
- "Workflow" : "Workflow",
+ "Workflow" : "Workflows",
+ "Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Add rule group" : "Groepsrol toevoegen",
"Short rule description" : "Korte rolbeschrijving",
diff --git a/apps/workflowengine/l10n/nl.json b/apps/workflowengine/l10n/nl.json
index e4dee67cb1c..c267d4d5809 100644
--- a/apps/workflowengine/l10n/nl.json
+++ b/apps/workflowengine/l10n/nl.json
@@ -56,7 +56,8 @@
"Check %s does not exist" : "Controleer: %s bestaat niet",
"Check %s is invalid" : "Controleer: %s is ongeldig",
"Check #%s does not exist" : "Controleer: #%s bestaat niet",
- "Workflow" : "Workflow",
+ "Workflow" : "Workflows",
+ "Files workflow engine" : "Betanden workflow engine",
"Open documentation" : "Open documentatie",
"Add rule group" : "Groepsrol toevoegen",
"Short rule description" : "Korte rolbeschrijving",
diff --git a/apps/workflowengine/l10n/ru.js b/apps/workflowengine/l10n/ru.js
index 7f138020d02..e66ccb92598 100644
--- a/apps/workflowengine/l10n/ru.js
+++ b/apps/workflowengine/l10n/ru.js
@@ -58,7 +58,8 @@ OC.L10N.register(
"Check %s does not exist" : "Проверка %s не существует",
"Check %s is invalid" : "Проверка %s неверна",
"Check #%s does not exist" : "Проверка #%s не существует",
- "Workflow" : "Рабочий процесс",
+ "Workflow" : "Обработка файлов",
+ "Files workflow engine" : "Механизм обработки файлов",
"Open documentation" : "Открыть документацию",
"Add rule group" : "Добавить группу правил",
"Short rule description" : "Краткое описание правила",
diff --git a/apps/workflowengine/l10n/ru.json b/apps/workflowengine/l10n/ru.json
index 81fef0d18a3..cb5f32c259b 100644
--- a/apps/workflowengine/l10n/ru.json
+++ b/apps/workflowengine/l10n/ru.json
@@ -56,7 +56,8 @@
"Check %s does not exist" : "Проверка %s не существует",
"Check %s is invalid" : "Проверка %s неверна",
"Check #%s does not exist" : "Проверка #%s не существует",
- "Workflow" : "Рабочий процесс",
+ "Workflow" : "Обработка файлов",
+ "Files workflow engine" : "Механизм обработки файлов",
"Open documentation" : "Открыть документацию",
"Add rule group" : "Добавить группу правил",
"Short rule description" : "Краткое описание правила",
diff --git a/apps/workflowengine/l10n/sk.js b/apps/workflowengine/l10n/sk.js
index 8df92bdda39..fd19128944b 100644
--- a/apps/workflowengine/l10n/sk.js
+++ b/apps/workflowengine/l10n/sk.js
@@ -59,6 +59,7 @@ OC.L10N.register(
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
"Workflow" : "Systém práce",
+ "Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Add rule group" : "Pridať skupinu pravidiel",
"Short rule description" : "Zobraziť popis pravidla",
diff --git a/apps/workflowengine/l10n/sk.json b/apps/workflowengine/l10n/sk.json
index f380d30840e..8be52def123 100644
--- a/apps/workflowengine/l10n/sk.json
+++ b/apps/workflowengine/l10n/sk.json
@@ -57,6 +57,7 @@
"Check %s is invalid" : "Kontrola %s je neplatná",
"Check #%s does not exist" : "Kontrola #%s neexistuje",
"Workflow" : "Systém práce",
+ "Files workflow engine" : "Typ spôsobu práce súborov",
"Open documentation" : "Otvoriť dokumentáciu",
"Add rule group" : "Pridať skupinu pravidiel",
"Short rule description" : "Zobraziť popis pravidla",