Merge pull request #4462 from danxuliu/fix-sharing-password-protected-link
Fix sharing a password protected linkpull/4494/head
commit
82c9eb1c56
@ -0,0 +1,143 @@ |
||||
/** |
||||
* |
||||
* @copyright Copyright (c) 2015, Tom Needham (tom@owncloud.com) |
||||
* @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.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/>.
|
||||
* |
||||
*/ |
||||
|
||||
describe('OC.Share.ShareDialogLinkShareView', function () { |
||||
|
||||
var configModel; |
||||
var shareModel; |
||||
var view; |
||||
|
||||
beforeEach(function () { |
||||
|
||||
var fileInfoModel = new OCA.Files.FileInfoModel({ |
||||
id: 123, |
||||
name: 'shared_file_name.txt', |
||||
path: '/subdir', |
||||
size: 100, |
||||
mimetype: 'text/plain', |
||||
permissions: OC.PERMISSION_ALL, |
||||
sharePermissions: OC.PERMISSION_ALL |
||||
}); |
||||
|
||||
var attributes = { |
||||
itemType: fileInfoModel.isDirectory() ? 'folder' : 'file', |
||||
itemSource: fileInfoModel.get('id'), |
||||
possiblePermissions: OC.PERMISSION_ALL, |
||||
permissions: OC.PERMISSION_ALL |
||||
}; |
||||
|
||||
configModel = new OC.Share.ShareConfigModel({ |
||||
enforcePasswordForPublicLink: false, |
||||
isResharingAllowed: true, |
||||
enforcePasswordForPublicLink: false, |
||||
isDefaultExpireDateEnabled: false, |
||||
isDefaultExpireDateEnforced: false, |
||||
defaultExpireDate: 7 |
||||
}); |
||||
|
||||
sinon.stub(configModel, 'isShareWithLinkAllowed'); |
||||
|
||||
shareModel = new OC.Share.ShareItemModel(attributes, { |
||||
configModel: configModel, |
||||
fileInfoModel: fileInfoModel |
||||
}); |
||||
|
||||
view = new OC.Share.ShareDialogLinkShareView({ |
||||
configModel: configModel, |
||||
model: shareModel |
||||
}); |
||||
|
||||
}); |
||||
|
||||
afterEach(function () { |
||||
view.remove(); |
||||
configModel.isShareWithLinkAllowed.restore(); |
||||
}); |
||||
|
||||
describe('onPasswordEntered', function () { |
||||
|
||||
var $passwordText; |
||||
var $workingIcon; |
||||
|
||||
beforeEach(function () { |
||||
|
||||
// Needed to render the view
|
||||
configModel.isShareWithLinkAllowed.returns(true); |
||||
|
||||
// Setting the share also triggers the rendering
|
||||
shareModel.set({ |
||||
linkShare: { |
||||
isLinkShare: true, |
||||
password: 'password' |
||||
} |
||||
}); |
||||
|
||||
var $passwordDiv = view.$el.find('#linkPass'); |
||||
$passwordText = view.$el.find('.linkPassText'); |
||||
$workingIcon = view.$el.find('.linkPass .icon-loading-small'); |
||||
|
||||
sinon.stub(shareModel, 'saveLinkShare'); |
||||
|
||||
expect($passwordDiv.hasClass('hidden')).toBeFalsy(); |
||||
expect($passwordText.hasClass('hidden')).toBeFalsy(); |
||||
expect($workingIcon.hasClass('hidden')).toBeTruthy(); |
||||
|
||||
$passwordText.val('myPassword'); |
||||
}); |
||||
|
||||
afterEach(function () { |
||||
shareModel.saveLinkShare.restore(); |
||||
}); |
||||
|
||||
it('shows the working icon when called', function () { |
||||
view.onPasswordEntered(); |
||||
|
||||
expect($workingIcon.hasClass('hidden')).toBeFalsy(); |
||||
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword' }).calledOnce).toBeTruthy(); |
||||
}); |
||||
|
||||
it('hides the working icon when saving the password succeeds', function () { |
||||
view.onPasswordEntered(); |
||||
|
||||
expect($workingIcon.hasClass('hidden')).toBeFalsy(); |
||||
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword' }).calledOnce).toBeTruthy(); |
||||
|
||||
shareModel.saveLinkShare.yieldTo("complete", [shareModel]); |
||||
|
||||
expect($workingIcon.hasClass('hidden')).toBeTruthy(); |
||||
}); |
||||
|
||||
it('hides the working icon when saving the password fails', function () { |
||||
view.onPasswordEntered(); |
||||
|
||||
expect($workingIcon.hasClass('hidden')).toBeFalsy(); |
||||
expect(shareModel.saveLinkShare.withArgs({ password: 'myPassword' }).calledOnce).toBeTruthy(); |
||||
|
||||
shareModel.saveLinkShare.yieldTo("complete", [shareModel]); |
||||
shareModel.saveLinkShare.yieldTo("error", [shareModel, "The error message"]); |
||||
|
||||
expect($workingIcon.hasClass('hidden')).toBeTruthy(); |
||||
}); |
||||
|
||||
}); |
||||
|
||||
}); |
@ -0,0 +1,31 @@ |
||||
Feature: app-files |
||||
|
||||
Scenario: set a password to a shared link |
||||
Given I am logged in |
||||
And I share the link for "welcome.txt" |
||||
When I protect the shared link with the password "abcdef" |
||||
Then I see that the working icon for password protect is shown |
||||
And I see that the working icon for password protect is eventually not shown |
||||
|
||||
Scenario: access a shared link protected by password with a valid password |
||||
Given I act as John |
||||
And I am logged in |
||||
And I share the link for "welcome.txt" protected by the password "abcdef" |
||||
And I write down the shared link |
||||
When I act as Jane |
||||
And I visit the shared link I wrote down |
||||
And I see that the current page is the Authenticate page for the shared link I wrote down |
||||
And I authenticate with password "abcdef" |
||||
Then I see that the current page is the shared link I wrote down |
||||
And I see that the shared file preview shows the text "Welcome to your Nextcloud account!" |
||||
|
||||
Scenario: access a shared link protected by password with an invalid password |
||||
Given I act as John |
||||
And I am logged in |
||||
And I share the link for "welcome.txt" protected by the password "abcdef" |
||||
And I write down the shared link |
||||
When I act as Jane |
||||
And I visit the shared link I wrote down |
||||
And I authenticate with password "fedcba" |
||||
Then I see that the current page is the Authenticate page for the shared link I wrote down |
||||
And I see that a wrong password for the shared file message is shown |
@ -0,0 +1,110 @@ |
||||
<?php |
||||
|
||||
/** |
||||
* |
||||
* @copyright Copyright (c) 2017, Daniel Calviño Sánchez (danxuliu@gmail.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/>. |
||||
* |
||||
*/ |
||||
|
||||
use Behat\Behat\Context\Context; |
||||
|
||||
class FilesSharingAppContext implements Context, ActorAwareInterface { |
||||
|
||||
use ActorAware; |
||||
|
||||
/** |
||||
* @return Locator |
||||
*/ |
||||
public static function passwordField() { |
||||
return Locator::forThe()->field("password")-> |
||||
describedAs("Password field in Authenticate page"); |
||||
} |
||||
|
||||
/** |
||||
* @return Locator |
||||
*/ |
||||
public static function authenticateButton() { |
||||
return Locator::forThe()->id("password-submit")-> |
||||
describedAs("Authenticate button in Authenticate page"); |
||||
} |
||||
|
||||
/** |
||||
* @return Locator |
||||
*/ |
||||
public static function wrongPasswordMessage() { |
||||
return Locator::forThe()->content("The password is wrong. Try again.")-> |
||||
describedAs("Wrong password message in Authenticate page"); |
||||
} |
||||
|
||||
/** |
||||
* @return Locator |
||||
*/ |
||||
public static function textPreview() { |
||||
return Locator::forThe()->css(".text-preview")-> |
||||
describedAs("Text preview in Shared file page"); |
||||
} |
||||
|
||||
/** |
||||
* @When I visit the shared link I wrote down |
||||
*/ |
||||
public function iVisitTheSharedLinkIWroteDown() { |
||||
$this->actor->getSession()->visit($this->actor->getSharedNotebook()["shared link"]); |
||||
} |
||||
|
||||
/** |
||||
* @When I authenticate with password :password |
||||
*/ |
||||
public function iAuthenticateWithPassword($password) { |
||||
$this->actor->find(self::passwordField(), 10)->setValue($password); |
||||
$this->actor->find(self::authenticateButton())->click(); |
||||
} |
||||
|
||||
/** |
||||
* @Then I see that the current page is the Authenticate page for the shared link I wrote down |
||||
*/ |
||||
public function iSeeThatTheCurrentPageIsTheAuthenticatePageForTheSharedLinkIWroteDown() { |
||||
PHPUnit_Framework_Assert::assertEquals( |
||||
$this->actor->getSharedNotebook()["shared link"] . "/authenticate", |
||||
$this->actor->getSession()->getCurrentUrl()); |
||||
} |
||||
|
||||
/** |
||||
* @Then I see that the current page is the shared link I wrote down |
||||
*/ |
||||
public function iSeeThatTheCurrentPageIsTheSharedLinkIWroteDown() { |
||||
PHPUnit_Framework_Assert::assertEquals( |
||||
$this->actor->getSharedNotebook()["shared link"], |
||||
$this->actor->getSession()->getCurrentUrl()); |
||||
} |
||||
|
||||
/** |
||||
* @Then I see that a wrong password for the shared file message is shown |
||||
*/ |
||||
public function iSeeThatAWrongPasswordForTheSharedFileMessageIsShown() { |
||||
PHPUnit_Framework_Assert::assertTrue( |
||||
$this->actor->find(self::wrongPasswordMessage(), 10)->isVisible()); |
||||
} |
||||
|
||||
/** |
||||
* @Then I see that the shared file preview shows the text :text |
||||
*/ |
||||
public function iSeeThatTheSharedFilePreviewShowsTheText($text) { |
||||
PHPUnit_Framework_Assert::assertContains($text, $this->actor->find(self::textPreview(), 10)->getText()); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue