Compare commits

..

16 Commits

Author SHA1 Message Date
Côme Chilliet 03464f1429 chore: Use constructor property promotion in OCMProvider
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-03-25 17:30:42 +01:00
Côme Chilliet fafac38f74 chore: Update openapi json files
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-03-25 17:28:16 +01:00
Côme Chilliet 8cd70560d9 fix: Use mocks instead of real services in RequestHandlerControllerTest
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2025-03-25 17:26:39 +01:00
Micke Nordin 5149a333cb feat(OCM-invites): add test
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 61aad3f1e8 feat(OCM-invites): Fix psalm issues
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin b0a523b999 feat(OCM-invites): Fix psalm issues
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 616447413e feat(OCM-invites): Simplify accepted timestampcheck
Also run cs:fix to fix the code style, and address some minor points.

Fix typo in setRecipientName

Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 8404324774 feat(OCM-invites): Further code style
Co-authored-by: Anna <anna@nextcloud.com>
Co-authored-by: Côme Chilliet <91878298+come-nc@users.noreply.github.com>
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 4a902b477e feat(OCM-invite): check fails with too strict equality check
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 6ec00d3df8 feat(OCM-invites): Code style and formatting
Use more ideomatic code and use helper functions that exists where possible.
It seems notnull must be false for sqlite to store false Otherwise we get a chrash.

Co-authored-by: Anna <anna@nextcloud.com>
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 42cb346efd feat(ITimeFactory): Implement createFromFormat
Allow usage of \DateTime::createFromFormat from the ITimeFactory

Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin a178acfa1c feat(OCM-invites): Add entity and mapper
This patch introduces an entity and a mapper for Invites

Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 5999d77893 feat(OCM-invites): Add invitation class and emit event
I realize that we need to be able to react to accepted invites
elsewhere, e.g. contacts app, so adding invite class and event for
that purpose.

Also rename the migration and bump the version so it will take affect correctly.

Co-authored-by: Navid Shokri <navid.pdp11@gmail.com>
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin bf31fa9dc7 feat(OCM-invites): Address review feedback
Codestyle and more ideomatic code

Co-authored-by: Joas Schilling <213943+nickvergessen@users.noreply.github.com>
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 668246d380 feat(OCM-invites): Implementation of invitation flow
This patchset implements the /invite-accepted endpoint

https://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1invite-accepted/post

Also normalize names of columns, and populate them all

Inspo from:
 - apps/dav/lib/Migration/Version1005Date20180413093149.php
 - https://saturncloud.io/blog/what-is-the-maximum-length-of-a-url-in-different-browsers/#maximum-url-length-in-different-browsers
 - https://www.directedignorance.com/blog/maximum-length-of-email-address

Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
Micke Nordin 9e09cddf9b feat(OCM-invites): Add database table federated_invites.
Co-authored-by: Navid Shokri <navid.pdp11@gmail.com>
Signed-off-by: Micke Nordin <kano@sunet.se>
2025-03-25 16:07:12 +01:00
1091 changed files with 6182 additions and 14196 deletions
+11 -11
View File
@@ -24,8 +24,8 @@ package-lock.json @nextcloud/server-dependabot
# App maintainers
/apps/admin_audit/appinfo/info.xml @luka-nextcloud @blizzz
/apps/cloud_federation_api/appinfo/info.xml @nfebe @mejo-
/apps/comments/appinfo/info.xml @edward-ly @sorbaugh
/apps/cloud_federation_api/appinfo/info.xml @mejo-
/apps/comments/appinfo/info.xml @edward-ly @Pytal
/apps/contactsinteraction/appinfo/info.xml @kesselb @SebastianKrupinski
/apps/contactsinteraction/lib @kesselb @SebastianKrupinski
/apps/contactsinteraction/tests @kesselb @SebastianKrupinski
@@ -36,21 +36,21 @@ package-lock.json @nextcloud/server-dependabot
/apps/dav/tests/unit/CardDAV @hamza221 @SebastianKrupinski
/apps/encryption/appinfo/info.xml @come-nc @icewind1991
/apps/federatedfilesharing/appinfo/info.xml @icewind1991 @danxuliu
/apps/federation/appinfo/info.xml @nfebe @sorbaugh
/apps/files/appinfo/info.xml @skjnldsv @ArtificialOwl @come-nc @artonge @icewind1991 @szaimen @susnux @nfebe
/apps/federation/appinfo/info.xml @nfebe
/apps/files/appinfo/info.xml @skjnldsv @Pytal @ArtificialOwl @come-nc @artonge @icewind1991 @szaimen @susnux @nfebe
/apps/files_external/appinfo/info.xml @icewind1991 @artonge
/apps/files_reminders/appinfo/info.xml @skjnldsv @sorbaugh
/apps/files_reminders/appinfo/info.xml @Pytal
/apps/files_sharing/appinfo/info.xml @skjnldsv @come-nc
/apps/files_trashbin/appinfo/info.xml @icewind1991 @sorbaugh
/apps/files_trashbin/appinfo/info.xml @Pytal @icewind1991
/apps/files_versions/appinfo/info.xml @artonge @icewind1991
/apps/oauth2/appinfo/info.xml @julien-nc @ChristophWurst
/apps/provisioning_api/appinfo/info.xml @provokateurin @nickvergessen
/apps/settings/appinfo/info.xml @JuliaKirschenheuter @sorbaugh
/apps/sharebymail/appinfo/info.xml @Altahrim @skjnldsv
/apps/settings/appinfo/info.xml @Pytal @JuliaKirschenheuter
/apps/sharebymail/appinfo/info.xml @Altahrim
/apps/systemtags/appinfo/info.xml @Antreesy @marcelklehr
/apps/theming/appinfo/info.xml @skjnldsv @juliusknorr
/apps/twofactor_backupcodes/appinfo/info.xml @st3iny @miaulalala @ChristophWurst
/apps/updatenotification/appinfo/info.xml @JuliaKirschenheuter @sorbaugh
/apps/updatenotification/appinfo/info.xml @Pytal @JuliaKirschenheuter
/apps/user_ldap/appinfo/info.xml @come-nc @blizzz
/apps/user_status/appinfo/info.xml @Antreesy @nickvergessen
/apps/weather_status/appinfo/info.xml @julien-nc @juliusknorr
@@ -80,8 +80,8 @@ package-lock.json @nextcloud/server-dependabot
/core/routes.php @Altahrim @nextcloud/server-backend
# OpenAPI
openapi*.json @provokateurin @nextcloud/server-backend
ResponseDefinitions.php @provokateurin @nextcloud/server-backend
openapi*.json @provokateurin
ResponseDefinitions.php @provokateurin
# Talk team
/lib/private/Comments @nickvergessen @nextcloud/talk-backend
+1 -4
View File
@@ -81,7 +81,7 @@ updates:
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 20
open-pull-requests-limit: 10
labels:
- "3. to review"
- "feature: dependencies"
@@ -121,7 +121,6 @@ updates:
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 20
target-branch: stable29
labels:
- "3. to review"
@@ -141,7 +140,6 @@ updates:
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 20
target-branch: stable30
labels:
- "3. to review"
@@ -161,7 +159,6 @@ updates:
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 20
target-branch: stable31
labels:
- "3. to review"
+1 -1
View File
@@ -120,7 +120,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.package-engines-versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ steps.package-engines-versions.outputs.nodeVersion }}
cache: npm
+6 -6
View File
@@ -64,7 +64,7 @@ jobs:
fallbackNpm: "^10"
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -110,7 +110,7 @@ jobs:
path: ./
- name: Set up node ${{ needs.init.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ needs.init.outputs.nodeVersion }}
@@ -121,7 +121,7 @@ jobs:
run: ./node_modules/cypress/bin/cypress install
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
uses: cypress-io/github-action@108b8684ae52e735ff7891524cbffbcd4be5b19f # v6.7.16
uses: cypress-io/github-action@9c318d4f950c2f0ff2e96fa4dc4279e5706efd8e # v6.7.14
with:
# We already installed the dependencies in the init job
install: false
@@ -143,7 +143,7 @@ jobs:
SPLIT_INDEX: ${{ matrix.containers == 'component' && 0 || matrix.containers }}
- name: Upload snapshots and videos
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
if: always()
with:
name: snapshots_videos_${{ matrix.containers }}
@@ -156,7 +156,7 @@ jobs:
run: docker logs nextcloud-cypress-tests_${{ env.APP_NAME }} > nextcloud.log
- name: Upload NC logs
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
if: failure() && matrix.containers != 'component'
with:
name: nc_logs_${{ matrix.containers }}
@@ -167,7 +167,7 @@ jobs:
run: docker exec nextcloud-cypress-tests_${{ env.APP_NAME }} tar -cvjf - data > data.tar
- name: Upload data dir archive
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1
if: failure() && matrix.containers != 'component'
with:
name: nc_data_${{ matrix.containers }}
-9
View File
@@ -73,7 +73,6 @@ jobs:
php-versions: ['8.1']
spreed-versions: ['main']
activity-versions: ['master']
services:
redis:
@@ -105,14 +104,6 @@ jobs:
path: apps/spreed
ref: ${{ matrix.spreed-versions }}
- name: Checkout Activity app
if: ${{ matrix.test-suite == 'sharing_features' }}
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
repository: nextcloud/activity
path: apps/activity
ref: ${{ matrix.activity-versions }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@9e72090525849c5e82e596468b86eb55e9cc5401 #v2.32.0
with:
+1 -1
View File
@@ -63,7 +63,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v3
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+3 -3
View File
@@ -83,7 +83,7 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@@ -117,7 +117,7 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
@@ -145,7 +145,7 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- name: Set up node ${{ needs.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ needs.versions.outputs.nodeVersion }}
+1 -1
View File
@@ -63,7 +63,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v3
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v3
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
+2 -2
View File
@@ -45,7 +45,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@cdca7365b2dadb8aad0a33bc7601856ffabcc48e # v4.3.0
uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -66,7 +66,7 @@ jobs:
- name: Create Pull Request
if: steps.checkout.outcome == 'success'
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284 # v7.0.7
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'fix(deps): Fix npm audit'
+1 -1
View File
@@ -91,7 +91,7 @@ jobs:
- name: Upload profiles
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1
with:
name: profiles
path: |
+1 -1
View File
@@ -28,7 +28,7 @@ jobs:
run: curl --etag-compare build/ca-bundle-etag.txt --etag-save build/ca-bundle-etag.txt --output resources/config/ca-bundle.crt https://curl.se/ca/cacert.pem
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'fix(security): Update CA certificate bundle'
@@ -31,7 +31,7 @@ jobs:
run: openssl crl -verify -in resources/codesigning/root.crl -CAfile resources/codesigning/root.crt -noout
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'fix(security): Update code signing revocation list'
@@ -102,7 +102,7 @@ jobs:
fi
- name: Create Pull Request
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e
uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284
if: steps.update-files.outputs.CHANGES_MADE == 'true'
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
-4
View File
@@ -167,10 +167,6 @@ Files: apps/dav/tests/unit/test_fixtures/caldav-search-limit-timerange-1.ics app
Copyright: 2023 Nextcloud GmbH and Nextcloud contributors
License: AGPL-3.0-or-later
Files: apps/dav/lib/ExampleContentFiles/exampleContact.vcf
Copyright: 2025 Nextcloud GmbH and Nextcloud contributors
License: AGPL-3.0-or-later
Files: composer.json composer.lock .github/CODEOWNERS __tests__/tsconfig.json tsconfig.json build/integration/composer.* vendor-bin/*/composer.json vendor-bin/*/composer.lock apps/*/composer/composer.json apps/*/composer/composer.lock apps/*/composer/composer/installed.json
Copyright: 2011-2016 ownCloud, Inc., 2016-2024 Nextcloud GmbH and Nextcloud contributors
License: AGPL-3.0-only OR AGPL-3.0-or-later
+42
View File
@@ -0,0 +1,42 @@
# SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-FileCopyrightText: 2016 ownCloud, Inc.
# SPDX-License-Identifier: AGPL-3.0-only
before_commands:
- 'git submodule update --init --recursive'
build:
nodes:
analysis:
tests:
override:
- php-scrutinizer-run
checks:
php:
excluded_dependencies:
- etsy/phan
filter:
excluded_paths:
- '3rdparty/*'
- 'apps/*/3rdparty/*'
- 'apps/*/vendor/*'
- 'l10n/*'
- 'core/l10n/*'
- 'apps/*/l10n/*'
- 'apps/*/tests/*'
- 'lib/l10n/*'
- 'core/vendor/*'
- 'core/js/tests/lib/*.js'
- 'core/js/tests/specs/*.js'
- 'core/js/jquery-showpassword.js'
- 'core/js/jquery-tipsy.js'
- 'core/js/placeholders.js'
- 'settings/l10n/*'
- 'tests/*'
- 'build/*'
- 'lib/composer/*'
imports:
- javascript
- php
+1
View File
@@ -5,6 +5,7 @@
-->
# Nextcloud Server ☁
[![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/server)](https://api.reuse.software/info/github.com/nextcloud/server)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/nextcloud/server/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/nextcloud/server/?branch=master)
[![codecov](https://codecov.io/gh/nextcloud/server/branch/master/graph/badge.svg)](https://codecov.io/gh/nextcloud/server)
[![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/209/badge)](https://bestpractices.coreinfrastructure.org/projects/209)
[![Design](https://contribute.design/api/shield/nextcloud/server)](https://contribute.design/nextcloud/server)
+1 -1
View File
@@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Auditēšana / Žurnalizēšana",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nodrošina Nextcloud žurnalēšanas spējas, piemēram, datņu piekļuves žurnalēšanu vai citas gas darbības."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nodrošina Nextcloud žurnalizēšanas iespējas, piemēram, faila piekļuves žurnalizēšanu vai citas sensivas darbības."
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);");
+1 -1
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "Auditēšana / Žurnalizēšana",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nodrošina Nextcloud žurnalēšanas spējas, piemēram, datņu piekļuves žurnalēšanu vai citas gas darbības."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Nodrošina Nextcloud žurnalizēšanas iespējas, piemēram, faila piekļuves žurnalizēšanu vai citas sensivas darbības."
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"
}
+1 -1
View File
@@ -2,6 +2,6 @@ OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Auditoria / Registro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de registro para o Nextcloud, como acessos a arquivos de registro ou outras ações sensíveis."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece habilidades de registro para o NextCloud, como acessos de arquivo de log ou ações sensíveis."
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+1 -1
View File
@@ -1,5 +1,5 @@
{ "translations": {
"Auditing / Logging" : "Auditoria / Registro",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece recursos de registro para o Nextcloud, como acessos a arquivos de registro ou outras ações sensíveis."
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Fornece habilidades de registro para o NextCloud, como acessos de arquivo de log ou ações sensíveis."
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
-7
View File
@@ -1,7 +0,0 @@
OC.L10N.register(
"admin_audit",
{
"Auditing / Logging" : "Praćenje / Beleženje",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Daje Nextcloudu mogućnost beleženja, poput pristupa fajlovima ili drugih osetljivih radnji."
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
-5
View File
@@ -1,5 +0,0 @@
{ "translations": {
"Auditing / Logging" : "Praćenje / Beleženje",
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Daje Nextcloudu mogućnost beleženja, poput pristupa fajlovima ili drugih osetljivih radnji."
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
}
+1 -1
View File
@@ -9,7 +9,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.15.0</version>
<version>1.16.0</version>
<licence>agpl</licence>
<author>Bjoern Schiessle</author>
<namespace>CloudFederationAPI</namespace>
+6 -6
View File
@@ -20,11 +20,11 @@ return [
'verb' => 'POST',
'root' => '/ocm',
],
// [
// 'name' => 'RequestHandler#inviteAccepted',
// 'url' => '/invite-accepted',
// 'verb' => 'POST',
// 'root' => '/ocm',
// ]
[
'name' => 'RequestHandler#inviteAccepted',
'url' => '/invite-accepted',
'verb' => 'POST',
'root' => '/ocm',
]
],
];
@@ -11,5 +11,9 @@ 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\\Db\\FederatedInvite' => $baseDir . '/../lib/Db/FederatedInvite.php',
'OCA\\CloudFederationAPI\\Db\\FederatedInviteMapper' => $baseDir . '/../lib/Db/FederatedInviteMapper.php',
'OCA\\CloudFederationAPI\\Events\\FederatedInviteAcceptedEvent' => $baseDir . '/../lib/Events/FederatedInviteAcceptedEvent.php',
'OCA\\CloudFederationAPI\\Migration\\Version1016Date202502262004' => $baseDir . '/../lib/Migration/Version1016Date202502262004.php',
'OCA\\CloudFederationAPI\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
);
@@ -26,6 +26,10 @@ 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\\Db\\FederatedInvite' => __DIR__ . '/..' . '/../lib/Db/FederatedInvite.php',
'OCA\\CloudFederationAPI\\Db\\FederatedInviteMapper' => __DIR__ . '/..' . '/../lib/Db/FederatedInviteMapper.php',
'OCA\\CloudFederationAPI\\Events\\FederatedInviteAcceptedEvent' => __DIR__ . '/..' . '/../lib/Events/FederatedInviteAcceptedEvent.php',
'OCA\\CloudFederationAPI\\Migration\\Version1016Date202502262004' => __DIR__ . '/..' . '/../lib/Migration/Version1016Date202502262004.php',
'OCA\\CloudFederationAPI\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
);
+1 -1
View File
@@ -2,7 +2,7 @@ OC.L10N.register(
"cloud_federation_api",
{
"Cloud Federation API" : "API de Nuvem Federada",
"Enable clouds to communicate with each other and exchange data" : "Permitir que as nuvens se comuniquem entre si e troquem dados",
"Enable clouds to communicate with each other and exchange data" : "Permite que diferentes nuvens se comuniquem entre si e troquem dados",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nuvem Federada permite que várias instâncias do Nextcloud se comuniquem entre si e troquem dados."
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+1 -1
View File
@@ -1,6 +1,6 @@
{ "translations": {
"Cloud Federation API" : "API de Nuvem Federada",
"Enable clouds to communicate with each other and exchange data" : "Permitir que as nuvens se comuniquem entre si e troquem dados",
"Enable clouds to communicate with each other and exchange data" : "Permite que diferentes nuvens se comuniquem entre si e troquem dados",
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "A API de Nuvem Federada permite que várias instâncias do Nextcloud se comuniquem entre si e troquem dados."
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}
@@ -19,7 +19,7 @@ use OCP\OCM\IOCMProvider;
use Psr\Log\LoggerInterface;
class Capabilities implements ICapability {
public const API_VERSION = '1.1'; // informative, real version.
public const API_VERSION = '1.1.0';
public function __construct(
private IURLGenerator $urlGenerator,
@@ -40,16 +40,19 @@ class Capabilities implements ICapability {
* endPoint: string,
* publicKey?: array{
* keyId: string,
* publicKeyPem: string,
* publicKeyPem: string
* },
* provider: string,
* resourceTypes: list<array{
* name: string,
* shareTypes: list<string>,
* protocols: array<string, string>
* }>,
* version: string
* }
* }
* version: string,
* capabilities: array{
* }
* }
* } OCM provider information
* @throws OCMArgumentException
*/
public function getCapabilities() {
@@ -57,6 +60,7 @@ class Capabilities implements ICapability {
$this->provider->setEnabled(true);
$this->provider->setApiVersion(self::API_VERSION);
$this->provider->setCapabilities(['/invite-accepted', '/notifications', '/shares']);
$pos = strrpos($url, '/');
if ($pos === false) {
@@ -1,8 +1,10 @@
<?php
/**
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationAPI\Controller;
use NCU\Federation\ISignedCloudFederationProvider;
@@ -15,15 +17,21 @@ use NCU\Security\Signature\IIncomingSignedRequest;
use NCU\Security\Signature\ISignatureManager;
use OC\OCM\OCMSignatoryManager;
use OCA\CloudFederationAPI\Config;
use OCA\CloudFederationAPI\Db\FederatedInviteMapper;
use OCA\CloudFederationAPI\Events\FederatedInviteAcceptedEvent;
use OCA\CloudFederationAPI\ResponseDefinitions;
use OCA\FederatedFileSharing\AddressHandler;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\BruteForceProtection;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\OpenAPI;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\Exceptions\ActionNotSupportedException;
use OCP\Federation\Exceptions\AuthenticationFailedException;
use OCP\Federation\Exceptions\BadRequestException;
@@ -61,12 +69,16 @@ class RequestHandlerController extends Controller {
private IURLGenerator $urlGenerator,
private ICloudFederationProviderManager $cloudFederationProviderManager,
private Config $config,
private IEventDispatcher $dispatcher,
private FederatedInviteMapper $federatedInviteMapper,
private readonly AddressHandler $addressHandler,
private readonly IAppConfig $appConfig,
private ICloudFederationFactory $factory,
private ICloudIdManager $cloudIdManager,
private readonly ISignatureManager $signatureManager,
private readonly OCMSignatoryManager $signatoryManager,
private TrustedServers $trustedServers,
private ITimeFactory $timeFactory,
) {
parent::__construct($appName, $request);
}
@@ -107,7 +119,8 @@ class RequestHandlerController extends Controller {
}
// check if all required parameters are set
if ($shareWith === null ||
if (
$shareWith === null ||
$name === null ||
$providerId === null ||
$resourceType === null ||
@@ -213,6 +226,99 @@ class RequestHandlerController extends Controller {
return new JSONResponse($responseData, Http::STATUS_CREATED);
}
/**
* Inform the sender that an invitation was accepted to start sharing
*
* Inform about an accepted invitation so the user on the sender provider's side
* can initiate the OCM share creation. To protect the identity of the parties,
* for shares created following an OCM invitation, the user id MAY be hashed,
* and recipients implementing the OCM invitation workflow MAY refuse to process
* shares coming from unknown parties.
*
* @param string $recipientProvider The address of the recipent's provider
* @param string $token The token used for the invitation
* @param string $userId The userId of the recipient at the recipient's provider
* @param string $email The email address of the recipient
* @param string $name The display name of the recipient
*
* @return JSONResponse<Http::STATUS_OK|Http::STATUS_FORBIDDEN|Http::STATUS_BAD_REQUEST|Http::STATUS_CONFLICT, array{email?: null|string, error?: true, message?: string, name?: string, userID?: string}, array{}>
*
* Note: Not implementing 404 Invitation token does not exist, instead using 400
* 200: Invitation accepted
* 400: Invalid token
* 403: Invitation token does not exist
* 409: User is already known by the OCM provider
* spec link: https://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1invite-accepted/post
*/
#[PublicPage]
#[NoCSRFRequired]
#[BruteForceProtection(action: 'inviteAccepted')]
public function inviteAccepted(string $recipientProvider, string $token, string $userId, string $email, string $name): JSONResponse {
$this->logger->debug('Invite accepted for ' . $userId . ' with token ' . $token . ' and email ' . $email . ' and name ' . $name);
$updated = $this->timeFactory->getTime();
if ($token === '') {
$response = new JSONResponse(['message' => 'Invalid or non existing token', 'error' => true], Http::STATUS_BAD_REQUEST);
$response->throttle();
return $response;
}
if (!$this->trustedServers->isTrustedServer($recipientProvider)) {
$response = ['message' => 'Remote server not trusted', 'error' => true];
$status = Http::STATUS_FORBIDDEN;
return new JSONResponse($response, $status);
}
try {
$invitation = $this->federatedInviteMapper->findByToken($token);
} catch (DoesNotExistException) {
$response = ['message' => 'Invalid or non existing token', 'error' => true];
$status = Http::STATUS_BAD_REQUEST;
$response = new JSONResponse($response, $status);
$response->throttle();
return $response;
}
if ($invitation->isAccepted() === true) {
$response = ['message' => 'Invite already accepted', 'error' => true];
$status = Http::STATUS_CONFLICT;
return new JSONResponse($response, $status);
}
if (!empty($invitation->getExpiredAt()) && $updated > $invitation->getExpiredAt()) {
$response = ['message' => 'Invitation expired', 'error' => true];
$status = Http::STATUS_BAD_REQUEST;
return new JSONResponse($response, $status);
}
$localUser = $this->userManager->get($invitation->getUserId());
if ($localUser === null) {
$response = ['message' => 'Invalid or non existing token', 'error' => true];
$status = Http::STATUS_BAD_REQUEST;
$response = new JSONResponse($response, $status);
$response->throttle();
return $response;
}
$sharedFromEmail = $localUser->getPrimaryEMailAddress();
$sharedFromDisplayName = $localUser->getDisplayName();
$response = ['userID' => $localUser->getUID(), 'email' => $sharedFromEmail, 'name' => $sharedFromDisplayName];
$status = Http::STATUS_OK;
$invitation->setAccepted(true);
$invitation->setRecipientEmail($email);
$invitation->setRecipientName($name);
$invitation->setRecipientProvider($recipientProvider);
$invitation->setRecipientUserId($userId);
$invitation->setAcceptedAt($updated);
$invitation = $this->federatedInviteMapper->update($invitation);
$event = new FederatedInviteAcceptedEvent($invitation);
$this->dispatcher->dispatchTyped($event);
return new JSONResponse($response, $status);
}
/**
* Send a notification about an existing share
*
@@ -233,7 +339,8 @@ class RequestHandlerController extends Controller {
#[BruteForceProtection(action: 'receiveFederatedShareNotification')]
public function receiveNotification($notificationType, $resourceType, $providerId, ?array $notification) {
// check if all required parameters are set
if ($notificationType === null ||
if (
$notificationType === null ||
$resourceType === null ||
$providerId === null ||
!is_array($notification)
@@ -0,0 +1,92 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationAPI\Db;
use OCP\AppFramework\Db\Entity;
use OCP\DB\Types;
/**
* @method bool isAccepted()
* @method void setAccepted(bool $accepted)
* @method ?int getAcceptedAt()
* @method void setAcceptedAt(int $acceptedAt)
* @method ?int getCreatedAt()
* @method void setCreatedAt(int $createdAt)
* @method ?int getExpiredAt()
* @method void setExpiredAt(int $expiredAt)
* @method ?string getRecipientEmail()
* @method void setRecipientEmail(string $recipientEmail)
* @method ?string getRecipientName()
* @method void setRecipientName(string $recipientName)
* @method ?string getRecipientProvider()
* @method void setRecipientProvider(string $recipientProvider)
* @method ?string getRecipientUserId()
* @method void setRecipientUserId(string $recipientUserId)
* @method string getToken()
* @method void setToken(string $token)
* @method ?string getUserId()
* @method void setUserId(string $userId)
*/
class FederatedInvite extends Entity {
/**
* @var bool $accepted
*/
protected $accepted;
/**
* @var ?int $acceptedAt
*/
protected $acceptedAt;
/**
* @var int $createdAt
*/
protected $createdAt;
/**
* @var ?int $expiredAt
*/
protected $expiredAt;
/**
* @var ?string $recipientEmail
*/
protected $recipientEmail;
/**
* @var ?string $recipientName
*/
protected $recipientName;
/**
* @var ?string $recipientProvider
*/
protected $recipientProvider;
/**
* @var ?string $recipientUserId
*/
protected $recipientUserId;
/**
* @var string $token
*/
protected $token;
/**
* @var string $userId
*/
protected $userId;
public function __construct() {
$this->addType('accepted', Types::BOOLEAN);
$this->addType('acceptedAt', Types::BIGINT);
$this->addType('createdAt', Types::BIGINT);
$this->addType('expiredAt', Types::BIGINT);
$this->addType('recipientEmail', Types::STRING);
$this->addType('recipientName', Types::STRING);
$this->addType('recipientProvider', Types::STRING);
$this->addType('recipientUserId', Types::STRING);
$this->addType('token', Types::STRING);
$this->addType('userId', Types::STRING);
}
}
@@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationAPI\Db;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
/**
* @template-extends QBMapper<FederatedInvite>
*/
class FederatedInviteMapper extends QBMapper {
public const TABLE_NAME = 'federated_invites';
public function __construct(IDBConnection $db) {
parent::__construct($db, self::TABLE_NAME);
}
public function findByToken(string $token): ?FederatedInvite {
/** @var IQueryBuilder $qb */
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('federated_invites')
->where($qb->expr()->eq('token', $qb->createNamedParameter($token)));
return $this->findEntity($qb);
}
}
@@ -0,0 +1,24 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\CloudFederationAPI\Events;
use OCA\CloudFederationAPI\Db\FederatedInvite;
use OCP\EventDispatcher\Event;
class FederatedInviteAcceptedEvent extends Event {
public function __construct(
private FederatedInvite $invitation,
) {
parent::__construct();
}
public function getInvitation(): FederatedInvite {
return $this->invitation;
}
}
@@ -0,0 +1,92 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationAPI\Migration;
use Closure;
use OCP\DB\ISchemaWrapper;
use OCP\DB\Types;
use OCP\Migration\IOutput;
use OCP\Migration\SimpleMigrationStep;
class Version1016Date202502262004 extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
* @param array $options
* @return null|ISchemaWrapper
*/
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
/** @var ISchemaWrapper $schema */
$schema = $schemaClosure();
$table_name = 'federated_invites';
if (!$schema->hasTable($table_name)) {
$table = $schema->createTable($table_name);
$table->addColumn('id', Types::BIGINT, [
'autoincrement' => true,
'notnull' => true,
'length' => 11,
'unsigned' => true,
]);
$table->addColumn('user_id', Types::STRING, [
'notnull' => true,
'length' => 64,
]);
// https://saturncloud.io/blog/what-is-the-maximum-length-of-a-url-in-different-browsers/#maximum-url-length-in-different-browsers
// We use the least common denominator, the minimum length supported by browsers
$table->addColumn('recipient_provider', Types::STRING, [
'notnull' => false,
'length' => 2083,
]);
$table->addColumn('recipient_user_id', Types::STRING, [
'notnull' => false,
'length' => 1024,
]);
$table->addColumn('recipient_name', Types::STRING, [
'notnull' => false,
'length' => 1024,
]);
// https://www.directedignorance.com/blog/maximum-length-of-email-address
$table->addColumn('recipient_email', Types::STRING, [
'notnull' => false,
'length' => 320,
]);
$table->addColumn('token', Types::STRING, [
'notnull' => true,
'length' => 60,
]);
$table->addColumn('accepted', Types::BOOLEAN, [
'notnull' => false,
'default' => false
]);
$table->addColumn('created_at', Types::BIGINT, [
'notnull' => true,
]);
$table->addColumn('expired_at', Types::BIGINT, [
'notnull' => false,
]);
$table->addColumn('accepted_at', Types::BIGINT, [
'notnull' => false,
]);
$table->setPrimaryKey(['id']);
return $schema;
}
return null;
}
}
+193 -1
View File
@@ -46,8 +46,10 @@
"apiVersion",
"enabled",
"endPoint",
"provider",
"resourceTypes",
"version"
"version",
"capabilities"
],
"properties": {
"apiVersion": {
@@ -77,6 +79,9 @@
}
}
},
"provider": {
"type": "string"
},
"resourceTypes": {
"type": "array",
"items": {
@@ -107,6 +112,9 @@
},
"version": {
"type": "string"
},
"capabilities": {
"type": "object"
}
}
}
@@ -396,6 +404,190 @@
}
}
}
},
"/index.php/ocm/invite-accepted": {
"post": {
"operationId": "request_handler-invite-accepted",
"summary": "Inform the sender that an invitation was accepted to start sharing",
"description": "Inform about an accepted invitation so the user on the sender provider's side can initiate the OCM share creation. To protect the identity of the parties, for shares created following an OCM invitation, the user id MAY be hashed, and recipients implementing the OCM invitation workflow MAY refuse to process shares coming from unknown parties.\nNote: Not implementing 404 Invitation token does not exist, instead using 400 spec link: https://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1invite-accepted/post",
"tags": [
"request_handler"
],
"security": [
{},
{
"bearer_auth": []
},
{
"basic_auth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"recipientProvider",
"token",
"userId",
"email",
"name"
],
"properties": {
"recipientProvider": {
"type": "string",
"description": "The address of the recipent's provider"
},
"token": {
"type": "string",
"description": "The token used for the invitation"
},
"userId": {
"type": "string",
"description": "The userId of the recipient at the recipient's provider"
},
"email": {
"type": "string",
"description": "The email address of the recipient"
},
"name": {
"type": "string",
"description": "The display name of the recipient"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Invitation accepted",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"nullable": true
},
"error": {
"type": "boolean",
"enum": [
true
]
},
"message": {
"type": "string"
},
"name": {
"type": "string"
},
"userID": {
"type": "string"
}
}
}
}
}
},
"403": {
"description": "Invitation token does not exist",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"nullable": true
},
"error": {
"type": "boolean",
"enum": [
true
]
},
"message": {
"type": "string"
},
"name": {
"type": "string"
},
"userID": {
"type": "string"
}
}
}
}
}
},
"400": {
"description": "Invalid token",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"nullable": true
},
"error": {
"type": "boolean",
"enum": [
true
]
},
"message": {
"type": "string"
},
"name": {
"type": "string"
},
"userID": {
"type": "string"
}
}
}
}
}
},
"409": {
"description": "User is already known by the OCM provider",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"nullable": true
},
"error": {
"type": "boolean",
"enum": [
true
]
},
"message": {
"type": "string"
},
"name": {
"type": "string"
},
"userID": {
"type": "string"
}
}
}
}
}
}
}
}
}
},
"tags": [
@@ -0,0 +1,146 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\CloudFederationApi\Tests;
use NCU\Security\Signature\ISignatureManager;
use OC\OCM\OCMSignatoryManager;
use OCA\CloudFederationAPI\Config;
use OCA\CloudFederationAPI\Controller\RequestHandlerController;
use OCA\CloudFederationAPI\Db\FederatedInvite;
use OCA\CloudFederationAPI\Db\FederatedInviteMapper;
use OCA\FederatedFileSharing\AddressHandler;
use OCA\Federation\TrustedServers;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudFederationFactory;
use OCP\Federation\ICloudFederationProviderManager;
use OCP\Federation\ICloudIdManager;
use OCP\IAppConfig;
use OCP\IGroupManager;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class RequestHandlerControllerTest extends TestCase {
private IRequest&MockObject $request;
private LoggerInterface&MockObject $logger;
private IUserManager&MockObject $userManager;
private IGroupManager&MockObject $groupManager;
private IURLGenerator&MockObject $urlGenerator;
private ICloudFederationProviderManager&MockObject $cloudFederationProviderManager;
private Config&MockObject $config;
private IEventDispatcher&MockObject $eventDispatcher;
private FederatedInviteMapper&MockObject $federatedInviteMapper;
private AddressHandler&MockObject $addressHandler;
private IAppConfig&MockObject $appConfig;
private ICloudFederationFactory&MockObject $cloudFederationFactory;
private ICloudIdManager&MockObject $cloudIdManager;
private ISignatureManager&MockObject $signatureManager;
private OCMSignatoryManager&MockObject $signatoryManager;
private TrustedServers&MockObject $trustedServers;
private ITimeFactory&MockObject $timeFactory;
private RequestHandlerController $requestHandlerController;
protected function setUp(): void {
parent::setUp();
$this->request = $this->createMock(IRequest::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->userManager = $this->createMock(IUserManager::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->cloudFederationProviderManager = $this->createMock(ICloudFederationProviderManager::class);
$this->config = $this->createMock(Config::class);
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
$this->federatedInviteMapper = $this->createMock(FederatedInviteMapper::class);
$this->addressHandler = $this->createMock(AddressHandler::class);
$this->appConfig = $this->createMock(IAppConfig::class);
$this->cloudFederationFactory = $this->createMock(ICloudFederationFactory::class);
$this->cloudIdManager = $this->createMock(ICloudIdManager::class);
$this->signatureManager = $this->createMock(ISignatureManager::class);
$this->signatoryManager = $this->createMock(OCMSignatoryManager::class);
$this->trustedServers = $this->createMock(TrustedServers::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->requestHandlerController = new RequestHandlerController(
'cloud_federation_api',
$this->request,
$this->logger,
$this->userManager,
$this->groupManager,
$this->urlGenerator,
$this->cloudFederationProviderManager,
$this->config,
$this->eventDispatcher,
$this->federatedInviteMapper,
$this->addressHandler,
$this->appConfig,
$this->cloudFederationFactory,
$this->cloudIdManager,
$this->signatureManager,
$this->signatoryManager,
$this->trustedServers,
$this->timeFactory,
);
}
public function testInviteAccepted(): void {
$token = 'token';
$trusted_server = 'http://127.0.0.1';
$userId = 'userId';
$invite = new FederatedInvite();
$invite->setCreatedAt(1);
$invite->setUserId($userId);
$invite->setToken($token);
$this->trustedServers->expects(self::once())
->method('isTrustedServer')
->with($trusted_server)
->willReturn(true);
$this->federatedInviteMapper->expects(self::once())
->method('findByToken')
->with($token)
->willReturn($invite);
$this->federatedInviteMapper->expects(self::once())
->method('update')
->willReturnArgument(0);
$user = $this->createMock(IUser::class);
$user->method('getUID')
->willReturn($userId);
$user->method('getPrimaryEMailAddress')
->willReturn('email');
$user->method('getDisplayName')
->willReturn('displayName');
$this->userManager->expects(self::once())
->method('get')
->with($userId)
->willReturn($user);
$recipientProvider = $trusted_server;
$recipientId = 'remote';
$recipientEmail = 'remote@example.org';
$recipientName = 'Remote Remoteson';
$response = ['userID' => $userId, 'email' => 'email', 'name' => 'displayName'];
$json = new JSONResponse($response, Http::STATUS_OK);
$this->assertEquals($json, $this->requestHandlerController->inviteAccepted($recipientProvider, $token, $recipientId, $recipientEmail, $recipientName));
}
}
+1 -1
View File
@@ -10,7 +10,7 @@ OC.L10N.register(
"{author} commented on {file}" : "{author} a commenté sur {file}",
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
"Files" : "Fichiers",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné sur « {file} », dans un commentaire par un compte qui depuis a été supprimé",
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Edit comment" : "Modifier le commentaire",
+1 -1
View File
@@ -8,7 +8,7 @@
"{author} commented on {file}" : "{author} a commenté sur {file}",
"<strong>Comments</strong> for files" : "<strong>Commentaires</strong> sur les fichiers",
"Files" : "Fichiers",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné dans « {file} », dans un commentaire d'un compte qui a été supprimé depuis",
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Vous avez été mentionné sur « {file} », dans un commentaire par un compte qui depuis a été supprimé",
"{user} mentioned you in a comment on \"{file}\"" : "{user} vous a mentionné dans un commentaire sur « {file} »",
"Files app plugin to add comments to files" : "Plugin Fichiers app pour ajouter des commentaires aux fichiers",
"Edit comment" : "Modifier le commentaire",
+1 -1
View File
@@ -2,7 +2,7 @@ OC.L10N.register(
"contactsinteraction",
{
"Recently contacted" : "Contactados recentemente",
"Contacts Interaction" : "Interação de Contatos",
"Contacts Interaction" : "Interação de contatos",
"Manages interaction between accounts and contacts" : "Gerencia a interação entre contas e contatos",
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Colete dados sobre interações de contas e contatos e forneça um catálogo de endereços para os dados"
},
+1 -1
View File
@@ -1,6 +1,6 @@
{ "translations": {
"Recently contacted" : "Contactados recentemente",
"Contacts Interaction" : "Interação de Contatos",
"Contacts Interaction" : "Interação de contatos",
"Manages interaction between accounts and contacts" : "Gerencia a interação entre contas e contatos",
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Colete dados sobre interações de contas e contatos e forneça um catálogo de endereços para os dados"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
-1
View File
@@ -74,7 +74,6 @@
<settings>
<admin>OCA\DAV\Settings\CalDAVSettings</admin>
<admin>OCA\DAV\Settings\ExampleContentSettings</admin>
<personal>OCA\DAV\Settings\AvailabilitySettings</personal>
</settings>
-2
View File
@@ -11,8 +11,6 @@ return [
['name' => 'invitation_response#decline', 'url' => '/invitation/decline/{token}', 'verb' => 'GET'],
['name' => 'invitation_response#options', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'GET'],
['name' => 'invitation_response#processMoreOptionsResult', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'POST'],
['name' => 'example_content#setDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'PUT'],
['name' => 'example_content#setEnableDefaultContact', 'url' => '/api/defaultcontact/config', 'verb' => 'PUT'],
],
'ocs' => [
['name' => 'direct#getUrl', 'url' => '/api/v1/direct', 'verb' => 'POST'],
+1 -2
View File
@@ -61,8 +61,7 @@ $authPlugin = new \Sabre\DAV\Auth\Plugin($authBackend);
$bearerAuthPlugin = new BearerAuth(
Server::get(IUserSession::class),
Server::get(ISession::class),
Server::get(IRequest::class),
Server::get(IConfig::class),
Server::get(IRequest::class)
);
$authPlugin->addBackend($bearerAuthPlugin);
+1 -1
View File
@@ -77,7 +77,7 @@ $filesDropPlugin = new FilesDropPlugin();
// Define root url with /public.php/dav/files/TOKEN
/** @var string $baseuri defined in public.php */
preg_match('/(^files\/[a-z0-9-_]+)/i', substr($requestUri, strlen($baseuri)), $match);
preg_match('/(^files\/[a-z0-9-]+)/i', substr($requestUri, strlen($baseuri)), $match);
$baseuri = $baseuri . $match[0];
$server = $serverFactory->createServer($baseuri, $requestUri, $authPlugin, function (\Sabre\DAV\Server $server) use ($authBackend, $linkCheckPlugin, $filesDropPlugin) {
@@ -221,7 +221,6 @@ return array(
'OCA\\DAV\\Connector\\Sabre\\ZipFolderPlugin' => $baseDir . '/../lib/Connector/Sabre/ZipFolderPlugin.php',
'OCA\\DAV\\Controller\\BirthdayCalendarController' => $baseDir . '/../lib/Controller/BirthdayCalendarController.php',
'OCA\\DAV\\Controller\\DirectController' => $baseDir . '/../lib/Controller/DirectController.php',
'OCA\\DAV\\Controller\\ExampleContentController' => $baseDir . '/../lib/Controller/ExampleContentController.php',
'OCA\\DAV\\Controller\\InvitationResponseController' => $baseDir . '/../lib/Controller/InvitationResponseController.php',
'OCA\\DAV\\Controller\\OutOfOfficeController' => $baseDir . '/../lib/Controller/OutOfOfficeController.php',
'OCA\\DAV\\Controller\\UpcomingEventsController' => $baseDir . '/../lib/Controller/UpcomingEventsController.php',
@@ -356,11 +355,9 @@ return array(
'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php',
'OCA\\DAV\\ServerFactory' => $baseDir . '/../lib/ServerFactory.php',
'OCA\\DAV\\Service\\AbsenceService' => $baseDir . '/../lib/Service/AbsenceService.php',
'OCA\\DAV\\Service\\DefaultContactService' => $baseDir . '/../lib/Service/DefaultContactService.php',
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => $baseDir . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
'OCA\\DAV\\Settings\\AvailabilitySettings' => $baseDir . '/../lib/Settings/AvailabilitySettings.php',
'OCA\\DAV\\Settings\\CalDAVSettings' => $baseDir . '/../lib/Settings/CalDAVSettings.php',
'OCA\\DAV\\Settings\\ExampleContentSettings' => $baseDir . '/../lib/Settings/ExampleContentSettings.php',
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => $baseDir . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => $baseDir . '/../lib/SetupChecks/WebdavEndpoint.php',
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => $baseDir . '/../lib/Storage/PublicOwnerWrapper.php',
@@ -236,7 +236,6 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Connector\\Sabre\\ZipFolderPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ZipFolderPlugin.php',
'OCA\\DAV\\Controller\\BirthdayCalendarController' => __DIR__ . '/..' . '/../lib/Controller/BirthdayCalendarController.php',
'OCA\\DAV\\Controller\\DirectController' => __DIR__ . '/..' . '/../lib/Controller/DirectController.php',
'OCA\\DAV\\Controller\\ExampleContentController' => __DIR__ . '/..' . '/../lib/Controller/ExampleContentController.php',
'OCA\\DAV\\Controller\\InvitationResponseController' => __DIR__ . '/..' . '/../lib/Controller/InvitationResponseController.php',
'OCA\\DAV\\Controller\\OutOfOfficeController' => __DIR__ . '/..' . '/../lib/Controller/OutOfOfficeController.php',
'OCA\\DAV\\Controller\\UpcomingEventsController' => __DIR__ . '/..' . '/../lib/Controller/UpcomingEventsController.php',
@@ -371,11 +370,9 @@ class ComposerStaticInitDAV
'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php',
'OCA\\DAV\\ServerFactory' => __DIR__ . '/..' . '/../lib/ServerFactory.php',
'OCA\\DAV\\Service\\AbsenceService' => __DIR__ . '/..' . '/../lib/Service/AbsenceService.php',
'OCA\\DAV\\Service\\DefaultContactService' => __DIR__ . '/..' . '/../lib/Service/DefaultContactService.php',
'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => __DIR__ . '/..' . '/../lib/Settings/Admin/SystemAddressBookSettings.php',
'OCA\\DAV\\Settings\\AvailabilitySettings' => __DIR__ . '/..' . '/../lib/Settings/AvailabilitySettings.php',
'OCA\\DAV\\Settings\\CalDAVSettings' => __DIR__ . '/..' . '/../lib/Settings/CalDAVSettings.php',
'OCA\\DAV\\Settings\\ExampleContentSettings' => __DIR__ . '/..' . '/../lib/Settings/ExampleContentSettings.php',
'OCA\\DAV\\SetupChecks\\NeedsSystemAddressBookSync' => __DIR__ . '/..' . '/../lib/SetupChecks/NeedsSystemAddressBookSync.php',
'OCA\\DAV\\SetupChecks\\WebdavEndpoint' => __DIR__ . '/..' . '/../lib/SetupChecks/WebdavEndpoint.php',
'OCA\\DAV\\Storage\\PublicOwnerWrapper' => __DIR__ . '/..' . '/../lib/Storage/PublicOwnerWrapper.php',
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "أرسل إشعارات للتذكير إلى المشتركين بالتقويم كذلك",
"Reminders are always sent to organizers and attendees." : "إشعارات التذكير يتم إرسالها دائماً إلى مُنظّم أو مُنظّمي الحدث و المستهدفين بحضوره.",
"Enable notifications for events via push" : "تمكين الإشعارات حول الأحداث عن طريق أسلوب دفع الإشعارات Push",
"Cancel" : "إلغاء",
"Import" : "إستيراد",
"Error while saving settings" : "خطأ أثناء حفظ الإعدادات",
"Contact reset successfully" : "تمّت إعادة تعيين جهة الاتصال بنجاحٍ",
"Error while resetting contact" : "خطأ أثناء إعادة تعيين جهة الاتصال",
"Contact imported successfully" : "تمّ استيراد جهة الاتصال بنجاحٍ",
"Error while importing contact" : "خطأ أثناء استيراد جهة الاتصال",
"Example Content" : "نموذج للمحتوى",
"Set example content to be created on new user first login." : "عيِّن نموذجاً للمحتوى ليتم إنشاؤه عند تسجيل المستخدِم دخوله لأول مرةٍ.",
"Import contact" : "استيراد جهة اتصال",
"Reset to default contact" : "إعادة التعيين لجهة اتصال تلقائية ",
"Import contacts" : "استيراد جهات اتصال",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "استيراد ملف .cvf جديد سوف يؤدي إلى حذف جهات الاتصال التلقائية الحالية واستبدالها بالجديدة. هل ترغب في الاستمرار؟",
"There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
"Please contact the organizer directly." : "يرجى الاتصال بالمنظم مباشرةً",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "أرسل إشعارات للتذكير إلى المشتركين بالتقويم كذلك",
"Reminders are always sent to organizers and attendees." : "إشعارات التذكير يتم إرسالها دائماً إلى مُنظّم أو مُنظّمي الحدث و المستهدفين بحضوره.",
"Enable notifications for events via push" : "تمكين الإشعارات حول الأحداث عن طريق أسلوب دفع الإشعارات Push",
"Cancel" : "إلغاء",
"Import" : "إستيراد",
"Error while saving settings" : "خطأ أثناء حفظ الإعدادات",
"Contact reset successfully" : "تمّت إعادة تعيين جهة الاتصال بنجاحٍ",
"Error while resetting contact" : "خطأ أثناء إعادة تعيين جهة الاتصال",
"Contact imported successfully" : "تمّ استيراد جهة الاتصال بنجاحٍ",
"Error while importing contact" : "خطأ أثناء استيراد جهة الاتصال",
"Example Content" : "نموذج للمحتوى",
"Set example content to be created on new user first login." : "عيِّن نموذجاً للمحتوى ليتم إنشاؤه عند تسجيل المستخدِم دخوله لأول مرةٍ.",
"Import contact" : "استيراد جهة اتصال",
"Reset to default contact" : "إعادة التعيين لجهة اتصال تلقائية ",
"Import contacts" : "استيراد جهات اتصال",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "استيراد ملف .cvf جديد سوف يؤدي إلى حذف جهات الاتصال التلقائية الحالية واستبدالها بالجديدة. هل ترغب في الاستمرار؟",
"There was an error updating your attendance status." : "حدث خطأ في تحديث حالة حضورك.",
"Please contact the organizer directly." : "يرجى الاتصال بالمنظم مباشرةً",
"Are you accepting the invitation?" : "هل تقبل الدعوة؟",
-3
View File
@@ -211,9 +211,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Unvia tamién avisos de recordatoriu pa les persones coles que se compartiere'l calendariu",
"Reminders are always sent to organizers and attendees." : "Los recordatorios únviense siempres a organizadores y asistentes",
"Enable notifications for events via push" : "Acriva los avisos automáticos pa los eventos",
"Cancel" : "Encaboxar",
"Import" : "Importa",
"Error while saving settings" : "Hebo un error mentanto se guardaba la configuración",
"There was an error updating your attendance status." : "Hebo un error al anovar l'estáu de l'asistencia.",
"Please contact the organizer directly." : "Ponte en contautu direutamente cola organización.",
"Are you accepting the invitation?" : "¿Aceptes la invitación?",
-3
View File
@@ -209,9 +209,6 @@
"Send reminder notifications to calendar sharees as well" : "Unvia tamién avisos de recordatoriu pa les persones coles que se compartiere'l calendariu",
"Reminders are always sent to organizers and attendees." : "Los recordatorios únviense siempres a organizadores y asistentes",
"Enable notifications for events via push" : "Acriva los avisos automáticos pa los eventos",
"Cancel" : "Encaboxar",
"Import" : "Importa",
"Error while saving settings" : "Hebo un error mentanto se guardaba la configuración",
"There was an error updating your attendance status." : "Hebo un error al anovar l'estáu de l'asistencia.",
"Please contact the organizer directly." : "Ponte en contautu direutamente cola organización.",
"Are you accepting the invitation?" : "¿Aceptes la invitación?",
-3
View File
@@ -192,9 +192,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Изпращане на известия за напомняния и до споделящите календар",
"Reminders are always sent to organizers and attendees." : "Напомнянията винаги се изпращат до организаторите и присъстващите.",
"Enable notifications for events via push" : "Активиране на известията за събития чрез push",
"Cancel" : "Отказ",
"Import" : "Импортиране /внасяне/",
"Error while saving settings" : "Грешка при запазване на настройките",
"There was an error updating your attendance status." : "Възникна грешка при актуализиране на състоянието на присъствието Ви.",
"Please contact the organizer directly." : "Моля, свържете се директно с организатора.",
"Are you accepting the invitation?" : "Приемате ли поканата?",
-3
View File
@@ -190,9 +190,6 @@
"Send reminder notifications to calendar sharees as well" : "Изпращане на известия за напомняния и до споделящите календар",
"Reminders are always sent to organizers and attendees." : "Напомнянията винаги се изпращат до организаторите и присъстващите.",
"Enable notifications for events via push" : "Активиране на известията за събития чрез push",
"Cancel" : "Отказ",
"Import" : "Импортиране /внасяне/",
"Error while saving settings" : "Грешка при запазване на настройките",
"There was an error updating your attendance status." : "Възникна грешка при актуализиране на състоянието на присъствието Ви.",
"Please contact the organizer directly." : "Моля, свържете се директно с организатора.",
"Are you accepting the invitation?" : "Приемате ли поканата?",
-3
View File
@@ -306,9 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Envia també notificacions de recordatori als usuaris amb qui s'ha compartit el calendari",
"Reminders are always sent to organizers and attendees." : "Sempre s'envien recordatoris als organitzadors i als assistents.",
"Enable notifications for events via push" : "Habilita les notificacions automàtiques per als esdeveniments",
"Cancel" : "Cancel·la",
"Import" : "Importa",
"Error while saving settings" : "S'ha produït un error en desar els paràmetres",
"There was an error updating your attendance status." : "S'ha produït un error en actualitzar l'estat d'assistència.",
"Please contact the organizer directly." : "Contacteu amb l'organització directament.",
"Are you accepting the invitation?" : "Accepteu la invitació?",
-3
View File
@@ -304,9 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Envia també notificacions de recordatori als usuaris amb qui s'ha compartit el calendari",
"Reminders are always sent to organizers and attendees." : "Sempre s'envien recordatoris als organitzadors i als assistents.",
"Enable notifications for events via push" : "Habilita les notificacions automàtiques per als esdeveniments",
"Cancel" : "Cancel·la",
"Import" : "Importa",
"Error while saving settings" : "S'ha produït un error en desar els paràmetres",
"There was an error updating your attendance status." : "S'ha produït un error en actualitzar l'estat d'assistència.",
"Please contact the organizer directly." : "Contacteu amb l'organització directament.",
"Are you accepting the invitation?" : "Accepteu la invitació?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Poslat připomínky také těm, kteří mají tento sdílený kalendář připojený",
"Reminders are always sent to organizers and attendees." : "Připomínky jsou vždy poslány organizátorům a účastníkům.",
"Enable notifications for events via push" : "Upozorňovat na události prostřednictvím služby push",
"Cancel" : "Storno",
"Import" : "Naimportovat",
"Error while saving settings" : "Chyba při ukládání nastavení",
"Contact reset successfully" : "Kontakt úspěšně resetován",
"Error while resetting contact" : "Chyba při resetování kontaktu",
"Contact imported successfully" : "Kontakt úspěšně naimportován",
"Error while importing contact" : "Chyba při importování kontaktu",
"Example Content" : "Obsah pro ukázku",
"Set example content to be created on new user first login." : "Nastavit obsah pro ukázku, který vytvořit při prvním přihlášení nového uživatele.",
"Import contact" : "Importovat kontakt",
"Reset to default contact" : "Vrátit na výchozí kontakt",
"Import contacts" : "Importovat kontakty",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Naimportování nového .vcf souboru smaže stávající výchozí kontakt a nahradí ho novým. Chcete pokračovat?",
"There was an error updating your attendance status." : "Vyskytla se chyba při aktualizaci vašeho stavu účasti.",
"Please contact the organizer directly." : "Kontaktujte organizátora přímo.",
"Are you accepting the invitation?" : "Přijímáte pozvání?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Poslat připomínky také těm, kteří mají tento sdílený kalendář připojený",
"Reminders are always sent to organizers and attendees." : "Připomínky jsou vždy poslány organizátorům a účastníkům.",
"Enable notifications for events via push" : "Upozorňovat na události prostřednictvím služby push",
"Cancel" : "Storno",
"Import" : "Naimportovat",
"Error while saving settings" : "Chyba při ukládání nastavení",
"Contact reset successfully" : "Kontakt úspěšně resetován",
"Error while resetting contact" : "Chyba při resetování kontaktu",
"Contact imported successfully" : "Kontakt úspěšně naimportován",
"Error while importing contact" : "Chyba při importování kontaktu",
"Example Content" : "Obsah pro ukázku",
"Set example content to be created on new user first login." : "Nastavit obsah pro ukázku, který vytvořit při prvním přihlášení nového uživatele.",
"Import contact" : "Importovat kontakt",
"Reset to default contact" : "Vrátit na výchozí kontakt",
"Import contacts" : "Importovat kontakty",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Naimportování nového .vcf souboru smaže stávající výchozí kontakt a nahradí ho novým. Chcete pokračovat?",
"There was an error updating your attendance status." : "Vyskytla se chyba při aktualizaci vašeho stavu účasti.",
"Please contact the organizer directly." : "Kontaktujte organizátora přímo.",
"Are you accepting the invitation?" : "Přijímáte pozvání?",
-3
View File
@@ -303,9 +303,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Send også påmindelsesmeddelelser til kalenderdelinger",
"Reminders are always sent to organizers and attendees." : "Påmindelser sendes altid til arrangører og deltagere.",
"Enable notifications for events via push" : "Aktiver notifikationer for begivenheder via push",
"Cancel" : "Annuller",
"Import" : "Importer",
"Error while saving settings" : "Der opstod en fejl under lagring af indstillinger",
"There was an error updating your attendance status." : "Der opstod en fejl under opdatering af din fremmødestatus.",
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
-3
View File
@@ -301,9 +301,6 @@
"Send reminder notifications to calendar sharees as well" : "Send også påmindelsesmeddelelser til kalenderdelinger",
"Reminders are always sent to organizers and attendees." : "Påmindelser sendes altid til arrangører og deltagere.",
"Enable notifications for events via push" : "Aktiver notifikationer for begivenheder via push",
"Cancel" : "Annuller",
"Import" : "Importer",
"Error while saving settings" : "Der opstod en fejl under lagring af indstillinger",
"There was an error updating your attendance status." : "Der opstod en fejl under opdatering af din fremmødestatus.",
"Please contact the organizer directly." : "Kontakt venligst arrangøren direkte.",
"Are you accepting the invitation?" : "Accepter du invitationen?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die freigegebenen Kalender senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
"Cancel" : "Abbrechen",
"Import" : "Importieren",
"Error while saving settings" : "Fehler beim Speichern der Einstellungen",
"Contact reset successfully" : "Kontakt erfolgreich zurückgesetzt",
"Error while resetting contact" : "Fehler beim Zurücksetzen des Kontakts",
"Contact imported successfully" : "Kontakt erfolgreich importiert",
"Error while importing contact" : "Fehler beim Import des Kontakts",
"Example Content" : "Beispielinhalt",
"Set example content to be created on new user first login." : "Beispielinhalte festlegen, die bei der ersten Anmeldung eines neuen Benutzers erstellt werden sollen.",
"Import contact" : "Kontakt importieren",
"Reset to default contact" : "Standardkontakt zurücksetzen",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren deines Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die freigegebenen Kalender senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
"Cancel" : "Abbrechen",
"Import" : "Importieren",
"Error while saving settings" : "Fehler beim Speichern der Einstellungen",
"Contact reset successfully" : "Kontakt erfolgreich zurückgesetzt",
"Error while resetting contact" : "Fehler beim Zurücksetzen des Kontakts",
"Contact imported successfully" : "Kontakt erfolgreich importiert",
"Error while importing contact" : "Fehler beim Import des Kontakts",
"Example Content" : "Beispielinhalt",
"Set example content to be created on new user first login." : "Beispielinhalte festlegen, die bei der ersten Anmeldung eines neuen Benutzers erstellt werden sollen.",
"Import contact" : "Kontakt importieren",
"Reset to default contact" : "Standardkontakt zurücksetzen",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren deines Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die Kalenderfreigaben senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
"Cancel" : "Abbrechen",
"Import" : "Importieren",
"Error while saving settings" : "Fehler beim Speichern der Einstellungen",
"Contact reset successfully" : "Kontakt zurückgesetzt",
"Error while resetting contact" : "Fehler beim Zurücksetzen des Kontakts",
"Contact imported successfully" : "Kontakt importiert",
"Error while importing contact" : "Fehler beim Import des Kontakts",
"Example Content" : "Beispielinhalt",
"Set example content to be created on new user first login." : "Beispielinhalte festlegen, die bei der ersten Anmeldung eines neuen Benutzers erstellt werden sollen.",
"Import contact" : "Kontakt importieren",
"Reset to default contact" : "Standardkontakt zurücksetzen",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren Ihres Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die Kalenderfreigaben senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
"Cancel" : "Abbrechen",
"Import" : "Importieren",
"Error while saving settings" : "Fehler beim Speichern der Einstellungen",
"Contact reset successfully" : "Kontakt zurückgesetzt",
"Error while resetting contact" : "Fehler beim Zurücksetzen des Kontakts",
"Contact imported successfully" : "Kontakt importiert",
"Error while importing contact" : "Fehler beim Import des Kontakts",
"Example Content" : "Beispielinhalt",
"Set example content to be created on new user first login." : "Beispielinhalte festlegen, die bei der ersten Anmeldung eines neuen Benutzers erstellt werden sollen.",
"Import contact" : "Kontakt importieren",
"Reset to default contact" : "Standardkontakt zurücksetzen",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren Ihres Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organisers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "Cancel",
"Import" : "Import",
"Error while saving settings" : "Error while saving settings",
"Contact reset successfully" : "Contact reset successfully",
"Error while resetting contact" : "Error while resetting contact",
"Contact imported successfully" : "Contact imported successfully",
"Error while importing contact" : "Error while importing contact",
"Example Content" : "Example Content",
"Set example content to be created on new user first login." : "Set example content to be created on new user first login.",
"Import contact" : "Import contact",
"Reset to default contact" : "Reset to default contact",
"Import contacts" : "Import contacts",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organiser directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organisers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "Cancel",
"Import" : "Import",
"Error while saving settings" : "Error while saving settings",
"Contact reset successfully" : "Contact reset successfully",
"Error while resetting contact" : "Error while resetting contact",
"Contact imported successfully" : "Contact imported successfully",
"Error while importing contact" : "Error while importing contact",
"Example Content" : "Example Content",
"Set example content to be created on new user first login." : "Set example content to be created on new user first login.",
"Import contact" : "Import contact",
"Reset to default contact" : "Reset to default contact",
"Import contacts" : "Import contacts",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organiser directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-3
View File
@@ -301,9 +301,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Activar notificaciones push para eventos",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar los ajustes",
"There was an error updating your attendance status." : "Ha habido un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
-3
View File
@@ -299,9 +299,6 @@
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Activar notificaciones push para eventos",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar los ajustes",
"There was an error updating your attendance status." : "Ha habido un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente con el organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
-3
View File
@@ -195,9 +195,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorios a los asistentes del calendario también",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Habilitar notificaciones para eventos mediante push",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar la configuración.",
"There was an error updating your attendance status." : "Hubo un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente al organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
-3
View File
@@ -193,9 +193,6 @@
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorios a los asistentes del calendario también",
"Reminders are always sent to organizers and attendees." : "Los recordatorios siempre se envían a los organizadores y asistentes.",
"Enable notifications for events via push" : "Habilitar notificaciones para eventos mediante push",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar la configuración.",
"There was an error updating your attendance status." : "Hubo un error al actualizar tu estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacta directamente al organizador.",
"Are you accepting the invitation?" : "¿Aceptas la invitación?",
-3
View File
@@ -236,9 +236,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios se envían siempre a los organizadores y asistentes.",
"Enable notifications for events via push" : "Habilitar notificaciones para eventos mediante push",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar la configuración",
"There was an error updating your attendance status." : "Ocurrió un error al actualizar su estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacte al organizador directamente.",
"Are you accepting the invitation?" : "¿Acepta la invitación?",
-3
View File
@@ -234,9 +234,6 @@
"Send reminder notifications to calendar sharees as well" : "Enviar recordatorio también a los usuarios con los que se comparte el calendario",
"Reminders are always sent to organizers and attendees." : "Los recordatorios se envían siempre a los organizadores y asistentes.",
"Enable notifications for events via push" : "Habilitar notificaciones para eventos mediante push",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Error al guardar la configuración",
"There was an error updating your attendance status." : "Ocurrió un error al actualizar su estado de asistencia.",
"Please contact the organizer directly." : "Por favor, contacte al organizador directamente.",
"Are you accepting the invitation?" : "¿Acepta la invitación?",
-3
View File
@@ -301,9 +301,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Bidali gogorarazpen jakinarazpenak egutegi partekatzea dutenei ere",
"Reminders are always sent to organizers and attendees." : "Gogorarazpenak beti bidaltzen zaizkie antolatzaileei eta parte-hartzaileei.",
"Enable notifications for events via push" : "Gaitu push bidezko jakinarazpenak gertaerentzat",
"Cancel" : "Utzi",
"Import" : "Inportatu",
"Error while saving settings" : "Errorea ezarpenak gordetzean",
"There was an error updating your attendance status." : "Errore bat gertatu da zure parte-hartze egoera eguneratzerakoan.",
"Please contact the organizer directly." : "Mesedez jarri harremanetan antolatzailearekin zuzenean.",
"Are you accepting the invitation?" : "Gonbidapena onartzen duzu?",
-3
View File
@@ -299,9 +299,6 @@
"Send reminder notifications to calendar sharees as well" : "Bidali gogorarazpen jakinarazpenak egutegi partekatzea dutenei ere",
"Reminders are always sent to organizers and attendees." : "Gogorarazpenak beti bidaltzen zaizkie antolatzaileei eta parte-hartzaileei.",
"Enable notifications for events via push" : "Gaitu push bidezko jakinarazpenak gertaerentzat",
"Cancel" : "Utzi",
"Import" : "Inportatu",
"Error while saving settings" : "Errorea ezarpenak gordetzean",
"There was an error updating your attendance status." : "Errore bat gertatu da zure parte-hartze egoera eguneratzerakoan.",
"Please contact the organizer directly." : "Mesedez jarri harremanetan antolatzailearekin zuzenean.",
"Are you accepting the invitation?" : "Gonbidapena onartzen duzu?",
-3
View File
@@ -193,9 +193,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "ردکردن",
"Import" : "وارد کردن",
"Error while saving settings" : "Error while saving settings",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-3
View File
@@ -191,9 +191,6 @@
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "ردکردن",
"Import" : "وارد کردن",
"Error while saving settings" : "Error while saving settings",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-3
View File
@@ -272,9 +272,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Envoyez également des notifications de rappel aux personnes partageant le calendrier",
"Reminders are always sent to organizers and attendees." : "Des rappels sont toujours envoyés aux organisateurs et aux participants.",
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
"Cancel" : "Annuler",
"Import" : "Importation",
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
-3
View File
@@ -270,9 +270,6 @@
"Send reminder notifications to calendar sharees as well" : "Envoyez également des notifications de rappel aux personnes partageant le calendrier",
"Reminders are always sent to organizers and attendees." : "Des rappels sont toujours envoyés aux organisateurs et aux participants.",
"Enable notifications for events via push" : "Activer les notifications push pour les évènements",
"Cancel" : "Annuler",
"Import" : "Importation",
"Error while saving settings" : "Erreur lors de l'enregistrement des paramètres",
"There was an error updating your attendance status." : "Une erreur s'est produite lors de la mise à jour de votre statut de présence.",
"Please contact the organizer directly." : "Merci de contacter l'organisateur directement.",
"Are you accepting the invitation?" : "Acceptez-vous l'invitation ?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Seol fógraí meabhrúcháin chuig scaireanna féilire freisin",
"Reminders are always sent to organizers and attendees." : "Seoltar meabhrúcháin chuig na heagraithe agus an lucht freastail i gcónaí.",
"Enable notifications for events via push" : "Cumasaigh fógraí le haghaidh imeachtaí trí bhrú",
"Cancel" : "Cealaigh",
"Import" : "Iompórtáil",
"Error while saving settings" : "Earráid agus na socruithe á sábháil",
"Contact reset successfully" : "D'éirigh le hathshocrú teagmhála",
"Error while resetting contact" : "Earráid agus an teagmhálaí á athshocrú",
"Contact imported successfully" : "D'éirigh le hiompórtáil an teagmhálaí",
"Error while importing contact" : "Earráid agus an teagmhálaí á iompórtáil",
"Example Content" : "Ábhar Samplach",
"Set example content to be created on new user first login." : "Socraigh ábhar samplach le cruthú ar an gcéad logáil isteach úsáideora nua.",
"Import contact" : "Iompórtáil teagmhála",
"Reset to default contact" : "Athshocraigh go teagmhálaí réamhshocraithe",
"Import contacts" : "Teagmhálaithe a allmhairiú",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Má dhéantar comhad .vcf nua a iompórtáil, scriosfar an teagmhálaí réamhshocraithe atá ann cheana féin agus cuirfear an ceann nua ina ionad. Ar mhaith leat leanúint ar aghaidh?",
"There was an error updating your attendance status." : "Tharla earráid agus do stádas freastail á nuashonrú.",
"Please contact the organizer directly." : "Téigh i dteagmháil leis an eagraí go díreach le do thoil.",
"Are you accepting the invitation?" : "An bhfuil tú ag glacadh leis an gcuireadh?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "Seol fógraí meabhrúcháin chuig scaireanna féilire freisin",
"Reminders are always sent to organizers and attendees." : "Seoltar meabhrúcháin chuig na heagraithe agus an lucht freastail i gcónaí.",
"Enable notifications for events via push" : "Cumasaigh fógraí le haghaidh imeachtaí trí bhrú",
"Cancel" : "Cealaigh",
"Import" : "Iompórtáil",
"Error while saving settings" : "Earráid agus na socruithe á sábháil",
"Contact reset successfully" : "D'éirigh le hathshocrú teagmhála",
"Error while resetting contact" : "Earráid agus an teagmhálaí á athshocrú",
"Contact imported successfully" : "D'éirigh le hiompórtáil an teagmhálaí",
"Error while importing contact" : "Earráid agus an teagmhálaí á iompórtáil",
"Example Content" : "Ábhar Samplach",
"Set example content to be created on new user first login." : "Socraigh ábhar samplach le cruthú ar an gcéad logáil isteach úsáideora nua.",
"Import contact" : "Iompórtáil teagmhála",
"Reset to default contact" : "Athshocraigh go teagmhálaí réamhshocraithe",
"Import contacts" : "Teagmhálaithe a allmhairiú",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Má dhéantar comhad .vcf nua a iompórtáil, scriosfar an teagmhálaí réamhshocraithe atá ann cheana féin agus cuirfear an ceann nua ina ionad. Ar mhaith leat leanúint ar aghaidh?",
"There was an error updating your attendance status." : "Tharla earráid agus do stádas freastail á nuashonrú.",
"Please contact the organizer directly." : "Téigh i dteagmháil leis an eagraí go díreach le do thoil.",
"Are you accepting the invitation?" : "An bhfuil tú ag glacadh leis an gcuireadh?",
-3
View File
@@ -303,9 +303,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
-3
View File
@@ -301,9 +301,6 @@
"Send reminder notifications to calendar sharees as well" : "Enviar notificacións de lembrete tamén aos que comparten calendario",
"Reminders are always sent to organizers and attendees." : "Os lembretes envíanselle sempre aos organizadores e aos asistentes.",
"Enable notifications for events via push" : "Activar o envío de notificacións emerxentes para eventos",
"Cancel" : "Cancelar",
"Import" : "Importar",
"Error while saving settings" : "Produciuse un erro ao gardar os axustes",
"There was an error updating your attendance status." : "Produciuse un erro ao actualizar o seu estado de asistencia.",
"Please contact the organizer directly." : "Contacte directamente co organizador.",
"Are you accepting the invitation?" : "Acepta Vde. o convite?",
-3
View File
@@ -260,9 +260,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Emlékeztető értesítések küldése azoknak is, akikkel a naptár meg van osztva",
"Reminders are always sent to organizers and attendees." : "Az értesítések mindig a szervezőknek és a résztvevőknek lesznek elküldve.",
"Enable notifications for events via push" : "Leküldéses értesítések engedélyezése az eseményekhez",
"Cancel" : "Mégse",
"Import" : "Importálás",
"Error while saving settings" : "Hiba a beállítások mentése során",
"There was an error updating your attendance status." : "Hiba történt a részvételi állapotának frissítése során.",
"Please contact the organizer directly." : "Vegye fel a kapcsolatot közvetlenül a szervezővel.",
"Are you accepting the invitation?" : "Elfogadja az meghívást?",
-3
View File
@@ -258,9 +258,6 @@
"Send reminder notifications to calendar sharees as well" : "Emlékeztető értesítések küldése azoknak is, akikkel a naptár meg van osztva",
"Reminders are always sent to organizers and attendees." : "Az értesítések mindig a szervezőknek és a résztvevőknek lesznek elküldve.",
"Enable notifications for events via push" : "Leküldéses értesítések engedélyezése az eseményekhez",
"Cancel" : "Mégse",
"Import" : "Importálás",
"Error while saving settings" : "Hiba a beállítások mentése során",
"There was an error updating your attendance status." : "Hiba történt a részvételi állapotának frissítése során.",
"Please contact the organizer directly." : "Vegye fel a kapcsolatot közvetlenül a szervezővel.",
"Are you accepting the invitation?" : "Elfogadja az meghívást?",
-3
View File
@@ -303,9 +303,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Senda einnig tilkynningar til þeirra sem deila dagatalinu",
"Reminders are always sent to organizers and attendees." : "Áminningar eru alltaf sendar til skipuleggjenda og þátttakenda.",
"Enable notifications for events via push" : "Senda tilkynningar fyrir atburði sem ýtitilkynningar",
"Cancel" : "Hætta við",
"Import" : "Flytja inn",
"Error while saving settings" : "Villa við að vista stillingar",
"There was an error updating your attendance status." : "Það kom upp villa við að uppfæra mætingarstöðu þína.",
"Please contact the organizer directly." : "Hafðu samband beint við skipuleggjendurna.",
"Are you accepting the invitation?" : "Ætlar þú að samþykkja boðið?",
-3
View File
@@ -301,9 +301,6 @@
"Send reminder notifications to calendar sharees as well" : "Senda einnig tilkynningar til þeirra sem deila dagatalinu",
"Reminders are always sent to organizers and attendees." : "Áminningar eru alltaf sendar til skipuleggjenda og þátttakenda.",
"Enable notifications for events via push" : "Senda tilkynningar fyrir atburði sem ýtitilkynningar",
"Cancel" : "Hætta við",
"Import" : "Flytja inn",
"Error while saving settings" : "Villa við að vista stillingar",
"There was an error updating your attendance status." : "Það kom upp villa við að uppfæra mætingarstöðu þína.",
"Please contact the organizer directly." : "Hafðu samband beint við skipuleggjendurna.",
"Are you accepting the invitation?" : "Ætlar þú að samþykkja boðið?",
-3
View File
@@ -223,9 +223,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Cancel" : "Annulla",
"Import" : "Importa",
"Error while saving settings" : "Errore durante il salvataggio delle impostazioni",
"There was an error updating your attendance status." : "Si è verificato un errore durante l'aggiornamento dello stato della tua partecipazione.",
"Please contact the organizer directly." : "Contatta direttamente l'amministratore.",
"Are you accepting the invitation?" : "Accetti l'invito?",
-3
View File
@@ -221,9 +221,6 @@
"Send reminder notifications to calendar sharees as well" : "Invia notifiche di promemoria anche ai partecipanti al calendario",
"Reminders are always sent to organizers and attendees." : "I promemoria vengono sempre inviati agli organizzatori e ai partecipanti.",
"Enable notifications for events via push" : "Abilita notifiche per eventi tramite push",
"Cancel" : "Annulla",
"Import" : "Importa",
"Error while saving settings" : "Errore durante il salvataggio delle impostazioni",
"There was an error updating your attendance status." : "Si è verificato un errore durante l'aggiornamento dello stato della tua partecipazione.",
"Please contact the organizer directly." : "Contatta direttamente l'amministratore.",
"Are you accepting the invitation?" : "Accetti l'invito?",
-13
View File
@@ -306,19 +306,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "カレンダー共有にもリマインダー通知を送信する",
"Reminders are always sent to organizers and attendees." : "リマインダーを常に作成者と出席者に送信します。",
"Enable notifications for events via push" : "イベントのプッシュ通知を有効にする",
"Cancel" : "キャンセル",
"Import" : "インポート",
"Error while saving settings" : "設定の保存中にエラーが発生",
"Contact reset successfully" : "連絡先のリセットが正常に完了しました",
"Error while resetting contact" : "連絡先のリセット中にエラーが発生しました",
"Contact imported successfully" : "連絡先のインポートが正常に完了しました",
"Error while importing contact" : "連絡先のインポート中にエラーが発生しました",
"Example Content" : "サンプルコンテンツ",
"Set example content to be created on new user first login." : "新規ユーザの初回ログイン時に作成されるサンプルコンテンツを設定します。",
"Import contact" : "連絡先のインポート",
"Reset to default contact" : "デフォルトの連絡先にリセットする",
"Import contacts" : "連絡先のインポート",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "新しい .vcf ファイルをインポートすると、既存のデフォルト連絡先が削除され、新しいものに置き換えられます。続行しますか?",
"There was an error updating your attendance status." : "出席状況の更新中にエラーが発生しました。",
"Please contact the organizer directly." : "主催者に直接お問い合わせください。",
"Are you accepting the invitation?" : "招待を受け入れていますか?",
-13
View File
@@ -304,19 +304,6 @@
"Send reminder notifications to calendar sharees as well" : "カレンダー共有にもリマインダー通知を送信する",
"Reminders are always sent to organizers and attendees." : "リマインダーを常に作成者と出席者に送信します。",
"Enable notifications for events via push" : "イベントのプッシュ通知を有効にする",
"Cancel" : "キャンセル",
"Import" : "インポート",
"Error while saving settings" : "設定の保存中にエラーが発生",
"Contact reset successfully" : "連絡先のリセットが正常に完了しました",
"Error while resetting contact" : "連絡先のリセット中にエラーが発生しました",
"Contact imported successfully" : "連絡先のインポートが正常に完了しました",
"Error while importing contact" : "連絡先のインポート中にエラーが発生しました",
"Example Content" : "サンプルコンテンツ",
"Set example content to be created on new user first login." : "新規ユーザの初回ログイン時に作成されるサンプルコンテンツを設定します。",
"Import contact" : "連絡先のインポート",
"Reset to default contact" : "デフォルトの連絡先にリセットする",
"Import contacts" : "連絡先のインポート",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "新しい .vcf ファイルをインポートすると、既存のデフォルト連絡先が削除され、新しいものに置き換えられます。続行しますか?",
"There was an error updating your attendance status." : "出席状況の更新中にエラーが発生しました。",
"Please contact the organizer directly." : "主催者に直接お問い合わせください。",
"Are you accepting the invitation?" : "招待を受け入れていますか?",
-3
View File
@@ -207,9 +207,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "Cancel",
"Import" : "Import",
"Error while saving settings" : "Error while saving settings",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-3
View File
@@ -205,9 +205,6 @@
"Send reminder notifications to calendar sharees as well" : "Send reminder notifications to calendar sharees as well",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Enable notifications for events via push",
"Cancel" : "Cancel",
"Import" : "Import",
"Error while saving settings" : "Error while saving settings",
"There was an error updating your attendance status." : "There was an error updating your attendance status.",
"Please contact the organizer directly." : "Please contact the organizer directly.",
"Are you accepting the invitation?" : "Are you accepting the invitation?",
-3
View File
@@ -208,9 +208,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "캘린더 공유자에게도 미리 알림 보내기",
"Reminders are always sent to organizers and attendees." : "미리 알림은 주최자와 참석자에게 항상 전송됩니다.",
"Enable notifications for events via push" : "일정에 대한 푸시 알림 활성화",
"Cancel" : "취소",
"Import" : "가져오기",
"Error while saving settings" : "설정 저장 중 오류 발생",
"There was an error updating your attendance status." : "참석 상태를 업데이트하는 중 오류가 발생했습니다.",
"Please contact the organizer directly." : "주최자에게 직접 연락하십시오.",
"Are you accepting the invitation?" : "초대를 수락하시겠습니까?",
-3
View File
@@ -206,9 +206,6 @@
"Send reminder notifications to calendar sharees as well" : "캘린더 공유자에게도 미리 알림 보내기",
"Reminders are always sent to organizers and attendees." : "미리 알림은 주최자와 참석자에게 항상 전송됩니다.",
"Enable notifications for events via push" : "일정에 대한 푸시 알림 활성화",
"Cancel" : "취소",
"Import" : "가져오기",
"Error while saving settings" : "설정 저장 중 오류 발생",
"There was an error updating your attendance status." : "참석 상태를 업데이트하는 중 오류가 발생했습니다.",
"Please contact the organizer directly." : "주최자에게 직접 연락하십시오.",
"Are you accepting the invitation?" : "초대를 수락하시겠습니까?",
-2
View File
@@ -197,8 +197,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Испратете известувања за потсетници и до споделувањата на календарот",
"Reminders are always sent to organizers and attendees." : "Секогаш се испраќаат потсетници до организаторите и до присутните.",
"Enable notifications for events via push" : "Овозможи известувања за настани преку push",
"Cancel" : "Откажи",
"Import" : "Увези",
"There was an error updating your attendance status." : "Настана грешка при ажурирање на вашето присуство.",
"Please contact the organizer directly." : "Контактирајте го организаторот директно.",
"Are you accepting the invitation?" : "Дали ја прифаќате поканата?",
-2
View File
@@ -195,8 +195,6 @@
"Send reminder notifications to calendar sharees as well" : "Испратете известувања за потсетници и до споделувањата на календарот",
"Reminders are always sent to organizers and attendees." : "Секогаш се испраќаат потсетници до организаторите и до присутните.",
"Enable notifications for events via push" : "Овозможи известувања за настани преку push",
"Cancel" : "Откажи",
"Import" : "Увези",
"There was an error updating your attendance status." : "Настана грешка при ажурирање на вашето присуство.",
"Please contact the organizer directly." : "Контактирајте го организаторот директно.",
"Are you accepting the invitation?" : "Дали ја прифаќате поканата?",
-3
View File
@@ -263,9 +263,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Send påminnelsesvarsler til kalenderdelinger også",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Aktiver varsler for hendelser via push",
"Cancel" : "Avbryt",
"Import" : "Importer",
"Error while saving settings" : "Feil ved lagring av innstillinger",
"There was an error updating your attendance status." : "Det oppsto en feil under oppdateringen av oppmøtestatusen din.",
"Please contact the organizer directly." : "Ta kontakt med arrangøren direkte.",
"Are you accepting the invitation?" : "Aksepterer du invitasjonen?",
-3
View File
@@ -261,9 +261,6 @@
"Send reminder notifications to calendar sharees as well" : "Send påminnelsesvarsler til kalenderdelinger også",
"Reminders are always sent to organizers and attendees." : "Reminders are always sent to organizers and attendees.",
"Enable notifications for events via push" : "Aktiver varsler for hendelser via push",
"Cancel" : "Avbryt",
"Import" : "Importer",
"Error while saving settings" : "Feil ved lagring av innstillinger",
"There was an error updating your attendance status." : "Det oppsto en feil under oppdateringen av oppmøtestatusen din.",
"Please contact the organizer directly." : "Ta kontakt med arrangøren direkte.",
"Are you accepting the invitation?" : "Aksepterer du invitasjonen?",
-3
View File
@@ -179,9 +179,6 @@ OC.L10N.register(
"Send notifications for events" : "Versturen meldingen voor afspraken",
"Notifications are sent via background jobs, so these must occur often enough." : "Meldingen worden via achtergrondtaken verstuurd, dus die moeten vaak genoeg plaatsvinden.",
"Enable notifications for events via push" : "Inschakelen push-melding voor afspraken",
"Cancel" : "Annuleren",
"Import" : "Import",
"Error while saving settings" : "Probleem tijdens het opslaan van instellingen",
"There was an error updating your attendance status." : "Er trad een fout op bij het bijwerken van je deelnamestatus.",
"Please contact the organizer directly." : "Neem rechtstreeks contact op met de organisator.",
"Are you accepting the invitation?" : "Neem je de uitnodiging aan?",
-3
View File
@@ -177,9 +177,6 @@
"Send notifications for events" : "Versturen meldingen voor afspraken",
"Notifications are sent via background jobs, so these must occur often enough." : "Meldingen worden via achtergrondtaken verstuurd, dus die moeten vaak genoeg plaatsvinden.",
"Enable notifications for events via push" : "Inschakelen push-melding voor afspraken",
"Cancel" : "Annuleren",
"Import" : "Import",
"Error while saving settings" : "Probleem tijdens het opslaan van instellingen",
"There was an error updating your attendance status." : "Er trad een fout op bij het bijwerken van je deelnamestatus.",
"Please contact the organizer directly." : "Neem rechtstreeks contact op met de organisator.",
"Are you accepting the invitation?" : "Neem je de uitnodiging aan?",
-3
View File
@@ -231,9 +231,6 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Wysyłaj przypomnienia również do udostępnionych kalendarzy",
"Reminders are always sent to organizers and attendees." : "Przypomnienia są zawsze wysyłane do organizatorów i uczestników.",
"Enable notifications for events via push" : "Włącz powiadomienia o zdarzeniach poprzez Push",
"Cancel" : "Anuluj",
"Import" : "Importuj",
"Error while saving settings" : "Błąd podczas zapisywania ustawień",
"There was an error updating your attendance status." : "Wystąpił błąd zmiany stanu uczestnictwa",
"Please contact the organizer directly." : "Skontaktuj się bezpośrednio z orgnizatorem.",
"Are you accepting the invitation?" : "Czy akceptujesz zaproszenie?",

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