Compare commits
124 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 40832acfd5 | |||
| ab21491aea | |||
| 36281c64e1 | |||
| 81423a2a2f | |||
| 403637d773 | |||
| c96bb21ab9 | |||
| 0df8f4fa16 | |||
| fe8b86fbda | |||
| fe65f8facf | |||
| 2ac0e89b05 | |||
| b260ef954d | |||
| 599a9af7d6 | |||
| 525ff85594 | |||
| c62d73641a | |||
| 0965599623 | |||
| 28f2d0ec7a | |||
| 4ceeaccdd9 | |||
| f9941347e2 | |||
| 4c01f0da8f | |||
| d27d2a1c13 | |||
| d2e67312bb | |||
| 83ab996b16 | |||
| adc5b76831 | |||
| 8501cf9b5c | |||
| 04a65121b7 | |||
| c42385ef0f | |||
| f25826a5cf | |||
| c9fcf5f6b1 | |||
| 98198e042e | |||
| 35aa34a1fd | |||
| 594c8fcf23 | |||
| 9e5f167d9a | |||
| 50d5229c95 | |||
| 179de95f81 | |||
| 73c7d0dc81 | |||
| be38b924d1 | |||
| 1bb81f8f11 | |||
| 7f52754fe8 | |||
| c7a320d880 | |||
| 083f3d2373 | |||
| 14306222df | |||
| 2d932b6b86 | |||
| 86e6f07162 | |||
| 4ea1f29f9c | |||
| 7bca3daa8c | |||
| 943d95efbe | |||
| 379acf6e35 | |||
| b981cb0718 | |||
| d9db6ae84e | |||
| a7862479c7 | |||
| 3d60c9611f | |||
| 46200ce931 | |||
| 842689cf1a | |||
| cefaeb2eb1 | |||
| 537b35e1bb | |||
| c15b0b0250 | |||
| 07f607e148 | |||
| 4cc85805d6 | |||
| be7d582c7e | |||
| fc2069c1dd | |||
| bdbec28a8f | |||
| b1783ada27 | |||
| eaa1493123 | |||
| 2b93c28e28 | |||
| 5b61120491 | |||
| 6846a83d56 | |||
| d32af39c25 | |||
| bb411c75c6 | |||
| e0bafb7475 | |||
| 874a1a4c43 | |||
| 85783e45e9 | |||
| ea6a9594ca | |||
| 1e0eaa25d0 | |||
| 61791962f2 | |||
| 7e9d8a8bd0 | |||
| 3570ca82cf | |||
| e28d21a6a4 | |||
| ee57ef4903 | |||
| 23b61de21e | |||
| adc4f1a811 | |||
| 22cf5447cf | |||
| 72fda10333 | |||
| 5094e29ebd | |||
| a5c55891f5 | |||
| 8e9af2bb56 | |||
| 4f2dc18f58 | |||
| b37397d4fc | |||
| 98b89e3ea6 | |||
| 5579b1d252 | |||
| 4f0fae8f00 | |||
| 4621dc5d3c | |||
| fbbb48fcc2 | |||
| 114b472e71 | |||
| d0fa143f01 | |||
| 4973f9b952 | |||
| 97f2de0262 | |||
| 7f61d78354 | |||
| 4301fd3a32 | |||
| dc426f1e21 | |||
| 7f888f33b6 | |||
| d682a642ff | |||
| 8cf263a4b3 | |||
| 4629b31a0c | |||
| f2b0afdb60 | |||
| f37e150d1c | |||
| fbf25e164d | |||
| 7a1b45ab76 | |||
| 622d02842c | |||
| 9abff14e8d | |||
| 1186977589 | |||
| 331f30f085 | |||
| 6995223b1e | |||
| e0e76bb784 | |||
| 04cd1348ec | |||
| 14bbec5fa7 | |||
| fd01d24402 | |||
| f3513f3fe4 | |||
| 2d175586b4 | |||
| 47ebcdff9e | |||
| e0aa3674b9 | |||
| 5ef9f7e638 | |||
| ab32344308 | |||
| 68ce17e59b | |||
| 4679e85076 |
-23
@@ -1,27 +1,4 @@
|
||||
kind: pipeline
|
||||
name: jsunit
|
||||
|
||||
steps:
|
||||
- name: jsunit
|
||||
image: nextcloudci/jsunit:jsunit-5
|
||||
environment:
|
||||
CODECOV_TOKEN:
|
||||
from_secret: CODECOV_TOKEN
|
||||
commands:
|
||||
- ./autotest-js.sh
|
||||
- curl -o codecov.sh https://codecov.io/bash
|
||||
- bash codecov.sh -C $DRONE_COMMIT
|
||||
|
||||
trigger:
|
||||
branch:
|
||||
- master
|
||||
- stable*
|
||||
event:
|
||||
- pull_request
|
||||
- push
|
||||
|
||||
---
|
||||
kind: pipeline
|
||||
name: checkers
|
||||
|
||||
steps:
|
||||
|
||||
@@ -24,6 +24,7 @@ jobs:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Install dependencies & build
|
||||
run: |
|
||||
make clean
|
||||
npm ci
|
||||
npm run build --if-present
|
||||
- name: Check webpack build changes
|
||||
@@ -49,6 +50,17 @@ jobs:
|
||||
- name: Test
|
||||
run: npm run test
|
||||
|
||||
jsunit:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use node ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Test
|
||||
run: ./autotest-js.sh
|
||||
|
||||
handlebars:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
|
||||
@@ -27,3 +27,28 @@ jobs:
|
||||
- name: Show potential changes in Psalm baseline
|
||||
run: |
|
||||
bash -c "[[ ! \"`git status --porcelain build/psalm-baseline.xml`\" ]] || ( echo 'Uncommited changes in Psalm baseline' && git status && git diff build/psalm-baseline.xml)"
|
||||
|
||||
static-code-analysis-ocp:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Checkout submodules
|
||||
shell: bash
|
||||
run: |
|
||||
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
|
||||
git submodule sync --recursive
|
||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||
- name: Set up php7.4
|
||||
uses: shivammathur/setup-php@master
|
||||
with:
|
||||
php-version: 7.4
|
||||
coverage: none
|
||||
- name: Composer install
|
||||
run: composer i
|
||||
- name: Psalm
|
||||
run: composer run psalm -- -c psalm-ocp.xml --monochrome --no-progress --output-format=text --update-baseline || ( git diff -- . ':!lib/composer' && exit 1 )
|
||||
- name: Check diff
|
||||
run: git diff -- . ':!lib/composer'
|
||||
- name: Show potential changes in Psalm baseline
|
||||
run: |
|
||||
bash -c "[[ ! \"`git status --porcelain build/psalm-baseline-ocp.xml`\" ]] || ( echo 'Uncommited changes in Psalm baseline' && git status && git diff build/psalm-baseline.xml)"
|
||||
|
||||
@@ -61,16 +61,12 @@
|
||||
RewriteCond %{HTTP_USER_AGENT} DavClnt
|
||||
RewriteRule ^$ /remote.php/webdav/ [L,R=302]
|
||||
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
|
||||
RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L]
|
||||
RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L]
|
||||
RewriteRule ^\.well-known/webfinger /public.php?service=webfinger [QSA,L]
|
||||
RewriteRule ^\.well-known/nodeinfo /public.php?service=nodeinfo [QSA,L]
|
||||
RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L]
|
||||
RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L]
|
||||
RewriteRule ^remote/(.*) remote.php [QSA,L]
|
||||
RewriteRule ^(?:build|tests|config|lib|3rdparty|templates)/.* - [R=404,L]
|
||||
RewriteCond %{REQUEST_URI} !^/\.well-known/(acme-challenge|pki-validation)/.*
|
||||
RewriteRule ^(?:\.|autotest|occ|issue|indie|db_|console).* - [R=404,L]
|
||||
RewriteRule ^\.well-known/(?!acme-challenge|pki-validation) /index.php [QSA,L]
|
||||
RewriteRule ^(?:\.(?!well-known)|autotest|occ|issue|indie|db_|console).* - [R=404,L]
|
||||
</IfModule>
|
||||
<IfModule mod_mime.c>
|
||||
AddType image/svg+xml svg svgz
|
||||
|
||||
@@ -382,6 +382,7 @@ TheSFReader <TheSFReader@gmail.com>
|
||||
Thibaut GRIDEL <tgridel@free.fr>
|
||||
thomas <thomas@thomas-VirtualBox.(none)>
|
||||
Thomas Citharel <nextcloud@tcit.fr> Thomas Citharel <tcit@tcit.fr>
|
||||
Thomas Citharel <nextcloud@tcit.fr> Thomas Citharel <github@tcit.fr>
|
||||
Thomas Müller <thomas.mueller@tmit.eu> Thomas Mueller <thomas.mueller@tmit.eu>
|
||||
Thomas Müller <thomas.mueller@tmit.eu> Thomas Müller <DeepDiver1975@users.noreply.github.com>
|
||||
Thomas Olsen <tol@tanghus>
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 27a56c5bb9...2f1899e16a
@@ -56,8 +56,9 @@ Several apps that are included by default in regular releases such as [First run
|
||||
|
||||
Otherwise, git checkouts can be handled the same as release archives, by using the `stable*` branches. Note they should never be used on production systems.
|
||||
|
||||
### Working with front-end code 🏗
|
||||
|
||||
### Building front-end code 🏗
|
||||
#### Building
|
||||
|
||||
We are moving more and more towards using Vue.js in the frontend, starting with Settings. For building the code on changes, use these terminal commands in the root folder:
|
||||
|
||||
@@ -75,6 +76,8 @@ make watch-js
|
||||
make build-js-production
|
||||
```
|
||||
|
||||
#### Commiting changes
|
||||
|
||||
**When making changes, also commit the compiled files!**
|
||||
|
||||
We still use Handlebars templates some places in Files and Settings. We will replace these step-by-step with Vue.js, but in the meantime you need to compile them separately.
|
||||
@@ -102,6 +105,17 @@ MODULE=user_status make build-js-production
|
||||
|
||||
Please note that if you used `make build-js` or `make watch-js` before, you'll notice that a lot of files were marked as changed, so might need to clear the workspace first.
|
||||
|
||||
### Working with back-end code 🏗
|
||||
|
||||
When changing back-end PHP code, in general no additional steps are needed before checking in.
|
||||
|
||||
However, if new files were created, you will need to run the following command to update the autoloader files:
|
||||
```bash
|
||||
build/autoloaderchecker.sh
|
||||
```
|
||||
|
||||
After that, please also include the autoloader file changes in your commits.
|
||||
|
||||
### Tools we use 🛠
|
||||
|
||||
- [👀 BrowserStack](https://browserstack.com) for cross-browser testing
|
||||
|
||||
@@ -11,7 +11,7 @@ OC.L10N.register(
|
||||
"Enable dyslexia font" : "Legasthenie-Schriftart aktivieren",
|
||||
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.",
|
||||
"Accessibility" : "Barrierefreiheit",
|
||||
"Accessibility options for nextcloud" : "Optionen zur Barrierefreiheit in Nextcloud",
|
||||
"Accessibility options for nextcloud" : "Optionen für Barrierefreiheit in Nextcloud",
|
||||
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Bietet verschiedene Optionen für Barrierefreiheit, um die Nutzung von Nextcloud zu erleichtern.",
|
||||
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der universelle Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.",
|
||||
"If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Sie Fehler finden, melden Sie diese bitte im {issuetracker}Problemverfolgungssystem{linkend}. Und wenn Sie mithelfen möchten, treten Sie dem {designteam}Designteam{linkend} bei!",
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"Enable dyslexia font" : "Legasthenie-Schriftart aktivieren",
|
||||
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic ist eine freie Schriftart, die entwickelt wurde, um einige der häufigsten Lesefehler, die durch Legasthenie verursacht werden, zu reduzieren.",
|
||||
"Accessibility" : "Barrierefreiheit",
|
||||
"Accessibility options for nextcloud" : "Optionen zur Barrierefreiheit in Nextcloud",
|
||||
"Accessibility options for nextcloud" : "Optionen für Barrierefreiheit in Nextcloud",
|
||||
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Bietet verschiedene Optionen für Barrierefreiheit, um die Nutzung von Nextcloud zu erleichtern.",
|
||||
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Der universelle Zugang ist für uns sehr wichtig. Wir halten uns an Webstandards und prüfen, ob alles auch ohne Maus und unterstützende Software wie Screenreader nutzbar ist. Wir streben die Einhaltung der {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 auf AA-Niveau an, mit dem kontrastreichen Design sogar auf AAA-Niveau.",
|
||||
"If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Wenn Sie Fehler finden, melden Sie diese bitte im {issuetracker}Problemverfolgungssystem{linkend}. Und wenn Sie mithelfen möchten, treten Sie dem {designteam}Designteam{linkend} bei!",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Auditoria/Registre",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Proporciona capacitats de registre per a Nextcloud, com ara registre d’accés a fitxers o d’altres accions sensibles."
|
||||
"Auditing / Logging" : "Auditoria/registre",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Proporciona funcionalitats de registre per al Nextcloud, com ara un registre d'accés a fitxers o altres accions relacionades amb la confidencialitat."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Auditoria/Registre",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Proporciona capacitats de registre per a Nextcloud, com ara registre d’accés a fitxers o d’altres accions sensibles."
|
||||
"Auditing / Logging" : "Auditoria/registre",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Proporciona funcionalitats de registre per al Nextcloud, com ara un registre d'accés a fitxers o altres accions relacionades amb la confidencialitat."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
OC.L10N.register(
|
||||
"admin_audit",
|
||||
{
|
||||
"Auditing / Logging" : "Праћење / Бележење",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Даје Некстклауду могућност бележења, попут приступа фајловима или других осетљивих радњи."
|
||||
},
|
||||
"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,5 @@
|
||||
{ "translations": {
|
||||
"Auditing / Logging" : "Праћење / Бележење",
|
||||
"Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Даје Некстклауду могућност бележења, попут приступа фајловима или других осетљивих радњи."
|
||||
},"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,8 @@
|
||||
OC.L10N.register(
|
||||
"cloud_federation_api",
|
||||
{
|
||||
"Cloud Federation API" : "Cloud Federation API",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Lar nettskyer kommunisere med hverandre og utveksle data.",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation APIet lar flere instanser av Nextcloud kommunisere med hverandre og utveksle data."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,6 @@
|
||||
{ "translations": {
|
||||
"Cloud Federation API" : "Cloud Federation API",
|
||||
"Enable clouds to communicate with each other and exchange data" : "Lar nettskyer kommunisere med hverandre og utveksle data.",
|
||||
"The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Cloud Federation APIet lar flere instanser av Nextcloud kommunisere med hverandre og utveksle data."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -11,7 +11,7 @@ OC.L10N.register(
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Benutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt ",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"{author} commented on {file}" : "{author} hat {file} kommentiert",
|
||||
"<strong>Comments</strong> for files" : "<strong>Kommentare</strong> für Dateien",
|
||||
"You were mentioned on “{file}”, in a comment by a user that has since been deleted" : "Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Benutzer erwähnt",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt ",
|
||||
"{user} mentioned you in a comment on “{file}”" : "{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
|
||||
"Files app plugin to add comments to files" : "Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
|
||||
"Edit comment" : "Kommentar bearbeiten",
|
||||
"Delete comment" : "Kommentar löschen",
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -9,7 +9,7 @@ OC.L10N.register(
|
||||
"Get more widgets from the app store" : "Hole Dir weitere Widgets aus dem App Store",
|
||||
"Change background image" : "Hintergrundbild ändern",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Deinem Datenschutz werden die Wetterdaten von Ihrem Nextcloud-Server für Dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Deinem Datenschutz werden die Wetterdaten von Deinen Nextcloud-Server für Dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"Get more widgets from the app store" : "Hole Dir weitere Widgets aus dem App Store",
|
||||
"Change background image" : "Hintergrundbild ändern",
|
||||
"Weather service" : "Wetterdienst",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Deinem Datenschutz werden die Wetterdaten von Ihrem Nextcloud-Server für Dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Zu Deinem Datenschutz werden die Wetterdaten von Deinen Nextcloud-Server für Dich angefordert, so dass der Wetterdienst keine persönlichen Informationen erhält.",
|
||||
"Weather data from Met.no" : "Wetterdaten von Met.no",
|
||||
"geocoding with Nominatim" : "Geokodierung mit Nominatim",
|
||||
"elevation data from OpenTopoData" : "Höhendaten von OpenTopoData",
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
OC.L10N.register(
|
||||
"dashboard",
|
||||
{
|
||||
"Dashboard" : "แดชบอร์ด",
|
||||
"Dashboard app" : "แอปแดชบอร์ด",
|
||||
"Show something" : "แสดงบางอย่าง",
|
||||
"Customize" : "ปรับแต่ง",
|
||||
"Edit widgets" : "แก้ไข วิดเจ็ต",
|
||||
"Get more widgets from the app store" : "เพิ่ม วิดเจ็ต จาก แอปสโตร์",
|
||||
"Change background image" : "เปลี่ยน รูปภาพ พื้นหลัง",
|
||||
"Weather service" : "บริการ สภาพอากาศ",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "สำหรับความเป็นส่วนตัวของ ข้อมูลสภาพอากาศเป็นการร้องขอในนาม Nextcloud เซิร์ฟเวอร์ ของคุณ ดังนั้นบริการสภาพอากาศจึงไม่ได้รับ หรือจัดเก็บ ข้อมูลส่วนบุคคล",
|
||||
"Weather data from Met.no" : "ข้อมูลสภาพอากาศจาก Met.no",
|
||||
"geocoding with Nominatim" : "พิกัดภูมิศาสตร์ จาก Nominatim",
|
||||
"elevation data from OpenTopoData" : "ข้อมูลความสูงจาก OpenTopoData",
|
||||
"Weather" : "สภาพอากาศ",
|
||||
"Status" : "สถานะ",
|
||||
"Good evening, {name}" : "สายัณห์สวัสดิ์ {name}",
|
||||
"Good evening" : "สายัณห์สวัสดิ์",
|
||||
"Good afternoon, {name}" : "ทิวาสวัสดิ์ {name}",
|
||||
"Good afternoon" : "ทิวาสวัสดิ์",
|
||||
"Good morning, {name}" : "อรุณสวัสดิ์ {name}",
|
||||
"Good morning" : "อรุณสวัสดิ์",
|
||||
"Good night, {name}" : "ราตรีสวัสดิ์ {name}",
|
||||
"Good night" : "ราตรีสวัสดิ์",
|
||||
"Pick from files" : "เลือกจากไฟล์",
|
||||
"Default images" : "รูปภาพเริ่มต้น",
|
||||
"Plain background" : "พื้นหลังธรรมดา",
|
||||
"Insert from {productName}" : "แทรกจาก {productName}"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
@@ -0,0 +1,29 @@
|
||||
{ "translations": {
|
||||
"Dashboard" : "แดชบอร์ด",
|
||||
"Dashboard app" : "แอปแดชบอร์ด",
|
||||
"Show something" : "แสดงบางอย่าง",
|
||||
"Customize" : "ปรับแต่ง",
|
||||
"Edit widgets" : "แก้ไข วิดเจ็ต",
|
||||
"Get more widgets from the app store" : "เพิ่ม วิดเจ็ต จาก แอปสโตร์",
|
||||
"Change background image" : "เปลี่ยน รูปภาพ พื้นหลัง",
|
||||
"Weather service" : "บริการ สภาพอากาศ",
|
||||
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "สำหรับความเป็นส่วนตัวของ ข้อมูลสภาพอากาศเป็นการร้องขอในนาม Nextcloud เซิร์ฟเวอร์ ของคุณ ดังนั้นบริการสภาพอากาศจึงไม่ได้รับ หรือจัดเก็บ ข้อมูลส่วนบุคคล",
|
||||
"Weather data from Met.no" : "ข้อมูลสภาพอากาศจาก Met.no",
|
||||
"geocoding with Nominatim" : "พิกัดภูมิศาสตร์ จาก Nominatim",
|
||||
"elevation data from OpenTopoData" : "ข้อมูลความสูงจาก OpenTopoData",
|
||||
"Weather" : "สภาพอากาศ",
|
||||
"Status" : "สถานะ",
|
||||
"Good evening, {name}" : "สายัณห์สวัสดิ์ {name}",
|
||||
"Good evening" : "สายัณห์สวัสดิ์",
|
||||
"Good afternoon, {name}" : "ทิวาสวัสดิ์ {name}",
|
||||
"Good afternoon" : "ทิวาสวัสดิ์",
|
||||
"Good morning, {name}" : "อรุณสวัสดิ์ {name}",
|
||||
"Good morning" : "อรุณสวัสดิ์",
|
||||
"Good night, {name}" : "ราตรีสวัสดิ์ {name}",
|
||||
"Good night" : "ราตรีสวัสดิ์",
|
||||
"Pick from files" : "เลือกจากไฟล์",
|
||||
"Default images" : "รูปภาพเริ่มต้น",
|
||||
"Plain background" : "พื้นหลังธรรมดา",
|
||||
"Insert from {productName}" : "แทรกจาก {productName}"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
@@ -26,7 +26,7 @@
|
||||
:class="{ active: background === 'custom' }"
|
||||
tabindex="0"
|
||||
@click="pickFile">
|
||||
{{ t('dashboard', 'Pick from files') }}
|
||||
{{ t('dashboard', 'Pick from Files') }}
|
||||
</button>
|
||||
<button class="background default"
|
||||
tabindex="0"
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
<step>OCA\DAV\Migration\RegenerateBirthdayCalendars</step>
|
||||
<step>OCA\DAV\Migration\CalDAVRemoveEmptyValue</step>
|
||||
<step>OCA\DAV\Migration\BuildCalendarSearchIndex</step>
|
||||
<step>OCA\DAV\Migration\BuildSocialSearchIndex</step>
|
||||
<step>OCA\DAV\Migration\RefreshWebcalJobRegistrar</step>
|
||||
<step>OCA\DAV\Migration\RegisterBuildReminderIndexBackgroundJob</step>
|
||||
<step>OCA\DAV\Migration\RemoveOrphanEventsAndContacts</step>
|
||||
|
||||
@@ -206,6 +206,8 @@ return array(
|
||||
'OCA\\DAV\\HookManager' => $baseDir . '/../lib/HookManager.php',
|
||||
'OCA\\DAV\\Migration\\BuildCalendarSearchIndex' => $baseDir . '/../lib/Migration/BuildCalendarSearchIndex.php',
|
||||
'OCA\\DAV\\Migration\\BuildCalendarSearchIndexBackgroundJob' => $baseDir . '/../lib/Migration/BuildCalendarSearchIndexBackgroundJob.php',
|
||||
'OCA\\DAV\\Migration\\BuildSocialSearchIndex' => $baseDir . '/../lib/Migration/BuildSocialSearchIndex.php',
|
||||
'OCA\\DAV\\Migration\\BuildSocialSearchIndexBackgroundJob' => $baseDir . '/../lib/Migration/BuildSocialSearchIndexBackgroundJob.php',
|
||||
'OCA\\DAV\\Migration\\CalDAVRemoveEmptyValue' => $baseDir . '/../lib/Migration/CalDAVRemoveEmptyValue.php',
|
||||
'OCA\\DAV\\Migration\\ChunkCleanup' => $baseDir . '/../lib/Migration/ChunkCleanup.php',
|
||||
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => $baseDir . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
||||
|
||||
@@ -221,6 +221,8 @@ class ComposerStaticInitDAV
|
||||
'OCA\\DAV\\HookManager' => __DIR__ . '/..' . '/../lib/HookManager.php',
|
||||
'OCA\\DAV\\Migration\\BuildCalendarSearchIndex' => __DIR__ . '/..' . '/../lib/Migration/BuildCalendarSearchIndex.php',
|
||||
'OCA\\DAV\\Migration\\BuildCalendarSearchIndexBackgroundJob' => __DIR__ . '/..' . '/../lib/Migration/BuildCalendarSearchIndexBackgroundJob.php',
|
||||
'OCA\\DAV\\Migration\\BuildSocialSearchIndex' => __DIR__ . '/..' . '/../lib/Migration/BuildSocialSearchIndex.php',
|
||||
'OCA\\DAV\\Migration\\BuildSocialSearchIndexBackgroundJob' => __DIR__ . '/..' . '/../lib/Migration/BuildSocialSearchIndexBackgroundJob.php',
|
||||
'OCA\\DAV\\Migration\\CalDAVRemoveEmptyValue' => __DIR__ . '/..' . '/../lib/Migration/CalDAVRemoveEmptyValue.php',
|
||||
'OCA\\DAV\\Migration\\ChunkCleanup' => __DIR__ . '/..' . '/../lib/Migration/ChunkCleanup.php',
|
||||
'OCA\\DAV\\Migration\\FixBirthdayCalendarComponent' => __DIR__ . '/..' . '/../lib/Migration/FixBirthdayCalendarComponent.php',
|
||||
|
||||
+3
-3
@@ -107,9 +107,9 @@ OC.L10N.register(
|
||||
"Notifications are sent via background jobs, so these must occur often enough." : "Meldingen worden via achtergrondtaken verstuurd, dus die moeten vaak genoeg plaatsvinden.",
|
||||
"Enable notifications for events via push" : "Inschakelen push-melding voor afspraken",
|
||||
"Hello %s," : "Hallo %s,",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "De vergadering »%1$s« met %2$s is geannuleerd.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "De vergadering »%1$s« met %2$s is bijgewerkt.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s heeft je uitgenodigd voor »%2$s«",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "De vergadering \"%1$s\" met %2$s is geannuleerd.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "De vergadering \"%1$s\" met %2$s is bijgewerkt.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s heeft je uitgenodigd voor \"%2$s\"",
|
||||
"When:" : "Wanneer:"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -105,9 +105,9 @@
|
||||
"Notifications are sent via background jobs, so these must occur often enough." : "Meldingen worden via achtergrondtaken verstuurd, dus die moeten vaak genoeg plaatsvinden.",
|
||||
"Enable notifications for events via push" : "Inschakelen push-melding voor afspraken",
|
||||
"Hello %s," : "Hallo %s,",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "De vergadering »%1$s« met %2$s is geannuleerd.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "De vergadering »%1$s« met %2$s is bijgewerkt.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s heeft je uitgenodigd voor »%2$s«",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "De vergadering \"%1$s\" met %2$s is geannuleerd.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "De vergadering \"%1$s\" met %2$s is bijgewerkt.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s heeft je uitgenodigd voor \"%2$s\"",
|
||||
"When:" : "Wanneer:"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -106,6 +106,7 @@ OC.L10N.register(
|
||||
"Hello %s," : "Pozdravljeni, %s,",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "Sestanek »%1$s« z uporabnikom %2$s je preklican.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "Sestanek »%1$s« z uporabnikom %2$s je spremenjen.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s vas vabi na »%2$s«",
|
||||
"When:" : "Kdaj:"
|
||||
},
|
||||
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");
|
||||
|
||||
@@ -104,6 +104,7 @@
|
||||
"Hello %s," : "Pozdravljeni, %s,",
|
||||
"The meeting »%1$s« with %2$s was canceled." : "Sestanek »%1$s« z uporabnikom %2$s je preklican.",
|
||||
"The meeting »%1$s« with %2$s was updated." : "Sestanek »%1$s« z uporabnikom %2$s je spremenjen.",
|
||||
"%1$s invited you to »%2$s«" : "%1$s vas vabi na »%2$s«",
|
||||
"When:" : "Kdaj:"
|
||||
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
|
||||
}
|
||||
@@ -345,9 +345,6 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||
$principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true);
|
||||
$principals = array_merge($principals, $this->principalBackend->getCircleMembership($principalUriOriginal));
|
||||
|
||||
$principals = array_map(function ($principal) {
|
||||
return urldecode($principal);
|
||||
}, $principals);
|
||||
$principals[] = $principalUri;
|
||||
|
||||
$fields = array_values($this->propertyMap);
|
||||
@@ -2744,11 +2741,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||
* @param string $uriName
|
||||
* @param string $uriOrigin
|
||||
* @param string $uriDestination
|
||||
* @param string $newUriName (optional) the new uriName
|
||||
*/
|
||||
public function moveCalendar($uriName, $uriOrigin, $uriDestination) {
|
||||
public function moveCalendar($uriName, $uriOrigin, $uriDestination, $newUriName = null) {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->update('calendars')
|
||||
->set('principaluri', $query->createNamedParameter($uriDestination))
|
||||
->set('uri', $query->createNamedParameter($newUriName ?: $uriName))
|
||||
->where($query->expr()->eq('principaluri', $query->createNamedParameter($uriOrigin)))
|
||||
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($uriName)))
|
||||
->execute();
|
||||
|
||||
@@ -82,7 +82,8 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
||||
/** @var array properties to index */
|
||||
public static $indexProperties = [
|
||||
'BDAY', 'UID', 'N', 'FN', 'TITLE', 'ROLE', 'NOTE', 'NICKNAME',
|
||||
'ORG', 'CATEGORIES', 'EMAIL', 'TEL', 'IMPP', 'ADR', 'URL', 'GEO', 'CLOUD'];
|
||||
'ORG', 'CATEGORIES', 'EMAIL', 'TEL', 'IMPP', 'ADR', 'URL', 'GEO',
|
||||
'CLOUD', 'X-SOCIALPROFILE'];
|
||||
|
||||
/**
|
||||
* @var string[] Map of uid => display name
|
||||
@@ -190,9 +191,6 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
||||
$principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true);
|
||||
$principals = array_merge($principals, $this->principalBackend->getCircleMembership($principalUriOriginal));
|
||||
|
||||
$principals = array_map(function ($principal) {
|
||||
return urldecode($principal);
|
||||
}, $principals);
|
||||
$principals[] = $principalUri;
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
|
||||
@@ -104,7 +104,7 @@ class MoveCalendar extends Command {
|
||||
->addArgument('destinationuid',
|
||||
InputArgument::REQUIRED,
|
||||
'User who will receive the calendar')
|
||||
->addOption('force', 'f', InputOption::VALUE_NONE, "Force the migration by removing existing shares");
|
||||
->addOption('force', 'f', InputOption::VALUE_NONE, "Force the migration by removing existing shares and renaming calendars in case of conflicts");
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
||||
@@ -122,6 +122,7 @@ class MoveCalendar extends Command {
|
||||
}
|
||||
|
||||
$name = $input->getArgument('name');
|
||||
$newName = null;
|
||||
|
||||
$calendar = $this->calDav->getCalendarByUri(self::URI_USERS . $userOrigin, $name);
|
||||
|
||||
@@ -129,18 +130,74 @@ class MoveCalendar extends Command {
|
||||
throw new \InvalidArgumentException("User <$userOrigin> has no calendar named <$name>. You can run occ dav:list-calendars to list calendars URIs for this user.");
|
||||
}
|
||||
|
||||
if (null !== $this->calDav->getCalendarByUri(self::URI_USERS . $userDestination, $name)) {
|
||||
throw new \InvalidArgumentException("User <$userDestination> already has a calendar named <$name>.");
|
||||
// Calendar already exists
|
||||
if ($this->calendarExists($userDestination, $name)) {
|
||||
if ($input->getOption('force')) {
|
||||
// Try to find a suitable name
|
||||
$newName = $this->getNewCalendarName($userDestination, $name);
|
||||
|
||||
// If we didn't find a suitable value after all the iterations, give up
|
||||
if ($this->calendarExists($userDestination, $newName)) {
|
||||
throw new \InvalidArgumentException("Unable to find a suitable calendar name for <$userDestination> with initial name <$name>.");
|
||||
}
|
||||
} else {
|
||||
throw new \InvalidArgumentException("User <$userDestination> already has a calendar named <$name>.");
|
||||
}
|
||||
}
|
||||
|
||||
$this->checkShares($calendar, $userOrigin, $userDestination, $input->getOption('force'));
|
||||
$hadShares = $this->checkShares($calendar, $userOrigin, $userDestination, $input->getOption('force'));
|
||||
if ($hadShares) {
|
||||
/**
|
||||
* Warn that share links have changed if there are shares
|
||||
*/
|
||||
$this->io->note([
|
||||
"Please note that moving calendar " . $calendar['uri'] . " from user <$userOrigin> to <$userDestination> has caused share links to change.",
|
||||
"Sharees will need to change \"example.com/remote.php/dav/calendars/uid/" . $calendar['uri'] . "_shared_by_$userOrigin\" to \"example.com/remote.php/dav/calendars/uid/" . $newName ?: $calendar['uri'] . "_shared_by_$userDestination\""
|
||||
]);
|
||||
}
|
||||
|
||||
$this->calDav->moveCalendar($name, self::URI_USERS . $userOrigin, self::URI_USERS . $userDestination);
|
||||
$this->calDav->moveCalendar($name, self::URI_USERS . $userOrigin, self::URI_USERS . $userDestination, $newName);
|
||||
|
||||
$this->io->success("Calendar <$name> was moved from user <$userOrigin> to <$userDestination>");
|
||||
$this->io->success("Calendar <$name> was moved from user <$userOrigin> to <$userDestination>" . ($newName ? " as <$newName>" : ''));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the calendar exists for user
|
||||
*
|
||||
* @param string $userDestination
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
protected function calendarExists(string $userDestination, string $name): bool {
|
||||
return null !== $this->calDav->getCalendarByUri(self::URI_USERS . $userDestination, $name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to find a suitable new calendar name that
|
||||
* doesn't exists for the provided user
|
||||
*
|
||||
* @param string $userDestination
|
||||
* @param string $name
|
||||
* @return string
|
||||
*/
|
||||
protected function getNewCalendarName(string $userDestination, string $name): string {
|
||||
$increment = 1;
|
||||
$newName = $name . '-' . $increment;
|
||||
while ($increment <= 10) {
|
||||
$this->io->writeln("Trying calendar name <$newName>", OutputInterface::VERBOSITY_VERBOSE);
|
||||
if (!$this->calendarExists($userDestination, $newName)) {
|
||||
// New name is good to go
|
||||
$this->io->writeln("Found proper new calendar name <$newName>", OutputInterface::VERBOSITY_VERBOSE);
|
||||
break;
|
||||
}
|
||||
$newName = $name . '-' . $increment;
|
||||
$increment++;
|
||||
}
|
||||
|
||||
return $newName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check that moving the calendar won't break shares
|
||||
*
|
||||
@@ -148,8 +205,10 @@ class MoveCalendar extends Command {
|
||||
* @param string $userOrigin
|
||||
* @param string $userDestination
|
||||
* @param bool $force
|
||||
* @return bool had any shares or not
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
private function checkShares(array $calendar, string $userOrigin, string $userDestination, bool $force = false) {
|
||||
private function checkShares(array $calendar, string $userOrigin, string $userDestination, bool $force = false): bool {
|
||||
$shares = $this->calDav->getShares($calendar['id']);
|
||||
foreach ($shares as $share) {
|
||||
list(, $prefix, $userOrGroup) = explode('/', $share['href'], 3);
|
||||
@@ -177,14 +236,7 @@ class MoveCalendar extends Command {
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Warn that share links have changed if there are shares
|
||||
*/
|
||||
if (count($shares) > 0) {
|
||||
$this->io->note([
|
||||
"Please note that moving calendar " . $calendar['uri'] . " from user <$userOrigin> to <$userDestination> has caused share links to change.",
|
||||
"Sharees will need to change \"example.com/remote.php/dav/calendars/uid/" . $calendar['uri'] . "_shared_by_$userOrigin\" to \"example.com/remote.php/dav/calendars/uid/" . $calendar['uri'] . "_shared_by_$userDestination\""
|
||||
]);
|
||||
}
|
||||
|
||||
return count($shares) > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -494,7 +494,7 @@ class File extends Node implements IFile {
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array|false
|
||||
* @return array|bool
|
||||
*/
|
||||
public function getDirectDownload() {
|
||||
if (\OCP\App::isEnabled('encryption')) {
|
||||
|
||||
@@ -232,7 +232,7 @@ class GroupPrincipalBackend implements BackendInterface {
|
||||
}
|
||||
}
|
||||
|
||||
$carry[] = self::PRINCIPAL_PREFIX . '/' . $gid;
|
||||
$carry[] = self::PRINCIPAL_PREFIX . '/' . urlencode($gid);
|
||||
return $carry;
|
||||
}, []);
|
||||
break;
|
||||
|
||||
@@ -107,6 +107,7 @@ class Backend {
|
||||
return;
|
||||
}
|
||||
|
||||
$principal[2] = urldecode($principal[2]);
|
||||
if (($principal[1] === 'users' && !$this->userManager->userExists($principal[2])) ||
|
||||
($principal[1] === 'groups' && !$this->groupManager->groupExists($principal[2]))) {
|
||||
// User or group does not exist
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright 2017 Georg Ehrke <oc.list@georgehrke.com>
|
||||
*
|
||||
* @author Georg Ehrke <oc.list@georgehrke.com>
|
||||
* @author Morris Jobke <hey@morrisjobke.de>
|
||||
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class BuildSocialSearchIndex implements IRepairStep {
|
||||
|
||||
/** @var IDBConnection */
|
||||
private $db;
|
||||
|
||||
/** @var IJobList */
|
||||
private $jobList;
|
||||
|
||||
/** @var IConfig */
|
||||
private $config;
|
||||
|
||||
/**
|
||||
* @param IDBConnection $db
|
||||
* @param IJobList $jobList
|
||||
* @param IConfig $config
|
||||
*/
|
||||
public function __construct(IDBConnection $db,
|
||||
IJobList $jobList,
|
||||
IConfig $config) {
|
||||
$this->db = $db;
|
||||
$this->jobList = $jobList;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getName() {
|
||||
return 'Register building of social profile search index as background job';
|
||||
}
|
||||
|
||||
/**
|
||||
* @param IOutput $output
|
||||
*/
|
||||
public function run(IOutput $output) {
|
||||
// only run once
|
||||
if ($this->config->getAppValue('dav', 'builtSocialSearchIndex') === 'yes') {
|
||||
$output->info('Repair step already executed');
|
||||
return;
|
||||
}
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select($query->func()->max('cardid'))
|
||||
->from('cards_properties')
|
||||
->where($query->expr()->eq('name', $query->createNamedParameter('X-SOCIALPROFILE')));
|
||||
$maxId = (int)$query->execute()->fetchColumn();
|
||||
|
||||
if ($maxId === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$output->info('Add background job');
|
||||
$this->jobList->add(BuildSocialSearchIndexBackgroundJob::class, [
|
||||
'offset' => 0,
|
||||
'stopAt' => $maxId
|
||||
]);
|
||||
|
||||
// no need to redo the repair during next upgrade
|
||||
$this->config->setAppValue('dav', 'builtSocialSearchIndex', 'yes');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
<?php
|
||||
/**
|
||||
* @copyright 2020 Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @author Matthias Heinisch <nextcloud@matthiasheinisch.de>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use OC\BackgroundJob\QueuedJob;
|
||||
use OCA\DAV\CardDAV\CardDavBackend;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\BackgroundJob\IJobList;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\ILogger;
|
||||
|
||||
class BuildSocialSearchIndexBackgroundJob extends QueuedJob {
|
||||
|
||||
/** @var IDBConnection */
|
||||
private $db;
|
||||
|
||||
/** @var CardDavBackend */
|
||||
private $davBackend;
|
||||
|
||||
/** @var ILogger */
|
||||
private $logger;
|
||||
|
||||
/** @var IJobList */
|
||||
private $jobList;
|
||||
|
||||
/** @var ITimeFactory */
|
||||
private $timeFactory;
|
||||
|
||||
/**
|
||||
* @param IDBConnection $db
|
||||
* @param CardDavBackend $davBackend
|
||||
* @param ILogger $logger
|
||||
* @param IJobList $jobList
|
||||
* @param ITimeFactory $timeFactory
|
||||
*/
|
||||
public function __construct(IDBConnection $db,
|
||||
CardDavBackend $davBackend,
|
||||
ILogger $logger,
|
||||
IJobList $jobList,
|
||||
ITimeFactory $timeFactory) {
|
||||
$this->db = $db;
|
||||
$this->davBackend = $davBackend;
|
||||
$this->logger = $logger;
|
||||
$this->jobList = $jobList;
|
||||
$this->timeFactory = $timeFactory;
|
||||
}
|
||||
|
||||
public function run($arguments) {
|
||||
$offset = $arguments['offset'];
|
||||
$stopAt = $arguments['stopAt'];
|
||||
|
||||
$this->logger->info('Indexing social profile data (' . $offset .'/' . $stopAt . ')');
|
||||
|
||||
$offset = $this->buildIndex($offset, $stopAt);
|
||||
|
||||
if ($offset >= $stopAt) {
|
||||
$this->logger->info('All contacts with social profiles indexed');
|
||||
} else {
|
||||
$this->jobList->add(self::class, [
|
||||
'offset' => $offset,
|
||||
'stopAt' => $stopAt
|
||||
]);
|
||||
$this->logger->info('New social profile indexing job scheduled with offset ' . $offset);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $offset
|
||||
* @param int $stopAt
|
||||
* @return int
|
||||
*/
|
||||
private function buildIndex($offset, $stopAt) {
|
||||
$startTime = $this->timeFactory->getTime();
|
||||
|
||||
// get contacts with social profiles
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('id', 'addressbookid', 'uri', 'carddata')
|
||||
->from('cards', 'c')
|
||||
->orderBy('id', 'ASC')
|
||||
->where($query->expr()->like('carddata', $query->createNamedParameter('%SOCIALPROFILE%')))
|
||||
->setMaxResults(100);
|
||||
$social_cards = $query->execute()->fetchAll();
|
||||
|
||||
if (empty($social_cards)) {
|
||||
return $stopAt;
|
||||
}
|
||||
|
||||
// refresh identified contacts in order to re-index
|
||||
foreach ($social_cards as $contact) {
|
||||
$offset = $contact['id'];
|
||||
$this->davBackend->updateCard($contact['addressbookid'], $contact['uri'], $contact['carddata']);
|
||||
|
||||
// stop after 15sec (to be continued with next chunk)
|
||||
if (($this->timeFactory->getTime() - $startTime) > 15) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $offset;
|
||||
}
|
||||
}
|
||||
@@ -15,9 +15,12 @@ OC.L10N.register(
|
||||
"Server to server sharing is not enabled on this server" : "Na tem strežniku souporaba s strežnika na strežnik ni omogočena.",
|
||||
"Couldn't establish a federated share." : "Ni mogoče vzpostaviti zveznega mesta za souporabo.",
|
||||
"Couldn't establish a federated share, maybe the password was wrong." : "Zvezne povezave za souporabo ni mogoče ustvariti. Morda je navedeno napačno geslo.",
|
||||
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Zahteva za zvezno souporabo je poslana, prejeli boste povabilo. Preverite obvestila.",
|
||||
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Zvezne povezave za souporabo ni mogoče ustvariti. Kaže, da je podana zahteva za povezavo z nepodprto staro različico oblaka (Nextzcloud ≤ 9).",
|
||||
"It is not allowed to send federated group shares from this server." : "S tega strežnika ni dovoljeno pošiljati povabil za skupinsko souporabo prek zvezne povezave.",
|
||||
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti mesta souporabe zveznega oblaka z istim uporabnikom",
|
||||
"File is already shared with %s" : "Datoteka je že v souporabi pri %s",
|
||||
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Omogočanje souporabe %1$s je spodletelo, ker ni mogoče najti %2$s. Najverjetneje je strežnik nedosegljiv, ali pa je v uporabo neustrezno potrdilo podpisa.",
|
||||
"Could not find share" : "Mape v souporabi ni mogoče najti",
|
||||
"Federated sharing" : "Souporaba v zveznem oblaku",
|
||||
"Accept" : "Sprejmi",
|
||||
@@ -30,6 +33,7 @@ OC.L10N.register(
|
||||
"Federated Cloud Sharing" : "Souporaba zveznega oblaka",
|
||||
"Open documentation" : "Odpri dokumentacijo",
|
||||
"Adjust how people can share between servers." : "Določila, kako lahko uporabniki omogočajo souporabo med različnimi strežniki.",
|
||||
"Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Dovoli uporabnikom tega strežnika pošiljanje povezav za souporabo na druge strežnike (možnost omogoči tudi dostop prek WebDAV do javnih povezav).",
|
||||
"Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map v souporabo z drugih strežnikov",
|
||||
"Allow users on this server to send shares to groups on other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo v skupine na drugih strežnikih",
|
||||
"Allow users on this server to receive group shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje skupinskih mest souporabe z drugih strežnikov",
|
||||
|
||||
@@ -13,9 +13,12 @@
|
||||
"Server to server sharing is not enabled on this server" : "Na tem strežniku souporaba s strežnika na strežnik ni omogočena.",
|
||||
"Couldn't establish a federated share." : "Ni mogoče vzpostaviti zveznega mesta za souporabo.",
|
||||
"Couldn't establish a federated share, maybe the password was wrong." : "Zvezne povezave za souporabo ni mogoče ustvariti. Morda je navedeno napačno geslo.",
|
||||
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Zahteva za zvezno souporabo je poslana, prejeli boste povabilo. Preverite obvestila.",
|
||||
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Zvezne povezave za souporabo ni mogoče ustvariti. Kaže, da je podana zahteva za povezavo z nepodprto staro različico oblaka (Nextzcloud ≤ 9).",
|
||||
"It is not allowed to send federated group shares from this server." : "S tega strežnika ni dovoljeno pošiljati povabil za skupinsko souporabo prek zvezne povezave.",
|
||||
"Not allowed to create a federated share with the same user" : "Ni dovoljeno ustvariti mesta souporabe zveznega oblaka z istim uporabnikom",
|
||||
"File is already shared with %s" : "Datoteka je že v souporabi pri %s",
|
||||
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Omogočanje souporabe %1$s je spodletelo, ker ni mogoče najti %2$s. Najverjetneje je strežnik nedosegljiv, ali pa je v uporabo neustrezno potrdilo podpisa.",
|
||||
"Could not find share" : "Mape v souporabi ni mogoče najti",
|
||||
"Federated sharing" : "Souporaba v zveznem oblaku",
|
||||
"Accept" : "Sprejmi",
|
||||
@@ -28,6 +31,7 @@
|
||||
"Federated Cloud Sharing" : "Souporaba zveznega oblaka",
|
||||
"Open documentation" : "Odpri dokumentacijo",
|
||||
"Adjust how people can share between servers." : "Določila, kako lahko uporabniki omogočajo souporabo med različnimi strežniki.",
|
||||
"Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Dovoli uporabnikom tega strežnika pošiljanje povezav za souporabo na druge strežnike (možnost omogoči tudi dostop prek WebDAV do javnih povezav).",
|
||||
"Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map v souporabo z drugih strežnikov",
|
||||
"Allow users on this server to send shares to groups on other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo v skupine na drugih strežnikih",
|
||||
"Allow users on this server to receive group shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje skupinskih mest souporabe z drugih strežnikov",
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
OC.L10N.register(
|
||||
"federation",
|
||||
{
|
||||
"Added to the list of trusted servers" : "Afegeix a la llista de servidors de confiança",
|
||||
"Server is already in the list of trusted servers." : "El servidor ja està a la llista de servidors de confiança.",
|
||||
"No server to federate with found" : "No s'ha trobat cap servidor federat",
|
||||
"Added to the list of trusted servers" : "S'ha afegit a la llista de servidors de confiança",
|
||||
"Server is already in the list of trusted servers." : "El servidor ja es troba en la llista de servidors de confiança.",
|
||||
"No server to federate with found" : "No s'ha trobat cap servidor amb què federar-se",
|
||||
"Could not add server" : "No s'ha pogut afegir el servidor",
|
||||
"Federation" : "Federació",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory." : "La federació us permet connectar amb altres servidors de confiança per a intercanviar el directori d'usuari.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació us permet connectar amb altres servidors de confiança per a intercanviar directoris d\\'usuari. Per exemple, això s\\'utilitzarà per als usuaris externs d'auto-completat per a l\\'ús compartit federat.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar la carpeta d'usuari.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar carpetes d'usuari. Per exemple, s'utilitzarà per a proporcionar resultats d'emplenament automàtic d'usuaris externs per a l'ús compartit federat.",
|
||||
"Trusted servers" : "Servidors de confiança",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La federació li permet connectar-se amb altres servidors de confiança per intercanviar el directori d'usuari. Per exemple, això s'utilitzarà per completar automàticament els usuaris externs per a l'ús compartit federat. No cal afegir un servidor com a servidor de confiança per crear una compartició federada.",
|
||||
"Add server automatically once a federated share was created successfully" : "Afegeix servidor automàticament quan s'hagi creat una federació correctament",
|
||||
"+ Add trusted server" : "+ Afegeix servidor de confiança",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar carpetes d'usuari. Per exemple, s'utilitzarà per a proporcionar resultats d'emplenament automàtic d'usuaris externs per a l'ús compartit federat. No cal afegir un servidor com a servidor de confiança per a crear un recurs d'ús compartit federat.",
|
||||
"Add server automatically once a federated share was created successfully" : "Afegeix un servidor automàticament quan es creï un recurs d'ús compartit federat correctament",
|
||||
"+ Add trusted server" : "+ Afegeix un servidor de confiança",
|
||||
"Trusted server" : "Servidor de confiança",
|
||||
"Add" : "Afegeix"
|
||||
},
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
{ "translations": {
|
||||
"Added to the list of trusted servers" : "Afegeix a la llista de servidors de confiança",
|
||||
"Server is already in the list of trusted servers." : "El servidor ja està a la llista de servidors de confiança.",
|
||||
"No server to federate with found" : "No s'ha trobat cap servidor federat",
|
||||
"Added to the list of trusted servers" : "S'ha afegit a la llista de servidors de confiança",
|
||||
"Server is already in the list of trusted servers." : "El servidor ja es troba en la llista de servidors de confiança.",
|
||||
"No server to federate with found" : "No s'ha trobat cap servidor amb què federar-se",
|
||||
"Could not add server" : "No s'ha pogut afegir el servidor",
|
||||
"Federation" : "Federació",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory." : "La federació us permet connectar amb altres servidors de confiança per a intercanviar el directori d'usuari.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació us permet connectar amb altres servidors de confiança per a intercanviar directoris d\\'usuari. Per exemple, això s\\'utilitzarà per als usuaris externs d'auto-completat per a l\\'ús compartit federat.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar la carpeta d'usuari.",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar carpetes d'usuari. Per exemple, s'utilitzarà per a proporcionar resultats d'emplenament automàtic d'usuaris externs per a l'ús compartit federat.",
|
||||
"Trusted servers" : "Servidors de confiança",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La federació li permet connectar-se amb altres servidors de confiança per intercanviar el directori d'usuari. Per exemple, això s'utilitzarà per completar automàticament els usuaris externs per a l'ús compartit federat. No cal afegir un servidor com a servidor de confiança per crear una compartició federada.",
|
||||
"Add server automatically once a federated share was created successfully" : "Afegeix servidor automàticament quan s'hagi creat una federació correctament",
|
||||
"+ Add trusted server" : "+ Afegeix servidor de confiança",
|
||||
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "La federació us permet connectar-vos amb altres servidors de confiança per a intercanviar carpetes d'usuari. Per exemple, s'utilitzarà per a proporcionar resultats d'emplenament automàtic d'usuaris externs per a l'ús compartit federat. No cal afegir un servidor com a servidor de confiança per a crear un recurs d'ús compartit federat.",
|
||||
"Add server automatically once a federated share was created successfully" : "Afegeix un servidor automàticament quan es creï un recurs d'ús compartit federat correctament",
|
||||
"+ Add trusted server" : "+ Afegeix un servidor de confiança",
|
||||
"Trusted server" : "Servidor de confiança",
|
||||
"Add" : "Afegeix"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
|
||||
@@ -31,7 +31,6 @@ namespace OCA\Federation\BackgroundJob;
|
||||
|
||||
use GuzzleHttp\Exception\ClientException;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use GuzzleHttp\Ring\Exception\RingException;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
@@ -191,14 +190,7 @@ class GetSharedSecret extends Job {
|
||||
'level' => ILogger::INFO,
|
||||
'app' => 'federation',
|
||||
]);
|
||||
} catch (RingException $e) {
|
||||
$status = -1; // There is no status code if we could not connect
|
||||
$this->logger->logException($e, [
|
||||
'message' => 'Could not connect to ' . $target,
|
||||
'level' => ILogger::INFO,
|
||||
'app' => 'federation',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
} catch (\Throwable $e) {
|
||||
$status = Http::STATUS_INTERNAL_SERVER_ERROR;
|
||||
$this->logger->logException($e, ['app' => 'federation']);
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ namespace OCA\Federation\BackgroundJob;
|
||||
|
||||
use GuzzleHttp\Exception\ClientException;
|
||||
use GuzzleHttp\Exception\RequestException;
|
||||
use GuzzleHttp\Ring\Exception\RingException;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCP\AppFramework\Http;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
@@ -184,10 +183,7 @@ class RequestSharedSecret extends Job {
|
||||
} catch (RequestException $e) {
|
||||
$status = -1; // There is no status code if we could not connect
|
||||
$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
|
||||
} catch (RingException $e) {
|
||||
$status = -1; // There is no status code if we could not connect
|
||||
$this->logger->info('Could not connect to ' . $target, ['app' => 'federation']);
|
||||
} catch (\Exception $e) {
|
||||
} catch (\Throwable $e) {
|
||||
$status = Http::STATUS_INTERNAL_SERVER_ERROR;
|
||||
$this->logger->logException($e, ['app' => 'federation']);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
namespace OCA\Federation\Tests\BackgroundJob;
|
||||
|
||||
use GuzzleHttp\Exception\ConnectException;
|
||||
use GuzzleHttp\Ring\Exception\RingException;
|
||||
use OCA\Federation\BackgroundJob\GetSharedSecret;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCA\Files_Sharing\Tests\TestCase;
|
||||
@@ -298,41 +297,4 @@ class GetSharedSecretTest extends TestCase {
|
||||
|
||||
$this->assertTrue($this->invokePrivate($this->getSharedSecret, 'retainJob'));
|
||||
}
|
||||
|
||||
public function testRunRingException() {
|
||||
$target = 'targetURL';
|
||||
$source = 'sourceURL';
|
||||
$token = 'token';
|
||||
|
||||
$argument = ['url' => $target, 'token' => $token];
|
||||
|
||||
$this->timeFactory->method('getTime')
|
||||
->willReturn(42);
|
||||
|
||||
$this->urlGenerator
|
||||
->expects($this->once())
|
||||
->method('getAbsoluteURL')
|
||||
->with('/')
|
||||
->willReturn($source);
|
||||
$this->httpClient->expects($this->once())->method('get')
|
||||
->with(
|
||||
$target . '/ocs/v2.php/apps/federation/api/v1/shared-secret',
|
||||
[
|
||||
'query' =>
|
||||
[
|
||||
'url' => $source,
|
||||
'token' => $token,
|
||||
'format' => 'json',
|
||||
],
|
||||
'timeout' => 3,
|
||||
'connect_timeout' => 3,
|
||||
]
|
||||
)->willThrowException($this->createMock(RingException::class));
|
||||
|
||||
$this->trustedServers->expects($this->never())->method('addSharedSecret');
|
||||
|
||||
$this->invokePrivate($this->getSharedSecret, 'run', [$argument]);
|
||||
|
||||
$this->assertTrue($this->invokePrivate($this->getSharedSecret, 'retainJob'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
namespace OCA\Federation\Tests\BackgroundJob;
|
||||
|
||||
use GuzzleHttp\Exception\ConnectException;
|
||||
use GuzzleHttp\Ring\Exception\RingException;
|
||||
use OCA\Federation\BackgroundJob\RequestSharedSecret;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCP\AppFramework\Http;
|
||||
@@ -279,40 +278,4 @@ class RequestSharedSecretTest extends TestCase {
|
||||
$this->invokePrivate($this->requestSharedSecret, 'run', [$argument]);
|
||||
$this->assertTrue($this->invokePrivate($this->requestSharedSecret, 'retainJob'));
|
||||
}
|
||||
|
||||
public function testRunRingException() {
|
||||
$target = 'targetURL';
|
||||
$source = 'sourceURL';
|
||||
$token = 'token';
|
||||
|
||||
$argument = ['url' => $target, 'token' => $token];
|
||||
|
||||
$this->timeFactory->method('getTime')->willReturn(42);
|
||||
|
||||
$this->urlGenerator
|
||||
->expects($this->once())
|
||||
->method('getAbsoluteURL')
|
||||
->with('/')
|
||||
->willReturn($source);
|
||||
|
||||
$this->httpClient
|
||||
->expects($this->once())
|
||||
->method('post')
|
||||
->with(
|
||||
$target . '/ocs/v2.php/apps/federation/api/v1/request-shared-secret',
|
||||
[
|
||||
'body' =>
|
||||
[
|
||||
'url' => $source,
|
||||
'token' => $token,
|
||||
'format' => 'json',
|
||||
],
|
||||
'timeout' => 3,
|
||||
'connect_timeout' => 3,
|
||||
]
|
||||
)->willThrowException($this->createMock(RingException::class));
|
||||
|
||||
$this->invokePrivate($this->requestSharedSecret, 'run', [$argument]);
|
||||
$this->assertTrue($this->invokePrivate($this->requestSharedSecret, 'retainJob'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -586,7 +586,10 @@ OC.Uploader.prototype = _.extend({
|
||||
_.each(uploads, function(upload) {
|
||||
self._uploads[upload.data.uploadId] = upload;
|
||||
});
|
||||
self.totalToUpload = _.reduce(uploads, function(memo, upload) { return memo+upload.getFile().size; }, 0);
|
||||
if (!self._uploading) {
|
||||
self.totalToUpload = 0;
|
||||
}
|
||||
self.totalToUpload += _.reduce(uploads, function(memo, upload) { return memo+upload.getFile().size; }, 0);
|
||||
var semaphore = new OCA.Files.Semaphore(5);
|
||||
var promises = _.map(uploads, function(upload) {
|
||||
return semaphore.acquire().then(function(){
|
||||
|
||||
@@ -114,7 +114,7 @@ OC.L10N.register(
|
||||
"Restored by {user}" : "Obnovil(a) {user}",
|
||||
"Renamed by {user}" : "Přejmenoval(a) {user}",
|
||||
"Moved by {user}" : "Přesunul(a) {user}",
|
||||
"\"remote user\"" : "„uživatel na protějšku“",
|
||||
"\"remote user\"" : "„federovaný uživatel“",
|
||||
"You created {file}" : "Vytvořili jste {file}",
|
||||
"You created an encrypted file in {file}" : "Vytvořili jste šifrovaný soubor v {file}",
|
||||
"{user} created {file}" : "{user} vytvořil(a) {file}",
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
"Restored by {user}" : "Obnovil(a) {user}",
|
||||
"Renamed by {user}" : "Přejmenoval(a) {user}",
|
||||
"Moved by {user}" : "Přesunul(a) {user}",
|
||||
"\"remote user\"" : "„uživatel na protějšku“",
|
||||
"\"remote user\"" : "„federovaný uživatel“",
|
||||
"You created {file}" : "Vytvořili jste {file}",
|
||||
"You created an encrypted file in {file}" : "Vytvořili jste šifrovaný soubor v {file}",
|
||||
"{user} created {file}" : "{user} vytvořil(a) {file}",
|
||||
|
||||
@@ -30,7 +30,7 @@ OC.L10N.register(
|
||||
"Actions" : "Aktionen",
|
||||
"Rename" : "Umbenennen",
|
||||
"Copy" : "Kopieren",
|
||||
"Choose target folder" : "Zielordner wählen",
|
||||
"Choose target folder" : "Zielordner auswählen",
|
||||
"Open" : "Öffnen",
|
||||
"Delete file" : "Datei löschen",
|
||||
"Delete folder" : "Ordner löschen",
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"Actions" : "Aktionen",
|
||||
"Rename" : "Umbenennen",
|
||||
"Copy" : "Kopieren",
|
||||
"Choose target folder" : "Zielordner wählen",
|
||||
"Choose target folder" : "Zielordner auswählen",
|
||||
"Open" : "Öffnen",
|
||||
"Delete file" : "Datei löschen",
|
||||
"Delete folder" : "Ordner löschen",
|
||||
|
||||
@@ -80,8 +80,12 @@ OC.L10N.register(
|
||||
"\"/\" is not allowed inside a file name." : "אסור להשתמש ב־„/” בתוך שם קובץ.",
|
||||
"\"{name}\" is not an allowed filetype" : "סוד הקובץ „{name}” אינו מורשה",
|
||||
"Storage of {owner} is full, files can not be updated or synced anymore!" : "האחסון של {owner} מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
|
||||
"Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "תיקיית הקבוצה \"{mountPoint}\" מלאה, לא ניתן לעדכן או לסנכרן קבצים יותר!",
|
||||
"External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "האחסון החיצוני \"{mountPoint}\" מלא, לא ניתן לעדכן או לסנכרן קבצים יותר!",
|
||||
"Your storage is full, files can not be updated or synced anymore!" : "האחסון שלך מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%).",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "התיקיה הקבוצתית \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%).",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%).",
|
||||
"Your storage is almost full ({usedSpacePercent}%)." : "האחסון שלך כמעט מלא ({usedSpacePercent}%).",
|
||||
"_matches '{filter}'_::_match '{filter}'_" : ["מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'"],
|
||||
"View in folder" : "הצג בתיקייה",
|
||||
@@ -189,6 +193,8 @@ OC.L10N.register(
|
||||
"New text file.txt" : "קובץ טקסט חדש.txt",
|
||||
"Unshare" : "הסר שיתוף",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%)",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "תיקיית הקבוצה \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%)",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%)",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)",
|
||||
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "קובץ או תיקייה <strong>נערכו</strong> או ש<strong>שמם השתנה</strong>",
|
||||
"A new file or folder has been <strong>created</strong>" : "קובץ או תיקייה חדשים <strong>נוצרו<strong/>",
|
||||
|
||||
@@ -78,8 +78,12 @@
|
||||
"\"/\" is not allowed inside a file name." : "אסור להשתמש ב־„/” בתוך שם קובץ.",
|
||||
"\"{name}\" is not an allowed filetype" : "סוד הקובץ „{name}” אינו מורשה",
|
||||
"Storage of {owner} is full, files can not be updated or synced anymore!" : "האחסון של {owner} מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
|
||||
"Group folder \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "תיקיית הקבוצה \"{mountPoint}\" מלאה, לא ניתן לעדכן או לסנכרן קבצים יותר!",
|
||||
"External storage \"{mountPoint}\" is full, files can not be updated or synced anymore!" : "האחסון החיצוני \"{mountPoint}\" מלא, לא ניתן לעדכן או לסנכרן קבצים יותר!",
|
||||
"Your storage is full, files can not be updated or synced anymore!" : "האחסון שלך מלא, כבר לא ניתן לעדכן ולסנכרן קבצים!",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%).",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "התיקיה הקבוצתית \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%).",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%).",
|
||||
"Your storage is almost full ({usedSpacePercent}%)." : "האחסון שלך כמעט מלא ({usedSpacePercent}%).",
|
||||
"_matches '{filter}'_::_match '{filter}'_" : ["מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'","מתאים ל- '{filter}'"],
|
||||
"View in folder" : "הצג בתיקייה",
|
||||
@@ -187,6 +191,8 @@
|
||||
"New text file.txt" : "קובץ טקסט חדש.txt",
|
||||
"Unshare" : "הסר שיתוף",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "האחסון של {owner} כמעט מלא ({usedSpacePercent}%)",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "תיקיית הקבוצה \"{mountPoint}\" כמעט מלאה ({usedSpacePercent}%)",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "האחסון החיצוני \"{mountPoint}\" כמעט מלא ({usedSpacePercent}%)",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)",
|
||||
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "קובץ או תיקייה <strong>נערכו</strong> או ש<strong>שמם השתנה</strong>",
|
||||
"A new file or folder has been <strong>created</strong>" : "קובץ או תיקייה חדשים <strong>נוצרו<strong/>",
|
||||
|
||||
@@ -85,7 +85,7 @@ OC.L10N.register(
|
||||
"Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).\n ",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
|
||||
"Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
|
||||
"_matches '{filter}'_::_match '{filter}'_" : ["coincide com '{filter}'","coincide com '{filter}'"],
|
||||
"View in folder" : "Exibir na pasta",
|
||||
@@ -115,7 +115,7 @@ OC.L10N.register(
|
||||
"Renamed by {user}" : "Renomeado por {user}",
|
||||
"Moved by {user}" : "Movido por {user}",
|
||||
"\"remote user\"" : "\"usuário remoto\"",
|
||||
"You created {file}" : "Você criou o arquivo {file}",
|
||||
"You created {file}" : "Você criou {file}",
|
||||
"You created an encrypted file in {file}" : "Você criou um arquivo criptografado em {file}",
|
||||
"{user} created {file}" : "{user} criou {file}",
|
||||
"{user} created an encrypted file in {file}" : "{user} criou um arquivo criptografado em {file}",
|
||||
@@ -132,8 +132,8 @@ OC.L10N.register(
|
||||
"{user} restored {file}" : "{user} restaurou {file}",
|
||||
"You renamed {oldfile} to {newfile}" : "Você renomeou o arquivo {oldfile} para {newfile}",
|
||||
"{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
|
||||
"You moved {oldfile} to {newfile}" : "Você moveu o arquivo {oldfile} para {newfile}",
|
||||
"{user} moved {oldfile} to {newfile}" : "{user} moveu o arquivo {oldfile} para {newfile}",
|
||||
"You moved {oldfile} to {newfile}" : "Você moveu {oldfile} para {newfile}",
|
||||
"{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
|
||||
"A file has been added to or removed from your <strong>favorites</strong>" : "Um arquivo foi adicionado ou excluído de seus <strong>favoritos</strong>",
|
||||
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
|
||||
"A favorite file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta favorita foi <strong>modificado</strong>",
|
||||
@@ -193,6 +193,8 @@ OC.L10N.register(
|
||||
"New text file.txt" : "Novo texto file.txt",
|
||||
"Unshare" : "Descompartilhar",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%)",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%)",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%)",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" : "Seu armazenamento está quase cheio ({usedSpacePercent}%)",
|
||||
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>",
|
||||
"A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>",
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
"Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio e arquivos não podem mais ser atualizados ou sincronizados!",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%).",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%).",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).\n ",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%).",
|
||||
"Your storage is almost full ({usedSpacePercent}%)." : "Seu armazenamento está quase cheio ({usedSpacePercent}%).",
|
||||
"_matches '{filter}'_::_match '{filter}'_" : ["coincide com '{filter}'","coincide com '{filter}'"],
|
||||
"View in folder" : "Exibir na pasta",
|
||||
@@ -113,7 +113,7 @@
|
||||
"Renamed by {user}" : "Renomeado por {user}",
|
||||
"Moved by {user}" : "Movido por {user}",
|
||||
"\"remote user\"" : "\"usuário remoto\"",
|
||||
"You created {file}" : "Você criou o arquivo {file}",
|
||||
"You created {file}" : "Você criou {file}",
|
||||
"You created an encrypted file in {file}" : "Você criou um arquivo criptografado em {file}",
|
||||
"{user} created {file}" : "{user} criou {file}",
|
||||
"{user} created an encrypted file in {file}" : "{user} criou um arquivo criptografado em {file}",
|
||||
@@ -130,8 +130,8 @@
|
||||
"{user} restored {file}" : "{user} restaurou {file}",
|
||||
"You renamed {oldfile} to {newfile}" : "Você renomeou o arquivo {oldfile} para {newfile}",
|
||||
"{user} renamed {oldfile} to {newfile}" : "{user} renomeou {oldfile} para {newfile}",
|
||||
"You moved {oldfile} to {newfile}" : "Você moveu o arquivo {oldfile} para {newfile}",
|
||||
"{user} moved {oldfile} to {newfile}" : "{user} moveu o arquivo {oldfile} para {newfile}",
|
||||
"You moved {oldfile} to {newfile}" : "Você moveu {oldfile} para {newfile}",
|
||||
"{user} moved {oldfile} to {newfile}" : "{user} moveu {oldfile} para {newfile}",
|
||||
"A file has been added to or removed from your <strong>favorites</strong>" : "Um arquivo foi adicionado ou excluído de seus <strong>favoritos</strong>",
|
||||
"A file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta foi <strong>modificado</strong>",
|
||||
"A favorite file or folder has been <strong>changed</strong>" : "Um arquivo ou pasta favorita foi <strong>modificado</strong>",
|
||||
@@ -191,6 +191,8 @@
|
||||
"New text file.txt" : "Novo texto file.txt",
|
||||
"Unshare" : "Descompartilhar",
|
||||
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "O armazenamento do {owner} está quase cheio ({usedSpacePercent}%)",
|
||||
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "A pasta de grupo \"{mountPoint}\" está quase cheia ({usedSpacePercent}%)",
|
||||
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)" : "O armazenamento externo \"{mountPoint}\" está quase cheio ({usedSpacePercent}%)",
|
||||
"Your storage is almost full ({usedSpacePercent}%)" : "Seu armazenamento está quase cheio ({usedSpacePercent}%)",
|
||||
"A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Um arquivo ou pasta foi <strong>alterado</strong> ou <strong>renomeado</strong>",
|
||||
"A new file or folder has been <strong>created</strong>" : "Um novo arquivo ou pasta foi <strong>criado</strong>",
|
||||
|
||||
@@ -236,7 +236,7 @@ class Scan extends Base {
|
||||
/**
|
||||
* Processes PHP errors as exceptions in order to be able to keep track of problems
|
||||
*
|
||||
* @see https://secure.php.net/manual/en/function.set-error-handler.php
|
||||
* @see https://www.php.net/manual/en/function.set-error-handler.php
|
||||
*
|
||||
* @param int $severity the level of the error raised
|
||||
* @param string $message
|
||||
|
||||
@@ -183,7 +183,7 @@ class ScanAppData extends Base {
|
||||
/**
|
||||
* Processes PHP errors as exceptions in order to be able to keep track of problems
|
||||
*
|
||||
* @see https://secure.php.net/manual/en/function.set-error-handler.php
|
||||
* @see https://www.php.net/manual/en/function.set-error-handler.php
|
||||
*
|
||||
* @param int $severity the level of the error raised
|
||||
* @param string $message
|
||||
|
||||
@@ -119,7 +119,7 @@ class NativeShare extends AbstractShare {
|
||||
* Multibyte unicode safe version of basename()
|
||||
*
|
||||
* @param string $path
|
||||
* @link http://php.net/manual/en/function.basename.php#121405
|
||||
* @link https://www.php.net/manual/en/function.basename.php#121405
|
||||
* @return string
|
||||
*/
|
||||
protected static function mb_basename($path) {
|
||||
|
||||
@@ -91,7 +91,7 @@ OC.L10N.register(
|
||||
"Legacy (v2) authentication" : "Starší (v2) ověřování",
|
||||
"WebDAV" : "WebDAV",
|
||||
"URL" : "URL",
|
||||
"Remote subfolder" : "Podsložka na protějšku",
|
||||
"Remote subfolder" : "Federovaná podsložka",
|
||||
"Secure https://" : "Zabezpečené https://",
|
||||
"FTP" : "FTP",
|
||||
"Host" : "Hostitel",
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"Legacy (v2) authentication" : "Starší (v2) ověřování",
|
||||
"WebDAV" : "WebDAV",
|
||||
"URL" : "URL",
|
||||
"Remote subfolder" : "Podsložka na protějšku",
|
||||
"Remote subfolder" : "Federovaná podsložka",
|
||||
"Secure https://" : "Zabezpečené https://",
|
||||
"FTP" : "FTP",
|
||||
"Host" : "Hostitel",
|
||||
|
||||
@@ -112,7 +112,12 @@ OC.L10N.register(
|
||||
"OpenStack Object Storage" : "Shramba predmeta OpenStack",
|
||||
"Service name" : "Ime storitve",
|
||||
"Request timeout (seconds)" : "Zahtevan časovni zamik (sekunde)",
|
||||
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podpora za cURL prek PHP ni omogočena ali nameščena. Priklapljanje %s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podpora za FTP prek PHP ni omogočena ali nameščena. Priklapljanje %s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "Paket »%1$s« ni nameščen. Priklapljanje %2$s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"External storage support" : "Podpora zunanji dhrambi",
|
||||
"Adds basic external storage support" : "Doda osnovno zunanjo podporo shrambe",
|
||||
"No external storage configured or you don't have the permission to configure them" : "Ni nastavljene zunanje shrambe ali pa ni ustreznih dovoljenj za nastavljanje.",
|
||||
"Name" : "Ime",
|
||||
"Storage type" : "Vrsta shrambe",
|
||||
"Scope" : "Obseg",
|
||||
|
||||
@@ -110,7 +110,12 @@
|
||||
"OpenStack Object Storage" : "Shramba predmeta OpenStack",
|
||||
"Service name" : "Ime storitve",
|
||||
"Request timeout (seconds)" : "Zahtevan časovni zamik (sekunde)",
|
||||
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podpora za cURL prek PHP ni omogočena ali nameščena. Priklapljanje %s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podpora za FTP prek PHP ni omogočena ali nameščena. Priklapljanje %s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "Paket »%1$s« ni nameščen. Priklapljanje %2$s zato ni mogoče. Stopite v stik s skrbnikom sistema, da namesti ustrezne pakete.",
|
||||
"External storage support" : "Podpora zunanji dhrambi",
|
||||
"Adds basic external storage support" : "Doda osnovno zunanjo podporo shrambe",
|
||||
"No external storage configured or you don't have the permission to configure them" : "Ni nastavljene zunanje shrambe ali pa ni ustreznih dovoljenj za nastavljanje.",
|
||||
"Name" : "Ime",
|
||||
"Storage type" : "Vrsta shrambe",
|
||||
"Scope" : "Obseg",
|
||||
|
||||
@@ -441,7 +441,7 @@ class SMB extends Common implements INotifyStorage {
|
||||
/**
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
* @return resource|false
|
||||
* @return resource|bool
|
||||
*/
|
||||
public function fopen($path, $mode) {
|
||||
$fullPath = $this->buildPath($path);
|
||||
|
||||
@@ -151,7 +151,7 @@ OC.L10N.register(
|
||||
"group" : "skupina",
|
||||
"conversation" : "konverzace",
|
||||
"remote" : "vzdálené",
|
||||
"remote group" : "skupina na protěšjku",
|
||||
"remote group" : "federovaná skupina",
|
||||
"guest" : "host",
|
||||
"Shared with the group {user} by {owner}" : "{owner} sdílí se skupinou {user}",
|
||||
"Shared with the conversation {user} by {owner}" : "{owner} sdílí konverzaci {user}",
|
||||
|
||||
@@ -149,7 +149,7 @@
|
||||
"group" : "skupina",
|
||||
"conversation" : "konverzace",
|
||||
"remote" : "vzdálené",
|
||||
"remote group" : "skupina na protěšjku",
|
||||
"remote group" : "federovaná skupina",
|
||||
"guest" : "host",
|
||||
"Shared with the group {user} by {owner}" : "{owner} sdílí se skupinou {user}",
|
||||
"Shared with the conversation {user} by {owner}" : "{owner} sdílí konverzaci {user}",
|
||||
|
||||
@@ -162,8 +162,8 @@ OC.L10N.register(
|
||||
"Link copied" : "Link gekopieerd",
|
||||
"Cannot copy, please copy the link manually" : "Kan niet kopiëren, kopieer de link handmatig",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord",
|
||||
"Only works for users with access to this folder" : "Dit werkt enkel voor gebruikers met toegang tot deze map",
|
||||
"Only works for users with access to this file" : "Dit werkt enkel voor gebruikers met toegang tot dit bestand",
|
||||
"Only works for users with access to this folder" : "Dit werkt alleen voor gebruikers met toegang tot deze map",
|
||||
"Only works for users with access to this file" : "Dit werkt alleen voor gebruikers met toegang tot dit bestand",
|
||||
"Please enter the following required information before creating the share" : "Geef de volgend verplichte gegevens op voor het aanmaken van de deellink",
|
||||
"Password protection (enforced)" : "Wachtwoordbeveiliging (afgedwongen)",
|
||||
"Password protection" : "Wachtwoordbeveiliging",
|
||||
@@ -181,6 +181,7 @@ OC.L10N.register(
|
||||
"Enter a note for the share recipient" : "Geef een notitie op voor de share-ontvanger",
|
||||
"Add another link" : "Nog een link toevoegen ",
|
||||
"Create a new share link" : "Creëer een nieuwe deellink",
|
||||
"{shareWith} by {initiator}" : "{shareWith} door {initiator}",
|
||||
"Shared via link by {initiator}" : "Gedeeld via link door {initiator}",
|
||||
"Share link ({label})" : "Link delen ({label})",
|
||||
"Share link" : "Delen link",
|
||||
|
||||
@@ -160,8 +160,8 @@
|
||||
"Link copied" : "Link gekopieerd",
|
||||
"Cannot copy, please copy the link manually" : "Kan niet kopiëren, kopieer de link handmatig",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord",
|
||||
"Only works for users with access to this folder" : "Dit werkt enkel voor gebruikers met toegang tot deze map",
|
||||
"Only works for users with access to this file" : "Dit werkt enkel voor gebruikers met toegang tot dit bestand",
|
||||
"Only works for users with access to this folder" : "Dit werkt alleen voor gebruikers met toegang tot deze map",
|
||||
"Only works for users with access to this file" : "Dit werkt alleen voor gebruikers met toegang tot dit bestand",
|
||||
"Please enter the following required information before creating the share" : "Geef de volgend verplichte gegevens op voor het aanmaken van de deellink",
|
||||
"Password protection (enforced)" : "Wachtwoordbeveiliging (afgedwongen)",
|
||||
"Password protection" : "Wachtwoordbeveiliging",
|
||||
@@ -179,6 +179,7 @@
|
||||
"Enter a note for the share recipient" : "Geef een notitie op voor de share-ontvanger",
|
||||
"Add another link" : "Nog een link toevoegen ",
|
||||
"Create a new share link" : "Creëer een nieuwe deellink",
|
||||
"{shareWith} by {initiator}" : "{shareWith} door {initiator}",
|
||||
"Shared via link by {initiator}" : "Gedeeld via link door {initiator}",
|
||||
"Share link ({label})" : "Link delen ({label})",
|
||||
"Share link" : "Delen link",
|
||||
|
||||
@@ -55,8 +55,8 @@ OC.L10N.register(
|
||||
"{actor} shared {file} with group {group}" : "{actor} compartilhou {file} com o grupo {group}",
|
||||
"{actor} removed group {group} from {file}" : "{actor} excluiu o grupo {group} de {file}",
|
||||
"Share for file {file} with group {group} expired" : "Compartilhamento do arquivo {file} com o grupo {group} expirado",
|
||||
"Shared as public link" : "Compartilhado como um link público",
|
||||
"Removed public link" : "Excluído o link público",
|
||||
"Shared as public link" : "Compartilhado como link público",
|
||||
"Removed public link" : "Removido link público",
|
||||
"Public link expired" : "O link público expirou",
|
||||
"{actor} shared as public link" : "{actor} compartilhou como um link público",
|
||||
"{actor} removed public link" : "{actor} excluiu o link público",
|
||||
|
||||
@@ -53,8 +53,8 @@
|
||||
"{actor} shared {file} with group {group}" : "{actor} compartilhou {file} com o grupo {group}",
|
||||
"{actor} removed group {group} from {file}" : "{actor} excluiu o grupo {group} de {file}",
|
||||
"Share for file {file} with group {group} expired" : "Compartilhamento do arquivo {file} com o grupo {group} expirado",
|
||||
"Shared as public link" : "Compartilhado como um link público",
|
||||
"Removed public link" : "Excluído o link público",
|
||||
"Shared as public link" : "Compartilhado como link público",
|
||||
"Removed public link" : "Removido link público",
|
||||
"Public link expired" : "O link público expirou",
|
||||
"{actor} shared as public link" : "{actor} compartilhou como um link público",
|
||||
"{actor} removed public link" : "{actor} excluiu o link público",
|
||||
|
||||
@@ -181,6 +181,7 @@ OC.L10N.register(
|
||||
"Enter a note for the share recipient" : "Ange en notering till mottagaren",
|
||||
"Add another link" : "Lägg till en annan länk",
|
||||
"Create a new share link" : "Skapa en ny delad länk",
|
||||
"{shareWith} by {initiator}" : "{shareWith} av {initiator}",
|
||||
"Shared via link by {initiator}" : "Delad via länk av {initiator}",
|
||||
"Share link ({label})" : "Dela länk ({label})",
|
||||
"Share link" : "Dela länk",
|
||||
|
||||
@@ -179,6 +179,7 @@
|
||||
"Enter a note for the share recipient" : "Ange en notering till mottagaren",
|
||||
"Add another link" : "Lägg till en annan länk",
|
||||
"Create a new share link" : "Skapa en ny delad länk",
|
||||
"{shareWith} by {initiator}" : "{shareWith} av {initiator}",
|
||||
"Shared via link by {initiator}" : "Delad via länk av {initiator}",
|
||||
"Share link ({label})" : "Dela länk ({label})",
|
||||
"Share link" : "Dela länk",
|
||||
|
||||
@@ -297,7 +297,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto
|
||||
}
|
||||
|
||||
/**
|
||||
* see http://php.net/manual/en/function.rename.php
|
||||
* see https://www.php.net/manual/en/function.rename.php
|
||||
*
|
||||
* @param string $path1
|
||||
* @param string $path2
|
||||
|
||||
@@ -45,10 +45,9 @@ class Version1010Date20200630192639 extends SimpleMigrationStep {
|
||||
|
||||
if (!$schema->hasTable('files_trash')) {
|
||||
$table = $schema->createTable('files_trash');
|
||||
$table->addColumn('auto_id', Types::INTEGER, [
|
||||
$table->addColumn('auto_id', Types::BIGINT, [
|
||||
'autoincrement' => true,
|
||||
'notnull' => true,
|
||||
'length' => 4,
|
||||
]);
|
||||
$table->addColumn('id', Types::STRING, [
|
||||
'notnull' => true,
|
||||
|
||||
@@ -2,6 +2,7 @@ OC.L10N.register(
|
||||
"provisioning_api",
|
||||
{
|
||||
"Provisioning API" : "API de provisionnement",
|
||||
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Cette application active un ensemble d'API que les systèmes externes peuvent utiliser pour gérer les utilisateurs, les groupes et les applications."
|
||||
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Cette application active un ensemble d'API que les systèmes externes peuvent utiliser pour gérer les utilisateurs, les groupes et les applications.",
|
||||
"This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Cette application active un ensemble d'API qui peuvent être utilisées par un système externe pour créer, modifier, supprimer et rechercher des attributs d'utilisateur, rechercher, ajouter et retirer des groupes, fixer des quotas et rechercher l'espace de stockage total utilisé sur Nextcloud. Les administrateurs de groupe peuvent aussi rechercher Nextcloud et accéder aux même fonctionnalités que les administrateurs pour les groupes dont ils ont la gestion. L'API permet aussi à un administrateur de rechercher les applications Nextcloud actives et les informations d'application ainsi que d'activer et désactiver les applications à distance. Une fois l'application activée, des requêtes HTTP peuvent être utilisées au moyen d'un entête Basic Auth pour exécuter chacune des fonctionnalités listées ci-dessus. Des informations supplémentaires sont accessibles dans la documentation sur l'API de provisionnement, avec des exemples de demandes et réponses serveur."
|
||||
},
|
||||
"nplurals=2; plural=(n > 1);");
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{ "translations": {
|
||||
"Provisioning API" : "API de provisionnement",
|
||||
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Cette application active un ensemble d'API que les systèmes externes peuvent utiliser pour gérer les utilisateurs, les groupes et les applications."
|
||||
"This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Cette application active un ensemble d'API que les systèmes externes peuvent utiliser pour gérer les utilisateurs, les groupes et les applications.",
|
||||
"This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Cette application active un ensemble d'API qui peuvent être utilisées par un système externe pour créer, modifier, supprimer et rechercher des attributs d'utilisateur, rechercher, ajouter et retirer des groupes, fixer des quotas et rechercher l'espace de stockage total utilisé sur Nextcloud. Les administrateurs de groupe peuvent aussi rechercher Nextcloud et accéder aux même fonctionnalités que les administrateurs pour les groupes dont ils ont la gestion. L'API permet aussi à un administrateur de rechercher les applications Nextcloud actives et les informations d'application ainsi que d'activer et désactiver les applications à distance. Une fois l'application activée, des requêtes HTTP peuvent être utilisées au moyen d'un entête Basic Auth pour exécuter chacune des fonctionnalités listées ci-dessus. Des informations supplémentaires sont accessibles dans la documentation sur l'API de provisionnement, avec des exemples de demandes et réponses serveur."
|
||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||
}
|
||||
@@ -256,10 +256,10 @@ window.addEventListener('DOMContentLoaded', function(){
|
||||
// run setup checks then gather error messages
|
||||
$.when(
|
||||
OC.SetupChecks.checkWebDAV(),
|
||||
OC.SetupChecks.checkWellKnownUrl('/.well-known/webfinger', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true && !!OC.appConfig.core.public_webfinger, [200, 404]),
|
||||
OC.SetupChecks.checkWellKnownUrl('/.well-known/nodeinfo', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true && !!OC.appConfig.core.public_nodeinfo, [200, 404]),
|
||||
OC.SetupChecks.checkWellKnownUrl('/.well-known/caldav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkWellKnownUrl('/.well-known/carddav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/webfinger', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
||||
OC.SetupChecks.checkWellKnownUrl('GET', '/.well-known/nodeinfo', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true, [200, 404], true),
|
||||
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/caldav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkWellKnownUrl('PROPFIND', '/.well-known/carddav', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocm-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkProviderUrl(OC.getRootPath() + '/ocs-provider/', OC.theme.docPlaceholderUrl, $('#postsetupchecks').data('check-wellknown') === true),
|
||||
OC.SetupChecks.checkSetup(),
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user