diff options
Diffstat (limited to 'apps')
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)); + } + } |