Compare commits

..

65 Commits

Author SHA1 Message Date
Robin Appelman fadda7fec5 tmp: also stip propagation for e2e metadata on remove
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-10-08 15:31:06 +02:00
Julius Knorr 15b1127632 tmp: Skip size and etag propagation updates for end to end metadata
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-10-08 15:31:06 +02:00
Kate 6c362cb38d Merge pull request #55623 from nextcloud/fix/caldav/principal-encoding-inconsistencies 2025-10-08 12:56:12 +02:00
Richard Steinmetz c12ce7083c fix(caldav): encoding inconsistencies in event search provider
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-10-08 12:14:00 +02:00
Kate fcbb8be904 Merge pull request #55514 from nextcloud/carl/more-old-execute 2025-10-08 10:30:46 +02:00
Nextcloud bot 8f21e3523b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-10-08 00:13:18 +00:00
Ferdinand Thiessen 3827eab2d3 Merge pull request #55605 from nextcloud/chore/33-uses-82
chore: updated 3rdparty to PHP8.2
2025-10-07 20:59:23 +02:00
Joas Schilling d6cafee543 Merge pull request #55382 from nextcloud/bugfix/noid/files-live-photo-permission
fix(live-photo): Allow files-live-photo meta data with edit permissions
2025-10-07 20:55:53 +02:00
Daniel 38c9bd99f5 Merge pull request #53869 from nextcloud/bug/53856/hide-password-on-submit
feat(login): hide password on form submit
2025-10-07 20:07:27 +02:00
Daniel Kesselberg ec1ea3253c feat(login): hide password on form submit
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2025-10-07 19:37:51 +02:00
Daniel db3e845d19 Merge pull request #55557 from nextcloud/refactor/use-iemailaddressvalidator
refactor: use IEmailValidator.isValid instead of IMailer.validateEmailAddress
2025-10-07 19:15:32 +02:00
Kate fb0b56de3b Merge pull request #55529 from nextcloud/share-recursion-error 2025-10-07 18:11:29 +02:00
Daniel 0274a463ab Merge pull request #55577 from nextcloud/fix/repair-tree-description
fix(RepairTree): Update files:repair-tree description
2025-10-07 17:49:31 +02:00
Côme Chilliet e739898cc7 Merge pull request #55400 from nextcloud/carl/remove-legacy-search-provider
refactor: Remove legacy search provider
2025-10-07 16:51:12 +02:00
Ferdinand Thiessen 0a86f9cc55 chore: updated 3rdparty to PHP8.2
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-10-07 16:19:53 +02:00
Côme Chilliet b984e329fc Merge pull request #55574 from nextcloud/carl/view-deprecated
chore: Explicitely mark \OC\Files\View as internal
2025-10-07 16:07:36 +02:00
Anna 87c90f9678 Merge pull request #55581 from nextcloud/fix/noid/dont-catch-general-db-errors
fix(ooo): don't catch general DB exceptions
2025-10-07 13:36:55 +02:00
Côme Chilliet 8950f9fe74 Merge pull request #55462 from IONOS-Productivity/fix/admin_delegation-show-all-priority-items
Fix admin delegation show all priority items
2025-10-07 12:03:32 +02:00
Marcel Klehr ef6e9744a9 Merge pull request #55573 from nextcloud/fix/taskprocessing/list-command
fix(TaskProcessing): Make sure list command int filter parameters are parsed as ints
2025-10-07 11:38:49 +02:00
Carl Schwan 104aef324d refactor(core/Command): Port away from View
Use IRootFolder instead.

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-10-07 10:11:01 +02:00
Kate e67fe86c9d Merge pull request #55578 from nextcloud/carl/dead-code-sabre-node 2025-10-07 09:55:37 +02:00
Marcel Klehr b12b38b70e Merge pull request #55579 from nextcloud/fix/taskprocessing/max-task-age-6-months
fix(TaskProcessing): Increase MAX_TASK_AGE to 6 months
2025-10-07 08:22:39 +02:00
Robin Windey d84d6ca1cf Merge pull request #55527 from nextcloud/feature/update-devcontainer
Update Nextcloud Devcontainer
2025-10-07 06:56:18 +02:00
Robin Windey 88fde78a79 feat: Update Nextcloud Devcontainer
Removed deprecations:
* docker-compose version
* apt-key add command in docker installation

Updates:
* Upgrade from PHP8.3 to PHP8.4 (currently recommended for NC) from ppa:ondrej/php
* Use nodejs 22 by default

Optimization:
* Just install docker-ce-cli, not the full docker suite (speeds up docker build)
* Make sure user "devcontainer" has UID 1000. This increases the containers filesystem compatibility to most (unix-based) host systems because the default user there always has 1000 as well
* Ensure devcontainer user has access to docker without sudo

Signed-off-by: Robin Windey <ro.windey@gmail.com>
2025-10-07 04:38:33 +00:00
Nextcloud bot e0d3f6137e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-10-07 00:13:19 +00:00
Ferdinand Thiessen 7f6e76ac6e Merge pull request #55585 from nextcloud/occ-auth-token-name
feat: allow setting custom name for occ generated app password
2025-10-07 01:53:08 +02:00
Ferdinand Thiessen b6496c8ce6 Merge pull request #55537 from nextcloud/dependabot/npm_and_yarn/p-queue-9.0.0
build(deps): bump p-queue from 8.1.1 to 9.0.0
2025-10-07 01:51:10 +02:00
nextcloud-command ac7c9cdd12 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-10-06 22:41:53 +00:00
dependabot[bot] 9c9af0f069 Merge pull request #55538 from nextcloud/dependabot/composer/build/integration/behat/behat-3.25.0 2025-10-06 22:41:50 +00:00
dependabot[bot] eb77daac0b build(deps): bump p-queue from 8.1.1 to 9.0.0
Bumps [p-queue](https://github.com/sindresorhus/p-queue) from 8.1.1 to 9.0.0.
- [Release notes](https://github.com/sindresorhus/p-queue/releases)
- [Commits](https://github.com/sindresorhus/p-queue/compare/v8.1.1...v9.0.0)

---
updated-dependencies:
- dependency-name: p-queue
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-07 00:34:35 +02:00
dependabot[bot] d5d2083322 Merge pull request #55536 from nextcloud/dependabot/npm_and_yarn/webpack-5.102.0 2025-10-06 21:44:41 +00:00
nextcloud-command a180c9197e chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2025-10-06 21:24:50 +00:00
dependabot[bot] 21b844f4cf build(deps-dev): bump webpack from 5.101.3 to 5.102.0
Bumps [webpack](https://github.com/webpack/webpack) from 5.101.3 to 5.102.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.101.3...v5.102.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.102.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 21:16:30 +00:00
dependabot[bot] bb6a265c55 build(deps-dev): bump behat/behat in /build/integration
Bumps [behat/behat](https://github.com/Behat/Behat) from 3.24.1 to 3.25.0.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.24.1...v3.25.0)

---
updated-dependencies:
- dependency-name: behat/behat
  dependency-version: 3.25.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 21:13:30 +00:00
dependabot[bot] 253fe7e269 Merge pull request #55534 from nextcloud/dependabot/npm_and_yarn/puppeteer-24.23.0 2025-10-06 21:07:41 +00:00
dependabot[bot] 4d1f9def8d build(deps-dev): bump puppeteer from 24.22.3 to 24.23.0
Bumps [puppeteer](https://github.com/puppeteer/puppeteer) from 24.22.3 to 24.23.0.
- [Release notes](https://github.com/puppeteer/puppeteer/releases)
- [Changelog](https://github.com/puppeteer/puppeteer/blob/main/CHANGELOG.md)
- [Commits](https://github.com/puppeteer/puppeteer/compare/puppeteer-v24.22.3...puppeteer-v24.23.0)

---
updated-dependencies:
- dependency-name: puppeteer
  dependency-version: 24.23.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 20:51:05 +00:00
Andy Scherzinger 7dc189a222 Merge pull request #55586 from nextcloud/fix/codeowners
chore(CODEOWNERS): include mjs and cjs for frontend
2025-10-06 21:48:01 +02:00
Ferdinand Thiessen 747179200c chore(CODEOWNERS): include mjs and cjs for frontend
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-10-06 21:11:03 +02:00
Kate 9e5ee588a0 Merge pull request #55583 from nextcloud/build/psalm/raise-php-version 2025-10-06 21:06:59 +02:00
dependabot[bot] eb042b842c Merge pull request #55532 from nextcloud/dependabot/npm_and_yarn/dockerode-4.0.9 2025-10-06 17:52:45 +00:00
dependabot[bot] 2e2f98614e build(deps-dev): bump dockerode from 4.0.8 to 4.0.9
Bumps [dockerode](https://github.com/apocas/dockerode) from 4.0.8 to 4.0.9.
- [Release notes](https://github.com/apocas/dockerode/releases)
- [Commits](https://github.com/apocas/dockerode/compare/v4.0.8...v4.0.9)

---
updated-dependencies:
- dependency-name: dockerode
  dependency-version: 4.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 17:36:05 +00:00
dependabot[bot] a24e84da49 Merge pull request #55533 from nextcloud/dependabot/npm_and_yarn/testing-library/jest-dom-6.9.1 2025-10-06 17:33:04 +00:00
Robin Appelman de69824a59 feat: allow setting custom name for occ generated app password
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-10-06 18:37:03 +02:00
dependabot[bot] 4df8758b29 build(deps-dev): bump @testing-library/jest-dom from 6.8.0 to 6.9.1
Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 6.8.0 to 6.9.1.
- [Release notes](https://github.com/testing-library/jest-dom/releases)
- [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testing-library/jest-dom/compare/v6.8.0...v6.9.1)

---
updated-dependencies:
- dependency-name: "@testing-library/jest-dom"
  dependency-version: 6.9.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 16:30:00 +00:00
Côme Chilliet 818f54d9ca Merge pull request #55576 from nextcloud/fix/ldap-configuration-prefix-list
fix(ldap): Fix copying and creating LDAP configuration
2025-10-06 18:22:18 +02:00
provokateurin 4b90a2c730 build(psalm): Raise PHP version to 8.2
Signed-off-by: provokateurin <kate@provokateurin.de>
2025-10-06 18:01:51 +02:00
Anna Larch d4c9e09c5f fix(ooo): don't catch general DB exceptions
Signed-off-by: Anna Larch <anna@nextcloud.com>
2025-10-06 17:44:33 +02:00
Ferdinand Thiessen cb1a6f79e7 Merge pull request #55442 from nextcloud/refactor/migrate-cypress-tests
test: migrate `LoginForm` component test to vitest
2025-10-06 17:41:46 +02:00
Ferdinand Thiessen 2fd87955e6 Merge pull request #55525 from nextcloud/chore/karma-commets
refactor(core): migrate tests of `OCP.Comments` to `vitest`
2025-10-06 17:10:29 +02:00
Marcel Klehr a6f899f925 fix(TaskProcessing): Increase MAX_TASK_AGE to 6 months
to comply with the EU AI act

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2025-10-06 16:44:53 +02:00
Carl Schwan 3004f628e9 refactor(Sabre/Node): Remove dead code
property_cache is no longer used.

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-10-06 16:33:28 +02:00
Marcel Klehr e237ac54cc fix(RepairTree): Update files:repair-tree description
to note that running the command multiple times may be necessary

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2025-10-06 16:25:45 +02:00
Carl Schwan f450cda3aa chore: Explicitely mark \OC\Files\View as internal
It's in OC and should not be used at all. Marking it as internal will
at least prevent new code to use it.

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-10-06 15:49:55 +02:00
Côme Chilliet 723a3f0b96 fix(ldap): Fix copying and creating LDAP configuration
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-10-06 15:45:23 +02:00
Marcel Klehr f28344e13e fix(TaskProcessing): Make sure list command int filter parameters are parsed as ints
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2025-10-06 15:29:36 +02:00
Ferdinand Thiessen 62539ecacf chore: compile assets
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-10-06 15:18:51 +02:00
Ferdinand Thiessen ba01412389 test: migrate LoginForm component test to vitest
Cypress has some limitations:
- its vue 2 supported was removed
- it fails with our vue 3 migration due to 2 different vue versions
  being present
- its slow compared to vitest

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-10-06 15:18:51 +02:00
Ferdinand Thiessen 769ec69bb3 refactor(core): migrate tests of OCP.Comments to vitest
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2025-10-06 15:05:31 +02:00
Daniel Kesselberg 83a691709c refactor: use IEmailValidator.isValid instead of IMailer.validateEmailAddress
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2025-10-04 21:54:22 +02:00
Robin Appelman af907388d0 fix: make share recursion error more informative
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-10-03 15:50:43 +02:00
Carl Schwan 9e848551be refactor: Port away from more IQueryBuilder::execute
Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-10-02 14:40:28 +02:00
Carl Schwan aa1f5312a5 refactor: Remove legacy search provider
Last usage was in the comment app

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
2025-10-01 13:36:25 +02:00
Misha M.-Kupriyanov b0ed8b1455 fix(admin-delegation-show): show delegations for all priorities
otherwise delegation only from the first priority array ara shown

Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-10-01 12:33:13 +02:00
Misha M.-Kupriyanov 33577b3120 feat(admin-delegation-show): add priority to json output
in order to be able to better understand priority sorting.

php occ admin-delegation:show --output=json_pretty

Signed-off-by: Misha M.-Kupriyanov <kupriyanov@strato.de>
2025-10-01 12:33:13 +02:00
Joas Schilling 7cc4a0e59f fix(live-photo): Allow files-live-photo meta data with edit permissions
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-09-28 17:31:51 +02:00
372 changed files with 1825 additions and 1611 deletions
+46 -44
View File
@@ -4,33 +4,35 @@ ARG DEBIAN_FRONTEND=noninteractive
# PHP
RUN apt-get update -y && \
apt install -y apache2 vim software-properties-common sudo nano gnupg2
apt install -y apache2 vim software-properties-common sudo nano gnupg2 wget curl git \
lsb-release ca-certificates apt-transport-https && \
add-apt-repository ppa:ondrej/php -y && \
apt-get update -y
RUN apt-get install --no-install-recommends -y \
php8.3 \
php8.3-common \
php8.3-gd \
php8.3-zip \
php8.3-curl \
php8.3-xml \
php8.3-xmlrpc \
php8.3-mbstring \
php8.3-sqlite \
php8.3-xdebug \
php8.3-pgsql \
php8.3-intl \
php8.3-imagick \
php8.3-gmp \
php8.3-apcu \
php8.3-bcmath \
php8.3-redis \
php8.3-soap \
php8.3-imap \
php8.3-opcache \
php8.3-cli \
php8.3-dev \
php8.4 \
php8.4-common \
php8.4-gd \
php8.4-zip \
php8.4-curl \
php8.4-xml \
php8.4-xmlrpc \
php8.4-mbstring \
php8.4-sqlite \
php8.4-xdebug \
php8.4-pgsql \
php8.4-intl \
php8.4-imagick \
php8.4-gmp \
php8.4-apcu \
php8.4-bcmath \
php8.4-redis \
php8.4-soap \
php8.4-imap \
php8.4-opcache \
php8.4-cli \
php8.4-dev \
libmagickcore-6.q16-7-extra \
curl \
lsof \
make \
unzip
@@ -42,39 +44,39 @@ RUN curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php && \
php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer && \
rm /tmp/composer-setup.php /tmp/composer-setup.sig
RUN echo "xdebug.remote_enable = 1" >> /etc/php/8.3/cli/conf.d/20-xdebug.ini && \
echo "xdebug.remote_autostart = 1" >> /etc/php/8.3/cli/conf.d/20-xdebug.ini && \
echo "apc.enable_cli=1" >> /etc/php/8.3/cli/conf.d/20-apcu.ini
RUN echo "xdebug.remote_enable = 1" >> /etc/php/8.4/cli/conf.d/20-xdebug.ini && \
echo "xdebug.remote_autostart = 1" >> /etc/php/8.4/cli/conf.d/20-xdebug.ini && \
echo "apc.enable_cli=1" >> /etc/php/8.4/cli/conf.d/20-apcu.ini
# Autostart XDebug for apache
RUN { \
echo "xdebug.mode=debug"; \
echo "xdebug.start_with_request=yes"; \
} >> /etc/php/8.3/apache2/conf.d/20-xdebug.ini
} >> /etc/php/8.4/apache2/conf.d/20-xdebug.ini
# Increase PHP memory limit to 512mb
RUN sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/8.3/apache2/php.ini
RUN sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/8.4/apache2/php.ini
# Docker
RUN apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable" && \
# Docker CLI only (for controlling host Docker via socket)
RUN install -m 0755 -d /etc/apt/keyrings && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc && \
chmod a+r /etc/apt/keyrings/docker.asc && \
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null && \
apt-get update -y && \
apt-get install -y docker-ce docker-ce-cli containerd.io && \
apt-get install -y docker-ce-cli && \
ln -s /var/run/docker-host.sock /var/run/docker.sock
# Dedicated DevContainer user runs Apache
ENV APACHE_RUN_USER=devcontainer
ENV APACHE_RUN_GROUP=devcontainer
RUN useradd -ms /bin/bash ${APACHE_RUN_USER} && \
# Delete any existing user/group with UID/GID 1000 first
RUN (getent passwd 1000 && userdel -r $(getent passwd 1000 | cut -d: -f1)) || true && \
(getent group 1000 && groupdel $(getent group 1000 | cut -d: -f1)) || true && \
groupadd -g 1000 ${APACHE_RUN_GROUP} && \
useradd -u 1000 -g 1000 -ms /bin/bash ${APACHE_RUN_USER} && \
adduser ${APACHE_RUN_USER} sudo && \
echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers && \
sed -ri "s/^export APACHE_RUN_USER=.*$/export APACHE_RUN_USER=${APACHE_RUN_USER}/" "/etc/apache2/envvars" && \
@@ -84,6 +86,6 @@ USER devcontainer
# NVM
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
RUN bash --login -i -c 'source /home/devcontainer/.bashrc && nvm install 16'
RUN bash --login -i -c 'source /home/devcontainer/.bashrc && nvm install 22'
WORKDIR /var/www/html
-1
View File
@@ -1,6 +1,5 @@
# SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later
version: '3'
services:
nextclouddev:
build: .
+6 -1
View File
@@ -5,4 +5,9 @@
#
# Set git safe.directory
git config --global --add safe.directory /var/www/html
git config --global --add safe.directory /var/www/html/3rdparty
git config --global --add safe.directory /var/www/html/3rdparty
# Ensure devcontainer user has access to docker socket
if [ -S /var/run/docker.sock ]; then
sudo chmod 666 /var/run/docker.sock
fi
+2
View File
@@ -15,6 +15,8 @@
**/js @nextcloud/server-frontend
**/src @nextcloud/server-frontend
*.js @nextcloud/server-frontend
*.cjs @nextcloud/server-frontend
*.mjs @nextcloud/server-frontend
*.ts @nextcloud/server-frontend
# dependency management
@@ -23,6 +23,4 @@ return array(
'OCA\\Comments\\Notification\\Listener' => $baseDir . '/../lib/Notification/Listener.php',
'OCA\\Comments\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
'OCA\\Comments\\Search\\CommentsSearchProvider' => $baseDir . '/../lib/Search/CommentsSearchProvider.php',
'OCA\\Comments\\Search\\LegacyProvider' => $baseDir . '/../lib/Search/LegacyProvider.php',
'OCA\\Comments\\Search\\Result' => $baseDir . '/../lib/Search/Result.php',
);
@@ -38,8 +38,6 @@ class ComposerStaticInitComments
'OCA\\Comments\\Notification\\Listener' => __DIR__ . '/..' . '/../lib/Notification/Listener.php',
'OCA\\Comments\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
'OCA\\Comments\\Search\\CommentsSearchProvider' => __DIR__ . '/..' . '/../lib/Search/CommentsSearchProvider.php',
'OCA\\Comments\\Search\\LegacyProvider' => __DIR__ . '/..' . '/../lib/Search/LegacyProvider.php',
'OCA\\Comments\\Search\\Result' => __DIR__ . '/..' . '/../lib/Search/Result.php',
);
public static function getInitializer(ClassLoader $loader)
+1
View File
@@ -17,6 +17,7 @@ OC.L10N.register(
"Delete comment" : "Удалить комментарий",
"Cancel edit" : "Отменить правку",
"New comment" : "Новый комментарий",
"Write a comment …" : "Написать комментарий …",
"Post comment" : "Опубликовать комментарий",
"@ for mentions, : for emoji, / for smart picker" : "@ для упоминаний, : для эмодзи, / для интеллектуального выбора",
"Could not reload comments" : "Не удалось перезагрузить комментарии",
+1
View File
@@ -15,6 +15,7 @@
"Delete comment" : "Удалить комментарий",
"Cancel edit" : "Отменить правку",
"New comment" : "Новый комментарий",
"Write a comment …" : "Написать комментарий …",
"Post comment" : "Опубликовать комментарий",
"@ for mentions, : for emoji, / for smart picker" : "@ для упоминаний, : для эмодзи, / для интеллектуального выбора",
"Could not reload comments" : "Не удалось перезагрузить комментарии",
+1
View File
@@ -17,6 +17,7 @@ OC.L10N.register(
"Delete comment" : "Обриши коментар",
"Cancel edit" : "Поништи измену",
"New comment" : "Нови коментар",
"Write a comment …" : "Напишите коментар …",
"Post comment" : "Објави коментар",
"@ for mentions, : for emoji, / for smart picker" : "@ за помињања, : за емођи, / за паметни бирач",
"Could not reload comments" : "Коментари не могу поново да се учитају",
+1
View File
@@ -15,6 +15,7 @@
"Delete comment" : "Обриши коментар",
"Cancel edit" : "Поништи измену",
"New comment" : "Нови коментар",
"Write a comment …" : "Напишите коментар …",
"Post comment" : "Објави коментар",
"@ for mentions, : for emoji, / for smart picker" : "@ за помињања, : за емођи, / за паметни бирач",
"Could not reload comments" : "Коментари не могу поново да се учитају",
+1
View File
@@ -17,6 +17,7 @@ OC.L10N.register(
"Delete comment" : "Yorumu sil",
"Cancel edit" : "Düzenlemeyi iptal et",
"New comment" : "Yorum ekle",
"Write a comment …" : "Bir yorum yazın…",
"Post comment" : "Yorum gönder",
"@ for mentions, : for emoji, / for smart picker" : "Anmalar için @, emojiler için :, akıllı seçici için /",
"Could not reload comments" : "Yorumlar yeniden yüklenemedi",
+1
View File
@@ -15,6 +15,7 @@
"Delete comment" : "Yorumu sil",
"Cancel edit" : "Düzenlemeyi iptal et",
"New comment" : "Yorum ekle",
"Write a comment …" : "Bir yorum yazın…",
"Post comment" : "Yorum gönder",
"@ for mentions, : for emoji, / for smart picker" : "Anmalar için @, emojiler için :, akıllı seçici için /",
"Could not reload comments" : "Yorumlar yeniden yüklenemedi",
@@ -8,6 +8,13 @@ declare(strict_types=1);
*/
namespace OCA\Comments\Search;
use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager;
use OCP\Files\Folder;
use OCP\Files\InvalidPathException;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
@@ -16,14 +23,14 @@ use OCP\Search\IProvider;
use OCP\Search\ISearchQuery;
use OCP\Search\SearchResult;
use OCP\Search\SearchResultEntry;
use function array_map;
class CommentsSearchProvider implements IProvider {
public function __construct(
private IUserManager $userManager,
private IL10N $l10n,
private IURLGenerator $urlGenerator,
private LegacyProvider $legacyProvider,
private ICommentsManager $commentsManager,
private IRootFolder $rootFolder,
) {
}
@@ -44,30 +51,76 @@ class CommentsSearchProvider implements IProvider {
}
public function search(IUser $user, ISearchQuery $query): SearchResult {
$userFolder = $this->rootFolder->getUserFolder($user->getUID());
if ($userFolder === null) {
return SearchResult::complete($this->l10n->t('Comments'), []);
}
$result = [];
$numComments = 50;
$offset = 0;
while (count($result) < $numComments) {
$comments = $this->commentsManager->search($query->getTerm(), 'files', '', 'comment', $offset, $numComments);
foreach ($comments as $comment) {
if ($comment->getActorType() !== 'users') {
continue;
}
$displayName = $this->commentsManager->resolveDisplayName('user', $comment->getActorId());
try {
$file = $this->getFileForComment($userFolder, $comment);
$isUser = $this->userManager->userExists($comment->getActorId());
$avatarUrl = $isUser
? $this->urlGenerator->linkToRouteAbsolute('core.avatar.getAvatar', ['userId' => $comment->getActorId(), 'size' => 42])
: $this->urlGenerator->linkToRouteAbsolute('core.GuestAvatar.getAvatar', ['guestName' => $comment->getActorId(), 'size' => 42]);
$link = $this->urlGenerator->linkToRoute(
'files.View.showFile',
['fileid' => $file->getId()]
);
$result[] = new SearchResultEntry(
$avatarUrl,
$displayName,
$file->getPath(),
$link,
'',
true
);
} catch (NotFoundException|InvalidPathException $e) {
continue;
}
}
if (count($comments) < $numComments) {
// Didn't find more comments when we tried to get, so there are no more comments.
break;
}
$offset += $numComments;
$numComments = 50 - count($result);
}
return SearchResult::complete(
$this->l10n->t('Comments'),
array_map(function (Result $result) {
$path = $result->path;
$isUser = $this->userManager->userExists($result->authorId);
$avatarUrl = $isUser
? $this->urlGenerator->linkToRouteAbsolute('core.avatar.getAvatar', ['userId' => $result->authorId, 'size' => 42])
: $this->urlGenerator->linkToRouteAbsolute('core.GuestAvatar.getAvatar', ['guestName' => $result->authorId, 'size' => 42]);
$link = $this->urlGenerator->linkToRoute(
'files.View.showFile',
['fileid' => $result->fileId]
);
$searchResultEntry = new SearchResultEntry(
$avatarUrl,
$result->name,
$path,
$link,
'',
true
);
$searchResultEntry->addAttribute('fileId', (string)$result->fileId);
$searchResultEntry->addAttribute('path', $path);
return $searchResultEntry;
}, $this->legacyProvider->search($query->getTerm()))
$result,
);
}
/**
* @throws NotFoundException
*/
protected function getFileForComment(Folder $userFolder, IComment $comment): Node {
$nodes = $userFolder->getById((int)$comment->getObjectId());
if (empty($nodes)) {
throw new NotFoundException('File not found');
}
return array_shift($nodes);
}
}
@@ -1,99 +0,0 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Comments\Search;
use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager;
use OCP\Files\Folder;
use OCP\Files\InvalidPathException;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IUser;
use OCP\IUserSession;
use OCP\Search\Provider;
use OCP\Server;
use function count;
class LegacyProvider extends Provider {
/**
* Search for $query
*
* @param string $query
* @return array An array of OCP\Search\Result's
* @since 7.0.0
*/
public function search($query): array {
$cm = Server::get(ICommentsManager::class);
$us = Server::get(IUserSession::class);
$user = $us->getUser();
if (!$user instanceof IUser) {
return [];
}
$uf = \OC::$server->getUserFolder($user->getUID());
if ($uf === null) {
return [];
}
$result = [];
$numComments = 50;
$offset = 0;
while (count($result) < $numComments) {
/** @var IComment[] $comments */
$comments = $cm->search($query, 'files', '', 'comment', $offset, $numComments);
foreach ($comments as $comment) {
if ($comment->getActorType() !== 'users') {
continue;
}
$displayName = $cm->resolveDisplayName('user', $comment->getActorId());
try {
$file = $this->getFileForComment($uf, $comment);
$result[] = new Result($query,
$comment,
$displayName,
$file->getPath(),
$file->getId(),
);
} catch (NotFoundException|InvalidPathException $e) {
continue;
}
}
if (count($comments) < $numComments) {
// Didn't find more comments when we tried to get, so there are no more comments.
return $result;
}
$offset += $numComments;
$numComments = 50 - count($result);
}
return $result;
}
/**
* @param Folder $userFolder
* @param IComment $comment
* @return Node
* @throws NotFoundException
*/
protected function getFileForComment(Folder $userFolder, IComment $comment): Node {
$nodes = $userFolder->getById((int)$comment->getObjectId());
if (empty($nodes)) {
throw new NotFoundException('File not found');
}
return array_shift($nodes);
}
}
-109
View File
@@ -1,109 +0,0 @@
<?php
/**
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Comments\Search;
use OCP\Comments\IComment;
use OCP\Files\NotFoundException;
use OCP\Search\Result as BaseResult;
/**
* @deprecated 20.0.0
*/
class Result extends BaseResult {
/**
* @deprecated 20.0.0
*/
public $type = 'comment';
/**
* @deprecated 20.0.0
*/
public $comment;
/**
* @deprecated 20.0.0
*/
public $authorId;
/**
* @deprecated 20.0.0
*/
public $path;
/**
* @deprecated 20.0.0
*/
public $fileName;
/**
* @throws NotFoundException
* @deprecated 20.0.0
*/
public function __construct(
string $search,
IComment $comment,
/**
* @deprecated 20.0.0
*/
public string $authorName,
string $path,
/**
* @deprecated 20.0.0
*/
public int $fileId,
) {
parent::__construct(
$comment->getId(),
$comment->getMessage()
/* @todo , [link to file] */
);
$this->comment = $this->getRelevantMessagePart($comment->getMessage(), $search);
$this->authorId = $comment->getActorId();
$this->fileName = basename($path);
$this->path = $this->getVisiblePath($path);
}
/**
* @throws NotFoundException
*/
protected function getVisiblePath(string $path): string {
$segments = explode('/', trim($path, '/'), 3);
if (!isset($segments[2])) {
throw new NotFoundException('Path not inside visible section');
}
return $segments[2];
}
/**
* @throws NotFoundException
*/
protected function getRelevantMessagePart(string $message, string $search): string {
$start = mb_stripos($message, $search);
if ($start === false) {
throw new NotFoundException('Comment section not found');
}
$end = $start + mb_strlen($search);
if ($start <= 25) {
$start = 0;
$prefix = '';
} else {
$start -= 25;
$prefix = '…';
}
if ((mb_strlen($message) - $end) <= 25) {
$end = mb_strlen($message);
$suffix = '';
} else {
$end += 25;
$suffix = '…';
}
return $prefix . mb_substr($message, $start, $end - $start) . $suffix;
}
}
@@ -41,7 +41,7 @@ class OutOfOfficeEventDispatcherJob extends QueuedJob {
try {
$absence = $this->absenceMapper->findById($id);
} catch (DoesNotExistException|\OCP\DB\Exception $e) {
} catch (DoesNotExistException $e) {
$this->logger->error('Failed to dispatch out-of-office event: ' . $e->getMessage(), [
'exception' => $e,
'argument' => $argument,
@@ -16,6 +16,7 @@ use OCP\IUser;
use OCP\L10N\IFactory as L10NFactory;
use OCP\Mail\Headers\AutoSubmitted;
use OCP\Mail\IEMailTemplate;
use OCP\Mail\IEmailValidator;
use OCP\Mail\IMailer;
use OCP\Util;
use Psr\Log\LoggerInterface;
@@ -39,6 +40,7 @@ class EmailProvider extends AbstractProvider {
LoggerInterface $logger,
L10NFactory $l10nFactory,
IURLGenerator $urlGenerator,
private IEmailValidator $emailValidator,
) {
parent::__construct($logger, $l10nFactory, $urlGenerator, $config);
}
@@ -96,7 +98,7 @@ class EmailProvider extends AbstractProvider {
$template->addFooter();
foreach ($emailAddresses as $emailAddress) {
if (!$this->mailer->validateMailAddress($emailAddress)) {
if (!$this->emailValidator->isValid($emailAddress)) {
$this->logger->error('Email address {address} for reminder notification is incorrect', ['app' => 'dav', 'address' => $emailAddress]);
continue;
}
@@ -180,7 +182,7 @@ class EmailProvider extends AbstractProvider {
$organizerEMail = substr($organizer->getValue(), 7);
if (!$this->mailer->validateMailAddress($organizerEMail)) {
if (!$this->emailValidator->isValid($organizerEMail)) {
return null;
}
@@ -251,7 +253,7 @@ class EmailProvider extends AbstractProvider {
foreach ($emailAddressesOfDelegates as $addressesOfDelegate) {
if (strcasecmp($addressesOfDelegate, 'mailto:') === 0) {
$delegateEmail = substr($addressesOfDelegate, 7);
if ($this->mailer->validateMailAddress($delegateEmail)) {
if ($this->emailValidator->isValid($delegateEmail)) {
$emailAddresses[$delegateEmail] = [];
}
}
@@ -311,7 +313,7 @@ class EmailProvider extends AbstractProvider {
return null;
}
$attendeeEMail = substr($attendee->getValue(), 7);
if (!$this->mailer->validateMailAddress($attendeeEMail)) {
if (!$this->emailValidator->isValid($attendeeEMail)) {
return null;
}
+3 -1
View File
@@ -14,6 +14,7 @@ use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Defaults;
use OCP\IAppConfig;
use OCP\IUserSession;
use OCP\Mail\IEmailValidator;
use OCP\Mail\IMailer;
use OCP\Mail\Provider\Address;
use OCP\Mail\Provider\Attachment;
@@ -63,6 +64,7 @@ class IMipPlugin extends SabreIMipPlugin {
private IMipService $imipService,
private EventComparisonService $eventComparisonService,
private IMailManager $mailManager,
private IEmailValidator $emailValidator,
) {
parent::__construct('');
}
@@ -119,7 +121,7 @@ class IMipPlugin extends SabreIMipPlugin {
// Strip off mailto:
$recipient = substr($iTipMessage->recipient, 7);
if (!$this->mailer->validateMailAddress($recipient)) {
if (!$this->emailValidator->isValid($recipient)) {
// Nothing to send if the recipient doesn't have a valid email address
$iTipMessage->scheduleStatus = '5.0; EMail delivery failed';
return;
+1 -1
View File
@@ -693,7 +693,7 @@ class FilesPlugin extends ServerPlugin {
private function initFilesMetadataManager(): IFilesMetadataManager {
/** @var IFilesMetadataManager $manager */
$manager = \OCP\Server::get(IFilesMetadataManager::class);
$manager->initMetadata('files-live-photo', IMetadataValueWrapper::TYPE_STRING, false, IMetadataValueWrapper::EDIT_REQ_OWNERSHIP);
$manager->initMetadata('files-live-photo', IMetadataValueWrapper::TYPE_STRING, false, IMetadataValueWrapper::EDIT_REQ_WRITE_PERMISSION);
return $manager;
}
-11
View File
@@ -32,13 +32,6 @@ abstract class Node implements \Sabre\DAV\INode {
*/
protected $path;
/**
* node properties cache
*
* @var array
*/
protected $property_cache = null;
protected FileInfo $info;
/**
@@ -140,10 +133,6 @@ abstract class Node implements \Sabre\DAV\INode {
$this->refreshInfo();
}
public function setPropertyCache($property_cache) {
$this->property_cache = $property_cache;
}
/**
* Returns the last modification time, as a unix timestamp
*
@@ -18,7 +18,7 @@ use OCP\EventDispatcher\IEventDispatcher;
use OCP\EventDispatcher\IEventListener;
use OCP\IUser;
use OCP\IUserSession;
use OCP\Mail\IMailer;
use OCP\Mail\IEmailValidator;
use Psr\Log\LoggerInterface;
use Sabre\VObject\Component\VEvent;
use Sabre\VObject\Parameter;
@@ -36,7 +36,7 @@ class CalendarContactInteractionListener implements IEventListener {
private IEventDispatcher $dispatcher,
private IUserSession $userSession,
private Principal $principalConnector,
private IMailer $mailer,
private IEmailValidator $emailValidator,
private LoggerInterface $logger,
) {
}
@@ -129,7 +129,7 @@ class CalendarContactInteractionListener implements IEventListener {
continue;
}
$email = substr($mailTo, strlen('mailto:'));
if (!$this->mailer->validateMailAddress($email)) {
if (!$this->emailValidator->isValid($email)) {
// This really isn't a valid email
continue;
}
+1 -1
View File
@@ -199,7 +199,7 @@ class EventsSearchProvider extends ACalendarSearchProvider implements IFiltering
[,, $principalId] = explode('/', $principalUri, 3);
return $this->urlGenerator->linkTo('', 'remote.php') . '/dav/calendars/'
. rawurlencode($principalId) . '/'
. str_replace(' ', '%20', $principalId) . '/'
. $calendarUri . '/'
. $calendarObjectUri;
}
+2 -1
View File
@@ -350,7 +350,8 @@ class Server {
$userSession,
\OCP\Server::get(IMipService::class),
\OCP\Server::get(EventComparisonService::class),
\OCP\Server::get(\OCP\Mail\Provider\IManager::class)
\OCP\Server::get(\OCP\Mail\Provider\IManager::class),
\OCP\Server::get(\OCP\Mail\IEmailValidator::class),
));
}
$this->server->addPlugin(new \OCA\DAV\CalDAV\Search\SearchPlugin());
@@ -17,8 +17,10 @@ use OCP\Mail\IMessage;
use OCP\Util;
use PHPUnit\Framework\MockObject\MockObject;
use Sabre\VObject\Component\VCalendar;
use Test\Traits\EmailValidatorTrait;
class EmailProviderTest extends AbstractNotificationProviderTestCase {
use EmailValidatorTrait;
public const USER_EMAIL = 'frodo@hobb.it';
private IMailer&MockObject $mailer;
@@ -32,7 +34,8 @@ class EmailProviderTest extends AbstractNotificationProviderTestCase {
$this->mailer,
$this->logger,
$this->l10nFactory,
$this->urlGenerator
$this->urlGenerator,
$this->getEmailValidatorWithStrictEmailCheck(),
);
}
@@ -93,15 +96,6 @@ class EmailProviderTest extends AbstractNotificationProviderTestCase {
$template2
);
$this->mailer->expects($this->exactly(4))
->method('validateMailAddress')
->willReturnMap([
['uid1@example.com', true],
['uid2@example.com', true],
['uid3@example.com', true],
['invalid', false],
]);
$this->mailer->expects($this->exactly(3))
->method('createMessage')
->with()
@@ -189,17 +183,6 @@ class EmailProviderTest extends AbstractNotificationProviderTestCase {
$template1,
$template2,
);
$this->mailer->expects($this->atLeastOnce())
->method('validateMailAddress')
->willReturnMap([
['foo1@example.org', true],
['foo3@example.org', true],
['foo4@example.org', true],
['uid1@example.com', true],
['uid2@example.com', true],
['uid3@example.com', true],
['invalid', false],
]);
$this->mailer->expects($this->exactly(6))
->method('createMessage')
->with()
@@ -277,17 +260,6 @@ class EmailProviderTest extends AbstractNotificationProviderTestCase {
->willReturnOnConsecutiveCalls(
$template1,
);
$this->mailer->expects($this->atLeastOnce())
->method('validateMailAddress')
->willReturnMap([
['foo1@example.org', true],
['foo3@example.org', true],
['foo4@example.org', true],
['uid1@example.com', true],
['uid2@example.com', true],
['uid3@example.com', true],
['invalid', false],
]);
$this->mailer->expects($this->exactly(2))
->method('createMessage')
->with()
@@ -38,8 +38,10 @@ use Sabre\VObject\ITip\Message;
use Sabre\VObject\Property\ICalendar\CalAddress;
use Symfony\Component\Mime\Email;
use Test\TestCase;
use Test\Traits\EmailValidatorTrait;
class IMipPluginCharsetTest extends TestCase {
use EmailValidatorTrait;
// Dependencies
private Defaults&MockObject $defaults;
private IAppConfig&MockObject $appConfig;
@@ -102,8 +104,6 @@ class IMipPluginCharsetTest extends TestCase {
$this->mailer = $this->createMock(IMailer::class);
$this->mailer->method('createMessage')
->willReturn($message);
$this->mailer->method('validateMailAddress')
->willReturn(true);
$this->logger = new NullLogger();
$this->defaults = $this->createMock(Defaults::class);
$this->defaults->method('getName')
@@ -125,6 +125,7 @@ class IMipPluginCharsetTest extends TestCase {
$this->imipService,
$this->eventComparisonService,
$this->mailManager,
$this->getEmailValidatorWithStrictEmailCheck(),
);
// ITipMessage
@@ -30,6 +30,7 @@ use Sabre\VObject\Component\VCalendar;
use Sabre\VObject\Component\VEvent;
use Sabre\VObject\ITip\Message;
use Test\TestCase;
use Test\Traits\EmailValidatorTrait;
use function array_merge;
interface IMailServiceMock extends IMailService, IMailMessageSend {
@@ -38,6 +39,8 @@ interface IMailServiceMock extends IMailService, IMailMessageSend {
}
class IMipPluginTest extends TestCase {
use EmailValidatorTrait;
private IMessage&MockObject $mailMessage;
private IMailer&MockObject $mailer;
private IEMailTemplate&MockObject $emailTemplate;
@@ -107,6 +110,7 @@ class IMipPluginTest extends TestCase {
$this->service,
$this->eventComparisonService,
$this->mailManager,
$this->getEmailValidatorWithStrictEmailCheck(),
);
}
@@ -173,10 +177,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['new' => [$newVevent], 'old' => [$oldVEvent]]);
@@ -280,10 +280,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('the-shire@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['new' => [$newVevent], 'old' => [$oldVEvent]]);
@@ -358,10 +354,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('circle+82utEV1Fle8wvxndZLK5TVAPtxj8IIe@middle.earth')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['new' => [$newVevent], 'old' => null]);
@@ -463,10 +455,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['old' => [] ,'new' => [$newVevent]]);
@@ -541,15 +529,11 @@ class IMipPluginTest extends TestCase {
$message->message->VEVENT->add('ATTENDEE', 'mailto:' . 'frodo@hobb.it', ['RSVP' => 'TRUE']);
$message->sender = 'mailto:gandalf@wiz.ard';
$message->senderName = 'Mr. Wizard';
$message->recipient = 'mailto:' . 'frodo@hobb.it';
$message->recipient = 'mailto:' . 'frodo@@hobb.it';
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(false);
$this->plugin->schedule($message);
$this->assertEquals('5.0', $message->getScheduleStatus());
@@ -598,10 +582,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['old' => [] ,'new' => [$newVevent]]);
@@ -755,11 +735,6 @@ class IMipPluginTest extends TestCase {
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['old' => [] ,'new' => [$event]]);
// construct mail mock returns
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
// construct mail provider mock returns
$this->mailService
->method('initiateMessage')
@@ -819,10 +794,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->willReturn(['new' => [$newVevent], 'old' => [$oldVEvent]]);
@@ -917,10 +888,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->with($newVCalendar, null)
@@ -1014,10 +981,6 @@ class IMipPluginTest extends TestCase {
$this->service->expects(self::once())
->method('getLastOccurrence')
->willReturn(1496912700);
$this->mailer->expects(self::once())
->method('validateMailAddress')
->with('frodo@hobb.it')
->willReturn(true);
$this->eventComparisonService->expects(self::once())
->method('findModified')
->with($newVCalendar, null)
@@ -17,17 +17,18 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IUser;
use OCP\IUserSession;
use OCP\Mail\IMailer;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
use Test\Traits\EmailValidatorTrait;
class CalendarContactInteractionListenerTest extends TestCase {
use EmailValidatorTrait;
private IEventDispatcher&MockObject $eventDispatcher;
private IUserSession&MockObject $userSession;
private Principal&MockObject $principalConnector;
private LoggerInterface&MockObject $logger;
private IMailer&MockObject $mailer;
private CalendarContactInteractionListener $listener;
protected function setUp(): void {
@@ -36,14 +37,13 @@ class CalendarContactInteractionListenerTest extends TestCase {
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->principalConnector = $this->createMock(Principal::class);
$this->mailer = $this->createMock(IMailer::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->listener = new CalendarContactInteractionListener(
$this->eventDispatcher,
$this->userSession,
$this->principalConnector,
$this->mailer,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->logger
);
}
@@ -162,7 +162,6 @@ END:VCALENDAR
EVENT]);
$user = $this->createMock(IUser::class);
$this->userSession->expects(self::once())->method('getUser')->willReturn($user);
$this->mailer->expects(self::once())->method('validateMailAddress')->willReturn(true);
$this->eventDispatcher->expects(self::once())
->method('dispatchTyped')
->with(self::equalTo((new ContactInteractedWithEvent($user))->setEmail('user@domain.tld')));
@@ -404,6 +404,7 @@ class EventsSearchProviderTest extends TestCase {
return [
['principals/users/john.doe', 'bGluay10by1yZW1vdGUucGhwL2Rhdi9jYWxlbmRhcnMvam9obi5kb2UvZm9vL2Jhci5pY3M='],
['principals/users/John Doe', 'bGluay10by1yZW1vdGUucGhwL2Rhdi9jYWxlbmRhcnMvSm9obiUyMERvZS9mb28vYmFyLmljcw=='],
['principals/users/john@doe', 'bGluay10by1yZW1vdGUucGhwL2Rhdi9jYWxlbmRhcnMvam9obkBkb2UvZm9vL2Jhci5pY3M='],
];
}
+9
View File
@@ -124,6 +124,8 @@ OC.L10N.register(
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
"File not found" : "Faili ei leitud",
"_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
"Search everywhere …" : "Otsi kõikjalt…",
"Search here …" : "Otsi siin…",
"Search scope options" : "Otsinguulatuse valikud",
"Search here" : "Otsi siin",
"{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
@@ -142,6 +144,7 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Failinime normaliseerimise oleku uuendamine ei õnnestunud.",
"Filename sanitization in progress." : "Failinime normaliseerimise on töös.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Hetkel töödeldud kasutajakontosid: {processedUsers}/{totalUsers}.",
"Preparing …" : "Ettevalmistamisel…",
"Refresh" : "Värskenda",
"All files have been santized for Windows filename support." : "Kõik failid on normaliseeritud vastavalt Windowsi failinimede toele.",
"Some files could not be sanitized, please check your logs." : "Mõnede failide normaliseerimine ei õnnestunud, palun vaata lisateavet logidest.",
@@ -156,6 +159,7 @@ OC.L10N.register(
"Sanitize filenames" : "Normaliseeri failinimed",
"(starting)" : "(alustamisel)",
"Fill template fields" : "Täida malli väljad",
"Submitting fields …" : "Saadan välju…",
"Submit" : "Saada",
"Choose a file or folder to transfer" : "Vali üleantav fail või kaust",
"Transfer" : "Anna üle teisele kasutajale",
@@ -268,6 +272,8 @@ OC.L10N.register(
"Create a new file with the selected template" : "Loo valitud malli alusel uus fail",
"Creating file" : "Fail on loomisel",
"Save as {displayName}" : "Salvesta kui „{displayName}“",
"Save as …" : "Salvesta kui…",
"Converting files …" : "Teisendan faile…",
"Failed to convert files: {message}" : "Failide teisendamine ei õnnestunud: {message}",
"All files failed to be converted" : "Kõiki faile ei õnnestunud teisendada",
"One file could not be converted: {message}" : "Ühe faili teisendamine ei õnnestunud: {message}",
@@ -275,6 +281,7 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["Ühe faili teisendamine õnnestus","%n faili teisendamine õnnestus"],
"Files successfully converted" : "Failide teisendamine õnnestus",
"Failed to convert files" : "Failide teisendamine ei õnnestunud",
"Converting file …" : "Teisendan faile…",
"File successfully converted" : "Faili teisendamine õnnestus",
"Failed to convert file: {message}" : "Faili teisendamine ei õnnestunud: {message}",
"Failed to convert file" : "Faili teisendamine ei õnnestunud",
@@ -295,6 +302,8 @@ OC.L10N.register(
"Download" : "Laadi alla",
"The requested file is not available." : "Soovitud fail pole saadaval.",
"The requested files are not available." : "Soovitud failid pole saadaval.",
"Moving \"{source}\" to \"{destination}\" …" : "Teisaldan „{source}“ → „{destination}“…",
"Copying \"{source}\" to \"{destination}\" …" : "Kopeerin „{source}“ → „{destination}“…",
"Destination is not a folder" : "Sihtasukoht pole kaust",
"This file/folder is already in that directory" : "See fail või kaust juba asub selles kaustas",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Sa ei saa faili või kausta iseendaks teisaldada ega teisaldada kausta iseenda alamkausta",
+9
View File
@@ -122,6 +122,8 @@
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
"File not found" : "Faili ei leitud",
"_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
"Search everywhere …" : "Otsi kõikjalt…",
"Search here …" : "Otsi siin…",
"Search scope options" : "Otsinguulatuse valikud",
"Search here" : "Otsi siin",
"{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
@@ -140,6 +142,7 @@
"Failed to refresh filename sanitization status." : "Failinime normaliseerimise oleku uuendamine ei õnnestunud.",
"Filename sanitization in progress." : "Failinime normaliseerimise on töös.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Hetkel töödeldud kasutajakontosid: {processedUsers}/{totalUsers}.",
"Preparing …" : "Ettevalmistamisel…",
"Refresh" : "Värskenda",
"All files have been santized for Windows filename support." : "Kõik failid on normaliseeritud vastavalt Windowsi failinimede toele.",
"Some files could not be sanitized, please check your logs." : "Mõnede failide normaliseerimine ei õnnestunud, palun vaata lisateavet logidest.",
@@ -154,6 +157,7 @@
"Sanitize filenames" : "Normaliseeri failinimed",
"(starting)" : "(alustamisel)",
"Fill template fields" : "Täida malli väljad",
"Submitting fields …" : "Saadan välju…",
"Submit" : "Saada",
"Choose a file or folder to transfer" : "Vali üleantav fail või kaust",
"Transfer" : "Anna üle teisele kasutajale",
@@ -266,6 +270,8 @@
"Create a new file with the selected template" : "Loo valitud malli alusel uus fail",
"Creating file" : "Fail on loomisel",
"Save as {displayName}" : "Salvesta kui „{displayName}“",
"Save as …" : "Salvesta kui…",
"Converting files …" : "Teisendan faile…",
"Failed to convert files: {message}" : "Failide teisendamine ei õnnestunud: {message}",
"All files failed to be converted" : "Kõiki faile ei õnnestunud teisendada",
"One file could not be converted: {message}" : "Ühe faili teisendamine ei õnnestunud: {message}",
@@ -273,6 +279,7 @@
"_One file successfully converted_::_%n files successfully converted_" : ["Ühe faili teisendamine õnnestus","%n faili teisendamine õnnestus"],
"Files successfully converted" : "Failide teisendamine õnnestus",
"Failed to convert files" : "Failide teisendamine ei õnnestunud",
"Converting file …" : "Teisendan faile…",
"File successfully converted" : "Faili teisendamine õnnestus",
"Failed to convert file: {message}" : "Faili teisendamine ei õnnestunud: {message}",
"Failed to convert file" : "Faili teisendamine ei õnnestunud",
@@ -293,6 +300,8 @@
"Download" : "Laadi alla",
"The requested file is not available." : "Soovitud fail pole saadaval.",
"The requested files are not available." : "Soovitud failid pole saadaval.",
"Moving \"{source}\" to \"{destination}\" …" : "Teisaldan „{source}“ → „{destination}“…",
"Copying \"{source}\" to \"{destination}\" …" : "Kopeerin „{source}“ → „{destination}“…",
"Destination is not a folder" : "Sihtasukoht pole kaust",
"This file/folder is already in that directory" : "See fail või kaust juba asub selles kaustas",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Sa ei saa faili või kausta iseendaks teisaldada ega teisaldada kausta iseenda alamkausta",
+9
View File
@@ -124,6 +124,8 @@ OC.L10N.register(
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"File not found" : "Dosya bulunamadı",
"_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
"Search everywhere …" : "Her yerde ara…",
"Search here …" : "Burada ara…",
"Search scope options" : "Arama kapsamı seçenekleri",
"Search here" : "Burada ara",
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
@@ -142,6 +144,7 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Dosya adı sadeleştirmesi durumu yenilenemedi.",
"Filename sanitization in progress." : "Dosya adı sadeleştirmesi işleniyor.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "{processedUsers} / {totalUsers} hesap zaten işlenmiş.",
"Preparing …" : "Hazırlanıyor…",
"Refresh" : "Yenlle",
"All files have been santized for Windows filename support." : "Tüm dosya adları Windows dosya adı desteğine göre temizlendi.",
"Some files could not be sanitized, please check your logs." : "Bazı dosya adları sadeleştirilemedi. Lütfen günlük kayıtlarına bakın.",
@@ -156,6 +159,7 @@ OC.L10N.register(
"Sanitize filenames" : "Dosya adlarını sadeleştir",
"(starting)" : "(başlatılıyor)",
"Fill template fields" : "Kalıp alanlarını doldur",
"Submitting fields …" : "Alanlar gönderiliyor…",
"Submit" : "Gönder",
"Choose a file or folder to transfer" : "Sahipliği aktarılacak bir dosya ya da klasör seçin",
"Transfer" : "Sahipliği aktar",
@@ -268,6 +272,8 @@ OC.L10N.register(
"Create a new file with the selected template" : "Seçilmiş kalıp ile yeni bir dosya ekle",
"Creating file" : "Dosya ekleniyor",
"Save as {displayName}" : "{displayName} olarak kaydet",
"Save as …" : "Farklı kaydet…",
"Converting files …" : "Dosyalar dönüştürülüyor…",
"Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
"All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
"One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
@@ -275,6 +281,7 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["Bir dosya dönüştürüldü","%n dosya dönüştürüldü"],
"Files successfully converted" : "Dosyalar dönüştürüldü",
"Failed to convert files" : "Dosyalar dönüştürülemedi",
"Converting file …" : "Dosya dönüştürülüyor…",
"File successfully converted" : "Dosya dönüştürüldü",
"Failed to convert file: {message}" : "Dosya dönüştürülemedi: {message}",
"Failed to convert file" : "Dosya dönüştürülemedi",
@@ -295,6 +302,8 @@ OC.L10N.register(
"Download" : "İndir",
"The requested file is not available." : "İstenilen dosya kullanılamıyor.",
"The requested files are not available." : "İstenilen dosyalar kullanılamıyor.",
"Moving \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" üzerine taşınıyor…",
"Copying \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" üzerine kopyalanıyor…",
"Destination is not a folder" : "Hedef bir klasör değil",
"This file/folder is already in that directory" : "Dosya ya da klasör bu klasörde zaten var",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Bir dosyayı ya da klasörü kendi üzerine veya kendisinin alt klasörüne taşıyamazsınız",
+9
View File
@@ -122,6 +122,8 @@
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"File not found" : "Dosya bulunamadı",
"_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
"Search everywhere …" : "Her yerde ara…",
"Search here …" : "Burada ara…",
"Search scope options" : "Arama kapsamı seçenekleri",
"Search here" : "Burada ara",
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
@@ -140,6 +142,7 @@
"Failed to refresh filename sanitization status." : "Dosya adı sadeleştirmesi durumu yenilenemedi.",
"Filename sanitization in progress." : "Dosya adı sadeleştirmesi işleniyor.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "{processedUsers} / {totalUsers} hesap zaten işlenmiş.",
"Preparing …" : "Hazırlanıyor…",
"Refresh" : "Yenlle",
"All files have been santized for Windows filename support." : "Tüm dosya adları Windows dosya adı desteğine göre temizlendi.",
"Some files could not be sanitized, please check your logs." : "Bazı dosya adları sadeleştirilemedi. Lütfen günlük kayıtlarına bakın.",
@@ -154,6 +157,7 @@
"Sanitize filenames" : "Dosya adlarını sadeleştir",
"(starting)" : "(başlatılıyor)",
"Fill template fields" : "Kalıp alanlarını doldur",
"Submitting fields …" : "Alanlar gönderiliyor…",
"Submit" : "Gönder",
"Choose a file or folder to transfer" : "Sahipliği aktarılacak bir dosya ya da klasör seçin",
"Transfer" : "Sahipliği aktar",
@@ -266,6 +270,8 @@
"Create a new file with the selected template" : "Seçilmiş kalıp ile yeni bir dosya ekle",
"Creating file" : "Dosya ekleniyor",
"Save as {displayName}" : "{displayName} olarak kaydet",
"Save as …" : "Farklı kaydet…",
"Converting files …" : "Dosyalar dönüştürülüyor…",
"Failed to convert files: {message}" : "Dosyalar dönüştürülemedi: {message}",
"All files failed to be converted" : "Tüm dosyalar dönüştürülemedi",
"One file could not be converted: {message}" : "Bir dosya dönüştürülemedi: {message}",
@@ -273,6 +279,7 @@
"_One file successfully converted_::_%n files successfully converted_" : ["Bir dosya dönüştürüldü","%n dosya dönüştürüldü"],
"Files successfully converted" : "Dosyalar dönüştürüldü",
"Failed to convert files" : "Dosyalar dönüştürülemedi",
"Converting file …" : "Dosya dönüştürülüyor…",
"File successfully converted" : "Dosya dönüştürüldü",
"Failed to convert file: {message}" : "Dosya dönüştürülemedi: {message}",
"Failed to convert file" : "Dosya dönüştürülemedi",
@@ -293,6 +300,8 @@
"Download" : "İndir",
"The requested file is not available." : "İstenilen dosya kullanılamıyor.",
"The requested files are not available." : "İstenilen dosyalar kullanılamıyor.",
"Moving \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" üzerine taşınıyor…",
"Copying \"{source}\" to \"{destination}\" …" : "\"{source}\", \"{destination}\" üzerine kopyalanıyor…",
"Destination is not a folder" : "Hedef bir klasör değil",
"This file/folder is already in that directory" : "Dosya ya da klasör bu klasörde zaten var",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Bir dosyayı ya da klasörü kendi üzerine veya kendisinin alt klasörüne taşıyamazsınız",
+1 -1
View File
@@ -25,7 +25,7 @@ class RepairTree extends Command {
protected function configure(): void {
$this
->setName('files:repair-tree')
->setDescription('Try and repair malformed filesystem tree structures')
->setDescription('Try and repair malformed filesystem tree structures (may be necessary to run multiple times for nested malformations)')
->addOption('dry-run');
}
+1
View File
@@ -103,6 +103,7 @@ OC.L10N.register(
"Enter missing credentials" : "Унесите корисничке акредитиве који недостају",
"Credentials successfully set" : "Акредитиви су успешно постављени",
"Error while setting credentials: {error}" : "Грешка приликом постављања акредитива: {error}",
"Checking storage …" : "Проверава се складиште …",
"There was an error with this external storage." : "Дошло је до грешке у вези са овим спољним складиштем.",
"We were unable to check the external storage {basename}" : "Нисмо успели да проверимо спољно складиште {basename}",
"Examine this faulty external storage configuration" : "Испитајте ову неисправну конфигурацију спољног складишта",
+1
View File
@@ -101,6 +101,7 @@
"Enter missing credentials" : "Унесите корисничке акредитиве који недостају",
"Credentials successfully set" : "Акредитиви су успешно постављени",
"Error while setting credentials: {error}" : "Грешка приликом постављања акредитива: {error}",
"Checking storage …" : "Проверава се складиште …",
"There was an error with this external storage." : "Дошло је до грешке у вези са овим спољним складиштем.",
"We were unable to check the external storage {basename}" : "Нисмо успели да проверимо спољно складиште {basename}",
"Examine this faulty external storage configuration" : "Испитајте ову неисправну конфигурацију спољног складишта",
+1
View File
@@ -103,6 +103,7 @@ OC.L10N.register(
"Enter missing credentials" : "Eksik kimlik doğrulama bilgilerini yazın",
"Credentials successfully set" : "Kimlik doğrulama bilgileri ayarlandı",
"Error while setting credentials: {error}" : "Kimlik doğrulama bilgileri ayarlanırken sorun çıktı: {error}",
"Checking storage …" : "Depolama alanı denetleniyor…",
"There was an error with this external storage." : " Bu dış depolama birimi ile ilgili bir sorun çıktı.",
"We were unable to check the external storage {basename}" : "{basename} dış depolama birimi denetlenemedi",
"Examine this faulty external storage configuration" : "Bu sorunlu dış depolama birimi yapılandırmasını gözden geçirin",
+1
View File
@@ -101,6 +101,7 @@
"Enter missing credentials" : "Eksik kimlik doğrulama bilgilerini yazın",
"Credentials successfully set" : "Kimlik doğrulama bilgileri ayarlandı",
"Error while setting credentials: {error}" : "Kimlik doğrulama bilgileri ayarlanırken sorun çıktı: {error}",
"Checking storage …" : "Depolama alanı denetleniyor…",
"There was an error with this external storage." : " Bu dış depolama birimi ile ilgili bir sorun çıktı.",
"We were unable to check the external storage {basename}" : "{basename} dış depolama birimi denetlenemedi",
"Examine this faulty external storage configuration" : "Bu sorunlu dış depolama birimi yapılandırmasını gözden geçirin",
+3
View File
@@ -119,10 +119,12 @@ OC.L10N.register(
"Revert to default" : "Sugrąžinti į numatytąjį",
"Close" : "Užverti",
"_Send email and close_::_Send {count} emails and close_" : ["Išsiųsti el. laišką ir užverti","Išsiųsti {count} el. laiškus ir užverti","Išsiųsti {count} el. laiškų ir užverti","Išsiųsti {count} el. laišką ir užverti"],
"File request created" : "Viešinys failų įkėlimui sukurtas",
"Error creating the share: {errorMessage}" : "Klaida kuriant viešinį: {errorMessage}",
"Error creating the share" : "Klaida kuriant viešinį",
"Error sending emails: {errorMessage}" : "Klaida siunčiant el. laiškus: {errorMessage}",
"Error sending emails" : "Klaida siunčiant el. laiškus",
"File request" : "Failų įkėlimui",
"Previous step" : "Ankstesnis žingsnis",
"Cancel" : "Atsisakyti",
"Continue" : "Tęsti",
@@ -216,6 +218,7 @@ OC.L10N.register(
"Shared" : "Bendrinama",
"Shared by {ownerDisplayName}" : "Bendrina {ownerDisplayName}",
"Shared with others" : "Bendrinama su kitais",
"Create file request" : "Sukurtį viešinį failų įkėlimui",
"Public share" : "Viešasis viešinys",
"Overview of shared files." : "Bendrinamų failų apžvalga.",
"No shares" : "Nėra jokių viešinių",
+3
View File
@@ -117,10 +117,12 @@
"Revert to default" : "Sugrąžinti į numatytąjį",
"Close" : "Užverti",
"_Send email and close_::_Send {count} emails and close_" : ["Išsiųsti el. laišką ir užverti","Išsiųsti {count} el. laiškus ir užverti","Išsiųsti {count} el. laiškų ir užverti","Išsiųsti {count} el. laišką ir užverti"],
"File request created" : "Viešinys failų įkėlimui sukurtas",
"Error creating the share: {errorMessage}" : "Klaida kuriant viešinį: {errorMessage}",
"Error creating the share" : "Klaida kuriant viešinį",
"Error sending emails: {errorMessage}" : "Klaida siunčiant el. laiškus: {errorMessage}",
"Error sending emails" : "Klaida siunčiant el. laiškus",
"File request" : "Failų įkėlimui",
"Previous step" : "Ankstesnis žingsnis",
"Cancel" : "Atsisakyti",
"Continue" : "Tęsti",
@@ -214,6 +216,7 @@
"Shared" : "Bendrinama",
"Shared by {ownerDisplayName}" : "Bendrina {ownerDisplayName}",
"Shared with others" : "Bendrinama su kitais",
"Create file request" : "Sukurtį viešinį failų įkėlimui",
"Public share" : "Viešasis viešinys",
"Overview of shared files." : "Bendrinamų failų apžvalga.",
"No shares" : "Nėra jokių viešinių",
+3 -1
View File
@@ -237,6 +237,8 @@ OC.L10N.register(
"Can edit" : "Може да уређује",
"Custom permissions" : "Произвољне дозволе",
"Resharing is not allowed" : "Дељење даље није дозвољено",
"Name or email …" : "Име или адреса е-поште …",
"Name, email, or Federated Cloud ID …" : "Име, адреса е-поште или ID здруженог облака …",
"Searching …" : "Тражи се …",
"No elements found." : "Нема нађених елемената.",
"Search everywhere" : "Претражи свуда",
@@ -338,7 +340,7 @@ OC.L10N.register(
"Publicly shared file." : "Јавно подељени фајл.",
"No file" : "Нема фајла",
"The file shared with you will show up here" : "Овде ће се појавити фајл који је подељен са вама",
"Public share" : "Јавни дељење",
"Public share" : "Јавно дељење",
"Publicly shared files." : "Јавно подељени фајлови.",
"No files" : "Нема фајлова",
"Files and folders shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су подељени са вама",
+3 -1
View File
@@ -235,6 +235,8 @@
"Can edit" : "Може да уређује",
"Custom permissions" : "Произвољне дозволе",
"Resharing is not allowed" : "Дељење даље није дозвољено",
"Name or email …" : "Име или адреса е-поште …",
"Name, email, or Federated Cloud ID …" : "Име, адреса е-поште или ID здруженог облака …",
"Searching …" : "Тражи се …",
"No elements found." : "Нема нађених елемената.",
"Search everywhere" : "Претражи свуда",
@@ -336,7 +338,7 @@
"Publicly shared file." : "Јавно подељени фајл.",
"No file" : "Нема фајла",
"The file shared with you will show up here" : "Овде ће се појавити фајл који је подељен са вама",
"Public share" : "Јавни дељење",
"Public share" : "Јавно дељење",
"Publicly shared files." : "Јавно подељени фајлови.",
"No files" : "Нема фајлова",
"Files and folders shared with you will show up here" : "Овде ће се појавити фајлови и фолдери које су подељени са вама",
+3
View File
@@ -237,6 +237,9 @@ OC.L10N.register(
"Can edit" : "Düzenleyebilir",
"Custom permissions" : "Özel izinler",
"Resharing is not allowed" : "Yeniden paylaşıma izin verilmiyor",
"Name or email …" : "Ad ya da e-posta adresi…",
"Name, email, or Federated Cloud ID …" : "Ad, e-posta adresi ya da birleşik bulut kimliği…",
"Searching …" : "Aranıyor…",
"No elements found." : "Herhangi bir bileşen bulunamadı.",
"Search everywhere" : "Her yerde ara",
"Guest" : "Konuk",
+3
View File
@@ -235,6 +235,9 @@
"Can edit" : "Düzenleyebilir",
"Custom permissions" : "Özel izinler",
"Resharing is not allowed" : "Yeniden paylaşıma izin verilmiyor",
"Name or email …" : "Ad ya da e-posta adresi…",
"Name, email, or Federated Cloud ID …" : "Ad, e-posta adresi ya da birleşik bulut kimliği…",
"Searching …" : "Aranıyor…",
"No elements found." : "Herhangi bir bileşen bulunamadı.",
"Search everywhere" : "Her yerde ara",
"Guest" : "Konuk",
@@ -55,6 +55,7 @@ use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use OCP\Mail\IEmailValidator;
use OCP\Mail\IMailer;
use OCP\Server;
use OCP\Share\Exceptions\GenericShareException;
@@ -102,6 +103,7 @@ class ShareAPIController extends OCSController {
private IProviderFactory $factory,
private IMailer $mailer,
private ITagManager $tagManager,
private IEmailValidator $emailValidator,
private ?TrustedServers $trustedServers,
private ?string $userId = null,
) {
@@ -746,7 +748,7 @@ class ShareAPIController extends OCSController {
// Only share by mail have a recipient
if (is_string($shareWith) && $shareType === IShare::TYPE_EMAIL) {
// If sending a mail have been requested, validate the mail address
if ($share->getMailSend() && !$this->mailer->validateMailAddress($shareWith)) {
if ($share->getMailSend() && !$this->emailValidator->isValid($shareWith)) {
throw new OCSNotFoundException($this->l->t('Please specify a valid email address'));
}
$share->setSharedWith($shareWith);
+3 -2
View File
@@ -135,8 +135,9 @@ class SharedStorage extends Jail implements LegacyISharedStorage, ISharedStorage
// this is probably because some code path has caused recursion during the share setup
// we setup a "failed storage" so `getWrapperStorage` doesn't return null.
// If the share setup completes after this the "failed storage" will be overwritten by the correct one
$this->logger->warning('Possible share setup recursion detected');
$this->storage = new FailedStorage(['exception' => new \Exception('Possible share setup recursion detected')]);
$ex = new \Exception('Possible share setup recursion detected for share ' . $this->superShare->getId());
$this->logger->warning($ex->getMessage(), ['exception' => $ex, 'app' => 'files_sharing']);
$this->storage = new FailedStorage(['exception' => $ex]);
$this->cache = new FailedCache();
$this->rootPath = '';
}
+4
View File
@@ -41,6 +41,7 @@ use OCP\UserStatus\IManager as IUserStatusManager;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Test\Traits\EmailValidatorTrait;
/**
* Class ApiTest
@@ -49,6 +50,8 @@ use Psr\Log\LoggerInterface;
* TODO: convert to real integration tests
*/
class ApiTest extends TestCase {
use EmailValidatorTrait;
public const TEST_FOLDER_NAME = '/folder_share_api_test';
public const APP_NAME = 'files_sharing';
@@ -141,6 +144,7 @@ class ApiTest extends TestCase {
$providerFactory,
$mailer,
$tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$trustedServers,
$userId,
);
@@ -54,6 +54,7 @@ use PHPUnit\Framework\MockObject\MockObject;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Test\TestCase;
use Test\Traits\EmailValidatorTrait;
/**
* Class ShareAPIControllerTest
@@ -62,6 +63,7 @@ use Test\TestCase;
* @group DB
*/
class ShareAPIControllerTest extends TestCase {
use EmailValidatorTrait;
private string $appName = 'files_sharing';
private string $currentUser;
@@ -146,8 +148,9 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser
$this->currentUser,
);
}
@@ -177,6 +180,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -889,6 +893,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])
@@ -1603,6 +1608,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])
@@ -1976,6 +1982,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -2076,6 +2083,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -2504,6 +2512,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -2577,6 +2586,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -2817,6 +2827,7 @@ class ShareAPIControllerTest extends TestCase {
$this->factory,
$this->mailer,
$this->tagManager,
$this->getEmailValidatorWithStrictEmailCheck(),
$this->trustedServers,
$this->currentUser,
])->onlyMethods(['formatShare'])
@@ -135,7 +135,6 @@ return array(
'OCA\\Settings\\SetupChecks\\SupportedDatabase' => $baseDir . '/../lib/SetupChecks/SupportedDatabase.php',
'OCA\\Settings\\SetupChecks\\SystemIs64bit' => $baseDir . '/../lib/SetupChecks/SystemIs64bit.php',
'OCA\\Settings\\SetupChecks\\TaskProcessingPickupSpeed' => $baseDir . '/../lib/SetupChecks/TaskProcessingPickupSpeed.php',
'OCA\\Settings\\SetupChecks\\TaskProcessingSuccessRate' => $baseDir . '/../lib/SetupChecks/TaskProcessingSuccessRate.php',
'OCA\\Settings\\SetupChecks\\TempSpaceAvailable' => $baseDir . '/../lib/SetupChecks/TempSpaceAvailable.php',
'OCA\\Settings\\SetupChecks\\TransactionIsolation' => $baseDir . '/../lib/SetupChecks/TransactionIsolation.php',
'OCA\\Settings\\SetupChecks\\WellKnownUrls' => $baseDir . '/../lib/SetupChecks/WellKnownUrls.php',
@@ -150,7 +150,6 @@ class ComposerStaticInitSettings
'OCA\\Settings\\SetupChecks\\SupportedDatabase' => __DIR__ . '/..' . '/../lib/SetupChecks/SupportedDatabase.php',
'OCA\\Settings\\SetupChecks\\SystemIs64bit' => __DIR__ . '/..' . '/../lib/SetupChecks/SystemIs64bit.php',
'OCA\\Settings\\SetupChecks\\TaskProcessingPickupSpeed' => __DIR__ . '/..' . '/../lib/SetupChecks/TaskProcessingPickupSpeed.php',
'OCA\\Settings\\SetupChecks\\TaskProcessingSuccessRate' => __DIR__ . '/..' . '/../lib/SetupChecks/TaskProcessingSuccessRate.php',
'OCA\\Settings\\SetupChecks\\TempSpaceAvailable' => __DIR__ . '/..' . '/../lib/SetupChecks/TempSpaceAvailable.php',
'OCA\\Settings\\SetupChecks\\TransactionIsolation' => __DIR__ . '/..' . '/../lib/SetupChecks/TransactionIsolation.php',
'OCA\\Settings\\SetupChecks\\WellKnownUrls' => __DIR__ . '/..' . '/../lib/SetupChecks/WellKnownUrls.php',
+1
View File
@@ -97,6 +97,7 @@ OC.L10N.register(
"Image generation can be implemented by different apps. Here you can set which app should be used." : "Генерацыя відарысаў можа быць рэалізавана рознымі праграмамі. Тут вы можаце задаць, якую праграму трэба выкарыстоўваць.",
"None of your currently installed apps provide image generation functionality" : "Ніводная з усталяваных праграм не прадугледжвае функцыі генерацыі відарысаў",
"Text processing" : "Апрацоўка тэксту",
"Task:" : "Заданне:",
"Here you can decide which group can access certain sections of the administration settings." : "Тут вы можаце вызначыць, якая група мае доступ да пэўных раздзелаў налад адміністравання.",
"Unable to modify setting" : "Немагчыма змяніць наладу",
"None" : "Няма",
+1
View File
@@ -95,6 +95,7 @@
"Image generation can be implemented by different apps. Here you can set which app should be used." : "Генерацыя відарысаў можа быць рэалізавана рознымі праграмамі. Тут вы можаце задаць, якую праграму трэба выкарыстоўваць.",
"None of your currently installed apps provide image generation functionality" : "Ніводная з усталяваных праграм не прадугледжвае функцыі генерацыі відарысаў",
"Text processing" : "Апрацоўка тэксту",
"Task:" : "Заданне:",
"Here you can decide which group can access certain sections of the administration settings." : "Тут вы можаце вызначыць, якая група мае доступ да пэўных раздзелаў налад адміністравання.",
"Unable to modify setting" : "Немагчыма змяніць наладу",
"None" : "Няма",
+26 -1
View File
@@ -96,6 +96,7 @@ OC.L10N.register(
"Administration" : "Администрација",
"Users" : "Корисници",
"Additional settings" : "Дополнителни параметри",
"Assistant" : "Асистент",
"Administration privileges" : "Административни привилегии",
"Groupware" : "Групни производи",
"Overview" : "Преглед",
@@ -114,23 +115,38 @@ OC.L10N.register(
"Verifying" : "Потврдување",
"Verifying …" : "Потврдување …",
"Verify" : "Потврди",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Некој папки со апликации не се сопственост на корисникот на веб серверот. Ова може да биде случај ако апликациите се инсталирани рачно. Проверете ги дозволите на следниве папки со апликации:\n%s",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Позадинското извршување на процедурите се на чекање бидејќи се проверуваат некој увезени SSL сертификати. Вратете се подоцна.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Постојат некој увезени SSL сертификати, во наредната верзија на Nextcloud 21 нема да се користи. Истите можат да се увезат преку командната линија со внесување на командата \"occ security:certificates:import\". Нивните патеки во директориумот со податоци се прикажани подолу. ",
"Code integrity" : "Интегритет на кодот",
"Some files have not passed the integrity check. {link1} {link2}" : "Некој адтотеки не ја поминаа проверката за интегритет. {link1} {link2}",
"Rescan…" : "Повторно скенирање...",
"Cron errors" : "Грешки во cron",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:\n%s" : "Не е возможно извршување на cron позадинските задачи преку CLI. Се појавија следниве технички грешки:\n%s",
"Cron last run" : "Последна позадинска активност",
"Last background job execution ran %s. Something seems wrong. {link}." : "Последно извршување на задачите %s. Нешто не е во ред. {link}.",
"Last background job execution ran %s." : "Последното извршување на задачите траеше %s.",
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Вашата папка за податоци и вашите датотеки се најверојатно достапни од интернет. Датотеката .htaccess не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"Missing optional column \"%s\" in table \"%s\"." : "Недостасува опција во колоната \"%s\" во табелата \"%s\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Во базата недостасуваат некој опционални колони. Поради фактот што додавањето колони во големи бази може да потрае, тие не беа додадени автоматски. Со стартување на командата \"occ db:add-missing-columns\" ќе бидат додадени оние колони што недостасуваат и инстанцата непречено ќе работи. Еднаш кога ќе бидат додадени колоните, некој карактеристики ќе се подобрат и можат да ја подобрат употребата и безбедноста.",
"\"%s\" in table \"%s\"" : "\"%s\" во табела \"%s\"",
"The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "Во базата недостасуваат некој примарни клучеви. Поради фактот што додавањето на примарни клучеви во големи бази може да потрае, тие не беа додадени автоматски. Со стартување на командата \"occ db:add-missing-primary-keys\" ќе бидат додадени оние примарни клучеви што недостасуваат и инстанцата непречено ќе работи.",
"Email test" : "Тест е-пошта порака",
"Email test was successfully sent" : "Тест е-пошта порака е успешно испратена",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Овој опслужувач нема работна Интернет врска. Ова значи дека некои опции како што е монтирање на надворешни складишта, известувања за ажурирање или инсталации на апликации од 3-ти лица нема да работат. Пристапот на датотеки од далечина и праќање на пораки за известувања може исто така да не работат. Ви советуваме да овозможите Интернет врска за овој опслужувач ако сакате да ги имате сите опции. ",
"Disabled" : "Оневозможено",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Овозможен е стар формат за криптирање од страна на серверот. Препорачуваме да го оневозможите ова.",
"Logging level" : "Ниво на евидентирање",
"Memcache" : "Memcache",
"Configured" : "Конфигурирано",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "PHP функцијата \"set_time_limit\" не е достапна. Ова може да резултира со запирање на скриптите во извршувањето, и грешки во вашата инсталација. Овозможувањето на оваа функција е препорачлива.",
"Supported" : "Поддржано",
"PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP се чини дека не е правилно поставена за да испраќа барања до променливите на околината на системот. Тестот со getenv(\"PATH\") враќа само празен одговор.",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP модулот OPcache не е вчитан. За да имате подобри перформанси е препорачливо да го вчитате во вашата PHP инсталација.",
"PHP version" : "PHP верзија",
"The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Антивирана е конфигурација која е само за чирање. Ова спречува поставување на некои конфигурации преку веб-интерфејсот. Понатаму, датотеката треба да се пребрише рачно за секое ажурирање.",
"Architecture" : "Архитектура",
"64-bit" : "64-бита",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Вашата база на податоци не работи со нивото на изолација со \"READ COMMITTED\". Ова може да предизвика проблеми кога повеќе дејства се извршуваат паралелно.",
"Profile information" : "Информации за профилот",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика на профил, име и презиме, е-пошта, телефонски број, адреса, њеб страна, Twitter, организација, улога, наслов, биографиј и дали вашиот профил е овозможен",
@@ -155,6 +171,7 @@ OC.L10N.register(
"Enforce expiration date" : "Наметни датум на траење",
"Set default expiration date for shares to other servers" : "Постави основен рок на траење за споделувањата со други сервери",
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Покажете го текстот за одрекување од одговорност на страницата за поставување јавен линк. (Се прикажува само кога листата со датотеки е скриена)",
"Disclaimer text" : "Текст за одрекување од одговорност",
"This text will be shown on the public link upload page when the file list is hidden." : "Овој текст ќе биде прикажан на страната со јавниот линк кога листата на датотеки е сокриена.",
"Default share permissions" : "Стандардни дозволи за споделување",
"Two-Factor Authentication" : "Двофакторна автентикација",
@@ -203,6 +220,7 @@ OC.L10N.register(
"No results" : "Нема резултати",
"Update to {version}" : "Надгради на {version}",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Оваа апликација не може да се инсталира затоа што следниве зависности не се исполнети:",
"Latest updated" : "Последно ажурирање",
"Author" : "Автор",
"Categories" : "Категории",
"Resources" : "Ресурси",
@@ -326,7 +344,9 @@ OC.L10N.register(
"Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}",
"Your role" : "Ваша улога",
"Timezone" : "Временска зона",
"Your X (formerly Twitter) handle" : "X профил (Поранешен Twitter)",
"Your website" : "Ваша вебстрана",
"Invalid value" : "Неправилна вредност",
"Unable to update {property}" : "Неможе да се ажурира {property}",
"No {property} set" : "Нема поставено {property}",
"Change scope level of {property}, current scope is {scope}" : "Променете го нивото на опсегот на {property}, моменталниот опсег е {scope}",
@@ -355,6 +375,7 @@ OC.L10N.register(
"Language" : "Јазик",
"Set default language" : "Постави стандарден јазик",
"Add new account" : "Додади нова сметка",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка …","{userCount} сметки …"],
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} сметка","{userCount} сметки"],
"Total rows summary" : "Резиме на вкупно редови",
"Scroll to load more rows" : "Одете надолу за да се вчитаат повеќе редови",
@@ -380,6 +401,7 @@ OC.L10N.register(
"Email can't be empty" : "Е-пошта неможе да биде празна",
"Email was successfully changed" : "Е-пошта е успешно променета",
"Welcome mail sent!" : "Испратена е-пошта порака за добредојде!",
"Loading account …" : "Вчитување сметки …",
"Change display name" : "Промена на името",
"Set new password" : "Постави нова лозинка",
"Set new email address" : "Постави нова Е-пошта адреса",
@@ -415,6 +437,7 @@ OC.L10N.register(
"There are some warnings regarding your setup." : "Постојат некои предупредувања во врска со инсталацијата.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Како администратор, можете детално да го прилагодите однесувањето на споделувањето. Погледнете ја документацијата за повеќе информации.",
"You need to enable the File sharing App." : "Треба да ја овозможите апликацијата Споделување на датотеки.",
"Version {version}, {license}-licensed" : "Верзија {version}, {license}-лиценца",
"Version {version}" : "Верзија {version}",
"Apply" : "Примени",
"All accounts" : "Сите сметки",
@@ -520,9 +543,11 @@ OC.L10N.register(
"Your biography" : "Ваша биографија",
"You are using <strong>{usage}</strong>" : "Користите <strong>{usage}</strong>",
"You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Користите <strong>{usage}</strong> од <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
"Loading accounts …" : "Вчитување на сметки ...",
"Set account as admin for …" : "Назначи го корисникот како администратор за ...",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка …","{userCount} сметки …"],
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Во случај да го изгубите уредот или да излезете од компанијата, можете далечински да ги избришете податоците од сите уреди кој се конектирани со корисникот {userid}. Ова работи само доколку уредот е поврзан на интернет.",
"Loading account …" : "Вчирување на сметка ...",
"Loading account …" : "Вчитување на сметка ...",
"Adding your device …" : "Додавање на вашиот уред ...",
"{progress}% Deploying …" : "{progress}% Распоредување …",
"{progress}% Initializing …" : "{progress}% Иницијализирање …",
+26 -1
View File
@@ -94,6 +94,7 @@
"Administration" : "Администрација",
"Users" : "Корисници",
"Additional settings" : "Дополнителни параметри",
"Assistant" : "Асистент",
"Administration privileges" : "Административни привилегии",
"Groupware" : "Групни производи",
"Overview" : "Преглед",
@@ -112,23 +113,38 @@
"Verifying" : "Потврдување",
"Verifying …" : "Потврдување …",
"Verify" : "Потврди",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Некој папки со апликации не се сопственост на корисникот на веб серверот. Ова може да биде случај ако апликациите се инсталирани рачно. Проверете ги дозволите на следниве папки со апликации:\n%s",
"A background job is pending that checks for administration imported SSL certificates. Please check back later." : "Позадинското извршување на процедурите се на чекање бидејќи се проверуваат некој увезени SSL сертификати. Вратете се подоцна.",
"There are some administration imported SSL certificates present, that are not used anymore with Nextcloud 21. They can be imported on the command line via \"occ security:certificates:import\" command. Their paths inside the data directory are shown below." : "Постојат некој увезени SSL сертификати, во наредната верзија на Nextcloud 21 нема да се користи. Истите можат да се увезат преку командната линија со внесување на командата \"occ security:certificates:import\". Нивните патеки во директориумот со податоци се прикажани подолу. ",
"Code integrity" : "Интегритет на кодот",
"Some files have not passed the integrity check. {link1} {link2}" : "Некој адтотеки не ја поминаа проверката за интегритет. {link1} {link2}",
"Rescan…" : "Повторно скенирање...",
"Cron errors" : "Грешки во cron",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:\n%s" : "Не е возможно извршување на cron позадинските задачи преку CLI. Се појавија следниве технички грешки:\n%s",
"Cron last run" : "Последна позадинска активност",
"Last background job execution ran %s. Something seems wrong. {link}." : "Последно извршување на задачите %s. Нешто не е во ред. {link}.",
"Last background job execution ran %s." : "Последното извршување на задачите траеше %s.",
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Вашата папка за податоци и вашите датотеки се најверојатно достапни од интернет. Датотеката .htaccess не работи. Строго ви препорачуваме да го подесите вашиот веб опслужувач на начин на кој вашата папка за податоци не е веќе достапна од интернет или да ја преместите папката за податоци надвор од коренот на веб опслужувачот.",
"Missing optional column \"%s\" in table \"%s\"." : "Недостасува опција во колоната \"%s\" во табелата \"%s\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Во базата недостасуваат некој опционални колони. Поради фактот што додавањето колони во големи бази може да потрае, тие не беа додадени автоматски. Со стартување на командата \"occ db:add-missing-columns\" ќе бидат додадени оние колони што недостасуваат и инстанцата непречено ќе работи. Еднаш кога ќе бидат додадени колоните, некој карактеристики ќе се подобрат и можат да ја подобрат употребата и безбедноста.",
"\"%s\" in table \"%s\"" : "\"%s\" во табела \"%s\"",
"The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running \"occ db:add-missing-primary-keys\" those missing primary keys could be added manually while the instance keeps running." : "Во базата недостасуваат некој примарни клучеви. Поради фактот што додавањето на примарни клучеви во големи бази може да потрае, тие не беа додадени автоматски. Со стартување на командата \"occ db:add-missing-primary-keys\" ќе бидат додадени оние примарни клучеви што недостасуваат и инстанцата непречено ќе работи.",
"Email test" : "Тест е-пошта порака",
"Email test was successfully sent" : "Тест е-пошта порака е успешно испратена",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Овој опслужувач нема работна Интернет врска. Ова значи дека некои опции како што е монтирање на надворешни складишта, известувања за ажурирање или инсталации на апликации од 3-ти лица нема да работат. Пристапот на датотеки од далечина и праќање на пораки за известувања може исто така да не работат. Ви советуваме да овозможите Интернет врска за овој опслужувач ако сакате да ги имате сите опции. ",
"Disabled" : "Оневозможено",
"The old server-side-encryption format is enabled. We recommend disabling this." : "Овозможен е стар формат за криптирање од страна на серверот. Препорачуваме да го оневозможите ова.",
"Logging level" : "Ниво на евидентирање",
"Memcache" : "Memcache",
"Configured" : "Конфигурирано",
"The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. Enabling this function is strongly recommended." : "PHP функцијата \"set_time_limit\" не е достапна. Ова може да резултира со запирање на скриптите во извршувањето, и грешки во вашата инсталација. Овозможувањето на оваа функција е препорачлива.",
"Supported" : "Поддржано",
"PHP does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP се чини дека не е правилно поставена за да испраќа барања до променливите на околината на системот. Тестот со getenv(\"PATH\") враќа само празен одговор.",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "PHP модулот OPcache не е вчитан. За да имате подобри перформанси е препорачливо да го вчитате во вашата PHP инсталација.",
"PHP version" : "PHP верзија",
"The read-only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Антивирана е конфигурација која е само за чирање. Ова спречува поставување на некои конфигурации преку веб-интерфејсот. Понатаму, датотеката треба да се пребрише рачно за секое ажурирање.",
"Architecture" : "Архитектура",
"64-bit" : "64-бита",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Вашата база на податоци не работи со нивото на изолација со \"READ COMMITTED\". Ова може да предизвика проблеми кога повеќе дејства се извршуваат паралелно.",
"Profile information" : "Информации за профилот",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "Слика на профил, име и презиме, е-пошта, телефонски број, адреса, њеб страна, Twitter, организација, улога, наслов, биографиј и дали вашиот профил е овозможен",
@@ -153,6 +169,7 @@
"Enforce expiration date" : "Наметни датум на траење",
"Set default expiration date for shares to other servers" : "Постави основен рок на траење за споделувањата со други сервери",
"Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Покажете го текстот за одрекување од одговорност на страницата за поставување јавен линк. (Се прикажува само кога листата со датотеки е скриена)",
"Disclaimer text" : "Текст за одрекување од одговорност",
"This text will be shown on the public link upload page when the file list is hidden." : "Овој текст ќе биде прикажан на страната со јавниот линк кога листата на датотеки е сокриена.",
"Default share permissions" : "Стандардни дозволи за споделување",
"Two-Factor Authentication" : "Двофакторна автентикација",
@@ -201,6 +218,7 @@
"No results" : "Нема резултати",
"Update to {version}" : "Надгради на {version}",
"This app cannot be installed because the following dependencies are not fulfilled:" : "Оваа апликација не може да се инсталира затоа што следниве зависности не се исполнети:",
"Latest updated" : "Последно ажурирање",
"Author" : "Автор",
"Categories" : "Категории",
"Resources" : "Ресурси",
@@ -324,7 +342,9 @@
"Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}",
"Your role" : "Ваша улога",
"Timezone" : "Временска зона",
"Your X (formerly Twitter) handle" : "X профил (Поранешен Twitter)",
"Your website" : "Ваша вебстрана",
"Invalid value" : "Неправилна вредност",
"Unable to update {property}" : "Неможе да се ажурира {property}",
"No {property} set" : "Нема поставено {property}",
"Change scope level of {property}, current scope is {scope}" : "Променете го нивото на опсегот на {property}, моменталниот опсег е {scope}",
@@ -353,6 +373,7 @@
"Language" : "Јазик",
"Set default language" : "Постави стандарден јазик",
"Add new account" : "Додади нова сметка",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка …","{userCount} сметки …"],
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} сметка","{userCount} сметки"],
"Total rows summary" : "Резиме на вкупно редови",
"Scroll to load more rows" : "Одете надолу за да се вчитаат повеќе редови",
@@ -378,6 +399,7 @@
"Email can't be empty" : "Е-пошта неможе да биде празна",
"Email was successfully changed" : "Е-пошта е успешно променета",
"Welcome mail sent!" : "Испратена е-пошта порака за добредојде!",
"Loading account …" : "Вчитување сметки …",
"Change display name" : "Промена на името",
"Set new password" : "Постави нова лозинка",
"Set new email address" : "Постави нова Е-пошта адреса",
@@ -413,6 +435,7 @@
"There are some warnings regarding your setup." : "Постојат некои предупредувања во врска со инсталацијата.",
"As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Како администратор, можете детално да го прилагодите однесувањето на споделувањето. Погледнете ја документацијата за повеќе информации.",
"You need to enable the File sharing App." : "Треба да ја овозможите апликацијата Споделување на датотеки.",
"Version {version}, {license}-licensed" : "Верзија {version}, {license}-лиценца",
"Version {version}" : "Верзија {version}",
"Apply" : "Примени",
"All accounts" : "Сите сметки",
@@ -518,9 +541,11 @@
"Your biography" : "Ваша биографија",
"You are using <strong>{usage}</strong>" : "Користите <strong>{usage}</strong>",
"You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Користите <strong>{usage}</strong> од <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
"Loading accounts …" : "Вчитување на сметки ...",
"Set account as admin for …" : "Назначи го корисникот како администратор за ...",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} сметка …","{userCount} сметки …"],
"In case of lost device or exiting the organization, this can remotely wipe the Nextcloud data from all devices associated with {userid}. Only works if the devices are connected to the internet." : "Во случај да го изгубите уредот или да излезете од компанијата, можете далечински да ги избришете податоците од сите уреди кој се конектирани со корисникот {userid}. Ова работи само доколку уредот е поврзан на интернет.",
"Loading account …" : "Вчирување на сметка ...",
"Loading account …" : "Вчитување на сметка ...",
"Adding your device …" : "Додавање на вашиот уред ...",
"{progress}% Deploying …" : "{progress}% Распоредување …",
"{progress}% Initializing …" : "{progress}% Иницијализирање …",
+5
View File
@@ -735,6 +735,7 @@ OC.L10N.register(
"Language" : "Језик",
"Set default language" : "Постави подразумевани језик",
"Add new account" : "Додај нови налог",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} налог …","{userCount} налога …","{userCount} налога …"],
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} налог","{userCount} налога","{userCount} налога"],
"Total rows summary" : "Резиме укупног броја редова",
"Scroll to load more rows" : "Скролујте да се учита још редова",
@@ -769,6 +770,7 @@ OC.L10N.register(
"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" : "Немате дозволе да видите детаље о овом налогу",
@@ -802,6 +804,7 @@ OC.L10N.register(
"Passwordless authentication requires a secure connection." : "Пријављивање без лозинке захтева безбедну конекцију.",
"Add WebAuthn device" : "Додајте WebAuthn уређај",
"Please authorize your WebAuthn device." : "Ауторизујте Ваш WebAuthn уређај.",
"Adding your device …" : "Додајем Ваш уређај …",
"Unnamed device" : "Неименовани уређај",
"Passwordless Authentication" : "Провера идентитета без лозинке",
"Set up your account for passwordless authentication following the FIDO2 standard." : "Подесите налог за пријављивање без лозинке користећи FIDO2 стандард.",
@@ -878,6 +881,8 @@ OC.L10N.register(
"Show to logged in accounts only" : "Прикажи само пријављеним налозима",
"Hide" : "Сакриј",
"Manually installed apps cannot be updated" : "Ручно инсталиране апликације не могу да се ажурирају",
"{progress}% Deploying …" : "{progress}% Поставља се ",
"{progress}% Initializing …" : "{progress}% Иницијализује се …",
"Health checking" : "Провера здравља",
"Deploy and Enable" : "Постави и укључи",
"Download and enable" : "Скини и укључи",
+5
View File
@@ -733,6 +733,7 @@
"Language" : "Језик",
"Set default language" : "Постави подразумевани језик",
"Add new account" : "Додај нови налог",
"_{userCount} account …_::_{userCount} accounts …_" : ["{userCount} налог …","{userCount} налога …","{userCount} налога …"],
"_{userCount} account_::_{userCount} accounts_" : ["{userCount} налог","{userCount} налога","{userCount} налога"],
"Total rows summary" : "Резиме укупног броја редова",
"Scroll to load more rows" : "Скролујте да се учита још редова",
@@ -767,6 +768,7 @@
"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" : "Немате дозволе да видите детаље о овом налогу",
@@ -800,6 +802,7 @@
"Passwordless authentication requires a secure connection." : "Пријављивање без лозинке захтева безбедну конекцију.",
"Add WebAuthn device" : "Додајте WebAuthn уређај",
"Please authorize your WebAuthn device." : "Ауторизујте Ваш WebAuthn уређај.",
"Adding your device …" : "Додајем Ваш уређај …",
"Unnamed device" : "Неименовани уређај",
"Passwordless Authentication" : "Провера идентитета без лозинке",
"Set up your account for passwordless authentication following the FIDO2 standard." : "Подесите налог за пријављивање без лозинке користећи FIDO2 стандард.",
@@ -876,6 +879,8 @@
"Show to logged in accounts only" : "Прикажи само пријављеним налозима",
"Hide" : "Сакриј",
"Manually installed apps cannot be updated" : "Ручно инсталиране апликације не могу да се ажурирају",
"{progress}% Deploying …" : "{progress}% Поставља се ",
"{progress}% Initializing …" : "{progress}% Иницијализује се …",
"Health checking" : "Провера здравља",
"Deploy and Enable" : "Постави и укључи",
"Download and enable" : "Скини и укључи",
@@ -76,7 +76,6 @@ use OCA\Settings\SetupChecks\TempSpaceAvailable;
use OCA\Settings\SetupChecks\TransactionIsolation;
use OCA\Settings\SetupChecks\WellKnownUrls;
use OCA\Settings\SetupChecks\Woff2Loading;
use OCA\Settings\Tests\TaskProcessingSuccessRateTest;
use OCA\Settings\UserMigration\AccountMigrator;
use OCA\Settings\WellKnown\ChangePasswordHandler;
use OCA\Settings\WellKnown\SecurityTxtHandler;
@@ -212,7 +211,6 @@ class Application extends App implements IBootstrap {
$context->registerSetupCheck(SupportedDatabase::class);
$context->registerSetupCheck(SystemIs64bit::class);
$context->registerSetupCheck(TaskProcessingPickupSpeed::class);
$context->registerSetupCheck(TaskProcessingSuccessRateTest::class);
$context->registerSetupCheck(TempSpaceAvailable::class);
$context->registerSetupCheck(TransactionIsolation::class);
$context->registerSetupCheck(PushService::class);
@@ -112,6 +112,7 @@ class Show extends Base {
return [
'name' => $setting->getName() ?: 'Global',
'className' => $className,
'priority' => $setting->getPriority(),
'delegatedGroups' => $groups,
];
}, $settings);
@@ -155,6 +156,6 @@ class Show extends Base {
* @param array $innerSection
*/
private function getDelegatedSettings(array $settings, array $innerSection): array {
return $settings + array_filter($innerSection, fn (ISettings $setting) => $setting instanceof IDelegatedSettings);
return array_merge($settings, array_filter($innerSection, fn (ISettings $setting) => $setting instanceof IDelegatedSettings));
}
}
@@ -17,8 +17,7 @@ use OCP\TaskProcessing\IManager;
class TaskProcessingPickupSpeed implements ISetupCheck {
public const MAX_SLOW_PERCENTAGE = 0.2;
public const MAX_DAYS = 14;
public const TIME_SPAN = 24;
public function __construct(
private IL10N $l10n,
@@ -36,21 +35,10 @@ class TaskProcessingPickupSpeed implements ISetupCheck {
}
public function run(): SetupResult {
$taskCount = 0;
$lastNDays = 1;
while($taskCount === 0 && $lastNDays < self::MAX_DAYS) {
$lastNDays++;
$tasks = $this->taskProcessingManager->getTasks(userId: '', scheduleAfter: $this->timeFactory->now()->getTimestamp() - 60 * 60 * 24 * $lastNDays); // userId: '' means no filter, whereas null would mean guest
$taskCount = count($tasks);
}
$tasks = $this->taskProcessingManager->getTasks(userId: '', scheduleAfter: $this->timeFactory->now()->getTimestamp() - 60 * 60 * self::TIME_SPAN); // userId: '' means no filter, whereas null would mean guest
$taskCount = count($tasks);
if ($taskCount === 0) {
return SetupResult::success(
$this->l10n->n(
'No scheduled tasks in the last %n hour.',
'No scheduled tasks in the last %n hours.',
24 * $lastNDays
)
);
return SetupResult::success($this->l10n->n('No scheduled tasks in the last %n hour.', 'No scheduled tasks in the last %n hours.', self::TIME_SPAN));
}
$slowCount = 0;
foreach ($tasks as $task) {
@@ -67,22 +55,9 @@ class TaskProcessingPickupSpeed implements ISetupCheck {
}
if ($slowCount / $taskCount < self::MAX_SLOW_PERCENTAGE) {
return SetupResult::success(
$this->l10n->n(
'The task pickup speed has been ok in the last %n hour.',
'The task pickup speed has been ok in the last %n hours.',
24 * $lastNDays
)
);
return SetupResult::success($this->l10n->n('The task pickup speed has been ok in the last %n hour.', 'The task pickup speed has been ok in the last %n hours.', self::TIME_SPAN));
} else {
return SetupResult::warning(
$this->l10n->n(
'The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background.',
'The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background.',
24 * $lastNDays
),
'https://docs.nextcloud.com/server/latest/admin_manual/ai/overview.html#improve-ai-task-pickup-speed'
);
return SetupResult::warning($this->l10n->n('The task pickup speed has been slow in the last %n hour. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background.', 'The task pickup speed has been slow in the last %n hours. Many tasks took longer than 4 minutes to be picked up. Consider setting up a worker to process tasks in the background.', self::TIME_SPAN), 'https://docs.nextcloud.com/server/latest/admin_manual/ai/overview.html#improve-ai-task-pickup-speed');
}
}
}
@@ -1,86 +0,0 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\SetupChecks;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IL10N;
use OCP\SetupCheck\ISetupCheck;
use OCP\SetupCheck\SetupResult;
use OCP\TaskProcessing\IManager;
use OCP\TaskProcessing\Task;
class TaskProcessingSuccessRate implements ISetupCheck {
public const MAX_FAILURE_PERCENTAGE = 0.2;
public const MAX_DAYS = 14;
public function __construct(
private IL10N $l10n,
private IManager $taskProcessingManager,
private ITimeFactory $timeFactory,
) {
}
public function getCategory(): string {
return 'ai';
}
public function getName(): string {
return $this->l10n->t('Task Processing pickup speed');
}
public function run(): SetupResult {
$taskCount = 0;
$lastNDays = 1;
while ($taskCount === 0 && $lastNDays < self::MAX_DAYS) {
$lastNDays++;
$tasks = $this->taskProcessingManager->getTasks(userId: '', scheduleAfter: $this->timeFactory->now()->getTimestamp() - 60 * 60 * 24 * $lastNDays); // userId: '' means no filter, whereas null would mean guest
$taskCount = count($tasks);
}
if ($taskCount === 0) {
return SetupResult::success(
$this->l10n->n(
'No scheduled tasks in the last %n hour.',
'No scheduled tasks in the last %n hours.',
24 * $lastNDays
)
);
}
$failedCount = 0;
foreach ($tasks as $task) {
if ($task->getEndedAt() !== null) {
continue; // task was not picked up yet
}
$status = $task->getStatus();
if ($status === Task::STATUS_FAILED) {
$failedCount++; // task pickup took longer than 4 minutes
}
}
if ($failedCount / $taskCount < self::MAX_FAILURE_PERCENTAGE) {
return SetupResult::success(
$this->l10n->n(
'Most tasks were successful in the last %n hour.',
'Most tasks were successful in the last %n hours.',
24 * $lastNDays
)
);
} else {
return SetupResult::warning(
$this->l10n->n(
'A lot of tasks failed in the last %n hour. Consider checking the nextcloud log for errors and investigating whether the AI provider apps have been set up correctly.',
'A lot of tasks failed in the last %n hours. Consider checking the nextcloud log for errors and investigating whether the AI provider apps have been set up correctly.',
24 * $lastNDays
),
'https://docs.nextcloud.com/server/latest/admin_manual/ai/insight_and_debugging.html'
);
}
}
}
@@ -1,75 +0,0 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\Tests;
use OCA\Settings\SetupChecks\TaskProcessingPickupSpeed;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IL10N;
use OCP\SetupCheck\SetupResult;
use OCP\TaskProcessing\IManager;
use OCP\TaskProcessing\Task;
use Test\TestCase;
class TaskProcessingSuccessRateTest extends TestCase {
private IL10N $l10n;
private ITimeFactory $timeFactory;
private IManager $taskProcessingManager;
private TaskProcessingPickupSpeed $check;
protected function setUp(): void {
parent::setUp();
$this->l10n = $this->getMockBuilder(IL10N::class)->getMock();
$this->timeFactory = $this->getMockBuilder(ITimeFactory::class)->getMock();
$this->taskProcessingManager = $this->getMockBuilder(IManager::class)->getMock();
$this->check = new TaskProcessingPickupSpeed(
$this->l10n,
$this->taskProcessingManager,
$this->timeFactory,
);
}
public function testPass(): void {
$tasks = [];
for ($i = 0; $i < 100; $i++) {
$task = new Task('test', ['test' => 'test'], 'settings', 'user' . $i);
$task->setStartedAt(0);
$task->setEndedAt(1);
if ($i < 15) {
$task->setStatus(Task::STATUS_FAILED); // 15% get FAILED
} else {
$task->setStatus(Task::STATUS_SUCCESSFUL); // the rest gets SUCCESS
}
$tasks[] = $task;
}
$this->taskProcessingManager->method('getTasks')->willReturn($tasks);
$this->assertEquals(SetupResult::SUCCESS, $this->check->run()->getSeverity());
}
public function testFail(): void {
$tasks = [];
for ($i = 0; $i < 100; $i++) {
$task = new Task('test', ['test' => 'test'], 'settings', 'user' . $i);
$task->setStartedAt(0);
$task->setEndedAt(1);
if ($i < 30) {
$task->setStatus(Task::STATUS_FAILED); // 30% get FAILED
} else {
$task->setStatus(Task::STATUS_SUCCESSFUL); // the rest gets SUCCESS
}
$tasks[] = $task;
}
$this->taskProcessingManager->method('getTasks')->willReturn($tasks);
$this->assertEquals(SetupResult::WARNING, $this->check->run()->getSeverity());
}
}
+4 -2
View File
@@ -25,6 +25,7 @@ use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Mail\IEmailValidator;
use OCP\Mail\IMailer;
use OCP\Security\Events\GenerateSecurePasswordEvent;
use OCP\Security\IHasher;
@@ -70,6 +71,7 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
private IHasher $hasher,
private IEventDispatcher $eventDispatcher,
private IShareManager $shareManager,
private IEmailValidator $emailValidator,
) {
}
@@ -246,7 +248,7 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
$emails = $this->getSharedWithEmails($share);
$validEmails = array_filter($emails, function (string $email) {
return $this->mailer->validateMailAddress($email);
return $this->emailValidator->isValid($email);
});
if (count($validEmails) === 0) {
@@ -722,7 +724,7 @@ class ShareByMailProvider extends DefaultShareProvider implements IShareProvider
|| ($originalShare->getSendPasswordByTalk() && !$share->getSendPasswordByTalk()))) {
$emails = $this->getSharedWithEmails($share);
$validEmails = array_filter($emails, function ($email) {
return $this->mailer->validateMailAddress($email);
return $this->emailValidator->isValid($email);
});
$this->sendPassword($share, $plainTextPassword, $validEmails);
}
@@ -41,6 +41,7 @@ use OCP\Util;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
use Test\Traits\EmailValidatorTrait;
/**
* Class ShareByMailProviderTest
@@ -49,6 +50,7 @@ use Test\TestCase;
* @group DB
*/
class ShareByMailProviderTest extends TestCase {
use EmailValidatorTrait;
private IDBConnection $connection;
@@ -122,6 +124,7 @@ class ShareByMailProviderTest extends TestCase {
$this->hasher,
$this->eventDispatcher,
$this->shareManager,
$this->getEmailValidatorWithStrictEmailCheck(),
])
->onlyMethods($mockedMethods)
->getMock();
@@ -143,6 +146,7 @@ class ShareByMailProviderTest extends TestCase {
$this->hasher,
$this->eventDispatcher,
$this->shareManager,
$this->getEmailValidatorWithStrictEmailCheck(),
);
}
@@ -199,9 +203,6 @@ class ShareByMailProviderTest extends TestCase {
$share->expects($this->any())->method('getNote')->willReturn('');
$share->expects($this->any())->method('getToken')->willReturn('token');
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
$instance->expects($this->once())->method('createMailShare')->with($share)->willReturn(42);
@@ -241,9 +242,6 @@ class ShareByMailProviderTest extends TestCase {
$share->expects($this->any())->method('getNote')->willReturn('');
$share->expects($this->any())->method('getToken')->willReturn('token');
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
@@ -287,9 +285,6 @@ class ShareByMailProviderTest extends TestCase {
$share->expects($this->any())->method('getNote')->willReturn('');
$share->expects($this->any())->method('getToken')->willReturn('token');
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance([
'getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject',
'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity',
@@ -352,9 +347,6 @@ class ShareByMailProviderTest extends TestCase {
->method('dispatchTyped')
->with(new GenerateSecurePasswordEvent(PasswordContext::SHARING));
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'createPasswordSendActivity', 'sendPasswordToOwner']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
@@ -435,9 +427,6 @@ class ShareByMailProviderTest extends TestCase {
->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
->willReturn('https://example.com/file.txt');
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendPasswordToOwner']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
@@ -526,9 +515,6 @@ class ShareByMailProviderTest extends TestCase {
->with('files_sharing.sharecontroller.showShare', ['token' => 'token'])
->willReturn('https://example.com/file.txt');
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
@@ -624,9 +610,6 @@ class ShareByMailProviderTest extends TestCase {
'receiver3@example.com',
]);
// Assume the mail address is valid.
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$instance = $this->getInstance(['getSharedWith', 'createMailShare', 'getRawShare', 'createShareObject', 'createShareActivity', 'autoGeneratePassword', 'createPasswordSendActivity', 'sendEmail', 'sendPassword', 'sendPasswordToOwner']);
$instance->expects($this->once())->method('getSharedWith')->willReturn([]);
@@ -1188,7 +1171,6 @@ class ShareByMailProviderTest extends TestCase {
->willReturn(new Share($rootFolder, $userManager));
$provider = $this->getInstance(['sendMailNotification', 'createShareActivity']);
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$u1 = $userManager->createUser('testFed', md5((string)time()));
$u2 = $userManager->createUser('testFed2', md5((string)time()));
@@ -1235,7 +1217,6 @@ class ShareByMailProviderTest extends TestCase {
->willReturn(new Share($rootFolder, $userManager));
$provider = $this->getInstance(['sendMailNotification', 'createShareActivity']);
$this->mailer->expects($this->any())->method('validateMailAddress')->willReturn(true);
$u1 = $userManager->createUser('testFed', md5((string)time()));
$u2 = $userManager->createUser('testFed2', md5((string)time()));
@@ -1370,9 +1351,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
@@ -1492,9 +1470,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
@@ -1619,9 +1594,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
@@ -1717,9 +1689,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
@@ -1818,9 +1787,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
@@ -1915,9 +1881,6 @@ class ShareByMailProviderTest extends TestCase {
->method('useTemplate')
->with($template);
$this->mailer->expects($this->once())
->method('validateMailAddress')
->willReturn(true);
$this->mailer
->expects($this->once())
->method('send')
+2
View File
@@ -56,6 +56,7 @@ OC.L10N.register(
"Failed to delete tag" : "Ознака није могла да се обрише",
"Create or edit tags" : "Креирај или уреди ознаке",
"Search for a tag to edit" : "Претрага ознаке за уређивање",
"Collaborative tags …" : "Ознаке сарадње …",
"No tags to select" : "Нема ниједне ознаке која може да се изабере",
"Tag name" : "Назив ознаке",
"Tag level" : "Ниво ознаке",
@@ -86,6 +87,7 @@ OC.L10N.register(
"Failed to load tags" : "Грешка при учитавању ознака",
"Failed to select tag" : "Ознака није могла да се изабере",
"System admin disabled tag creation. You can only use existing ones." : "Админ система је искључио креирање ознака. Можете да употребљавате само постојеће ознаке.",
"Loading collaborative tags …" : "Учитавају се ознаке сарадње …",
"Search or create collaborative tags" : "Претражите или креирајте ознаке за сарадњу",
"No tags to select, type to create a new tag" : "Није изабрана ниједна ознака, куцајте да креирате нову ознаку",
"Unable to update setting" : "Није успело ажурирање подешавања",
+2
View File
@@ -54,6 +54,7 @@
"Failed to delete tag" : "Ознака није могла да се обрише",
"Create or edit tags" : "Креирај или уреди ознаке",
"Search for a tag to edit" : "Претрага ознаке за уређивање",
"Collaborative tags …" : "Ознаке сарадње …",
"No tags to select" : "Нема ниједне ознаке која може да се изабере",
"Tag name" : "Назив ознаке",
"Tag level" : "Ниво ознаке",
@@ -84,6 +85,7 @@
"Failed to load tags" : "Грешка при учитавању ознака",
"Failed to select tag" : "Ознака није могла да се изабере",
"System admin disabled tag creation. You can only use existing ones." : "Админ система је искључио креирање ознака. Можете да употребљавате само постојеће ознаке.",
"Loading collaborative tags …" : "Учитавају се ознаке сарадње …",
"Search or create collaborative tags" : "Претражите или креирајте ознаке за сарадњу",
"No tags to select, type to create a new tag" : "Није изабрана ниједна ознака, куцајте да креирате нову ознаку",
"Unable to update setting" : "Није успело ажурирање подешавања",
+2
View File
@@ -56,6 +56,7 @@ OC.L10N.register(
"Failed to delete tag" : "Etiket silinemedi",
"Create or edit tags" : "Etiket ekle ya da düzenle",
"Search for a tag to edit" : "Düzenlemek için bir etiket ara",
"Collaborative tags …" : "İş birlikli etiketler…",
"No tags to select" : "Seçilebilecek bir etiket yok",
"Tag name" : "Etiket adı",
"Tag level" : "Etiket düzeyi",
@@ -86,6 +87,7 @@ OC.L10N.register(
"Failed to load tags" : "Etiketler yüklenemedi",
"Failed to select tag" : "Seçilmiş etiket yüklenemedi",
"System admin disabled tag creation. You can only use existing ones." : "Sistem yöneticisi etiket oluşturma iznini kaldırmış. Yalnızca var olan etiketleri kullanabilirsiniz.",
"Loading collaborative tags …" : "İş birlikli etiketler yükleniyor…",
"Search or create collaborative tags" : "İş birlikli etiket ara ya da ekle",
"No tags to select, type to create a new tag" : "Seçilebilecek herhangi bir etiket yok. Yazarak yeni bir etiket ekleyin",
"Unable to update setting" : "Ayar güncellenemedi",
+2
View File
@@ -54,6 +54,7 @@
"Failed to delete tag" : "Etiket silinemedi",
"Create or edit tags" : "Etiket ekle ya da düzenle",
"Search for a tag to edit" : "Düzenlemek için bir etiket ara",
"Collaborative tags …" : "İş birlikli etiketler…",
"No tags to select" : "Seçilebilecek bir etiket yok",
"Tag name" : "Etiket adı",
"Tag level" : "Etiket düzeyi",
@@ -84,6 +85,7 @@
"Failed to load tags" : "Etiketler yüklenemedi",
"Failed to select tag" : "Seçilmiş etiket yüklenemedi",
"System admin disabled tag creation. You can only use existing ones." : "Sistem yöneticisi etiket oluşturma iznini kaldırmış. Yalnızca var olan etiketleri kullanabilirsiniz.",
"Loading collaborative tags …" : "İş birlikli etiketler yükleniyor…",
"Search or create collaborative tags" : "İş birlikli etiket ara ya da ekle",
"No tags to select, type to create a new tag" : "Seçilebilecek herhangi bir etiket yok. Yazarak yeni bir etiket ekleyin",
"Unable to update setting" : "Ayar güncellenemedi",
@@ -9,7 +9,9 @@ namespace OCA\Testing\Locking;
use OC\Lock\DBLockingProvider;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use Override;
class FakeDBLockingProvider extends DBLockingProvider {
// Lock for 10 hours just to be sure
@@ -28,14 +30,16 @@ class FakeDBLockingProvider extends DBLockingProvider {
$this->db = $connection;
}
/** @inheritDoc */
#[Override]
public function releaseLock(string $path, int $type): void {
// we DONT keep shared locks till the end of the request
// we DON'T keep shared locks till the end of the request
if ($type === self::LOCK_SHARED) {
$this->db->executeUpdate(
'UPDATE `*PREFIX*file_locks` SET `lock` = 0 WHERE `key` = ? AND `lock` = 1',
[$path]
);
$qb = $this->db->getQueryBuilder();
$qb->update('file_locks')
->set('lock', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))
->where($qb->expr()->eq('key', $qb->createNamedParameter($path, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('lock', $qb->createNamedParameter(1, IQueryBuilder::PARAM_INT)))
->executeStatement();
}
parent::releaseLock($path, $type);
+36
View File
@@ -6,16 +6,26 @@ OC.L10N.register(
"Invalid configuration: Anonymous binding is not allowed." : "La configurazione non è valida: l'associazione anonima non è consentita.",
"Valid configuration, connection established!" : "Configurazione valida, connessione stabilita!",
"Valid configuration, but binding failed. Please check the server settings and credentials." : "Configurazione valida, ma associazione non riuscita. Controlla le impostazioni del server e le credenziali.",
"Invalid configuration: %s" : "Configurazione non valida: %s",
"No action specified" : "Nessuna azione specificata",
"No configuration specified" : "Nessuna configurazione specificata",
"No data specified" : "Nessun dato specificato",
"Invalid data specified" : "Dati specificati non validi",
"Could not set configuration %1$s to %2$s" : "Impossibile impostare la configurazione %1$s in %2$s",
"Action does not exist" : "L'azione non esiste",
"Renewing …" : "Rinnovo in corso …",
"Very weak password" : "Password molto debole",
"Weak password" : "Password debole",
"So-so password" : "Password così-così",
"Good password" : "Password buona",
"Strong password" : "Password forte",
"Password change rejected. Hint: %s" : "Modifica password rifiutata. Suggerimento: %s",
"Mandatory field \"%s\" left empty" : "Campo obbligatorio \"%s\"lasciato vuoto",
"A password is given, but not an LDAP agent" : "Viene fornita una password, ma non un agente LDAP",
"No password is given for the user agent" : "Non è stata fornita alcuna password per l'agente utente",
"No LDAP base DN was given" : "Non è stato fornito alcun DN di base LDAP",
"User base DN is not a subnode of global base DN" : "Il DN della base utente non è un sottonodo del DN della base globale",
"Group base DN is not a subnode of global base DN" : "Il DN di base del gruppo non è un sottonodo del DN di base globale",
"Please login with the new password" : "Accedi con la nuova password",
"LDAP User backend" : "Motore Utenti LDAP",
"Your password will expire tomorrow." : "La tua password scadrà domani.",
@@ -46,6 +56,7 @@ OC.L10N.register(
"Backup (Replica) Port" : "Porta di backup (Replica)",
"Only connect to the replica server." : "Collegati solo al server di replica.",
"Disable Main Server" : "Disabilita server principale",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your {instanceName} server." : "Non consigliato, utilizzalo solo per test! Se la connessione funziona solo con questa opzione, importa il certificato SSL del server LDAP nel tuo {instanceName} server.",
"Turn off SSL certificate validation." : "Disattiva il controllo del certificato SSL.",
"Cache Time-To-Live" : "Tempo di vita della cache",
"in seconds. A change empties the cache." : "in secondi. Il cambio svuota la cache.",
@@ -113,24 +124,36 @@ OC.L10N.register(
"Internal Username Attribute:" : "Attributo nome utente interno:",
"Override UUID detection" : "Ignora rilevamento UUID",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "In modo predefinito, l'attributo UUID viene rilevato automaticamente. L'attributo UUID è utilizzato per identificare senza alcun dubbio gli utenti e i gruppi LDAP. Inoltre, il nome utente interno sarà creato sulla base dell'UUID, se non è specificato in precedenza. Puoi ignorare l'impostazione e fornire un attributo di tua scelta. Assicurati che l'attributo scelto possa essere ottenuto sia per gli utenti che per i gruppi e che sia univoco. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovi utenti e gruppi LDAP associati (aggiunti).",
"UUID Attribute for Users" : "Attributo UUID per gli utenti",
"UUID Attribute for Groups" : "Attributo UUID per gruppi",
"Groups meeting these criteria are available in {instanceName}:" : "I gruppi che soddisfano questi criteri sono disponibili in {instanceName}:",
"Only these object classes:" : "Solo queste classi di oggetti:",
"Only from these groups:" : "Solo da questi gruppi:",
"Edit LDAP Query" : "Modifica query LDAP",
"The filter specifies which LDAP groups shall have access to the {instanceName} instance." : "Il filtro specifica quali gruppi LDAP devono avere accesso all'istanza {instanceName}.",
"LDAP Filter:" : "Filtro LDAP:",
"Verify settings and count the groups" : "Verifica le impostazioni e conta i gruppi",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): {filter}" : "Utente non trovato. Controlla i tuoi attributi di accesso e il nome utente. Filtro efficace (da copiare e incollare per la convalida della riga di comando)): {filter}",
"User found and settings verified." : "Utente trovato e impostazioni verificate.",
"Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Valuta di restringere la tua ricerca, poiché ha incluso molti utenti, solo il primo dei quali sarà in grado di accedere.",
"An unspecified error occurred. Please check log and settings." : "Si è verificato un errore non specificato. Controlla le impostazioni e il file di log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Il filtro di ricerca non è valido, probabilmente a causa di problemi di sintassi come un numero dispari di parentesi aperte e chiuse. Controlla.",
"A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Si è verificato un errore di connessione a LDAP/AD. Controlla host, porta e credenziali.",
"The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP/AD.",
"When logging in, {instanceName} will find the user based on the following attributes:" : "Quando si effettua l'accesso, {instanceName} troverà l'utente in base ai seguenti attributi:",
"Other Attributes:" : "Altri attributi:",
"Defines the filter to apply, when login is attempted. `%%uid` replaces the username in the login action. Example: `uid=%%uid`" : "Definisce il filtro da applicare quando si tenta l'accesso. `%%uid` sostituisce il nome utente nell'azione di accesso. Esempio: `uid=%%uid`",
"Attempts to receive a DN for the given login name and the current login filter" : "Tenta di ricevere un DN per il nome di accesso specificato e il filtro di accesso corrente",
"Test Login name" : "Nome di login di prova",
"Verify settings" : "Verifica impostazioni",
"No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.",
"More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.",
"_{ldapTestBase} entry available within the provided Base DN_::_{ldapTestBase} entries available within the provided Base DN_" : ["{ldapTestBase} voce disponibile all'interno del DN di base fornito","{ldapTestBase}voci disponibile all'interno del DN di base fornito","{ldapTestBase} entries available within the provided Base DN"],
"When unchecked, this configuration will be skipped." : "Se deselezionata, questa configurazione sarà saltata.",
"Configuration Active" : "Configurazione attiva",
"Copy current configuration into new directory binding" : "Copia la configurazione attuale nella nuova cartella associata",
"Copy configuration" : "Copia configurazione",
"Delete configuration" : "Elimina configurazione",
"You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "È possibile omettere il protocollo, a meno che non sia necessario SSL. In questo caso, inizia con ldaps://",
"Host" : "Host",
"Port" : "Porta",
@@ -140,13 +163,16 @@ OC.L10N.register(
"For anonymous access, leave DN and Password empty." : "Per l'accesso anonimo, lascia vuoti i campi DN e Password",
"Password" : "Password",
"Save Credentials" : "Salva credenziali",
"Base DN" : "DN Base",
"One Base DN per line" : "Un DN base per riga",
"You can specify Base DN for users and groups in the Advanced tab" : "Puoi specificare un DN base per gli utenti ed i gruppi nella scheda Avanzate",
"Detect Base DN" : "Rileva DN base",
"Test Base DN" : "Rileva DN base",
"Listing and searching for users is constrained by these criteria:" : "L'elencazione e la ricerca di utenti è vincolata da questi criteri:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Le classi di oggetti più comuni per gli utenti sono organizationalPerson, person, user, e inetOrgPerson. Se non sei sicuro su quale classe di oggetti selezionare, consulta l'amministratore della tua directory.",
"The filter specifies which LDAP users shall have access to the {instanceName} instance." : "Il filtro specifica quali utenti LDAP devono avere accesso all'istanza {instanceName}.",
"Verify settings and count users" : "Verifica le impostazioni e conta gli utenti",
"User count: {usersCount}" : "Conteggio utenti: {usersCount}",
"Test Configuration" : "Prova configurazione",
"Help" : "Aiuto",
"Server" : "Server",
@@ -155,10 +181,20 @@ OC.L10N.register(
"Groups" : "Gruppi",
"Advanced" : "Avanzate",
"Expert" : "Esperto",
"The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "Il modulo PHP LDAP non è installato, il backend non funzionerà. Chiedi all'amministratore di sistema di installarlo.",
"Select LDAP Config" : "Seleziona Configurazione LDAP",
"Create New Config" : "Crea nuova configurazione",
"Create configuration" : "Crea configurazione",
"Username-LDAP User Mapping" : "Associazione Nome utente-Utente LDAP",
"Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "I nomi utente sono utilizzati per archiviare e assegnare i metadati. Per identificare con precisione e riconoscere gli utenti, ogni utente LDAP avrà un nome utente interno. Il nome utente creato. Ciò richiede un'associazione tra il nome utente e l'utente LDAP. Il nome utente creato è associato allo UUID dell'utente LDAP. In aggiunta, il DN viene memorizzato in cache per ridurre l'interazione con LDAP, ma non è utilizzato per l'identificazione. Se il DN cambia, le modifiche saranno rilevate. Il nome utente interno è utilizzato dappertutto. La cancellazione delle associazioni lascerà tracce residue ovunque e interesserà tutta la configurazione LDAP. Non cancellare mai le associazioni in un ambiente di produzione, ma solo in una fase sperimentale o di test.",
"Clear Username-LDAP User Mapping" : "Cancella associazione Nome utente-Utente LDAP",
"Clear Groupname-LDAP Group Mapping" : "Cancella associazione Nome gruppo-Gruppo LDAP",
"Confirm action" : "Conferma azione",
"Are you sure you want to permanently delete this LDAP configuration? This cannot be undone." : "Vuoi davvero eliminare definitivamente questa configurazione LDAP? Questa operazione non può essere annullata.",
"Fail to delete config" : "Impossibile eliminare la configurazione",
"Are you sure you want to permanently clear the LDAP mapping? This cannot be undone." : "Vuoi davvero cancellare definitivamente la mappatura LDAP? Questa operazione non può essere annullata.",
"Mapping cleared" : "Mappatura cancellata",
"Failed to clear mapping" : "Impossibile cancellare la mappatura",
"An error occurred" : "Si è verificato un errore",
"Mode switch" : "Cambio modalità",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Il cambio di modalità abiliterà le query LDAP automatiche. In base alla dimensione di LDAP, potrebbero richiedere del tempo. Vuoi ancora cambiare modalità?",
+36
View File
@@ -4,16 +4,26 @@
"Invalid configuration: Anonymous binding is not allowed." : "La configurazione non è valida: l'associazione anonima non è consentita.",
"Valid configuration, connection established!" : "Configurazione valida, connessione stabilita!",
"Valid configuration, but binding failed. Please check the server settings and credentials." : "Configurazione valida, ma associazione non riuscita. Controlla le impostazioni del server e le credenziali.",
"Invalid configuration: %s" : "Configurazione non valida: %s",
"No action specified" : "Nessuna azione specificata",
"No configuration specified" : "Nessuna configurazione specificata",
"No data specified" : "Nessun dato specificato",
"Invalid data specified" : "Dati specificati non validi",
"Could not set configuration %1$s to %2$s" : "Impossibile impostare la configurazione %1$s in %2$s",
"Action does not exist" : "L'azione non esiste",
"Renewing …" : "Rinnovo in corso …",
"Very weak password" : "Password molto debole",
"Weak password" : "Password debole",
"So-so password" : "Password così-così",
"Good password" : "Password buona",
"Strong password" : "Password forte",
"Password change rejected. Hint: %s" : "Modifica password rifiutata. Suggerimento: %s",
"Mandatory field \"%s\" left empty" : "Campo obbligatorio \"%s\"lasciato vuoto",
"A password is given, but not an LDAP agent" : "Viene fornita una password, ma non un agente LDAP",
"No password is given for the user agent" : "Non è stata fornita alcuna password per l'agente utente",
"No LDAP base DN was given" : "Non è stato fornito alcun DN di base LDAP",
"User base DN is not a subnode of global base DN" : "Il DN della base utente non è un sottonodo del DN della base globale",
"Group base DN is not a subnode of global base DN" : "Il DN di base del gruppo non è un sottonodo del DN di base globale",
"Please login with the new password" : "Accedi con la nuova password",
"LDAP User backend" : "Motore Utenti LDAP",
"Your password will expire tomorrow." : "La tua password scadrà domani.",
@@ -44,6 +54,7 @@
"Backup (Replica) Port" : "Porta di backup (Replica)",
"Only connect to the replica server." : "Collegati solo al server di replica.",
"Disable Main Server" : "Disabilita server principale",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your {instanceName} server." : "Non consigliato, utilizzalo solo per test! Se la connessione funziona solo con questa opzione, importa il certificato SSL del server LDAP nel tuo {instanceName} server.",
"Turn off SSL certificate validation." : "Disattiva il controllo del certificato SSL.",
"Cache Time-To-Live" : "Tempo di vita della cache",
"in seconds. A change empties the cache." : "in secondi. Il cambio svuota la cache.",
@@ -111,24 +122,36 @@
"Internal Username Attribute:" : "Attributo nome utente interno:",
"Override UUID detection" : "Ignora rilevamento UUID",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "In modo predefinito, l'attributo UUID viene rilevato automaticamente. L'attributo UUID è utilizzato per identificare senza alcun dubbio gli utenti e i gruppi LDAP. Inoltre, il nome utente interno sarà creato sulla base dell'UUID, se non è specificato in precedenza. Puoi ignorare l'impostazione e fornire un attributo di tua scelta. Assicurati che l'attributo scelto possa essere ottenuto sia per gli utenti che per i gruppi e che sia univoco. Lascialo vuoto per ottenere il comportamento predefinito. Le modifiche avranno effetto solo sui nuovi utenti e gruppi LDAP associati (aggiunti).",
"UUID Attribute for Users" : "Attributo UUID per gli utenti",
"UUID Attribute for Groups" : "Attributo UUID per gruppi",
"Groups meeting these criteria are available in {instanceName}:" : "I gruppi che soddisfano questi criteri sono disponibili in {instanceName}:",
"Only these object classes:" : "Solo queste classi di oggetti:",
"Only from these groups:" : "Solo da questi gruppi:",
"Edit LDAP Query" : "Modifica query LDAP",
"The filter specifies which LDAP groups shall have access to the {instanceName} instance." : "Il filtro specifica quali gruppi LDAP devono avere accesso all'istanza {instanceName}.",
"LDAP Filter:" : "Filtro LDAP:",
"Verify settings and count the groups" : "Verifica le impostazioni e conta i gruppi",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command-line validation): {filter}" : "Utente non trovato. Controlla i tuoi attributi di accesso e il nome utente. Filtro efficace (da copiare e incollare per la convalida della riga di comando)): {filter}",
"User found and settings verified." : "Utente trovato e impostazioni verificate.",
"Consider narrowing your search, as it encompassed many users, only the first one of whom will be able to log in." : "Valuta di restringere la tua ricerca, poiché ha incluso molti utenti, solo il primo dei quali sarà in grado di accedere.",
"An unspecified error occurred. Please check log and settings." : "Si è verificato un errore non specificato. Controlla le impostazioni e il file di log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Il filtro di ricerca non è valido, probabilmente a causa di problemi di sintassi come un numero dispari di parentesi aperte e chiuse. Controlla.",
"A connection error to LDAP/AD occurred. Please check host, port and credentials." : "Si è verificato un errore di connessione a LDAP/AD. Controlla host, porta e credenziali.",
"The \"%uid\" placeholder is missing. It will be replaced with the login name when querying LDAP/AD." : "Manca il segnaposto \"%uid\". Sarà sostituito con il nome di accesso nelle interrogazioni LDAP/AD.",
"When logging in, {instanceName} will find the user based on the following attributes:" : "Quando si effettua l'accesso, {instanceName} troverà l'utente in base ai seguenti attributi:",
"Other Attributes:" : "Altri attributi:",
"Defines the filter to apply, when login is attempted. `%%uid` replaces the username in the login action. Example: `uid=%%uid`" : "Definisce il filtro da applicare quando si tenta l'accesso. `%%uid` sostituisce il nome utente nell'azione di accesso. Esempio: `uid=%%uid`",
"Attempts to receive a DN for the given login name and the current login filter" : "Tenta di ricevere un DN per il nome di accesso specificato e il filtro di accesso corrente",
"Test Login name" : "Nome di login di prova",
"Verify settings" : "Verifica impostazioni",
"No object found in the given Base DN. Please revise." : "Nessun oggetto trovato nel DN base specificato. Controlla.",
"More than 1,000 directory entries available." : "Più di 1.000 cartelle disponibili.",
"_{ldapTestBase} entry available within the provided Base DN_::_{ldapTestBase} entries available within the provided Base DN_" : ["{ldapTestBase} voce disponibile all'interno del DN di base fornito","{ldapTestBase}voci disponibile all'interno del DN di base fornito","{ldapTestBase} entries available within the provided Base DN"],
"When unchecked, this configuration will be skipped." : "Se deselezionata, questa configurazione sarà saltata.",
"Configuration Active" : "Configurazione attiva",
"Copy current configuration into new directory binding" : "Copia la configurazione attuale nella nuova cartella associata",
"Copy configuration" : "Copia configurazione",
"Delete configuration" : "Elimina configurazione",
"You can omit the protocol, unless you require SSL. If so, start with ldaps://" : "È possibile omettere il protocollo, a meno che non sia necessario SSL. In questo caso, inizia con ldaps://",
"Host" : "Host",
"Port" : "Porta",
@@ -138,13 +161,16 @@
"For anonymous access, leave DN and Password empty." : "Per l'accesso anonimo, lascia vuoti i campi DN e Password",
"Password" : "Password",
"Save Credentials" : "Salva credenziali",
"Base DN" : "DN Base",
"One Base DN per line" : "Un DN base per riga",
"You can specify Base DN for users and groups in the Advanced tab" : "Puoi specificare un DN base per gli utenti ed i gruppi nella scheda Avanzate",
"Detect Base DN" : "Rileva DN base",
"Test Base DN" : "Rileva DN base",
"Listing and searching for users is constrained by these criteria:" : "L'elencazione e la ricerca di utenti è vincolata da questi criteri:",
"The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Le classi di oggetti più comuni per gli utenti sono organizationalPerson, person, user, e inetOrgPerson. Se non sei sicuro su quale classe di oggetti selezionare, consulta l'amministratore della tua directory.",
"The filter specifies which LDAP users shall have access to the {instanceName} instance." : "Il filtro specifica quali utenti LDAP devono avere accesso all'istanza {instanceName}.",
"Verify settings and count users" : "Verifica le impostazioni e conta gli utenti",
"User count: {usersCount}" : "Conteggio utenti: {usersCount}",
"Test Configuration" : "Prova configurazione",
"Help" : "Aiuto",
"Server" : "Server",
@@ -153,10 +179,20 @@
"Groups" : "Gruppi",
"Advanced" : "Avanzate",
"Expert" : "Esperto",
"The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "Il modulo PHP LDAP non è installato, il backend non funzionerà. Chiedi all'amministratore di sistema di installarlo.",
"Select LDAP Config" : "Seleziona Configurazione LDAP",
"Create New Config" : "Crea nuova configurazione",
"Create configuration" : "Crea configurazione",
"Username-LDAP User Mapping" : "Associazione Nome utente-Utente LDAP",
"Usernames are used to store and assign metadata. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "I nomi utente sono utilizzati per archiviare e assegnare i metadati. Per identificare con precisione e riconoscere gli utenti, ogni utente LDAP avrà un nome utente interno. Il nome utente creato. Ciò richiede un'associazione tra il nome utente e l'utente LDAP. Il nome utente creato è associato allo UUID dell'utente LDAP. In aggiunta, il DN viene memorizzato in cache per ridurre l'interazione con LDAP, ma non è utilizzato per l'identificazione. Se il DN cambia, le modifiche saranno rilevate. Il nome utente interno è utilizzato dappertutto. La cancellazione delle associazioni lascerà tracce residue ovunque e interesserà tutta la configurazione LDAP. Non cancellare mai le associazioni in un ambiente di produzione, ma solo in una fase sperimentale o di test.",
"Clear Username-LDAP User Mapping" : "Cancella associazione Nome utente-Utente LDAP",
"Clear Groupname-LDAP Group Mapping" : "Cancella associazione Nome gruppo-Gruppo LDAP",
"Confirm action" : "Conferma azione",
"Are you sure you want to permanently delete this LDAP configuration? This cannot be undone." : "Vuoi davvero eliminare definitivamente questa configurazione LDAP? Questa operazione non può essere annullata.",
"Fail to delete config" : "Impossibile eliminare la configurazione",
"Are you sure you want to permanently clear the LDAP mapping? This cannot be undone." : "Vuoi davvero cancellare definitivamente la mappatura LDAP? Questa operazione non può essere annullata.",
"Mapping cleared" : "Mappatura cancellata",
"Failed to clear mapping" : "Impossibile cancellare la mappatura",
"An error occurred" : "Si è verificato un errore",
"Mode switch" : "Cambio modalità",
"Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Il cambio di modalità abiliterà le query LDAP automatiche. In base alla dimensione di LDAP, potrebbero richiedere del tempo. Vuoi ancora cambiare modalità?",
+1
View File
@@ -13,6 +13,7 @@ OC.L10N.register(
"Invalid data specified" : "Наведени су неисправни подаци",
"Could not set configuration %1$s to %2$s" : "Конфигурација %1$s није могла да се постави на %2$s",
"Action does not exist" : "Радња не постоји",
"Renewing …" : "Обнавља се …",
"Very weak password" : "Веома слаба лозинка",
"Weak password" : "Слаба лозинка",
"So-so password" : "Осредња лозинка",
+1
View File
@@ -11,6 +11,7 @@
"Invalid data specified" : "Наведени су неисправни подаци",
"Could not set configuration %1$s to %2$s" : "Конфигурација %1$s није могла да се постави на %2$s",
"Action does not exist" : "Радња не постоји",
"Renewing …" : "Обнавља се …",
"Very weak password" : "Веома слаба лозинка",
"Weak password" : "Слаба лозинка",
"So-so password" : "Осредња лозинка",
+1 -1
View File
@@ -109,7 +109,7 @@ class Helper {
$prefix = 's01';
} else {
sort($prefixes);
$lastKey = array_pop($prefixes);
$lastKey = end($prefixes);
$lastNumber = (int)str_replace('s', '', $lastKey);
$prefix = 's' . str_pad((string)($lastNumber + 1), 2, '0', STR_PAD_LEFT);
}
+10
View File
@@ -0,0 +1,10 @@
OC.L10N.register(
"webhook_listeners",
{
"Webhooks" : "Webhooks",
"Nextcloud Webhook Support" : "Υποστήριξη Webhook Nextcloud",
"Send notifications to external services whenever something important happens, like when files are changed or updated." : "Αποστολή ειδοποιήσεων σε εξωτερικές υπηρεσίες όταν συμβαίνει κάτι σημαντικό, όπως όταν αλλάζουν ή ενημερώνονται αρχεία.",
"Set up webhooks that automatically notify external services whenever certain events - like file changes - occur \n within Nextcloud. By configuring these webhooks, administrators can specify which actions in their Nextcloud instance \n should trigger notifications and where those notifications should be sent, enabling seamless integration with other platforms \n and automating workflows.\n\n The app works by monitoring Nextclouds event system and dispatching HTTP requests (webhooks) containing relevant event \n data to the specified endpoints whenever a configured event takes place. This approach makes it easy to connect Nextcloud \n with external tools, allowing for real-time interactions without needing to manually check for updates or changes.\n\n Administrators can configure webhook listeners via the app's OCS API. The app also provides a command-line tool to list \n currently configured webhooks. There are no Web UI settings." : "Ρυθμίστε webhooks που ειδοποιούν αυτόματα εξωτερικές υπηρεσίες όταν συμβαίνουν συγκεκριμένα συμβάντα - όπως αλλαγές αρχείων - \n εντός του Nextcloud. Με τη ρύθμιση αυτών των webhooks, οι διαχειριστές μπορούν να καθορίσουν ποιες ενέργειες στην εγκατάσταση Nextcloud τους \n θα ενεργοποιούν ειδοποιήσεις και πού θα αποστέλλονται αυτές οι ειδοποιήσεις, επιτρέποντας απρόσκοπτη ενσωμάτωση με άλλες πλατφόρμες \n και αυτοματοποίηση ροών εργασιών.\n\n Η εφαρμογή λειτουργεί παρακολουθώντας το σύστημα συμβάντων του Nextcloud και αποστέλλοντας αιτήματα HTTP (webhooks) που περιέχουν σχετικά δεδομένα συμβάντων \n στα καθορισμένα τελικά σημεία όταν συμβαίνει ένα ρυθμισμένο συμβάν. Αυτή η προσέγγιση διευκολύνει τη σύνδεση του Nextcloud \n με εξωτερικά εργαλεία, επιτρέποντας αλληλεπιδράσεις σε πραγματικό χρόνο χωρίς την ανάγκη για μη αυτόματο έλεγχο ενημερώσεων ή αλλαγών.\n\n Οι διαχειριστές μπορούν να ρυθμίσουν ακροατές webhook μέσω του OCS API της εφαρμογής. Η εφαρμογή παρέχει επίσης ένα εργαλείο γραμμής εντολών για την εμφάνιση \n των τρέχοντων ρυθμισμένων webhooks. Δεν υπάρχουν ρυθμίσεις διαδικτυακής διεπαφής.",
"Nextcloud webhook support" : "Υποστήριξη webhook Nextcloud"
},
"nplurals=2; plural=(n != 1);");
+8
View File
@@ -0,0 +1,8 @@
{ "translations": {
"Webhooks" : "Webhooks",
"Nextcloud Webhook Support" : "Υποστήριξη Webhook Nextcloud",
"Send notifications to external services whenever something important happens, like when files are changed or updated." : "Αποστολή ειδοποιήσεων σε εξωτερικές υπηρεσίες όταν συμβαίνει κάτι σημαντικό, όπως όταν αλλάζουν ή ενημερώνονται αρχεία.",
"Set up webhooks that automatically notify external services whenever certain events - like file changes - occur \n within Nextcloud. By configuring these webhooks, administrators can specify which actions in their Nextcloud instance \n should trigger notifications and where those notifications should be sent, enabling seamless integration with other platforms \n and automating workflows.\n\n The app works by monitoring Nextclouds event system and dispatching HTTP requests (webhooks) containing relevant event \n data to the specified endpoints whenever a configured event takes place. This approach makes it easy to connect Nextcloud \n with external tools, allowing for real-time interactions without needing to manually check for updates or changes.\n\n Administrators can configure webhook listeners via the app's OCS API. The app also provides a command-line tool to list \n currently configured webhooks. There are no Web UI settings." : "Ρυθμίστε webhooks που ειδοποιούν αυτόματα εξωτερικές υπηρεσίες όταν συμβαίνουν συγκεκριμένα συμβάντα - όπως αλλαγές αρχείων - \n εντός του Nextcloud. Με τη ρύθμιση αυτών των webhooks, οι διαχειριστές μπορούν να καθορίσουν ποιες ενέργειες στην εγκατάσταση Nextcloud τους \n θα ενεργοποιούν ειδοποιήσεις και πού θα αποστέλλονται αυτές οι ειδοποιήσεις, επιτρέποντας απρόσκοπτη ενσωμάτωση με άλλες πλατφόρμες \n και αυτοματοποίηση ροών εργασιών.\n\n Η εφαρμογή λειτουργεί παρακολουθώντας το σύστημα συμβάντων του Nextcloud και αποστέλλοντας αιτήματα HTTP (webhooks) που περιέχουν σχετικά δεδομένα συμβάντων \n στα καθορισμένα τελικά σημεία όταν συμβαίνει ένα ρυθμισμένο συμβάν. Αυτή η προσέγγιση διευκολύνει τη σύνδεση του Nextcloud \n με εξωτερικά εργαλεία, επιτρέποντας αλληλεπιδράσεις σε πραγματικό χρόνο χωρίς την ανάγκη για μη αυτόματο έλεγχο ενημερώσεων ή αλλαγών.\n\n Οι διαχειριστές μπορούν να ρυθμίσουν ακροατές webhook μέσω του OCS API της εφαρμογής. Η εφαρμογή παρέχει επίσης ένα εργαλείο γραμμής εντολών για την εμφάνιση \n των τρέχοντων ρυθμισμένων webhooks. Δεν υπάρχουν ρυθμίσεις διαδικτυακής διεπαφής.",
"Nextcloud webhook support" : "Υποστήριξη webhook Nextcloud"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+10 -1
View File
@@ -54,6 +54,7 @@ OC.L10N.register(
"Images" : "Εικόνες",
"Office documents" : "Έγγραφα γραφείου",
"PDF documents" : "Έγγραφα PDF",
"Video" : "Βίντεο",
"Custom MIME type" : "Προσαρμοσμένος τύπος MIME",
"Custom mimetype" : "Προσαρμοσμένος τύπος mime",
"Select a file type" : "Επιλέξτε τύπο αρχείου",
@@ -70,6 +71,8 @@ OC.L10N.register(
"Select a user agent" : "Επιλογή προγράμματος χρήστη",
"Select groups" : "Επιλέξτε ομάδες",
"Groups" : "Ομάδες",
"Type to search for group …" : "Πληκτρολογήστε για αναζήτηση ομάδας…",
"Select a trigger" : "Επιλέξτε ένα έναυσμα",
"At least one event must be selected" : "Τουλάχιστον ένα γεγονός πρέπει να επιλεγεί",
"Add new flow" : "Προσθήκη νέας ροής",
"The configuration is invalid" : "Μή έγκυρη ρύθμιση",
@@ -77,16 +80,20 @@ OC.L10N.register(
"Save" : "Αποθήκευση",
"When" : "Πότε",
"and" : "και",
"Add a new filter" : "Προσθήκη νέου φίλτρου",
"Cancel" : "Ακύρωση",
"Delete" : "Διαγραφή",
"Available flows" : "Διαθέσιμες ροές",
"For details on how to write your own flow, check out the development documentation." : "Για λεπτομέρεις πως μπορείτε να συντάξετε δική σας ροή, δείτε στην τεκμηρίωση προγραμματιστών.",
"No flows installed" : "Δεν έχουν εγκατασταθεί ροές",
"Ask your administrator to install new flows." : "Ζητήστε από τον διαχειριστή σας να εγκαταστήσει νέες ροές.",
"More flows" : "Περισσότερες ροές",
"Browse the App Store" : "Εξερευνήστε την Αγορά εφαρμογών",
"Show less" : "Εμφάνιση λιγότερων",
"Show more" : "Εμφάνιση περισσότερων",
"Configured flows" : "Ρύθμιση ροών",
"Your flows" : "Οι ροές σας",
"No flows configured" : "Δεν έχουν ρυθμιστεί ροές",
"matches" : "ταιριάζει",
"does not match" : "δεν ταιριάζει",
"is" : "είναι",
@@ -111,7 +118,9 @@ OC.L10N.register(
"between" : "μεταξύ",
"not between" : "όχι μεταξύ",
"Request user agent" : "Αιτηθείτε αντιπρόσωπο χρήστη",
"Group membership" : "Συμμετοχή σε ομάδα",
"is member of" : "είναι μέλος του",
"is not member of" : "δεν είναι μέλος του"
"is not member of" : "δεν είναι μέλος του",
"Type to search for group …" : "Πληκτρολογήστε για αναζήτηση ομάδας …"
},
"nplurals=2; plural=(n != 1);");
+10 -1
View File
@@ -52,6 +52,7 @@
"Images" : "Εικόνες",
"Office documents" : "Έγγραφα γραφείου",
"PDF documents" : "Έγγραφα PDF",
"Video" : "Βίντεο",
"Custom MIME type" : "Προσαρμοσμένος τύπος MIME",
"Custom mimetype" : "Προσαρμοσμένος τύπος mime",
"Select a file type" : "Επιλέξτε τύπο αρχείου",
@@ -68,6 +69,8 @@
"Select a user agent" : "Επιλογή προγράμματος χρήστη",
"Select groups" : "Επιλέξτε ομάδες",
"Groups" : "Ομάδες",
"Type to search for group …" : "Πληκτρολογήστε για αναζήτηση ομάδας…",
"Select a trigger" : "Επιλέξτε ένα έναυσμα",
"At least one event must be selected" : "Τουλάχιστον ένα γεγονός πρέπει να επιλεγεί",
"Add new flow" : "Προσθήκη νέας ροής",
"The configuration is invalid" : "Μή έγκυρη ρύθμιση",
@@ -75,16 +78,20 @@
"Save" : "Αποθήκευση",
"When" : "Πότε",
"and" : "και",
"Add a new filter" : "Προσθήκη νέου φίλτρου",
"Cancel" : "Ακύρωση",
"Delete" : "Διαγραφή",
"Available flows" : "Διαθέσιμες ροές",
"For details on how to write your own flow, check out the development documentation." : "Για λεπτομέρεις πως μπορείτε να συντάξετε δική σας ροή, δείτε στην τεκμηρίωση προγραμματιστών.",
"No flows installed" : "Δεν έχουν εγκατασταθεί ροές",
"Ask your administrator to install new flows." : "Ζητήστε από τον διαχειριστή σας να εγκαταστήσει νέες ροές.",
"More flows" : "Περισσότερες ροές",
"Browse the App Store" : "Εξερευνήστε την Αγορά εφαρμογών",
"Show less" : "Εμφάνιση λιγότερων",
"Show more" : "Εμφάνιση περισσότερων",
"Configured flows" : "Ρύθμιση ροών",
"Your flows" : "Οι ροές σας",
"No flows configured" : "Δεν έχουν ρυθμιστεί ροές",
"matches" : "ταιριάζει",
"does not match" : "δεν ταιριάζει",
"is" : "είναι",
@@ -109,7 +116,9 @@
"between" : "μεταξύ",
"not between" : "όχι μεταξύ",
"Request user agent" : "Αιτηθείτε αντιπρόσωπο χρήστη",
"Group membership" : "Συμμετοχή σε ομάδα",
"is member of" : "είναι μέλος του",
"is not member of" : "δεν είναι μέλος του"
"is not member of" : "δεν είναι μέλος του",
"Type to search for group …" : "Πληκτρολογήστε για αναζήτηση ομάδας …"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+1
View File
@@ -71,6 +71,7 @@ OC.L10N.register(
"Select a user agent" : "Одаберите агента захтева",
"Select groups" : "Изаберите групе",
"Groups" : "Групе",
"Type to search for group …" : "Куцајте да претражите групу …",
"Select a trigger" : "Изаберите окидач",
"At least one event must be selected" : "Мора бити одабран бар један догађај",
"Add new flow" : "Додај нови ток",
+1
View File
@@ -69,6 +69,7 @@
"Select a user agent" : "Одаберите агента захтева",
"Select groups" : "Изаберите групе",
"Groups" : "Групе",
"Type to search for group …" : "Куцајте да претражите групу …",
"Select a trigger" : "Изаберите окидач",
"At least one event must be selected" : "Мора бити одабран бар један догађај",
"Add new flow" : "Додај нови ток",
+1
View File
@@ -71,6 +71,7 @@ OC.L10N.register(
"Select a user agent" : "Bir kullanıcı uygulaması seçin",
"Select groups" : "Grupları seçin",
"Groups" : "Gruplar",
"Type to search for group …" : "Grup aramak için yazmaya başlayın…",
"Select a trigger" : "Bir tetikleyici seçin",
"At least one event must be selected" : "En az bir etkinlik seçilmelidir",
"Add new flow" : "Akış ekle",
+1
View File
@@ -69,6 +69,7 @@
"Select a user agent" : "Bir kullanıcı uygulaması seçin",
"Select groups" : "Grupları seçin",
"Groups" : "Gruplar",
"Type to search for group …" : "Grup aramak için yazmaya başlayın…",
"Select a trigger" : "Bir tetikleyici seçin",
"At least one event must be selected" : "En az bir etkinlik seçilmelidir",
"Add new flow" : "Akış ekle",
+49 -50
View File
@@ -9,16 +9,16 @@
"packages-dev": [
{
"name": "behat/behat",
"version": "v3.24.1",
"version": "v3.25.0",
"source": {
"type": "git",
"url": "https://github.com/Behat/Behat.git",
"reference": "1b67565a55283b6c0d050a0e4c4e44025c791a67"
"reference": "bc7f149dde1cd0da82616e6b280e1c9be2ee53e1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Behat/Behat/zipball/1b67565a55283b6c0d050a0e4c4e44025c791a67",
"reference": "1b67565a55283b6c0d050a0e4c4e44025c791a67",
"url": "https://api.github.com/repos/Behat/Behat/zipball/bc7f149dde1cd0da82616e6b280e1c9be2ee53e1",
"reference": "bc7f149dde1cd0da82616e6b280e1c9be2ee53e1",
"shasum": ""
},
"require": {
@@ -40,7 +40,7 @@
"friendsofphp/php-cs-fixer": "^3.68",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^9.6",
"rector/rector": "2.1.4",
"rector/rector": "2.1.7",
"sebastian/diff": "^4.0",
"symfony/filesystem": "^5.4 || ^6.4 || ^7.0",
"symfony/polyfill-php84": "^1.31",
@@ -97,9 +97,9 @@
],
"support": {
"issues": "https://github.com/Behat/Behat/issues",
"source": "https://github.com/Behat/Behat/tree/v3.24.1"
"source": "https://github.com/Behat/Behat/tree/v3.25.0"
},
"time": "2025-09-15T09:09:06+00:00"
"time": "2025-10-03T20:14:49+00:00"
},
{
"name": "behat/gherkin",
@@ -3179,16 +3179,16 @@
},
{
"name": "symfony/config",
"version": "v6.4.24",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
"reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e"
"reference": "f18dc5926cb203e125956987def795d052ee774e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/80e2cf005cf17138c97193be0434cdcfd1b2212e",
"reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e",
"url": "https://api.github.com/repos/symfony/config/zipball/f18dc5926cb203e125956987def795d052ee774e",
"reference": "f18dc5926cb203e125956987def795d052ee774e",
"shasum": ""
},
"require": {
@@ -3234,7 +3234,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/config/tree/v6.4.24"
"source": "https://github.com/symfony/config/tree/v6.4.26"
},
"funding": [
{
@@ -3254,20 +3254,20 @@
"type": "tidelift"
}
],
"time": "2025-07-26T13:50:30+00:00"
"time": "2025-09-11T09:57:09+00:00"
},
{
"name": "symfony/console",
"version": "v6.4.25",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
"reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae"
"reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/console/zipball/273fd29ff30ba0a88ca5fb83f7cf1ab69306adae",
"reference": "273fd29ff30ba0a88ca5fb83f7cf1ab69306adae",
"url": "https://api.github.com/repos/symfony/console/zipball/492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f",
"reference": "492de6dfd93910d7d7a729c5a04ddcd2b9e99c4f",
"shasum": ""
},
"require": {
@@ -3332,7 +3332,7 @@
"terminal"
],
"support": {
"source": "https://github.com/symfony/console/tree/v6.4.25"
"source": "https://github.com/symfony/console/tree/v6.4.26"
},
"funding": [
{
@@ -3352,20 +3352,20 @@
"type": "tidelift"
}
],
"time": "2025-08-22T10:21:53+00:00"
"time": "2025-09-26T12:13:46+00:00"
},
{
"name": "symfony/dependency-injection",
"version": "v6.4.25",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
"reference": "900da8a42eceeb4a13a0ec34caa7db49328daff3"
"reference": "5f311eaf0b321f8ec640f6bae12da43a14026898"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/900da8a42eceeb4a13a0ec34caa7db49328daff3",
"reference": "900da8a42eceeb4a13a0ec34caa7db49328daff3",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5f311eaf0b321f8ec640f6bae12da43a14026898",
"reference": "5f311eaf0b321f8ec640f6bae12da43a14026898",
"shasum": ""
},
"require": {
@@ -3417,7 +3417,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/dependency-injection/tree/v6.4.25"
"source": "https://github.com/symfony/dependency-injection/tree/v6.4.26"
},
"funding": [
{
@@ -3437,7 +3437,7 @@
"type": "tidelift"
}
],
"time": "2025-08-13T09:41:44+00:00"
"time": "2025-09-11T09:57:09+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -4156,16 +4156,16 @@
},
{
"name": "symfony/string",
"version": "v6.4.25",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
"reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1"
"reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/string/zipball/7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1",
"reference": "7cdec7edfaf2cdd9c18901e35bcf9653d6209ff1",
"url": "https://api.github.com/repos/symfony/string/zipball/5621f039a71a11c87c106c1c598bdcd04a19aeea",
"reference": "5621f039a71a11c87c106c1c598bdcd04a19aeea",
"shasum": ""
},
"require": {
@@ -4179,7 +4179,6 @@
"symfony/translation-contracts": "<2.5"
},
"require-dev": {
"symfony/error-handler": "^5.4|^6.0|^7.0",
"symfony/http-client": "^5.4|^6.0|^7.0",
"symfony/intl": "^6.2|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
@@ -4222,7 +4221,7 @@
"utf8"
],
"support": {
"source": "https://github.com/symfony/string/tree/v6.4.25"
"source": "https://github.com/symfony/string/tree/v6.4.26"
},
"funding": [
{
@@ -4242,20 +4241,20 @@
"type": "tidelift"
}
],
"time": "2025-08-22T12:33:20+00:00"
"time": "2025-09-11T14:32:46+00:00"
},
{
"name": "symfony/translation",
"version": "v6.4.24",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
"reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1"
"reference": "c8559fe25c7ee7aa9d28f228903a46db008156a4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation/zipball/300b72643e89de0734d99a9e3f8494a3ef6936e1",
"reference": "300b72643e89de0734d99a9e3f8494a3ef6936e1",
"url": "https://api.github.com/repos/symfony/translation/zipball/c8559fe25c7ee7aa9d28f228903a46db008156a4",
"reference": "c8559fe25c7ee7aa9d28f228903a46db008156a4",
"shasum": ""
},
"require": {
@@ -4321,7 +4320,7 @@
"description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/translation/tree/v6.4.24"
"source": "https://github.com/symfony/translation/tree/v6.4.26"
},
"funding": [
{
@@ -4341,7 +4340,7 @@
"type": "tidelift"
}
],
"time": "2025-07-30T17:30:48+00:00"
"time": "2025-09-05T18:17:25+00:00"
},
{
"name": "symfony/translation-contracts",
@@ -4423,16 +4422,16 @@
},
{
"name": "symfony/var-exporter",
"version": "v6.4.25",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
"reference": "4ff50a1b7c75d1d596aca50899d0c8c7e3de8358"
"reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/4ff50a1b7c75d1d596aca50899d0c8c7e3de8358",
"reference": "4ff50a1b7c75d1d596aca50899d0c8c7e3de8358",
"url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc",
"reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc",
"shasum": ""
},
"require": {
@@ -4480,7 +4479,7 @@
"serialize"
],
"support": {
"source": "https://github.com/symfony/var-exporter/tree/v6.4.25"
"source": "https://github.com/symfony/var-exporter/tree/v6.4.26"
},
"funding": [
{
@@ -4500,20 +4499,20 @@
"type": "tidelift"
}
],
"time": "2025-08-18T13:06:32+00:00"
"time": "2025-09-11T09:57:09+00:00"
},
{
"name": "symfony/yaml",
"version": "v6.4.25",
"version": "v6.4.26",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
"reference": "e54b060bc9c3dc3d4258bf0d165d0064e755f565"
"reference": "0fc8b966fd0dcaab544ae59bfc3a433f048c17b0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/yaml/zipball/e54b060bc9c3dc3d4258bf0d165d0064e755f565",
"reference": "e54b060bc9c3dc3d4258bf0d165d0064e755f565",
"url": "https://api.github.com/repos/symfony/yaml/zipball/0fc8b966fd0dcaab544ae59bfc3a433f048c17b0",
"reference": "0fc8b966fd0dcaab544ae59bfc3a433f048c17b0",
"shasum": ""
},
"require": {
@@ -4556,7 +4555,7 @@
"description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/yaml/tree/v6.4.25"
"source": "https://github.com/symfony/yaml/tree/v6.4.26"
},
"funding": [
{
@@ -4576,7 +4575,7 @@
"type": "tidelift"
}
],
"time": "2025-08-26T16:59:00+00:00"
"time": "2025-09-26T15:07:38+00:00"
},
{
"name": "theseer/tokenizer",
+528 -109
View File
@@ -63,56 +63,6 @@
<code><![CDATA[CommentsEvent::EVENT_PRE_UPDATE]]></code>
</DeprecatedConstant>
</file>
<file src="apps/comments/lib/Search/CommentsSearchProvider.php">
<DeprecatedClass>
<code><![CDATA[Result]]></code>
</DeprecatedClass>
<DeprecatedProperty>
<code><![CDATA[$result->authorId]]></code>
<code><![CDATA[$result->authorId]]></code>
<code><![CDATA[$result->authorId]]></code>
<code><![CDATA[$result->name]]></code>
<code><![CDATA[$result->path]]></code>
</DeprecatedProperty>
</file>
<file src="apps/comments/lib/Search/LegacyProvider.php">
<DeprecatedClass>
<code><![CDATA[Provider]]></code>
<code><![CDATA[new Result($query,
$comment,
$displayName,
$file->getPath(),
$file->getId(),
)]]></code>
</DeprecatedClass>
<DeprecatedMethod>
<code><![CDATA[Provider]]></code>
<code><![CDATA[getUserFolder]]></code>
</DeprecatedMethod>
</file>
<file src="apps/comments/lib/Search/Result.php">
<DeprecatedClass>
<code><![CDATA[BaseResult]]></code>
<code><![CDATA[parent::__construct(
$comment->getId(),
$comment->getMessage()
/* @todo , [link to file] */
)]]></code>
</DeprecatedClass>
<DeprecatedMethod>
<code><![CDATA[parent::__construct(
$comment->getId(),
$comment->getMessage()
/* @todo , [link to file] */
)]]></code>
</DeprecatedMethod>
<DeprecatedProperty>
<code><![CDATA[$this->authorId]]></code>
<code><![CDATA[$this->comment]]></code>
<code><![CDATA[$this->fileName]]></code>
<code><![CDATA[$this->path]]></code>
</DeprecatedProperty>
</file>
<file src="apps/dav/appinfo/v1/caldav.php">
<DeprecatedMethod>
<code><![CDATA[exec]]></code>
@@ -145,6 +95,7 @@
<InternalMethod>
<code><![CDATA[Filesystem::logWarningWhenAddingStorageWrapper($previousLog)]]></code>
<code><![CDATA[Filesystem::logWarningWhenAddingStorageWrapper(false)]]></code>
<code><![CDATA[new View($node->getPath())]]></code>
</InternalMethod>
<UndefinedGlobalVariable>
<code><![CDATA[$baseuri]]></code>
@@ -181,6 +132,9 @@
<DeprecatedMethod>
<code><![CDATA[OC_App::loadApps($RUNTIME_APPTYPES)]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[new View($node->getPath())]]></code>
</InternalMethod>
</file>
<file src="apps/dav/appinfo/v2/remote.php">
<DeprecatedClass>
@@ -356,12 +310,6 @@
</UndefinedMethod>
</file>
<file src="apps/dav/lib/CalDAV/Reminder/NotificationProvider/EmailProvider.php">
<DeprecatedMethod>
<code><![CDATA[validateMailAddress]]></code>
<code><![CDATA[validateMailAddress]]></code>
<code><![CDATA[validateMailAddress]]></code>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
<LessSpecificReturnStatement>
<code><![CDATA[$emailAddresses]]></code>
</LessSpecificReturnStatement>
@@ -431,9 +379,6 @@
</DeprecatedMethod>
</file>
<file src="apps/dav/lib/CalDAV/Schedule/IMipPlugin.php">
<DeprecatedMethod>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
<RedundantCast>
<code><![CDATA[(string)$iTipMessage->recipientName]]></code>
</RedundantCast>
@@ -636,6 +581,31 @@
</UndefinedInterfaceMethod>
</file>
<file src="apps/dav/lib/Connector/Sabre/Directory.php">
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[isDeletable]]></code>
<code><![CDATA[isUpdatable]]></code>
<code><![CDATA[lockFile]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[unlockFile]]></code>
<code><![CDATA[verifyPath]]></code>
<code><![CDATA[verifyPath]]></code>
<code><![CDATA[verifyPath]]></code>
<code><![CDATA[verifyPath]]></code>
<code><![CDATA[verifyPath]]></code>
</InternalMethod>
<InvalidPropertyAssignmentValue>
<code><![CDATA[$nodes]]></code>
</InvalidPropertyAssignmentValue>
@@ -667,6 +637,27 @@
<DeprecatedMethod>
<code><![CDATA[Files::streamCopy($data, $target, true)]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[fopen]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[hash]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[isUpdatable]]></code>
<code><![CDATA[putFileInfo]]></code>
<code><![CDATA[putFileInfo]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[unlink]]></code>
</InternalMethod>
<LessSpecificReturnStatement>
<code><![CDATA[$this->node]]></code>
</LessSpecificReturnStatement>
@@ -691,6 +682,21 @@
</DeprecatedMethod>
</file>
<file src="apps/dav/lib/Connector/Sabre/Node.php">
<InternalMethod>
<code><![CDATA[changeLock]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[lockFile]]></code>
<code><![CDATA[putFileInfo]]></code>
<code><![CDATA[putFileInfo]]></code>
<code><![CDATA[putFileInfo]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[unlockFile]]></code>
<code><![CDATA[verifyPath]]></code>
</InternalMethod>
<InvalidNullableReturnType>
<code><![CDATA[int]]></code>
<code><![CDATA[integer]]></code>
@@ -700,6 +706,18 @@
<code><![CDATA[$this->info->getId()]]></code>
</NullableReturnStatement>
</file>
<file src="apps/dav/lib/Connector/Sabre/ObjectTree.php">
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getMount]]></code>
<code><![CDATA[verifyPath]]></code>
<code><![CDATA[verifyPath]]></code>
</InternalMethod>
</file>
<file src="apps/dav/lib/Connector/Sabre/Principal.php">
<DeprecatedMethod>
<code><![CDATA[search]]></code>
@@ -729,11 +747,20 @@
<code><![CDATA[Circles]]></code>
</UndefinedClass>
</file>
<file src="apps/dav/lib/Connector/Sabre/QuotaPlugin.php">
<InternalMethod>
<code><![CDATA[free_space]]></code>
</InternalMethod>
</file>
<file src="apps/dav/lib/Connector/Sabre/ServerFactory.php">
<DeprecatedMethod>
<code><![CDATA[getL10NFactory]]></code>
<code><![CDATA[getUserFolder]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getRoot]]></code>
</InternalMethod>
</file>
<file src="apps/dav/lib/Connector/Sabre/ShareTypeList.php">
<InvalidArgument>
@@ -811,6 +838,9 @@
</NullableReturnStatement>
</file>
<file src="apps/dav/lib/Files/FileSearchBackend.php">
<InternalMethod>
<code><![CDATA[getRelativePath]]></code>
</InternalMethod>
<InvalidReturnStatement>
<code><![CDATA[$value]]></code>
</InvalidReturnStatement>
@@ -841,11 +871,6 @@
<code><![CDATA[getUserFolder]]></code>
</DeprecatedMethod>
</file>
<file src="apps/dav/lib/Listener/CalendarContactInteractionListener.php">
<DeprecatedMethod>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
</file>
<file src="apps/dav/lib/Migration/BuildCalendarSearchIndex.php">
<DeprecatedMethod>
<code><![CDATA[getAppValue]]></code>
@@ -995,6 +1020,14 @@
</RedundantFunctionCall>
</file>
<file src="apps/dav/lib/Upload/ChunkingV2Plugin.php">
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[new View()]]></code>
<code><![CDATA[putFileInfo]]></code>
</InternalMethod>
<UndefinedInterfaceMethod>
<code><![CDATA[getId]]></code>
<code><![CDATA[getId]]></code>
@@ -1004,6 +1037,14 @@
<code><![CDATA[getSize]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="apps/dav/lib/Upload/UploadHome.php">
<InternalClass>
<code><![CDATA[new View($folder->getPath())]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[new View($folder->getPath())]]></code>
</InternalMethod>
</file>
<file src="apps/dav/lib/UserMigration/ContactsMigrator.php">
<LessSpecificReturnStatement>
<code><![CDATA[[
@@ -1017,6 +1058,71 @@
<code><![CDATA[array{name: string, displayName: string, description: ?string, vCards: VCard[]}]]></code>
</MoreSpecificReturnType>
</file>
<file src="apps/encryption/lib/Command/DropLegacyFileKey.php">
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[fopen]]></code>
<code><![CDATA[fopen]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View()]]></code>
<code><![CDATA[stat]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[unlink]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Command/FixEncryptedVersion.php">
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[fopen]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getMount]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_file]]></code>
<code><![CDATA[stat]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Command/FixKeyLocation.php">
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[copy]]></code>
<code><![CDATA[copy]]></code>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View()]]></code>
<code><![CDATA[opendir]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[rmdir]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Command/ScanLegacyFormat.php">
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View()]]></code>
<code><![CDATA[stat]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Crypto/Crypt.php">
<DeprecatedMethod>
<code><![CDATA[opensslSeal]]></code>
@@ -1025,10 +1131,30 @@
<code><![CDATA[get_class($res) === 'OpenSSLAsymmetricKey']]></code>
</TypeDoesNotContainType>
</file>
<file src="apps/encryption/lib/Crypto/EncryptAll.php">
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[fopen]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[unlink]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Crypto/Encryption.php">
<ImplementedParamTypeMismatch>
<code><![CDATA[$position]]></code>
</ImplementedParamTypeMismatch>
<InternalClass>
<code><![CDATA[new View()]]></code>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[new View()]]></code>
<code><![CDATA[new View()]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/KeyManager.php">
<DeprecatedMethod>
@@ -1039,6 +1165,10 @@
<code><![CDATA[setAppValue]]></code>
<code><![CDATA[setAppValue]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
</InternalMethod>
<InvalidThrow>
<code><![CDATA[throw $exception;]]></code>
</InvalidThrow>
@@ -1056,11 +1186,23 @@
<code><![CDATA[setAppValue]]></code>
<code><![CDATA[setAppValue]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[is_dir]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Settings/Admin.php">
<DeprecatedMethod>
<code><![CDATA[getAppValue]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[new View()]]></code>
</InternalMethod>
</file>
<file src="apps/encryption/lib/Settings/Personal.php">
<DeprecatedMethod>
@@ -1073,6 +1215,10 @@
<code><![CDATA[getAppValue]]></code>
<code><![CDATA[setAppValue]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[getMount]]></code>
</InternalMethod>
</file>
<file src="apps/federatedfilesharing/lib/AddressHandler.php">
<DeprecatedMethod>
@@ -1274,6 +1420,32 @@
<code><![CDATA[\OC_Util::setupFS($destinationUser->getUID())]]></code>
<code><![CDATA[\OC_Util::setupFS($sourceUser->getUID())]]></code>
</DeprecatedClass>
<InternalClass>
<code><![CDATA[new View()]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[free_space]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_file]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[new View()]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[rmdir]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[verifyPath]]></code>
</InternalMethod>
<UndefinedInterfaceMethod>
<code><![CDATA[isReadyForUser]]></code>
</UndefinedInterfaceMethod>
@@ -1305,7 +1477,12 @@
</MoreSpecificReturnType>
</file>
<file src="apps/files_external/lib/Lib/Storage/SFTP.php">
<InternalClass>
<code><![CDATA[new View('/' . $userId . '/files_external')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getLocalFile]]></code>
<code><![CDATA[new View('/' . $userId . '/files_external')]]></code>
<code><![CDATA[put]]></code>
</InternalMethod>
</file>
@@ -1396,6 +1573,15 @@
<code><![CDATA[new QueryException()]]></code>
</DeprecatedClass>
</file>
<file src="apps/files_sharing/lib/Controller/RemoteController.php">
<InternalClass>
<code><![CDATA[new View('/' . \OC_User::getUser() . '/files/')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[new View('/' . \OC_User::getUser() . '/files/')]]></code>
</InternalMethod>
</file>
<file src="apps/files_sharing/lib/Controller/ShareAPIController.php">
<DeprecatedClass>
<code><![CDATA[new QueryException()]]></code>
@@ -1404,7 +1590,6 @@
</DeprecatedClass>
<DeprecatedMethod>
<code><![CDATA[getAppValue]]></code>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
<RedundantCast>
<code><![CDATA[(int)$code]]></code>
@@ -1478,6 +1663,22 @@
<code><![CDATA[Util::connectHook('OC_Filesystem', 'post_rename', '\OCA\Files_Sharing\Updater', 'renameHook')]]></code>
<code><![CDATA[Util::connectHook('OC_User', 'post_deleteUser', '\OCA\Files_Sharing\Hooks', 'deleteUser')]]></code>
</DeprecatedMethod>
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[mkdir]]></code>
</InternalMethod>
</file>
<file src="apps/files_sharing/lib/Hooks.php">
<InternalClass>
<code><![CDATA[new View('/')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[unlink]]></code>
</InternalMethod>
</file>
<file src="apps/files_sharing/lib/Middleware/SharingCheckMiddleware.php">
<DeprecatedInterface>
@@ -1512,6 +1713,14 @@
</DeprecatedMethod>
</file>
<file src="apps/files_sharing/lib/MountProvider.php">
<InternalClass>
<code><![CDATA[new View('/' . $parentShare->getShareOwner() . '/files')]]></code>
<code><![CDATA[new View('/' . $user->getUID() . '/files')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[new View('/' . $parentShare->getShareOwner() . '/files')]]></code>
<code><![CDATA[new View('/' . $user->getUID() . '/files')]]></code>
</InternalMethod>
<RedundantFunctionCall>
<code><![CDATA[array_values]]></code>
</RedundantFunctionCall>
@@ -1522,6 +1731,15 @@
</DeprecatedInterface>
</file>
<file src="apps/files_sharing/lib/ShareBackend/File.php">
<InternalClass>
<code><![CDATA[new View('/' . $shareWith . '/files')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[new View('/' . $shareWith . '/files')]]></code>
</InternalMethod>
<InvalidArgument>
<code><![CDATA[$itemSource]]></code>
<code><![CDATA[$itemSource]]></code>
@@ -1531,6 +1749,12 @@
</MoreSpecificImplementedParamType>
</file>
<file src="apps/files_sharing/lib/SharedMount.php">
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[is_dir]]></code>
</InternalMethod>
<InvalidReturnType>
<code><![CDATA[bool]]></code>
</InvalidReturnType>
@@ -1548,6 +1772,10 @@
<FalsableReturnStatement>
<code><![CDATA[$this->sourceRootInfo]]></code>
</FalsableReturnStatement>
<InternalMethod>
<code><![CDATA[lockFile]]></code>
<code><![CDATA[unlockFile]]></code>
</InternalMethod>
<InvalidNullableReturnType>
<code><![CDATA[ICacheEntry]]></code>
</InvalidNullableReturnType>
@@ -1571,6 +1799,15 @@
<code><![CDATA[moveMount]]></code>
</UndefinedMethod>
</file>
<file src="apps/files_trashbin/lib/BackgroundJob/ExpireTrash.php">
<InternalClass>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
</InternalMethod>
</file>
<file src="apps/files_trashbin/lib/Command/CleanUp.php">
<DeprecatedClass>
<code><![CDATA[\OC_Util::setupFS($uid)]]></code>
@@ -1599,6 +1836,13 @@
<DeprecatedMethod>
<code><![CDATA[\OC_Util::tearDownFS()]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalMethod>
</file>
<file src="apps/files_trashbin/lib/Command/RestoreAllFiles.php">
<DeprecatedClass>
@@ -1615,6 +1859,18 @@
<code><![CDATA[setAppValue]]></code>
</DeprecatedMethod>
</file>
<file src="apps/files_trashbin/lib/Helper.php">
<InternalClass>
<code><![CDATA[new View('/' . $user . '/files_trashbin/files')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getMount]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/files')]]></code>
</InternalMethod>
</file>
<file src="apps/files_trashbin/lib/Sabre/AbstractTrash.php">
<InvalidNullableReturnType>
<code><![CDATA[int]]></code>
@@ -1652,12 +1908,20 @@
<code><![CDATA[ITrash]]></code>
</InvalidReturnType>
</file>
<file src="apps/files_trashbin/lib/Sabre/TrashbinPlugin.php">
<InternalMethod>
<code><![CDATA[free_space]]></code>
</InternalMethod>
</file>
<file src="apps/files_trashbin/lib/Storage.php">
<DeprecatedMethod>
<code><![CDATA[dispatch]]></code>
</DeprecatedMethod>
</file>
<file src="apps/files_trashbin/lib/Trash/LegacyTrashBackend.php">
<InternalMethod>
<code><![CDATA[getRelativePath]]></code>
</InternalMethod>
<UndefinedInterfaceMethod>
<code><![CDATA[$file]]></code>
</UndefinedInterfaceMethod>
@@ -1674,6 +1938,106 @@
<code><![CDATA[query]]></code>
<code><![CDATA[query]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View('/' . $owner)]]></code>
<code><![CDATA[new View('/' . $uid . '/files')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/files/' . $file)]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/versions')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/versions/' . $file)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[new View('/')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[chroot]]></code>
<code><![CDATA[chroot]]></code>
<code><![CDATA[copy]]></code>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[free_space]]></code>
<code><![CDATA[getAbsolutePath]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getPath]]></code>
<code><![CDATA[getRelativePath]]></code>
<code><![CDATA[getRoot]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[isCreatable]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[new View('/' . $owner)]]></code>
<code><![CDATA[new View('/' . $uid . '/files')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/files/' . $file)]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/versions')]]></code>
<code><![CDATA[new View('/' . $user . '/files_trashbin/versions/' . $file)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[new View('/')]]></code>
<code><![CDATA[opendir]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[rename]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[unlink]]></code>
</InternalMethod>
<InvalidArgument>
<code><![CDATA[$timestamp]]></code>
</InvalidArgument>
@@ -1695,6 +2059,13 @@
<code><![CDATA[\OC_Util::tearDownFS()]]></code>
<code><![CDATA[getAppValue]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalMethod>
</file>
<file src="apps/files_versions/lib/Command/CleanUp.php">
<DeprecatedClass>
@@ -1713,6 +2084,22 @@
<DeprecatedMethod>
<code><![CDATA[\OC_Util::tearDownFS()]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
</InternalMethod>
</file>
<file src="apps/files_versions/lib/Listener/FileEventsListener.php">
<InternalClass>
<code><![CDATA[new View($user . '/files')]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[new View($user . '/files')]]></code>
</InternalMethod>
</file>
<file src="apps/files_versions/lib/Sabre/RestoreFolder.php">
<InvalidNullableReturnType>
@@ -1742,6 +2129,77 @@
<code><![CDATA[Files::streamCopy($source, $target, true)]]></code>
<code><![CDATA[dispatch]]></code>
</DeprecatedMethod>
<InternalClass>
<code><![CDATA[new View('')]]></code>
<code><![CDATA[new View('/' . $targetOwner)]]></code>
<code><![CDATA[new View('/' . $targetOwner)]]></code>
<code><![CDATA[new View('/' . $uid . '/')]]></code>
<code><![CDATA[new View('/' . $uid . '/')]]></code>
<code><![CDATA[new View('/' . $uid . '/files')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user->getUID() . '/files')]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filemtime]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[filesize]]></code>
<code><![CDATA[getDirectoryContent]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getOwner]]></code>
<code><![CDATA[getPath]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[is_dir]]></code>
<code><![CDATA[lockFile]]></code>
<code><![CDATA[lockFile]]></code>
<code><![CDATA[mkdir]]></code>
<code><![CDATA[new View('')]]></code>
<code><![CDATA[new View('/' . $targetOwner)]]></code>
<code><![CDATA[new View('/' . $targetOwner)]]></code>
<code><![CDATA[new View('/' . $uid . '/')]]></code>
<code><![CDATA[new View('/' . $uid . '/')]]></code>
<code><![CDATA[new View('/' . $uid . '/files')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $uid . '/files_versions')]]></code>
<code><![CDATA[new View('/' . $user)]]></code>
<code><![CDATA[new View('/' . $user->getUID() . '/files')]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
<code><![CDATA[opendir]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[resolvePath]]></code>
<code><![CDATA[touch]]></code>
<code><![CDATA[unlink]]></code>
<code><![CDATA[unlockFile]]></code>
<code><![CDATA[unlockFile]]></code>
</InternalMethod>
</file>
<file src="apps/files_versions/lib/Versions/LegacyVersionsBackend.php">
<InternalClass>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
</InternalClass>
<InternalMethod>
<code><![CDATA[copy]]></code>
<code><![CDATA[file_put_contents]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[getFileInfo]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
<code><![CDATA[new View('/' . $user->getUID())]]></code>
</InternalMethod>
</file>
<file src="apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php">
<DeprecatedConstant>
@@ -2007,10 +2465,6 @@
</DeprecatedMethod>
</file>
<file src="apps/sharebymail/lib/ShareByMailProvider.php">
<DeprecatedMethod>
<code><![CDATA[validateMailAddress]]></code>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
<InvalidArgument>
<code><![CDATA[$share->getId()]]></code>
<code><![CDATA[(int)$data['id']]]></code>
@@ -2078,11 +2532,6 @@
<code><![CDATA[setAppValue]]></code>
</DeprecatedMethod>
</file>
<file src="apps/testing/lib/Locking/FakeDBLockingProvider.php">
<DeprecatedMethod>
<code><![CDATA[executeUpdate]]></code>
</DeprecatedMethod>
</file>
<file src="apps/testing/lib/Provider/FakeText2ImageProvider.php">
<DeprecatedInterface>
<code><![CDATA[FakeText2ImageProvider]]></code>
@@ -2615,7 +3064,6 @@
</file>
<file src="core/Command/Db/ConvertType.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
<code><![CDATA[getName]]></code>
<code><![CDATA[getPrimaryKeyColumns]]></code>
</DeprecatedMethod>
@@ -2750,11 +3198,6 @@
<code><![CDATA[listen]]></code>
</DeprecatedMethod>
</file>
<file src="core/Command/User/Add.php">
<DeprecatedMethod>
<code><![CDATA[validateMailAddress]]></code>
</DeprecatedMethod>
</file>
<file src="core/Command/User/AuthTokens/Add.php">
<DeprecatedClass>
<code><![CDATA[IToken::DO_NOT_REMEMBER]]></code>
@@ -2914,34 +3357,6 @@
<code><![CDATA[$this->request->server]]></code>
</NoInterfaceProperties>
</file>
<file src="core/Migrations/Version13000Date20170718121200.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
<code><![CDATA[execute]]></code>
<code><![CDATA[execute]]></code>
</DeprecatedMethod>
</file>
<file src="core/Migrations/Version14000Date20180404140050.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
</DeprecatedMethod>
</file>
<file src="core/Migrations/Version16000Date20190427105638.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
</DeprecatedMethod>
</file>
<file src="core/Migrations/Version18000Date20190920085628.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
</DeprecatedMethod>
</file>
<file src="core/Migrations/Version20000Date20201109081918.php">
<DeprecatedMethod>
<code><![CDATA[execute]]></code>
<code><![CDATA[execute]]></code>
</DeprecatedMethod>
</file>
<file src="core/Service/LoginFlowV2Service.php">
<DeprecatedClass>
<code><![CDATA[IToken::DO_NOT_REMEMBER]]></code>
@@ -3621,7 +4036,6 @@
</LessSpecificReturnStatement>
<MoreSpecificReturnType>
<code><![CDATA[\OC\Group\Group[]]]></code>
<code><![CDATA[\OC\Group\Group[]]]></code>
</MoreSpecificReturnType>
<UndefinedInterfaceMethod>
<code><![CDATA[createGroup]]></code>
@@ -3970,6 +4384,11 @@
</InvalidArgument>
</file>
<file src="lib/private/legacy/OC_Helper.php">
<InternalMethod>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[file_exists]]></code>
<code><![CDATA[getAbsolutePath]]></code>
</InternalMethod>
<InvalidArrayOffset>
<code><![CDATA[$matches[0][$last_match]]]></code>
<code><![CDATA[$matches[1][$last_match]]]></code>
+1 -1
View File
@@ -358,7 +358,7 @@ class ConvertType extends Command implements CompletionAwareInterface {
$insertQuery->setParameter($key, $value);
}
}
$insertQuery->execute();
$insertQuery->executeStatement();
}
$result->closeCursor();
+5 -5
View File
@@ -11,12 +11,12 @@ use OC\Files\ObjectStore\ObjectStoreStorage;
use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
use OC\Files\Storage\Wrapper\Encryption;
use OC\Files\Storage\Wrapper\Wrapper;
use OC\Files\View;
use OCA\Files_External\Config\ExternalMountPoint;
use OCA\GroupFolders\Mount\GroupMountPoint;
use OCP\Files\File as OCPFile;
use OCP\Files\Folder;
use OCP\Files\IHomeStorage;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
@@ -31,17 +31,16 @@ use Symfony\Component\Console\Output\OutputInterface;
class File extends Command {
private IL10N $l10n;
private View $rootView;
public function __construct(
IFactory $l10nFactory,
private FileUtils $fileUtils,
private \OC\Encryption\Util $encryptionUtil,
private PrimaryObjectStoreConfig $objectStoreConfig,
private IRootFolder $rootFolder,
) {
$this->l10n = $l10nFactory->get('core');
parent::__construct();
$this->rootView = new View();
}
protected function configure(): void {
@@ -70,9 +69,10 @@ class File extends Command {
if ($node instanceof OCPFile && $node->isEncrypted()) {
$output->writeln(' ' . 'server-side encrypted: yes');
$keyPath = $this->encryptionUtil->getFileKeyDir('', $node->getPath());
if ($this->rootView->file_exists($keyPath)) {
try {
$this->rootFolder->get($keyPath);
$output->writeln(' encryption key at: ' . $keyPath);
} else {
} catch (NotFoundException $e) {
$output->writeln(' <error>encryption key not found</error> should be located at: ' . $keyPath);
}
$storage = $node->getStorage();
+4 -4
View File
@@ -54,7 +54,7 @@ class ListCommand extends Base {
'status',
's',
InputOption::VALUE_OPTIONAL,
'only get the tasks that have a specific status (STATUS_UNKNOWN=0, STATUS_SCHEDULED=1, STATUS_RUNNING=2, STATUS_SUCCESSFUL=3, STATUS_FAILED=4, STATUS_CANCELLED=5)'
'only get the tasks that have a specific status (STATUS_UNKNOWN=0, STATUS_SCHEDULED=1, STATUS_RUNNING=2, STATUS_SUCCESSFUL=3, STATUS_FAILED=4, STATUS_CANCELLED=5)',
)
->addOption(
'scheduledAfter',
@@ -81,9 +81,9 @@ class ListCommand extends Base {
$type = $input->getOption('type');
$appId = $input->getOption('appId');
$customId = $input->getOption('customId');
$status = $input->getOption('status');
$scheduledAfter = $input->getOption('scheduledAfter');
$endedBefore = $input->getOption('endedBefore');
$status = $input->getOption('status') !== null ? (int)$input->getOption('status') : null;
$scheduledAfter = $input->getOption('scheduledAfter') != null ? (int)$input->getOption('scheduledAfter') : null;
$endedBefore = $input->getOption('endedBefore') !== null ? (int)$input->getOption('endedBefore') : null;
$tasks = $this->taskProcessingManager->getTasks($userIdFilter, $type, $appId, $customId, $status, $scheduledAfter, $endedBefore);
$arrayTasks = array_map(static function (Task $task) {
+3 -3
View File
@@ -15,7 +15,7 @@ use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Mail\IMailer;
use OCP\Mail\IEmailValidator;
use OCP\Security\Events\GenerateSecurePasswordEvent;
use OCP\Security\ISecureRandom;
use Symfony\Component\Console\Command\Command;
@@ -30,7 +30,7 @@ class Add extends Command {
public function __construct(
protected IUserManager $userManager,
protected IGroupManager $groupManager,
protected IMailer $mailer,
private IEmailValidator $emailValidator,
private IAppConfig $appConfig,
private NewUserMailHelper $mailHelper,
private IEventDispatcher $eventDispatcher,
@@ -169,7 +169,7 @@ class Add extends Command {
$email = $input->getOption('email');
if (!empty($email)) {
if (!$this->mailer->validateMailAddress($email)) {
if (!$this->emailValidator->isValid($email)) {
$output->writeln(\sprintf(
'<error>The given email address "%s" is invalid. Email not set for the user.</error>',
$email,
+9 -1
View File
@@ -48,6 +48,12 @@ class Add extends Command {
InputOption::VALUE_NONE,
'Read password from environment variable NC_PASS/OC_PASS. Alternatively it will be asked for interactively or an app password without the login password will be created.'
)
->addOption(
'name',
null,
InputOption::VALUE_REQUIRED,
'Name for the app password, defaults to "cli".'
)
;
}
@@ -81,13 +87,15 @@ class Add extends Command {
$output->writeln('<info>No password provided. The generated app password will therefore have limited capabilities. Any operation that requires the login password will fail.</info>');
}
$tokenName = $input->getOption('name') ?: 'cli';
$token = $this->random->generate(72, ISecureRandom::CHAR_UPPER . ISecureRandom::CHAR_LOWER . ISecureRandom::CHAR_DIGITS);
$generatedToken = $this->tokenProvider->generateToken(
$token,
$user->getUID(),
$user->getUID(),
$password,
'cli',
$tokenName,
IToken::PERMANENT_TOKEN,
IToken::DO_NOT_REMEMBER
);
@@ -31,7 +31,7 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
if ($table->hasColumn('fileid')) {
$qb = $this->connection->getQueryBuilder();
$qb->delete('properties');
$qb->execute();
$qb->executeStatement();
}
}
@@ -1008,6 +1008,7 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
$query = $this->connection->getQueryBuilder();
$query->select('*')
->from('dav_properties');
$result = $query->executeQuery();
$insert = $this->connection->getQueryBuilder();
$insert->insert('properties')
@@ -1016,14 +1017,13 @@ class Version13000Date20170718121200 extends SimpleMigrationStep {
->setValue('propertyvalue', $insert->createParameter('propertyvalue'))
->setValue('userid', $insert->createParameter('userid'));
$result = $query->execute();
while ($row = $result->fetch()) {
preg_match('/(calendar)\/([A-z0-9-@_]+)\//', $row['propertypath'], $match);
$insert->setParameter('propertypath', (string)$row['propertypath'])
->setParameter('propertyname', (string)$row['propertyname'])
->setParameter('propertyvalue', (string)$row['propertyvalue'])
->setParameter('userid', ($match[2] ?? ''));
$insert->execute();
$insert->executeStatement();
}
}
}
@@ -62,6 +62,6 @@ class Version14000Date20180404140050 extends SimpleMigrationStep {
$qb->update('users')
->set('uid_lower', $qb->func()->lower('uid'));
$qb->execute();
$qb->executeStatement();
}
}
@@ -29,7 +29,7 @@ class Version16000Date20190427105638 extends SimpleMigrationStep {
$this->connection
->getQueryBuilder()
->delete('collres_accesscache')
->execute();
->executeStatement();
}
/**
@@ -55,6 +55,6 @@ class Version18000Date20190920085628 extends SimpleMigrationStep {
$query = $this->connection->getQueryBuilder();
$query->update('groups')
->set('displayname', 'gid');
$query->execute();
$query->executeStatement();
}
}
@@ -77,12 +77,12 @@ class Version20000Date20201109081918 extends SimpleMigrationStep {
->setValue('identifier', $insert->createParameter('identifier'))
->setValue('credentials', $insert->createParameter('credentials'));
$result = $query->execute();
$result = $query->executeQuery();
while ($row = $result->fetch()) {
$insert->setParameter('user', (string)$row['user'])
->setParameter('identifier', (string)$row['identifier'])
->setParameter('credentials', (string)$row['credentials']);
$insert->execute();
$insert->executeStatement();
}
$result->closeCursor();
}
@@ -1,38 +0,0 @@
/**
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
describe('OCP.Comments tests', function() {
function dataProvider() {
return [
{ input: 'nextcloud.com', expected: 'nextcloud.com' },
{ input: 'http://nextcloud.com', expected: '<a class="external" target="_blank" rel="noopener noreferrer" href="http://nextcloud.com">http://nextcloud.com</a>' },
{ input: 'https://nextcloud.com', expected: '<a class="external" target="_blank" rel="noopener noreferrer" href="https://nextcloud.com">nextcloud.com</a>' },
{ input: 'hi nextcloud.com', expected: 'hi nextcloud.com' },
{ input: 'hi http://nextcloud.com', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="http://nextcloud.com">http://nextcloud.com</a>' },
{ input: 'hi https://nextcloud.com', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="https://nextcloud.com">nextcloud.com</a>' },
{ input: 'nextcloud.com foobar', expected: 'nextcloud.com foobar' },
{ input: 'http://nextcloud.com foobar', expected: '<a class="external" target="_blank" rel="noopener noreferrer" href="http://nextcloud.com">http://nextcloud.com</a> foobar' },
{ input: 'https://nextcloud.com foobar', expected: '<a class="external" target="_blank" rel="noopener noreferrer" href="https://nextcloud.com">nextcloud.com</a> foobar' },
{ input: 'hi nextcloud.com foobar', expected: 'hi nextcloud.com foobar' },
{ input: 'hi http://nextcloud.com foobar', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="http://nextcloud.com">http://nextcloud.com</a> foobar' },
{ input: 'hi https://nextcloud.com foobar', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="https://nextcloud.com">nextcloud.com</a> foobar' },
{ input: 'hi help.nextcloud.com/category/topic foobar', expected: 'hi help.nextcloud.com/category/topic foobar' },
{ input: 'hi http://help.nextcloud.com/category/topic foobar', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="http://help.nextcloud.com/category/topic">http://help.nextcloud.com/category/topic</a> foobar' },
{ input: 'hi https://help.nextcloud.com/category/topic foobar', expected: 'hi <a class="external" target="_blank" rel="noopener noreferrer" href="https://help.nextcloud.com/category/topic">help.nextcloud.com/category/topic</a> foobar' },
{ input: 'noreply@nextcloud.com', expected: 'noreply@nextcloud.com' },
{ input: 'hi noreply@nextcloud.com', expected: 'hi noreply@nextcloud.com' },
{ input: 'hi <noreply@nextcloud.com>', expected: 'hi <noreply@nextcloud.com>' },
{ input: 'FirebaseInstanceId.getInstance().deleteInstanceId()', expected: 'FirebaseInstanceId.getInstance().deleteInstanceId()' },
{ input: 'I mean...it', expected: 'I mean...it' },
]
}
it('should parse URLs only', function() {
dataProvider().forEach(function(data) {
const result = OCP.Comments.plainToRich(data.input)
expect(result).toEqual(data.expected)
})
})
})
+2 -2
View File
@@ -33,12 +33,12 @@ OC.L10N.register(
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Націсніце кнопку ніжэй, каб скінуць пароль. Калі вы не запытвалі скід пароля, праігнаруйце гэты ліст.",
"Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Націсніце спасылку ніжэй, каб скінуць пароль. Калі вы не запытвалі скід пароля, праігнаруйце гэты ліст.",
"Reset your password" : "Скінуць пароль",
"Task not found" : "Задача не знойдзена",
"Task not found" : "Заданне не знойдзена",
"Internal error" : "Унутраная памылка",
"Not found" : "Не знойдзена",
"Node is locked" : "Вузел заблакаваны",
"Bad request" : "Няправільны запыт",
"Requested task type does not exist" : "Запытаны тып задачы не існуе",
"Requested task type does not exist" : "Запытаны тып задання не існуе",
"Necessary language model provider is not available" : "Неабходны пастаўшчык моўнай мадэлі недаступны",
"No text to image provider is available" : "Няма даступных пастаўшчыкоў паслуг пераўтварэння тэксту ў відарыс",
"Image not found" : "Відарыс не знойдзены",
+2 -2
View File
@@ -31,12 +31,12 @@
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Націсніце кнопку ніжэй, каб скінуць пароль. Калі вы не запытвалі скід пароля, праігнаруйце гэты ліст.",
"Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "Націсніце спасылку ніжэй, каб скінуць пароль. Калі вы не запытвалі скід пароля, праігнаруйце гэты ліст.",
"Reset your password" : "Скінуць пароль",
"Task not found" : "Задача не знойдзена",
"Task not found" : "Заданне не знойдзена",
"Internal error" : "Унутраная памылка",
"Not found" : "Не знойдзена",
"Node is locked" : "Вузел заблакаваны",
"Bad request" : "Няправільны запыт",
"Requested task type does not exist" : "Запытаны тып задачы не існуе",
"Requested task type does not exist" : "Запытаны тып задання не існуе",
"Necessary language model provider is not available" : "Неабходны пастаўшчык моўнай мадэлі недаступны",
"No text to image provider is available" : "Няма даступных пастаўшчыкоў паслуг пераўтварэння тэксту ў відарыс",
"Image not found" : "Відарыс не знойдзены",
+1 -1
View File
@@ -1,7 +1,7 @@
OC.L10N.register(
"core",
{
"Please select a file." : "Bitte wählen Sie eine Datei aus.",
"Please select a file." : "Bitte eine Datei auswählen.",
"File is too big" : "Datei ist zu groß",
"The selected file is not an image." : "Die ausgewählte Datei ist kein Bild.",
"The selected file cannot be read." : "Die ausgewählte Datei kann nicht gelesen werden.",
+1 -1
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Please select a file." : "Bitte wählen Sie eine Datei aus.",
"Please select a file." : "Bitte eine Datei auswählen.",
"File is too big" : "Datei ist zu groß",
"The selected file is not an image." : "Die ausgewählte Datei ist kein Bild.",
"The selected file cannot be read." : "Die ausgewählte Datei kann nicht gelesen werden.",
+11
View File
@@ -49,6 +49,7 @@ OC.L10N.register(
"No translation provider available" : "Kullanılabilecek bir çeviri hizmeti sağlayıcı yok",
"Could not detect language" : "Dil algılanamadı",
"Unable to translate" : "Çevrilemedi",
"No valid filters provided" : "Geçerli bir süzgeç belirtilmemiş",
"[%d / %d]: %s" : "[%d / %d]: %s",
"Repair step:" : "Onarım adımı:",
"Repair info:" : "Onarım bilgileri:",
@@ -233,7 +234,9 @@ OC.L10N.register(
"Search in current app" : "Geçerli uygulamada ara",
"Clear search" : "Aramayı temizle",
"Search everywhere" : "Her yerde ara",
"Searching …" : "Aranıyor…",
"Start typing to search" : "Aramak için yazmaya başlayın",
"Minimum search length is {minSearchLength} characters" : "En az {minSearchLength} karakter ile arama yapılabilir ",
"No matching results" : "Aramaya uyan bir sonuç bulunamadı",
"Today" : "Bugün",
"Last 7 days" : "Önceki 7 gün",
@@ -290,16 +293,21 @@ OC.L10N.register(
"Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Collabora Online üzerinde hazırlanmış iş birlikli çalışma belgeleri, hesap tabloları ve sunumlar.",
"Distraction free note taking app." : "Dikkatinizi dağıtmayan not alma uygulaması.",
"Recommended apps" : "Önerilen uygulamalar",
"Loading apps …" : "Uygulamalar yükleniyor…",
"Could not fetch list of apps from the App Store." : "Uygulama mağazasından uygulama listesi alınamadı.",
"App download or installation failed" : "Uygulama indirilemedi ya da kurulamadı",
"Cannot install this app because it is not compatible" : "Bu uygulama uyumlu olmadığından kurulamadı",
"Cannot install this app" : "Bu uygulama kurulamadı",
"Skip" : "Atla",
"Installing apps …" : "Uygulamalar kuruluyor…",
"Install recommended apps" : "Önerilen uygulamaları kur",
"Avatar of {displayName}" : "{displayName} avatarı",
"Settings menu" : "Ayarlar menüsü",
"Loading your contacts …" : "Kişileriniz yükleniyor…",
"Looking for {term} …" : "{term} ifadesi aranıyor…",
"Search contacts" : "Kişi arama",
"Reset search" : "Aramayı sıfırla",
"Search contacts …" : "Kişi arama…",
"Could not load your contacts" : "Kişileriniz yüklenemedi",
"No contacts found" : "Herhangi bir kişi bulunamadı",
"Show all contacts" : "Tüm kişileri görüntüle",
@@ -311,6 +319,7 @@ OC.L10N.register(
"An error occurred while searching for {type}" : "{type} aranırken bir sorun çıktı",
"Search starts once you start typing and results may be reached with the arrow keys" : "Arama, yazmaya başladığınızda başlar ve sonuçlara ok tuşları ile erişilebilir",
"Search for {name} only" : "Yalnızca {name} için ara",
"Loading more results …" : "Diğer sonuçlar yükleniyor…",
"Forgot password?" : "Parolamı unuttum",
"Back to login form" : "Oturum açma formuna dön",
"Back" : "Geri",
@@ -354,6 +363,7 @@ OC.L10N.register(
"Please specify the port number along with the host name (e.g., localhost:5432)." : "Lütfen sunucu adının yanında bağlantı noktasını da belirtin (Örnek: localhost:5432).",
"Database host" : "Veri tabanı sunucusu",
"localhost" : "localhost",
"Installing …" : "Kuruluyor…",
"Install" : "Kur",
"Need help?" : "Yardım gerekiyor mu?",
"See the documentation" : "Belgelere bakın",
@@ -362,6 +372,7 @@ OC.L10N.register(
"Your browser is not supported. Please upgrade to a newer version or a supported one." : "Tarayıcınız desteklenmiyor. Lütfen daha yeni bir sürüme ya da desteklenen bir sürüme yükseltin.",
"Continue with this unsupported browser" : "Bu desteklenmeyen tarayıcı ile ilerle",
"Supported versions" : "Desteklenen sürümler",
"Search {types} …" : "{types} arama…",
"Choose {file}" : "{file} seçin",
"Choose" : "Seçin",
"Copy to {target}" : "{target} içine kopyala",
+11
View File
@@ -47,6 +47,7 @@
"No translation provider available" : "Kullanılabilecek bir çeviri hizmeti sağlayıcı yok",
"Could not detect language" : "Dil algılanamadı",
"Unable to translate" : "Çevrilemedi",
"No valid filters provided" : "Geçerli bir süzgeç belirtilmemiş",
"[%d / %d]: %s" : "[%d / %d]: %s",
"Repair step:" : "Onarım adımı:",
"Repair info:" : "Onarım bilgileri:",
@@ -231,7 +232,9 @@
"Search in current app" : "Geçerli uygulamada ara",
"Clear search" : "Aramayı temizle",
"Search everywhere" : "Her yerde ara",
"Searching …" : "Aranıyor…",
"Start typing to search" : "Aramak için yazmaya başlayın",
"Minimum search length is {minSearchLength} characters" : "En az {minSearchLength} karakter ile arama yapılabilir ",
"No matching results" : "Aramaya uyan bir sonuç bulunamadı",
"Today" : "Bugün",
"Last 7 days" : "Önceki 7 gün",
@@ -288,16 +291,21 @@
"Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Collabora Online üzerinde hazırlanmış iş birlikli çalışma belgeleri, hesap tabloları ve sunumlar.",
"Distraction free note taking app." : "Dikkatinizi dağıtmayan not alma uygulaması.",
"Recommended apps" : "Önerilen uygulamalar",
"Loading apps …" : "Uygulamalar yükleniyor…",
"Could not fetch list of apps from the App Store." : "Uygulama mağazasından uygulama listesi alınamadı.",
"App download or installation failed" : "Uygulama indirilemedi ya da kurulamadı",
"Cannot install this app because it is not compatible" : "Bu uygulama uyumlu olmadığından kurulamadı",
"Cannot install this app" : "Bu uygulama kurulamadı",
"Skip" : "Atla",
"Installing apps …" : "Uygulamalar kuruluyor…",
"Install recommended apps" : "Önerilen uygulamaları kur",
"Avatar of {displayName}" : "{displayName} avatarı",
"Settings menu" : "Ayarlar menüsü",
"Loading your contacts …" : "Kişileriniz yükleniyor…",
"Looking for {term} …" : "{term} ifadesi aranıyor…",
"Search contacts" : "Kişi arama",
"Reset search" : "Aramayı sıfırla",
"Search contacts …" : "Kişi arama…",
"Could not load your contacts" : "Kişileriniz yüklenemedi",
"No contacts found" : "Herhangi bir kişi bulunamadı",
"Show all contacts" : "Tüm kişileri görüntüle",
@@ -309,6 +317,7 @@
"An error occurred while searching for {type}" : "{type} aranırken bir sorun çıktı",
"Search starts once you start typing and results may be reached with the arrow keys" : "Arama, yazmaya başladığınızda başlar ve sonuçlara ok tuşları ile erişilebilir",
"Search for {name} only" : "Yalnızca {name} için ara",
"Loading more results …" : "Diğer sonuçlar yükleniyor…",
"Forgot password?" : "Parolamı unuttum",
"Back to login form" : "Oturum açma formuna dön",
"Back" : "Geri",
@@ -352,6 +361,7 @@
"Please specify the port number along with the host name (e.g., localhost:5432)." : "Lütfen sunucu adının yanında bağlantı noktasını da belirtin (Örnek: localhost:5432).",
"Database host" : "Veri tabanı sunucusu",
"localhost" : "localhost",
"Installing …" : "Kuruluyor…",
"Install" : "Kur",
"Need help?" : "Yardım gerekiyor mu?",
"See the documentation" : "Belgelere bakın",
@@ -360,6 +370,7 @@
"Your browser is not supported. Please upgrade to a newer version or a supported one." : "Tarayıcınız desteklenmiyor. Lütfen daha yeni bir sürüme ya da desteklenen bir sürüme yükseltin.",
"Continue with this unsupported browser" : "Bu desteklenmeyen tarayıcı ile ilerle",
"Supported versions" : "Desteklenen sürümler",
"Search {types} …" : "{types} arama…",
"Choose {file}" : "{file} seçin",
"Choose" : "Seçin",
"Copy to {target}" : "{target} içine kopyala",

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