Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f003ca890b | |||
| 9ec64ff578 | |||
| ea58ce9d4a |
@@ -22,7 +22,6 @@ module.exports = {
|
||||
'plugin:cypress/recommended',
|
||||
],
|
||||
rules: {
|
||||
'comma-dangle': 'error',
|
||||
'no-tabs': 'warn',
|
||||
// TODO: make sure we fix this as this is bad vue coding style.
|
||||
// Use proper sync modifier
|
||||
@@ -31,7 +30,6 @@ module.exports = {
|
||||
// allows custom xxxx:xxx events formats
|
||||
ignores: ['/^[a-z]+(?:-[a-z]+)*:[a-z]+(?:-[a-z]+)*$/u'],
|
||||
}],
|
||||
'vue/html-self-closing': 'error',
|
||||
},
|
||||
settings: {
|
||||
jsdoc: {
|
||||
|
||||
@@ -17,5 +17,3 @@ af6de04e9e141466dc229e444ff3f146f4a34765
|
||||
49dd79eabb2b8902559a7a4e8f8fcad54f46b604
|
||||
# @nextcloud/vue import paths
|
||||
b06f5ba4c47450f355a8903c1a93ac68e8c6cfc2
|
||||
# Update to coding-standard 1.4.0
|
||||
5981b7eb512aa411f51cad541d01c5c6e93476f0
|
||||
|
||||
@@ -95,8 +95,6 @@ ResponseDefinitions.php @provokateurin @nextcloud/server-backend
|
||||
# Groupware
|
||||
/build/integration/dav_features/caldav.feature @st3iny @SebastianKrupinski @tcitworld
|
||||
/build/integration/dav_features/carddav.feature @hamza221 @SebastianKrupinski
|
||||
/lib/private/Calendar @st3iny @SebastianKrupinski @tcitworld
|
||||
/lib/private/Contacts @hamza221 @SebastianKrupinski
|
||||
/lib/public/Calendar @st3iny @SebastianKrupinski @tcitworld
|
||||
/lib/public/Contacts @hamza221 @SebastianKrupinski
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
@@ -87,7 +87,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
|
||||
@@ -174,7 +174,7 @@ jobs:
|
||||
run: ./node_modules/cypress/bin/cypress install
|
||||
|
||||
- name: Run ${{ matrix.containers == 'component' && 'component' || 'E2E' }} cypress tests
|
||||
uses: cypress-io/github-action@6c143abc292aa835d827652c2ea025d098311070 # v6.10.1
|
||||
uses: cypress-io/github-action@be1bab96b388bbd9ce3887e397d373c8557e15af # v6.9.2
|
||||
with:
|
||||
# We already installed the dependencies in the init job
|
||||
install: false
|
||||
|
||||
@@ -71,7 +71,7 @@ jobs:
|
||||
if [[ "${{ matrix.ftpd }}" == 'pure-ftpd' ]]; then docker run --name ftp -d --net host -e "PUBLICHOST=localhost" -e FTP_USER_NAME=test -e FTP_USER_PASS=test -e FTP_USER_HOME=/home/test -v /tmp/ftp:/home/test -v /tmp/ftp:/etc/pure-ftpd/passwd stilliard/pure-ftpd; fi
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
|
||||
@@ -45,9 +45,9 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.2', '8.4']
|
||||
php-versions: ['8.1', '8.2', '8.3', '8.4']
|
||||
include:
|
||||
- php-versions: '8.3'
|
||||
- php-versions: '8.2'
|
||||
coverage: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
name: php${{ matrix.php-versions }}-s3-minio
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -88,19 +88,19 @@ jobs:
|
||||
composer install
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
./occ app:enable --force files_external
|
||||
echo "<?php return ['run' => true, 'minio' => true, 'secret' => 'actually-not-secret', 'passwordsalt' => 'actually-not-secret', 'hostname' => 'localhost','key' => '$OBJECT_STORE_KEY','secret' => '$OBJECT_STORE_SECRET', 'bucket' => 'bucket', 'port' => 9000, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
|
||||
echo "<?php return ['run' => true, 'secret' => 'actually-not-secret', 'passwordsalt' => 'actually-not-secret', 'hostname' => 'localhost','key' => '$OBJECT_STORE_KEY','secret' => '$OBJECT_STORE_SECRET', 'bucket' => 'bucket', 'port' => 9000, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
|
||||
|
||||
- name: Wait for S3
|
||||
run: |
|
||||
sleep 10
|
||||
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
|
||||
|
||||
- name: PHPUnit
|
||||
run: |
|
||||
composer run test:files_external -- \
|
||||
--group S3 \
|
||||
--log-junit junit.xml \
|
||||
apps/files_external/tests/Storage \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
run: composer run test:files_external -- \
|
||||
apps/files_external/tests/Storage/Amazons3Test.php \
|
||||
apps/files_external/tests/Storage/VersionedAmazonS3Test.php \
|
||||
--log-junit junit.xml \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
|
||||
- name: Upload code coverage
|
||||
if: ${{ !cancelled() && matrix.coverage }}
|
||||
@@ -115,11 +115,6 @@ jobs:
|
||||
with:
|
||||
flags: phpunit-files-external-s3
|
||||
|
||||
- name: Nextcloud logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
- name: S3 logs
|
||||
if: always()
|
||||
run: |
|
||||
@@ -134,7 +129,7 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.1', '8.2', '8.4']
|
||||
php-versions: ['8.1', '8.2', '8.3']
|
||||
include:
|
||||
- php-versions: '8.3'
|
||||
coverage: ${{ github.event_name != 'pull_request' }}
|
||||
@@ -146,7 +141,7 @@ jobs:
|
||||
env:
|
||||
SERVICES: s3
|
||||
DEBUG: 1
|
||||
image: localstack/localstack@sha256:9d4253786e0effe974d77fe3c390358391a56090a4fff83b4600d8a64404d95d # v4.5.0
|
||||
image: localstack/localstack@sha256:b52c16663c70b7234f217cb993a339b46686e30a1a5d9279cb5feeb2202f837c # v4.4.0
|
||||
ports:
|
||||
- "4566:4566"
|
||||
|
||||
@@ -158,7 +153,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -173,15 +168,14 @@ jobs:
|
||||
composer install
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
./occ app:enable --force files_external
|
||||
echo "<?php return ['run' => true, 'localstack' => true, 'hostname' => 'localhost','key' => 'ignored','secret' => 'ignored', 'bucket' => 'bucket', 'port' => 4566, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
|
||||
echo "<?php return ['run' => true,'hostname' => 'localhost','key' => 'ignored','secret' => 'ignored', 'bucket' => 'bucket', 'port' => 4566, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
|
||||
|
||||
- name: PHPUnit
|
||||
run: |
|
||||
composer run test:files_external -- \
|
||||
--group S3 \
|
||||
--log-junit junit.xml \
|
||||
apps/files_external/tests/Storage \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
run: composer run test:files_external -- \
|
||||
apps/files_external/tests/Storage/Amazons3Test.php \
|
||||
apps/files_external/tests/Storage/VersionedAmazonS3Test.php \
|
||||
--log-junit junit.xml \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
|
||||
- name: Upload code coverage
|
||||
if: ${{ !cancelled() && matrix.coverage }}
|
||||
|
||||
@@ -67,7 +67,7 @@ jobs:
|
||||
if [[ '${{ matrix.sftpd }}' == 'openssh' ]]; then docker run -p 2222:22 --name sftp -d -v /tmp/sftp:/home/test atmoz/sftp 'test:test:::data'; fi
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -93,7 +93,7 @@ jobs:
|
||||
apps/files_external/tests/env/wait-for-connection 127.0.0.1 445 60
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:files_external -- \
|
||||
run: composer run test:files_external -- --verbose \
|
||||
apps/files_external/tests/Storage/SmbTest.php \
|
||||
--log-junit junit.xml \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -90,7 +90,7 @@ jobs:
|
||||
curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://test:pass@localhost:8081/webdav/
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:files_external -- \
|
||||
run: composer run test:files_external -- --verbose \
|
||||
apps/files_external/tests/Storage/WebdavTest.php \
|
||||
--log-junit junit.xml \
|
||||
${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
|
||||
@@ -59,7 +59,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
|
||||
@@ -42,20 +42,12 @@ jobs:
|
||||
run: |
|
||||
cd server
|
||||
# Print all tags
|
||||
git log --decorate --oneline | egrep 'tag: ' | sed -r 's/^.+tag: ([^,\)]+)[,\)].+$/\1/g'
|
||||
git log --decorate --oneline | egrep '^[0-9a-f]+ \((HEAD, )?tag: ' | sed -r 's/^.+tag: ([^ ]+)[,\)].+$/\1/g'
|
||||
# Get the current tag
|
||||
TAGS=$(git log --decorate --oneline | egrep 'tag: ' | sed -r 's/^.+tag: ([^,\)]+)[,\)].+$/\1/g')
|
||||
TAGS=$(git log --decorate --oneline | egrep '^[0-9a-f]+ \((HEAD, )?tag: ' | sed -r 's/^.+tag: ([^ ]+)[,\)].+$/\1/g')
|
||||
CURRENT_TAG=$(echo "$TAGS" | head -n 1)
|
||||
|
||||
# Get the previous tag - filter pre-releases only if current tag is stable
|
||||
if echo "$CURRENT_TAG" | grep -q 'rc\|beta\|alpha'; then
|
||||
# Current tag is pre-release, don't filter
|
||||
PREVIOUS_TAG=$(echo "$TAGS" | sed -n '2p')
|
||||
else
|
||||
# Current tag is stable, filter out pre-releases
|
||||
PREVIOUS_TAG=$(echo "$TAGS" | grep -v 'rc\|beta\|alpha' | sed -n '2p')
|
||||
fi
|
||||
|
||||
# Get the previous tag that is not an rc, beta or alpha
|
||||
PREVIOUS_TAG=$(echo "$TAGS" | grep -v 'rc\|beta\|alpha' | sed -n '2p')
|
||||
echo "CURRENT_TAG=$CURRENT_TAG" >> $GITHUB_ENV
|
||||
echo "PREVIOUS_TAG=$PREVIOUS_TAG" >> $GITHUB_ENV
|
||||
|
||||
@@ -68,7 +60,7 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Set up php 8.2
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: 8.2
|
||||
coverage: none
|
||||
|
||||
@@ -59,7 +59,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up Python
|
||||
uses: LizardByte/actions/actions/setup_python@eddc8fc8b27048e25040e37e3585bd3ef9a968ed # v2025.715.25226
|
||||
uses: LizardByte/setup-python-action@6fe61189717d4cb073a3219e234749125f53b5c2 # v2025.530.174035
|
||||
with:
|
||||
python-version: '2.7'
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
|
||||
@@ -73,7 +73,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
|
||||
@@ -66,11 +66,9 @@ jobs:
|
||||
- 'openldap_numerical_features'
|
||||
- 'ldap_features'
|
||||
- 'remoteapi_features'
|
||||
- 'routing_features'
|
||||
- 'setup_features'
|
||||
- 'sharees_features'
|
||||
- 'sharing_features'
|
||||
- 'theming_features'
|
||||
- 'videoverification_features'
|
||||
|
||||
php-versions: ['8.1']
|
||||
@@ -119,7 +117,7 @@ jobs:
|
||||
ref: ${{ matrix.activity-versions }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -165,7 +163,7 @@ jobs:
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat $(./occ log:file |grep "Log file"|cut -d" " -f3)
|
||||
cat data/nextcloud.log
|
||||
docker ps -a
|
||||
docker ps -aq | while read container ; do IMAGE=$(docker inspect --format='{{.Config.Image}}' $container); echo $IMAGE; docker logs $container; echo "\n\n" ; done
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up php8.1
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: 8.1
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
|
||||
@@ -58,7 +58,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
coverage: none
|
||||
|
||||
@@ -79,7 +79,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -99,7 +99,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
env:
|
||||
|
||||
@@ -80,7 +80,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: Wait for S3
|
||||
run: |
|
||||
|
||||
@@ -77,7 +77,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
env:
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: '8.1'
|
||||
extensions: ctype, curl, dom, fileinfo, gd, json, libxml, mbstring, openssl, pcntl, pdo, posix, session, simplexml, xml, xmlreader, xmlwriter, zip, zlib
|
||||
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
ref: ${{ github.event.pull_request.base.ref }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
|
||||
@@ -7,7 +7,6 @@ on:
|
||||
paths:
|
||||
- 'version.php'
|
||||
- '.github/workflows/phpunit-32bits.yml'
|
||||
- 'tests/phpunit-autotest.xml'
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "15 1 * * 1-6"
|
||||
@@ -45,10 +44,10 @@ jobs:
|
||||
sudo apt-get install -y ffmpeg imagemagick libmagickcore-6.q16-3-extra
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, imagick, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite, apcu, ldap
|
||||
extensions: ctype, curl, dom, fileinfo, gd, imagick, intl, json, mbstring, openssl, pdo_sqlite, posix, sqlite, xml, zip, apcu
|
||||
coverage: none
|
||||
ini-file: development
|
||||
ini-values:
|
||||
@@ -56,16 +55,14 @@ jobs:
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set up dependencies
|
||||
run: composer i
|
||||
|
||||
- name: Set up Nextcloud
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
composer install
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=autotest --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f index.php
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test -- --exclude-group PRIMARY-azure,PRIMARY-s3,PRIMARY-swift,Memcached,Redis,RoutingWeirdness
|
||||
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -122,7 +122,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
mkdir data
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit memcached tests
|
||||
run: composer run test -- --group Memcache,Memcached --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.xml' || '' }}
|
||||
|
||||
@@ -127,7 +127,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -154,7 +154,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -122,7 +122,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
@@ -81,7 +81,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -102,7 +102,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit nodb testsuite
|
||||
run: composer run test -- --exclude-group DB,SLOWDB --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.nodb.xml' || '' }}
|
||||
|
||||
@@ -78,7 +78,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
@@ -95,7 +95,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: Wait for S3
|
||||
run: |
|
||||
|
||||
@@ -107,7 +107,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -126,7 +126,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=oci --database-name=${{ matrix.oracle-versions < 23 && 'XE' || 'FREE' }} --database-host=127.0.0.1 --database-port=1521 --database-user=system --database-pass=oracle --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit
|
||||
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
@@ -96,7 +96,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -117,7 +117,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=pgsql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: PHPUnit database tests
|
||||
run: composer run test:db -- --log-junit junit.xml ${{ matrix.coverage && '--coverage-clover ./clover.db.xml' || '' }}
|
||||
|
||||
@@ -81,7 +81,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a # v2.33.0
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
cp tests/redis.config.php config/
|
||||
cp tests/preseed-config.php config/config.php
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
php -f tests/enable_all.php
|
||||
php -f tests/enable_all.php | grep -i -C9999 error && echo "Error during app setup" && exit 1 || exit 0
|
||||
|
||||
- name: Nextcloud debug information
|
||||
run: ./occ app:list && echo "======= System config =======" && ./occ config:list system
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: '8.1'
|
||||
extensions: apcu,ctype,curl,dom,fileinfo,ftp,gd,imagick,intl,json,ldap,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
||||
@@ -65,7 +65,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: '8.1'
|
||||
extensions: ctype,curl,dom,fileinfo,ftp,gd,imagick,intl,json,ldap,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
||||
@@ -83,7 +83,7 @@ jobs:
|
||||
|
||||
- name: Upload Security Analysis results to GitHub
|
||||
if: always()
|
||||
uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3
|
||||
uses: github/codeql-action/upload-sarif@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: '8.1'
|
||||
extensions: ctype,curl,dom,fileinfo,gd,imagick,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
||||
@@ -131,7 +131,7 @@ jobs:
|
||||
submodules: true
|
||||
|
||||
- name: Set up php
|
||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e #v2.34.1
|
||||
uses: shivammathur/setup-php@cf4cade2721270509d5b1c766ab3549210a39a2a #v2.33.0
|
||||
with:
|
||||
php-version: '8.1'
|
||||
extensions: ctype,curl,dom,fileinfo,gd,imagick,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
# SPDX-License-Identifier: MIT
|
||||
name: Update PRs titles on stable branches
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, edited]
|
||||
branches:
|
||||
- "stable*"
|
||||
|
||||
concurrency:
|
||||
group: stable-pr-title-${{ github.event.pull_request.number }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
update-pr-title:
|
||||
runs-on: ubuntu-latest-low
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Wait for potential title edits
|
||||
run: sleep 15
|
||||
|
||||
- name: Get PR details and update title
|
||||
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const { data: pr } = await github.rest.pulls.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
});
|
||||
|
||||
const baseBranch = pr.base.ref;
|
||||
const currentTitle = pr.title;
|
||||
|
||||
// Check if this is a stable branch
|
||||
// Should not happen as we only trigger on stable* branches 🤷♀️
|
||||
if (!baseBranch.startsWith('stable')) {
|
||||
console.log(`Not a stable branch: ${baseBranch}`);
|
||||
return;
|
||||
}
|
||||
|
||||
const prefix = `[${baseBranch}]`;
|
||||
|
||||
// Check if title already has the correct prefix and no other stable tags
|
||||
const correctTagRegex = new RegExp(`^\\[${baseBranch}\\]\\s*`);
|
||||
const hasOtherStableTags = /\[stable[\d.]*\]/.test(currentTitle.replace(correctTagRegex, ''));
|
||||
|
||||
if (correctTagRegex.test(currentTitle) && !hasOtherStableTags) {
|
||||
console.log(`Title already has correct prefix only: ${currentTitle}`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove all stable tags and add the correct one
|
||||
const cleanTitle = currentTitle.replace(/\[stable[\d.]*\]\s*/g, '').trim();
|
||||
const newTitle = `${prefix} ${cleanTitle}`;
|
||||
|
||||
console.log(`Updating title from: "${currentTitle}" to: "${newTitle}"`);
|
||||
|
||||
await github.rest.pulls.update({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
title: newTitle,
|
||||
});
|
||||
@@ -152,7 +152,6 @@ Vagrantfile
|
||||
# Tests - auto-generated files
|
||||
/data-autotest
|
||||
/results.sarif
|
||||
/tests/.phpunit.cache
|
||||
/tests/.phpunit.result.cache
|
||||
/tests/coverage*
|
||||
/tests/css
|
||||
|
||||
@@ -40,6 +40,9 @@
|
||||
Header onsuccess unset X-Robots-Tag
|
||||
Header always set X-Robots-Tag "noindex, nofollow"
|
||||
|
||||
Header onsuccess unset X-XSS-Protection
|
||||
Header always set X-XSS-Protection "1; mode=block"
|
||||
|
||||
SetEnv modHeadersAvailable true
|
||||
</IfModule>
|
||||
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ Files: tests/data/integritycheck/htaccessWithValidModifiedContent/.htaccess
|
||||
Copyright: 2016 ownCloud, Inc., 2019 Nextcloud GmbH and Nextcloud contributors
|
||||
License: AGPL-3.0-only
|
||||
|
||||
Files: core/img/favicon*.* core/img/logo/logo*.* tests/data/testimage.webp tests/data/broken-video.webm apps/testing/img/logo.png core/img/apps/spreed.svg
|
||||
Files: core/img/favicon*.* core/img/logo/logo*.* tests/data/testimage.webp apps/testing/img/logo.png core/img/apps/spreed.svg
|
||||
Copyright: 2016-2024 Nextcloud GmbH
|
||||
License: LicenseRef-NextcloudTrademarks
|
||||
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 30fa1c94a9...e0a509739b
@@ -620,7 +620,6 @@
|
||||
- szaimen <szaimen@e.mail.de>
|
||||
- tbartenstein <tbartenstein@users.noreply.github.com>
|
||||
- tbelau666 <thomas.belau@gmx.de>
|
||||
- TechnicalSuwako <suwako@076.moe>
|
||||
- tgrant <tom.grant760@gmail.com>
|
||||
- timm2k <timm2k@gmx.de>
|
||||
- tux-rampage <tux-rampage@users.noreply.github.com>
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Аўдыт / Журнал",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Прадастаўляе магчымасці вядзення журнала дзенняў для Nextcloud, такіх як доступ да файлаў або іншых канфідэнцыйных дзеянняў."
|
||||
},
|
||||
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
|
||||
@@ -1,5 +0,0 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Аўдыт / Журнал",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Прадастаўляе магчымасці вядзення журнала дзенняў для Nextcloud, такіх як доступ да файлаў або іншых канфідэнцыйных дзеянняў."
|
||||
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Одитиране / Регистри на действията",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Предоставя възможности за създаване на регистри на действията в \"Nextcloud\", като например кой е осъществил достъп до файл или други действия."
|
||||
"Auditing / Logging" : "Одитиране/създаване на регистри",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Предоставя възможности за регистриране в Nextcloud, като например достъп до файлове за регистриране или други чувствителни действия."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Одитиране / Регистри на действията",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Предоставя възможности за създаване на регистри на действията в \"Nextcloud\", като например кой е осъществил достъп до файл или други действия."
|
||||
"Auditing / Logging" : "Одитиране/създаване на регистри",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Предоставя възможности за регистриране в Nextcloud, като например достъп до файлове за регистриране или други чувствителни действия."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -2,6 +2,6 @@ OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Ekzamenado / Protokolado",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Ebligas protokoladon, ekzemple protokolado de aliroj al dosieroj aŭ aliaj delikataj agoj."
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Provizi protokolado-kapablojn por Nextcloud, kiel ekzemple protokolado de aliroj al dosieroj aŭ aliaj delikataj agoj."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Ekzamenado / Protokolado",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Ebligas protokoladon, ekzemple protokolado de aliroj al dosieroj aŭ aliaj delikataj agoj."
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Provizi protokolado-kapablojn por Nextcloud, kiel ekzemple protokolado de aliroj al dosieroj aŭ aliaj delikataj agoj."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Pengauditan/Pencatatan",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya."
|
||||
"Auditing / Logging" : "Pemeriksaan / Pencatatan",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya."
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Pengauditan/Pencatatan",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya."
|
||||
"Auditing / Logging" : "Pemeriksaan / Pencatatan",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya."
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Ukaguzi/kuweka kumbukumbu",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Hutoa uwezo wa kuweka kumbukumbu kwa Nextcloud kama vile ufikiaji wa faili za kumbukumbu au vitendo nyeti."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -1,5 +0,0 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Ukaguzi/kuweka kumbukumbu",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Hutoa uwezo wa kuweka kumbukumbu kwa Nextcloud kama vile ufikiaji wa faili za kumbukumbu au vitendo nyeti."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -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.16.0</version>
|
||||
<version>1.15.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Bjoern Schiessle</author>
|
||||
<namespace>CloudFederationAPI</namespace>
|
||||
|
||||
@@ -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,9 +11,5 @@ 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,10 +26,6 @@ class ComposerStaticInitCloudFederationAPI
|
||||
'OCA\\CloudFederationAPI\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
|
||||
'OCA\\CloudFederationAPI\\Config' => __DIR__ . '/..' . '/../lib/Config.php',
|
||||
'OCA\\CloudFederationAPI\\Controller\\RequestHandlerController' => __DIR__ . '/..' . '/../lib/Controller/RequestHandlerController.php',
|
||||
'OCA\\CloudFederationAPI\\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,8 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"cloud_federation_api",
|
||||
{
|
||||
"Cloud Federation API" : "API de Federação Cloud",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Enable clouds to communicate with each other and exchange data",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data."
|
||||
},
|
||||
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -1,6 +0,0 @@
|
||||
{ "translations": {
|
||||
"Cloud Federation API" : "API de Federação Cloud",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Enable clouds to communicate with each other and exchange data",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data."
|
||||
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
OC.L10N.register(
|
||||
"cloud_federation_api",
|
||||
{
|
||||
"Cloud Federation API" : "API ya Shirikisho la Cloud",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Washa clouds kuwasiliana na kubadilishana data",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API ya Shirikisho la Cloud huwezesha matukio mbalimbali ya Nextcloud kuwasiliana na kubadilishana data."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -1,6 +0,0 @@
|
||||
{ "translations": {
|
||||
"Cloud Federation API" : "API ya Shirikisho la Cloud",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Washa clouds kuwasiliana na kubadilishana data",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "API ya Shirikisho la Cloud huwezesha matukio mbalimbali ya Nextcloud kuwasiliana na kubadilishana data."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -6,7 +6,6 @@ declare(strict_types=1);
|
||||
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\CloudFederationAPI;
|
||||
|
||||
use NCU\Security\Signature\Exceptions\IdentityNotFoundException;
|
||||
@@ -17,16 +16,16 @@ use OCP\Capabilities\IInitialStateExcludedCapability;
|
||||
use OCP\IAppConfig;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\OCM\Exceptions\OCMArgumentException;
|
||||
use OCP\OCM\ICapabilityAwareOCMProvider;
|
||||
use OCP\OCM\IOCMProvider;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class Capabilities implements ICapability, IInitialStateExcludedCapability {
|
||||
public const API_VERSION = '1.1.0';
|
||||
public const API_VERSION = '1.1'; // informative, real version.
|
||||
|
||||
public function __construct(
|
||||
private IURLGenerator $urlGenerator,
|
||||
private IAppConfig $appConfig,
|
||||
private ICapabilityAwareOCMProvider $provider,
|
||||
private IOCMProvider $provider,
|
||||
private readonly OCMSignatoryManager $ocmSignatoryManager,
|
||||
private readonly LoggerInterface $logger,
|
||||
) {
|
||||
@@ -35,7 +34,23 @@ class Capabilities implements ICapability, IInitialStateExcludedCapability {
|
||||
/**
|
||||
* Function an app uses to return the capabilities
|
||||
*
|
||||
* @return array<string, array<string, mixed>>
|
||||
* @return array{
|
||||
* ocm: array{
|
||||
* apiVersion: '1.0-proposal1',
|
||||
* enabled: bool,
|
||||
* endPoint: string,
|
||||
* publicKey?: array{
|
||||
* keyId: string,
|
||||
* publicKeyPem: string,
|
||||
* },
|
||||
* resourceTypes: list<array{
|
||||
* name: string,
|
||||
* shareTypes: list<string>,
|
||||
* protocols: array<string, string>
|
||||
* }>,
|
||||
* version: string
|
||||
* }
|
||||
* }
|
||||
* @throws OCMArgumentException
|
||||
*/
|
||||
public function getCapabilities() {
|
||||
@@ -47,8 +62,6 @@ class Capabilities implements ICapability, IInitialStateExcludedCapability {
|
||||
|
||||
$this->provider->setEnabled(true);
|
||||
$this->provider->setApiVersion(self::API_VERSION);
|
||||
$this->provider->setCapabilities(['/invite-accepted', '/notifications', '/shares']);
|
||||
|
||||
$this->provider->setEndPoint(substr($url, 0, $pos));
|
||||
|
||||
$resource = $this->provider->createNewResourceType();
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
<?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;
|
||||
@@ -17,20 +15,15 @@ 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 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;
|
||||
@@ -68,15 +61,12 @@ 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 ITimeFactory $timeFactory,
|
||||
) {
|
||||
parent::__construct($appName, $request);
|
||||
}
|
||||
@@ -117,17 +107,16 @@ class RequestHandlerController extends Controller {
|
||||
}
|
||||
|
||||
// check if all required parameters are set
|
||||
if (
|
||||
$shareWith === null
|
||||
|| $name === null
|
||||
|| $providerId === null
|
||||
|| $resourceType === null
|
||||
|| $shareType === null
|
||||
|| !is_array($protocol)
|
||||
|| !isset($protocol['name'])
|
||||
|| !isset($protocol['options'])
|
||||
|| !is_array($protocol['options'])
|
||||
|| !isset($protocol['options']['sharedSecret'])
|
||||
if ($shareWith === null ||
|
||||
$name === null ||
|
||||
$providerId === null ||
|
||||
$resourceType === null ||
|
||||
$shareType === null ||
|
||||
!is_array($protocol) ||
|
||||
!isset($protocol['name']) ||
|
||||
!isset($protocol['options']) ||
|
||||
!is_array($protocol['options']) ||
|
||||
!isset($protocol['options']['sharedSecret'])
|
||||
) {
|
||||
return new JSONResponse(
|
||||
[
|
||||
@@ -224,101 +213,6 @@ 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.
|
||||
* @link https://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1invite-accepted/post
|
||||
*
|
||||
* @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, array{userID: string, email: string, name: string}, array{}>|JSONResponse<Http::STATUS_FORBIDDEN|Http::STATUS_BAD_REQUEST|Http::STATUS_CONFLICT, array{message: string, error: true}, 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
|
||||
*/
|
||||
#[PublicPage]
|
||||
#[NoCSRFRequired]
|
||||
#[BruteForceProtection(action: 'inviteAccepted')]
|
||||
public function inviteAccepted(string $recipientProvider, string $token, string $userId, string $email, string $name): JSONResponse {
|
||||
$this->logger->debug('Processing share invitation 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;
|
||||
}
|
||||
|
||||
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 ($invitation->getExpiredAt() !== null && $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->getEMailAddress();
|
||||
if ($sharedFromEmail === null) {
|
||||
$response = ['message' => 'Invalid or non existing token', 'error' => true];
|
||||
$status = Http::STATUS_BAD_REQUEST;
|
||||
$response = new JSONResponse($response, $status);
|
||||
$response->throttle();
|
||||
return $response;
|
||||
}
|
||||
$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
|
||||
*
|
||||
@@ -339,11 +233,10 @@ 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
|
||||
|| $resourceType === null
|
||||
|| $providerId === null
|
||||
|| !is_array($notification)
|
||||
if ($notificationType === null ||
|
||||
$resourceType === null ||
|
||||
$providerId === null ||
|
||||
!is_array($notification)
|
||||
) {
|
||||
return new JSONResponse(
|
||||
[
|
||||
|
||||
@@ -1,62 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\CloudFederationAPI\Db;
|
||||
|
||||
use OCP\AppFramework\Db\Entity;
|
||||
use OCP\DB\Types;
|
||||
|
||||
/**
|
||||
* @method bool isAccepted()
|
||||
* @method void setAccepted(bool $accepted)
|
||||
* @method int|null getAcceptedAt()
|
||||
* @method void setAcceptedAt(int $acceptedAt)
|
||||
* @method int|null getCreatedAt()
|
||||
* @method void setCreatedAt(int $createdAt)
|
||||
* @method int|null getExpiredAt()
|
||||
* @method void setExpiredAt(int $expiredAt)
|
||||
* @method string|null getRecipientEmail()
|
||||
* @method void setRecipientEmail(string $recipientEmail)
|
||||
* @method string|null getRecipientName()
|
||||
* @method void setRecipientName(string $recipientName)
|
||||
* @method string|null getRecipientProvider()
|
||||
* @method void setRecipientProvider(string $recipientProvider)
|
||||
* @method string|null getRecipientUserId()
|
||||
* @method void setRecipientUserId(string $recipientUserId)
|
||||
* @method string getToken()
|
||||
* @method void setToken(string $token)
|
||||
* @method string|null getUserId()
|
||||
* @method void setUserId(string $userId)
|
||||
*/
|
||||
|
||||
class FederatedInvite extends Entity {
|
||||
protected bool $accepted = false;
|
||||
protected ?int $acceptedAt = 0;
|
||||
protected int $createdAt = 0;
|
||||
protected ?int $expiredAt = 0;
|
||||
protected ?string $recipientEmail = null;
|
||||
protected ?string $recipientName = null;
|
||||
protected ?string $recipientProvider = null;
|
||||
protected ?string $recipientUserId = null;
|
||||
protected string $token = '';
|
||||
protected string $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);
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\CloudFederationAPI\Db;
|
||||
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
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 {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from('federated_invites')
|
||||
->where($qb->expr()->eq('token', $qb->createNamedParameter($token)));
|
||||
return $this->findEntity($qb);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\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->addUniqueConstraint(['token']);
|
||||
$table->setPrimaryKey(['id']);
|
||||
return $schema;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -36,10 +36,79 @@
|
||||
},
|
||||
"Capabilities": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "object"
|
||||
"required": [
|
||||
"ocm"
|
||||
],
|
||||
"properties": {
|
||||
"ocm": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"apiVersion",
|
||||
"enabled",
|
||||
"endPoint",
|
||||
"resourceTypes",
|
||||
"version"
|
||||
],
|
||||
"properties": {
|
||||
"apiVersion": {
|
||||
"type": "string",
|
||||
"enum": [
|
||||
"1.0-proposal1"
|
||||
]
|
||||
},
|
||||
"enabled": {
|
||||
"type": "boolean"
|
||||
},
|
||||
"endPoint": {
|
||||
"type": "string"
|
||||
},
|
||||
"publicKey": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"keyId",
|
||||
"publicKeyPem"
|
||||
],
|
||||
"properties": {
|
||||
"keyId": {
|
||||
"type": "string"
|
||||
},
|
||||
"publicKeyPem": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceTypes": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"name",
|
||||
"shareTypes",
|
||||
"protocols"
|
||||
],
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"shareTypes": {
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"protocols": {
|
||||
"type": "object",
|
||||
"additionalProperties": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"version": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -327,167 +396,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/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.\nhttps://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1invite-accepted/post\nNote: Not implementing 404 Invitation token does not exist, instead using 400",
|
||||
"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",
|
||||
"required": [
|
||||
"userID",
|
||||
"email",
|
||||
"name"
|
||||
],
|
||||
"properties": {
|
||||
"userID": {
|
||||
"type": "string"
|
||||
},
|
||||
"email": {
|
||||
"type": "string"
|
||||
},
|
||||
"name": {
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"403": {
|
||||
"description": "Invitation token does not exist",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"message",
|
||||
"error"
|
||||
],
|
||||
"properties": {
|
||||
"message": {
|
||||
"type": "string"
|
||||
},
|
||||
"error": {
|
||||
"type": "boolean",
|
||||
"enum": [
|
||||
true
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"400": {
|
||||
"description": "Invalid token",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"message",
|
||||
"error"
|
||||
],
|
||||
"properties": {
|
||||
"message": {
|
||||
"type": "string"
|
||||
},
|
||||
"error": {
|
||||
"type": "boolean",
|
||||
"enum": [
|
||||
true
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"409": {
|
||||
"description": "User is already known by the OCM provider",
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"required": [
|
||||
"message",
|
||||
"error"
|
||||
],
|
||||
"properties": {
|
||||
"message": {
|
||||
"type": "string"
|
||||
},
|
||||
"error": {
|
||||
"type": "boolean",
|
||||
"enum": [
|
||||
true
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\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 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 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->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->timeFactory,
|
||||
);
|
||||
}
|
||||
|
||||
public function testInviteAccepted(): void {
|
||||
$token = 'token';
|
||||
$userId = 'userId';
|
||||
$invite = new FederatedInvite();
|
||||
$invite->setCreatedAt(1);
|
||||
$invite->setUserId($userId);
|
||||
$invite->setToken($token);
|
||||
|
||||
$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('getEMailAddress')
|
||||
->willReturn('email');
|
||||
$user->method('getDisplayName')
|
||||
->willReturn('displayName');
|
||||
|
||||
$this->userManager->expects(self::once())
|
||||
->method('get')
|
||||
->with($userId)
|
||||
->willReturn($user);
|
||||
|
||||
$recipientProvider = 'http://127.0.0.1';
|
||||
$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));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "U het kommentaar gelewer",
|
||||
"{author} commented" : "{outeur} het kommentaar gelewer",
|
||||
"You commented on %1$s" : "U het op %1$s kommentaar gelewer",
|
||||
"You commented on {file}" : "U het op {lêer} kommentaar gelewer",
|
||||
"%1$s commented on %2$s" : "%1$s het op %2$s kommentaar gelewer",
|
||||
"{author} commented on {file}" : "{outeur} het op {lêer} kommentaar gelewer",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> vir lêers",
|
||||
"Files app plugin to add comments to files" : "Lêertoepinprop om kommentaar op lêers te lewer",
|
||||
"Edit comment" : "Wysig kommentaar",
|
||||
"Delete comment" : "Skrap kommentaar",
|
||||
"No comments yet, start the conversation!" : "Nog geen kommentaar, begin die gesprek!",
|
||||
"Retry" : "Herprobeer",
|
||||
"Comment" : "Kommentaar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ongelese kommentaar","%n ongelese kommentare"]
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Kommentare",
|
||||
"You commented" : "U het kommentaar gelewer",
|
||||
"{author} commented" : "{outeur} het kommentaar gelewer",
|
||||
"You commented on %1$s" : "U het op %1$s kommentaar gelewer",
|
||||
"You commented on {file}" : "U het op {lêer} kommentaar gelewer",
|
||||
"%1$s commented on %2$s" : "%1$s het op %2$s kommentaar gelewer",
|
||||
"{author} commented on {file}" : "{outeur} het op {lêer} kommentaar gelewer",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> vir lêers",
|
||||
"Files app plugin to add comments to files" : "Lêertoepinprop om kommentaar op lêers te lewer",
|
||||
"Edit comment" : "Wysig kommentaar",
|
||||
"Delete comment" : "Skrap kommentaar",
|
||||
"No comments yet, start the conversation!" : "Nog geen kommentaar, begin die gesprek!",
|
||||
"Retry" : "Herprobeer",
|
||||
"Comment" : "Kommentaar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n ongelese kommentaar","%n ongelese kommentare"]
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Cancel" : "Dayandır",
|
||||
"Save" : "Saxla",
|
||||
"Comment" : "Komentariya"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,6 @@
|
||||
{ "translations": {
|
||||
"Cancel" : "Dayandır",
|
||||
"Save" : "Saxla",
|
||||
"Comment" : "Komentariya"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Cancel" : "বাতিল",
|
||||
"Save" : "সংরক্ষণ",
|
||||
"Comment" : "মন্তব্য"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,6 @@
|
||||
{ "translations": {
|
||||
"Cancel" : "বাতিল",
|
||||
"Save" : "সংরক্ষণ",
|
||||
"Comment" : "মন্তব্য"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Cancel" : "Odustani",
|
||||
"Save" : "Spremi",
|
||||
"Comment" : "Komentar"
|
||||
},
|
||||
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
|
||||
@@ -0,0 +1,6 @@
|
||||
{ "translations": {
|
||||
"Cancel" : "Odustani",
|
||||
"Save" : "Spremi",
|
||||
"Comment" : "Komentar"
|
||||
},"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);"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Cancel" : "Diddymu",
|
||||
"Save" : "Cadw"
|
||||
},
|
||||
"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;");
|
||||
@@ -0,0 +1,5 @@
|
||||
{ "translations": {
|
||||
"Cancel" : "Diddymu",
|
||||
"Save" : "Cadw"
|
||||
},"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Komentoj",
|
||||
"You commented" : "Vi komentis",
|
||||
"{author} commented" : "{author} komentis",
|
||||
"You commented on %1$s" : "Vi komentis %1$s",
|
||||
"You commented on {file}" : "Vi komentis pri {file}",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"{author} commented on {file}" : "{author} komentis pri {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
|
||||
"Files app plugin to add comments to files" : "Kromprogramo por la aplikaĵo „Dosieroj“ por aldoni komentojn al dosieroj",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"Delete comment" : "Forigi komenton",
|
||||
"No comments yet, start the conversation!" : "Neniu komento, ekkonversaciu!",
|
||||
"Retry" : "Reprovi",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 nova komento","{unread} novaj komentoj"],
|
||||
"Comment" : "Komento",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nelegataj komentoj","%n nelegataj komentoj"]
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,19 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Komentoj",
|
||||
"You commented" : "Vi komentis",
|
||||
"{author} commented" : "{author} komentis",
|
||||
"You commented on %1$s" : "Vi komentis %1$s",
|
||||
"You commented on {file}" : "Vi komentis pri {file}",
|
||||
"%1$s commented on %2$s" : "%1$s komentis %2$s",
|
||||
"{author} commented on {file}" : "{author} komentis pri {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Komentoj</strong> por dosieroj",
|
||||
"Files app plugin to add comments to files" : "Kromprogramo por la aplikaĵo „Dosieroj“ por aldoni komentojn al dosieroj",
|
||||
"Edit comment" : "Redakti komenton",
|
||||
"Delete comment" : "Forigi komenton",
|
||||
"No comments yet, start the conversation!" : "Neniu komento, ekkonversaciu!",
|
||||
"Retry" : "Reprovi",
|
||||
"_1 new comment_::_{unread} new comments_" : ["1 nova komento","{unread} novaj komentoj"],
|
||||
"Comment" : "Komento",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n nelegataj komentoj","%n nelegataj komentoj"]
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Ud. ha comentado",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Ud. ah comentado en %1$s",
|
||||
"You commented on {file}" : "Ud. ha comentado en {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos",
|
||||
"Files app plugin to add comments to files" : "Complemento de aplicación de archivos para agregar comentarios a los archivos.",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "No hay comentarios aún, iniciar la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Ud. ha comentado",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Ud. ah comentado en %1$s",
|
||||
"You commented on {file}" : "Ud. ha comentado en {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> en archivos",
|
||||
"Files app plugin to add comments to files" : "Complemento de aplicación de archivos para agregar comentarios a los archivos.",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "No hay comentarios aún, iniciar la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentar",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -9,27 +9,12 @@ OC.L10N.register(
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Files" : "Archivo",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Fue mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} le mencionó en un comentario en “{file}”",
|
||||
"Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"Cancel edit" : "Cancelar edición",
|
||||
"New comment" : "Nuevo comentario",
|
||||
"Write a comment …" : "Escribir un comentario …",
|
||||
"Post comment" : "Publicar comentario",
|
||||
"@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoticonos, / para selector inteligente",
|
||||
"Could not reload comments" : "No se pudieron recargar los comentarios",
|
||||
"Failed to mark comments as read" : "No se pudieron marcar los comentarios como leídos",
|
||||
"Unable to load the comments list" : "No se puede cargar la lista de comentarios",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"No more messages" : "No hay más mensajes",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
|
||||
"Comment deleted" : "Comentario borrado",
|
||||
"An error occurred while trying to delete the comment" : "Ocurrió un error intentando borrar el comentario",
|
||||
"An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario"
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
||||
@@ -7,27 +7,12 @@
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Files" : "Archivo",
|
||||
"You were mentioned on \"{file}\", in a comment by an account that has since been deleted" : "Fue mencionado en \"{file}\", en un comentario realizado por un usuario que ha sido eliminado",
|
||||
"{user} mentioned you in a comment on \"{file}\"" : "{user} le mencionó en un comentario en “{file}”",
|
||||
"Files app plugin to add comments to files" : "Plugin de la aplicación de archivos para agregar comentarios a los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"Cancel edit" : "Cancelar edición",
|
||||
"New comment" : "Nuevo comentario",
|
||||
"Write a comment …" : "Escribir un comentario …",
|
||||
"Post comment" : "Publicar comentario",
|
||||
"@ for mentions, : for emoji, / for smart picker" : "@ para menciones, : para emoticonos, / para selector inteligente",
|
||||
"Could not reload comments" : "No se pudieron recargar los comentarios",
|
||||
"Failed to mark comments as read" : "No se pudieron marcar los comentarios como leídos",
|
||||
"Unable to load the comments list" : "No se puede cargar la lista de comentarios",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"No more messages" : "No hay más mensajes",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"An error occurred while trying to edit the comment" : "Ocurrió un error al intentar editar el comentario",
|
||||
"Comment deleted" : "Comentario borrado",
|
||||
"An error occurred while trying to delete the comment" : "Ocurrió un error intentando borrar el comentario",
|
||||
"An error occurred while trying to create the comment" : "Ocurrió un error al intentar crear el comentario"
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
@@ -0,0 +1,18 @@
|
||||
{ "translations": {
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
OC.L10N.register(
|
||||
"comments",
|
||||
{
|
||||
"Comments" : "Comentarios",
|
||||
"You commented" : "Comentaste",
|
||||
"{author} commented" : "{author} comentó",
|
||||
"You commented on %1$s" : "Usted comentó en %1$s",
|
||||
"You commented on {file}" : "Hiciste un comentario de {file}",
|
||||
"%1$s commented on %2$s" : "%1$s comentó en %2$s",
|
||||
"{author} commented on {file}" : "{author} comentó en {file}",
|
||||
"<strong>Comments</strong> for files" : "<strong>Comentarios</strong> de los archivos",
|
||||
"Edit comment" : "Editar comentario",
|
||||
"Delete comment" : "Borrar comentario",
|
||||
"No comments yet, start the conversation!" : "¡Aún no hay comentarios, inicia la conversación!",
|
||||
"Retry" : "Reintentar",
|
||||
"Comment" : "Comentario",
|
||||
"%1$s commented" : "%1$s comentó",
|
||||
"_%n unread comment_::_%n unread comments_" : ["%n comentarios sin leer","%n comentarios sin leer","%n comentarios sin leer"]
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user