Compare commits

..

76 Commits

Author SHA1 Message Date
John Molakvoæ 0b8183e360 Merge pull request #38719 from nextcloud/skjnldsv-patch-1 2023-06-09 11:12:59 +02:00
John Molakvoæ c19eb782c7 Merge pull request #38693 from nextcloud/release/27.0.0_rc4 2023-06-09 10:50:57 +02:00
John Molakvoæ b1f13297bc Create lint-eslint-when-unrelated.yml
Signed-off-by: John Molakvoæ <skjnldsv@users.noreply.github.com>
2023-06-09 10:49:58 +02:00
John Molakvoæ adef6deb3d 27.0.0 RC4
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
2023-06-09 09:43:39 +02:00
John Molakvoæ a0a5d5d063 Merge pull request #38717 from nextcloud/backport/38703/stable27 2023-06-09 09:42:49 +02:00
Côme Chilliet 9330739014 Correctly react to bad configuration
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2023-06-09 08:40:54 +02:00
Côme Chilliet 71adc305dc Do not cast sizes to int in Trashbin class
This helps with 32bits support

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2023-06-09 08:40:53 +02:00
John Molakvoæ 09464c6453 Merge pull request #38702 from nextcloud/backport/38486/stable27 2023-06-08 16:19:59 +02:00
Joas Schilling 9c8e229ee9 fix(psalm): Install apcu, ftp and ldap extension like in static-code-analysis-security
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-06-08 14:06:02 +02:00
Joas Schilling 84af099e72 fix(CI): Temporary workaround - Run Psalm CI with 1 thread only so it finishes
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-06-08 14:06:02 +02:00
Joas Schilling 55ef2a093b fix(CI): Update oracle image and config
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-06-08 13:06:41 +02:00
John Molakvoæ 52d39183c5 chore: update workflows from templates
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
2023-06-08 13:06:36 +02:00
Simon L fb20f258d5 Merge pull request #38697 from nextcloud/backport/38694/stable27
[stable27] fix(actions): cypress
2023-06-08 12:42:00 +02:00
John Molakvoæ 7a137fcaa5 fix(actions): cypress
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
2023-06-08 08:19:18 +00:00
Nextcloud bot f68b801500 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-08 00:19:02 +00:00
Nextcloud bot 92d287b64c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-07 00:18:03 +00:00
Andy Scherzinger 2eaf70b92c Merge pull request #38657 from nextcloud/backport/38656/stable27
[stable27] Fix OpenAPI core paths
2023-06-06 07:01:59 +02:00
jld3103 5d5ed4f57a Fix OpenAPI core paths
Signed-off-by: jld3103 <jld3103yt@gmail.com>
2023-06-06 04:49:31 +00:00
Nextcloud bot 32976c8fe5 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-06 00:17:48 +00:00
Arthur Schiwon b72cd54ee0 Merge pull request #38571 from nextcloud/backport/38355/stable27
[stable27] fix(trashbin): Truncate long filenames
2023-06-05 17:38:08 +02:00
Andy Scherzinger dfd0be7be5 Merge pull request #38641 from nextcloud/backport/38640/stable27
[stable27] openapi: Fix wrapping OCS responses that are not DataResponse
2023-06-05 09:08:28 +02:00
jld3103 e312b5bf2b openapi: Fix wrapping OCS responses that are not DataResponse
Signed-off-by: jld3103 <jld3103yt@gmail.com>
2023-06-05 07:05:02 +00:00
Nextcloud bot ddc8634695 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-05 00:17:37 +00:00
Nextcloud bot 114ab80d4a Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-04 00:17:44 +00:00
Simon L 462940e423 Merge pull request #38617 from nextcloud/automated/noid/stable27-fix-npm-audit
[stable27] Fix npm audit
2023-06-03 13:03:39 +02:00
Nextcloud bot e5fdcde2aa Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-03 00:17:58 +00:00
nextcloud-command 0f6e6dc208 chore(deps): fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2023-06-02 15:25:44 +00:00
Nextcloud bot 889d76f3fd Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-02 00:17:35 +00:00
Andy Scherzinger 3e72ad1152 Merge pull request #38588 from nextcloud/backport/38586/stable27
[stable27] fix(ocp): Mark IMessage::attachInline as @since 27
2023-06-01 18:46:32 +02:00
Christoph Wurst a7bade0e03 fix(ocp): Mark IMessage::attachInline as @since 27
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2023-06-01 16:40:32 +00:00
John Molakvoæ 8c2cb58542 Merge pull request #38559 from nextcloud/release/27.0.0_rc3 2023-06-01 17:37:13 +02:00
Arthur Schiwon a845fc7395 Merge pull request #38449 from nextcloud/backport/38415/stable27
[stable27] don't always check if we need to setup the object store root
2023-06-01 17:33:50 +02:00
Andy Scherzinger f5d5636272 Merge pull request #38538 from nextcloud/backport/37758/stable27
[stable27] redis: use atomic operations everywhere
2023-06-01 17:12:05 +02:00
Christopher Ng 4d206376f3 fix(trashbin): Truncate long filenames
Signed-off-by: Christopher Ng <chrng8@gmail.com>
2023-06-01 09:37:28 +00:00
John Molakvoæ ca1d9a167e Merge pull request #38522 from nextcloud/artonge/backport/stable27/38469 2023-06-01 10:15:01 +02:00
John Molakvoæ 962dc932d9 Merge pull request #38507 from nextcloud/backport/38496/stable27 2023-06-01 10:08:06 +02:00
John Molakvoæ 4baba4d7e9 Merge pull request #38360 from nextcloud/backport/38294/stable27 2023-06-01 10:06:26 +02:00
John Molakvoæ 1a76ea188d Merge pull request #38409 from nextcloud/backport/38291/stable27 2023-06-01 10:05:11 +02:00
Nextcloud bot a379bba6b8 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-06-01 00:18:03 +00:00
John Molakvoæ 615e466017 27.0.0 RC3
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
2023-05-31 16:37:30 +02:00
Joas Schilling 3f1236ce9e Merge pull request #38531 from nextcloud/automated/noid/stable27-update-ca-cert-bundle
[stable27] Update ca-cert bundle
2023-05-31 09:26:01 +02:00
Varun Patil 24875c02db redis: move lua scripts to class and add type hints
Signed-off-by: Varun Patil <varunpatil@ucla.edu>
2023-05-31 07:13:21 +00:00
Robin Appelman 5b137a2498 add test to verify redis lua script hashes
Signed-off-by: Robin Appelman <robin@icewind.nl>
2023-05-31 07:13:20 +00:00
Varun Patil 8745f76bd0 redis: use atomic operations everywhere
This removes a lot of acrobatics in the code and does each operation
atomically using a lua script. This also reduces several round trips
to the server, and the scripts are compiled and cached server-side.

Notably, since all operations work only on a single key (except clear,
which is broken anyway and shouldn't be used), they will continue to
function and be atomic for Redis cluster.

Signed-off-by: Varun Patil <varunpatil@ucla.edu>
2023-05-31 07:13:20 +00:00
nextcloud-command ade5db1821 Update CA certificate bundle
Signed-off-by: GitHub <noreply@github.com>
2023-05-31 02:33:27 +00:00
Nextcloud bot 9ef37aaa6e Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-31 00:17:47 +00:00
Louis Chemineau e54bfc00bd Fix initialisation of versions in the DB
Broken after https://github.com/nextcloud/server/pull/36690

Signed-off-by: Louis Chemineau <louis@chmn.me>
2023-05-30 16:41:03 +02:00
Joas Schilling 297ba1cd3a Merge pull request #38416 from nextcloud/backport/38308/stable27
[stable27] fix(carddav): Check if SERVER variables are set before accessing them
2023-05-30 12:12:53 +02:00
Daniel Kesselberg 5630703061 fix: catch errors in id3parser library
We use a forked version of getID3 to read embedded images from mp3 files to use them as previews.

If the library is unable to extract a image or fails on something different we should handle it properly.

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
2023-05-30 09:06:35 +00:00
Nextcloud bot d9ff25230c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-30 00:17:41 +00:00
Nextcloud bot f5083aacc7 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-28 00:17:37 +00:00
Nextcloud bot 0ad9cbf884 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-27 00:18:02 +00:00
Joas Schilling 281d0aa964 Merge pull request #38485 from nextcloud/backport/38481/stable27
[stable27] fix(dav): Fix avatar size in system address book
2023-05-26 14:14:25 +02:00
Joas Schilling bbb9437116 fix(dav): Fix avatar size in system address book
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-05-26 10:28:59 +00:00
Arthur Schiwon 3ad8007218 Merge pull request #38436 from nextcloud/release/27.0.0_rc2
27.0.0 RC2
2023-05-25 18:51:49 +02:00
Arthur Schiwon 7e7a113c66 Merge pull request #38471 from nextcloud/backport/38448/stable27
[stable27] fix(carddav): Don't show system address book cards to guests
2023-05-25 18:50:42 +02:00
Christoph Wurst 67d8c36537 fix(carddav): Don't show system address book cards to guests
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2023-05-25 18:21:06 +02:00
Arthur Schiwon ebb2f813a7 Merge pull request #38440 from nextcloud/bugfix/stable27/catch-doctrine-exception
[stable27] fix: Catch Deadlock properly as execute throws Doctrine exceptions not our wrapped ones
2023-05-25 12:27:27 +02:00
Andy Scherzinger f5dc8fdfba Merge pull request #38455 from nextcloud/backport/38423/stable27
[stable27] fix(carddav): Check enumeration settings for all SAB methods
2023-05-25 12:11:45 +02:00
John Molakvoæ 6e10a457d7 Merge pull request #38444 from nextcloud/backport/38441/stable27 2023-05-25 10:35:24 +02:00
Christoph Wurst 11d21994f9 fix(carddav): Check enumeration settings for all SAB methods
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
2023-05-25 08:26:57 +00:00
John Molakvoæ adcd4efbcc fix(files): make open folder a default action
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2023-05-25 06:32:34 +00:00
Robin Appelman 780a744e07 don't always check if we need to setup the object store root
Signed-off-by: Robin Appelman <robin@icewind.nl>
2023-05-24 21:55:56 +00:00
Julius Härtl ce8e21d2c5 fix: execute throws docrine exceptions not our wrapped ones
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-24 20:45:51 +02:00
Andy Scherzinger 0799ef8ec5 Merge pull request #38443 from nextcloud/backport/38438/stable27
[stable27] Add OpenAPI specs
2023-05-24 19:32:19 +02:00
jld3103 b683f77842 Add OpenAPI specs
Signed-off-by: jld3103 <jld3103yt@gmail.com>
2023-05-24 16:25:28 +00:00
Arthur Schiwon 12d5152f62 27.0.0 RC2
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2023-05-24 15:17:54 +02:00
Johannes 16a1ec629f Merge pull request #38419 from nextcloud/backport/38413/stable27
[stable27] fix(SAB): Save avatar to SAB
2023-05-23 20:02:49 +02:00
Johannes Merkel d96200baed fix(SAB): Save avatar to SAB
Signed-off-by: Johannes Merkel <mail@johannesgge.de>
2023-05-23 14:08:35 +00:00
Anna Larch c1ac314ff1 fix(carddav): Check if SERVER variables are set before accessing them
Signed-off-by: Anna Larch <anna@nextcloud.com>
2023-05-23 12:41:15 +00:00
Robin Appelman 21d50794f0 fix loading custom logo image
Signed-off-by: Robin Appelman <robin@icewind.nl>
2023-05-23 07:41:40 +00:00
fenn-cs 241a513b7e Use aria-expanded correctly on toggle user actions
The aria-expanded attribute was added on the expandable item rather
Than the button that triggers the expand.

Resolves : #37137

Signed-off-by: fenn-cs <fenn25.fn@gmail.com>
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2023-05-22 10:46:54 +00:00
Joas Schilling 713b9603a4 Merge pull request #38339 from nextcloud/welcome/stable27
chore(CI): Test against stable27 branches of needed apps
2023-05-22 11:09:55 +02:00
Arthur Schiwon 74b4fd28d8 Merge pull request #38341 from nextcloud/release/27.0.0_rc1
27.0.0 RC1
2023-05-17 15:25:05 +02:00
Arthur Schiwon 24b86cec64 27.0.0 RC1
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
2023-05-17 12:47:46 +02:00
Joas Schilling a11db03693 chore(CI): Test against stable27 branches of needed apps
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-05-17 10:58:55 +02:00
3056 changed files with 67188 additions and 84797 deletions
+15
View File
@@ -0,0 +1,15 @@
codecov:
branch: master
ci:
- drone.nextcloud.com
- !scrutinizer-ci.com
coverage:
precision: 2
round: down
range: "70...100"
status:
project: off
patch: off
comment: off
+121 -5
View File
@@ -1,4 +1,3 @@
---
kind: pipeline
name: checkers
@@ -1241,7 +1240,7 @@ steps:
commands:
# JavaScript files are not used in integration tests, so it is not needed to
# build them.
- git clone --depth 1 --branch master https://github.com/nextcloud/spreed apps/spreed
- git clone --depth 1 --branch stable27 https://github.com/nextcloud/spreed apps/spreed
- cd apps/spreed
- composer --version
- composer self-update --2
@@ -1591,6 +1590,126 @@ trigger:
- pull_request
- push
---
kind: pipeline
name: acceptance-app-files
steps:
- name: submodules
image: ghcr.io/nextcloud/continuous-integration-alpine-git:latest
commands:
- git submodule update --init
- name: acceptance-app-files
image: ghcr.io/nextcloud/continuous-integration-acceptance-php8.0:latest
commands:
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files --selenium-server selenium:4444 allow-git-repository-modifications features/app-files.feature
services:
- name: selenium
image: ghcr.io/nextcloud/continuous-integration-selenium:3.141.59
environment:
# Reduce default log level for Selenium server (INFO) as it is too
# verbose.
JAVA_OPTS: -Dselenium.LOGGER.level=WARNING
trigger:
branch:
- master
- stable*
event:
- pull_request
- push
---
kind: pipeline
name: acceptance-app-files-sharing
steps:
- name: submodules
image: ghcr.io/nextcloud/continuous-integration-alpine-git:latest
commands:
- git submodule update --init
- name: acceptance-app-files-sharing
image: ghcr.io/nextcloud/continuous-integration-acceptance-php8.0:latest
commands:
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files-sharing --selenium-server selenium:4444 allow-git-repository-modifications features/app-files-sharing.feature
services:
- name: selenium
image: ghcr.io/nextcloud/continuous-integration-selenium:3.141.59
environment:
# Reduce default log level for Selenium server (INFO) as it is too
# verbose.
JAVA_OPTS: -Dselenium.LOGGER.level=WARNING
trigger:
branch:
- master
- stable*
event:
- pull_request
- push
---
kind: pipeline
name: acceptance-app-files-sharing-link
steps:
- name: submodules
image: ghcr.io/nextcloud/continuous-integration-alpine-git:latest
commands:
- git submodule update --init
- name: acceptance-app-files-sharing-link
image: ghcr.io/nextcloud/continuous-integration-acceptance-php8.0:latest
commands:
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files-sharing-link --selenium-server selenium:4444 allow-git-repository-modifications features/app-files-sharing-link.feature
services:
- name: selenium
image: ghcr.io/nextcloud/continuous-integration-selenium:3.141.59
environment:
# Reduce default log level for Selenium server (INFO) as it is too
# verbose.
JAVA_OPTS: -Dselenium.LOGGER.level=WARNING
trigger:
branch:
- master
- stable*
event:
- pull_request
- push
---
kind: pipeline
name: acceptance-app-files-tags
steps:
- name: submodules
image: ghcr.io/nextcloud/continuous-integration-alpine-git:latest
commands:
- git submodule update --init
- name: acceptance-app-files-tags
image: ghcr.io/nextcloud/continuous-integration-acceptance-php8.0:latest
commands:
- tests/acceptance/run-local.sh --timeout-multiplier 10 --nextcloud-server-domain acceptance-app-files-tags --selenium-server selenium:4444 allow-git-repository-modifications features/app-files-tags.feature
services:
- name: selenium
image: ghcr.io/nextcloud/continuous-integration-selenium:3.141.59
environment:
# Reduce default log level for Selenium server (INFO) as it is too
# verbose.
JAVA_OPTS: -Dselenium.LOGGER.level=WARNING
trigger:
branch:
- master
- stable*
event:
- pull_request
- push
---
kind: pipeline
name: acceptance-header
@@ -1876,6 +1995,3 @@ trigger:
event:
- pull_request
- push
---
kind: signature
hmac: a5c0c1e40125b53ff88c617699710f3dc9685d80f06fd8f560b2662ccb1c3497
-4
View File
@@ -24,10 +24,6 @@ trim_trailing_whitespace = false
[*.svg]
insert_final_newline = false
[package*.json]
indent_size = 2
indent_style = space
[build/psalm-baseline.xml]
indent_size = 2
indent_style = space
+8 -5
View File
@@ -3,18 +3,21 @@ module.exports = {
__webpack_nonce__: true,
_: true,
$: true,
dayNames: true,
escapeHTML: true,
firstDay: true,
moment: true,
escapeHTML: true,
oc_userconfig: true,
sinon: true,
dayNames: true,
firstDay: true,
'cypress/globals': true,
},
parserOptions: {
parser: '@typescript-eslint/parser',
},
plugins: [
'cypress',
],
extends: [
'@nextcloud/eslint-config/typescript',
'@nextcloud',
'plugin:cypress/recommended',
],
rules: {
+4 -9
View File
@@ -8,10 +8,9 @@
/apps/dav/lib/CardDAV @ChristophWurst @miaulalala @tcitworld
/apps/encryption/appinfo/info.xml @come-nc @icewind1991
/apps/federatedfilesharing/appinfo/info.xml @icewind1991 @danxuliu
/apps/federation/appinfo/info.xml @datenangebot
/apps/federation/appinfo/info.xml @vitormattos @datenangebot
/apps/files/appinfo/info.xml @skjnldsv @Pytal @ArtificialOwl @come-nc @artonge @icewind1991 @szaimen @susnux @Fenn-CS
/apps/files_external/appinfo/info.xml @icewind1991 @artonge
/apps/files_reminders/appinfo/info.xml @Pytal
/apps/files_sharing/appinfo/info.xml @skjnldsv @come-nc
/apps/files_trashbin/appinfo/info.xml @Pytal @icewind1991
/apps/files_versions/appinfo/info.xml @artonge @icewind1991
@@ -32,13 +31,9 @@
# Two-Factor Authentication
# https://github.com/nextcloud/wg-two-factor-authentication#members
**/TwoFactorAuth @ChristophWurst @miaulalala @nickvergessen @st3iny
/apps/twofactor_backupcodes @ChristophWurst @miaulalala @nickvergessen @st3iny
/core/templates/twofactor* @ChristophWurst @miaulalala @nickvergessen @st3iny
# OpenAPI
openapi.json @provokateurin
ResponseDefinitions.php @provokateurin
/apps/twofactor_backupcodes @ChristophWurst @miaulalala @nickvergessen
*/TwoFactorAuth/* @ChristophWurst @miaulalala @nickvergessen
/core/templates/twofactor* @ChristophWurst @miaulalala @nickvergessen
# Personal interest
*/Activity/* @nickvergessen
+11 -6
View File
@@ -17,10 +17,12 @@ body:
options:
- label: This is a **bug**, not a question or a configuration/webserver/proxy issue.
required: true
- label: This issue is **not** already reported on [Github](https://github.com/nextcloud/server/issues?q=is%3Aopen+is%3Aissue+label%3Abug) OR [Nextcloud Community Forum](https://help.nextcloud.com/) _(I've searched it)_.
- label: This issue is **not** already reported on Github _(I've searched it)_.
required: true
- label: Nextcloud Server **is** up to date. See [Maintenance and Release Schedule](https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule) for supported versions.
required: true
- label: Nextcloud Server **is** running on 64bit capable CPU, PHP and OS.
required: true
- label: I agree to follow Nextcloud's [Code of Conduct](https://nextcloud.com/contribute/code-of-conduct/).
required: true
- type: textarea
@@ -60,6 +62,7 @@ body:
Select installation method you've used.
_Describe the method in the "Additional info" section if you chose "Other"._
options:
- "Official All-in-One appliance"
- "Community Web installer on a VPS or web space"
- "Community Manual installation with Archive"
- "Community Docker image"
@@ -67,7 +70,6 @@ body:
- "Community SNAP package"
- "Community VM appliance"
- "Other Community project"
- "Official All-in-One appliance"
- type: dropdown
id: nextcloud-version
attributes:
@@ -76,9 +78,9 @@ body:
Select Nextcloud Server version.
_Versions not listed here are not maintained and not supported anymore_
options:
- "24"
- "25"
- "26"
- "27"
- "master"
validations:
required: true
@@ -101,10 +103,10 @@ body:
Select PHP engine version serving Nextcloud Server.
_Describe in the "Additional info" section if you chose "Other"._
options:
- "PHP 7.3"
- "PHP 7.4"
- "PHP 8.0"
- "PHP 8.1"
- "PHP 8.2"
- "Other"
- type: dropdown
id: webserver
@@ -116,6 +118,7 @@ body:
options:
- "Apache (supported)"
- "Nginx"
- "Lighttpd"
- "Other"
- type: dropdown
id: database
@@ -138,8 +141,8 @@ body:
description: |
Select if bug is present after an update or on a fresh install.
options:
- "Updated from a MINOR version (ex. 22.1 to 22.2)"
- "Upgraded to a MAJOR version (ex. 22 to 23)"
- "Updated from a minor version (ex. 22.2.3 to 22.2.4)"
- "Updated to a major version (ex. 22.2.3 to 23.0.1)"
- "Fresh Nextcloud Server install"
- type: dropdown
id: encryption
@@ -189,6 +192,8 @@ body:
```
> NOTE: This will be automatically formatted into code for better readability.
render: shell
validations:
required: true
- type: textarea
id: nextcloud-signingstatus
attributes:
+36 -69
View File
@@ -57,6 +57,24 @@ updates:
# Main stableXX npm
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
target-branch: stable24
labels:
- "3. to review"
- "feature: dependencies"
reviewers:
- "nextcloud/server-dependabot"
ignore:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
- package-ecosystem: npm
directory: "/"
schedule:
@@ -74,8 +92,6 @@ updates:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
# Disable automatic rebasing because without a build CI will likely fail anyway
rebase-strategy: "disabled"
- package-ecosystem: npm
directory: "/"
@@ -94,30 +110,26 @@ updates:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
# Disable automatic rebasing because without a build CI will likely fail anyway
rebase-strategy: "disabled"
- package-ecosystem: npm
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
target-branch: stable27
labels:
- "3. to review"
- "feature: dependencies"
reviewers:
- "nextcloud/server-dependabot"
ignore:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
# Disable automatic rebasing because without a build CI will likely fail anyway
rebase-strategy: "disabled"
# Testing StableXX composer
- package-ecosystem: composer
directory: "/build/integration"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
target-branch: stable24
labels:
- "3. to review"
- "feature: dependencies"
reviewers:
- "nextcloud/server-dependabot"
ignore:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
- package-ecosystem: composer
directory: "/build/integration"
schedule:
@@ -135,48 +147,3 @@ updates:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
- package-ecosystem: composer
directory: "/build/integration"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
target-branch: stable26
labels:
- "3. to review"
- "feature: dependencies"
reviewers:
- "nextcloud/server-dependabot"
ignore:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
- package-ecosystem: composer
directory: "/build/integration"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
target-branch: stable27
labels:
- "3. to review"
- "feature: dependencies"
reviewers:
- "nextcloud/server-dependabot"
ignore:
# ignore all GitHub linguist patch updates
- dependency-name: "*"
update-types: ["version-update:semver-major", "version-update:semver-minor", "version-update:semver-patch"]
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
+3 -3
View File
@@ -23,7 +23,7 @@ jobs:
require: write
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
@@ -66,7 +66,7 @@ jobs:
git config --local user.name "nextcloud-command"
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
id: package-engines-versions
with:
fallbackNode: '^16'
@@ -108,7 +108,7 @@ jobs:
git push --force origin ${{ needs.init.outputs.head_ref }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
+5 -10
View File
@@ -18,23 +18,18 @@ jobs:
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@v2
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reactions: "+1"
reaction-type: "+1"
- name: Init branch
uses: xt0rted/pull-request-comment-branch@d97294d304604fa98a2600a6e2f916a84b596dc7 # v1
id: comment-branch
- name: Checkout ${{ steps.comment-branch.outputs.head_ref }}
- name: Checkout the latest code
uses: actions/checkout@v3
with:
fetch-depth: 0
token: ${{ secrets.COMMAND_BOT_PAT }}
ref: ${{ steps.comment-branch.outputs.head_ref }}
- name: Setup git
run: |
@@ -51,10 +46,10 @@ jobs:
git push
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@v2
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reactions: "-1"
reaction-type: "-1"
+2 -2
View File
@@ -23,7 +23,7 @@ jobs:
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
@@ -42,7 +42,7 @@ jobs:
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@c6c9a1a66007646a28c153e2a8580a5bad27bcfa # v3.0.1
uses: peter-evans/create-or-update-comment@ca08ebd5dc95aa0cd97021e9708fcd6b87138c9b # v3.0.1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
+15 -31
View File
@@ -4,15 +4,13 @@ on:
pull_request:
push:
branches:
- main
- master
- stable*
env:
# Adjust APP_NAME if your repository name is different
APP_NAME: ${{ github.event.repository.name }}
# Server requires head_ref instead of base_ref, as we want to test the PR branch
BRANCH: ${{ github.head_ref || github.ref_name }}
APP_NAME: server
BRANCH: ${{ github.base_ref }}
TESTING: true
jobs:
init:
@@ -25,18 +23,8 @@ jobs:
- name: Checkout app
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Check composer.json
id: check_composer
uses: andstor/file-existence-action@20b4d2e596410855db8f9ca21e96fbe18e12930b # v2
with:
files: "composer.json"
- name: Install composer dependencies
if: steps.check_composer.outputs.files_exists == 'true'
run: composer install --no-dev
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.2
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
id: versions
with:
fallbackNode: "^14"
@@ -45,18 +33,19 @@ jobs:
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0
with:
cache: 'npm'
node-version: ${{ steps.versions.outputs.nodeVersion }}
- name: Set up npm ${{ steps.versions.outputs.npmVersion }}
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Install node dependencies & build app
- name: Install dependencies & build app
run: |
npm ci
TESTING=true npm run build --if-present
- name: Save context
uses: buildjet/cache/save@e376f15c6ec6dc595375c78633174c7e5f92dc0e # v3
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1
with:
key: cypress-context-${{ github.run_id }}
path: ./
@@ -68,15 +57,14 @@ jobs:
strategy:
fail-fast: false
matrix:
# Run multiple copies of the current job in parallel
# Please increase the number or runners as your tests suite grows
# run multiple copies of the current job in parallel
containers: ["component", 1, 2]
name: runner ${{ matrix.containers }}
steps:
- name: Restore context
uses: buildjet/cache/restore@e376f15c6ec6dc595375c78633174c7e5f92dc0e # v3
uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1
with:
fail-on-cache-miss: true
key: cypress-context-${{ github.run_id }}
@@ -85,13 +73,15 @@ jobs:
- name: Set up node ${{ needs.init.outputs.nodeVersion }}
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0
with:
cache: 'npm'
node-version: ${{ needs.init.outputs.nodeVersion }}
- name: Set up npm ${{ needs.init.outputs.npmVersion }}
run: npm i -g npm@"${{ needs.init.outputs.npmVersion }}"
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
uses: cypress-io/github-action@d69252d52b9a31bad4f418f05ba2bc83687a02eb # v5.8.3
uses: cypress-io/github-action@db1693016f23ccf9043f4b2428f9b04e5d502a73 # v5.8.1
with:
record: true
parallel: true
@@ -100,10 +90,11 @@ jobs:
group: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }}
# cypress env
ci-build-id: ${{ github.sha }}-${{ github.run_number }}
tag: ${{ github.event_name }}
tag: ${{ github.event_name }}t
env:
# Needs to be prefixed with CYPRESS_
CYPRESS_BRANCH: ${{ env.BRANCH }}
CYPRESS_GH: true
# https://github.com/cypress-io/github-action/issues/124
COMMIT_INFO_MESSAGE: ${{ github.event.pull_request.title }}
# Needed for some specific code workarounds
@@ -111,16 +102,9 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
- name: Upload snapshots
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
if: always()
with:
name: snapshots_${{ matrix.containers }}
path: cypress/snapshots
- name: Extract NC logs
if: failure() && matrix.containers != 'component'
run: docker logs nextcloud-cypress-tests-${{ env.APP_NAME }} > nextcloud.log
run: docker logs nextcloud-cypress-tests-server > nextcloud.log
- name: Upload NC logs
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2
+1 -1
View File
@@ -42,7 +42,7 @@ jobs:
if [[ "${{ matrix.ftpd }}" == 'vsftpd' ]]; then docker run --name ftp -d --net host -e FTP_USER=test -e FTP_PASS=test -e PASV_ADDRESS=127.0.0.1 -v /tmp/ftp:/home/vsftpd/test fauria/vsftpd; fi
if [[ "${{ matrix.ftpd }}" == 'pure-ftpd' ]]; then docker run --name ftp -d --net host -e "PUBLICHOST=localhost" -e FTP_USER_NAME=test -e FTP_USER_PASS=test -e FTP_USER_HOME=/home/test -v /tmp/ftp2:/home/test -v /tmp/ftp2:/etc/pure-ftpd/passwd stilliard/pure-ftpd; fi
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
@@ -13,7 +13,7 @@ on:
paths-ignore:
- '.github/workflows/**'
- 'src/**'
- 'apps/**/appinfo/info.xml'
- 'appinfo/info.xml'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
+1 -1
View File
@@ -41,7 +41,7 @@ jobs:
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
id: versions
with:
fallbackNode: '^16'
+8 -13
View File
@@ -22,11 +22,11 @@ jobs:
uses: actions/checkout@v3
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1
uses: skjnldsv/read-package-engines-version-actions@v1.1
id: versions
with:
fallbackNode: '^16'
fallbackNpm: '^7'
fallbackNode: '^12'
fallbackNpm: '^6'
test:
runs-on: ubuntu-latest
@@ -37,7 +37,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
uses: actions/setup-node@v2
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@@ -47,13 +47,8 @@ jobs:
- name: Install dependencies
run: npm ci
- name: Test and process coverage
run: npm run test:coverage
- name: Collect coverage
uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
with:
files: ./coverage/lcov.info
- name: Test
run: npm run test
jsunit:
runs-on: ubuntu-latest
@@ -64,7 +59,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
uses: actions/setup-node@v2
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@@ -86,7 +81,7 @@ jobs:
uses: actions/checkout@v3
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c
uses: actions/setup-node@v2
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
-43
View File
@@ -1,43 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# Use node together with node-when-unrelated to make eslint a required check for GitHub actions
# https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks
name: Node
on:
pull_request:
paths-ignore:
- '.github/workflows/**'
- 'src/**'
- 'apps/**/appinfo/info.xml'
- 'package.json'
- 'package-lock.json'
- 'tsconfig.json'
- '**.js'
- '**.ts'
- '**.vue'
push:
branches:
- main
- master
- stable*
concurrency:
group: node-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
build:
permissions:
contents: none
runs-on: ubuntu-latest
name: node
steps:
- name: Skip
run: 'echo "No JS/TS files changed, skipped Node"'
+1 -1
View File
@@ -40,7 +40,7 @@ jobs:
uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
id: versions
with:
fallbackNode: '^16'
+1 -1
View File
@@ -29,7 +29,7 @@ jobs:
ref: ${{ matrix.branches }}
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@8205673bab74a63eb9b8093402fd9e0e018663a1 # v2.1
uses: skjnldsv/read-package-engines-version-actions@0ce2ed60f6df073a62a77c0a4958dd0fc68e32e7 # v2.1
id: versions
with:
fallbackNode: '^16'
+1 -1
View File
@@ -47,7 +47,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: ctype, curl, dom, fileinfo, gd, imagick, intl, json, mbstring, oci8, openssl, pcntl, pdo_sqlite, posix, sqlite, xml, zip
-33
View File
@@ -1,33 +0,0 @@
name: OpenAPI
on:
pull_request:
push:
branches:
- master
- stable*
jobs:
openapi:
runs-on: ubuntu-latest
if: ${{ github.repository_owner != 'nextcloud-gmbh' }}
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up php
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: xml
coverage: none
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Composer install
run: composer i
- name: OpenAPI checker
run: build/openapi-checker.sh
+4 -4
View File
@@ -23,7 +23,7 @@ jobs:
ref: ${{ github.event.pull_request.base.ref }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
@@ -52,7 +52,7 @@ jobs:
curl -s -u test:test -T README.md http://localhost:8080/remote.php/dav/files/test/new_file.txt
curl -s -u test:test -X DELETE http://localhost:8080/remote.php/dav/files/test/new_file.txt
output: before.json
profiler-branch: master
profiler-branch: stable27
- name: Apply PR
run: |
@@ -74,12 +74,12 @@ jobs:
curl -s -u test:test -T README.md http://localhost:8080/remote.php/dav/files/test/new_file.txt
curl -s -u test:test -X DELETE http://localhost:8080/remote.php/dav/files/test/new_file.txt
output: after.json
profiler-branch: master
profiler-branch: stable27
compare-with: before.json
- name: Upload profiles
if: always()
uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce
uses: actions/upload-artifact@v2
with:
name: profiles
path: |
+1 -1
View File
@@ -40,7 +40,7 @@ jobs:
sudo apt-get install -y ffmpeg imagemagick libmagickcore-6.q16-3-extra
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@9c77701ae57b0c47f6732beebfbdec76e4e5c90a #debian bookworm fix
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
extensions: ctype, curl, dom, fileinfo, gd, imagick, intl, json, mbstring, openssl, pdo_sqlite, posix, sqlite, xml, zip, apcu
-29
View File
@@ -1,29 +0,0 @@
name: 'Ask for feedback on PRs'
on:
schedule:
- cron: '30 1 * * *'
jobs:
pr-feedback:
runs-on: ubuntu-22.04
steps:
- name: The get-github-handles-from-website action
uses: marcelklehr/get-github-handles-from-website-action@a739600f6b91da4957f51db0792697afbb2f143c # v1.0.0
id: scrape
with:
website: 'https://nextcloud.com/team/'
- uses: marcelklehr/pr-feedback-action@601109aa729eb4c8d6d0ece7567b9d4901db4aef
with:
feedback-message: |
Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.
We hope that the reviewing process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR reviewing process.
Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6
Thank you for contributing to Nextcloud and we hope to hear from you soon!
days-before-feedback: 14
start-date: "2023-07-10"
exempt-authors: "${{ steps.scrape.outputs.users }}"
exempt-bots: true
+2 -2
View File
@@ -43,7 +43,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
@@ -96,7 +96,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
+1 -1
View File
@@ -41,7 +41,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
+1 -1
View File
@@ -37,7 +37,7 @@ jobs:
submodules: true
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@c5fc0d8281aba02c7fda07d3a70cc5371548067d #v2.25.2
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit:9
+3 -3
View File
@@ -12,7 +12,7 @@ jobs:
strategy:
fail-fast: false
matrix:
branches: ["master", "stable27", "stable26", "stable25", "stable24", "stable23", "stable22"]
branches: ["master", "stable26", "stable25", "stable24", "stable23", "stable22"]
name: update-ca-certificate-bundle-${{ matrix.branches }}
@@ -29,12 +29,12 @@ jobs:
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: "fix(security): Update CA certificate bundle"
commit-message: Update CA certificate bundle
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: automated/noid/${{ matrix.branches }}-update-ca-cert-bundle
title: "[${{ matrix.branches }}] fix(security): Update CA certificate bundle"
title: "[${{ matrix.branches }}] Update ca-cert bundle"
body: |
Auto-generated update of CA certificate bundle from [https://curl.se/docs/caextract.html](https://curl.se/docs/caextract.html)
labels: |
+1 -1
View File
@@ -14,7 +14,7 @@ jobs:
strategy:
fail-fast: false
matrix:
branches: ["master", "stable27", "stable26", "stable25"]
branches: ["master", "stable26", "stable25", "stable24", "stable23"]
name: update-psalm-baseline-${{ matrix.branches }}
-2
View File
@@ -24,7 +24,6 @@
!/apps/sharebymail
!/apps/encryption
!/apps/files_external
!/apps/files_reminders
!/apps/files_sharing
!/apps/files_trashbin
!/apps/files_versions
@@ -155,7 +154,6 @@ Vagrantfile
/config/config-autotest-backup.php
/config/autoconfig.php
clover.xml
/coverage
# Tests - dependencies
tests/acceptance/vendor/
+1 -1
View File
@@ -40,7 +40,7 @@
</IfModule>
# Add cache control for static resources
<FilesMatch "\.(css|js|mjs|svg|gif|png|jpg|ico|wasm|tflite)$">
<FilesMatch "\.(css|js|svg|gif|png|jpg|ico|wasm|tflite)$">
<If "%{QUERY_STRING} =~ /(^|&)v=/">
Header set Cache-Control "max-age=15778463, immutable"
</If>
+1 -6
View File
@@ -74,12 +74,6 @@ source_file = translationfiles/templates/files_external.pot
source_lang = en
type = PO
[o:nextcloud:p:nextcloud:r:files_reminders]
file_filter = translationfiles/<lang>/files_reminders.po
source_file = translationfiles/templates/files_reminders.pot
source_lang = en
type = PO
[o:nextcloud:p:nextcloud:r:files_sharing]
file_filter = translationfiles/<lang>/files_sharing.po
source_file = translationfiles/templates/files_sharing.pot
@@ -181,3 +175,4 @@ file_filter = translationfiles/<lang>/workflowengine.po
source_file = translationfiles/templates/workflowengine.pot
source_lang = en
type = PO
-34
View File
@@ -1,34 +0,0 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export const getCurrentUser = function() {
return {
uid: 'test',
displayName: 'Test',
isAdmin: false,
}
}
export const getRequestToken = function() {
return 'test-token-1234'
}
export const onRequestTokenUpdate = function() {}
-26
View File
@@ -1,26 +0,0 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
export default {
get: async () => ({ status: 200, data: {} }),
delete: async () => ({ status: 200, data: {} }),
post: async () => ({ status: 200, data: {} }),
}
-30
View File
@@ -1,30 +0,0 @@
/**
* @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
import { jest } from '@jest/globals'
export const showMessage = jest.fn()
export const showSuccess = jest.fn()
export const showWarning = jest.fn()
export const showInfo = jest.fn()
export const showError = jest.fn()
export const showUndo = jest.fn()
-6
View File
@@ -1,6 +0,0 @@
{
"extends": "../tsconfig.json",
"compilerOptions": {
"verbatimModuleSyntax": false
}
}
+2 -2
View File
@@ -5,7 +5,7 @@
<name>Auditing / Logging</name>
<summary>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</summary>
<description>Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions.</description>
<version>1.18.0</version>
<version>1.17.0</version>
<licence>agpl</licence>
<author>Nextcloud</author>
<namespace>AdminAudit</namespace>
@@ -15,7 +15,7 @@
<category>monitoring</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="28" max-version="28"/>
<nextcloud min-version="27" max-version="27"/>
</dependencies>
<background-jobs>
<job>OCA\AdminAudit\BackgroundJobs\Rotate</job>
@@ -45,34 +45,35 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
@@ -80,7 +81,8 @@ class ClassLoader
private $useIncludePath = false;
/**
* @var array<string, string>
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
@@ -88,20 +90,21 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
/** @var ?string */
private $apcuPrefix;
/**
* @var array<string, self>
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -110,7 +113,7 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return string[]
*/
public function getPrefixes()
{
@@ -122,7 +125,8 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
@@ -130,7 +134,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
@@ -138,7 +143,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
@@ -146,7 +152,8 @@ class ClassLoader
}
/**
* @return array<string, string> Array of classname => path
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
@@ -154,7 +161,8 @@ class ClassLoader
}
/**
* @param array<string, string> $classMap Class to filename map
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
@@ -171,25 +179,24 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
(array) $paths
);
}
@@ -198,19 +205,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
(array) $paths
);
}
}
@@ -219,9 +226,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -229,18 +236,17 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -250,18 +256,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
(array) $paths
);
}
}
@@ -270,8 +276,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -288,8 +294,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -475,9 +481,9 @@ class ClassLoader
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return array<string, self>
* @return self[]
*/
public static function getRegisteredLoaders()
{
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
+1 -1
View File
@@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Auditoría / Rexistro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para o Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
},
"nplurals=2; plural=(n != 1);");
+1 -1
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "Auditoría / Rexistro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de rexistro para o Nextcloud como rexistros de acceso a ficheiros ou calquera outra acción sensíbel."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+1 -1
View File
@@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "פיקוח / תיעוד",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספק יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספר יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;");
+1 -1
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "פיקוח / תיעוד",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספק יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "מספר יכולות תיעוד ל־Nextcloud כגון תיעוד גישה ליומן התיעוד או פעולות רגישות אחרות."
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"
}
-7
View File
@@ -1,7 +0,0 @@
OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "ऑडिटिंग/लॉगिंग",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "नेक्स्टक्लाउड के लिए लॉगिंग क्षमताएं प्रदान करता है जैसे फ़ाइल एक्सेस या अन्यथा संवेदनशील कार्यों को लॉग करना।"
},
"nplurals=2; plural=(n != 1);");
-5
View File
@@ -1,5 +0,0 @@
{ "translations": {
"Auditing / Logging" : "ऑडिटिंग/लॉगिंग",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "नेक्स्टक्लाउड के लिए लॉगिंग क्षमताएं प्रदान करता है जैसे फ़ाइल एक्सेस या अन्यथा संवेदनशील कार्यों को लॉग करना।"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+5 -3
View File
@@ -31,10 +31,12 @@ namespace OCA\AdminAudit\Actions;
use OCA\AdminAudit\IAuditLogger;
class Action {
/** @var IAuditLogger */
private $logger;
public function __construct(
private IAuditLogger $logger,
) {}
public function __construct(IAuditLogger $logger) {
$this->logger = $logger;
}
/**
* Log a single action with a log level of info
+14 -15
View File
@@ -26,7 +26,6 @@ declare(strict_types=1);
*/
namespace OCA\AdminAudit\Actions;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\IUser;
/**
@@ -36,14 +35,14 @@ use OCP\IUser;
*/
class Security extends Action {
/**
* Logs failed twofactor challenge
* Log twofactor auth enabled
*
* @param IUser $user
* @param array $params
*/
public function twofactorFailed(IUser $user, IProvider $provider): void {
$params = [
'displayName' => $user->getDisplayName(),
'uid' => $user->getUID(),
'provider' => $provider->getDisplayName(),
];
public function twofactorFailed(IUser $user, array $params): void {
$params['uid'] = $user->getUID();
$params['displayName'] = $user->getDisplayName();
$this->log(
'Failed two factor attempt by user %s (%s) with provider %s',
@@ -57,14 +56,14 @@ class Security extends Action {
}
/**
* Logs successful twofactor challenge
* Logs unsharing of data
*
* @param IUser $user
* @param array $params
*/
public function twofactorSuccess(IUser $user, IProvider $provider): void {
$params = [
'displayName' => $user->getDisplayName(),
'uid' => $user->getUID(),
'provider' => $provider->getDisplayName(),
];
public function twofactorSuccess(IUser $user, array $params): void {
$params['uid'] = $user->getUID();
$params['displayName'] = $user->getDisplayName();
$this->log(
'Successful two factor attempt by user %s (%s) with provider %s',
+28 -25
View File
@@ -33,7 +33,9 @@ declare(strict_types=1);
*/
namespace OCA\AdminAudit\AppInfo;
use Closure;
use OC\Files\Filesystem;
use OC\Files\Node\File;
use OC\Group\Manager as GroupManager;
use OC\User\Session as UserSession;
use OCA\AdminAudit\Actions\AppManagement;
@@ -54,20 +56,21 @@ use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengeFailed;
use OCP\Authentication\TwoFactorAuth\TwoFactorProviderChallengePassed;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\Console\ConsoleEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IPreview;
use OCP\IServerContainer;
use OCP\IUserSession;
use OCP\Log\Audit\CriticalActionPerformedEvent;
use OCP\Log\ILogFactory;
use OCP\Preview\BeforePreviewFetchedEvent;
use OCP\Share;
use OCP\Util;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\GenericEvent;
class Application extends App implements IBootstrap {
@@ -80,7 +83,7 @@ class Application extends App implements IBootstrap {
public function register(IRegistrationContext $context): void {
$context->registerService(IAuditLogger::class, function (ContainerInterface $c) {
return new AuditLogger($c->get(ILogFactory::class), $c->get(IConfig::class));
return new AuditLogger($c->get(ILogFactory::class), $c->get(Iconfig::class));
});
$context->registerEventListener(CriticalActionPerformedEvent::class, CriticalActionPerformedEventListener::class);
@@ -101,14 +104,13 @@ class Application extends App implements IBootstrap {
* Register hooks in order to log them
*/
private function registerHooks(IAuditLogger $logger,
ContainerInterface $serverContainer): void {
IServerContainer $serverContainer): void {
$this->userManagementHooks($logger, $serverContainer->get(IUserSession::class));
$this->groupHooks($logger, $serverContainer->get(IGroupManager::class));
$this->authHooks($logger);
/** @var IEventDispatcher $eventDispatcher */
$eventDispatcher = $serverContainer->get(IEventDispatcher::class);
/** @var EventDispatcherInterface $eventDispatcher */
$eventDispatcher = $serverContainer->get(EventDispatcherInterface::class);
$this->consoleHooks($logger, $eventDispatcher);
$this->appHooks($logger, $eventDispatcher);
@@ -167,7 +169,7 @@ class Application extends App implements IBootstrap {
}
private function appHooks(IAuditLogger $logger,
IEventDispatcher $eventDispatcher): void {
EventDispatcherInterface $eventDispatcher): void {
$eventDispatcher->addListener(ManagerEvent::EVENT_APP_ENABLE, function (ManagerEvent $event) use ($logger) {
$appActions = new AppManagement($logger);
$appActions->enableApp($event->getAppID());
@@ -183,26 +185,27 @@ class Application extends App implements IBootstrap {
}
private function consoleHooks(IAuditLogger $logger,
IEventDispatcher $eventDispatcher): void {
$eventDispatcher->addListener(ConsoleEvent::class, function (ConsoleEvent $event) use ($logger) {
EventDispatcherInterface $eventDispatcher): void {
$eventDispatcher->addListener(ConsoleEvent::EVENT_RUN, function (ConsoleEvent $event) use ($logger) {
$appActions = new Console($logger);
$appActions->runCommand($event->getArguments());
});
}
private function fileHooks(IAuditLogger $logger,
IEventDispatcher $eventDispatcher): void {
EventDispatcherInterface $eventDispatcher): void {
$fileActions = new Files($logger);
$eventDispatcher->addListener(
BeforePreviewFetchedEvent::class,
function (BeforePreviewFetchedEvent $event) use ($fileActions) {
$file = $event->getNode();
IPreview::EVENT,
function (GenericEvent $event) use ($fileActions) {
/** @var File $file */
$file = $event->getSubject();
$fileActions->preview([
'path' => mb_substr($file->getInternalPath(), 5),
'width' => $event->getWidth(),
'height' => $event->getHeight(),
'crop' => $event->isCrop(),
'mode' => $event->getMode()
'width' => $event->getArguments()['width'],
'height' => $event->getArguments()['height'],
'crop' => $event->getArguments()['crop'],
'mode' => $event->getArguments()['mode']
]);
}
);
@@ -264,14 +267,14 @@ class Application extends App implements IBootstrap {
}
private function securityHooks(IAuditLogger $logger,
IEventDispatcher $eventDispatcher): void {
$eventDispatcher->addListener(TwoFactorProviderChallengePassed::class, function (TwoFactorProviderChallengePassed $event) use ($logger) {
EventDispatcherInterface $eventDispatcher): void {
$eventDispatcher->addListener(IProvider::EVENT_SUCCESS, function (GenericEvent $event) use ($logger) {
$security = new Security($logger);
$security->twofactorSuccess($event->getUser(), $event->getProvider());
$security->twofactorSuccess($event->getSubject(), $event->getArguments());
});
$eventDispatcher->addListener(TwoFactorProviderChallengeFailed::class, function (TwoFactorProviderChallengeFailed $event) use ($logger) {
$eventDispatcher->addListener(IProvider::EVENT_FAILED, function (GenericEvent $event) use ($logger) {
$security = new Security($logger);
$security->twofactorFailed($event->getUser(), $event->getProvider());
$security->twofactorFailed($event->getSubject(), $event->getArguments());
});
}
}
+7 -4
View File
@@ -35,12 +35,15 @@ use OCP\Log\RotationTrait;
class Rotate extends TimedJob {
use RotationTrait;
public function __construct(
ITimeFactory $time,
private IConfig $config,
) {
/** @var IConfig */
private $config;
public function __construct(ITimeFactory $time,
IConfig $config) {
parent::__construct($time);
$this->config = $config;
$this->setInterval(60 * 60 * 3);
}
@@ -27,9 +27,8 @@ declare(strict_types=1);
namespace OCA\AdminAudit\Tests\Actions;
use OCA\AdminAudit\Actions\Security;
use OCA\AdminAudit\AuditLogger;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\IUser;
use OCA\AdminAudit\AuditLogger;
use Test\TestCase;
class SecurityTest extends TestCase {
@@ -61,11 +60,7 @@ class SecurityTest extends TestCase {
['app' => 'admin_audit']
);
$provider = $this->createMock(IProvider::class);
$provider->method('getDisplayName')
->willReturn('myprovider');
$this->security->twofactorFailed($this->user, $provider);
$this->security->twofactorFailed($this->user, ['provider' => 'myprovider']);
}
public function testTwofactorSuccess() {
@@ -76,10 +71,6 @@ class SecurityTest extends TestCase {
['app' => 'admin_audit']
);
$provider = $this->createMock(IProvider::class);
$provider->method('getDisplayName')
->willReturn('myprovider');
$this->security->twofactorSuccess($this->user, $provider);
$this->security->twofactorSuccess($this->user, ['provider' => 'myprovider']);
}
}
+2 -2
View File
@@ -5,7 +5,7 @@
<name>Cloud Federation API</name>
<summary>Enable clouds to communicate with each other and exchange data</summary>
<description>The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data.</description>
<version>1.11.0</version>
<version>1.10.0</version>
<licence>agpl</licence>
<author>Bjoern Schiessle</author>
<namespace>CloudFederationAPI</namespace>
@@ -15,6 +15,6 @@
<category>files</category>
<bugs>https://github.com/nextcloud/cloud_federation/issues</bugs>
<dependencies>
<nextcloud min-version="28" max-version="28"/>
<nextcloud min-version="27" max-version="27"/>
</dependencies>
</info>
@@ -45,34 +45,35 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
@@ -80,7 +81,8 @@ class ClassLoader
private $useIncludePath = false;
/**
* @var array<string, string>
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
@@ -88,20 +90,21 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
/** @var ?string */
private $apcuPrefix;
/**
* @var array<string, self>
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -110,7 +113,7 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return string[]
*/
public function getPrefixes()
{
@@ -122,7 +125,8 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
@@ -130,7 +134,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
@@ -138,7 +143,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
@@ -146,7 +152,8 @@ class ClassLoader
}
/**
* @return array<string, string> Array of classname => path
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
@@ -154,7 +161,8 @@ class ClassLoader
}
/**
* @param array<string, string> $classMap Class to filename map
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
@@ -171,25 +179,24 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
(array) $paths
);
}
@@ -198,19 +205,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
(array) $paths
);
}
}
@@ -219,9 +226,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -229,18 +236,17 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -250,18 +256,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
(array) $paths
);
}
}
@@ -270,8 +276,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -288,8 +294,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -475,9 +481,9 @@ class ClassLoader
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return array<string, self>
* @return self[]
*/
public static function getRegisteredLoaders()
{
@@ -11,5 +11,4 @@ return array(
'OCA\\CloudFederationAPI\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\CloudFederationAPI\\Config' => $baseDir . '/../lib/Config.php',
'OCA\\CloudFederationAPI\\Controller\\RequestHandlerController' => $baseDir . '/../lib/Controller/RequestHandlerController.php',
'OCA\\CloudFederationAPI\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
);
@@ -26,7 +26,6 @@ class ComposerStaticInitCloudFederationAPI
'OCA\\CloudFederationAPI\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\CloudFederationAPI\\Config' => __DIR__ . '/..' . '/../lib/Config.php',
'OCA\\CloudFederationAPI\\Controller\\RequestHandlerController' => __DIR__ . '/..' . '/../lib/Controller/RequestHandlerController.php',
'OCA\\CloudFederationAPI\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
);
public static function getInitializer(ClassLoader $loader)
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
-8
View File
@@ -1,8 +0,0 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation",
"Enable clouds to communicate with each other and exchange data" : "يسمح للسحابات أن تتراسل فيما بينها و تتبادل البيانات",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation تسمح لخوادم نكست كلاود بالاتصال ببعضها البعض و تبادل البيانات."
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
-6
View File
@@ -1,6 +0,0 @@
{ "translations": {
"Cloud Federation API" : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation",
"Enable clouds to communicate with each other and exchange data" : "يسمح للسحابات أن تتراسل فيما بينها و تتبادل البيانات",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "واجهة برمجة التطبيقات API للاتحاد السحابي Cloud Federation تسمح لخوادم نكست كلاود بالاتصال ببعضها البعض و تبادل البيانات."
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
}
-8
View File
@@ -1,8 +0,0 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "API de Federación en la Nube",
"Enable clouds to communicate with each other and exchange data" : "Permitir que las nubes se comuniquen entre sí e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "La API de Federación de Nubes permite que varias instancias de Nextcloud se comuniquen entre sí y intercambien datos."
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
@@ -1,6 +0,0 @@
{ "translations": {
"Cloud Federation API" : "API de Federación en la Nube",
"Enable clouds to communicate with each other and exchange data" : "Permitir que las nubes se comuniquen entre sí e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "La API de Federación de Nubes permite que varias instancias de Nextcloud se comuniquen entre sí y intercambien datos."
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
-8
View File
@@ -1,8 +0,0 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "Pilve Liit API",
"Enable clouds to communicate with each other and exchange data" : "Luba pilvedel suhelda omavahel ja vahetada andmeid",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Pilve Liit API lubab erinevad Nextcloud'i osadel suhelda omavahel ja vahetada andmeid"
},
"nplurals=2; plural=(n != 1);");
@@ -1,6 +0,0 @@
{ "translations": {
"Cloud Federation API" : "Pilve Liit API",
"Enable clouds to communicate with each other and exchange data" : "Luba pilvedel suhelda omavahel ja vahetada andmeid",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Pilve Liit API lubab erinevad Nextcloud'i osadel suhelda omavahel ja vahetada andmeid"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
-8
View File
@@ -1,8 +0,0 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "API فدراسیون ابری",
"Enable clouds to communicate with each other and exchange data" : "ابرها را فعال کنید تا با یکدیگر ارتباط برقرار کنند و داده ها را مبادله کنند",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API نمونه های مختلف Nextcloud را قادر می سازد تا با یکدیگر ارتباط برقرار کرده و داده ها را مبادله کنند."
},
"nplurals=2; plural=(n > 1);");
-6
View File
@@ -1,6 +0,0 @@
{ "translations": {
"Cloud Federation API" : "API فدراسیون ابری",
"Enable clouds to communicate with each other and exchange data" : "ابرها را فعال کنید تا با یکدیگر ارتباط برقرار کنند و داده ها را مبادله کنند",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API نمونه های مختلف Nextcloud را قادر می سازد تا با یکدیگر ارتباط برقرار کرده و داده ها را مبادله کنند."
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+1 -1
View File
@@ -3,6 +3,6 @@ OC.L10N.register(
{
"Cloud Federation API" : "API da Nube federada",
"Enable clouds to communicate with each other and exchange data" : "Permite que as nubes se comuniquen entre elas e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias de Nextcloud se comuniquen entre elas e intercambien datos."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias do Nextcloud se comuniquen entre elas e intercambien datos."
},
"nplurals=2; plural=(n != 1);");
+1 -1
View File
@@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "API da Nube federada",
"Enable clouds to communicate with each other and exchange data" : "Permite que as nubes se comuniquen entre elas e intercambien datos",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias de Nextcloud se comuniquen entre elas e intercambien datos."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nube federada permite que varias instancias do Nextcloud se comuniquen entre elas e intercambien datos."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+1 -1
View File
@@ -3,6 +3,6 @@ OC.L10N.register(
{
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Увімкніть хмари аби спілкуватися один з одним і обмінюватися даними",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API дозволяє різним примірникам серверу хмари Nextcloud спілкуватися між собою та обмінюватися даними."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API дозволяє різним екземплярам Nextcloud спілкуватися між собою та обмінюватися даними."
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
+1 -1
View File
@@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Увімкніть хмари аби спілкуватися один з одним і обмінюватися даними",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API дозволяє різним примірникам серверу хмари Nextcloud спілкуватися між собою та обмінюватися даними."
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation API дозволяє різним екземплярам Nextcloud спілкуватися між собою та обмінюватися даними."
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
}
-8
View File
@@ -1,8 +0,0 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Cho phép các đám mây giao tiếp với nhau và trao đổi dữ liệu",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API Cloud Federation cho phép các phiên bản Nextcloud khác nhau giao tiếp với nhau và trao đổi dữ liệu."
},
"nplurals=1; plural=0;");
-6
View File
@@ -1,6 +0,0 @@
{ "translations": {
"Cloud Federation API" : "Cloud Federation API",
"Enable clouds to communicate with each other and exchange data" : "Cho phép các đám mây giao tiếp với nhau và trao đổi dữ liệu",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API Cloud Federation cho phép các phiên bản Nextcloud khác nhau giao tiếp với nhau và trao đổi dữ liệu."
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -2
View File
@@ -1,8 +1,8 @@
OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "联合云API",
"Cloud Federation API" : "联合云 API",
"Enable clouds to communicate with each other and exchange data" : "使云能够相互通信并交换数据",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云API使各种 Nextcloud 实例可以相互通信并交换数据。"
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云 API 使各种 Nextcloud 实例可以相互通信并交换数据。"
},
"nplurals=1; plural=0;");
+2 -2
View File
@@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "联合云API",
"Cloud Federation API" : "联合云 API",
"Enable clouds to communicate with each other and exchange data" : "使云能够相互通信并交换数据",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云API使各种 Nextcloud 实例可以相互通信并交换数据。"
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "联合云 API 使各种 Nextcloud 实例可以相互通信并交换数据。"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -15
View File
@@ -3,7 +3,6 @@
* @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
*
* @author Bjoern Schiessle <bjoern@schiessle.org>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -38,20 +37,8 @@ class Capabilities implements ICapability {
/**
* Function an app uses to return the capabilities
*
* @return array{
* ocm: array{
* enabled: bool,
* apiVersion: string,
* endPoint: string,
* resourceTypes: array{
* name: string,
* shareTypes: string[],
* protocols: array{
* webdav: string,
* },
* }[],
* },
* }
* @return array Array containing the apps capabilities
* @since 8.2.0
*/
public function getCapabilities() {
$url = $this->urlGenerator->linkToRouteAbsolute('cloud_federation_api.requesthandlercontroller.addShare');
@@ -5,7 +5,6 @@
* @author Bjoern Schiessle <bjoern@schiessle.org>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -26,7 +25,6 @@
namespace OCA\CloudFederationAPI\Controller;
use OCA\CloudFederationAPI\Config;
use OCA\CloudFederationAPI\ResponseDefinitions;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
@@ -46,13 +44,11 @@ use OCP\Share\Exceptions\ShareNotFound;
use Psr\Log\LoggerInterface;
/**
* Open-Cloud-Mesh-API
* Class RequestHandlerController
*
* handle API between different Cloud instances
*
* @package OCA\CloudFederationAPI\Controller
*
* @psalm-import-type CloudFederationApiAddShare from ResponseDefinitions
* @psalm-import-type CloudFederationApiValidationError from ResponseDefinitions
* @psalm-import-type CloudFederationApiError from ResponseDefinitions
*/
class RequestHandlerController extends Controller {
@@ -104,28 +100,26 @@ class RequestHandlerController extends Controller {
}
/**
* Add share
* add share
*
* @NoCSRFRequired
* @PublicPage
* @BruteForceProtection(action=receiveFederatedShare)
*
* @param string $shareWith The user who the share will be shared with
* @param string $name The resource name (e.g. document.odt)
* @param string|null $description Share description
* @param string $providerId Resource UID on the provider side
* @param string $owner Provider specific UID of the user who owns the resource
* @param string|null $ownerDisplayName Display name of the user who shared the item
* @param string|null $sharedBy Provider specific UID of the user who shared the resource
* @param string|null $sharedByDisplayName Display name of the user who shared the resource
* @param array{name: string[], options: array<string, mixed>} $protocol e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]]
* @param string $shareType 'group' or 'user' share
* @param string $resourceType 'file', 'calendar',...
* @param string $shareWith
* @param string $name resource name (e.g. document.odt)
* @param string $description share description (optional)
* @param string $providerId resource UID on the provider side
* @param string $owner provider specific UID of the user who owns the resource
* @param string $ownerDisplayName display name of the user who shared the item
* @param string $sharedBy provider specific UID of the user who shared the resource
* @param string $sharedByDisplayName display name of the user who shared the resource
* @param array $protocol (e,.g. ['name' => 'webdav', 'options' => ['username' => 'john', 'permissions' => 31]])
* @param string $shareType ('group' or 'user' share)
* @param $resourceType ('file', 'calendar',...)
* @return Http\DataResponse|JSONResponse
*
* @return JSONResponse<Http::STATUS_CREATED, CloudFederationApiAddShare, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST, CloudFederationApiValidationError, array{}>|JSONResponse<Http::STATUS_NOT_IMPLEMENTED, CloudFederationApiError, array{}>
* 201: The notification was successfully received. The display name of the recipient might be returned in the body
* 400: Bad request due to invalid parameters, e.g. when `shareWith` is not found or required properties are missing
* 501: Share type or the resource type is not supported
* Example: curl -H "Content-Type: application/json" -X POST -d '{"shareWith":"admin1@serve1","name":"welcome server2.txt","description":"desc","providerId":"2","owner":"admin2@http://localhost/server2","ownerDisplayName":"admin2 display","shareType":"user","resourceType":"file","protocol":{"name":"webdav","options":{"sharedSecret":"secret","permissions":"webdav-property"}}}' http://localhost/server/index.php/ocm/shares
*/
public function addShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, $protocol, $shareType, $resourceType) {
@@ -143,10 +137,7 @@ class RequestHandlerController extends Controller {
!isset($protocol['options']['sharedSecret'])
) {
return new JSONResponse(
[
'message' => 'Missing arguments',
'validationErrors' => [],
],
['message' => 'Missing arguments'],
Http::STATUS_BAD_REQUEST
);
}
@@ -167,10 +158,7 @@ class RequestHandlerController extends Controller {
if (!$this->userManager->userExists($shareWith)) {
$response = new JSONResponse(
[
'message' => 'User "' . $shareWith . '" does not exists at ' . $this->urlGenerator->getBaseUrl(),
'validationErrors' => [],
],
['message' => 'User "' . $shareWith . '" does not exists at ' . $this->urlGenerator->getBaseUrl()],
Http::STATUS_BAD_REQUEST
);
$response->throttle();
@@ -181,10 +169,7 @@ class RequestHandlerController extends Controller {
if ($shareType === 'group') {
if (!$this->groupManager->groupExists($shareWith)) {
$response = new JSONResponse(
[
'message' => 'Group "' . $shareWith . '" does not exists at ' . $this->urlGenerator->getBaseUrl(),
'validationErrors' => [],
],
['message' => 'Group "' . $shareWith . '" does not exists at ' . $this->urlGenerator->getBaseUrl()],
Http::STATUS_BAD_REQUEST
);
$response->throttle();
@@ -207,18 +192,20 @@ class RequestHandlerController extends Controller {
$share = $this->factory->getCloudFederationShare($shareWith, $name, $description, $providerId, $owner, $ownerDisplayName, $sharedBy, $sharedByDisplayName, '', $shareType, $resourceType);
$share->setProtocol($protocol);
$provider->shareReceived($share);
} catch (ProviderDoesNotExistsException|ProviderCouldNotAddShareException $e) {
} catch (ProviderDoesNotExistsException $e) {
return new JSONResponse(
['message' => $e->getMessage()],
Http::STATUS_NOT_IMPLEMENTED
);
} catch (ProviderCouldNotAddShareException $e) {
return new JSONResponse(
['message' => $e->getMessage()],
$e->getCode()
);
} catch (\Exception $e) {
$this->logger->error($e->getMessage(), ['exception' => $e]);
return new JSONResponse(
[
'message' => 'Internal error at ' . $this->urlGenerator->getBaseUrl(),
'validationErrors' => [],
],
['message' => 'Internal error at ' . $this->urlGenerator->getBaseUrl()],
Http::STATUS_BAD_REQUEST
);
}
@@ -235,24 +222,19 @@ class RequestHandlerController extends Controller {
}
/**
* Send a notification about an existing share
* receive notification about existing share
*
* @NoCSRFRequired
* @PublicPage
* @BruteForceProtection(action=receiveFederatedShareNotification)
*
* @param string $notificationType Notification type, e.g. SHARE_ACCEPTED
* @param string $resourceType calendar, file, contact,...
* @param string|null $providerId ID of the share
* @param array<string, mixed>|null $notification The actual payload of the notification
*
* @return JSONResponse<Http::STATUS_CREATED, array<string, mixed>, array{}>|JSONResponse<Http::STATUS_BAD_REQUEST, CloudFederationApiValidationError, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_NOT_IMPLEMENTED, CloudFederationApiError, array{}>
* 201: The notification was successfully received
* 400: Bad request due to invalid parameters, e.g. when `type` is invalid or missing
* 403: Getting resource is not allowed
* 501: The resource type is not supported
* @param string $notificationType (notification type, e.g. SHARE_ACCEPTED)
* @param string $resourceType (calendar, file, contact,...)
* @param string $providerId id of the share
* @param array $notification the actual payload of the notification
* @return JSONResponse
*/
public function receiveNotification($notificationType, $resourceType, $providerId, ?array $notification) {
public function receiveNotification($notificationType, $resourceType, $providerId, array $notification) {
// check if all required parameters are set
if ($notificationType === null ||
@@ -261,10 +243,7 @@ class RequestHandlerController extends Controller {
!is_array($notification)
) {
return new JSONResponse(
[
'message' => 'Missing arguments',
'validationErrors' => [],
],
['message' => 'Missing arguments'],
Http::STATUS_BAD_REQUEST
);
}
@@ -274,18 +253,12 @@ class RequestHandlerController extends Controller {
$result = $provider->notificationReceived($notificationType, $providerId, $notification);
} catch (ProviderDoesNotExistsException $e) {
return new JSONResponse(
[
'message' => $e->getMessage(),
'validationErrors' => [],
],
['message' => $e->getMessage()],
Http::STATUS_BAD_REQUEST
);
} catch (ShareNotFound $e) {
$response = new JSONResponse(
[
'message' => $e->getMessage(),
'validationErrors' => [],
],
['message' => $e->getMessage()],
Http::STATUS_BAD_REQUEST
);
$response->throttle();
@@ -303,10 +276,7 @@ class RequestHandlerController extends Controller {
return $response;
} catch (\Exception $e) {
return new JSONResponse(
[
'message' => 'Internal error at ' . $this->urlGenerator->getBaseUrl(),
'validationErrors' => [],
],
['message' => 'Internal error at ' . $this->urlGenerator->getBaseUrl()],
Http::STATUS_BAD_REQUEST
);
}
@@ -1,45 +0,0 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2023 Kate Döen <kate.doeen@nextcloud.com>
*
* @author Kate Döen <kate.doeen@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\CloudFederationAPI;
/**
* @psalm-type CloudFederationApiAddShare = array{
* recipientDisplayName: string,
* }
*
* @psalm-type CloudFederationApiError = array{
* message: string,
* }
*
* @psalm-type CloudFederationApiValidationError = CloudFederationApiError&array{
* validationErrors: array{
* name: string,
* message: string|null,
* }[],
* }
*/
class ResponseDefinitions {
}
+4 -4
View File
@@ -351,8 +351,8 @@
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "object"
}
}
@@ -370,11 +370,11 @@
}
},
"403": {
"description": "Getting resource is not allowed",
"description": "Getting resource not allowed",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
"$ref": "#/components/schemas/ValidationError"
}
}
}
+2 -2
View File
@@ -5,7 +5,7 @@
<name>Comments</name>
<summary>Files app plugin to add comments to files</summary>
<description>Files app plugin to add comments to files</description>
<version>1.18.0</version>
<version>1.17.0</version>
<licence>agpl</licence>
<author>Arthur Schiwon</author>
<author>Vincent Petry</author>
@@ -16,7 +16,7 @@
<category>social</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="28" max-version="28"/>
<nextcloud min-version="27" max-version="27"/>
</dependencies>
<activity>
+51 -45
View File
@@ -45,34 +45,35 @@ class ClassLoader
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
@@ -80,7 +81,8 @@ class ClassLoader
private $useIncludePath = false;
/**
* @var array<string, string>
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
@@ -88,20 +90,21 @@ class ClassLoader
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
/** @var ?string */
private $apcuPrefix;
/**
* @var array<string, self>
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
@@ -110,7 +113,7 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return string[]
*/
public function getPrefixes()
{
@@ -122,7 +125,8 @@ class ClassLoader
}
/**
* @return array<string, list<string>>
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
@@ -130,7 +134,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
@@ -138,7 +143,8 @@ class ClassLoader
}
/**
* @return list<string>
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
@@ -146,7 +152,8 @@ class ClassLoader
}
/**
* @return array<string, string> Array of classname => path
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
@@ -154,7 +161,8 @@ class ClassLoader
}
/**
* @param array<string, string> $classMap Class to filename map
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
*/
@@ -171,25 +179,24 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
(array) $paths
);
}
@@ -198,19 +205,19 @@ class ClassLoader
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
(array) $paths
);
}
}
@@ -219,9 +226,9 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
@@ -229,18 +236,17 @@ class ClassLoader
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
@@ -250,18 +256,18 @@ class ClassLoader
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
(array) $paths
);
}
}
@@ -270,8 +276,8 @@ class ClassLoader
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
*/
@@ -288,8 +294,8 @@ class ClassLoader
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
@@ -475,9 +481,9 @@ class ClassLoader
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
* Returns the currently registered loaders indexed by their corresponding vendor directories.
*
* @return array<string, self>
* @return self[]
*/
public static function getRegisteredLoaders()
{
@@ -14,7 +14,7 @@ return array(
'OCA\\Comments\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\Comments\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\Comments\\Collaboration\\CommentersSorter' => $baseDir . '/../lib/Collaboration/CommentersSorter.php',
'OCA\\Comments\\Controller\\NotificationsController' => $baseDir . '/../lib/Controller/NotificationsController.php',
'OCA\\Comments\\Controller\\Notifications' => $baseDir . '/../lib/Controller/Notifications.php',
'OCA\\Comments\\EventHandler' => $baseDir . '/../lib/EventHandler.php',
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => $baseDir . '/../lib/Listener/CommentsEntityEventListener.php',
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => $baseDir . '/../lib/Listener/LoadAdditionalScripts.php',
@@ -29,7 +29,7 @@ class ComposerStaticInitComments
'OCA\\Comments\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\Comments\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\Comments\\Collaboration\\CommentersSorter' => __DIR__ . '/..' . '/../lib/Collaboration/CommentersSorter.php',
'OCA\\Comments\\Controller\\NotificationsController' => __DIR__ . '/..' . '/../lib/Controller/NotificationsController.php',
'OCA\\Comments\\Controller\\Notifications' => __DIR__ . '/..' . '/../lib/Controller/Notifications.php',
'OCA\\Comments\\EventHandler' => __DIR__ . '/..' . '/../lib/EventHandler.php',
'OCA\\Comments\\Listener\\CommentsEntityEventListener' => __DIR__ . '/..' . '/../lib/Listener/CommentsEntityEventListener.php',
'OCA\\Comments\\Listener\\LoadAdditionalScripts' => __DIR__ . '/..' . '/../lib/Listener/LoadAdditionalScripts.php',
@@ -3,7 +3,7 @@
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
@@ -13,7 +13,7 @@
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b1797842784b250fb01ed5e3bf130705eb94751b',
'reference' => 'dd3d689e04a5e1d558da937ca72980e0e2c7c404',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
-1
View File
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
"No more messages" : "لامزيد من الرسائل",
"Retry" : "أعد المحاولة",
"Failed to mark comments as read" : "إخفاق في تعيين ملاحظات كمقرؤة",
"Unable to load the comments list" : "تعذر تحميل قائمة التعليقات",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],
"_1 new comment_::_{unread} new comments_" : ["1 تعليق جديد","1 تعليق جديد","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة"],
-1
View File
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "لا يوجد تعليقات, ابدأ النقاش الآن!",
"No more messages" : "لامزيد من الرسائل",
"Retry" : "أعد المحاولة",
"Failed to mark comments as read" : "إخفاق في تعيين ملاحظات كمقرؤة",
"Unable to load the comments list" : "تعذر تحميل قائمة التعليقات",
"_%n unread comment_::_%n unread comments_" : ["%n تعليق غير مقروء","%n تعليق غير مقروء","تعليقان غير مقروءة","%n تعليقات غير مقروء","%n تعليق غير مقروء","%n تعليق غير مقروء"],
"_1 new comment_::_{unread} new comments_" : ["1 تعليق جديد","1 تعليق جديد","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة","{unread} تعليقات جديدة"],
-1
View File
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
"No more messages" : "Ikke flere beskeder",
"Retry" : "Prøv igen",
"Failed to mark comments as read" : "Kunne ikke markere kommentarer som læst",
"Unable to load the comments list" : "Kan ikke indlæse kommentarlisten",
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
"_1 new comment_::_{unread} new comments_" : ["1 ny kommentar","{unread} nye kommentarer"],
-1
View File
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "Ingen kommentarer endnu, start samtalen!",
"No more messages" : "Ikke flere beskeder",
"Retry" : "Prøv igen",
"Failed to mark comments as read" : "Kunne ikke markere kommentarer som læst",
"Unable to load the comments list" : "Kan ikke indlæse kommentarlisten",
"_%n unread comment_::_%n unread comments_" : ["%n ulæst kommentar","%n ulæste kommentarer"],
"_1 new comment_::_{unread} new comments_" : ["1 ny kommentar","{unread} nye kommentarer"],
-13
View File
@@ -9,25 +9,12 @@ OC.L10N.register(
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
"{author} commented on {file}" : "{author} comentó en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Fuiste mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} te mencionó en un comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
"Edit comment" : "Editar comentario",
"Delete comment" : "Borrar comentario",
"Cancel edit" : "Cancelar edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
"No more messages" : "No hay más mensajes",
"Retry" : "Reintentar",
"Failed to mark comments as read" : "Error al marcar los comentarios como leídos",
"Unable to load the comments list" : "No se puede cargar la lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario nuevo","{unread} comentarios nuevos","{unread} comentarios nuevos"],
"Comment" : "Comentario",
"An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
"Comment deleted" : "Comentario eliminado",
"An error occurred while trying to delete the comment" : "Ocurrió un error al intentar eliminar el comentario",
"An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario",
"%1$s commented" : "%1$s comentó"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
-13
View File
@@ -7,25 +7,12 @@
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
"{author} commented on {file}" : "{author} comentó en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Fuiste mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} te mencionó en un comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
"Edit comment" : "Editar comentario",
"Delete comment" : "Borrar comentario",
"Cancel edit" : "Cancelar edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
"No more messages" : "No hay más mensajes",
"Retry" : "Reintentar",
"Failed to mark comments as read" : "Error al marcar los comentarios como leídos",
"Unable to load the comments list" : "No se puede cargar la lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario nuevo","{unread} comentarios nuevos","{unread} comentarios nuevos"],
"Comment" : "Comentario",
"An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
"Comment deleted" : "Comentario eliminado",
"An error occurred while trying to delete the comment" : "Ocurrió un error al intentar eliminar el comentario",
"An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario",
"%1$s commented" : "%1$s comentó"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
+1 -14
View File
@@ -9,25 +9,12 @@ OC.L10N.register(
"%1$s commented on %2$s" : "%1$s kommenteeris %2$s",
"{author} commented on {file}" : "{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Sind mainis faili \"{file}\" kommentaaris kasutaja, kes on praeguseks kustutatud.",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mainis sind faili \"{file}\" kommentaaris",
"Files app plugin to add comments to files" : "Failid rakenduse laiendus failidele kommentaaride lisamiseks",
"Edit comment" : "Muuda kommentaari",
"Delete comment" : "Kustuta kommentaar",
"Cancel edit" : "Loobu muutmisest",
"Post comment" : "Postita kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust!",
"No more messages" : "Rohkem teateid pole",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust",
"Retry" : "Proovi uuesti",
"Failed to mark comments as read" : "Kommentaaride loetuks märkimine ebaõnnestus",
"Unable to load the comments list" : "Kommentaaride loendi laadimine ebaõnnestus",
"_%n unread comment_::_%n unread comments_" : ["%n lugemata kommentaar","%n lugemata kommentaari"],
"_1 new comment_::_{unread} new comments_" : ["1 uus kommentaar","{unread} uus kommentaar"],
"Comment" : "Kommentaar",
"An error occurred while trying to edit the comment" : "Kommentaari muutmisel tekkis tõrge",
"Comment deleted" : "Kommentaar kustutatud",
"An error occurred while trying to delete the comment" : "Kommentaari kustutamisel tekkis tõrge",
"An error occurred while trying to create the comment" : "Kommentaari lisamisel tekkis tõrge",
"%1$s commented" : "%1$s kommenteeris"
},
"nplurals=2; plural=(n != 1);");
+1 -14
View File
@@ -7,25 +7,12 @@
"%1$s commented on %2$s" : "%1$s kommenteeris %2$s",
"{author} commented on {file}" : "{author} kommenteeris faili {file}",
"<strong>Comments</strong> for files" : "<strong>Kommentaarid</strong> failidele",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Sind mainis faili \"{file}\" kommentaaris kasutaja, kes on praeguseks kustutatud.",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mainis sind faili \"{file}\" kommentaaris",
"Files app plugin to add comments to files" : "Failid rakenduse laiendus failidele kommentaaride lisamiseks",
"Edit comment" : "Muuda kommentaari",
"Delete comment" : "Kustuta kommentaar",
"Cancel edit" : "Loobu muutmisest",
"Post comment" : "Postita kommentaar",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust!",
"No more messages" : "Rohkem teateid pole",
"No comments yet, start the conversation!" : "Kommentaare veel pole, alusta vestlust",
"Retry" : "Proovi uuesti",
"Failed to mark comments as read" : "Kommentaaride loetuks märkimine ebaõnnestus",
"Unable to load the comments list" : "Kommentaaride loendi laadimine ebaõnnestus",
"_%n unread comment_::_%n unread comments_" : ["%n lugemata kommentaar","%n lugemata kommentaari"],
"_1 new comment_::_{unread} new comments_" : ["1 uus kommentaar","{unread} uus kommentaar"],
"Comment" : "Kommentaar",
"An error occurred while trying to edit the comment" : "Kommentaari muutmisel tekkis tõrge",
"Comment deleted" : "Kommentaar kustutatud",
"An error occurred while trying to delete the comment" : "Kommentaari kustutamisel tekkis tõrge",
"An error occurred while trying to create the comment" : "Kommentaari lisamisel tekkis tõrge",
"%1$s commented" : "%1$s kommenteeris"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
-1
View File
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Oraindik ez dago iruzkinik, izan zaitez lehena zerbait esanez!",
"No more messages" : "Ez da mezu gehiagorik",
"Retry" : "Saiatu berriro",
"Failed to mark comments as read" : "Iruzkinak irakurritako gisa markatzeak huts egin du",
"Unable to load the comments list" : "Ezin da iruzkinen zerrenda kargatu",
"_%n unread comment_::_%n unread comments_" : ["iruzkin %n irakurri gabe","%n iruzkin irakurri gabe"],
"_1 new comment_::_{unread} new comments_" : ["Iruzkin berri 1","{unread} iruzkin berri"],
-1
View File
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "Oraindik ez dago iruzkinik, izan zaitez lehena zerbait esanez!",
"No more messages" : "Ez da mezu gehiagorik",
"Retry" : "Saiatu berriro",
"Failed to mark comments as read" : "Iruzkinak irakurritako gisa markatzeak huts egin du",
"Unable to load the comments list" : "Ezin da iruzkinen zerrenda kargatu",
"_%n unread comment_::_%n unread comments_" : ["iruzkin %n irakurri gabe","%n iruzkin irakurri gabe"],
"_1 new comment_::_{unread} new comments_" : ["Iruzkin berri 1","{unread} iruzkin berri"],
+11 -24
View File
@@ -2,32 +2,19 @@ OC.L10N.register(
"comments",
{
"Comments" : "نظرات",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "You were mentioned on \"{file}\", in a comment by a user that has since been deleted",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "ویرایش توضیح",
"Delete comment" : "حذف توضیح",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"New comment …" : "توضیح جدید ...",
"Post" : "ارسال",
"Cancel" : "منصرف شدن",
"[Deleted user]" : "[کاربر حذف شده]",
"No comments yet, start the conversation!" : "هنوز هیچ نظری ندارید ، مکالمه را شروع کنید!",
"No more messages" : "No more messages",
"Retry" : "تلاش دوباره",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"_%n unread comment_::_%n unread comments_" : ["%n unread comment","%n unread comments"],
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "نظر",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "توضیح حذف",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment",
"%1$s commented" : "%1$s commented"
"More comments …" : "نظرات بیشتر...",
"Save" : "ذخیره",
"Allowed characters {count} of {max}" : "شخصیت های مجاز {count} از {max",
"Error occurred while retrieving comment with ID {id}" : "هنگام بازیابی نظر با ID {id Er خطایی رخ داد",
"Error occurred while updating comment with id {id}" : "هنگام به روزرسانی نظر با شناسه شناسه Er خطایی روی داد",
"Error occurred while posting comment" : "هنگام ارسال نظر خطایی روی داد",
"Comment" : "نظر"
},
"nplurals=2; plural=(n > 1);");
+11 -24
View File
@@ -1,31 +1,18 @@
{ "translations": {
"Comments" : "نظرات",
"You commented" : "You commented",
"{author} commented" : "{author} commented",
"You commented on %1$s" : "You commented on %1$s",
"You commented on {file}" : "You commented on {file}",
"%1$s commented on %2$s" : "%1$s commented on %2$s",
"{author} commented on {file}" : "{author} commented on {file}",
"<strong>Comments</strong> for files" : "<strong>Comments</strong> for files",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "You were mentioned on \"{file}\", in a comment by a user that has since been deleted",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mentioned you in a comment on \"{file}\"",
"Files app plugin to add comments to files" : "Files app plugin to add comments to files",
"Edit comment" : "ویرایش توضیح",
"Delete comment" : "حذف توضیح",
"Cancel edit" : "Cancel edit",
"Post comment" : "Post comment",
"New comment …" : "توضیح جدید ...",
"Post" : "ارسال",
"Cancel" : "منصرف شدن",
"[Deleted user]" : "[کاربر حذف شده]",
"No comments yet, start the conversation!" : "هنوز هیچ نظری ندارید ، مکالمه را شروع کنید!",
"No more messages" : "No more messages",
"Retry" : "تلاش دوباره",
"Failed to mark comments as read" : "Failed to mark comments as read",
"Unable to load the comments list" : "Unable to load the comments list",
"_%n unread comment_::_%n unread comments_" : ["%n unread comment","%n unread comments"],
"_1 new comment_::_{unread} new comments_" : ["1 new comment","{unread} new comments"],
"Comment" : "نظر",
"An error occurred while trying to edit the comment" : "An error occurred while trying to edit the comment",
"Comment deleted" : "توضیح حذف",
"An error occurred while trying to delete the comment" : "An error occurred while trying to delete the comment",
"An error occurred while trying to create the comment" : "An error occurred while trying to create the comment",
"%1$s commented" : "%1$s commented"
"More comments …" : "نظرات بیشتر...",
"Save" : "ذخیره",
"Allowed characters {count} of {max}" : "شخصیت های مجاز {count} از {max",
"Error occurred while retrieving comment with ID {id}" : "هنگام بازیابی نظر با ID {id Er خطایی رخ داد",
"Error occurred while updating comment with id {id}" : "هنگام به روزرسانی نظر با شناسه شناسه Er خطایی روی داد",
"Error occurred while posting comment" : "هنگام ارسال نظر خطایی روی داد",
"Comment" : "نظر"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+10 -11
View File
@@ -2,32 +2,31 @@ OC.L10N.register(
"comments",
{
"Comments" : "Comentarios",
"You commented" : "Vde. comentou",
"You commented" : "Vostede comentou",
"{author} commented" : "{author} comentou",
"You commented on %1$s" : "Vde. comentou en %1$s",
"You commented on {file}" : "Vde. comentou en {file}",
"You commented on %1$s" : "Vostede comentou en %1$s",
"You commented on {file}" : "Vostede comentou en {file}",
"%1$s commented on %2$s" : "%1$s comentados en %2$s",
"{author} commented on {file}" : "{author} comentou en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> para ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionárono en «{file}», nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionouno a Vde. nun comentario en «{file}»",
"Files app plugin to add comments to files" : "Complemento da aplicación de ficheiros para engadir comentarios aos ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionáronte en \"{ficheiro}\", nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionoute nun comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Engadido da aplicación de ficheiros para engadir comentarios aos ficheiros",
"Edit comment" : "Editar comentario",
"Delete comment" : "Eliminar comentario",
"Cancel edit" : "Cancelar a edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
"No more messages" : "Non hai máis mensaxes",
"Retry" : "Tentar de novo",
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
"Retry" : "Volver tentar",
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentario sen ler","%n comentarios sen ler"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],
"Comment" : "Comentario",
"An error occurred while trying to edit the comment" : "Produciuse un erro cando tentaba editar o comentario",
"An error occurred while trying to edit the comment" : "Produciuse un erro mentres tentaba editar o comentario",
"Comment deleted" : "Comentario eliminado",
"An error occurred while trying to delete the comment" : "Produciuse un erro cando tentaba eliminar o comentario",
"An error occurred while trying to create the comment" : "Produciuse un erro cando tentaba crear o comentario",
"An error occurred while trying to delete the comment" : "Produciuse un erro mentres tentaba eliminar o comentario",
"An error occurred while trying to create the comment" : "Produciuse un erro mentres tentaba crear o comentario",
"%1$s commented" : "%1$s comentados"
},
"nplurals=2; plural=(n != 1);");
+10 -11
View File
@@ -1,31 +1,30 @@
{ "translations": {
"Comments" : "Comentarios",
"You commented" : "Vde. comentou",
"You commented" : "Vostede comentou",
"{author} commented" : "{author} comentou",
"You commented on %1$s" : "Vde. comentou en %1$s",
"You commented on {file}" : "Vde. comentou en {file}",
"You commented on %1$s" : "Vostede comentou en %1$s",
"You commented on {file}" : "Vostede comentou en {file}",
"%1$s commented on %2$s" : "%1$s comentados en %2$s",
"{author} commented on {file}" : "{author} comentou en {file}",
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> para ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionárono en «{file}», nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionouno a Vde. nun comentario en «{file}»",
"Files app plugin to add comments to files" : "Complemento da aplicación de ficheiros para engadir comentarios aos ficheiros",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Mencionáronte en \"{ficheiro}\", nun comentario dun usuario que xa foi eliminado",
"{user} mentioned you in a comment on \"{file}\"" : "{user} mencionoute nun comentario en \"{file}\"",
"Files app plugin to add comments to files" : "Engadido da aplicación de ficheiros para engadir comentarios aos ficheiros",
"Edit comment" : "Editar comentario",
"Delete comment" : "Eliminar comentario",
"Cancel edit" : "Cancelar a edición",
"Post comment" : "Publicar comentario",
"No comments yet, start the conversation!" : "Aínda non hai comentarios, comeza a conversa!",
"No more messages" : "Non hai máis mensaxes",
"Retry" : "Tentar de novo",
"Failed to mark comments as read" : "Produciuse un fallo ao marcar os comentarios como lidos",
"Retry" : "Volver tentar",
"Unable to load the comments list" : "Non é posíbel cargar a lista de comentarios",
"_%n unread comment_::_%n unread comments_" : ["%n comentario sen ler","%n comentarios sen ler"],
"_1 new comment_::_{unread} new comments_" : ["1 comentario novo","{unread} comentarios novos"],
"Comment" : "Comentario",
"An error occurred while trying to edit the comment" : "Produciuse un erro cando tentaba editar o comentario",
"An error occurred while trying to edit the comment" : "Produciuse un erro mentres tentaba editar o comentario",
"Comment deleted" : "Comentario eliminado",
"An error occurred while trying to delete the comment" : "Produciuse un erro cando tentaba eliminar o comentario",
"An error occurred while trying to create the comment" : "Produciuse un erro cando tentaba crear o comentario",
"An error occurred while trying to delete the comment" : "Produciuse un erro mentres tentaba eliminar o comentario",
"An error occurred while trying to create the comment" : "Produciuse un erro mentres tentaba crear o comentario",
"%1$s commented" : "%1$s comentados"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
-1
View File
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Még nincsenek hozzászólások, kezdje el a beszélgetést!",
"No more messages" : "Nincs több üzenet",
"Retry" : "Újra",
"Failed to mark comments as read" : "A hozzászólások olvasottnak jelölése sikertelen",
"Unable to load the comments list" : "A hozzászólások betöltése sikertelen",
"_%n unread comment_::_%n unread comments_" : ["%n olvasatlan hozzászólás","%n olvasatlan hozzászólás"],
"_1 new comment_::_{unread} new comments_" : ["1 új hozzászólás","{unread} új hozzászólás"],
-1
View File
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "Még nincsenek hozzászólások, kezdje el a beszélgetést!",
"No more messages" : "Nincs több üzenet",
"Retry" : "Újra",
"Failed to mark comments as read" : "A hozzászólások olvasottnak jelölése sikertelen",
"Unable to load the comments list" : "A hozzászólások betöltése sikertelen",
"_%n unread comment_::_%n unread comments_" : ["%n olvasatlan hozzászólás","%n olvasatlan hozzászólás"],
"_1 new comment_::_{unread} new comments_" : ["1 új hozzászólás","{unread} új hozzászólás"],
+2 -3
View File
@@ -3,11 +3,11 @@ OC.L10N.register(
{
"Comments" : "Коментарі",
"You commented" : "Ви прокоментували",
"{author} commented" : "{author} прокоментував(-ла)",
"{author} commented" : "{author} прокоментував",
"You commented on %1$s" : "Ви прокоментували на %1$s",
"You commented on {file}" : "Ви прокоментували {file}",
"%1$s commented on %2$s" : "%1$s прокоментовано у %2$s",
"{author} commented on {file}" : "{author} прокоментував(-ла) {file}",
"{author} commented on {file}" : "{author} прокоментував {file}",
"<strong>Comments</strong> for files" : "З'явилися <strong>коментарі</strong> до файлів",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Вас згадали в \"{file}\" у коментарі користувача, який згодом було видалено",
"{user} mentioned you in a comment on \"{file}\"" : "{user} згадав вас у коментарі до \"{file}\"",
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Тут можна додати коментарі",
"No more messages" : "Більше жодних повідомлень",
"Retry" : "Ще раз",
"Failed to mark comments as read" : "Не вдалося позначити коментарі прочитаними",
"Unable to load the comments list" : "Не вдалося завантажити список коментарів",
"_%n unread comment_::_%n unread comments_" : ["%n непрочитаний коментар","%n непрочитаних коментарів","%n непрочитаних коментарів","%n непрочитаних коментарів"],
"_1 new comment_::_{unread} new comments_" : ["{unread} новий коментар","{unread} нових коментарів","{unread} нових коментарів","{unread} нових коментарів"],
+2 -3
View File
@@ -1,11 +1,11 @@
{ "translations": {
"Comments" : "Коментарі",
"You commented" : "Ви прокоментували",
"{author} commented" : "{author} прокоментував(-ла)",
"{author} commented" : "{author} прокоментував",
"You commented on %1$s" : "Ви прокоментували на %1$s",
"You commented on {file}" : "Ви прокоментували {file}",
"%1$s commented on %2$s" : "%1$s прокоментовано у %2$s",
"{author} commented on {file}" : "{author} прокоментував(-ла) {file}",
"{author} commented on {file}" : "{author} прокоментував {file}",
"<strong>Comments</strong> for files" : "З'явилися <strong>коментарі</strong> до файлів",
"You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Вас згадали в \"{file}\" у коментарі користувача, який згодом було видалено",
"{user} mentioned you in a comment on \"{file}\"" : "{user} згадав вас у коментарі до \"{file}\"",
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "Тут можна додати коментарі",
"No more messages" : "Більше жодних повідомлень",
"Retry" : "Ще раз",
"Failed to mark comments as read" : "Не вдалося позначити коментарі прочитаними",
"Unable to load the comments list" : "Не вдалося завантажити список коментарів",
"_%n unread comment_::_%n unread comments_" : ["%n непрочитаний коментар","%n непрочитаних коментарів","%n непрочитаних коментарів","%n непрочитаних коментарів"],
"_1 new comment_::_{unread} new comments_" : ["{unread} новий коментар","{unread} нових коментарів","{unread} нових коментарів","{unread} нових коментарів"],
+1 -2
View File
@@ -1,7 +1,7 @@
OC.L10N.register(
"comments",
{
"Comments" : "Bình luận",
"Comments" : "Các bình luận",
"You commented" : "Bạn đã bình luận",
"{author} commented" : "{author} đã bình luận",
"You commented on %1$s" : "Bạn đã bình luận về %1$s",
@@ -19,7 +19,6 @@ OC.L10N.register(
"No comments yet, start the conversation!" : "Không có bình luận nào, bắt đầu cuộc hội thoại!",
"No more messages" : "Không có thêm tin nhắn",
"Retry" : "Thử lại",
"Failed to mark comments as read" : "Không thể đánh dấu bình luận là đã đọc",
"Unable to load the comments list" : "Không thể tải danh sách bình luận",
"_%n unread comment_::_%n unread comments_" : ["%n bình luận chưa đọc"],
"_1 new comment_::_{unread} new comments_" : ["{unread} bình luận mới"],
+1 -2
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Comments" : "Bình luận",
"Comments" : "Các bình luận",
"You commented" : "Bạn đã bình luận",
"{author} commented" : "{author} đã bình luận",
"You commented on %1$s" : "Bạn đã bình luận về %1$s",
@@ -17,7 +17,6 @@
"No comments yet, start the conversation!" : "Không có bình luận nào, bắt đầu cuộc hội thoại!",
"No more messages" : "Không có thêm tin nhắn",
"Retry" : "Thử lại",
"Failed to mark comments as read" : "Không thể đánh dấu bình luận là đã đọc",
"Unable to load the comments list" : "Không thể tải danh sách bình luận",
"_%n unread comment_::_%n unread comments_" : ["%n bình luận chưa đọc"],
"_1 new comment_::_{unread} new comments_" : ["{unread} bình luận mới"],

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