summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@users.noreply.github.com>2018-06-21 10:09:20 +0200
committerGitHub <noreply@github.com>2018-06-21 10:09:20 +0200
commit8ebc3d90a0876d243c889108f3a95219c0863458 (patch)
treea7fce3b4416ab1c86f1704b67fedd72555c9b348 /apps
parentf9c98d86212f14b006fdf99251e35093d5026e80 (diff)
parenta596b062f520469ca52eed10a407fc4cf8891239 (diff)
downloadnextcloud-server-8ebc3d90a0876d243c889108f3a95219c0863458.tar.gz
nextcloud-server-8ebc3d90a0876d243c889108f3a95219c0863458.zip
Merge pull request #9518 from nextcloud/feature/5986/public_share_controller_middleware
Public share middleware & controller
Diffstat (limited to 'apps')
-rw-r--r--apps/files_sharing/appinfo/routes.php8
-rw-r--r--apps/files_sharing/css/authenticate.css27
-rw-r--r--apps/files_sharing/js/authenticate.js9
-rw-r--r--apps/files_sharing/js/public.js11
-rw-r--r--apps/files_sharing/lib/Controller/PublicPreviewController.php44
-rw-r--r--apps/files_sharing/lib/Controller/ShareController.php169
-rw-r--r--apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php23
-rw-r--r--apps/files_sharing/templates/authenticate.php27
-rw-r--r--apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php18
-rw-r--r--apps/files_sharing/tests/Controller/ShareControllerTest.php226
-rw-r--r--apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php89
11 files changed, 116 insertions, 535 deletions
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 863b27da277..8e5110c6a16 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -34,13 +34,7 @@ return [
],
[
'name' => 'PublicPreview#getPreview',
- 'url' => '/publicpreview',
- 'verb' => 'GET',
- ],
-
- [
- 'name' => 'PublicPreview#getPreview',
- 'url' => '/ajax/publicpreview.php',
+ 'url' => '/publicpreview/{token}',
'verb' => 'GET',
],
diff --git a/apps/files_sharing/css/authenticate.css b/apps/files_sharing/css/authenticate.css
deleted file mode 100644
index 7f83e0b41e7..00000000000
--- a/apps/files_sharing/css/authenticate.css
+++ /dev/null
@@ -1,27 +0,0 @@
-form fieldset {
- display: flex !important;
- flex-direction: column;
-}
-
-#password {
- margin-right: 0 !important;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- height: 45px;
- box-sizing: border-box;
- flex: 1 1 auto;
- width: 100% !important;
- min-width: 0; /* FF hack for to override default value */
-}
-
-input[type='submit'] {
- width: 45px;
- height: 45px;
- margin-left: 0 !important;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-
-fieldset > p {
- display: inline-flex;
-}
diff --git a/apps/files_sharing/js/authenticate.js b/apps/files_sharing/js/authenticate.js
deleted file mode 100644
index 7f3f0d0a7d4..00000000000
--- a/apps/files_sharing/js/authenticate.js
+++ /dev/null
@@ -1,9 +0,0 @@
-$(document).ready(function(){
- $('#password').on('keyup input change', function() {
- if ($('#password').val().length > 0) {
- $('#password-submit').prop('disabled', false);
- } else {
- $('#password-submit').prop('disabled', true);
- }
- });
-});
diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js
index 1de7c6b4fcd..a2884468a6b 100644
--- a/apps/files_sharing/js/public.js
+++ b/apps/files_sharing/js/public.js
@@ -112,7 +112,6 @@ OCA.Sharing.PublicApp = {
y: Math.ceil(previewHeight * window.devicePixelRatio),
a: 'true',
file: encodeURIComponent(this.initialDir + $('#filename').val()),
- t: token,
scalingup: 0
};
@@ -150,7 +149,7 @@ OCA.Sharing.PublicApp = {
} else if ((previewSupported === 'true' && mimetype.substr(0, mimetype.indexOf('/')) !== 'video') ||
mimetype.substr(0, mimetype.indexOf('/')) === 'image' &&
mimetype !== 'image/svg+xml') {
- img.attr('src', OC.filePath('files_sharing', 'ajax', 'publicpreview.php') + '?' + OC.buildQueryString(params));
+ img.attr('src', OC.linkTo('files_sharing', '/publicpreview/'+token) + '?' + OC.buildQueryString(params));
imgcontainer.appendTo('#imgframe');
} else if (mimetype.substr(0, mimetype.indexOf('/')) !== 'video') {
img.attr('src', OC.Util.replaceSVGIcon(mimetypeIcon));
@@ -158,7 +157,7 @@ OCA.Sharing.PublicApp = {
imgcontainer.appendTo('#imgframe');
}
else if (previewSupported === 'true') {
- $('#imgframe > video').attr('poster', OC.filePath('files_sharing', 'ajax', 'publicpreview.php') + '?' + OC.buildQueryString(params));
+ $('#imgframe > video').attr('poster', OC.generateUrl(OC.linkTo('files_sharing', '/publicpreview/'+token)) + '?' + OC.buildQueryString(params));
}
if (this.fileList) {
@@ -223,8 +222,8 @@ OCA.Sharing.PublicApp = {
urlSpec.y *= window.devicePixelRatio;
urlSpec.x = Math.ceil(urlSpec.x);
urlSpec.y = Math.ceil(urlSpec.y);
- urlSpec.t = $('#dirToken').val();
- return OC.generateUrl('/apps/files_sharing/ajax/publicpreview.php?') + $.param(urlSpec);
+ var token = $('#dirToken').val();
+ return OC.generateUrl(OC.linkTo('files_sharing', '/publicpreview/'+token) + '?' + OC.buildQueryString(urlSpec));
};
this.fileList.updateEmptyContent = function() {
@@ -427,4 +426,4 @@ $(document).ready(function () {
};
}
-}); \ No newline at end of file
+});
diff --git a/apps/files_sharing/lib/Controller/PublicPreviewController.php b/apps/files_sharing/lib/Controller/PublicPreviewController.php
index 0870995fc7b..b13c0a64b0e 100644
--- a/apps/files_sharing/lib/Controller/PublicPreviewController.php
+++ b/apps/files_sharing/lib/Controller/PublicPreviewController.php
@@ -27,15 +27,18 @@ use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\FileDisplayResponse;
+use OCP\AppFramework\PublicShareController;
use OCP\Constants;
use OCP\Files\Folder;
use OCP\Files\NotFoundException;
use OCP\IPreview;
use OCP\IRequest;
+use OCP\ISession;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager as ShareManager;
+use OCP\Share\IShare;
-class PublicPreviewController extends Controller {
+class PublicPreviewController extends PublicShareController {
/** @var ShareManager */
private $shareManager;
@@ -43,16 +46,38 @@ class PublicPreviewController extends Controller {
/** @var IPreview */
private $previewManager;
- public function __construct($appName,
+ /** @var IShare */
+ private $share;
+
+ public function __construct(string $appName,
IRequest $request,
ShareManager $shareManger,
+ ISession $session,
IPreview $previewManager) {
- parent::__construct($appName, $request);
+ parent::__construct($appName, $request, $session);
$this->shareManager = $shareManger;
$this->previewManager = $previewManager;
}
+ protected function getPasswordHash(): string {
+ return $this->share->getPassword();
+ }
+
+ public function isValidToken(): bool {
+ try {
+ $this->share = $this->shareManager->getShareByToken($this->getToken());
+ return true;
+ } catch (ShareNotFound $e) {
+ return false;
+ }
+ }
+
+ protected function isPasswordProtected(): bool {
+ return $this->share->getPassword() !== null;
+ }
+
+
/**
* @PublicPage
* @NoCSRFRequired
@@ -60,24 +85,23 @@ class PublicPreviewController extends Controller {
* @param string $file
* @param int $x
* @param int $y
- * @param string $t
* @param bool $a
* @return DataResponse|FileDisplayResponse
*/
public function getPreview(
- $file = '',
- $x = 32,
- $y = 32,
- $t = '',
+ string $token,
+ string $file = '',
+ int $x = 32,
+ int $y = 32,
$a = false
) {
- if ($t === '' || $x === 0 || $y === 0) {
+ if ($token === '' || $x === 0 || $y === 0) {
return new DataResponse([], Http::STATUS_BAD_REQUEST);
}
try {
- $share = $this->shareManager->getShareByToken($t);
+ $share = $this->shareManager->getShareByToken($token);
} catch (ShareNotFound $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php
index 739031d4bc2..0b30a599c7f 100644
--- a/apps/files_sharing/lib/Controller/ShareController.php
+++ b/apps/files_sharing/lib/Controller/ShareController.php
@@ -38,6 +38,7 @@ namespace OCA\Files_Sharing\Controller;
use OC_Files;
use OC_Util;
use OCA\FederatedFileSharing\FederatedShareProvider;
+use OCP\AppFramework\AuthPublicShareController;
use OCP\AppFramework\Http\Template\SimpleMenuAction;
use OCP\AppFramework\Http\Template\ExternalShareMenuAction;
use OCP\AppFramework\Http\Template\LinkMenuAction;
@@ -46,10 +47,8 @@ use OCP\Defaults;
use OCP\IL10N;
use OCP\Template;
use OCP\Share;
-use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
-use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\IURLGenerator;
use OCP\IConfig;
@@ -58,32 +57,27 @@ use OCP\IUserManager;
use OCP\ISession;
use OCP\IPreview;
use OCA\Files_Sharing\Activity\Providers\Downloads;
-use \OCP\Files\NotFoundException;
+use OCP\Files\NotFoundException;
use OCP\Files\IRootFolder;
use OCP\Share\Exceptions\ShareNotFound;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
+use OCP\Share\IManager as ShareManager;
/**
* Class ShareController
*
* @package OCA\Files_Sharing\Controllers
*/
-class ShareController extends Controller {
+class ShareController extends AuthPublicShareController {
/** @var IConfig */
protected $config;
- /** @var IURLGenerator */
- protected $urlGenerator;
/** @var IUserManager */
protected $userManager;
/** @var ILogger */
protected $logger;
/** @var \OCP\Activity\IManager */
protected $activityManager;
- /** @var \OCP\Share\IManager */
- protected $shareManager;
- /** @var ISession */
- protected $session;
/** @var IPreview */
protected $previewManager;
/** @var IRootFolder */
@@ -96,6 +90,11 @@ class ShareController extends Controller {
protected $l10n;
/** @var Defaults */
protected $defaults;
+ /** @var ShareManager */
+ protected $shareManager;
+
+ /** @var Share\IShare */
+ protected $share;
/**
* @param string $appName
@@ -114,14 +113,14 @@ class ShareController extends Controller {
* @param IL10N $l10n
* @param Defaults $defaults
*/
- public function __construct($appName,
+ public function __construct(string $appName,
IRequest $request,
IConfig $config,
IURLGenerator $urlGenerator,
IUserManager $userManager,
ILogger $logger,
\OCP\Activity\IManager $activityManager,
- \OCP\Share\IManager $shareManager,
+ ShareManager $shareManager,
ISession $session,
IPreview $previewManager,
IRootFolder $rootFolder,
@@ -129,108 +128,50 @@ class ShareController extends Controller {
EventDispatcherInterface $eventDispatcher,
IL10N $l10n,
Defaults $defaults) {
- parent::__construct($appName, $request);
+ parent::__construct($appName, $request, $session, $urlGenerator);
$this->config = $config;
- $this->urlGenerator = $urlGenerator;
$this->userManager = $userManager;
$this->logger = $logger;
$this->activityManager = $activityManager;
- $this->shareManager = $shareManager;
- $this->session = $session;
$this->previewManager = $previewManager;
$this->rootFolder = $rootFolder;
$this->federatedShareProvider = $federatedShareProvider;
$this->eventDispatcher = $eventDispatcher;
$this->l10n = $l10n;
$this->defaults = $defaults;
+ $this->shareManager = $shareManager;
}
- /**
- * @PublicPage
- * @NoCSRFRequired
- *
- * @param string $token
- * @return TemplateResponse|RedirectResponse
- */
- public function showAuthenticate($token) {
- $share = $this->shareManager->getShareByToken($token);
-
- if($this->linkShareAuth($share)) {
- return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $token)));
- }
-
- return new TemplateResponse($this->appName, 'authenticate', array(), 'guest');
+ protected function verifyPassword(string $password): bool {
+ return $this->shareManager->checkPassword($this->share, $password);
}
- /**
- * @PublicPage
- * @UseSession
- * @BruteForceProtection(action=publicLinkAuth)
- *
- * Authenticates against password-protected shares
- * @param string $token
- * @param string $redirect
- * @param string $password
- * @return RedirectResponse|TemplateResponse|NotFoundResponse
- */
- public function authenticate($token, $redirect, $password = '') {
+ protected function getPasswordHash(): string {
+ return $this->share->getPassword();
+ }
- // Check whether share exists
+ public function isValidToken(): bool {
try {
- $share = $this->shareManager->getShareByToken($token);
+ $this->share = $this->shareManager->getShareByToken($this->getToken());
} catch (ShareNotFound $e) {
- return new NotFoundResponse();
+ return false;
}
- $authenticate = $this->linkShareAuth($share, $password);
-
- // if download was requested before auth, redirect to download
- if ($authenticate === true && $redirect === 'download') {
- return new RedirectResponse($this->urlGenerator->linkToRoute(
- 'files_sharing.sharecontroller.downloadShare',
- array('token' => $token))
- );
- } else if ($authenticate === true) {
- return new RedirectResponse($this->urlGenerator->linkToRoute(
- 'files_sharing.sharecontroller.showShare',
- array('token' => $token))
- );
- }
+ return true;
+ }
- $response = new TemplateResponse($this->appName, 'authenticate', array('wrongpw' => true), 'guest');
- $response->throttle();
- return $response;
+ protected function isPasswordProtected(): bool {
+ return $this->share->getPassword() !== null;
}
- /**
- * Authenticate a link item with the given password.
- * Or use the session if no password is provided.
- *
- * This is a modified version of Helper::authenticate
- * TODO: Try to merge back eventually with Helper::authenticate
- *
- * @param \OCP\Share\IShare $share
- * @param string|null $password
- * @return bool
- */
- private function linkShareAuth(\OCP\Share\IShare $share, $password = null) {
- if ($password !== null) {
- if ($this->shareManager->checkPassword($share, $password)) {
- $this->session->regenerateId(true, true);
- $this->session->set('public_link_authenticated', (string)$share->getId());
- } else {
- $this->emitAccessShareHook($share, 403, 'Wrong password');
- return false;
- }
- } else {
- // not authenticated ?
- if ( ! $this->session->exists('public_link_authenticated')
- || $this->session->get('public_link_authenticated') !== (string)$share->getId()) {
- return false;
- }
- }
- return true;
+ protected function authSucceeded() {
+ // For share this was always set so it is still used in other apps
+ $this->session->set('public_link_authenticated', (string)$this->share->getId());
+ }
+
+ protected function authFailed() {
+ $this->emitAccessShareHook($this->share, 403, 'Wrong password');
}
/**
@@ -285,27 +226,21 @@ class ShareController extends Controller {
* @PublicPage
* @NoCSRFRequired
*
- * @param string $token
+
* @param string $path
- * @return TemplateResponse|RedirectResponse|NotFoundResponse
+ * @return TemplateResponse
* @throws NotFoundException
* @throws \Exception
*/
- public function showShare($token, $path = '') {
+ public function showShare($path = ''): TemplateResponse {
\OC_User::setIncognitoMode(true);
// Check whether share exists
try {
- $share = $this->shareManager->getShareByToken($token);
+ $share = $this->shareManager->getShareByToken($this->getToken());
} catch (ShareNotFound $e) {
- $this->emitAccessShareHook($token, 404, 'Share not found');
- return new NotFoundResponse();
- }
-
- // Share is password protected - check whether the user is permitted to access the share
- if ($share->getPassword() !== null && !$this->linkShareAuth($share)) {
- return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate',
- array('token' => $token, 'redirect' => 'preview')));
+ $this->emitAccessShareHook($this->getToken(), 404, 'Share not found');
+ throw new NotFoundException();
}
if (!$this->validateShare($share)) {
@@ -329,8 +264,8 @@ class ShareController extends Controller {
$shareTmpl['directory_path'] = $share->getTarget();
$shareTmpl['mimetype'] = $share->getNode()->getMimetype();
$shareTmpl['previewSupported'] = $this->previewManager->isMimeSupported($share->getNode()->getMimetype());
- $shareTmpl['dirToken'] = $token;
- $shareTmpl['sharingToken'] = $token;
+ $shareTmpl['dirToken'] = $this->getToken();
+ $shareTmpl['sharingToken'] = $this->getToken();
$shareTmpl['server2serversharing'] = $this->federatedShareProvider->isOutgoingServer2serverShareEnabled();
$shareTmpl['protected'] = $share->getPassword() !== null ? 'true' : 'false';
$shareTmpl['dir'] = '';
@@ -367,7 +302,7 @@ class ShareController extends Controller {
$folder = new Template('files', 'list', '');
$folder->assign('dir', $rootFolder->getRelativePath($folderNode->getPath()));
- $folder->assign('dirToken', $token);
+ $folder->assign('dirToken', $this->getToken());
$folder->assign('permissions', \OCP\Constants::PERMISSION_READ);
$folder->assign('isPublic', true);
$folder->assign('hideFileList', $hideFileList);
@@ -382,8 +317,8 @@ class ShareController extends Controller {
$shareTmpl['hideFileList'] = $hideFileList;
$shareTmpl['shareOwner'] = $this->userManager->get($share->getShareOwner())->getDisplayName();
- $shareTmpl['downloadURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.downloadShare', ['token' => $token]);
- $shareTmpl['shareUrl'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $token]);
+ $shareTmpl['downloadURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.downloadShare', ['token' => $this->getToken()]);
+ $shareTmpl['shareUrl'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $this->getToken()]);
$shareTmpl['maxSizeAnimateGif'] = $this->config->getSystemValue('max_filesize_animated_gifs_public_sharing', 10);
$shareTmpl['previewEnabled'] = $this->config->getSystemValue('enable_previews', true);
$shareTmpl['previewMaxX'] = $this->config->getSystemValue('preview_max_x', 1024);
@@ -393,19 +328,19 @@ class ShareController extends Controller {
$ogPreview = '';
if ($shareTmpl['previewSupported']) {
$shareTmpl['previewImage'] = $this->urlGenerator->linkToRouteAbsolute( 'files_sharing.PublicPreview.getPreview',
- ['x' => 200, 'y' => 200, 'file' => $shareTmpl['directory_path'], 't' => $shareTmpl['dirToken']]);
+ ['x' => 200, 'y' => 200, 'file' => $shareTmpl['directory_path'], 'token' => $shareTmpl['dirToken']]);
$ogPreview = $shareTmpl['previewImage'];
// We just have direct previews for image files
if ($share->getNode()->getMimePart() === 'image') {
- $shareTmpl['previewURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.publicpreview.directLink', ['token' => $token]);
+ $shareTmpl['previewURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.publicpreview.directLink', ['token' => $this->getToken()]);
$ogPreview = $shareTmpl['previewURL'];
//Whatapp is kind of picky about their size requirements
if ($this->request->isUserAgent(['/^WhatsApp/'])) {
$ogPreview = $this->urlGenerator->linkToRouteAbsolute('files_sharing.PublicPreview.getPreview', [
- 't' => $token,
+ 'token' => $this->getToken(),
'x' => 256,
'y' => 256,
'a' => true,
@@ -488,12 +423,6 @@ class ShareController extends Controller {
return new \OCP\AppFramework\Http\DataResponse('Share is read-only');
}
- // Share is password protected - check whether the user is permitted to access the share
- if ($share->getPassword() !== null && !$this->linkShareAuth($share)) {
- return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate',
- ['token' => $token, 'redirect' => 'download']));
- }
-
$files_list = null;
if (!is_null($files)) { // download selected files
$files_list = json_decode($files);
@@ -507,13 +436,15 @@ class ShareController extends Controller {
}
}
- $userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
- $originalSharePath = $userFolder->getRelativePath($share->getNode()->getPath());
if (!$this->validateShare($share)) {
throw new NotFoundException();
}
+ $userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
+ $originalSharePath = $userFolder->getRelativePath($share->getNode()->getPath());
+
+
// Single file share
if ($share->getNode() instanceof \OCP\Files\File) {
// Single file download
diff --git a/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php b/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
index 4b630d0a8da..b5f1178b7f0 100644
--- a/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
+++ b/apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php
@@ -101,13 +101,6 @@ class SharingCheckMiddleware extends Middleware {
if ($controller instanceof ExternalSharesController &&
!$this->externalSharesChecks()) {
throw new S2SException('Federated sharing not allowed');
- } else if ($controller instanceof ShareController) {
- $token = $this->request->getParam('token');
- $share = $this->shareManager->getShareByToken($token);
- if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK
- && !$this->isLinkSharingEnabled()) {
- throw new NotFoundException('Link sharing is disabled');
- }
}
}
@@ -165,22 +158,6 @@ class SharingCheckMiddleware extends Middleware {
return true;
}
- /**
- * Check if link sharing is allowed
- * @return bool
- */
- private function isLinkSharingEnabled() {
- // Check if the shareAPI is enabled
- if ($this->config->getAppValue('core', 'shareapi_enabled', 'yes') !== 'yes') {
- return false;
- }
- // Check whether public sharing is enabled
- if($this->config->getAppValue('core', 'shareapi_allow_links', 'yes') !== 'yes') {
- return false;
- }
-
- return true;
- }
}
diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php
deleted file mode 100644
index 6f270c2851a..00000000000
--- a/apps/files_sharing/templates/authenticate.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
- /** @var $_ array */
- /** @var $l \OCP\IL10N */
- style('core', 'guest');
- style('files_sharing', 'authenticate');
- script('files_sharing', 'authenticate');
-?>
-<form method="post">
- <fieldset class="warning">
- <?php if (!isset($_['wrongpw'])): ?>
- <div class="warning-info"><?php p($l->t('This share is password-protected')); ?></div>
- <?php endif; ?>
- <?php if (isset($_['wrongpw'])): ?>
- <div class="warning"><?php p($l->t('The password is wrong. Try again.')); ?></div>
- <?php endif; ?>
- <p>
- <label for="password" class="infield"><?php p($l->t('Password')); ?></label>
- <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" />
- <input type="password" name="password" id="password"
- placeholder="<?php p($l->t('Password')); ?>" value=""
- autocomplete="new-password" autocapitalize="off" autocorrect="off"
- autofocus />
- <input type="submit" id="password-submit"
- class="svg icon-confirm input-button-inline" value="" disabled="disabled" />
- </p>
- </fieldset>
-</form>
diff --git a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
index 174abbb6f60..27e13bc8ced 100644
--- a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
+++ b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php
@@ -33,6 +33,7 @@ use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\IPreview;
use OCP\IRequest;
+use OCP\ISession;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IShare;
@@ -60,26 +61,27 @@ class PublicPreviewControllerTest extends TestCase {
'files_sharing',
$this->createMock(IRequest::class),
$this->shareManager,
+ $this->createMock(ISession::class),
$this->previewManager
);
}
public function testInvalidToken() {
- $res = $this->controller->getPreview('file', 10, 10, '');
+ $res = $this->controller->getPreview('', 'file', 10, 10, '');
$expected = new DataResponse([], Http::STATUS_BAD_REQUEST);
$this->assertEquals($expected, $res);
}
public function testInvalidWidth() {
- $res = $this->controller->getPreview('file', 0);
+ $res = $this->controller->getPreview('token', 'file', 0);
$expected = new DataResponse([], Http::STATUS_BAD_REQUEST);
$this->assertEquals($expected, $res);
}
public function testInvalidHeight() {
- $res = $this->controller->getPreview('file', 10, 0);
+ $res = $this->controller->getPreview('token', 'file', 10, 0);
$expected = new DataResponse([], Http::STATUS_BAD_REQUEST);
$this->assertEquals($expected, $res);
@@ -90,7 +92,7 @@ class PublicPreviewControllerTest extends TestCase {
->with($this->equalTo('token'))
->willThrowException(new ShareNotFound());
- $res = $this->controller->getPreview('file', 10, 10, 'token');
+ $res = $this->controller->getPreview('token', 'file', 10, 10);
$expected = new DataResponse([], Http::STATUS_NOT_FOUND);
$this->assertEquals($expected, $res);
@@ -105,7 +107,7 @@ class PublicPreviewControllerTest extends TestCase {
$share->method('getPermissions')
->willReturn(0);
- $res = $this->controller->getPreview('file', 10, 10, 'token');
+ $res = $this->controller->getPreview('token', 'file', 10, 10);
$expected = new DataResponse([], Http::STATUS_FORBIDDEN);
$this->assertEquals($expected, $res);
@@ -132,7 +134,7 @@ class PublicPreviewControllerTest extends TestCase {
$preview->method('getMimeType')
->willReturn('myMime');
- $res = $this->controller->getPreview('file', 10, 10, 'token', true);
+ $res = $this->controller->getPreview('token', 'file', 10, 10, true);
$expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'myMime']);
$this->assertEquals($expected, $res);
}
@@ -154,7 +156,7 @@ class PublicPreviewControllerTest extends TestCase {
->with($this->equalTo('file'))
->willThrowException(new NotFoundException());
- $res = $this->controller->getPreview('file', 10, 10, 'token', true);
+ $res = $this->controller->getPreview('token', 'file', 10, 10, true);
$expected = new DataResponse([], Http::STATUS_NOT_FOUND);
$this->assertEquals($expected, $res);
}
@@ -186,7 +188,7 @@ class PublicPreviewControllerTest extends TestCase {
$preview->method('getMimeType')
->willReturn('myMime');
- $res = $this->controller->getPreview('file', 10, 10, 'token', true);
+ $res = $this->controller->getPreview('token', 'file', 10, 10, true);
$expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'myMime']);
$this->assertEquals($expected, $res);
}
diff --git a/apps/files_sharing/tests/Controller/ShareControllerTest.php b/apps/files_sharing/tests/Controller/ShareControllerTest.php
index be99c5ee194..fb417878647 100644
--- a/apps/files_sharing/tests/Controller/ShareControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareControllerTest.php
@@ -39,6 +39,7 @@ use OCP\AppFramework\Http\Template\ExternalShareMenuAction;
use OCP\AppFramework\Http\Template\LinkMenuAction;
use OCP\AppFramework\Http\Template\PublicTemplateResponse;
use OCP\AppFramework\Http\Template\SimpleMenuAction;
+use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
@@ -156,193 +157,24 @@ class ShareControllerTest extends \Test\TestCase {
parent::tearDown();
}
- public function testShowAuthenticateNotAuthenticated() {
- $share = \OC::$server->getShareManager()->newShare();
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $response = $this->shareController->showAuthenticate('token');
- $expectedResponse = new TemplateResponse($this->appName, 'authenticate', [], 'guest');
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testShowAuthenticateAuthenticatedForDifferentShare() {
- $share = \OC::$server->getShareManager()->newShare();
- $share->setId(1);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $this->session->method('exists')->with('public_link_authenticated')->willReturn(true);
- $this->session->method('get')->with('public_link_authenticated')->willReturn('2');
-
- $response = $this->shareController->showAuthenticate('token');
- $expectedResponse = new TemplateResponse($this->appName, 'authenticate', [], 'guest');
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testShowAuthenticateCorrectShare() {
- $share = \OC::$server->getShareManager()->newShare();
- $share->setId(1);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $this->session->method('exists')->with('public_link_authenticated')->willReturn(true);
- $this->session->method('get')->with('public_link_authenticated')->willReturn('1');
-
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
- ->willReturn('redirect');
-
- $response = $this->shareController->showAuthenticate('token');
- $expectedResponse = new RedirectResponse('redirect');
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testAuthenticateInvalidToken() {
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->will($this->throwException(new \OCP\Share\Exceptions\ShareNotFound()));
-
- $response = $this->shareController->authenticate('token', 'preview');
- $expectedResponse = new NotFoundResponse();
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testAuthenticateValidPassword() {
- $share = \OC::$server->getShareManager()->newShare();
- $share->setId(42);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $this->shareManager
- ->expects($this->once())
- ->method('checkPassword')
- ->with($share, 'validpassword')
- ->willReturn(true);
-
- $this->session
- ->expects($this->once())
- ->method('set')
- ->with('public_link_authenticated', '42');
-
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files_sharing.sharecontroller.showShare', ['token'=>'token'])
- ->willReturn('redirect');
-
- $response = $this->shareController->authenticate('token', 'preview', 'validpassword');
- $expectedResponse = new RedirectResponse('redirect');
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testAuthenticateValidPasswordAndDownload() {
- $share = \OC::$server->getShareManager()->newShare();
- $share->setId(42);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $this->shareManager
- ->expects($this->once())
- ->method('checkPassword')
- ->with($share, 'validpassword')
- ->willReturn(true);
-
- $this->session
- ->expects($this->once())
- ->method('set')
- ->with('public_link_authenticated', '42');
-
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files_sharing.sharecontroller.downloadShare', ['token'=>'token'])
- ->willReturn('redirect');
-
- $response = $this->shareController->authenticate('token', 'download', 'validpassword');
- $expectedResponse = new RedirectResponse('redirect');
- $this->assertEquals($expectedResponse, $response);
- }
-
- public function testAuthenticateInvalidPassword() {
- $share = \OC::$server->getShareManager()->newShare();
- $share->setNodeId(100)
- ->setNodeType('file')
- ->setToken('token')
- ->setSharedBy('initiator')
- ->setId(42);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('token')
- ->willReturn($share);
-
- $this->shareManager
- ->expects($this->once())
- ->method('checkPassword')
- ->with($share, 'invalidpassword')
- ->willReturn(false);
-
- $this->session
- ->expects($this->never())
- ->method('set');
-
- $hookListner = $this->getMockBuilder('Dummy')->setMethods(['access'])->getMock();
- \OCP\Util::connectHook('OCP\Share', 'share_link_access', $hookListner, 'access');
-
- $hookListner->expects($this->once())
- ->method('access')
- ->with($this->callback(function(array $data) {
- return $data['itemType'] === 'file' &&
- $data['itemSource'] === 100 &&
- $data['uidOwner'] === 'initiator' &&
- $data['token'] === 'token' &&
- $data['errorCode'] === 403 &&
- $data['errorMessage'] === 'Wrong password';
- }));
-
- $response = $this->shareController->authenticate('token', 'preview', 'invalidpassword');
- $expectedResponse = new TemplateResponse($this->appName, 'authenticate', array('wrongpw' => true), 'guest');
- $expectedResponse->throttle();
- $this->assertEquals($expectedResponse, $response);
- }
-
public function testShowShareInvalidToken() {
+ $this->shareController->setToken('invalidtoken');
+
$this->shareManager
->expects($this->once())
->method('getShareByToken')
->with('invalidtoken')
->will($this->throwException(new ShareNotFound()));
+ $this->expectException(NotFoundException::class);
+
// Test without a not existing token
- $response = $this->shareController->showShare('invalidtoken');
- $expectedResponse = new NotFoundResponse();
- $this->assertEquals($expectedResponse, $response);
+ $this->shareController->showShare();
}
public function testShowShareNotAuthenticated() {
+ $this->shareController->setToken('validtoken');
+
$share = \OC::$server->getShareManager()->newShare();
$share->setPassword('password');
@@ -352,19 +184,16 @@ class ShareControllerTest extends \Test\TestCase {
->with('validtoken')
->willReturn($share);
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files_sharing.sharecontroller.authenticate', ['token' => 'validtoken', 'redirect' => 'preview'])
- ->willReturn('redirect');
+ $this->expectException(NotFoundException::class);
// Test without a not existing token
- $response = $this->shareController->showShare('validtoken');
- $expectedResponse = new RedirectResponse('redirect');
- $this->assertEquals($expectedResponse, $response);
+ $this->shareController->showShare();
}
public function testShowShare() {
+ $this->shareController->setToken('token');
+
$owner = $this->getMockBuilder(IUser::class)->getMock();
$owner->method('getDisplayName')->willReturn('ownerDisplay');
$owner->method('getUID')->willReturn('ownerUID');
@@ -428,7 +257,7 @@ class ShareControllerTest extends \Test\TestCase {
return vsprintf($text, $parameters);
}));
- $response = $this->shareController->showShare('token');
+ $response = $this->shareController->showShare();
$sharedTmplParams = array(
'displayName' => 'ownerDisplay',
'owner' => 'ownerUID',
@@ -476,6 +305,8 @@ class ShareControllerTest extends \Test\TestCase {
* @expectedException \OCP\Files\NotFoundException
*/
public function testShowShareInvalid() {
+ $this->shareController->setToken('token');
+
$owner = $this->getMockBuilder(IUser::class)->getMock();
$owner->method('getDisplayName')->willReturn('ownerDisplay');
$owner->method('getUID')->willReturn('ownerUID');
@@ -517,32 +348,7 @@ class ShareControllerTest extends \Test\TestCase {
$this->userManager->method('get')->with('ownerUID')->willReturn($owner);
- $this->shareController->showShare('token');
- }
-
- public function testDownloadShare() {
- $share = $this->getMockBuilder(IShare::class)->getMock();
- $share->method('getPassword')->willReturn('password');
- $share
- ->expects($this->once())
- ->method('getPermissions')
- ->willReturn(\OCP\Constants::PERMISSION_READ);
-
- $this->shareManager
- ->expects($this->once())
- ->method('getShareByToken')
- ->with('validtoken')
- ->willReturn($share);
-
- $this->urlGenerator->expects($this->once())
- ->method('linkToRoute')
- ->with('files_sharing.sharecontroller.authenticate', ['token' => 'validtoken', 'redirect' => 'download'])
- ->willReturn('redirect');
-
- // Test with a password protected share and no authentication
- $response = $this->shareController->downloadShare('validtoken');
- $expectedResponse = new RedirectResponse('redirect');
- $this->assertEquals($expectedResponse, $response);
+ $this->shareController->showShare();
}
public function testDownloadShareWithCreateOnlyShare() {
diff --git a/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php b/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
index d8676547a76..1fea73e6b47 100644
--- a/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
+++ b/apps/files_sharing/tests/Middleware/SharingCheckMiddlewareTest.php
@@ -98,49 +98,6 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
$this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled'));
}
- public function testIsLinkSharingEnabledWithEverythinEnabled() {
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'shareapi_enabled', 'yes')
- ->will($this->returnValue('yes'));
-
- $this->config
- ->expects($this->at(1))
- ->method('getAppValue')
- ->with('core', 'shareapi_allow_links', 'yes')
- ->will($this->returnValue('yes'));
-
- $this->assertTrue(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled'));
- }
-
-
- public function testIsLinkSharingEnabledWithLinkSharingDisabled() {
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'shareapi_enabled', 'yes')
- ->will($this->returnValue('yes'));
-
- $this->config
- ->expects($this->at(1))
- ->method('getAppValue')
- ->with('core', 'shareapi_allow_links', 'yes')
- ->will($this->returnValue('no'));
-
- $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled'));
- }
-
- public function testIsLinkSharingEnabledWithSharingAPIDisabled() {
- $this->config
- ->expects($this->once())
- ->method('getAppValue')
- ->with('core', 'shareapi_enabled', 'yes')
- ->will($this->returnValue('no'));
-
- $this->assertFalse(self::invokePrivate($this->sharingCheckMiddleware, 'isLinkSharingEnabled'));
- }
-
public function externalSharesChecksDataProvider() {
$data = [];
@@ -236,25 +193,6 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
->with('files_sharing')
->will($this->returnValue(true));
- $this->config
- ->expects($this->at(0))
- ->method('getAppValue')
- ->with('core', 'shareapi_enabled', 'yes')
- ->will($this->returnValue('yes'));
-
- $this->config
- ->expects($this->at(1))
- ->method('getAppValue')
- ->with('core', 'shareapi_allow_links', 'yes')
- ->will($this->returnValue('yes'));
-
- $this->request->expects($this->once())->method('getParam')->with('token')
- ->willReturn('token');
- $this->shareManager->expects($this->once())->method('getShareByToken')
- ->with('token')->willReturn($share);
-
- $share->expects($this->once())->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK);
-
$controller = $this->createMock(ShareController::class);
$this->sharingCheckMiddleware->beforeController($controller, 'myMethod');
@@ -262,33 +200,6 @@ class SharingCheckMiddlewareTest extends \Test\TestCase {
/**
* @expectedException \OCP\Files\NotFoundException
- * @expectedExceptionMessage Link sharing is disabled
- */
- public function testBeforeControllerWithShareControllerWithSharingEnabledAPIDisabled() {
-
- $share = $this->createMock(IShare::class);
-
- $this->appManager
- ->expects($this->once())
- ->method('isEnabledForUser')
- ->with('files_sharing')
- ->will($this->returnValue(true));
-
- $controller = $this->createMock(ShareController::class);
-
- $this->request->expects($this->once())->method('getParam')->with('token')
- ->willReturn('token');
- $this->shareManager->expects($this->once())->method('getShareByToken')
- ->with('token')->willReturn($share);
-
- $share->expects($this->once())->method('getShareType')->willReturn(\OCP\Share::SHARE_TYPE_LINK);
-
-
- $this->sharingCheckMiddleware->beforeController($controller, 'myMethod');
- }
-
- /**
- * @expectedException \OCP\Files\NotFoundException
* @expectedExceptionMessage Sharing is disabled.
*/
public function testBeforeControllerWithSharingDisabled() {