summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/CardDAV/ImageExportPlugin.php5
-rw-r--r--apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php16
-rw-r--r--apps/files/js/file-upload.js2
-rw-r--r--apps/files_sharing/js/files_drop.js29
-rw-r--r--apps/files_sharing/lib/Controller/PublicPreviewController.php2
-rw-r--r--apps/files_trashbin/lib/Controller/PreviewController.php2
-rw-r--r--apps/files_versions/lib/Controller/PreviewController.php2
-rw-r--r--apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php41
-rw-r--r--apps/twofactor_backupcodes/settings/personal.php17
-rw-r--r--apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php61
10 files changed, 157 insertions, 20 deletions
diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php
index e48410d26d6..3ad7983451b 100644
--- a/apps/dav/lib/CardDAV/ImageExportPlugin.php
+++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php
@@ -86,6 +86,11 @@ class ImageExportPlugin extends ServerPlugin {
}
if ($result = $this->getPhoto($node)) {
+ // Allow caching
+ $response->setHeader('Cache-Control', 'private, max-age=3600, must-revalidate');
+ $response->setHeader('Etag', $node->getETag() );
+ $response->setHeader('Pragma', 'public');
+
$response->setHeader('Content-Type', $result['Content-Type']);
$response->setHeader('Content-Disposition', 'attachment');
$response->setStatus(200);
diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php
index fc4be1433fe..ed311e79f4a 100644
--- a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php
+++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php
@@ -102,6 +102,8 @@ class ImageExportPluginTest extends TestCase {
$this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt');
$card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock();
+ $card->method('getETag')
+ ->willReturn('"myEtag"');
$this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn($card);
$this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult);
@@ -110,10 +112,22 @@ class ImageExportPluginTest extends TestCase {
$this->response
->expects($this->at(0))
->method('setHeader')
- ->with('Content-Type', $getPhotoResult['Content-Type']);
+ ->with('Cache-Control', 'private, max-age=3600, must-revalidate');
$this->response
->expects($this->at(1))
->method('setHeader')
+ ->with('Etag', '"myEtag"');
+ $this->response
+ ->expects($this->at(2))
+ ->method('setHeader')
+ ->with('Pragma', 'public');
+ $this->response
+ ->expects($this->at(3))
+ ->method('setHeader')
+ ->with('Content-Type', $getPhotoResult['Content-Type']);
+ $this->response
+ ->expects($this->at(4))
+ ->method('setHeader')
->with('Content-Disposition', 'attachment');
$this->response
->expects($this->once())
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 75d9d0ebdfc..1c5758ca50b 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -1060,7 +1060,7 @@ OC.Uploader.prototype = _.extend({
// dropping a folder in firefox doesn't cause a drop event
// this is simulated by simply invoke disabling all classes
// once no dragover event isn't noticed anymore
- if ($.browser['mozilla']) {
+ if (/Firefox/i.test(navigator.userAgent)) {
disableClassOnFirefox();
}
$('#emptycontent .icon-folder').addClass('icon-filetype-folder-drag-accept');
diff --git a/apps/files_sharing/js/files_drop.js b/apps/files_sharing/js/files_drop.js
index ddfcfcd3d8b..f1fc71c6ce2 100644
--- a/apps/files_sharing/js/files_drop.js
+++ b/apps/files_sharing/js/files_drop.js
@@ -72,34 +72,43 @@
return true;
},
+ setFileIcon: function (fileName,fileIcon) {
+ $('#public-upload ul li[data-name="' + fileName + '"]').html(fileIcon);
+ $('[data-toggle="tooltip"]').tooltip();
+ },
+
initialize: function () {
$(document).bind('drop dragover', function (e) {
// Prevent the default browser drop action:
e.preventDefault();
});
var output = this.template();
+ var fileName = undefined;
$('#public-upload').fileupload({
type: 'PUT',
dropZone: $('#public-upload'),
sequentialUploads: true,
add: function(e, data) {
Drop.addFileToUpload(e, data);
+ fileName = escapeHTML(data.files[0].name);
//we return true to keep trying to upload next file even
//if addFileToUpload did not like the privious one
return true;
},
done: function(e, data) {
// Created
- if (data.jqXHR.status === 201) {
- var mimeTypeUrl = OC.MimeType.getIconUrl(data.files[0].type);
- $('#public-upload ul li[data-name="' + escapeHTML(data.files[0].name) + '"]').html('<img src="' + escapeHTML(mimeTypeUrl) + '"/> ' + escapeHTML(data.files[0].name));
- $('[data-toggle="tooltip"]').tooltip();
- } else {
- var name = data.files[0].name;
- OC.Notification.showTemporary(OC.L10N.translate('files_sharing', 'Could not upload "{filename}"', {filename: name}));
- $('#public-upload ul li[data-name="' + escapeHTML(name) + '"]').html(output({isUploading: false, name: escapeHTML(name)}));
- $('[data-toggle="tooltip"]').tooltip();
- }
+ var mimeTypeUrl = OC.MimeType.getIconUrl(data.files[0].type);
+ var fileIcon = '<img src="' + escapeHTML(mimeTypeUrl) + '"/> ' + fileName;
+ Drop.setFileIcon(fileName,fileIcon);
+ },
+ fail: function(e, data, errorThrown) {
+ OC.Notification.showTemporary(OC.L10N.translate(
+ 'files_sharing',
+ 'Could not upload "{filename}"',
+ {filename: fileName}
+ ));
+ var fileIcon = output({isUploading: false, name: fileName});
+ Drop.setFileIcon(fileName,fileIcon);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
diff --git a/apps/files_sharing/lib/Controller/PublicPreviewController.php b/apps/files_sharing/lib/Controller/PublicPreviewController.php
index b91b84c9c34..49e48993f5c 100644
--- a/apps/files_sharing/lib/Controller/PublicPreviewController.php
+++ b/apps/files_sharing/lib/Controller/PublicPreviewController.php
@@ -97,6 +97,8 @@ class PublicPreviewController extends Controller {
return new FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]);
} catch (NotFoundException $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
+ } catch (\InvalidArgumentException $e) {
+ return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
}
}
diff --git a/apps/files_trashbin/lib/Controller/PreviewController.php b/apps/files_trashbin/lib/Controller/PreviewController.php
index c73b1c17c16..ae3a106d627 100644
--- a/apps/files_trashbin/lib/Controller/PreviewController.php
+++ b/apps/files_trashbin/lib/Controller/PreviewController.php
@@ -114,6 +114,8 @@ class PreviewController extends Controller {
return new Http\FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]);
} catch (NotFoundException $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
+ } catch (\InvalidArgumentException $e) {
+ return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
}
}
diff --git a/apps/files_versions/lib/Controller/PreviewController.php b/apps/files_versions/lib/Controller/PreviewController.php
index 8d961f47ee6..7a7c024fb52 100644
--- a/apps/files_versions/lib/Controller/PreviewController.php
+++ b/apps/files_versions/lib/Controller/PreviewController.php
@@ -94,6 +94,8 @@ class PreviewController extends Controller {
return new FileDisplayResponse($f, Http::STATUS_OK, ['Content-Type' => $f->getMimeType()]);
} catch (NotFoundException $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
+ } catch (\InvalidArgumentException $e) {
+ return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
}
}
diff --git a/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php
index 902f7c783d5..5c5500862e6 100644
--- a/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php
+++ b/apps/twofactor_backupcodes/lib/Provider/BackupCodesProvider.php
@@ -22,6 +22,7 @@
namespace OCA\TwoFactorBackupCodes\Provider;
+use OC\App\AppManager;
use OCA\TwoFactorBackupCodes\Service\BackupCodeStorage;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\IL10N;
@@ -30,15 +31,29 @@ use OCP\Template;
class BackupCodesProvider implements IProvider {
+ /** @var string */
+ private $appName;
+
/** @var BackupCodeStorage */
private $storage;
/** @var IL10N */
private $l10n;
- public function __construct(BackupCodeStorage $storage, IL10N $l10n) {
+ /** @var AppManager */
+ private $appManager;
+
+ /**
+ * @param string $appName
+ * @param BackupCodeStorage $storage
+ * @param IL10N $l10n
+ * @param AppManager $appManager
+ */
+ public function __construct($appName, BackupCodeStorage $storage, IL10N $l10n, AppManager $appManager) {
+ $this->appName = $appName;
$this->l10n = $l10n;
$this->storage = $storage;
+ $this->appManager = $appManager;
}
/**
@@ -99,4 +114,28 @@ class BackupCodesProvider implements IProvider {
return $this->storage->hasBackupCodes($user);
}
+ /**
+ * Determine whether backup codes should be active or not
+ *
+ * Backup codes only make sense if at least one 2FA provider is active,
+ * hence this method checks all enabled apps on whether they provide 2FA
+ * functionality or not. If there's at least one app, backup codes are
+ * enabled on the personal settings page.
+ *
+ * @param IUser $user
+ * @return boolean
+ */
+ public function isActive(IUser $user) {
+ $appIds = array_filter($this->appManager->getEnabledAppsForUser($user), function($appId) {
+ return $appId !== $this->appName;
+ });
+ foreach ($appIds as $appId) {
+ $info = $this->appManager->getAppInfo($appId);
+ if (isset($info['two-factor-providers']) && count($info['two-factor-providers']) > 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
}
diff --git a/apps/twofactor_backupcodes/settings/personal.php b/apps/twofactor_backupcodes/settings/personal.php
index 0a018c0ff28..48c84a3355e 100644
--- a/apps/twofactor_backupcodes/settings/personal.php
+++ b/apps/twofactor_backupcodes/settings/personal.php
@@ -1,6 +1,19 @@
<?php
+
+use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider;
+use OCP\Template;
+
// @codeCoverageIgnoreStart
-$tmpl = new \OCP\Template('twofactor_backupcodes', 'personal');
-return $tmpl->fetchPage();
+/* @var $provider BackupCodesProvider */
+$provider = OC::$server->query(BackupCodesProvider::class);
+$user = OC::$server->getUserSession()->getUser();
+
+if ($provider->isActive($user)) {
+ $tmpl = new Template('twofactor_backupcodes', 'personal');
+ return $tmpl->fetchPage();
+} else {
+ return "";
+}
+
// @codeCoverageIgnoreEnd
diff --git a/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php
index 5a99cfadd41..cec5b7b2160 100644
--- a/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php
+++ b/apps/twofactor_backupcodes/tests/Unit/Provider/BackupCodesProviderTest.php
@@ -22,32 +22,41 @@
namespace OCA\TwoFactorBackupCodes\Tests\Unit\Provider;
+use OC\App\AppManager;
use OCA\TwoFactorBackupCodes\Provider\BackupCodesProvider;
use OCA\TwoFactorBackupCodes\Service\BackupCodeStorage;
use OCP\IL10N;
use OCP\IUser;
use OCP\Template;
+use PHPUnit_Framework_MockObject_MockObject;
use Test\TestCase;
class BackupCodesProviderTest extends TestCase {
+ /** @var string */
+ private $appName;
+
/** @var BackupCodeStorage|PHPUnit_Framework_MockObject_MockObject */
private $storage;
/** @var IL10N|PHPUnit_Framework_MockObject_MockObject */
private $l10n;
+ /** @var AppManager|PHPUnit_Framework_MockObject_MockObject */
+ private $appManager;
+
/** @var BackupCodesProvider */
private $provider;
protected function setUp() {
parent::setUp();
- $this->storage = $this->getMockBuilder(BackupCodeStorage::class)
- ->disableOriginalConstructor()
- ->getMock();
- $this->l10n = $this->getMockBuilder(IL10N::class)->getMock();
- $this->provider = new BackupCodesProvider($this->storage, $this->l10n);
+ $this->appName = "twofactor_backupcodes";
+ $this->storage = $this->createMock(BackupCodeStorage::class);
+ $this->l10n = $this->createMock(IL10N::class);
+ $this->appManager = $this->createMock(AppManager::class);
+
+ $this->provider = new BackupCodesProvider($this->appName, $this->storage, $this->l10n, $this->appManager);
}
public function testGetId() {
@@ -100,4 +109,46 @@ class BackupCodesProviderTest extends TestCase {
$this->assertTrue($this->provider->isTwoFactorAuthEnabledForUser($user));
}
+ public function testIsActiveNoProviders() {
+ $user = $this->getMockBuilder(IUser::class)->getMock();
+
+ $this->appManager->expects($this->once())
+ ->method('getEnabledAppsForUser')
+ ->with($user)
+ ->willReturn([
+ 'twofactor_backupcodes',
+ 'mail',
+ ]);
+ $this->appManager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('mail')
+ ->willReturn([
+ 'two-factor-providers' => [],
+ ]);
+
+ $this->assertFalse($this->provider->isActive($user));
+ }
+
+ public function testIsActiveWithProviders() {
+ $user = $this->getMockBuilder(IUser::class)->getMock();
+
+ $this->appManager->expects($this->once())
+ ->method('getEnabledAppsForUser')
+ ->with($user)
+ ->willReturn([
+ 'twofactor_backupcodes',
+ 'twofactor_u2f',
+ ]);
+ $this->appManager->expects($this->once())
+ ->method('getAppInfo')
+ ->with('twofactor_u2f')
+ ->willReturn([
+ 'two-factor-providers' => [
+ 'OCA\TwoFactorU2F\Provider\U2FProvider',
+ ],
+ ]);
+
+ $this->assertTrue($this->provider->isActive($user));
+ }
+
}