Compare commits

...

71 Commits

Author SHA1 Message Date
Git'Fellow 8bb31e0fec fix(files/cache): uniqueness guarantees in the file cache layer
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2026-04-11 12:23:04 +02:00
Nextcloud bot f8dbe2349a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-11 00:19:28 +00:00
Louis 0b74ccd426 Merge pull request #59558 from nextcloud/artonge/fix/ldap_credentials_wizards
fix(user_ldap): Do not require credentials in wizard
2026-04-10 18:30:52 +02:00
Joas Schilling a2bb782f66 Merge pull request #59566 from nextcloud/bugfix/noid/fix-reverting-multibyte-strings
fix(testing): Fix fake provider reverting strings with emojis
2026-04-10 18:14:37 +02:00
Joas Schilling b2fef6a112 Merge pull request #59564 from nextcloud/followup/59543/remove-reference-of-old-method
docs(workflowengine): Remove reference of removed method
2026-04-10 16:16:52 +02:00
Joas Schilling a8345b1da7 Merge pull request #59557 from nextcloud/dependabot/composer/aws/aws-sdk-php-3.374.2
build(deps): bump aws/aws-sdk-php to 3.376
2026-04-10 16:07:54 +02:00
Joas Schilling 43c5fd3f76 fix(testing): Fix fake provider reverting strings with emojis
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 16:03:25 +02:00
nextcloud-command d407cdd861 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-10 13:34:44 +00:00
Joas Schilling 0c5e1b2ee3 build(deps): bump aws/aws-sdk-php to 3.376
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 14:32:21 +02:00
Joas Schilling 8fad0ceffc docs(workflowengine): Remove reference of removed method
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-10 14:13:53 +02:00
Louis Chmn c181720a89 fix(user_ldap): Do not require credentials in wizard
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-10 10:41:54 +02:00
Joas Schilling 4841e6ee63 Merge pull request #59529 from nextcloud/dependabot/composer/phpseclib/phpseclib-2.0.52
build(deps): bump phpseclib/phpseclib from 2.0.47 to 2.0.52
2026-04-10 07:03:40 +02:00
Carl Schwan 52ce67b799 Merge pull request #59543 from nextcloud/chore/remove-workflowengine-deprecated-stuff
chore: Remove long-time deprecated things from workflowengine
2026-04-10 02:57:32 +02:00
Nextcloud bot 3c3cbd16b5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-10 00:19:14 +00:00
Carl Schwan 14472cb8cc Merge pull request #59511 from nextcloud/public-share-only-mask-home
Only mask the permissions for the users home directory for public shares
2026-04-10 01:54:17 +02:00
Ferdinand Thiessen 033e78e587 Merge pull request #59289 from nextcloud/fix/sharing-pwd
fix(sharing): show common confirmation on password reset
2026-04-09 19:22:09 +02:00
Ferdinand Thiessen 909ff0e4f1 Merge pull request #59426 from nextcloud/fix/wfe-scripts
fix(workflowengine): remove non existing script loading
2026-04-09 19:12:49 +02:00
Joas Schilling 8ea3fba96e ci(psalm): Update baseline
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 18:21:18 +02:00
Côme Chilliet f445c14b76 chore: Update psalm baseline
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-04-09 18:03:18 +02:00
nextcloud-command 17c223efbf chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-09 15:59:10 +00:00
Côme Chilliet 94774ca5c3 chore: Remove long-time deprecated things from workflowengine
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-04-09 17:04:52 +02:00
Ferdinand Thiessen c96099183e fix(sharing): show common confirmation on password reset
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-09 16:59:19 +02:00
Joas Schilling 00609572e4 build(deps): bump phpseclib/phpseclib from 2.0.47 to 2.0.52
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 16:28:21 +02:00
Robin Appelman 3cd3c6dd90 fix: only mask the permissions for the users home directory for public shares
this ensures that versions/trashbin/etc is still usable

Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-09 16:19:10 +02:00
Robin Appelman e96a89e630 feat: add permissions mask variant that only masks one directory
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-09 16:19:10 +02:00
Ferdinand Thiessen 1219c8e152 Merge pull request #59325 from mykh-hailo/fix/profile-ui
fix: profile page on small screens
2026-04-09 15:43:38 +02:00
Louis e3e499a63a Merge pull request #59348 from mykh-hailo/feat/ui-enhancement
feat: remove password column from user table
2026-04-09 12:45:26 +02:00
Joas Schilling 9ff0adf239 Merge pull request #59522 from nextcloud/bugfix/noid/make-maintenance-mode-more-obvious
fix(updater): Make "maintenance mode kept active" more obvious
2026-04-09 10:37:44 +02:00
Joas Schilling d6ee1eafa3 fix(updater): Make "maintenance mode kept active" more obvious
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-04-09 09:10:21 +02:00
Benjamin Gaussorgues c835064a6b Merge pull request #59494 from nextcloud/artonge/fix/drop_transaction_during_scans 2026-04-09 08:56:50 +02:00
Nextcloud bot 5b7ea4e858 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-09 00:19:00 +00:00
mykh-hailo d3ef95c78f fix: profile page on small screens
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-08 13:13:42 -04:00
Robin Appelman e761005e52 Merge pull request #57360 from nextcloud/fix/trashbin-atomic-cache
fix(trashbin): keep cache and db consistent
2026-04-08 18:04:25 +02:00
mykh-hailo 415ecb1cf5 feat: remove password column from user table
Signed-off-by: mykh-hailo <kristianderonta0205@gmail.com>
2026-04-08 12:03:56 -04:00
Ferdinand Thiessen a30653c6cb Merge pull request #59486 from nextcloud/fix/drop-files-subfolder
fix(files): properly handle dropped files on subfolders
2026-04-08 17:43:07 +02:00
nextcloud-command 48c3933cb6 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-08 15:22:45 +00:00
Ferdinand Thiessen d02df72efe fix(files): properly handle dropped files on subfolders
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-08 17:03:24 +02:00
Git'Fellow 9fd6c4abc1 Merge pull request #59296 from nextcloud/automated/noid/rector-changes
Apply rector changes
2026-04-08 15:29:02 +02:00
Louis Chmn 680ddd93c2 fix(Scanner): Remove high level transaction during scans
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-08 14:34:45 +02:00
Louis Chmn 72812b2b07 chore(Scanner): Use modern syntax and APIs
Signed-off-by: Louis Chmn <louis@chmn.me>
2026-04-08 12:26:55 +02:00
Nextcloud bot 2d91bdd74c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-04-08 00:19:10 +00:00
Ferdinand Thiessen 053f725f98 Merge pull request #59427 from nextcloud/fix/dashboard-list
fix(dashboard): remove status list if there are none
2026-04-07 17:27:32 +02:00
Ferdinand Thiessen 0b5ce4e78a Merge pull request #59423 from nextcloud/fix/webauthn-list
fix(settings): hide list of webauthn devices if empty
2026-04-07 17:27:12 +02:00
nextcloud-command 2fd8961b85 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 15:10:00 +00:00
nextcloud-command 9d70509221 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 15:05:32 +00:00
Ferdinand Thiessen 29628eba33 fix(dashboard): remove status list if there are none
- resolves https://github.com/nextcloud/server/issues/59334

If there are no status entries the list must be removed.
Its not valid to show an empty list as per accessibility rules:
https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 16:56:30 +02:00
Ferdinand Thiessen b060efaca4 fix(settings): hide list of webauthn devices if empty
- resolves https://github.com/nextcloud/server/issues/59339

If there are no devices the list would be empty.
This is invalid for accessibility, as every list needs at least one
listitem.
Ref: https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 16:56:21 +02:00
Ferdinand Thiessen 13583e8c6b Merge pull request #59424 from nextcloud/fix/systemtags-inline
fix(systemtags): only render inline list of tags if there are some
2026-04-07 16:55:25 +02:00
Ferdinand Thiessen 0526c18ac2 Merge pull request #59430 from nextcloud/chore/logger
refactor(files): use consistent logger import
2026-04-07 16:55:11 +02:00
Louis 239c8ccfe1 Merge pull request #59463 from nextcloud/automated/noid/update-min-supported-desktop-version
chore: Update minimum supported desktop version to 3.1.83
2026-04-07 15:58:29 +02:00
nextcloud-command b9e4a2a115 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 13:47:58 +00:00
Benjamin Gaussorgues 1ed4f74551 Merge pull request #58892 from nextcloud/chore/add-test-snowflake-32 2026-04-07 15:47:50 +02:00
nextcloud-command 66881a7cc9 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-04-07 13:39:54 +00:00
Ferdinand Thiessen a58a2961f3 fix(systemtags): only render inline list of tags if there are some
- resolves #59332

If there are no tags available, then we cannot render an `<ul>` element
as this would result in invalid HTML / invalid accessibility state.
Ref: https://www.w3.org/TR/wai-aria-1.2/#mustContain

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 14:45:44 +02:00
Ferdinand Thiessen 044f4f076e refactor(files): use consistent logger import
We try to use named exports everywhere so also for the logger for
consistency. Also the logger is more of a util then a main entry point
so moved the implementation to the utils directory.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-07 14:41:03 +02:00
Côme Chilliet 3f6d0c4192 Merge pull request #59462 from Keeper-of-the-Keys/config-header-attempt-2
feat: add config header and tests.
2026-04-07 14:40:33 +02:00
E.S. Rosenberg a.k.a. Keeper of the Keys 3f539d78e3 fix: change config-warning to const per @come-nc request in the PR.
Signed-off-by: E.S. Rosenberg a.k.a. Keeper of the Keys <es-github@rosenberg.org.il>
2026-04-07 11:47:14 +03:00
nextcloud-command c5e3677d28 chore: Update minimum supported desktop version
Signed-off-by: GitHub <noreply@github.com>
2026-04-06 00:47:07 +00:00
E.S. Rosenberg a.k.a. Keeper of the Keys 52d092da64 feat: add config header and tests.
Signed-off-by: E.S. Rosenberg a.k.a. Keeper of the Keys <es-github@rosenberg.org.il>
2026-04-06 00:46:26 +03:00
nextcloud-command bf729c53d7 refactor: Apply rector changes
Signed-off-by: GitHub <noreply@github.com>
2026-04-05 14:47:27 +00:00
Ferdinand Thiessen 645350d4b2 fix(workflowengine): remove non existing script loading
- resolves https://github.com/nextcloud/server/issues/59385

The script does not exist anymore, so remove it.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-04-03 17:23:43 +02:00
Benjamin Gaussorgues 1b241388ee chore(tests): run 32 bits tests when PreviewMapper test change
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-04-03 17:01:47 +02:00
Benjamin Gaussorgues 71aa36860f chore(tests): check Snowflake ID preserved in 32 bits
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-04-03 17:00:01 +02:00
Robin Appelman 0317e002f3 test: skip testTrashEntryCreatedWhenSourceNotInCache on object store
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 20:23:42 +02:00
Robin Appelman 966db54089 chore: psalm fix
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:25:27 +02:00
Robin Appelman b76cdd09cc fix: catch all exceptions during trashbin cache move
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:24:26 +02:00
Robin Appelman 921ee17026 test: add test for trashbin when cross-storage move fails
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 19:24:25 +02:00
Robin Appelman 7eae0e5f8c chore: deduplicate trashbin row delete logic
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-04-01 18:09:29 +02:00
Hoang Pham b7150ad88c perf(trashbin): avoid full rescan for uncached moves
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:21 +02:00
Hoang Pham eedd8dce3c fix(trashbin): keep metadata consistent on move
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:21 +02:00
Hoang Pham ac9c17c7b8 fix: keep trashbin cache and db in sync
Signed-off-by: Hoang Pham <hoangmaths96@gmail.com>
2026-04-01 18:00:19 +02:00
409 changed files with 2844 additions and 1969 deletions
+1
View File
@@ -9,6 +9,7 @@ on:
- ".github/workflows/phpunit-32bits.yml"
- "tests/phpunit-autotest.xml"
- "lib/private/Snowflake/*"
- "tests/lib/Preview/PreviewMapperTest.php"
workflow_dispatch:
schedule:
- cron: "15 1 * * 1-6"
+32 -27
View File
@@ -1,32 +1,37 @@
OC.L10N.register(
"comments",
{
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
},
"nplurals=2; plural=(n!=1);");
+32 -27
View File
@@ -1,30 +1,35 @@
{ "translations": {
"Comments" : "Comments",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "Edit comment",
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"No comments yet, start the conversation!" : "No comments yet, start the conversation!",
"No more messages" : "No more messages",
"Retry" : "Retry",
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "Comment",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "Comment deleted",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment"
"Comments" : "კომენტარები",
"You commented" : "თქვენი კომენტარი",
"{author} commented" : "{author}-ის კომენტარი",
"You commented on %1$s" : "თქვენი კომენტარი %1$s-ზე",
"You commented on {file}" : "თქვენი კომენტარი {file}-ზე",
"%1$s commented on %2$s" : "%1$s-მა დატოვა კომენტარი %2$s-ზე",
"{author} commented on {file}" : "{author}-მა დატოვა კომენტარი {file}-ზე",
"<strong>Comments</strong> for files" : "<strong>კომენტარები</strong> ფაილებისთვის",
"Files" : "ფაილები",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "თქვენ გახსენეს \"{file}\"-ის კომენტარში ანგარიშიდან, რომელიც მის შემდეგ წაიშალა",
"{user} mentioned you in a comment on \"{file}\"" : "{user}-მა გახსენათ კომენტარში ფაილზე \"{file}\"",
"Files app plugin to add comments to files" : "Files აპის დამატება ფაილებზე კომენტარების დასამატებლად",
"Edit comment" : "კომენტარის ჩასწორება",
"Delete comment" : "კომენტარის წაშლა",
"Cancel edit" : "ჩასწორების გაუქმება",
"New comment" : "ახალი კომენტარი",
"Write a comment …" : "კომენტარის დაწერა …",
"Post comment" : "კომენტარის დაპოსტვა",
"@ for mentions, : for emoji, / for smart picker" : "@ ხსენებისთვის, : ემოჯისთვის, / ჭკვიანი ამრჩევისთვის",
"Could not reload comments" : "კომენტარების თავიდან ჩატვირთვა შეუძლებელია",
"Failed to mark comments as read" : "კომენტარების წაკითხულად მონიშვნა ჩავარდა",
"Unable to load the comments list" : "კომენტარების სიის ჩატვირთვა ჩავარდა",
"No comments yet, start the conversation!" : "ჯერ კომენტარები არაა. დაიწყეთ საუბარი!",
"No more messages" : "მეტი შეტყობინება აღარაა",
"Retry" : "თავიდან ცდა",
"_1 new comment_::_{unread} new comments_" : ["1 ახალი კომენტარი","{unread} ახალი კომენტარი"],
"Comment" : "კომენტარი",
"An error occurred while trying to edit the comment" : "კომენტარის ჩასწორებისას აღმოჩენილია შეცდომა",
"Comment deleted" : "კომენტარი წაიშალა",
"An error occurred while trying to delete the comment" : "კომენტარის წაშლისას აღმოჩენილია შეცდომა",
"An error occurred while trying to create the comment" : "კომენტარის შექმნისას აღმოჩენილია შეცდომა",
"Write a comment …" : "კომენტარის დაწერა …"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}
+1 -1
View File
@@ -5,7 +5,7 @@
<template>
<main id="app-dashboard">
<h2>{{ greeting.text }}</h2>
<ul class="statuses">
<ul v-if="sortedRegisteredStatus.length > 0" class="statuses">
<li
v-for="status in sortedRegisteredStatus"
:id="'status-' + status"
+6 -2
View File
@@ -6,7 +6,7 @@
* SPDX-License-Identifier: AGPL-3.0-only
*/
use OC\Files\Filesystem;
use OC\Files\Storage\Wrapper\PermissionsMask;
use OC\Files\Storage\Wrapper\DirPermissionsMask;
use OC\Files\View;
use OCA\DAV\Connector\LegacyPublicAuth;
use OCA\DAV\Connector\Sabre\ServerFactory;
@@ -98,7 +98,11 @@ $server = $serverFactory->createServer(
// FIXME: should not add storage wrappers outside of preSetup, need to find a better way
$previousLog = Filesystem::logWarningWhenAddingStorageWrapper(false);
Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) {
return new PermissionsMask(['storage' => $storage, 'mask' => $share->getPermissions() | Constants::PERMISSION_SHARE]);
return new DirPermissionsMask([
'storage' => $storage,
'mask' => $share->getPermissions() | Constants::PERMISSION_SHARE,
'path' => 'files'
]);
});
Filesystem::addStorageWrapper('shareOwner', function ($mountPoint, $storage) use ($share) {
return new PublicOwnerWrapper(['storage' => $storage, 'owner' => $share->getShareOwner()]);
+50 -50
View File
@@ -72,39 +72,39 @@ OC.L10N.register(
"Description: %s" : "Leírás: %s",
"Where: %s" : "Hely: %s",
"%1$s via %2$s" : "%1$s %2$s",
"Could not generate when statement" : "Nem sikerült létrehozni amikor az állítást",
"Every Day for the entire day" : "Minden Nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden Nap a teljes napon eddig %1$s",
"Every Day between %1$s - %2$s" : "Minden Nap %1$s - %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden Nap %1$s - %2$s között %3$s-ig",
"Every %1$d Days for the entire day" : "Minden %1$d Nap az teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden%1$d Nap a teljes napra %2$s-ig",
"Every %1$d Days between %2$s - %3$s" : "Minden%1$d Nap %2$s - %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden%1$d Napon %2$s - %3$s között %4$s-ig",
"Could not generate event recurrence statement" : "Nem sikerült megújuló eseményt létrehozni",
"Every Week on %1$s for the entire day" : "Minden hét %1$s napon a teljes napja",
"Every Week on %1$s for the entire day until %2$s" : "Minden Héten %1$s a teljes napra %2$s-ig",
"Every Week on %1$s between %2$s - %3$s" : "Minden Hét %1$s napján %2$s - %3$sközött",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden Hét %1$s napján %2$s - %3$s között %4$s-ig",
"Every %1$d Weeks on %2$s for the entire day" : "Minden%1$d héten %2$s napon a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden%1$d Héten %2$s napján a teljes napon %3$s-ig",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden%1$d hét %2$s napján %3$s - %4$sközött",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden%1$d héten %2$s napján %3$s - %4$s között eddig %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s napján a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s napján a teljes napon %2$s-ig",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s napján %2$sés %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s napján %2$sés %3$s között %4$s-ig",
"Every %1$d Months on the %2$s for the entire day" : "Minden%1$d Hónap %2$s napján a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden%1$d Hónap %2$s napján a teljes napon %3$s-ig",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között %5$s-ig",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónap %2$s napján a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjában %2$s napján a teljes napon %3$s-ig",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$sközött.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$s között eddig %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden%1$d év %2$s hónapján %3$s napján a teljes napra",
"On specific dates for the entire day until %1$s" : "Egy megadott időpontban a teljes napon %1$s-ig ",
"On specific dates between %1$s - %2$s until %3$s" : "Egy megadott időpontban %1$s és %2$s %3$s-ig",
"Could not generate when statement" : "Nem sikerült előállítani az időfeltételt",
"Every Day for the entire day" : "Minden nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden nap a teljes napon eddig: %1$s",
"Every Day between %1$s - %2$s" : "Minden nap %1$s és %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden nap %1$s és %2$s között eddig: %3$s",
"Every %1$d Days for the entire day" : "Minden %1$d. napon, a teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden %1$d. napon, a teljes napra eddig: %2$s",
"Every %1$d Days between %2$s - %3$s" : "Minden %1$d. napon %2$s és %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden %1$d. napon %2$s és %3$s között eddig: %4$s",
"Could not generate event recurrence statement" : "Nem sikerült eseményismétlési utasítást előállítani",
"Every Week on %1$s for the entire day" : "Minden héten %1$s, a teljes napra",
"Every Week on %1$s for the entire day until %2$s" : "Minden héten %1$s, a teljes napra eddig: %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Minden héten %1$s, %2$s és %3$s között",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden héten %1$s, %2$s és %3$s között eddig: %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Minden %1$d. héten %2$s, a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden %1$d. héten %2$s, a teljes napon eddig: %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között eddig: %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s. napján, a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s. napján, a teljes napon eddig: %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s. napján %2$s és %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s. napján %2$s és %3$s között eddig: %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Minden %1$d. hónap %2$s. napján, a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden %1$d. hónap %2$s. napján, a teljes napon eddig: %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között eddig: %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónapja %2$s. napján, a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjának %2$s. napján, a teljes napon eddig: %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között eddig: %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden %1$d. év %2$s hónapjának %3$s. napján, a teljes napra",
"On specific dates for the entire day until %1$s" : "Adott dátumokon, a teljes napra eddig: %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Megadott dátumokon %1$s és %2$s között, eddig: %3$s",
"Could not generate next recurrence statement" : "Nem sikerült a következő megújuló eseményt létrehozni",
"Cancelled: %1$s" : "Lemondva: %1$s",
"\"%1$s\" has been canceled" : "A következőt le lett mondva: „%1$s”",
@@ -135,24 +135,24 @@ OC.L10N.register(
"Friday" : "Péntek",
"Saturday" : "Szombat",
"Sunday" : "Vasárnap",
"January" : "Január",
"February" : "Február",
"March" : "Március",
"April" : "Április",
"May" : "Május",
"June" : "Június",
"July" : "Július",
"August" : "Augusztus",
"September" : "Szeptember",
"January" : "január",
"February" : "február",
"March" : "március",
"April" : "április",
"May" : "május",
"June" : "június",
"July" : "július",
"August" : "augusztus",
"September" : "szeptember",
"October" : "Október",
"November" : "November",
"December" : "December",
"November" : "november",
"December" : "december",
"First" : "Első",
"Second" : "Másodperc",
"Second" : "Második",
"Third" : "Harmadik",
"Fourth" : "Negyedik",
"Last" : "Utolsó",
"Second Last" : "Második Utolsó",
"Second Last" : "Utolsó előtti",
"Third Last" : "Harmadik Utolsó",
"Fourth Last" : "Negyedik Utolsó",
"Contacts" : "Névjegyek",
@@ -183,7 +183,7 @@ OC.L10N.register(
"Accounts" : "Fiókok",
"System address book which holds all accounts" : "A rendszer címjegyzéke, amely az összes fiókot tartalmazza",
"File is not updatable: %1$s" : "A fájl nem frissíthető: %1$s",
"Failed to get storage for file" : "Nem sikerlt a tárhely lekérése a fájl számára",
"Failed to get storage for file" : "Nem sikerült a tárhely lekérése a fájl számára",
"Could not write to final file, canceled by hook" : "A végleges fájl nem írható, a hurok megszakította",
"Could not write file contents" : "A fájl tartalma nem írható",
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
@@ -208,9 +208,9 @@ OC.L10N.register(
"Completed on %s" : "Befejezve: %s",
"Due on %s by %s" : "Esedékesség: %s, %s által",
"Due on %s" : "Esedékesség: %s",
"DAV system address book" : "DAV rendszer címjegyzék",
"No outstanding DAV system address book sync." : "Nincs kiemelkedő DAV rendszer címjegyzék szinkronizálás.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A DAV rendszer címjegyzék szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található vagy hiba történt. Kérem futtassa manuálisan a következő paranccsal: \"occ dav:sync-system-addressbook\".",
"DAV system address book" : "DAV rendszer-címjegyzék",
"No outstanding DAV system address book sync." : "Nincs függőben lévő DAV rendszercímjegyzék-szinkronizálás.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A DAV rendszer címjegyzék-szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található, vagy mert hiba történt. Futtassa kézileg a következő paranccsal: occ dav:sync-system-addressbook.",
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
+50 -50
View File
@@ -70,39 +70,39 @@
"Description: %s" : "Leírás: %s",
"Where: %s" : "Hely: %s",
"%1$s via %2$s" : "%1$s %2$s",
"Could not generate when statement" : "Nem sikerült létrehozni amikor az állítást",
"Every Day for the entire day" : "Minden Nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden Nap a teljes napon eddig %1$s",
"Every Day between %1$s - %2$s" : "Minden Nap %1$s - %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden Nap %1$s - %2$s között %3$s-ig",
"Every %1$d Days for the entire day" : "Minden %1$d Nap az teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden%1$d Nap a teljes napra %2$s-ig",
"Every %1$d Days between %2$s - %3$s" : "Minden%1$d Nap %2$s - %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden%1$d Napon %2$s - %3$s között %4$s-ig",
"Could not generate event recurrence statement" : "Nem sikerült megújuló eseményt létrehozni",
"Every Week on %1$s for the entire day" : "Minden hét %1$s napon a teljes napja",
"Every Week on %1$s for the entire day until %2$s" : "Minden Héten %1$s a teljes napra %2$s-ig",
"Every Week on %1$s between %2$s - %3$s" : "Minden Hét %1$s napján %2$s - %3$sközött",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden Hét %1$s napján %2$s - %3$s között %4$s-ig",
"Every %1$d Weeks on %2$s for the entire day" : "Minden%1$d héten %2$s napon a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden%1$d Héten %2$s napján a teljes napon %3$s-ig",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden%1$d hét %2$s napján %3$s - %4$sközött",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden%1$d héten %2$s napján %3$s - %4$s között eddig %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s napján a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s napján a teljes napon %2$s-ig",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s napján %2$sés %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s napján %2$sés %3$s között %4$s-ig",
"Every %1$d Months on the %2$s for the entire day" : "Minden%1$d Hónap %2$s napján a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden%1$d Hónap %2$s napján a teljes napon %3$s-ig",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden%1$d Hónap %2$s napján %3$s és %4$s között %5$s-ig",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónap %2$s napján a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjában %2$s napján a teljes napon %3$s-ig",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$sközött.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjában %2$s napján %3$s - %4$s között eddig %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden%1$d év %2$s hónapján %3$s napján a teljes napra",
"On specific dates for the entire day until %1$s" : "Egy megadott időpontban a teljes napon %1$s-ig ",
"On specific dates between %1$s - %2$s until %3$s" : "Egy megadott időpontban %1$s és %2$s %3$s-ig",
"Could not generate when statement" : "Nem sikerült előállítani az időfeltételt",
"Every Day for the entire day" : "Minden nap a teljes napra",
"Every Day for the entire day until %1$s" : "Minden nap a teljes napon eddig: %1$s",
"Every Day between %1$s - %2$s" : "Minden nap %1$s és %2$sközött",
"Every Day between %1$s - %2$s until %3$s" : "Minden nap %1$s és %2$s között eddig: %3$s",
"Every %1$d Days for the entire day" : "Minden %1$d. napon, a teljes napra",
"Every %1$d Days for the entire day until %2$s" : "Minden %1$d. napon, a teljes napra eddig: %2$s",
"Every %1$d Days between %2$s - %3$s" : "Minden %1$d. napon %2$s és %3$s között",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Minden %1$d. napon %2$s és %3$s között eddig: %4$s",
"Could not generate event recurrence statement" : "Nem sikerült eseményismétlési utasítást előállítani",
"Every Week on %1$s for the entire day" : "Minden héten %1$s, a teljes napra",
"Every Week on %1$s for the entire day until %2$s" : "Minden héten %1$s, a teljes napra eddig: %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Minden héten %1$s, %2$s és %3$s között",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Minden héten %1$s, %2$s és %3$s között eddig: %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Minden %1$d. héten %2$s, a teljes napra",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Minden %1$d. héten %2$s, a teljes napon eddig: %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. héten %2$s, %3$s és %4$s között eddig: %5$s",
"Every Month on the %1$s for the entire day" : "Minden hónap %1$s. napján, a teljes napon",
"Every Month on the %1$s for the entire day until %2$s" : "Minden hónap %1$s. napján, a teljes napon eddig: %2$s",
"Every Month on the %1$s between %2$s - %3$s" : "Minden hónap %1$s. napján %2$s és %3$s között",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Minden hónap %1$s. napján %2$s és %3$s között eddig: %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Minden %1$d. hónap %2$s. napján, a teljes napon",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Minden %1$d. hónap %2$s. napján, a teljes napon eddig: %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Minden %1$d. hónap %2$s. napján %3$s és %4$s között eddig: %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Minden év %1$s hónapja %2$s. napján, a teljes napra",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Minden év %1$s hónapjának %2$s. napján, a teljes napon eddig: %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között.",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Minden év %1$s hónapjának %2$s. napján %3$s %4$s között eddig: %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Minden %1$d. év %2$s hónapjának %3$s. napján, a teljes napra",
"On specific dates for the entire day until %1$s" : "Adott dátumokon, a teljes napra eddig: %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Megadott dátumokon %1$s és %2$s között, eddig: %3$s",
"Could not generate next recurrence statement" : "Nem sikerült a következő megújuló eseményt létrehozni",
"Cancelled: %1$s" : "Lemondva: %1$s",
"\"%1$s\" has been canceled" : "A következőt le lett mondva: „%1$s”",
@@ -133,24 +133,24 @@
"Friday" : "Péntek",
"Saturday" : "Szombat",
"Sunday" : "Vasárnap",
"January" : "Január",
"February" : "Február",
"March" : "Március",
"April" : "Április",
"May" : "Május",
"June" : "Június",
"July" : "Július",
"August" : "Augusztus",
"September" : "Szeptember",
"January" : "január",
"February" : "február",
"March" : "március",
"April" : "április",
"May" : "május",
"June" : "június",
"July" : "július",
"August" : "augusztus",
"September" : "szeptember",
"October" : "Október",
"November" : "November",
"December" : "December",
"November" : "november",
"December" : "december",
"First" : "Első",
"Second" : "Másodperc",
"Second" : "Második",
"Third" : "Harmadik",
"Fourth" : "Negyedik",
"Last" : "Utolsó",
"Second Last" : "Második Utolsó",
"Second Last" : "Utolsó előtti",
"Third Last" : "Harmadik Utolsó",
"Fourth Last" : "Negyedik Utolsó",
"Contacts" : "Névjegyek",
@@ -181,7 +181,7 @@
"Accounts" : "Fiókok",
"System address book which holds all accounts" : "A rendszer címjegyzéke, amely az összes fiókot tartalmazza",
"File is not updatable: %1$s" : "A fájl nem frissíthető: %1$s",
"Failed to get storage for file" : "Nem sikerlt a tárhely lekérése a fájl számára",
"Failed to get storage for file" : "Nem sikerült a tárhely lekérése a fájl számára",
"Could not write to final file, canceled by hook" : "A végleges fájl nem írható, a hurok megszakította",
"Could not write file contents" : "A fájl tartalma nem írható",
"_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"],
@@ -206,9 +206,9 @@
"Completed on %s" : "Befejezve: %s",
"Due on %s by %s" : "Esedékesség: %s, %s által",
"Due on %s" : "Esedékesség: %s",
"DAV system address book" : "DAV rendszer címjegyzék",
"No outstanding DAV system address book sync." : "Nincs kiemelkedő DAV rendszer címjegyzék szinkronizálás.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A DAV rendszer címjegyzék szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található vagy hiba történt. Kérem futtassa manuálisan a következő paranccsal: \"occ dav:sync-system-addressbook\".",
"DAV system address book" : "DAV rendszer-címjegyzék",
"No outstanding DAV system address book sync." : "Nincs függőben lévő DAV rendszercímjegyzék-szinkronizálás.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "A DAV rendszer címjegyzék-szinkronizációja még nem futott le, mert több, mint 1000 felhasználó található, vagy mert hiba történt. Futtassa kézileg a következő paranccsal: occ dav:sync-system-addressbook.",
"WebDAV endpoint" : "WebDAV végpont",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "A webkiszolgáló nincs megfelelően beállítva a fájlok szinkronizálásához, mert a WebDAV interfész hibásnak tűnik.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "A webkisolgáló megfelelően van konfigurálva a WebDAVon keresztüli fájl szinkronizáció engedélyezéséhez.",
@@ -49,7 +49,7 @@ class BlockLegacyClientPlugin extends ServerPlugin {
return;
}
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.81');
$minimumSupportedDesktopVersion = $this->config->getSystemValueString('minimum.supported.desktop.version', '3.1.83');
$maximumSupportedDesktopVersion = $this->config->getSystemValueString('maximum.supported.desktop.version', '99.99.99');
// Check if the client is a desktop client
+21
View File
@@ -79,6 +79,7 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -94,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -109,6 +111,7 @@ OC.L10N.register(
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -120,6 +123,7 @@ OC.L10N.register(
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -128,6 +132,7 @@ OC.L10N.register(
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -150,7 +155,10 @@ OC.L10N.register(
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -227,6 +235,9 @@ OC.L10N.register(
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -241,11 +252,13 @@ OC.L10N.register(
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -269,6 +282,9 @@ OC.L10N.register(
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -304,7 +320,9 @@ OC.L10N.register(
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -319,6 +337,8 @@ OC.L10N.register(
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -327,6 +347,7 @@ OC.L10N.register(
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+21
View File
@@ -77,6 +77,7 @@
"Go to the \"{dir}\" directory" : "Fara í heimamöppu",
"Current directory path" : "Fyrirliggjandi slóð að möppu",
"Share" : "Deila",
"Reload content" : "Endurlesa efni",
"Your have used your space quota and cannot upload files anymore" : "Þú hefur fullnýtt geymslukvótann þinn og getur ekki lengur sent inn skrár",
"You do not have permission to upload or create files here." : "Þú hefur ekki heimild til að senda inn eða búa til skrár hér.",
"Drag and drop files here to upload" : "Dragðu og slepptu hér skrám til að senda inn",
@@ -92,6 +93,7 @@
"Another entry with the same name already exists." : "Önnur færsla með sama heiti er þegar til staðar.",
"Invalid filename." : "Ógilt skráarheiti.",
"Rename file" : "Endurnefna skrá",
"Recently created" : "Nýlega útbúið",
"Folder" : "Mappa",
"Unknown file type" : "Óþekkt skráartegund",
"{ext} image" : "{ext} mynd",
@@ -107,6 +109,7 @@
"Last 30 days" : "Síðustu 30 daga",
"This year ({year})" : "Þetta ár ({year})",
"Last year ({year})" : "Síðasta ár ({year})",
"Custom range" : "Sérsniðið bil",
"Custom date range" : "Sérsniðið dagsetningabil",
"Search everywhere" : "Leita allsstaðar",
"Documents" : "Skjöl",
@@ -118,6 +121,7 @@
"Images" : "Myndir",
"Videos" : "Myndskeið",
"Filters" : "Síur",
"Back to filters" : "Til baka í síur",
"Appearance" : "Útlit",
"Show hidden files" : "Sýna faldar skrár",
"Show file type column" : "Sýna dálk fyrir skráategund",
@@ -126,6 +130,7 @@
"General" : "Almennt",
"Sort favorites first" : "Raða eftirlætum fremst",
"Sort folders before files" : "Raða möppum á undan skrám",
"Enable folder tree view" : "Virkja möppugreinasýn",
"Default view" : "Sjálfgefin sýn",
"All files" : "Allar skrár",
"Personal files" : "Einkaskrár",
@@ -148,7 +153,10 @@
"Show those shortcuts" : "Sýna þessa flýtilykla",
"Warnings" : "Aðvaranir",
"Warn before changing a file extension" : "Aðvara áður en skráarendingu er breytt",
"Warn before deleting a file" : "Aðvara áður en skrá er eytt",
"WebDAV URL" : "WebDAV-slóð",
"Create an app password" : "Búa til lykilorð forrits",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "Er krafist fyrir WebDAV-auðkenningu þar sem tveggja-þátta auðkenning er virkjuð fyrir þennan aðgang.",
"How to access files using WebDAV" : "Hvernig á að nálgast skrár í gegnum WebDAV",
"Total rows summary" : "Samantek á fjölda raða",
"Toggle selection for all files and folders" : "Víxla vali af/á fyrir allar skrár og möppur",
@@ -225,6 +233,9 @@
"Removing the file extension \"{old}\" may render the file unreadable." : "Sé skráaendingin \"{old}\" fjarlægð, gæti skráin orðið ólæsileg.",
"Adding the file extension \"{new}\" may render the file unreadable." : "Sé skráaendingunni \"{new}\" bætt við, gæti skráin orðið ólæsileg.",
"Do not show this dialog again." : "Ekki sýna þennan glugga aftur.",
"Rename file to hidden" : "Endurnefna skrá sem falda",
"Prefixing a filename with a dot may render the file hidden." : "Sé settur punktur framan við skráaheiti, gæti skráin orðið falin.",
"Are you sure you want to rename the file to \"{filename}\"?" : "Ertu viss um að þú viljir endurnefna skrána sem \"{filename}\"?",
"Cancel" : "Hætta við",
"Rename" : "Endurnefna",
"Select file or folder to link to" : "Veldu skrá eða möppu til að tengja í",
@@ -239,11 +250,13 @@
"Error during upload: {message}" : "Villa við innsendingu: {message}",
"Error during upload, status code {status}" : "Villa við innsendingu, stöðukóði: {status}",
"Unknown error during upload" : "Óþekkt villa við innsendingu",
"File list is reloading" : "Skráalisti er að hlaðast inn",
"Loading current folder" : "Hleð inn núverandi möppu",
"Retry" : "Reyna aftur",
"No files in here" : "Engar skrár hér",
"Upload some content or sync with your devices!" : "Sendu inn eitthvað efni eða samstilltu við tækin þín!",
"Go back" : "Fara til baka",
"Loading …" : "Hleð inn…",
"Your files" : "Skrárnar þínar",
"Open in files" : "Opna í skráaforritinu",
"File cannot be accessed" : "Skráin er ekki aðgengileg",
@@ -267,6 +280,9 @@
"Failed to convert files: {message}" : "Mistókst að umbreyta skrám: {message}",
"All files failed to be converted" : "Mistókst að umbreyta öllum skrám",
"One file could not be converted: {message}" : "Ekki var hægt að umbreyta einni skrá: {message}",
"_%n file could not be converted_::_%n files could not be converted_" : ["Ekki var hægt að umbreyta %n skrá","Ekki var hægt að umbreyta %n skrám"],
"_%n file converted_::_%n files converted_" : ["%n skrá umbreytt","%n skrám umbreytt"],
"Files converted" : "Skrám umbreytt",
"Failed to convert files" : "Mistókst að umbreyta skrám",
"Converting file …" : "Umbreyti skrá…",
"File successfully converted" : "Tókst að umbreyta skrá",
@@ -302,7 +318,9 @@
"The files are locked" : "Skrárnar eru læstar",
"The file does not exist anymore" : "Skráin er ekki lengur til",
"Moving \"{source}\" to \"{destination}\" …" : "Færi \"{source}\" í \"{destination}\" …",
"Moving {count} files to \"{destination}\" …" : "Færi {count} skrár í \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Afrita \"{source}\" í \"{destination}\" …",
"Copying {count} files to \"{destination}\" …" : "Afrita {count} skrár í \"{destination}\" …",
"Choose destination" : "Veldu áfangastað",
"Copy to {target}" : "Afrita í {target}",
"Move to {target}" : "Færa í {target}",
@@ -317,6 +335,8 @@
"Retry and close" : "Prófa aftur og loka",
"Open online" : "Opna á netinu",
"Details" : "Nánar",
"Open the details sidebar" : "Opna hliðarspjald með ítarupplýsingum",
"Unfavorite" : "Taka úr eftirlætum",
"View in folder" : "Skoða í möppu",
"Type" : "Tegund",
"Created new folder \"{name}\"" : "Bjó til nýja möppu \"{name}\"",
@@ -325,6 +345,7 @@
"Templates" : "Sniðmát",
"New template folder" : "Ný mappa fyrir sniðmát",
"In folder" : "Í möppunni",
"Pick folder to search in" : "Veldu möppu til að leita í",
"Search in all files" : "Leita í öllum skrám",
"Search in folder: {folder}" : "Leita í möppunni: {folder}",
"One of the dropped files could not be processed" : "Ekki var hægt að vinna með eina af slepptu skránum",
+1
View File
@@ -95,6 +95,7 @@ OC.L10N.register(
"Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
"Invalid filename." : "Nieprawidłowa nazwa pliku.",
"Rename file" : "Zmień nazwę pliku",
"Recently created" : "Ostatnio utworzone",
"Folder" : "Katalog",
"Unknown file type" : "Nieznany typ pliku",
"{ext} image" : "{ext} zdjęcie",
+1
View File
@@ -93,6 +93,7 @@
"Another entry with the same name already exists." : "Inny wpis o tej samej nazwie już istnieje.",
"Invalid filename." : "Nieprawidłowa nazwa pliku.",
"Rename file" : "Zmień nazwę pliku",
"Recently created" : "Ostatnio utworzone",
"Folder" : "Katalog",
"Unknown file type" : "Nieznany typ pliku",
"{ext} image" : "{ext} zdjęcie",
+7 -2
View File
@@ -8,6 +8,7 @@
namespace OCA\Files\BackgroundJob;
use OC\Files\SetupManager;
use OC\Files\Utils\Scanner;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
@@ -15,6 +16,7 @@ use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
/**
@@ -33,6 +35,8 @@ class ScanFiles extends TimedJob {
private LoggerInterface $logger,
private IDBConnection $connection,
ITimeFactory $time,
private readonly SetupManager $setupManager,
private readonly IUserManager $userManager,
) {
parent::__construct($time);
// Run once per 10 minutes
@@ -42,10 +46,11 @@ class ScanFiles extends TimedJob {
protected function runScanner(string $user): void {
try {
$scanner = new Scanner(
$user,
$this->userManager->get($user),
null,
$this->dispatcher,
$this->logger
$this->logger,
$this->setupManager,
);
$scanner->backgroundScan('');
} catch (\Exception $e) {
+6 -3
View File
@@ -11,6 +11,7 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
use OC\Files\SetupManager;
use OC\Files\Storage\Wrapper\Jail;
use OC\Files\Utils\Scanner;
use OC\FilesMetadata\FilesMetadataManager;
@@ -49,6 +50,7 @@ class Scan extends Base {
private FilesMetadataManager $filesMetadataManager,
private IEventDispatcher $eventDispatcher,
private LoggerInterface $logger,
private SetupManager $setupManager,
) {
parent::__construct();
}
@@ -111,10 +113,11 @@ class Scan extends Base {
): void {
$connection = $this->reconnectToDatabase($output);
$scanner = new Scanner(
$user,
$this->userManager->get($user),
new ConnectionAdapter($connection),
Server::get(IEventDispatcher::class),
Server::get(LoggerInterface::class)
$this->eventDispatcher,
$this->logger,
$this->setupManager,
);
# check on each file/folder if there was a user interrupt (ctrl-c) and throw an exception
+2
View File
@@ -10,6 +10,7 @@ use OC\Core\Command\Base;
use OC\Core\Command\InterruptedException;
use OC\DB\Connection;
use OC\DB\ConnectionAdapter;
use OC\Files\SetupManager;
use OC\Files\Utils\Scanner;
use OC\ForbiddenException;
use OC\Preview\Storage\StorageFactory;
@@ -60,6 +61,7 @@ class ScanAppData extends Base {
new ConnectionAdapter($connection),
Server::get(IEventDispatcher::class),
Server::get(LoggerInterface::class),
Server::get(SetupManager::class),
);
}
+1 -1
View File
@@ -12,8 +12,8 @@ import { emit } from '@nextcloud/event-bus'
import { n, t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { fetchNode } from '../services/WebdavClient.ts'
import { logger } from '../utils/logger.ts'
type ConversionResponse = {
path: string
+1 -1
View File
@@ -10,7 +10,7 @@ import * as capabilities from '@nextcloud/capabilities'
import * as eventBus from '@nextcloud/event-bus'
import { File, Folder, Permission } from '@nextcloud/files'
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './deleteAction.ts'
import { shouldAskForConfirmation } from './deleteUtils.ts'
+1 -1
View File
@@ -12,7 +12,7 @@ import { Permission } from '@nextcloud/files'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { askConfirmation, canDisconnectOnly, canUnshareOnly, deleteNode, displayName, shouldAskForConfirmation } from './deleteUtils.ts'
// TODO: once the files app is migrated to the new frontend use the import instead:
+1 -1
View File
@@ -11,10 +11,10 @@ import { showError } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { DefaultType, FileType } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
export const action: IFileAction = {
@@ -9,7 +9,7 @@ import axios from '@nextcloud/axios'
import * as eventBus from '@nextcloud/event-bus'
import { File, Permission } from '@nextcloud/files'
import { beforeAll, beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './favoriteAction.ts'
import * as favoriteAction from './favoriteAction.ts'
+1 -1
View File
@@ -16,7 +16,7 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import PQueue from 'p-queue'
import Vue from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
const queue = new PQueue({ concurrency: 5 })
+1 -1
View File
@@ -19,8 +19,8 @@ import { t } from '@nextcloud/l10n'
import { getConflicts } from '@nextcloud/upload'
import { basename, join } from 'path'
import Vue from 'vue'
import logger from '../logger.ts'
import { getContents } from '../services/Files.ts'
import { logger } from '../utils/logger.ts'
import { canCopy, canMove, getQueue, MoveCopyAction } from './moveOrCopyActionUtils.ts'
/**
+1 -1
View File
@@ -14,7 +14,7 @@ import { translate as t } from '@nextcloud/l10n'
import { encodePath } from '@nextcloud/paths'
import { generateOcsUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { isSyncable } from '../utils/permissions.ts'
export const action: IFileAction = {
+1 -1
View File
@@ -7,7 +7,7 @@ import type { IView } from '@nextcloud/files'
import { File, Folder, Permission } from '@nextcloud/files'
import { beforeEach, describe, expect, test, vi } from 'vitest'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { action } from './sidebarAction.ts'
const sidebar = vi.hoisted(() => ({
+1 -1
View File
@@ -9,7 +9,7 @@ import InformationSvg from '@mdi/svg/svg/information-outline.svg?raw'
import { getSidebar, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { isPublicShare } from '@nextcloud/sharing/public'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export const ACTION_DETAILS = 'details'
+1 -1
View File
@@ -76,7 +76,6 @@ import NcBreadcrumbs from '@nextcloud/vue/components/NcBreadcrumbs'
import NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useViews } from '../composables/useViews.ts'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles, onDropInternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { useDragAndDropStore } from '../store/dragging.ts'
@@ -84,6 +83,7 @@ import { useFilesStore } from '../store/files.ts'
import { usePathsStore } from '../store/paths.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUploaderStore } from '../store/uploader.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'BreadCrumbs',
@@ -37,9 +37,9 @@ import { UploadStatus } from '@nextcloud/upload'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import TrayArrowDownIcon from 'vue-material-design-icons/TrayArrowDown.vue'
import logger from '../logger.ts'
import { dataTransferToFileTree, onDropExternalFiles } from '../services/DropService.ts'
import { useActiveStore } from '../store/active.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'DragAndDropNotice',
@@ -136,10 +136,10 @@ import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import CustomElementRender from '../CustomElementRender.vue'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import actionsMixins from '../../mixins/actionsMixin.ts'
import { useActiveStore } from '../../store/active.ts'
import { executeAction } from '../../utils/actionUtils.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryActions',
@@ -27,10 +27,10 @@ import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { defineComponent } from 'vue'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useKeyboardStore } from '../../store/keyboard.ts'
import { useSelectionStore } from '../../store/selection.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryCheckbox',
@@ -49,11 +49,11 @@ import { basename } from '@nextcloud/paths'
import { defineComponent, inject } from 'vue'
import NcTextField from '@nextcloud/vue/components/NcTextField'
import { useFileListWidth } from '../../composables/useFileListWidth.ts'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useRenamingStore } from '../../store/renaming.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { getFilenameValidity } from '../../utils/filenameValidity.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryName',
@@ -78,9 +78,9 @@ import CollectivesIcon from './CollectivesIcon.vue'
import FavoriteIcon from './FavoriteIcon.vue'
import RecentlyCreatedIcon from './RecentlyCreatedIcon.vue'
import { usePreviewImage } from '../../composables/usePreviewImage.ts'
import logger from '../../logger.ts'
import { isLivePhoto } from '../../services/LivePhotos.ts'
import { useUserConfigStore } from '../../store/userconfig.ts'
import { logger } from '../../utils/logger.ts'
export default defineComponent({
name: 'FileEntryPreview',
+12 -7
View File
@@ -14,13 +14,13 @@ import { generateUrl } from '@nextcloud/router'
import { isPublicShare } from '@nextcloud/sharing/public'
import { getConflicts, getUploader } from '@nextcloud/upload'
import { vOnClickOutside } from '@vueuse/components'
import { extname } from 'path'
import { extname, relative } from 'path'
import Vue, { computed, defineComponent } from 'vue'
import { action as sidebarAction } from '../actions/sidebarAction.ts'
import logger from '../logger.ts'
import { onDropInternalFiles } from '../services/DropService.ts'
import { getDragAndDropPreview } from '../utils/dragUtils.ts'
import { hashCode } from '../utils/hashUtils.ts'
import { logger } from '../utils/logger.ts'
import { isDownloadable } from '../utils/permissions.ts'
Vue.directive('onClickOutside', vOnClickOutside)
@@ -488,12 +488,17 @@ export default defineComponent({
const items = Array.from(event.dataTransfer?.items || [])
if (selection.length === 0 && items.some((item) => item.kind === 'file')) {
const files = items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[]
const uploader = getUploader()
const root = uploader.destination.path
const relativePath = relative(root, this.source.path)
logger.debug('Start uploading dropped files', { target: this.source.path, root, relativePath, files: files.map((file) => file.name) })
await uploader.batchUpload(
this.source.path,
items.filter((item) => item.kind === 'file')
.map((item) => 'webkitGetAsEntry' in item ? item.webkitGetAsEntry() : item.getAsFile())
.filter(Boolean) as (FileSystemEntry | File)[],
relativePath,
files,
async (nodes, path) => {
try {
const { contents, folder } = await this.activeView!.getContents(path)
@@ -536,7 +541,7 @@ export default defineComponent({
const isCopy = event.ctrlKey
this.dragover = false
logger.debug('Dropped', { event, folder: this.source, selection, fileTree })
logger.debug('Dropped', { event, folder: this.source, selection })
const nodes = selection.map((source) => this.filesStore.getNode(source)) as Node[]
await onDropInternalFiles(nodes, this.source, contents, isCopy)
@@ -13,7 +13,7 @@ import type { Folder, IFileListHeader, View } from '@nextcloud/files'
import type { PropType } from 'vue'
import PQueue from 'p-queue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
/**
* This component is used to render custom
@@ -84,11 +84,11 @@ import { FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID } from './FilesListTableHeaderActi
import FilesListTableHeaderButton from './FilesListTableHeaderButton.vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import filesSortingMixin from '../mixins/filesSorting.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID = 'files-list-header-select-all-checkbox'
@@ -88,12 +88,12 @@ import ArrowLeftIcon from 'vue-material-design-icons/ArrowLeft.vue'
import { FILES_LIST_HEADER_SELECT_ALL_CHECKBOX_ID } from './FilesListTableHeader.vue'
import { useFileActions } from '../composables/useFileActions.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import logger from '../logger.ts'
import actionsMixins from '../mixins/actionsMixin.ts'
import { useActionsMenuStore } from '../store/actionsmenu.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
import { useSelectionStore } from '../store/selection.ts'
import { logger } from '../utils/logger.ts'
export const FILE_LIST_HEAD_FIRST_BATCH_ACTION_ID = 'files-list-head-first-batch-action'
@@ -91,10 +91,10 @@ import { useEnabledFileActions } from '../composables/useFileActions.ts'
import { useFileListHeaders } from '../composables/useFileListHeaders.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import { useActiveStore } from '../store/active.ts'
import { useSelectionStore } from '../store/selection.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'FilesListVirtual',
@@ -10,9 +10,9 @@ import { NcIconSvgWrapper, NcLoadingIcon } from '@nextcloud/vue'
import { ref, toRef, watch } from 'vue'
import NcAppSidebarTab from '@nextcloud/vue/components/NcAppSidebarTab'
import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import logger from '../../logger.ts'
import { useActiveStore } from '../../store/active.ts'
import { useSidebarStore } from '../../store/sidebar.ts'
import { logger } from '../../utils/logger.ts'
const props = defineProps<{
/**
@@ -37,7 +37,7 @@ import { debounce, throttle } from 'throttle-debounce'
import NcAppNavigationItem from '@nextcloud/vue/components/NcAppNavigationItem'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import ChartPie from 'vue-material-design-icons/ChartPieOutline.vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export default {
name: 'NavigationQuota',
@@ -17,8 +17,8 @@ import NcInputField from '@nextcloud/vue/components/NcInputField'
import NcLoadingIcon from '@nextcloud/vue/components/NcLoadingIcon'
import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
import NcProgressBar from '@nextcloud/vue/components/NcProgressBar'
import logger from '../../logger.ts'
import { SanitizeFilenameStatus } from '../../models/SanitizeFilenameStatus.ts'
import { logger } from '../../utils/logger.ts'
type ApiStatus = { total: number, processed: number, errors?: Record<string, string[]>, status: SanitizeFilenameStatus }
@@ -52,7 +52,7 @@ import debounce from 'debounce'
import Vue from 'vue'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcSelect from '@nextcloud/vue/components/NcSelect'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
const picker = getFilePickerBuilder(t('files', 'Choose a file or folder to transfer'))
.setMultiSelect(false)
+1 -1
View File
@@ -77,7 +77,7 @@ import type { PropType } from 'vue'
import debounce from 'debounce'
import { defineComponent } from 'vue'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
interface RecycledPoolItem {
key: string
+1 -1
View File
@@ -7,9 +7,9 @@ import { getFileActions } from '@nextcloud/files'
import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { dirname } from 'path'
import { useRoute, useRouter } from 'vue-router/composables'
import logger from '../logger.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { executeAction } from '../utils/actionUtils.ts'
import { logger } from '../utils/logger.ts'
import { useRouteParameters } from './useRouteParameters.ts'
/**
+1 -1
View File
@@ -11,7 +11,7 @@ import { t } from '@nextcloud/l10n'
import wrap from '@vue/web-component-wrapper'
import Vue from 'vue'
import FileListFilterType from '../components/FileListFilter/FileListFilterType.vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export interface ITypePreset {
id: string
+1 -1
View File
@@ -13,7 +13,7 @@ import { emit } from '@nextcloud/event-bus'
import { Folder, Permission } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import { basename } from 'path'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
export const entry: NewMenuEntry = {
+1 -1
View File
@@ -14,7 +14,7 @@ import { loadState } from '@nextcloud/initial-state'
import { translate as t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import { join } from 'path'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { newNodeName } from '../utils/newNodeDialog.ts'
const templatesEnabled = loadState<boolean>('files', 'templates_enabled', true)
@@ -9,7 +9,7 @@ import { getFilePickerBuilder } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
import { translate as t } from '@nextcloud/l10n'
import { imagePath } from '@nextcloud/router'
import logger from '../../logger.ts'
import { logger } from '../../utils/logger.ts'
/**
* Initialize the unified search plugin.
+1 -1
View File
@@ -12,11 +12,11 @@ import { relative } from 'path'
import queryString from 'query-string'
import Vue from 'vue'
import Router, { isNavigationFailure, NavigationFailureType } from 'vue-router'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { usePathsStore } from '../store/paths.ts'
import { defaultView } from '../utils/filesViews.ts'
import { logger } from '../utils/logger.ts'
Vue.use(Router)
+2 -2
View File
@@ -13,7 +13,7 @@ import { join } from '@nextcloud/paths'
import { getUploader, hasConflict } from '@nextcloud/upload'
import { handleCopyMoveNodesTo, HintException } from '../actions/moveOrCopyAction.ts'
import { MoveCopyAction } from '../actions/moveOrCopyActionUtils.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { createDirectoryIfNotExists, Directory, resolveConflict, traverseTree } from './DropServiceUtils.ts'
/**
@@ -123,7 +123,7 @@ export async function onDropExternalFiles(root: RootDirectory, destination: IFol
// then browse its tree and upload its contents.
if (file instanceof Directory) {
try {
logger.debug('Processing directory', { relativePath })
logger.debug('Processing directory', { relativePath, destination })
await createDirectoryIfNotExists(relativePath, destination)
await uploadDirectoryContents(file, relativePath)
} catch (error) {
@@ -6,7 +6,7 @@
import { join } from 'node:path'
import { beforeAll, describe, expect, it, vi } from 'vitest'
import { DataTransferItem as DataTransferItemMock, FileSystemDirectoryEntry, fileSystemEntryToDataTransferItem, FileSystemFileEntry } from '../../../../__tests__/FileSystemAPIUtils.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { dataTransferToFileTree } from './DropService.ts'
import { Directory, traverseTree } from './DropServiceUtils.ts'
+1 -1
View File
@@ -12,7 +12,7 @@ import { defaultRemoteURL, defaultRootPath, getClient, getDefaultPropfind, resul
import { t } from '@nextcloud/l10n'
import { join } from '@nextcloud/paths'
import { openConflictPicker } from '@nextcloud/upload'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
/**
* This represents a Directory in the file tree
+1 -1
View File
@@ -8,7 +8,7 @@ import type { ContentsWithRoot } from '@nextcloud/files'
import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { getFavoriteNodes, getRemoteURL, getRootPath } from '@nextcloud/files/dav'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { getContents as filesContents } from './Files.ts'
import { client } from './WebdavClient.ts'
+1 -1
View File
@@ -7,10 +7,10 @@ import type { FileStat, ResponseDataDetailed } from 'webdav'
import { getDefaultPropfind, getRootPath, resultToNode } from '@nextcloud/files/dav'
import { join } from 'path'
import logger from '../logger.ts'
import { useFilesStore } from '../store/files.ts'
import { getPinia } from '../store/index.ts'
import { useSearchStore } from '../store/search.ts'
import { logger } from '../utils/logger.ts'
import { client } from './WebdavClient.ts'
import { searchNodes } from './WebDavSearch.ts'
+1 -1
View File
@@ -9,9 +9,9 @@ import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { getRecentSearch, getRemoteURL, getRootPath, resultToNode } from '@nextcloud/files/dav'
import { loadState } from '@nextcloud/initial-state'
import logger from '../logger.ts'
import { getPinia } from '../store/index.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { logger } from '../utils/logger.ts'
import { client } from './WebdavClient.ts'
const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 14))
+1 -1
View File
@@ -8,9 +8,9 @@ import type { ContentsWithRoot } from '@nextcloud/files'
import { getCurrentUser } from '@nextcloud/auth'
import { Folder, Permission } from '@nextcloud/files'
import { defaultRemoteURL, getRootPath } from '@nextcloud/files/dav'
import logger from '../logger.ts'
import { getPinia } from '../store/index.ts'
import { useSearchStore } from '../store/search.ts'
import { logger } from '../utils/logger.ts'
import { searchNodes } from './WebDavSearch.ts'
/**
+1 -1
View File
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { generateUrl, getRootUrl } from '@nextcloud/router'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export default () => {
if ('serviceWorker' in navigator) {
+1 -1
View File
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
export default class Settings {
_settings
+1 -1
View File
@@ -9,7 +9,7 @@ import type { ResponseDataDetailed, SearchResult } from 'webdav'
import { getCurrentUser } from '@nextcloud/auth'
import { defaultRootPath, getDavNameSpaces, getDavProperties, resultToNode } from '@nextcloud/files/dav'
import { getBaseUrl } from '@nextcloud/router'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { client } from './WebdavClient.ts'
export interface SearchNodesOptions {
+1 -1
View File
@@ -11,7 +11,7 @@ import { Folder, getNavigation, Permission } from '@nextcloud/files'
import { getRemoteURL, getRootPath } from '@nextcloud/files/dav'
import { defineStore } from 'pinia'
import { ref, shallowRef, watch } from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
// Temporary fake folder to use until we have the first valid folder
// fetched and cached. This allow us to mount the FilesListVirtual
+1 -1
View File
@@ -9,8 +9,8 @@ import type { FileSource, FilesStore, RootOptions, RootsStore, Service } from '.
import { subscribe } from '@nextcloud/event-bus'
import { defineStore } from 'pinia'
import Vue, { ref } from 'vue'
import logger from '../logger.ts'
import { fetchNode } from '../services/WebdavClient.ts'
import { logger } from '../utils/logger.ts'
import { usePathsStore } from './paths.ts'
/**
+1 -1
View File
@@ -9,7 +9,7 @@ import { emit, subscribe } from '@nextcloud/event-bus'
import { getFileListFilters, getFilesRegistry } from '@nextcloud/files'
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
/**
* Check if the given value is an instance file list filter with mount function
+1 -1
View File
@@ -11,7 +11,7 @@ import { File, FileType, getNavigation } from '@nextcloud/files'
import { dirname } from '@nextcloud/paths'
import { defineStore } from 'pinia'
import Vue from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { useFilesStore } from './files.ts'
/**
+1 -1
View File
@@ -13,8 +13,8 @@ import { basename, dirname, extname } from '@nextcloud/paths'
import { spawnDialog } from '@nextcloud/vue/functions/dialog'
import { defineStore } from 'pinia'
import Vue, { defineAsyncComponent, ref } from 'vue'
import logger from '../logger.ts'
import { fetchNode } from '../services/WebdavClient.ts'
import { logger } from '../utils/logger.ts'
import { useUserConfigStore } from './userconfig.ts'
export const useRenamingStore = defineStore('renaming', () => {
+1 -1
View File
@@ -11,7 +11,7 @@ import { emit, subscribe } from '@nextcloud/event-bus'
import debounce from 'debounce'
import { defineStore } from 'pinia'
import { ref, watch } from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { VIEW_ID } from '../views/search.ts'
export const useSearchStore = defineStore('search', () => {
+1 -1
View File
@@ -9,7 +9,7 @@ import { subscribe } from '@nextcloud/event-bus'
import { getSidebarActions, getSidebarTabs } from '@nextcloud/files'
import { defineStore } from 'pinia'
import { computed, readonly, ref, watch } from 'vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
import { useActiveStore } from './active.ts'
import { useFilesStore } from './files.ts'
+1 -1
View File
@@ -8,8 +8,8 @@ import { showError, showSuccess } from '@nextcloud/dialogs'
import { NodeStatus } from '@nextcloud/files'
import { t } from '@nextcloud/l10n'
import Vue from 'vue'
import logger from '../logger.ts'
import { useActiveStore } from '../store/active.ts'
import { logger } from '../utils/logger.ts'
/**
* Execute an action on the current active node
@@ -1,10 +1,11 @@
/**
/*!
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getLoggerBuilder } from '@nextcloud/logger'
export default getLoggerBuilder()
export const logger = getLoggerBuilder()
.setApp('files')
.detectUser()
.build()
@@ -15,7 +15,7 @@ import { FilePickerBuilder } from '@nextcloud/dialogs'
import { t } from '@nextcloud/l10n'
import { onMounted } from 'vue'
import { generateFileUrl } from '../../../files_sharing/src/utils/generateUrl.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
defineProps<{
providerId: string
+1 -1
View File
@@ -190,7 +190,6 @@ import FilesListVirtual from '../components/FilesListVirtual.vue'
import { useEnabledFileListActions } from '../composables/useFileListActions.ts'
import { useFileListWidth } from '../composables/useFileListWidth.ts'
import { useRouteParameters } from '../composables/useRouteParameters.ts'
import logger from '../logger.ts'
import filesSortingMixin from '../mixins/filesSorting.ts'
import { useActiveStore } from '../store/active.ts'
import { useFilesStore } from '../store/files.ts'
@@ -204,6 +203,7 @@ import { useViewConfigStore } from '../store/viewConfig.ts'
import { humanizeWebDAVError } from '../utils/davUtils.ts'
import { defaultView } from '../utils/filesViews.ts'
import { getSummaryFor } from '../utils/fileUtils.ts'
import { logger } from '../utils/logger.ts'
export default defineComponent({
name: 'FilesList',
+1 -1
View File
@@ -52,9 +52,9 @@ import FilesNavigationSearch from '../components/FilesNavigationSearch.vue'
import NavigationQuota from '../components/NavigationQuota.vue'
import FilesAppSettings from './FilesAppSettings.vue'
import { useViews } from '../composables/useViews.ts'
import logger from '../logger.ts'
import { useActiveStore } from '../store/active.ts'
import { useSidebarStore } from '../store/sidebar.ts'
import { logger } from '../utils/logger.ts'
const sidebar = useSidebarStore()
const activeStore = useActiveStore()
+1 -1
View File
@@ -68,7 +68,7 @@ import { defineComponent } from 'vue'
import FileIcon from 'vue-material-design-icons/File.vue'
import FolderIcon from 'vue-material-design-icons/Folder.vue'
import { generateFileUrl } from '../../../files_sharing/src/utils/generateUrl.ts'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
// see lib/private/Collaboration/Reference/File/FileReferenceProvider.php
type Ressource = {
+1 -1
View File
@@ -13,7 +13,7 @@ import { ref } from 'vue'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
import SettingsSanitizeFilenames from '../components/Settings/SettingsSanitizeFilenames.vue'
import logger from '../logger.ts'
import { logger } from '../utils/logger.ts'
const {
docUrl,
+1 -1
View File
@@ -70,8 +70,8 @@ import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent'
import NcModal from '@nextcloud/vue/components/NcModal'
import TemplateFiller from '../components/TemplateFiller.vue'
import TemplatePreview from '../components/TemplatePreview.vue'
import logger from '../logger.ts'
import { createFromTemplate, getTemplateFields, getTemplates } from '../services/Templates.js'
import { logger } from '../utils/logger.ts'
const border = 2
const margin = 8
+1 -1
View File
@@ -10,9 +10,9 @@ import StarSvg from '@mdi/svg/svg/star-outline.svg?raw'
import { subscribe } from '@nextcloud/event-bus'
import { FileType, getNavigation, View } from '@nextcloud/files'
import { getCanonicalLocale, getLanguage, t } from '@nextcloud/l10n'
import logger from '../logger.ts'
import { getContents } from '../services/Favorites.ts'
import { hashCode } from '../utils/hashUtils.ts'
import { logger } from '../utils/logger.ts'
/**
* Generate a favorite folder view
@@ -9,6 +9,7 @@ declare(strict_types=1);
namespace OCA\Files\Tests\BackgroundJob;
use OC\Files\Mount\MountPoint;
use OC\Files\SetupManager;
use OC\Files\Storage\Temporary;
use OCA\Files\BackgroundJob\ScanFiles;
use OCP\AppFramework\Utility\ITimeFactory;
@@ -17,6 +18,7 @@ use OCP\Files\Config\IUserMountCache;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Server;
use Psr\Log\LoggerInterface;
use Test\TestCase;
@@ -51,7 +53,9 @@ class ScanFilesTest extends TestCase {
$dispatcher,
$logger,
$connection,
$this->createMock(ITimeFactory::class)
$this->createMock(ITimeFactory::class),
$this->createMock(SetupManager::class),
$this->createMock(IUserManager::class),
])
->onlyMethods(['runScanner'])
->getMock();
+4
View File
@@ -15,6 +15,9 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "Neispunjeni parametri mehanizma autentifikacije",
"Insufficient data: %s" : "Nedovoljno podataka: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Pohranu s ID-om „%d” ne mogu uređivati korisnici koji nisu administratori",
"Static credentials" : "Statičke vjerodajnice",
"Access key ID" : "ID pristupnog ključa",
"Secret access key" : "Tajni pristupni ključ",
"Builtin" : "Ugrađen",
"None" : "Nema",
"OpenStack v2" : "OpenStack v2",
@@ -48,6 +51,7 @@ OC.L10N.register(
"Storage Class" : "Razred pohrane",
"Enable SSL" : "Omogući SSL",
"Enable Path Style" : "Omogući Path Style",
"Use Legacy S3 signing (v2)" : "Koristi starije S3 potpisivanje (v2)",
"Enable multipart copy" : "Omogući višedijelno kopiranje",
"Use presigned S3 url" : "Koristi unaprijed potpisani S3 URL",
"SSE-C encryption key" : "SSE-C enkripcijski ključ",
+4
View File
@@ -13,6 +13,9 @@
"Unsatisfied authentication mechanism parameters" : "Neispunjeni parametri mehanizma autentifikacije",
"Insufficient data: %s" : "Nedovoljno podataka: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Pohranu s ID-om „%d” ne mogu uređivati korisnici koji nisu administratori",
"Static credentials" : "Statičke vjerodajnice",
"Access key ID" : "ID pristupnog ključa",
"Secret access key" : "Tajni pristupni ključ",
"Builtin" : "Ugrađen",
"None" : "Nema",
"OpenStack v2" : "OpenStack v2",
@@ -46,6 +49,7 @@
"Storage Class" : "Razred pohrane",
"Enable SSL" : "Omogući SSL",
"Enable Path Style" : "Omogući Path Style",
"Use Legacy S3 signing (v2)" : "Koristi starije S3 potpisivanje (v2)",
"Enable multipart copy" : "Omogući višedijelno kopiranje",
"Use presigned S3 url" : "Koristi unaprijed potpisani S3 URL",
"SSE-C encryption key" : "SSE-C enkripcijski ključ",
+4
View File
@@ -15,6 +15,9 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です",
"Insufficient data: %s" : "データが不足しています: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "ストレージID \"%d\" は、管理者ではないユーザーによる編集はできません。",
"Static credentials" : "静的認証情報",
"Access key ID" : "アクセスキーID",
"Secret access key" : "シークレットアクセスキー",
"Builtin" : "ビルトイン",
"None" : "なし",
"OpenStack v2" : "OpenStack v2",
@@ -48,6 +51,7 @@ OC.L10N.register(
"Storage Class" : "ストレージクラス",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
"Use Legacy S3 signing (v2)" : "レガシー S3 署名 (v2) を使用する",
"Enable multipart copy" : "マルチパートコピーの有効化",
"Use presigned S3 url" : "事前署名付き S3 URL を使用する",
"SSE-C encryption key" : "SSE-C暗号化キー",
+4
View File
@@ -13,6 +13,9 @@
"Unsatisfied authentication mechanism parameters" : "認証のためのパラメータが不十分です",
"Insufficient data: %s" : "データが不足しています: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "ストレージID \"%d\" は、管理者ではないユーザーによる編集はできません。",
"Static credentials" : "静的認証情報",
"Access key ID" : "アクセスキーID",
"Secret access key" : "シークレットアクセスキー",
"Builtin" : "ビルトイン",
"None" : "なし",
"OpenStack v2" : "OpenStack v2",
@@ -46,6 +49,7 @@
"Storage Class" : "ストレージクラス",
"Enable SSL" : "SSLを有効",
"Enable Path Style" : "パス形式を有効",
"Use Legacy S3 signing (v2)" : "レガシー S3 署名 (v2) を使用する",
"Enable multipart copy" : "マルチパートコピーの有効化",
"Use presigned S3 url" : "事前署名付き S3 URL を使用する",
"SSE-C encryption key" : "SSE-C暗号化キー",
+4
View File
@@ -15,6 +15,9 @@ OC.L10N.register(
"Unsatisfied authentication mechanism parameters" : "Niepoprawne parametry mechanizmu uwierzytelnienia",
"Insufficient data: %s" : "Niewystarczające dane: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Magazyn o identyfikatorze „%d” nie może być edytowany przez osoby niebędące administratorami",
"Static credentials" : "Stałe dane uwierzytelniające",
"Access key ID" : "Identyfikator klucza dostępu",
"Secret access key" : "Tajny klucz dostępu",
"Builtin" : "Wbudowane",
"None" : "Nic",
"OpenStack v2" : "OpenStack v2",
@@ -48,6 +51,7 @@ OC.L10N.register(
"Storage Class" : "Klasa przechowywania",
"Enable SSL" : "Włącz SSL",
"Enable Path Style" : "Włącz styl ścieżki",
"Use Legacy S3 signing (v2)" : "Użyj starszego podpisywania S3 (v2)",
"Enable multipart copy" : "Włącz kopiowanie wieloczęściowe",
"Use presigned S3 url" : "Użyj wstępnie podpisanego adresu URL S3",
"SSE-C encryption key" : "Klucz szyfrowania SSE-C",
+4
View File
@@ -13,6 +13,9 @@
"Unsatisfied authentication mechanism parameters" : "Niepoprawne parametry mechanizmu uwierzytelnienia",
"Insufficient data: %s" : "Niewystarczające dane: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Magazyn o identyfikatorze „%d” nie może być edytowany przez osoby niebędące administratorami",
"Static credentials" : "Stałe dane uwierzytelniające",
"Access key ID" : "Identyfikator klucza dostępu",
"Secret access key" : "Tajny klucz dostępu",
"Builtin" : "Wbudowane",
"None" : "Nic",
"OpenStack v2" : "OpenStack v2",
@@ -46,6 +49,7 @@
"Storage Class" : "Klasa przechowywania",
"Enable SSL" : "Włącz SSL",
"Enable Path Style" : "Włącz styl ścieżki",
"Use Legacy S3 signing (v2)" : "Użyj starszego podpisywania S3 (v2)",
"Enable multipart copy" : "Włącz kopiowanie wieloczęściowe",
"Use presigned S3 url" : "Użyj wstępnie podpisanego adresu URL S3",
"SSE-C encryption key" : "Klucz szyfrowania SSE-C",
@@ -11,13 +11,14 @@ namespace OCA\Files_External\Lib;
use OC\Files\Storage\Wrapper\PermissionsMask;
use OCP\Constants;
use OCP\Files\Storage\IStorage;
/**
* Wrap Storage in PermissionsMask for session ephemeral use
*/
class SessionStorageWrapper extends PermissionsMask {
/**
* @param array $parameters ['storage' => $storage]
* @param array{storage: IStorage, ...} $parameters
*/
public function __construct(array $parameters) {
// disable sharing permission
+1
View File
@@ -148,6 +148,7 @@ OC.L10N.register(
"Can edit" : "Can edit",
"Custom permissions" : "Custom permissions",
"Resharing is not allowed" : "Resharing is not allowed",
"Searching …" : "ძებნა …",
"No elements found." : "No elements found.",
"Search everywhere" : "მოძებნე ყველგან",
"Guest" : "Guest",
+1
View File
@@ -146,6 +146,7 @@
"Can edit" : "Can edit",
"Custom permissions" : "Custom permissions",
"Resharing is not allowed" : "Resharing is not allowed",
"Searching …" : "ძებნა …",
"No elements found." : "No elements found.",
"Search everywhere" : "მოძებნე ყველგან",
"Guest" : "Guest",
+89 -31
View File
@@ -299,18 +299,65 @@ class Trashbin implements IEventListener {
$configuredTrashbinSize = static::getConfiguredTrashbinSize($owner);
if ($configuredTrashbinSize >= 0 && $sourceInfo->getSize() >= $configuredTrashbinSize) {
$trashStorage->releaseLock($trashInternalPath, ILockingProvider::LOCK_EXCLUSIVE, $lockingProvider);
return false;
}
try {
$moveSuccessful = true;
// there is still a possibility that the file has been deleted by a remote user
$deletedBy = self::overwriteDeletedBy($user);
$query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->insert('files_trash')
->setValue('id', $query->createNamedParameter($filename))
->setValue('timestamp', $query->createNamedParameter($timestamp))
->setValue('location', $query->createNamedParameter($location))
->setValue('user', $query->createNamedParameter($owner))
->setValue('deleted_by', $query->createNamedParameter($deletedBy));
$inserted = false;
try {
$inserted = ($query->executeStatement() === 1);
} catch (\Throwable $e) {
Server::get(LoggerInterface::class)->error(
'trash bin database insert failed',
[
'app' => 'files_trashbin',
'exception' => $e,
'user' => $owner,
'filename' => $filename,
'timestamp' => $timestamp,
]
);
}
if (!$inserted) {
Server::get(LoggerInterface::class)->error(
'trash bin database couldn\'t be updated, skipping trash move',
[
'app' => 'files_trashbin',
'user' => $owner,
'filename' => $filename,
'timestamp' => $timestamp,
]
);
$trashStorage->releaseLock($trashInternalPath, ILockingProvider::LOCK_EXCLUSIVE, $lockingProvider);
return false;
}
$moveSuccessful = true;
try {
$inCache = $sourceStorage->getCache()->inCache($sourceInternalPath);
$trashStorage->moveFromStorage($sourceStorage, $sourceInternalPath, $trashInternalPath);
if ($inCache) {
$trashStorage->getUpdater()->renameFromStorage($sourceStorage, $sourceInternalPath, $trashInternalPath);
} else {
$sizeDifference = $sourceInfo->getSize();
if ($sizeDifference < 0) {
$sizeDifference = null;
} else {
$sizeDifference = (int)$sizeDifference;
}
$trashStorage->getUpdater()->update($trashInternalPath, null, $sizeDifference);
}
} catch (CopyRecursiveException $e) {
} catch (\Exception $e) {
$moveSuccessful = false;
if ($trashStorage->file_exists($trashInternalPath)) {
$trashStorage->unlink($trashInternalPath);
@@ -331,24 +378,31 @@ class Trashbin implements IEventListener {
} else {
$trashStorage->getUpdater()->remove($trashInternalPath);
}
return false;
$moveSuccessful = false;
}
if (!$moveSuccessful) {
Server::get(LoggerInterface::class)->error(
'trash move failed, removing trash metadata and payload',
[
'app' => 'files_trashbin',
'user' => $owner,
'filename' => $filename,
'timestamp' => $timestamp,
]
);
self::deleteTrashRow($user, $filename, $timestamp);
if ($trashStorage->file_exists($trashInternalPath)) {
if ($trashStorage->is_dir($trashInternalPath)) {
$trashStorage->rmdir($trashInternalPath);
} else {
$trashStorage->unlink($trashInternalPath);
}
}
$trashStorage->getUpdater()->remove($trashInternalPath);
}
if ($moveSuccessful) {
// there is still a possibility that the file has been deleted by a remote user
$deletedBy = self::overwriteDeletedBy($user);
$query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->insert('files_trash')
->setValue('id', $query->createNamedParameter($filename))
->setValue('timestamp', $query->createNamedParameter($timestamp))
->setValue('location', $query->createNamedParameter($location))
->setValue('user', $query->createNamedParameter($owner))
->setValue('deleted_by', $query->createNamedParameter($deletedBy));
$result = $query->executeStatement();
if (!$result) {
Server::get(LoggerInterface::class)->error('trash bin database couldn\'t be updated', ['app' => 'files_trashbin']);
}
Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', ['filePath' => Filesystem::normalizePath($file_path),
'trashPath' => Filesystem::normalizePath(static::getTrashFilename($filename, $timestamp))]);
@@ -545,12 +599,7 @@ class Trashbin implements IEventListener {
self::restoreVersions($view, $file, $filename, $uniqueFilename, $location, $timestamp);
if ($timestamp) {
$query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->delete('files_trash')
->where($query->expr()->eq('user', $query->createNamedParameter($user)))
->andWhere($query->expr()->eq('id', $query->createNamedParameter($filename)))
->andWhere($query->expr()->eq('timestamp', $query->createNamedParameter($timestamp)));
$query->executeStatement();
self::deleteTrashRow($user, $filename, $timestamp);
}
return true;
@@ -689,13 +738,6 @@ class Trashbin implements IEventListener {
$size = 0;
if ($timestamp) {
$query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->delete('files_trash')
->where($query->expr()->eq('user', $query->createNamedParameter($user)))
->andWhere($query->expr()->eq('id', $query->createNamedParameter($filename)))
->andWhere($query->expr()->eq('timestamp', $query->createNamedParameter($timestamp)));
$query->executeStatement();
$file = static::getTrashFilename($filename, $timestamp);
} else {
$file = $filename;
@@ -706,6 +748,9 @@ class Trashbin implements IEventListener {
try {
$node = $userRoot->get('/files_trashbin/files/' . $file);
} catch (NotFoundException $e) {
if ($timestamp) {
self::deleteTrashRow($user, $filename, $timestamp);
}
return $size;
}
@@ -719,9 +764,22 @@ class Trashbin implements IEventListener {
$node->delete();
self::emitTrashbinPostDelete('/files_trashbin/files/' . $file);
if ($timestamp) {
self::deleteTrashRow($user, $filename, $timestamp);
}
return $size;
}
private static function deleteTrashRow(string $user, string $filename, int $timestamp): void {
$query = Server::get(IDBConnection::class)->getQueryBuilder();
$query->delete('files_trash')
->where($query->expr()->eq('user', $query->createNamedParameter($user)))
->andWhere($query->expr()->eq('id', $query->createNamedParameter($filename)))
->andWhere($query->expr()->eq('timestamp', $query->createNamedParameter($timestamp)));
$query->executeStatement();
}
/**
* @param string $file
* @param string $filename
+83
View File
@@ -6,16 +6,21 @@ declare(strict_types=1);
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files_Trashbin\Tests;
use OC\Files\Cache\Updater;
use OC\Files\Filesystem;
use OC\Files\ObjectStore\ObjectStoreStorage;
use OC\Files\Storage\Common;
use OC\Files\Storage\Local;
use OC\Files\Storage\Temporary;
use OC\Files\View;
use OCA\Files_Trashbin\AppInfo\Application;
use OCA\Files_Trashbin\Events\MoveToTrashEvent;
use OCA\Files_Trashbin\Storage;
use OCA\Files_Trashbin\Trash\ITrashManager;
use OCA\Files_Trashbin\Trashbin;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Constants;
@@ -118,6 +123,84 @@ class StorageTest extends \Test\TestCase {
$this->assertEquals('test.txt', substr($name, 0, strrpos($name, '.')));
}
public function testTrashEntryCreatedWhenSourceNotInCache(): void {
$this->userView->file_put_contents('uncached.txt', 'foo');
[$storage, $internalPath] = $this->userView->resolvePath('uncached.txt');
if ($storage->instanceOfStorage(ObjectStoreStorage::class)) {
$this->markTestSkipped('object store always has the file in cache');
}
$cache = $storage->getCache();
$cache->remove($internalPath);
$this->assertFalse($cache->inCache($internalPath));
$this->userView->unlink('uncached.txt');
$results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/files/');
$this->assertCount(1, $results);
$name = $results[0]->getName();
$this->assertEquals('uncached.txt', substr($name, 0, strrpos($name, '.')));
[$trashStorage, $trashInternalPath] = $this->rootView->resolvePath('/' . $this->user . '/files_trashbin/files/' . $name);
$this->assertTrue($trashStorage->getCache()->inCache($trashInternalPath));
}
public function testTrashEntryNotCreatedWhenDeleteFailed(): void {
$storage2 = $this->getMockBuilder(Temporary::class)
->setConstructorArgs([])
->onlyMethods(['unlink', 'instanceOfStorage'])
->getMock();
$storage2->method('unlink')
->willReturn(false);
// disable same-storage move optimization
$storage2->method('instanceOfStorage')
->willReturnCallback(fn (string $class) => ($class !== Local::class) && (new Temporary([]))->instanceOfStorage($class));
Filesystem::mount($storage2, [], $this->user . '/files/substorage');
$this->userView->file_put_contents('substorage/test.txt', 'foo');
$this->assertFalse($this->userView->unlink('substorage/test.txt'));
$results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/files/');
$this->assertEmpty($results);
$trashData = Trashbin::getExtraData($this->user);
$this->assertEmpty($trashData);
}
public function testTrashEntryNotCreatedWhenCacheRowFailed(): void {
$trashStorage = $this->getMockBuilder(Temporary::class)
->setConstructorArgs([])
->onlyMethods(['getUpdater'])
->getMock();
$updater = $this->getMockBuilder(Updater::class)
->setConstructorArgs([$trashStorage])
->onlyMethods(['renameFromStorage'])
->getMock();
$trashStorage->method('getUpdater')
->willReturn($updater);
$updater->method('renameFromStorage')
->willThrowException(new \Exception());
Filesystem::mount($trashStorage, [], $this->user . '/files_trashbin');
$this->userView->file_put_contents('test.txt', 'foo');
try {
$this->assertFalse($this->userView->unlink('test.txt'));
$this->fail();
} catch (\Exception) {
// expected
}
$results = $this->rootView->getDirectoryContent($this->user . '/files_trashbin/files/');
$this->assertEmpty($results);
$trashData = Trashbin::getExtraData($this->user);
$this->assertEmpty($trashData);
}
/**
* Test that deleting a folder puts it into the trashbin.
*/
+1
View File
@@ -2,6 +2,7 @@ OC.L10N.register(
"profile",
{
"Profile" : "Profile",
"Searching …" : "ძებნა …",
"Not found" : "Not found",
"You have not added any info yet" : "You have not added any info yet",
"{user} has not added any info yet" : "{user} has not added any info yet",
+1
View File
@@ -1,5 +1,6 @@
{ "translations": {
"Profile" : "Profile",
"Searching …" : "ძებნა …",
"Not found" : "Not found",
"You have not added any info yet" : "You have not added any info yet",
"{user} has not added any info yet" : "{user} has not added any info yet",
+36 -29
View File
@@ -369,6 +369,38 @@ $content-max-width: 640px;
}
}
.user-actions {
display: flex;
flex-direction: column;
gap: 8px 0;
margin-top: 20px;
max-width: 300px;
&__primary {
margin: 0 auto;
max-width: 100%;
&__icon {
filter: var(--primary-invert-if-dark);
}
}
&__other {
display: flex;
justify-content: center;
gap: 0 4px;
&__icon {
height: 20px;
width: 20px;
object-fit: contain;
filter: var(--background-invert-if-dark);
align-self: center;
margin: 12px; // so we get 44px x 44px
}
}
}
@media only screen and (max-width: 1024px) {
.profile {
&__header {
@@ -419,37 +451,12 @@ $content-max-width: 640px;
position: unset;
}
}
}
.user-actions {
display: flex;
flex-direction: column;
gap: 8px 0;
margin-top: 20px;
max-width: 300px;
&__primary {
.user-actions {
width: unset;
max-width: 600px;
margin: 0 auto;
max-width: 100%;
&__icon {
filter: var(--primary-invert-if-dark);
}
}
&__other {
display: flex;
justify-content: center;
gap: 0 4px;
&__icon {
height: 20px;
width: 20px;
object-fit: contain;
filter: var(--background-invert-if-dark);
align-self: center;
margin: 12px; // so we get 44px x 44px
}
padding: 20px 50px 0px 50px;
}
}
</style>
+5 -5
View File
@@ -677,7 +677,6 @@ OC.L10N.register(
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} حساب ","{userCount} حساب ","{userCount} حساب ","{userCount} حسابات","{userCount} حساب ","{userCount} حساب "],
"Total rows summary" : "ملخص مجموع الأسطر",
"Scroll to load more rows" : "مرِّر على القائمة لتحميل المزيد من الصفوف",
"Password or insufficient permissions message" : "رسالة حول كلمة المرور أو عدم كفاية الأذونات",
"Avatar" : "صورة الملف الشخصي الرمزية",
"Account name" : "اسم الحساب",
"Group admin for" : "مدير المجموعة لـ",
@@ -702,14 +701,10 @@ OC.L10N.register(
"Account deletion" : "حذف حساب",
"Delete {userid}'s account" : "حذف حساب {userid}",
"Display name was successfully changed" : "تم تغيير اسم العرض بنجاح",
"Password can't be empty" : "كلمة المرور لايمكن أن تكون فارغةً",
"Password was successfully changed" : "تم تغيير كلمة المرور بنجاح",
"Email can't be empty" : "البريد الإلكتروني لايمكن أن يكون فارغاً",
"Email was successfully changed" : "تم تغيير البريد الإلكتروني بنجاح",
"Welcome mail sent!" : "تمّ إرسال إيميل ترحيبي!",
"Change display name" : "تعديل اسم العرض",
"Set new password" : "تعيين كلمة مرور جديدة",
"You do not have permissions to see the details of this account" : "ليس لديك الإذن بالاطلاع على تفاصيل هذا الحساب",
"Set new email address" : "تعيين عنوان بريد الكتروني جديد",
"Add account to group" : "إضافة حساب إلى مجموعة",
"Set account as admin for" : "تعيين حساب كمدير على ",
@@ -870,7 +865,12 @@ OC.L10N.register(
"Loading accounts …" : "تحميل الحسابات ...",
"Set account as admin for …" : "تعيين الحساب كمدير على ...",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} حساب …","{userCount} حساب …","{userCount} حساب …","{userCount} حسابات …","{userCount} حساب …","{userCount} حساب …"],
"Password or insufficient permissions message" : "رسالة حول كلمة المرور أو عدم كفاية الأذونات",
"Password can't be empty" : "كلمة المرور لايمكن أن تكون فارغةً",
"Password was successfully changed" : "تم تغيير كلمة المرور بنجاح",
"Loading account …" : "تحميل حسابات ...",
"Set new password" : "تعيين كلمة مرور جديدة",
"You do not have permissions to see the details of this account" : "ليس لديك الإذن بالاطلاع على تفاصيل هذا الحساب",
"Adding your device …" : "إضافة جهازك جاريةٌ ...",
"Sending…" : "الإرسال جارٍ …",
"Email sent" : "تمّ إرسال الإيميل",
+5 -5
View File
@@ -675,7 +675,6 @@
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} حساب ","{userCount} حساب ","{userCount} حساب ","{userCount} حسابات","{userCount} حساب ","{userCount} حساب "],
"Total rows summary" : "ملخص مجموع الأسطر",
"Scroll to load more rows" : "مرِّر على القائمة لتحميل المزيد من الصفوف",
"Password or insufficient permissions message" : "رسالة حول كلمة المرور أو عدم كفاية الأذونات",
"Avatar" : "صورة الملف الشخصي الرمزية",
"Account name" : "اسم الحساب",
"Group admin for" : "مدير المجموعة لـ",
@@ -700,14 +699,10 @@
"Account deletion" : "حذف حساب",
"Delete {userid}'s account" : "حذف حساب {userid}",
"Display name was successfully changed" : "تم تغيير اسم العرض بنجاح",
"Password can't be empty" : "كلمة المرور لايمكن أن تكون فارغةً",
"Password was successfully changed" : "تم تغيير كلمة المرور بنجاح",
"Email can't be empty" : "البريد الإلكتروني لايمكن أن يكون فارغاً",
"Email was successfully changed" : "تم تغيير البريد الإلكتروني بنجاح",
"Welcome mail sent!" : "تمّ إرسال إيميل ترحيبي!",
"Change display name" : "تعديل اسم العرض",
"Set new password" : "تعيين كلمة مرور جديدة",
"You do not have permissions to see the details of this account" : "ليس لديك الإذن بالاطلاع على تفاصيل هذا الحساب",
"Set new email address" : "تعيين عنوان بريد الكتروني جديد",
"Add account to group" : "إضافة حساب إلى مجموعة",
"Set account as admin for" : "تعيين حساب كمدير على ",
@@ -868,7 +863,12 @@
"Loading accounts …" : "تحميل الحسابات ...",
"Set account as admin for …" : "تعيين الحساب كمدير على ...",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} حساب …","{userCount} حساب …","{userCount} حساب …","{userCount} حسابات …","{userCount} حساب …","{userCount} حساب …"],
"Password or insufficient permissions message" : "رسالة حول كلمة المرور أو عدم كفاية الأذونات",
"Password can't be empty" : "كلمة المرور لايمكن أن تكون فارغةً",
"Password was successfully changed" : "تم تغيير كلمة المرور بنجاح",
"Loading account …" : "تحميل حسابات ...",
"Set new password" : "تعيين كلمة مرور جديدة",
"You do not have permissions to see the details of this account" : "ليس لديك الإذن بالاطلاع على تفاصيل هذا الحساب",
"Adding your device …" : "إضافة جهازك جاريةٌ ...",
"Sending…" : "الإرسال جارٍ …",
"Email sent" : "تمّ إرسال الإيميل",
+3 -3
View File
@@ -400,12 +400,9 @@ OC.L10N.register(
"Account deletion" : "Desaniciu de la cuenta",
"Delete {userid}'s account" : "Desaniciar la cuenta de: {userid}",
"Display name was successfully changed" : "El nome visible camudó correutamente",
"Password was successfully changed" : "La contraseña camudó correutamente",
"Email was successfully changed" : "La direición de corréu electrónicu camudó correutamente",
"Welcome mail sent!" : "¡Unvióse'l mensaxe d'acoyida!",
"Change display name" : "Camudar el nome visible",
"Set new password" : "Afitar una contraseña nueva",
"You do not have permissions to see the details of this account" : "Nun tienes permisu pa ver los detalles d'esta cuenta",
"Set new email address" : "Afitar una direición de corréu electrónicu nueva",
"Add account to group" : "Amestar la cuenta al grupu",
"Set the language" : "Afitar la llingua",
@@ -527,7 +524,10 @@ OC.L10N.register(
"Group list is empty" : "La llista de grupos ta balera",
"Unable to retrieve the group list" : "Nun ye posible recuperar la llista de grupos",
"Loading accounts …" : "Cargando les cuentes…",
"Password was successfully changed" : "La contraseña camudó correutamente",
"Loading account …" : "Cargando la cuenta…",
"Set new password" : "Afitar una contraseña nueva",
"You do not have permissions to see the details of this account" : "Nun tienes permisu pa ver los detalles d'esta cuenta",
"Adding your device …" : "Amestando'l preséu…",
"Sending…" : "Unviando…",
"Email sent" : "Unvióse'l corréu electrónicu",
+3 -3
View File
@@ -398,12 +398,9 @@
"Account deletion" : "Desaniciu de la cuenta",
"Delete {userid}'s account" : "Desaniciar la cuenta de: {userid}",
"Display name was successfully changed" : "El nome visible camudó correutamente",
"Password was successfully changed" : "La contraseña camudó correutamente",
"Email was successfully changed" : "La direición de corréu electrónicu camudó correutamente",
"Welcome mail sent!" : "¡Unvióse'l mensaxe d'acoyida!",
"Change display name" : "Camudar el nome visible",
"Set new password" : "Afitar una contraseña nueva",
"You do not have permissions to see the details of this account" : "Nun tienes permisu pa ver los detalles d'esta cuenta",
"Set new email address" : "Afitar una direición de corréu electrónicu nueva",
"Add account to group" : "Amestar la cuenta al grupu",
"Set the language" : "Afitar la llingua",
@@ -525,7 +522,10 @@
"Group list is empty" : "La llista de grupos ta balera",
"Unable to retrieve the group list" : "Nun ye posible recuperar la llista de grupos",
"Loading accounts …" : "Cargando les cuentes…",
"Password was successfully changed" : "La contraseña camudó correutamente",
"Loading account …" : "Cargando la cuenta…",
"Set new password" : "Afitar una contraseña nueva",
"You do not have permissions to see the details of this account" : "Nun tienes permisu pa ver los detalles d'esta cuenta",
"Adding your device …" : "Amestando'l preséu…",
"Sending…" : "Unviando…",
"Email sent" : "Unvióse'l corréu electrónicu",
+1 -1
View File
@@ -319,7 +319,6 @@ OC.L10N.register(
"Display name was successfully changed" : "Імя для паказу паспяхова зменена",
"Loading account …" : "Загрузка ўліковага запісу …",
"Change display name" : "Змяніць імя для паказу",
"Set new password" : "Задаць новы пароль",
"Add account to group" : "Дадаць уліковы запіс у групу",
"Select account quota" : "Выберыце квоту ўліковага запісу",
"Set the language" : "Задайце мову",
@@ -425,6 +424,7 @@ OC.L10N.register(
"Set account as admin for …" : "Задаць уліковы запіс у якасці адміністратара для …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} уліковы запіс …","{userCount} уліковыя запісы …","{userCount} уліковых запісаў …","{userCount} уліковых запісаў …"],
"Loading account …" : "Загрузка ўліковага запісу …",
"Set new password" : "Задаць новы пароль",
"Adding your device …" : "Дадаванне вашай прылады …",
"Sending…" : "Адпраўка…",
"SSL" : "SSL",
+1 -1
View File
@@ -317,7 +317,6 @@
"Display name was successfully changed" : "Імя для паказу паспяхова зменена",
"Loading account …" : "Загрузка ўліковага запісу …",
"Change display name" : "Змяніць імя для паказу",
"Set new password" : "Задаць новы пароль",
"Add account to group" : "Дадаць уліковы запіс у групу",
"Select account quota" : "Выберыце квоту ўліковага запісу",
"Set the language" : "Задайце мову",
@@ -423,6 +422,7 @@
"Set account as admin for …" : "Задаць уліковы запіс у якасці адміністратара для …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} уліковы запіс …","{userCount} уліковыя запісы …","{userCount} уліковых запісаў …","{userCount} уліковых запісаў …"],
"Loading account …" : "Загрузка ўліковага запісу …",
"Set new password" : "Задаць новы пароль",
"Adding your device …" : "Дадаванне вашай прылады …",
"Sending…" : "Адпраўка…",
"SSL" : "SSL",
+5 -5
View File
@@ -734,7 +734,6 @@ OC.L10N.register(
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} сметка","{userCount} сметки"],
"Total rows summary" : "Обобщение на общия брой редове",
"Scroll to load more rows" : "Превъртете за да заредите още редове",
"Password or insufficient permissions message" : "Съобщение за парола или недостатъчни разрешения",
"Avatar" : "Аватар",
"Account name" : "Име на профил",
"Group admin for" : "Групов администратор за",
@@ -760,15 +759,11 @@ OC.L10N.register(
"Account deletion" : "Изтриване на профил",
"Delete {userid}'s account" : "Изтриване на профил на {userid}",
"Display name was successfully changed" : "Показваното име беше успешно променено",
"Password can't be empty" : "Паролата не може да бъде празна",
"Password was successfully changed" : "Паролата бе променена успешно",
"Email can't be empty" : "Имейлът не може да бъде празен",
"Email was successfully changed" : "Имейлът бе променен успешно",
"Welcome mail sent!" : "Изпратена е поща за добре дошли!",
"Loading account …" : "Профилът се зарежда…",
"Change display name" : "Промяна на показваното име",
"Set new password" : "Задайте нова парола",
"You do not have permissions to see the details of this account" : "Нямате разрешения да виждате подробностите за този акаунт",
"Set new email address" : "Задайте нов имейл адрес",
"Add account to group" : "Добавете акаунт към групата",
"Set account as admin for" : "Задаване на акаунт като администратор за",
@@ -946,7 +941,12 @@ OC.L10N.register(
"Loading accounts …" : "Сметките се зареждат...",
"Set account as admin for …" : "Задаване на акаунт като администратор за …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка…","{userCount} сметки…"],
"Password or insufficient permissions message" : "Съобщение за парола или недостатъчни разрешения",
"Password can't be empty" : "Паролата не може да бъде празна",
"Password was successfully changed" : "Паролата бе променена успешно",
"Loading account …" : "Профилът се зарежда...",
"Set new password" : "Задайте нова парола",
"You do not have permissions to see the details of this account" : "Нямате разрешения да виждате подробностите за този акаунт",
"Adding your device …" : "Вашето устройство се добавя …",
"Sending…" : "Изпращане...",
"Email sent" : "Имейлът е изпратен",
+5 -5
View File
@@ -732,7 +732,6 @@
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} сметка","{userCount} сметки"],
"Total rows summary" : "Обобщение на общия брой редове",
"Scroll to load more rows" : "Превъртете за да заредите още редове",
"Password or insufficient permissions message" : "Съобщение за парола или недостатъчни разрешения",
"Avatar" : "Аватар",
"Account name" : "Име на профил",
"Group admin for" : "Групов администратор за",
@@ -758,15 +757,11 @@
"Account deletion" : "Изтриване на профил",
"Delete {userid}'s account" : "Изтриване на профил на {userid}",
"Display name was successfully changed" : "Показваното име беше успешно променено",
"Password can't be empty" : "Паролата не може да бъде празна",
"Password was successfully changed" : "Паролата бе променена успешно",
"Email can't be empty" : "Имейлът не може да бъде празен",
"Email was successfully changed" : "Имейлът бе променен успешно",
"Welcome mail sent!" : "Изпратена е поща за добре дошли!",
"Loading account …" : "Профилът се зарежда…",
"Change display name" : "Промяна на показваното име",
"Set new password" : "Задайте нова парола",
"You do not have permissions to see the details of this account" : "Нямате разрешения да виждате подробностите за този акаунт",
"Set new email address" : "Задайте нов имейл адрес",
"Add account to group" : "Добавете акаунт към групата",
"Set account as admin for" : "Задаване на акаунт като администратор за",
@@ -944,7 +939,12 @@
"Loading accounts …" : "Сметките се зареждат...",
"Set account as admin for …" : "Задаване на акаунт като администратор за …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка…","{userCount} сметки…"],
"Password or insufficient permissions message" : "Съобщение за парола или недостатъчни разрешения",
"Password can't be empty" : "Паролата не може да бъде празна",
"Password was successfully changed" : "Паролата бе променена успешно",
"Loading account …" : "Профилът се зарежда...",
"Set new password" : "Задайте нова парола",
"You do not have permissions to see the details of this account" : "Нямате разрешения да виждате подробностите за този акаунт",
"Adding your device …" : "Вашето устройство се добавя …",
"Sending…" : "Изпращане...",
"Email sent" : "Имейлът е изпратен",
+5 -5
View File
@@ -671,7 +671,6 @@ OC.L10N.register(
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} compte","{userCount} comptes"],
"Total rows summary" : "Resum de totes les files",
"Scroll to load more rows" : "Desplaceu-vos per carregar més files",
"Password or insufficient permissions message" : "Contrasenya o missatge de permisos insuficients",
"Avatar" : "Avatar",
"Account name" : "Nom de compte",
"Group admin for" : "Administrador de grup per",
@@ -694,14 +693,10 @@ OC.L10N.register(
"Account deletion" : "Supressió del compte",
"Delete {userid}'s account" : "Suprimir el compte de {userid}",
"Display name was successfully changed" : "El nom a mostrar s'ha canviat correctament",
"Password can't be empty" : "La contrasenya no pot estar buida",
"Password was successfully changed" : "La contrasenya s'ha canviat correctament",
"Email can't be empty" : "El correu electrònic no pot estar buit",
"Email was successfully changed" : "El correu electrònic s'ha canviat correctament",
"Welcome mail sent!" : "S'ha enviat el correu electrònic de benvinguda!",
"Change display name" : "Canvia el nom de visualització",
"Set new password" : "Estableix una contrasenya nova",
"You do not have permissions to see the details of this account" : "No teniu permís per veure els detalls d'aquest compte",
"Set new email address" : "Estableix una nova adreça de correu electrònic",
"Add account to group" : "Afegeix un compte al grup",
"Set account as admin for" : "Estableix el compte com a administrador de",
@@ -861,7 +856,12 @@ OC.L10N.register(
"Loading accounts …" : "S'estan carregant els comptes …",
"Set account as admin for …" : "Estableix el compte com a administrador de …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} compte…","{userCount} comptes…"],
"Password or insufficient permissions message" : "Contrasenya o missatge de permisos insuficients",
"Password can't be empty" : "La contrasenya no pot estar buida",
"Password was successfully changed" : "La contrasenya s'ha canviat correctament",
"Loading account …" : "S'està carregant el compte …",
"Set new password" : "Estableix una contrasenya nova",
"You do not have permissions to see the details of this account" : "No teniu permís per veure els detalls d'aquest compte",
"Adding your device …" : "S'està afegint el vostre dispositiu …",
"Sending…" : "S'està enviant…",
"Email sent" : "S'ha enviat el correu electrònic",
+5 -5
View File
@@ -669,7 +669,6 @@
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} compte","{userCount} comptes"],
"Total rows summary" : "Resum de totes les files",
"Scroll to load more rows" : "Desplaceu-vos per carregar més files",
"Password or insufficient permissions message" : "Contrasenya o missatge de permisos insuficients",
"Avatar" : "Avatar",
"Account name" : "Nom de compte",
"Group admin for" : "Administrador de grup per",
@@ -692,14 +691,10 @@
"Account deletion" : "Supressió del compte",
"Delete {userid}'s account" : "Suprimir el compte de {userid}",
"Display name was successfully changed" : "El nom a mostrar s'ha canviat correctament",
"Password can't be empty" : "La contrasenya no pot estar buida",
"Password was successfully changed" : "La contrasenya s'ha canviat correctament",
"Email can't be empty" : "El correu electrònic no pot estar buit",
"Email was successfully changed" : "El correu electrònic s'ha canviat correctament",
"Welcome mail sent!" : "S'ha enviat el correu electrònic de benvinguda!",
"Change display name" : "Canvia el nom de visualització",
"Set new password" : "Estableix una contrasenya nova",
"You do not have permissions to see the details of this account" : "No teniu permís per veure els detalls d'aquest compte",
"Set new email address" : "Estableix una nova adreça de correu electrònic",
"Add account to group" : "Afegeix un compte al grup",
"Set account as admin for" : "Estableix el compte com a administrador de",
@@ -859,7 +854,12 @@
"Loading accounts …" : "S'estan carregant els comptes …",
"Set account as admin for …" : "Estableix el compte com a administrador de …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} compte…","{userCount} comptes…"],
"Password or insufficient permissions message" : "Contrasenya o missatge de permisos insuficients",
"Password can't be empty" : "La contrasenya no pot estar buida",
"Password was successfully changed" : "La contrasenya s'ha canviat correctament",
"Loading account …" : "S'està carregant el compte …",
"Set new password" : "Estableix una contrasenya nova",
"You do not have permissions to see the details of this account" : "No teniu permís per veure els detalls d'aquest compte",
"Adding your device …" : "S'està afegint el vostre dispositiu …",
"Sending…" : "S'està enviant…",
"Email sent" : "S'ha enviat el correu electrònic",
+5 -5
View File
@@ -758,7 +758,6 @@ OC.L10N.register(
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} účet","{userCount} účty","{userCount} účtů","{userCount} účty"],
"Total rows summary" : "Celkový souhrn řádek",
"Scroll to load more rows" : "Další řádky načtete posunutím dolů",
"Password or insufficient permissions message" : "Zpráva o heslu nebo nedostatečném oprávnění",
"Avatar" : "Profilový obrázek",
"Account name" : "Název účtu",
"Group admin for" : "Správce skupiny",
@@ -784,15 +783,11 @@ OC.L10N.register(
"Account deletion" : "Smazání účtu",
"Delete {userid}'s account" : "Smazat účet {userid}",
"Display name was successfully changed" : "Zobrazené jméno bylo úspěšně změněno",
"Password can't be empty" : "Heslo je třeba vyplnit",
"Password was successfully changed" : "Heslo bylo úspěšně změněno",
"Email can't be empty" : "E-mail je třeba vyplnit",
"Email was successfully changed" : "E-mail byl úspěšně změněn",
"Welcome mail sent!" : "Uvítací e-mail odeslán!",
"Loading account …" : "Načítání účtu …",
"Change display name" : "Změnit zobrazované jméno",
"Set new password" : "Nastavit nové heslo",
"You do not have permissions to see the details of this account" : "Nemáte oprávnění zobrazit si podrobností o tomto účtu",
"Set new email address" : "Nastavit novou e-mailovou adresu",
"Add account to group" : "Přidat účet do skupiny",
"Set account as admin for" : "Nastavit účet coby správce pro",
@@ -988,7 +983,12 @@ OC.L10N.register(
"Loading accounts …" : "Načítání účtů …",
"Set account as admin for …" : "Nastavit účet správce pro …",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} účet …","{userCount} účty …","{userCount} účtů …","{userCount} účty …"],
"Password or insufficient permissions message" : "Zpráva o heslu nebo nedostatečném oprávnění",
"Password can't be empty" : "Heslo je třeba vyplnit",
"Password was successfully changed" : "Heslo bylo úspěšně změněno",
"Loading account …" : "Načítání účtu …",
"Set new password" : "Nastavit nové heslo",
"You do not have permissions to see the details of this account" : "Nemáte oprávnění zobrazit si podrobností o tomto účtu",
"Adding your device …" : "Přidávání vašeho zařízení",
"Sending…" : "Odesílání …",
"Email sent" : "E-mail odeslán",

Some files were not shown because too many files have changed in this diff Show More