aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/lib/Connector/Sabre/Auth.php5
-rw-r--r--apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php12
-rw-r--r--apps/files_sharing/css/sharetabview.scss56
-rw-r--r--apps/files_sharing/js/share.js14
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php63
-rw-r--r--apps/files_sharing/tests/Controller/ShareAPIControllerTest.php397
-rw-r--r--apps/files_trashbin/tests/CapabilitiesTest.php44
-rw-r--r--apps/twofactor_backupcodes/l10n/tr.js2
-rw-r--r--apps/twofactor_backupcodes/l10n/tr.json2
9 files changed, 518 insertions, 77 deletions
diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php
index fcd1b34edbc..292be61c9dc 100644
--- a/apps/dav/lib/Connector/Sabre/Auth.php
+++ b/apps/dav/lib/Connector/Sabre/Auth.php
@@ -228,11 +228,12 @@ class Auth extends AbstractBasic {
if($this->twoFactorManager->needsSecondFactor($this->userSession->getUser())) {
throw new \Sabre\DAV\Exception\NotAuthenticated('2FA challenge not passed.');
}
- if (\OC_User::handleApacheAuth() ||
+ if (
//Fix for broken webdav clients
($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ||
//Well behaved clients that only send the cookie are allowed
- ($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null)
+ ($this->userSession->isLoggedIn() && $this->session->get(self::DAV_AUTHENTICATED) === $this->userSession->getUser()->getUID() && $request->getHeader('Authorization') === null) ||
+ \OC_User::handleApacheAuth()
) {
$user = $this->userSession->getUser()->getUID();
\OC_Util::setupFS($user);
diff --git a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
index 739b81ddf01..651fbf5eaf8 100644
--- a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
+++ b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
@@ -231,9 +231,9 @@ class BirthdayServiceTest extends TestCase {
if ($expectedOp === 'create') {
$service->expects($this->exactly(3))->method('buildDateFromContact')->willReturn(new VCalendar());
$this->calDav->expects($this->exactly(3))->method('createCalendarObject')->withConsecutive(
- [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
+ [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
);
}
if ($expectedOp === 'update') {
@@ -241,9 +241,9 @@ class BirthdayServiceTest extends TestCase {
$service->expects($this->exactly(3))->method('birthdayEvenChanged')->willReturn(true);
$this->calDav->expects($this->exactly(3))->method('getCalendarObject')->willReturn(['calendardata' => '']);
$this->calDav->expects($this->exactly(3))->method('updateCalendarObject')->withConsecutive(
- [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
- [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.2//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
+ [1234, 'default-gump.vcf.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-death.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"],
+ [1234, 'default-gump.vcf-anniversary.ics', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.6//EN\r\nCALSCALE:GREGORIAN\r\nEND:VCALENDAR\r\n"]
);
}
diff --git a/apps/files_sharing/css/sharetabview.scss b/apps/files_sharing/css/sharetabview.scss
index 0d277c58bd7..0ca99ddc8f7 100644
--- a/apps/files_sharing/css/sharetabview.scss
+++ b/apps/files_sharing/css/sharetabview.scss
@@ -51,7 +51,6 @@
top: 0px;
}
.shareWithConfirm,
- .clipboardButton,
.linkPass .icon-loading-small {
position: absolute;
right: 2px;
@@ -74,21 +73,17 @@
.datepicker {
margin-left: 35px;
}
- .clipboardButton {
- position: relative;
- top: initial;
- right: initial;
- padding: 0;
- }
.share-add {
input.share-note-delete {
- display: none;
border: none;
background-color: transparent;
width: 44px !important;
padding: 0;
flex: 0 0 44px;
margin-left: auto;
+ &.hidden {
+ display: none;
+ }
}
}
// note
@@ -123,6 +118,11 @@
margin-bottom: 10px;
}
}
+
+ /* Border above last entry '+ Add another share' to separate it from current link settings */
+ .new-share {
+ border-top: 1px solid var(--color-border);
+ }
}
.linkPass .icon-loading-small {
margin-right: 0px;
@@ -182,7 +182,7 @@
.avatar {
width: 32px;
height: 32px;
- background-color: var(--color-background-darker);
+ background-color: var(--color-primary);
}
}
.unshare img {
@@ -194,31 +194,29 @@
display: flex;
align-items: center;
white-space: nowrap;
- // can edit label
- > .shareOption > label {
- padding: 13px;
- padding-right: 0;
- }
- // more menu
- > .share-menu {
- position: relative;
+
+ // icons
+ > .icon:not(.hidden),
+ .share-menu > .icon:not(.hidden) {
+ padding: 14px;
+ height: 44px;
+ width: 44px;
+ opacity: .5;
display: block;
- .icon-more {
- padding: 14px;
- height: 44px;
- width: 44px;
- opacity: .5;
- display: block;
- cursor: pointer;
- }
+ cursor: pointer;
+
&:hover,
&:focus,
&:active {
- .icon-more {
- opacity: .7;;
- }
+ opacity: .7;;
}
}
+
+ // more menu
+ > .share-menu {
+ position: relative;
+ display: block;
+ }
}
.username {
padding: 0 8px;
@@ -269,4 +267,4 @@
.resharerInfoView.subView {
position: relative;
-} \ No newline at end of file
+}
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 68529fd882f..b02c6e3d9ee 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -193,15 +193,15 @@
var $tr = fileList.findFileEl(fileInfoModel.get('name'));
// We count email shares as link share
- var hasLinkShare = shareModel.hasLinkShare();
+ var hasLinkShares = shareModel.hasLinkShares();
shareModel.get('shares').forEach(function (share) {
if (share.share_type === OC.Share.SHARE_TYPE_EMAIL) {
- hasLinkShare = true;
+ hasLinkShares = true;
}
});
OCA.Sharing.Util._updateFileListDataAttributes(fileList, $tr, shareModel);
- if (!OCA.Sharing.Util._updateFileActionIcon($tr, shareModel.hasUserShares(), hasLinkShare)) {
+ if (!OCA.Sharing.Util._updateFileActionIcon($tr, shareModel.hasUserShares(), hasLinkShares)) {
// remove icon, if applicable
OC.Share.markFileAsShared($tr, false, false);
}
@@ -249,15 +249,15 @@
*
* @param $tr file element of the file to update
* @param {boolean} hasUserShares true if a user share exists
- * @param {boolean} hasLinkShare true if a link share exists
+ * @param {boolean} hasLinkShares true if a link share exists
*
* @return {boolean} true if the icon was set, false otherwise
*/
- _updateFileActionIcon: function($tr, hasUserShares, hasLinkShare) {
+ _updateFileActionIcon: function($tr, hasUserShares, hasLinkShares) {
// if the statuses are loaded already, use them for the icon
// (needed when scrolling to the next page)
- if (hasUserShares || hasLinkShare || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {
- OC.Share.markFileAsShared($tr, true, hasLinkShare);
+ if (hasUserShares || hasLinkShares || $tr.attr('data-share-recipient-data') || $tr.attr('data-share-owner')) {
+ OC.Share.markFileAsShared($tr, true, hasLinkShares);
return true;
}
return false;
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index a935189491e..42d0218de8c 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -160,6 +160,7 @@ class ShareAPIController extends OCSController {
'token' => null,
'uid_file_owner' => $share->getShareOwner(),
'note' => $share->getNote(),
+ 'label' => $share->getLabel(),
'displayname_file_owner' => $shareOwner !== null ? $shareOwner->getDisplayName() : $share->getShareOwner(),
];
@@ -211,6 +212,8 @@ class ShareAPIController extends OCSController {
$result['share_with'] = $share->getPassword();
$result['share_with_displayname'] = $share->getPassword();
+ $result['send_password_by_talk'] = $share->getSendPasswordByTalk();
+
$result['token'] = $share->getToken();
$result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
@@ -354,15 +357,17 @@ class ShareAPIController extends OCSController {
* @param string $shareWith
* @param string $publicUpload
* @param string $password
- * @param bool $sendPasswordByTalk
+ * @param string $sendPasswordByTalk
* @param string $expireDate
+ * @param string $label
*
* @return DataResponse
- * @throws OCSNotFoundException
- * @throws OCSForbiddenException
+ * @throws NotFoundException
* @throws OCSBadRequestException
* @throws OCSException
- *
+ * @throws OCSForbiddenException
+ * @throws OCSNotFoundException
+ * @throws \OCP\Files\InvalidPathException
* @suppress PhanUndeclaredClassMethod
*/
public function createShare(
@@ -373,7 +378,8 @@ class ShareAPIController extends OCSController {
string $publicUpload = 'false',
string $password = '',
string $sendPasswordByTalk = null,
- string $expireDate = ''
+ string $expireDate = '',
+ string $label = ''
): DataResponse {
$share = $this->shareManager->newShare();
@@ -447,15 +453,6 @@ class ShareAPIController extends OCSController {
throw new OCSNotFoundException($this->l->t('Public link sharing is disabled by the administrator'));
}
- /*
- * For now we only allow 1 link share.
- * Return the existing link share if this is a duplicate
- */
- $existingShares = $this->shareManager->getSharesBy($this->currentUser, Share::SHARE_TYPE_LINK, $path, false, 1, 0);
- if (!empty($existingShares)) {
- return new DataResponse($this->formatShare($existingShares[0]));
- }
-
if ($publicUpload === 'true') {
// Check if public upload is allowed
if (!$this->shareManager->shareApiLinkAllowPublicUpload()) {
@@ -482,6 +479,19 @@ class ShareAPIController extends OCSController {
$share->setPassword($password);
}
+
+ if (!empty($label)) {
+ $share->setLabel($label);
+ }
+
+ if ($sendPasswordByTalk === 'true') {
+ if (!$this->appManager->isEnabledForUser('spreed')) {
+ throw new OCSForbiddenException($this->l->t('Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled', [$path->getPath()]));
+ }
+
+ $share->setSendPasswordByTalk(true);
+ }
+
//Expire date
if ($expireDate !== '') {
try {
@@ -746,6 +756,7 @@ class ShareAPIController extends OCSController {
* @param string $publicUpload
* @param string $expireDate
* @param string $note
+ * @param string $label
* @param string $hideDownload
* @return DataResponse
* @throws LockedException
@@ -762,6 +773,7 @@ class ShareAPIController extends OCSController {
string $publicUpload = null,
string $expireDate = null,
string $note = null,
+ string $label = null,
string $hideDownload = null
): DataResponse {
try {
@@ -776,7 +788,15 @@ class ShareAPIController extends OCSController {
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
}
- if ($permissions === null && $password === null && $sendPasswordByTalk === null && $publicUpload === null && $expireDate === null && $note === null && $hideDownload === null) {
+ if ($permissions === null &&
+ $password === null &&
+ $sendPasswordByTalk === null &&
+ $publicUpload === null &&
+ $expireDate === null &&
+ $note === null &&
+ $label === null &&
+ $hideDownload === null
+ ) {
throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
}
@@ -860,6 +880,19 @@ class ShareAPIController extends OCSController {
$share->setPassword($password);
}
+ if ($label !== null) {
+ $share->setLabel($label);
+ }
+
+ if ($sendPasswordByTalk === 'true') {
+ if (!$this->appManager->isEnabledForUser('spreed')) {
+ throw new OCSForbiddenException($this->l->t('Sharing sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled'));
+ }
+
+ $share->setSendPasswordByTalk(true);
+ } else if ($sendPasswordByTalk !== null) {
+ $share->setSendPasswordByTalk(false);
+ }
} else {
if ($permissions !== null) {
$permissions = (int)$permissions;
diff --git a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
index bd263de3f62..efc252d49d7 100644
--- a/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
+++ b/apps/files_sharing/tests/Controller/ShareAPIControllerTest.php
@@ -253,7 +253,7 @@ class ShareAPIControllerTest extends TestCase {
public function createShare($id, $shareType, $sharedWith, $sharedBy, $shareOwner, $path, $permissions,
$shareTime, $expiration, $parent, $target, $mail_send, $note = '', $token=null,
- $password=null) {
+ $password=null, $label = '') {
$share = $this->getMockBuilder(IShare::class)->getMock();
$share->method('getId')->willReturn($id);
$share->method('getShareType')->willReturn($shareType);
@@ -263,6 +263,7 @@ class ShareAPIControllerTest extends TestCase {
$share->method('getNode')->willReturn($path);
$share->method('getPermissions')->willReturn($permissions);
$share->method('getNote')->willReturn($note);
+ $share->method('getLabel')->willReturn($label);
$time = new \DateTime();
$time->setTimestamp($shareTime);
$share->method('getShareTime')->willReturn($time);
@@ -351,6 +352,7 @@ class ShareAPIControllerTest extends TestCase {
'mail_send' => 0,
'uid_file_owner' => 'ownerId',
'note' => 'personal note',
+ 'label' => '',
'displayname_file_owner' => 'ownerDisplay',
'mimetype' => 'myMimeType',
'hide_download' => 0,
@@ -396,6 +398,7 @@ class ShareAPIControllerTest extends TestCase {
'mail_send' => 0,
'uid_file_owner' => 'ownerId',
'note' => 'personal note',
+ 'label' => '',
'displayname_file_owner' => 'ownerDisplay',
'mimetype' => 'myFolderMimeType',
'hide_download' => 0,
@@ -419,13 +422,15 @@ class ShareAPIControllerTest extends TestCase {
0,
'personal note',
'token',
- 'password'
+ 'password',
+ 'first link share'
);
$expected = [
'id' => 101,
'share_type' => \OCP\Share::SHARE_TYPE_LINK,
'share_with' => 'password',
'share_with_displayname' => 'password',
+ 'send_password_by_talk' => false,
'uid_owner' => 'initiatorId',
'displayname_owner' => 'initiatorDisplay',
'item_type' => 'folder',
@@ -445,6 +450,7 @@ class ShareAPIControllerTest extends TestCase {
'url' => 'url',
'uid_file_owner' => 'ownerId',
'note' => 'personal note',
+ 'label' => 'first link share',
'displayname_file_owner' => 'ownerDisplay',
'mimetype' => 'myFolderMimeType',
'hide_download' => 0,
@@ -1130,6 +1136,71 @@ class ShareAPIControllerTest extends TestCase {
$this->assertEquals($expected->getData(), $result->getData());
}
+ public function testCreateShareLinkSendPasswordByTalk() {
+ $ocs = $this->mockFormatShare();
+
+ $path = $this->getMockBuilder(Folder::class)->getMock();
+ $storage = $this->getMockBuilder(Storage::class)->getMock();
+ $storage->method('instanceOfStorage')
+ ->with('OCA\Files_Sharing\External\Storage')
+ ->willReturn(false);
+ $path->method('getStorage')->willReturn($storage);
+ $this->rootFolder->method('getUserFolder')->with($this->currentUser)->will($this->returnSelf());
+ $this->rootFolder->method('get')->with('valid-path')->willReturn($path);
+
+ $this->shareManager->method('newShare')->willReturn(\OC::$server->getShareManager()->newShare());
+ $this->shareManager->method('shareApiAllowLinks')->willReturn(true);
+ $this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(true);
+
+ $this->shareManager->expects($this->once())->method('createShare')->with(
+ $this->callback(function (\OCP\Share\IShare $share) use ($path) {
+ return $share->getNode() === $path &&
+ $share->getShareType() === \OCP\Share::SHARE_TYPE_LINK &&
+ $share->getPermissions() === \OCP\Constants::PERMISSION_READ &&
+ $share->getSharedBy() === 'currentUser' &&
+ $share->getPassword() === 'password' &&
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === null;
+ })
+ )->will($this->returnArgument(0));
+
+ $expected = new DataResponse([]);
+ $result = $ocs->createShare('valid-path', \OCP\Constants::PERMISSION_ALL, \OCP\Share::SHARE_TYPE_LINK, null, 'false', 'password', 'true', '');
+
+ $this->assertInstanceOf(get_class($expected), $result);
+ $this->assertEquals($expected->getData(), $result->getData());
+ }
+
+ /**
+ * @expectedException \OCP\AppFramework\OCS\OCSForbiddenException
+ * @expectedExceptionMessage Sharing valid-path sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled
+ */
+ public function testCreateShareLinkSendPasswordByTalkWithTalkDisabled() {
+ $ocs = $this->mockFormatShare();
+
+ $path = $this->getMockBuilder(Folder::class)->getMock();
+ $storage = $this->getMockBuilder(Storage::class)->getMock();
+ $storage->method('instanceOfStorage')
+ ->with('OCA\Files_Sharing\External\Storage')
+ ->willReturn(false);
+ $path->method('getStorage')->willReturn($storage);
+ $path->method('getPath')->willReturn('valid-path');
+ $this->rootFolder->method('getUserFolder')->with($this->currentUser)->will($this->returnSelf());
+ $this->rootFolder->method('get')->with('valid-path')->willReturn($path);
+
+ $this->shareManager->method('newShare')->willReturn(\OC::$server->getShareManager()->newShare());
+ $this->shareManager->method('shareApiAllowLinks')->willReturn(true);
+ $this->shareManager->method('shareApiLinkAllowPublicUpload')->willReturn(true);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(false);
+
+ $this->shareManager->expects($this->never())->method('createShare');
+
+ $ocs->createShare('valid-path', \OCP\Constants::PERMISSION_ALL, \OCP\Share::SHARE_TYPE_LINK, null, 'false', 'password', 'true', '');
+ }
+
public function testCreateShareValidExpireDate() {
$ocs = $this->mockFormatShare();
@@ -1507,6 +1578,9 @@ class ShareAPIControllerTest extends TestCase {
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
->setExpirationDate(new \DateTime())
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_ALL)
->setNode($node);
@@ -1520,7 +1594,12 @@ class ShareAPIControllerTest extends TestCase {
$this->callback(function (\OCP\Share\IShare $share) {
return $share->getPermissions() === \OCP\Constants::PERMISSION_READ &&
$share->getPassword() === null &&
- $share->getExpirationDate() === null;
+ $share->getExpirationDate() === null &&
+ // Once set a note or a label are never back to null, only to an
+ // empty string.
+ $share->getNote() === '' &&
+ $share->getLabel() === '' &&
+ $share->getHideDownload() === false;
})
)->will($this->returnArgument(0));
@@ -1528,7 +1607,7 @@ class ShareAPIControllerTest extends TestCase {
->willReturn([]);
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, null, '', null, 'false', '');
+ $result = $ocs->updateShare(42, null, '', null, 'false', '', '', '', 'false');
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1555,7 +1634,10 @@ class ShareAPIControllerTest extends TestCase {
return $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) &&
$share->getPassword() === 'password' &&
- $share->getExpirationDate() == $date;
+ $share->getExpirationDate() == $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
@@ -1563,7 +1645,7 @@ class ShareAPIControllerTest extends TestCase {
->willReturn([]);
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, null, 'password', null, 'true', '2000-01-01');
+ $result = $ocs->updateShare(42, null, 'password', null, 'true', '2000-01-01', 'note', 'label', 'true');
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1695,7 +1777,11 @@ class ShareAPIControllerTest extends TestCase {
->setSharedBy($this->currentUser)
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
+ ->setSendPasswordByTalk(true)
->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_ALL)
->setNode($node);
@@ -1709,12 +1795,194 @@ class ShareAPIControllerTest extends TestCase {
$this->callback(function (\OCP\Share\IShare $share) use ($date) {
return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
$share->getPassword() === 'newpassword' &&
- $share->getExpirationDate() === $date;
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
+ })
+ )->will($this->returnArgument(0));
+
+ $expected = new DataResponse([]);
+ $result = $ocs->updateShare(42, null, 'newpassword', null, null, null, null, null, null);
+
+ $this->assertInstanceOf(get_class($expected), $result);
+ $this->assertEquals($expected->getData(), $result->getData());
+ }
+
+ public function testUpdateLinkShareSendPasswordByTalkDoesNotChangeOther() {
+ $ocs = $this->mockFormatShare();
+
+ $date = new \DateTime('2000-01-01');
+ $date->setTime(0,0,0);
+
+ $node = $this->getMockBuilder(File::class)->getMock();
+ $share = $this->newShare();
+ $share->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setSharedBy($this->currentUser)
+ ->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setPassword('password')
+ ->setSendPasswordByTalk(false)
+ ->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setNode($node);
+
+ $node->expects($this->once())
+ ->method('lock')
+ ->with(\OCP\Lock\ILockingProvider::LOCK_SHARED);
+
+ $this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(true);
+
+ $this->shareManager->expects($this->once())->method('updateShare')->with(
+ $this->callback(function (\OCP\Share\IShare $share) use ($date) {
+ return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
+ $share->getPassword() === 'password' &&
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
+ })
+ )->will($this->returnArgument(0));
+
+ $expected = new DataResponse([]);
+ $result = $ocs->updateShare(42, null, null, 'true', null, null, null, null, null);
+
+ $this->assertInstanceOf(get_class($expected), $result);
+ $this->assertEquals($expected->getData(), $result->getData());
+ }
+
+ /**
+ * @expectedException \OCP\AppFramework\OCS\OCSForbiddenException
+ * @expectedExceptionMessage Sharing sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled
+ */
+ public function testUpdateLinkShareSendPasswordByTalkWithTalkDisabledDoesNotChangeOther() {
+ $ocs = $this->mockFormatShare();
+
+ $date = new \DateTime('2000-01-01');
+ $date->setTime(0,0,0);
+
+ $node = $this->getMockBuilder(File::class)->getMock();
+ $share = $this->newShare();
+ $share->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setSharedBy($this->currentUser)
+ ->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setPassword('password')
+ ->setSendPasswordByTalk(false)
+ ->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setNode($node);
+
+ $node->expects($this->once())
+ ->method('lock')
+ ->with(\OCP\Lock\ILockingProvider::LOCK_SHARED);
+
+ $this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(false);
+
+ $this->shareManager->expects($this->never())->method('updateShare');
+
+ $ocs->updateShare(42, null, null, 'true', null, null, null, null, null);
+ }
+
+ public function testUpdateLinkShareDoNotSendPasswordByTalkDoesNotChangeOther() {
+ $ocs = $this->mockFormatShare();
+
+ $date = new \DateTime('2000-01-01');
+ $date->setTime(0,0,0);
+
+ $node = $this->getMockBuilder(File::class)->getMock();
+ $share = $this->newShare();
+ $share->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setSharedBy($this->currentUser)
+ ->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setPassword('password')
+ ->setSendPasswordByTalk(true)
+ ->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setNode($node);
+
+ $node->expects($this->once())
+ ->method('lock')
+ ->with(\OCP\Lock\ILockingProvider::LOCK_SHARED);
+
+ $this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(true);
+
+ $this->shareManager->expects($this->once())->method('updateShare')->with(
+ $this->callback(function (\OCP\Share\IShare $share) use ($date) {
+ return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
+ $share->getPassword() === 'password' &&
+ $share->getSendPasswordByTalk() === false &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
+ })
+ )->will($this->returnArgument(0));
+
+ $expected = new DataResponse([]);
+ $result = $ocs->updateShare(42, null, null, 'false', null, null, null, null, null);
+
+ $this->assertInstanceOf(get_class($expected), $result);
+ $this->assertEquals($expected->getData(), $result->getData());
+ }
+
+ public function testUpdateLinkShareDoNotSendPasswordByTalkWithTalkDisabledDoesNotChangeOther() {
+ $ocs = $this->mockFormatShare();
+
+ $date = new \DateTime('2000-01-01');
+ $date->setTime(0,0,0);
+
+ $node = $this->getMockBuilder(File::class)->getMock();
+ $share = $this->newShare();
+ $share->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setSharedBy($this->currentUser)
+ ->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setPassword('password')
+ ->setSendPasswordByTalk(true)
+ ->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
+ ->setPermissions(\OCP\Constants::PERMISSION_ALL)
+ ->setNode($node);
+
+ $node->expects($this->once())
+ ->method('lock')
+ ->with(\OCP\Lock\ILockingProvider::LOCK_SHARED);
+
+ $this->shareManager->method('getShareById')->with('ocinternal:42')->willReturn($share);
+
+ $this->appManager->method('isEnabledForUser')->with('spreed')->willReturn(false);
+
+ $this->shareManager->expects($this->once())->method('updateShare')->with(
+ $this->callback(function (\OCP\Share\IShare $share) use ($date) {
+ return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
+ $share->getPassword() === 'password' &&
+ $share->getSendPasswordByTalk() === false &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, null, 'newpassword', null, null, null);
+ $result = $ocs->updateShare(42, null, null, 'false', null, null, null, null, null);
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1729,7 +1997,11 @@ class ShareAPIControllerTest extends TestCase {
->setSharedBy($this->currentUser)
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
+ ->setSendPasswordByTalk(true)
->setExpirationDate(new \DateTime())
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_ALL)
->setNode($node);
@@ -1746,12 +2018,16 @@ class ShareAPIControllerTest extends TestCase {
return $share->getPermissions() === \OCP\Constants::PERMISSION_ALL &&
$share->getPassword() === 'password' &&
- $share->getExpirationDate() == $date;
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() == $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, null, null, null, null, '2010-12-23');
+ $result = $ocs->updateShare(42, null, null, null, null, '2010-12-23', null, null, null);
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1769,7 +2045,11 @@ class ShareAPIControllerTest extends TestCase {
->setSharedBy($this->currentUser)
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
+ ->setSendPasswordByTalk(true)
->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_ALL)
->setNode($folder);
@@ -1780,7 +2060,11 @@ class ShareAPIControllerTest extends TestCase {
$this->callback(function (\OCP\Share\IShare $share) use ($date) {
return $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) &&
$share->getPassword() === 'password' &&
- $share->getExpirationDate() === $date;
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
@@ -1788,7 +2072,7 @@ class ShareAPIControllerTest extends TestCase {
->willReturn([]);
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, null, null, null, 'true', null);
+ $result = $ocs->updateShare(42, null, null, null, 'true', null, null, null, null);
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1806,7 +2090,11 @@ class ShareAPIControllerTest extends TestCase {
->setSharedBy($this->currentUser)
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
+ ->setSendPasswordByTalk(true)
->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_ALL)
->setNode($folder);
@@ -1817,14 +2105,18 @@ class ShareAPIControllerTest extends TestCase {
$this->callback(function (\OCP\Share\IShare $share) use ($date) {
return $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) &&
$share->getPassword() === 'password' &&
- $share->getExpirationDate() === $date;
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
$this->shareManager->method('getSharedWith')->willReturn([]);
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, 7, null, null, null, null);
+ $result = $ocs->updateShare(42, 7, null, null, null, null, null, null, null);
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -1842,7 +2134,11 @@ class ShareAPIControllerTest extends TestCase {
->setSharedBy($this->currentUser)
->setShareType(\OCP\Share::SHARE_TYPE_LINK)
->setPassword('password')
+ ->setSendPasswordByTalk(true)
->setExpirationDate($date)
+ ->setNote('note')
+ ->setLabel('label')
+ ->setHideDownload(true)
->setPermissions(\OCP\Constants::PERMISSION_READ)
->setNode($folder);
@@ -1853,14 +2149,18 @@ class ShareAPIControllerTest extends TestCase {
$this->callback(function (\OCP\Share\IShare $share) use ($date) {
return $share->getPermissions() === (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE) &&
$share->getPassword() === 'password' &&
- $share->getExpirationDate() === $date;
+ $share->getSendPasswordByTalk() === true &&
+ $share->getExpirationDate() === $date &&
+ $share->getNote() === 'note' &&
+ $share->getLabel() === 'label' &&
+ $share->getHideDownload() === true;
})
)->will($this->returnArgument(0));
$this->shareManager->method('getSharedWith')->willReturn([]);
$expected = new DataResponse([]);
- $result = $ocs->updateShare(42, 31, null, null, null, null);
+ $result = $ocs->updateShare(42, 31, null, null, null, null, null, null, null);
$this->assertInstanceOf(get_class($expected), $result);
$this->assertEquals($expected->getData(), $result->getData());
@@ -2176,6 +2476,7 @@ class ShareAPIControllerTest extends TestCase {
'share_with' => 'recipient',
'share_with_displayname' => 'recipient',
'note' => 'personal note',
+ 'label' => null,
'mail_send' => 0,
'mimetype' => 'myMimeType',
'hide_download' => 0,
@@ -2196,6 +2497,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'ownerDN',
'note' => 'personal note',
+ 'label' => null,
'path' => 'file',
'item_type' => 'file',
'storage_id' => 'storageId',
@@ -2242,6 +2544,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => 'personal note',
+ 'label' => null,
'path' => 'file',
'item_type' => 'file',
'storage_id' => 'storageId',
@@ -2286,6 +2589,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => 'personal note',
+ 'label' => null,
'path' => 'file',
'item_type' => 'file',
'storage_id' => 'storageId',
@@ -2328,6 +2632,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => 'personal note',
+ 'label' => null,
'path' => 'file',
'item_type' => 'file',
'storage_id' => 'storageId',
@@ -2356,6 +2661,56 @@ class ShareAPIControllerTest extends TestCase {
->setExpirationDate(new \DateTime('2001-01-02T00:00:00'))
->setToken('myToken')
->setNote('personal note')
+ ->setLabel('new link share')
+ ->setId(42);
+
+ $result[] = [
+ [
+ 'id' => 42,
+ 'share_type' => \OCP\Share::SHARE_TYPE_LINK,
+ 'uid_owner' => 'initiator',
+ 'displayname_owner' => 'initiator',
+ 'permissions' => 1,
+ 'stime' => 946684862,
+ 'parent' => null,
+ 'expiration' => '2001-01-02 00:00:00',
+ 'token' => 'myToken',
+ 'uid_file_owner' => 'owner',
+ 'displayname_file_owner' => 'owner',
+ 'note' => 'personal note',
+ 'label' => 'new link share',
+ 'path' => 'file',
+ 'item_type' => 'file',
+ 'storage_id' => 'storageId',
+ 'storage' => 100,
+ 'item_source' => 3,
+ 'file_source' => 3,
+ 'file_parent' => 1,
+ 'file_target' => 'myTarget',
+ 'share_with' => 'mypassword',
+ 'share_with_displayname' => 'mypassword',
+ 'send_password_by_talk' => false,
+ 'mail_send' => 0,
+ 'url' => 'myLink',
+ 'mimetype' => 'myMimeType',
+ 'hide_download' => 0,
+ ], $share, [], false
+ ];
+
+ $share = \OC::$server->getShareManager()->newShare();
+ $share->setShareType(\OCP\Share::SHARE_TYPE_LINK)
+ ->setSharedBy('initiator')
+ ->setShareOwner('owner')
+ ->setPermissions(\OCP\Constants::PERMISSION_READ)
+ ->setNode($file)
+ ->setShareTime(new \DateTime('2000-01-01T00:01:02'))
+ ->setTarget('myTarget')
+ ->setPassword('mypassword')
+ ->setSendPasswordByTalk(true)
+ ->setExpirationDate(new \DateTime('2001-01-02T00:00:00'))
+ ->setToken('myToken')
+ ->setNote('personal note')
+ ->setLabel('new link share')
->setId(42);
$result[] = [
@@ -2372,6 +2727,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => 'personal note',
+ 'label' => 'new link share',
'path' => 'file',
'item_type' => 'file',
'storage_id' => 'storageId',
@@ -2382,6 +2738,7 @@ class ShareAPIControllerTest extends TestCase {
'file_target' => 'myTarget',
'share_with' => 'mypassword',
'share_with_displayname' => 'mypassword',
+ 'send_password_by_talk' => true,
'mail_send' => 0,
'url' => 'myLink',
'mimetype' => 'myMimeType',
@@ -2415,6 +2772,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => 'personal note',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2459,6 +2817,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => '',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2502,6 +2861,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => '',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2545,6 +2905,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => '',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2603,6 +2964,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => '',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2648,6 +3010,7 @@ class ShareAPIControllerTest extends TestCase {
'uid_file_owner' => 'owner',
'displayname_file_owner' => 'owner',
'note' => '',
+ 'label' => null,
'path' => 'folder',
'item_type' => 'folder',
'storage_id' => 'storageId',
@@ -2803,6 +3166,7 @@ class ShareAPIControllerTest extends TestCase {
'mail_send' => 0,
'mimetype' => 'myMimeType',
'hide_download' => 0,
+ 'label' => '',
], $share, false, []
];
@@ -2845,6 +3209,7 @@ class ShareAPIControllerTest extends TestCase {
'mail_send' => 0,
'mimetype' => 'myMimeType',
'hide_download' => 0,
+ 'label' => '',
], $share, true, [
'share_with_displayname' => 'recipientRoomName'
]
diff --git a/apps/files_trashbin/tests/CapabilitiesTest.php b/apps/files_trashbin/tests/CapabilitiesTest.php
new file mode 100644
index 00000000000..2a3e89bf414
--- /dev/null
+++ b/apps/files_trashbin/tests/CapabilitiesTest.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * @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_Trashbin\Tests;
+
+use OCA\Files_Trashbin\Capabilities;
+use Test\TestCase;
+
+class CapabilitiesTest extends TestCase {
+
+ /** @var Capabilities */
+ private $capabilities;
+
+ public function setUp() {
+ parent::setUp();
+ $this->capabilities = new Capabilities();
+ }
+
+ public function testGetCapabilities() {
+ $capabilities = [
+ 'files' => [
+ 'undelete' => true
+ ]
+ ];
+
+ $this->assertSame($capabilities, $this->capabilities->getCapabilities());
+ }
+} \ No newline at end of file
diff --git a/apps/twofactor_backupcodes/l10n/tr.js b/apps/twofactor_backupcodes/l10n/tr.js
index 303db19654e..cdd6fa5058e 100644
--- a/apps/twofactor_backupcodes/l10n/tr.js
+++ b/apps/twofactor_backupcodes/l10n/tr.js
@@ -23,7 +23,7 @@ OC.L10N.register(
"Nextcloud backup codes" : "Nextcloud yedek kodları",
"You created two-factor backup codes for your account" : "İki aşamalı kimlik doğrulama için yedek kodlarınızı oluşturdunuz",
"Second-factor backup codes" : "İki aşamalı kimlik doğrulama yedek kodları",
- "You have enabled two-factor authentication but have not yet generated backup codes. Be sure to do this in case you lose access to your second factor." : "İki aşamalı kimlik doğrulamasını etkinleştirmişsiniz ancak yedek kodlarını üretmemişsiniz. İkinci aşamaya erişemediğiniz zaman kullanabilmek için yedek kodlarını üretmeyi unutmayın.",
+ "You have enabled two-factor authentication but have not yet generated backup codes. Be sure to do this in case you lose access to your second factor." : "İki aşamalı kimlik doğrulamasını etkinleştirmiş ancak yedek kodlarını üretmemişsiniz. İkinci aşamaya erişemediğiniz zaman kullanabilmek için yedek kodlarını üretmeyi unutmayın.",
"Backup code" : "Yedek kod",
"Use backup code" : "Yedek kodu kullan",
"Two factor backup codes" : "İki aşamalı kimlik doğrulama yedek kodları",
diff --git a/apps/twofactor_backupcodes/l10n/tr.json b/apps/twofactor_backupcodes/l10n/tr.json
index 8d3137f79c4..77b1b650a2e 100644
--- a/apps/twofactor_backupcodes/l10n/tr.json
+++ b/apps/twofactor_backupcodes/l10n/tr.json
@@ -21,7 +21,7 @@
"Nextcloud backup codes" : "Nextcloud yedek kodları",
"You created two-factor backup codes for your account" : "İki aşamalı kimlik doğrulama için yedek kodlarınızı oluşturdunuz",
"Second-factor backup codes" : "İki aşamalı kimlik doğrulama yedek kodları",
- "You have enabled two-factor authentication but have not yet generated backup codes. Be sure to do this in case you lose access to your second factor." : "İki aşamalı kimlik doğrulamasını etkinleştirmişsiniz ancak yedek kodlarını üretmemişsiniz. İkinci aşamaya erişemediğiniz zaman kullanabilmek için yedek kodlarını üretmeyi unutmayın.",
+ "You have enabled two-factor authentication but have not yet generated backup codes. Be sure to do this in case you lose access to your second factor." : "İki aşamalı kimlik doğrulamasını etkinleştirmiş ancak yedek kodlarını üretmemişsiniz. İkinci aşamaya erişemediğiniz zaman kullanabilmek için yedek kodlarını üretmeyi unutmayın.",
"Backup code" : "Yedek kod",
"Use backup code" : "Yedek kodu kullan",
"Two factor backup codes" : "İki aşamalı kimlik doğrulama yedek kodları",