Compare commits
300 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d47c589b04 | |||
| 3067040a30 | |||
| b9e59bae37 | |||
| 8ebd903790 | |||
| 1a88648e0d | |||
| f79e451b4a | |||
| 8438e8bb83 | |||
| 5c5cae891c | |||
| 50cd11b583 | |||
| 96b8afe485 | |||
| 6bf3be3877 | |||
| 2b3b8af6e8 | |||
| 39c9bdd752 | |||
| 0ab64baa0e | |||
| ba01c08acb | |||
| 80c95de8f2 | |||
| 48bd8d9686 | |||
| cc5ae2aba7 | |||
| cc92cdb240 | |||
| 069703f9d8 | |||
| 2972d35602 | |||
| 26dbe006df | |||
| cb6b995e07 | |||
| c82d62a03c | |||
| 1f49bf560a | |||
| 23744e7745 | |||
| 6fe9f1df7a | |||
| dc7d7b7df9 | |||
| c3da32f83b | |||
| 71b6b86008 | |||
| db197999cd | |||
| fe1806c5a7 | |||
| e9e252a94b | |||
| a283b956d1 | |||
| af440186f3 | |||
| a25c0d580c | |||
| 83b752de21 | |||
| 8991f5ef40 | |||
| 4047fb5f66 | |||
| 7eda350ae1 | |||
| 7b0df35ae8 | |||
| dc0051555f | |||
| 713d04ac3b | |||
| fb278ef072 | |||
| 522e71450c | |||
| 0df4cdc660 | |||
| 6b4c35e954 | |||
| ff75a9a13c | |||
| 08fbfddab9 | |||
| 3a4f8b6bb1 | |||
| 94f7f3824b | |||
| ea96fa0b2d | |||
| 16fd8f4c86 | |||
| 5e4233ad5e | |||
| 361844c6dc | |||
| e31eac8012 | |||
| 9dd64d120d | |||
| 82cd86a207 | |||
| d44aff91f9 | |||
| 75eacd17d4 | |||
| bede190a30 | |||
| 8b20b12584 | |||
| ebf8a02d6e | |||
| 058c79a358 | |||
| 1b38cee3f3 | |||
| f2d7be4344 | |||
| 492db474c2 | |||
| c6b37639e4 | |||
| 716eb4ff87 | |||
| a5f970adf9 | |||
| 01833b4d38 | |||
| 08a328892a | |||
| 5cc7dd8922 | |||
| 85f45d4bc5 | |||
| aed4ee9f81 | |||
| debe1c3f84 | |||
| 6fe80377e8 | |||
| f572239546 | |||
| d614c12d3f | |||
| 64151706e6 | |||
| bc81af74e7 | |||
| 39182a49ab | |||
| 4f0d8d4943 | |||
| faa6c45089 | |||
| a2d01aab8a | |||
| 7cc8f4d7e9 | |||
| d8d29f2221 | |||
| 3560458714 | |||
| 7c042a47e8 | |||
| 8fe2daaa9e | |||
| bb291e2932 | |||
| c145ca0bac | |||
| d4d3e3b128 | |||
| 12b28f8b86 | |||
| d87dbad598 | |||
| 46f23622c4 | |||
| 2061fed3e2 | |||
| 794229a783 | |||
| 22c1ea893b | |||
| 5119b630df | |||
| 0fae262b0b | |||
| 6870045cf4 | |||
| c195ee678d | |||
| 1b558ae201 | |||
| 74c2c63b31 | |||
| 5cb0d5823c | |||
| 4a0b0bc53f | |||
| 7d641bbfdf | |||
| 8c7491cac2 | |||
| ef16b119de | |||
| a870db5cd2 | |||
| 7633cd967d | |||
| 72745eff07 | |||
| 85e8a46e14 | |||
| cc65604955 | |||
| 04605ad442 | |||
| 3ae319fdaa | |||
| bbfa0fe833 | |||
| 8003c16105 | |||
| 13d794ff88 | |||
| 5aa789272a | |||
| 4e8718a78e | |||
| 4c7135a44d | |||
| 6c64d36f48 | |||
| c4ba9f2f97 | |||
| 20aa7ee280 | |||
| ced5ba0763 | |||
| e466349754 | |||
| e27efa5d52 | |||
| c058e9456c | |||
| 80a4940267 | |||
| 554e96cb1c | |||
| 8b9536c22b | |||
| 3737f5ad80 | |||
| fb9576df9e | |||
| d4ec50c637 | |||
| 98af8941ef | |||
| 9bbf347e58 | |||
| b59b6978de | |||
| c687c89354 | |||
| 0815af34c0 | |||
| aea66fabf4 | |||
| 35f9a562df | |||
| 4765f5b214 | |||
| 64d78879db | |||
| b7356d881b | |||
| 22d20833b5 | |||
| 01a51543a5 | |||
| 4b9879db3d | |||
| c5477ad059 | |||
| 8cca364160 | |||
| 03a65e5e3a | |||
| 5d6a2b8041 | |||
| c492277cf1 | |||
| 837bf1c587 | |||
| dc7d55c857 | |||
| 3717e6237e | |||
| c8a385d61e | |||
| aacf391f8b | |||
| df16a0c5e3 | |||
| 4033a6b65a | |||
| 563df59f58 | |||
| a986fd4b79 | |||
| 6e44ef83ff | |||
| 80e106f04a | |||
| befed183e5 | |||
| 912aa4f82b | |||
| 4b1b5adb34 | |||
| ed59de57bb | |||
| 4d47963a6e | |||
| ee7106ca71 | |||
| a32f50a5bf | |||
| ee72c9b1e8 | |||
| 1a497b1027 | |||
| 66f86bc686 | |||
| f376122168 | |||
| db85499697 | |||
| 62235e511d | |||
| 97e24aed58 | |||
| 56ee571dc3 | |||
| 2bf6f54366 | |||
| ec02b8bf25 | |||
| f5c5bac0fe | |||
| b247e4e5ff | |||
| 716273a918 | |||
| 9f2117613d | |||
| 1550ae93ef | |||
| 57a045efcb | |||
| b642b26f72 | |||
| 28a689c856 | |||
| dd3e5e0e88 | |||
| 425107ba2f | |||
| 0aef283dff | |||
| ef7d362810 | |||
| a9faa22241 | |||
| 084f46917a | |||
| 0daddd5866 | |||
| 92f49fbb39 | |||
| 3de4dfb2e5 | |||
| c301b8d71e | |||
| 9712c9db0f | |||
| 0ddbf5c981 | |||
| 830c1f2fbf | |||
| 0ec43a4f0f | |||
| 8b601c567d | |||
| 513e4aac85 | |||
| de5b3c5d35 | |||
| e2dbc0d0e6 | |||
| 19cf727a0f | |||
| 7c4108ee4b | |||
| e668cf1a33 | |||
| 8a298c4635 | |||
| 1d10d58284 | |||
| 3bde47cffe | |||
| e7cc8bac1e | |||
| 89e581acf8 | |||
| 8b8d2b679a | |||
| a35747b6fa | |||
| a573b6863c | |||
| 8147eefaeb | |||
| 325776eaf2 | |||
| aa42d60c5f | |||
| 6b4b337e53 | |||
| 59fc3ff45a | |||
| 6a89a63d2e | |||
| b0bad03234 | |||
| 5cc01476e4 | |||
| 0a8f7bdc5b | |||
| 9e7e3decd3 | |||
| 6cc6538ad2 | |||
| 1ad97f8479 | |||
| 027715f9ac | |||
| e42ce62ce2 | |||
| aaf4c3073a | |||
| 44a8a13655 | |||
| 74b29a0ffa | |||
| 54ecc4c375 | |||
| 779ee95834 | |||
| 39723c5958 | |||
| 17036c4cc3 | |||
| cb3b678b2c | |||
| dc35554091 | |||
| e67615ef0c | |||
| 4c426ad970 | |||
| 0ccc412fcc | |||
| fe007fd543 | |||
| a29c65037e | |||
| d2209d304f | |||
| e1c24e7c50 | |||
| dc6c2344f6 | |||
| 6a1d9d0c32 | |||
| 20b1ba0771 | |||
| b40013928c | |||
| 86a0e64628 | |||
| 332b38fd92 | |||
| f107be3d29 | |||
| 646c90cc4a | |||
| 06331625a9 | |||
| 8d32e1d35b | |||
| 79cfad0cc0 | |||
| 72a3301ba4 | |||
| 5e2a9dac14 | |||
| 6e0c40ffd9 | |||
| dbd176cfab | |||
| 95344d0625 | |||
| 9681bf7cee | |||
| 48116660f5 | |||
| 9549e2ded7 | |||
| 4be95374a5 | |||
| 089fcb45c0 | |||
| ee90bef50a | |||
| 52eab2a61a | |||
| 3d65979f0a | |||
| c295523ae2 | |||
| e9a0a6d83a | |||
| 213d7119f9 | |||
| 19a53982d4 | |||
| ee674844f2 | |||
| d484fef837 | |||
| db34671626 | |||
| 5e58b5115f | |||
| 39b533d0d8 | |||
| bf3ee69d86 | |||
| d345047b0f | |||
| 04e3da0cf5 | |||
| 56ad4cdfec | |||
| 7dc36289ab | |||
| 2ca1301494 | |||
| dc78d26f2a | |||
| 819b7c45a9 | |||
| 29068d3845 | |||
| 6c1ea7a54b | |||
| 8fef9a197f | |||
| e2a28db2b5 | |||
| cc2aec11af | |||
| 040c541138 | |||
| bac1a3a623 | |||
| e5d8726859 | |||
| 97f1813695 | |||
| 508c580e67 |
@@ -182,7 +182,8 @@ Jesús Macias <jmacias@solidgear.es> Jesus Macias <jmacias@full-on-net.com>
|
||||
jknockaert <jasper@knockaert.nl>
|
||||
Joan <aseques@gmail.com>
|
||||
Joar Wandborg <git@wandborg.com>
|
||||
Joas Schilling <nickvergessen@owncloud.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@owncloud.com>
|
||||
joel hansson <joel.hansson@gmail.com>
|
||||
Johan Björk <johanimon@gmail.com>
|
||||
Johannes Twittmann <github.com@deryo.de>
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 509385e674...f65a242bbd
+1
-1
@@ -26,7 +26,7 @@ Help us to maximize the effort we can spend fixing issues and adding new feature
|
||||
|
||||
[template]: https://raw.github.com/owncloud/core/master/issue_template.md
|
||||
[mailinglist]: https://mailman.owncloud.org/mailman/listinfo/owncloud
|
||||
[forum]: https://forum.owncloud.org/
|
||||
[forum]: https://central.owncloud.org/
|
||||
[irc]: https://webchat.freenode.net/?channels=owncloud&uio=d4
|
||||
|
||||
## Contributing to Source Code
|
||||
|
||||
Vendored
+144
@@ -0,0 +1,144 @@
|
||||
#!groovy
|
||||
/*
|
||||
* This Jenkinsfile is intended to run on https://ci.owncloud.org and may fail anywhere else.
|
||||
* It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc.
|
||||
*/
|
||||
|
||||
timestampedNode('SLAVE') {
|
||||
stage 'Checkout'
|
||||
checkout scm
|
||||
sh '''git submodule update --init'''
|
||||
|
||||
stage 'JavaScript Testing'
|
||||
executeAndReport('tests/autotest-results-js.xml') {
|
||||
sh '''./autotest-js.sh'''
|
||||
}
|
||||
|
||||
stage 'PHPUnit'
|
||||
executeAndReport('tests/autotest-results-sqlite.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 7.0
|
||||
./autotest.sh sqlite
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-mysql.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.4
|
||||
./autotest.sh mysql
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-pgsql.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.6
|
||||
./autotest.sh pgsql
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-oci.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.5
|
||||
./autotest.sh oci
|
||||
'''
|
||||
}
|
||||
|
||||
stage 'Files External Testing'
|
||||
executeAndReport('tests/autotest-external-results-sqlite-webdav-ownCloud.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite webdav-ownCloud
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-smb-silvershell.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite smb-silvershell
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-swift-ceph.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite swift-ceph
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-smb-windows.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite smb-windows
|
||||
'''
|
||||
}
|
||||
|
||||
step([$class: 'JUnitResultArchiver', testResults: 'tests/autotest-external-results-sqlite.xml'])
|
||||
|
||||
stage 'Primary Objectstore Test - Swift'
|
||||
executeAndReport('tests/autotest-results-mysql.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
|
||||
export NOCOVERAGE=1
|
||||
export RUN_OBJECTSTORE_TESTS=1
|
||||
export PRIMARY_STORAGE_CONFIG="swift"
|
||||
unset USEDOCKER
|
||||
|
||||
rm tests/autotest-results-*.xml
|
||||
./autotest.sh mysql
|
||||
'''
|
||||
}
|
||||
|
||||
stage 'Integration Testing'
|
||||
executeAndReport('build/integration/output/*.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
rm -rf config/config.php
|
||||
./occ maintenance:install --admin-pass=admin
|
||||
rm -rf build/integration/output
|
||||
rm -rf build/integration/vendor
|
||||
rm -rf build/integration/composer.lock
|
||||
cd build/integration
|
||||
./run.sh
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
void executeAndReport(String testResultLocation, def body) {
|
||||
def failed = false
|
||||
// We're wrapping this in a timeout - if it takes longer, kill it.
|
||||
try {
|
||||
timeout(time: 120, unit: 'MINUTES') {
|
||||
body.call()
|
||||
}
|
||||
} catch (Exception e) {
|
||||
failed = true
|
||||
echo "Test execution failed: ${e}"
|
||||
} finally {
|
||||
step([$class: 'JUnitResultArchiver', testResults: testResultLocation])
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
|
||||
if (env.BRANCH_NAME == 'master' || env.BRANCH_NAME == 'stable9.1' || env.BRANCH_NAME == 'stable9' || env.BRANCH_NAME == 'stable8.2') {
|
||||
mail body: "project build error is here: ${env.BUILD_URL}" ,
|
||||
subject: "Build on release branch failed: ${env.BRANCH_NAME}",
|
||||
to: 'jenkins@owncloud.com'
|
||||
}
|
||||
|
||||
error "Test execution failed. Terminating the build"
|
||||
}
|
||||
}
|
||||
|
||||
// Runs the given body within a Timestamper wrapper on the given label.
|
||||
def timestampedNode(String label, Closure body) {
|
||||
node(label) {
|
||||
wrap([$class: 'TimestamperBuildWrapper']) {
|
||||
body.call()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ https://owncloud.org/contribute/
|
||||
Learn about the different ways you can get support for ownCloud: https://owncloud.org/support/
|
||||
|
||||
## Get in touch
|
||||
* :clipboard: [Forum](https://forum.owncloud.org)
|
||||
* :clipboard: [Forum](https://central.owncloud.org)
|
||||
* :envelope: [Mailing list](https://mailman.owncloud.org/mailman/listinfo)
|
||||
* :hash: [IRC channel](https://webchat.freenode.net/?channels=owncloud)
|
||||
* :busts_in_silhouette: [Facebook] (https://facebook.com/ownclouders)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
'{{/if}}' +
|
||||
' </div>' +
|
||||
' <form class="newCommentForm">' +
|
||||
' <textarea class="message" placeholder="{{newMessagePlaceholder}}">{{{message}}}</textarea>' +
|
||||
' <textarea class="message" placeholder="{{newMessagePlaceholder}}">{{message}}</textarea>' +
|
||||
' <input class="submit" type="submit" value="{{submitText}}" />' +
|
||||
'{{#if isEditMode}}' +
|
||||
' <input class="cancel" type="button" value="{{cancelText}}" />' +
|
||||
@@ -337,10 +337,10 @@
|
||||
$comment.data('commentEl').remove();
|
||||
$comment.remove();
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$loading.addClass('hidden');
|
||||
$comment.removeClass('disabled');
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while retrieving comment with id {id}', {id: commentId}));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -388,12 +388,12 @@
|
||||
.html(self._formatMessage(model.get('message')));
|
||||
$row.remove();
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while updating comment with id {id}', {id: commentId}));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -413,12 +413,12 @@
|
||||
$loading.addClass('hidden');
|
||||
$textArea.val('').prop('disabled', false);
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while posting comment'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ OC.L10N.register(
|
||||
{
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{ "translations": {
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentáře</strong> pro soubory <em>(vždy uvedeny v proudu)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentáře</strong> pro soubory <em>(vždy uvedeny v proudu)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Error occurred while retrieving comment with id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comments</strong> for files <em>(always listed in stream)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Error occurred while retrieving comment with id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comments</strong> for files <em>(always listed in stream)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Lisää kommentteja...",
|
||||
"Save" : "Tallenna",
|
||||
"Allowed characters {count} of {max}" : "Sallittujen merkkien määrä {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Virhe noutaessa kommenttia tunnisteella {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Virhe päivittäessä kommenttia tunnisteella {id}",
|
||||
"Error occurred while posting comment" : "Virhe kommenttia lähettäessä",
|
||||
"{count} unread comments" : "{count} lukematonta kommenttia",
|
||||
"Comment" : "Kommentti",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Lisää kommentteja...",
|
||||
"Save" : "Tallenna",
|
||||
"Allowed characters {count} of {max}" : "Sallittujen merkkien määrä {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Virhe noutaessa kommenttia tunnisteella {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Virhe päivittäessä kommenttia tunnisteella {id}",
|
||||
"Error occurred while posting comment" : "Virhe kommenttia lähettäessä",
|
||||
"{count} unread comments" : "{count} lukematonta kommenttia",
|
||||
"Comment" : "Kommentti",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Plus de commentaires...",
|
||||
"Save" : "Enregistrer",
|
||||
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
|
||||
"Error occurred while retrieving comment with id {id}" : "Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
|
||||
"Error occurred while posting comment" : "Une erreur est survenue lors de l'envoi du commentaire",
|
||||
"{count} unread comments" : "{count} commentaires non lus",
|
||||
"Comment" : "Commenter",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commentaires</strong> pour les fichiers <em>(toujours listés dans le flux)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Plus de commentaires...",
|
||||
"Save" : "Enregistrer",
|
||||
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
|
||||
"Error occurred while retrieving comment with id {id}" : "Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
|
||||
"Error occurred while posting comment" : "Une erreur est survenue lors de l'envoi du commentaire",
|
||||
"{count} unread comments" : "{count} commentaires non lus",
|
||||
"Comment" : "Commenter",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commentaires</strong> pour les fichiers <em>(toujours listés dans le flux)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "תגובות נוספות...",
|
||||
"Save" : "שמירה",
|
||||
"Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
|
||||
"{count} unread comments" : "{count} תגובות שלא נקראו",
|
||||
"Comment" : "תגובה",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>תגובות</strong> עבור קבצים <em>(תמיד נרשמים בהזרמת מדיה)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "תגובות נוספות...",
|
||||
"Save" : "שמירה",
|
||||
"Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
|
||||
"{count} unread comments" : "{count} תגובות שלא נקראו",
|
||||
"Comment" : "תגובה",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>תגובות</strong> עבור קבצים <em>(תמיד נרשמים בהזרמת מדיה)</em>",
|
||||
|
||||
@@ -3,7 +3,7 @@ OC.L10N.register(
|
||||
{
|
||||
"Type in a new comment..." : "Digita un nuovo commento...",
|
||||
"Delete comment" : "Elimina commento",
|
||||
"Post" : "Post",
|
||||
"Post" : "Pubblica",
|
||||
"Cancel" : "Annulla",
|
||||
"Edit comment" : "Modifica commento",
|
||||
"[Deleted user]" : "[Utente eliminato]",
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Altri commenti...",
|
||||
"Save" : "Salva",
|
||||
"Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}",
|
||||
"Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.",
|
||||
"{count} unread comments" : "{count} commenti non letti",
|
||||
"Comment" : "Commento",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{ "translations": {
|
||||
"Type in a new comment..." : "Digita un nuovo commento...",
|
||||
"Delete comment" : "Elimina commento",
|
||||
"Post" : "Post",
|
||||
"Post" : "Pubblica",
|
||||
"Cancel" : "Annulla",
|
||||
"Edit comment" : "Modifica commento",
|
||||
"[Deleted user]" : "[Utente eliminato]",
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Altri commenti...",
|
||||
"Save" : "Salva",
|
||||
"Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}",
|
||||
"Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.",
|
||||
"{count} unread comments" : "{count} commenti non letti",
|
||||
"Comment" : "Commento",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "コメントをさらに表示...",
|
||||
"Save" : "保存",
|
||||
"Allowed characters {count} of {max}" : "入力文字数 {count} / {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "コメントID {id} のコメントを取得する際にエラーが発生",
|
||||
"Error occurred while updating comment with id {id}" : "コメントID {id} のコメントをアップロードする際にエラーが発生",
|
||||
"Error occurred while posting comment" : "コメント投稿時にエラーが発生",
|
||||
"{count} unread comments" : "未読コメント数 {count}",
|
||||
"Comment" : "コメント",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "ファイルに対する<strong>コメント</strong><em>(常時ストリームに表示)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "コメントをさらに表示...",
|
||||
"Save" : "保存",
|
||||
"Allowed characters {count} of {max}" : "入力文字数 {count} / {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "コメントID {id} のコメントを取得する際にエラーが発生",
|
||||
"Error occurred while updating comment with id {id}" : "コメントID {id} のコメントをアップロードする際にエラーが発生",
|
||||
"Error occurred while posting comment" : "コメント投稿時にエラーが発生",
|
||||
"{count} unread comments" : "未読コメント数 {count}",
|
||||
"Comment" : "コメント",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "ファイルに対する<strong>コメント</strong><em>(常時ストリームに表示)</em>",
|
||||
|
||||
@@ -12,9 +12,15 @@ OC.L10N.register(
|
||||
"More comments..." : "Flere kommentarer..",
|
||||
"Save" : "Lagre",
|
||||
"Allowed characters {count} of {max}" : "Antall tegn tillatt {count} av {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "En feil oppstod ved henting av kommentar med id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "En feil oppstod ved oppdatering av kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "En feil oppstod ved innlegging av kommentar",
|
||||
"{count} unread comments" : "{count} uleste kommentarer",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentarer</strong> for filer <em>(alltid listet i strømmen)</em>",
|
||||
"You commented" : "Du kommenterte",
|
||||
"%1$s commented" : "%1$s kommentert",
|
||||
"You commented on %2$s" : "Du kommenterte på %2$s",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterte %2$s"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -10,9 +10,15 @@
|
||||
"More comments..." : "Flere kommentarer..",
|
||||
"Save" : "Lagre",
|
||||
"Allowed characters {count} of {max}" : "Antall tegn tillatt {count} av {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "En feil oppstod ved henting av kommentar med id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "En feil oppstod ved oppdatering av kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "En feil oppstod ved innlegging av kommentar",
|
||||
"{count} unread comments" : "{count} uleste kommentarer",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentarer</strong> for filer <em>(alltid listet i strømmen)</em>",
|
||||
"You commented" : "Du kommenterte",
|
||||
"%1$s commented" : "%1$s kommentert",
|
||||
"You commented on %2$s" : "Du kommenterte på %2$s",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterte %2$s"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Meer reacties...",
|
||||
"Save" : "Opslaan",
|
||||
"Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens",
|
||||
"Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Er trad een fout op bij het bijwerken van reactie met id {id}",
|
||||
"Error occurred while posting comment" : "Er trad een fout op bij het plaatsten van een reactie",
|
||||
"{count} unread comments" : "{count} ongelezen reacties",
|
||||
"Comment" : "Reactie",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Meer reacties...",
|
||||
"Save" : "Opslaan",
|
||||
"Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens",
|
||||
"Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Er trad een fout op bij het bijwerken van reactie met id {id}",
|
||||
"Error occurred while posting comment" : "Er trad een fout op bij het plaatsten van een reactie",
|
||||
"{count} unread comments" : "{count} ongelezen reacties",
|
||||
"Comment" : "Reactie",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Więcej komentarzy...",
|
||||
"Save" : "Zapisz",
|
||||
"Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while updating comment with id {id}" : "W trakcie aktualizacji komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd",
|
||||
"{count} unread comments" : "{count} nieprzeczytanych komentarzy",
|
||||
"Comment" : "Komentarz",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Więcej komentarzy...",
|
||||
"Save" : "Zapisz",
|
||||
"Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while updating comment with id {id}" : "W trakcie aktualizacji komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd",
|
||||
"{count} unread comments" : "{count} nieprzeczytanych komentarzy",
|
||||
"Comment" : "Komentarz",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Salvar",
|
||||
"Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao recuperar comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro durante a atualização do comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao postar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Salvar",
|
||||
"Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao recuperar comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro durante a atualização do comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao postar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} de {max} caracteres restantes",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao tentar obter o comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro ao tentar atualizar o comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao tentar publicar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> aos ficheiros <em>(listados sempre na transmissão)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} de {max} caracteres restantes",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao tentar obter o comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro ao tentar atualizar o comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao tentar publicar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> aos ficheiros <em>(listados sempre na transmissão)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Ещё комментарии...",
|
||||
"Save" : "Сохранить",
|
||||
"Allowed characters {count} of {max}" : "Допустимых символов {count} из {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Произошла ошибка при извлечении комментария с id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Произошла ошибка при обновлении комментария с id {id}",
|
||||
"Error occurred while posting comment" : "При сохранении комментария произошла ошибка",
|
||||
"{count} unread comments" : "{count} непрочитанных комментариев",
|
||||
"Comment" : "Коментарий",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Комментарии</strong> к файлам <em>(всегда перечислены в потоке)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Ещё комментарии...",
|
||||
"Save" : "Сохранить",
|
||||
"Allowed characters {count} of {max}" : "Допустимых символов {count} из {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Произошла ошибка при извлечении комментария с id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Произошла ошибка при обновлении комментария с id {id}",
|
||||
"Error occurred while posting comment" : "При сохранении комментария произошла ошибка",
|
||||
"{count} unread comments" : "{count} непрочитанных комментариев",
|
||||
"Comment" : "Коментарий",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Комментарии</strong> к файлам <em>(всегда перечислены в потоке)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Več opomb ...",
|
||||
"Save" : "Shrani",
|
||||
"Allowed characters {count} of {max}" : "Dovoljeni znaki: {count} od {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Napaka se je zgodila med prenosom komentarja z oznako {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Napaka se je zgodila med posodabljanjem komentarja z oznako {id}",
|
||||
"Error occurred while posting comment" : "Napaka se je zgodila med predajo komentarja",
|
||||
"{count} unread comments" : "{count} neprebranih opomb",
|
||||
"Comment" : "Opomba",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Več opomb ...",
|
||||
"Save" : "Shrani",
|
||||
"Allowed characters {count} of {max}" : "Dovoljeni znaki: {count} od {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Napaka se je zgodila med prenosom komentarja z oznako {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Napaka se je zgodila med posodabljanjem komentarja z oznako {id}",
|
||||
"Error occurred while posting comment" : "Napaka se je zgodila med predajo komentarja",
|
||||
"{count} unread comments" : "{count} neprebranih opomb",
|
||||
"Comment" : "Opomba",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Më tepër komente…",
|
||||
"Save" : "Ruaje",
|
||||
"Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}",
|
||||
"Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti",
|
||||
"{count} unread comments" : "{count} komente të palexuar",
|
||||
"Comment" : "Koment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Më tepër komente…",
|
||||
"Save" : "Ruaje",
|
||||
"Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}",
|
||||
"Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti",
|
||||
"{count} unread comments" : "{count} komente të palexuar",
|
||||
"Comment" : "Koment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "ความคิดเห็นอื่นๆ ...",
|
||||
"Save" : "บันทึก",
|
||||
"Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
|
||||
"Error occurred while retrieving comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while updating comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while posting comment" : "มีข้อผิดพลาดเกิดขึ้นในขณะที่โพสต์แสดงความคิดเห็น",
|
||||
"{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
|
||||
"Comment" : "แสดงความคิดเห็น",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "ความคิดเห็นอื่นๆ ...",
|
||||
"Save" : "บันทึก",
|
||||
"Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
|
||||
"Error occurred while retrieving comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while updating comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while posting comment" : "มีข้อผิดพลาดเกิดขึ้นในขณะที่โพสต์แสดงความคิดเห็น",
|
||||
"{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
|
||||
"Comment" : "แสดงความคิดเห็น",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Daha fazla yorum...",
|
||||
"Save" : "Kaydet",
|
||||
"Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "id {id} ile yorum alınırken hata oluştu",
|
||||
"Error occurred while updating comment with id {id}" : "id {id} ile yorumu güncellerken hata oluştu",
|
||||
"Error occurred while posting comment" : "Yorum gönderilirken hata oluştu",
|
||||
"{count} unread comments" : "{count} okunmamış yorum",
|
||||
"Comment" : "Yorum",
|
||||
"You commented" : "Yorum yaptınız",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Daha fazla yorum...",
|
||||
"Save" : "Kaydet",
|
||||
"Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "id {id} ile yorum alınırken hata oluştu",
|
||||
"Error occurred while updating comment with id {id}" : "id {id} ile yorumu güncellerken hata oluştu",
|
||||
"Error occurred while posting comment" : "Yorum gönderilirken hata oluştu",
|
||||
"{count} unread comments" : "{count} okunmamış yorum",
|
||||
"Comment" : "Yorum",
|
||||
"You commented" : "Yorum yaptınız",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<description>ownCloud WebDAV endpoint</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>owncloud.org</author>
|
||||
<version>0.2.5</version>
|
||||
<version>0.2.7</version>
|
||||
<default_enable/>
|
||||
<types>
|
||||
<filesystem/>
|
||||
@@ -18,14 +18,15 @@
|
||||
<owncloud min-version="9.1" max-version="9.1" />
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\DAV\CardDAV\Sync\SyncJob</job>
|
||||
<job>OCA\DAV\CardDAV\SyncJob</job>
|
||||
</background-jobs>
|
||||
<repair-steps>
|
||||
<post-migration>
|
||||
<job>OCA\DAV\Migration\Classification</job>
|
||||
<step>OCA\DAV\Migration\Classification</step>
|
||||
<step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step>
|
||||
</post-migration>
|
||||
<live-migration>
|
||||
<job>OCA\DAV\Migration\GenerateBirthdays</job>
|
||||
<step>OCA\DAV\Migration\GenerateBirthdays</step>
|
||||
</live-migration>
|
||||
</repair-steps>
|
||||
</info>
|
||||
|
||||
@@ -75,6 +75,8 @@ if ($debugging) {
|
||||
}
|
||||
|
||||
$server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin());
|
||||
$server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin());
|
||||
$server->addPlugin(new OCA\DAV\CalDAV\Schedule\IMipPlugin( \OC::$server->getMailer(), \OC::$server->getLogger()));
|
||||
$server->addPlugin(new ExceptionLoggerPlugin('caldav', \OC::$server->getLogger()));
|
||||
|
||||
// And off we go!
|
||||
|
||||
@@ -114,7 +114,7 @@ class Application extends App {
|
||||
/** @var IAppContainer $c */
|
||||
return new Classification(
|
||||
$c->query('CalDavBackend'),
|
||||
$c->getServer()->getUserManager()
|
||||
$c->getServer()->getDatabaseConnection()
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -108,6 +108,7 @@ class BirthdayService {
|
||||
$this->calDavBackEnd->createCalendar($principal, self::BIRTHDAY_CALENDAR_URI, [
|
||||
'{DAV:}displayname' => 'Contact birthdays',
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#FFFFCA',
|
||||
'components' => 'VEVENT',
|
||||
]);
|
||||
|
||||
return $this->calDavBackEnd->getCalendarByUri($principal, self::BIRTHDAY_CALENDAR_URI);
|
||||
|
||||
@@ -1079,22 +1079,27 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||
'lastmodified' => time(),
|
||||
];
|
||||
|
||||
foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
|
||||
if (isset($properties[$xmlName])) {
|
||||
$propertiesBoolean = ['striptodos', 'stripalarms', 'stripattachments'];
|
||||
|
||||
foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
|
||||
if (array_key_exists($xmlName, $properties)) {
|
||||
$values[$dbName] = $properties[$xmlName];
|
||||
$fieldNames[] = $dbName;
|
||||
if (in_array($dbName, $propertiesBoolean)) {
|
||||
$values[$dbName] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$valuesToInsert = array();
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
|
||||
foreach (array_keys($values) as $name) {
|
||||
$valuesToInsert[$name] = $query->createNamedParameter($values[$name]);
|
||||
}
|
||||
|
||||
$query->insert('calendarsubscriptions')
|
||||
->values([
|
||||
'principaluri' => $query->createNamedParameter($values['principaluri']),
|
||||
'uri' => $query->createNamedParameter($values['uri']),
|
||||
'source' => $query->createNamedParameter($values['source']),
|
||||
'lastmodified' => $query->createNamedParameter($values['lastmodified']),
|
||||
])
|
||||
->values($valuesToInsert)
|
||||
->execute();
|
||||
|
||||
return $this->db->lastInsertId('*PREFIX*calendarsubscriptions');
|
||||
|
||||
@@ -848,7 +848,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('*')->from($this->dbCardsTable)
|
||||
->where($query->expr()->eq('uri', $query->createNamedParameter($uri)))
|
||||
->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)));
|
||||
->andWhere($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)));
|
||||
$queryResult = $query->execute();
|
||||
$contact = $queryResult->fetch();
|
||||
$queryResult->closeCursor();
|
||||
|
||||
@@ -91,6 +91,7 @@ class Converter {
|
||||
}
|
||||
|
||||
if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) {
|
||||
unset($vCard->PHOTO);
|
||||
$vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]);
|
||||
$updated = true;
|
||||
}
|
||||
@@ -161,7 +162,7 @@ class Converter {
|
||||
*/
|
||||
private function getAvatarImage(IUser $user) {
|
||||
try {
|
||||
$image = $user->getAvatarImage(-1);
|
||||
$image = $user->getAvatarImage(96);
|
||||
return $image;
|
||||
} catch (\Exception $ex) {
|
||||
return null;
|
||||
|
||||
@@ -86,6 +86,7 @@ class ImageExportPlugin extends ServerPlugin {
|
||||
|
||||
if ($result = $this->getPhoto($node)) {
|
||||
$response->setHeader('Content-Type', $result['Content-Type']);
|
||||
$response->setHeader('Content-Disposition', 'attachment');
|
||||
$response->setStatus(200);
|
||||
|
||||
$response->setBody($result['body']);
|
||||
@@ -108,8 +109,23 @@ class ImageExportPlugin extends ServerPlugin {
|
||||
$photo = $vObject->PHOTO;
|
||||
$type = $this->getType($photo);
|
||||
|
||||
$valType = $photo->getValueType();
|
||||
$val = ($valType === 'URI' ? $photo->getRawMimeDirValue() : $photo->getValue());
|
||||
$val = $photo->getValue();
|
||||
if ($photo->getValueType() === 'URI') {
|
||||
$parsed = \Sabre\URI\parse($val);
|
||||
//only allow data://
|
||||
if ($parsed['scheme'] !== 'data') {
|
||||
return false;
|
||||
}
|
||||
if (substr_count($parsed['path'], ';') === 1) {
|
||||
list($type,) = explode(';', $parsed['path']);
|
||||
}
|
||||
$val = file_get_contents($val);
|
||||
}
|
||||
|
||||
if (!in_array($type, ['image/png', 'image/jpeg', 'image/gif'])) {
|
||||
$type = 'application/octet-stream';
|
||||
}
|
||||
|
||||
return [
|
||||
'Content-Type' => $type,
|
||||
'body' => $val
|
||||
@@ -126,7 +142,7 @@ class ImageExportPlugin extends ServerPlugin {
|
||||
|
||||
/**
|
||||
* @param Binary $photo
|
||||
* @return Parameter
|
||||
* @return string
|
||||
*/
|
||||
private function getType($photo) {
|
||||
$params = $photo->parameters();
|
||||
@@ -141,6 +157,6 @@ class ImageExportPlugin extends ServerPlugin {
|
||||
return 'image/' . strtolower($type);
|
||||
}
|
||||
}
|
||||
return '';
|
||||
return 'application/octet-stream';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,6 +263,8 @@ class SyncService {
|
||||
$systemAddressBook = $this->getLocalSystemAddressBook();
|
||||
$this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $progressCallback) {
|
||||
$this->updateUser($user);
|
||||
// avatar fetching sets up FS, need to clear again
|
||||
\OC_Util::tearDownFS();
|
||||
if (!is_null($progressCallback)) {
|
||||
$progressCallback();
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
|
||||
$msg = 'Message exceeds allowed character limit of ';
|
||||
throw new BadRequest($msg . IComment::MAX_MESSAGE_LENGTH, 0, $e);
|
||||
}
|
||||
return false;
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ class PublicAuth extends AbstractBasic {
|
||||
if ($this->shareManager->checkPassword($share, $password)) {
|
||||
return true;
|
||||
} else if ($this->session->exists('public_link_authenticated')
|
||||
&& $this->session->get('public_link_authenticated') === $share->getId()) {
|
||||
&& $this->session->get('public_link_authenticated') === (string)$share->getId()) {
|
||||
return true;
|
||||
} else {
|
||||
if (in_array('XMLHttpRequest', explode(',', $this->request->getHeader('X-Requested-With')))) {
|
||||
|
||||
@@ -31,6 +31,9 @@ use \Sabre\HTTP\ResponseInterface;
|
||||
* or mangle Etag headers.
|
||||
*/
|
||||
class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
|
||||
/** @var \Sabre\DAV\Server */
|
||||
private $server;
|
||||
/**
|
||||
* This initializes the plugin.
|
||||
*
|
||||
@@ -39,7 +42,10 @@ class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
* @return void
|
||||
*/
|
||||
public function initialize(\Sabre\DAV\Server $server) {
|
||||
$server->on('afterMethod', array($this, 'afterMethod'));
|
||||
$this->server = $server;
|
||||
|
||||
$server->on('afterMethod', [$this, 'afterMethod']);
|
||||
$server->on('afterMove', [$this, 'afterMove']);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -54,4 +60,22 @@ class CopyEtagHeaderPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
$response->setHeader('OC-ETag', $eTag);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after a node is moved.
|
||||
*
|
||||
* This allows the backend to move all the associated properties.
|
||||
*
|
||||
* @param string $source
|
||||
* @param string $destination
|
||||
* @return void
|
||||
*/
|
||||
function afterMove($source, $destination) {
|
||||
$node = $this->server->tree->getNodeForPath($destination);
|
||||
if ($node instanceof File) {
|
||||
$eTag = $node->getETag();
|
||||
$this->server->httpResponse->setHeader('OC-ETag', $eTag);
|
||||
$this->server->httpResponse->setHeader('ETag', $eTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,7 +327,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
||||
|
||||
$result = $this->connection->executeQuery(
|
||||
$sql,
|
||||
array($this->user, rtrim($path, '/') . '/%', $requestedProperties),
|
||||
array($this->user, $this->connection->escapeLikeParameter(rtrim($path, '/')) . '/%', $requestedProperties),
|
||||
array(null, null, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY)
|
||||
);
|
||||
|
||||
|
||||
@@ -42,6 +42,8 @@ class ExceptionLoggerPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
// forbidden can be expected when trying to upload to
|
||||
// read-only folders for example
|
||||
'Sabre\DAV\Exception\Forbidden' => true,
|
||||
// Custom exception similar to NotAuthenticated
|
||||
'OCA\DAV\Connector\Sabre\Exception\PasswordLoginForbidden' => true,
|
||||
);
|
||||
|
||||
/** @var string */
|
||||
|
||||
@@ -308,15 +308,10 @@ class FilesPlugin extends ServerPlugin {
|
||||
$displayName = $owner->getDisplayName();
|
||||
return $displayName;
|
||||
});
|
||||
|
||||
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
|
||||
if ($node->getPath() === '/') {
|
||||
return $this->config->getSystemValue('data-fingerprint', '');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if ($node instanceof \OCA\DAV\Files\FilesHome) {
|
||||
if ($node instanceof \OCA\DAV\Connector\Sabre\Node
|
||||
|| $node instanceof \OCA\DAV\Files\FilesHome) {
|
||||
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
|
||||
return $this->config->getSystemValue('data-fingerprint', '');
|
||||
});
|
||||
|
||||
@@ -283,6 +283,11 @@ class ObjectTree extends \Sabre\DAV\Tree {
|
||||
throw new InvalidPath($ex->getMessage());
|
||||
}
|
||||
|
||||
// Webdav's copy will implicitly do a delete+create, so only create+delete permissions are required
|
||||
if (!$this->fileView->isCreatable($destinationDir)) {
|
||||
throw new \Sabre\DAV\Exception\Forbidden();
|
||||
}
|
||||
|
||||
try {
|
||||
$this->fileView->copy($source, $destination);
|
||||
} catch (StorageNotAvailableException $e) {
|
||||
|
||||
@@ -24,6 +24,11 @@
|
||||
*
|
||||
*/
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
use OCP\Files\FileInfo;
|
||||
use OCP\Files\StorageNotAvailableException;
|
||||
use Sabre\DAV\Exception\InsufficientStorage;
|
||||
use Sabre\DAV\Exception\ServiceUnavailable;
|
||||
use Sabre\HTTP\URLUtil;
|
||||
|
||||
/**
|
||||
* This plugin check user quota and deny creating files when they exceeds the quota.
|
||||
@@ -76,17 +81,16 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
* This method is called before any HTTP method and validates there is enough free space to store the file
|
||||
*
|
||||
* @param string $uri
|
||||
* @param null $data
|
||||
* @throws \Sabre\DAV\Exception\InsufficientStorage
|
||||
* @throws InsufficientStorage
|
||||
* @return bool
|
||||
*/
|
||||
public function checkQuota($uri, $data = null) {
|
||||
public function checkQuota($uri) {
|
||||
$length = $this->getLength();
|
||||
if ($length) {
|
||||
if (substr($uri, 0, 1) !== '/') {
|
||||
$uri = '/' . $uri;
|
||||
}
|
||||
list($parentUri, $newName) = \Sabre\HTTP\URLUtil::splitPath($uri);
|
||||
list($parentUri, $newName) = URLUtil::splitPath($uri);
|
||||
if(is_null($parentUri)) {
|
||||
$parentUri = '';
|
||||
}
|
||||
@@ -101,11 +105,11 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
$uri = rtrim($parentUri, '/') . '/' . $info['name'];
|
||||
}
|
||||
$freeSpace = $this->getFreeSpace($uri);
|
||||
if ($freeSpace !== \OCP\Files\FileInfo::SPACE_UNKNOWN && $length > $freeSpace) {
|
||||
if ($freeSpace !== FileInfo::SPACE_UNKNOWN && $length > $freeSpace) {
|
||||
if (isset($chunkHandler)) {
|
||||
$chunkHandler->cleanup();
|
||||
}
|
||||
throw new \Sabre\DAV\Exception\InsufficientStorage();
|
||||
throw new InsufficientStorage();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@@ -119,12 +123,13 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
public function getLength() {
|
||||
$req = $this->server->httpRequest;
|
||||
$length = $req->getHeader('X-Expected-Entity-Length');
|
||||
if (!$length) {
|
||||
if (!is_numeric($length)) {
|
||||
$length = $req->getHeader('Content-Length');
|
||||
$length = is_numeric($length) ? $length : null;
|
||||
}
|
||||
|
||||
$ocLength = $req->getHeader('OC-Total-Length');
|
||||
if ($length && $ocLength) {
|
||||
if (is_numeric($length) && is_numeric($ocLength)) {
|
||||
return max($length, $ocLength);
|
||||
}
|
||||
|
||||
@@ -134,13 +139,14 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
/**
|
||||
* @param string $uri
|
||||
* @return mixed
|
||||
* @throws ServiceUnavailable
|
||||
*/
|
||||
public function getFreeSpace($uri) {
|
||||
try {
|
||||
$freeSpace = $this->view->free_space(ltrim($uri, '/'));
|
||||
return $freeSpace;
|
||||
} catch (\OCP\Files\StorageNotAvailableException $e) {
|
||||
throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage());
|
||||
} catch (StorageNotAvailableException $e) {
|
||||
throw new ServiceUnavailable($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,38 +80,29 @@ class BrowserErrorPagePlugin extends ServerPlugin {
|
||||
}
|
||||
$this->server->httpResponse->addHeaders($headers);
|
||||
$this->server->httpResponse->setStatus($httpCode);
|
||||
$body = $this->generateBody($ex);
|
||||
$body = $this->generateBody();
|
||||
$this->server->httpResponse->setBody($body);
|
||||
$this->sendResponse();
|
||||
}
|
||||
|
||||
/**
|
||||
* @codeCoverageIgnore
|
||||
* @param \Exception $ex
|
||||
* @param int $httpCode
|
||||
* @return bool|string
|
||||
*/
|
||||
public function generateBody(\Exception $exception) {
|
||||
public function generateBody() {
|
||||
$request = \OC::$server->getRequest();
|
||||
$content = new OC_Template('dav', 'exception', 'guest');
|
||||
$content->assign('title', $this->server->httpResponse->getStatusText());
|
||||
$content->assign('message', $exception->getMessage());
|
||||
$content->assign('errorClass', get_class($exception));
|
||||
$content->assign('errorMsg', $exception->getMessage());
|
||||
$content->assign('errorCode', $exception->getCode());
|
||||
$content->assign('file', $exception->getFile());
|
||||
$content->assign('line', $exception->getLine());
|
||||
$content->assign('trace', $exception->getTraceAsString());
|
||||
$content->assign('debugMode', \OC::$server->getSystemConfig()->getValue('debug', false));
|
||||
$content->assign('remoteAddr', $request->getRemoteAddress());
|
||||
$content->assign('requestID', $request->getId());
|
||||
return $content->fetchPage();
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* @codeCoverageIgnore
|
||||
*/
|
||||
public function sendResponse() {
|
||||
$this->server->sapi->sendResponse($this->server->httpResponse);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
@@ -33,33 +32,19 @@ class Classification implements IRepairStep {
|
||||
/** @var CalDavBackend */
|
||||
private $calDavBackend;
|
||||
|
||||
/** @var IUserManager */
|
||||
private $userManager;
|
||||
/** @var IDBConnection */
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* Classification constructor.
|
||||
*
|
||||
* @param CalDavBackend $calDavBackend
|
||||
* @param IDBConnection $connection
|
||||
*/
|
||||
public function __construct(CalDavBackend $calDavBackend, IUserManager $userManager) {
|
||||
public function __construct(CalDavBackend $calDavBackend, IDBConnection $connection) {
|
||||
$this->calDavBackend = $calDavBackend;
|
||||
$this->userManager = $userManager;
|
||||
}
|
||||
$this->connection = $connection;
|
||||
|
||||
/**
|
||||
* @param IUser $user
|
||||
*/
|
||||
public function runForUser($user) {
|
||||
$principal = 'principals/users/' . $user->getUID();
|
||||
$calendars = $this->calDavBackend->getCalendarsForUser($principal);
|
||||
foreach ($calendars as $calendar) {
|
||||
$objects = $this->calDavBackend->getCalendarObjects($calendar['id']);
|
||||
foreach ($objects as $object) {
|
||||
$calObject = $this->calDavBackend->getCalendarObject($calendar['id'], $object['uri']);
|
||||
$classification = $this->extractClassification($calObject['calendardata']);
|
||||
$this->calDavBackend->setClassification($object['id'], $classification);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,12 +67,37 @@ class Classification implements IRepairStep {
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function run(IOutput $output) {
|
||||
$output->startProgress();
|
||||
$this->userManager->callForAllUsers(function($user) use ($output) {
|
||||
/** @var IUser $user */
|
||||
$output->advance(1, $user->getDisplayName());
|
||||
$this->runForUser($user);
|
||||
});
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$result = $qb->select($qb->createFunction('COUNT(*)'))
|
||||
->from('calendarobjects')
|
||||
->execute();
|
||||
|
||||
$max = $result->fetchColumn();
|
||||
$output->startProgress($max);
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$query->select(['id', 'calendardata', 'classification'])
|
||||
->from('calendarobjects');
|
||||
|
||||
$stmt = $query->execute();
|
||||
|
||||
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
|
||||
|
||||
$output->advance(1);
|
||||
|
||||
$classification = $this->extractClassification($this->readBlob($row['calendardata']));
|
||||
$this->calDavBackend->setClassification($row['id'], $classification);
|
||||
}
|
||||
|
||||
$output->finishProgress();
|
||||
}
|
||||
|
||||
private function readBlob($cardData) {
|
||||
if (is_resource($cardData)) {
|
||||
return stream_get_contents($cardData);
|
||||
}
|
||||
|
||||
return $cardData;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud GmbH.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* 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, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use OCA\DAV\CalDAV\BirthdayService;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
class FixBirthdayCalendarComponent implements IRepairStep {
|
||||
|
||||
/** @var IDBConnection */
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* FixBirthdayCalendarComponent constructor.
|
||||
*
|
||||
* @param IDBConnection $connection
|
||||
*/
|
||||
public function __construct(IDBConnection $connection) {
|
||||
$this->connection = $connection;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getName() {
|
||||
return 'Fix component of birthday calendars';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function run(IOutput $output) {
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$updated = $query->update('calendars')
|
||||
->set('components', $query->createNamedParameter('VEVENT'))
|
||||
->where($query->expr()->eq('uri', $query->createNamedParameter(BirthdayService::BIRTHDAY_CALENDAR_URI)))
|
||||
->execute();
|
||||
|
||||
$output->info("$updated birthday calendars updated.");
|
||||
}
|
||||
}
|
||||
+16
-4
@@ -26,13 +26,18 @@ namespace OCA\DAV;
|
||||
|
||||
use OCA\DAV\CalDAV\Schedule\IMipPlugin;
|
||||
use OCA\DAV\CardDAV\ImageExportPlugin;
|
||||
use OCA\DAV\Comments\CommentsPlugin;
|
||||
use OCA\DAV\Connector\Sabre\Auth;
|
||||
use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin;
|
||||
use OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin;
|
||||
use OCA\DAV\Connector\Sabre\DavAclPlugin;
|
||||
use OCA\DAV\Connector\Sabre\DummyGetResponsePlugin;
|
||||
use OCA\DAV\Connector\Sabre\FakeLockerPlugin;
|
||||
use OCA\DAV\Connector\Sabre\FilesPlugin;
|
||||
use OCA\DAV\Connector\Sabre\QuotaPlugin;
|
||||
use OCA\DAV\Files\BrowserErrorPagePlugin;
|
||||
use OCA\DAV\Files\CustomPropertiesBackend;
|
||||
use OCA\DAV\SystemTag\SystemTagPlugin;
|
||||
use OCP\IRequest;
|
||||
use OCP\SabrePluginEvent;
|
||||
use Sabre\CardDAV\VCFExportPlugin;
|
||||
@@ -66,13 +71,16 @@ class Server {
|
||||
$this->server->setBaseUri($this->baseUri);
|
||||
|
||||
$this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig()));
|
||||
$authPlugin = new Plugin($authBackend, 'ownCloud');
|
||||
$authPlugin = new Plugin();
|
||||
$this->server->addPlugin($authPlugin);
|
||||
|
||||
// allow setup of additional auth backends
|
||||
$event = new SabrePluginEvent($this->server);
|
||||
$dispatcher->dispatch('OCA\DAV\Connector\Sabre::authInit', $event);
|
||||
|
||||
// because we are throwing exceptions this plugin has to be the last one
|
||||
$authPlugin->addBackend($authBackend);
|
||||
|
||||
// debugging
|
||||
if(\OC::$server->getConfig()->getSystemValue('debug', false)) {
|
||||
$this->server->addPlugin(new \Sabre\DAV\Browser\Plugin());
|
||||
@@ -107,25 +115,27 @@ class Server {
|
||||
$this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger()));
|
||||
|
||||
// system tags plugins
|
||||
$this->server->addPlugin(new \OCA\DAV\SystemTag\SystemTagPlugin(
|
||||
$this->server->addPlugin(new SystemTagPlugin(
|
||||
\OC::$server->getSystemTagManager(),
|
||||
\OC::$server->getGroupManager(),
|
||||
\OC::$server->getUserSession()
|
||||
));
|
||||
|
||||
// comments plugin
|
||||
$this->server->addPlugin(new \OCA\DAV\Comments\CommentsPlugin(
|
||||
$this->server->addPlugin(new CommentsPlugin(
|
||||
\OC::$server->getCommentsManager(),
|
||||
\OC::$server->getUserSession()
|
||||
));
|
||||
|
||||
$this->server->addPlugin(new CopyEtagHeaderPlugin());
|
||||
|
||||
// Some WebDAV clients do require Class 2 WebDAV support (locking), since
|
||||
// we do not provide locking we emulate it using a fake locking plugin.
|
||||
if($request->isUserAgent([
|
||||
'/WebDAVFS/',
|
||||
'/Microsoft Office OneNote 2013/',
|
||||
])) {
|
||||
$this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin());
|
||||
$this->server->addPlugin(new FakeLockerPlugin());
|
||||
}
|
||||
|
||||
if (BrowserErrorPagePlugin::isBrowserRequest($request)) {
|
||||
@@ -158,6 +168,8 @@ class Server {
|
||||
)
|
||||
)
|
||||
);
|
||||
$this->server->addPlugin(
|
||||
new QuotaPlugin($view));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -48,6 +48,9 @@ class AssemblyStream implements \Icewind\Streams\File {
|
||||
/** @var int */
|
||||
private $size;
|
||||
|
||||
/** @var resource */
|
||||
private $currentStream = null;
|
||||
|
||||
/**
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
@@ -100,16 +103,36 @@ class AssemblyStream implements \Icewind\Streams\File {
|
||||
* @return string
|
||||
*/
|
||||
public function stream_read($count) {
|
||||
do {
|
||||
if ($this->currentStream === null) {
|
||||
list($node, $posInNode) = $this->getNodeForPosition($this->pos);
|
||||
if (is_null($node)) {
|
||||
// reached last node, no more data
|
||||
return '';
|
||||
}
|
||||
$this->currentStream = $this->getStream($node);
|
||||
fseek($this->currentStream, $posInNode);
|
||||
}
|
||||
|
||||
list($node, $posInNode) = $this->getNodeForPosition($this->pos);
|
||||
if (is_null($node)) {
|
||||
return null;
|
||||
}
|
||||
$stream = $this->getStream($node);
|
||||
$data = fread($this->currentStream, $count);
|
||||
// isset is faster than strlen
|
||||
if (isset($data[$count - 1])) {
|
||||
// we read the full count
|
||||
$read = $count;
|
||||
} else {
|
||||
// reaching end of stream, which happens less often so strlen is ok
|
||||
$read = strlen($data);
|
||||
}
|
||||
|
||||
fseek($stream, $posInNode);
|
||||
$data = fread($stream, $count);
|
||||
$read = strlen($data);
|
||||
if (feof($this->currentStream)) {
|
||||
fclose($this->currentStream);
|
||||
$this->currentNode = null;
|
||||
$this->currentStream = null;
|
||||
}
|
||||
// if no data read, try again with the next node because
|
||||
// returning empty data can make the caller think there is no more
|
||||
// data left to read
|
||||
} while ($read === 0);
|
||||
|
||||
// update position
|
||||
$this->pos += $read;
|
||||
|
||||
@@ -6,25 +6,11 @@ style('core', ['styles', 'header']);
|
||||
?>
|
||||
<span class="error error-wide">
|
||||
<h2><strong><?php p($_['title']) ?></strong></h2>
|
||||
<p><?php p($_['message']) ?></p>
|
||||
<br>
|
||||
|
||||
<h2><strong><?php p($l->t('Technical details')) ?></strong></h2>
|
||||
<ul>
|
||||
<li><?php p($l->t('Remote Address: %s', $_['remoteAddr'])) ?></li>
|
||||
<li><?php p($l->t('Request ID: %s', $_['requestID'])) ?></li>
|
||||
<?php if($_['debugMode']): ?>
|
||||
<li><?php p($l->t('Type: %s', $_['errorClass'])) ?></li>
|
||||
<li><?php p($l->t('Code: %s', $_['errorCode'])) ?></li>
|
||||
<li><?php p($l->t('Message: %s', $_['errorMsg'])) ?></li>
|
||||
<li><?php p($l->t('File: %s', $_['file'])) ?></li>
|
||||
<li><?php p($l->t('Line: %s', $_['line'])) ?></li>
|
||||
<?php endif; ?>
|
||||
</ul>
|
||||
|
||||
<?php if($_['debugMode']): ?>
|
||||
<br />
|
||||
<h2><strong><?php p($l->t('Trace')) ?></strong></h2>
|
||||
<pre><?php p($_['trace']) ?></pre>
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
|
||||
@@ -3,12 +3,12 @@ SCRIPT=`realpath $0`
|
||||
SCRIPTPATH=`dirname $SCRIPT`
|
||||
|
||||
|
||||
if [ ! -f CalDAVTester/run.py ]; then
|
||||
cd "$SCRIPTPATH"
|
||||
git clone https://github.com/DeepDiver1975/CalDAVTester.git
|
||||
cd "$SCRIPTPATH/CalDAVTester"
|
||||
python run.py -s
|
||||
cd "$SCRIPTPATH"
|
||||
cd "$SCRIPTPATH"
|
||||
if [ ! -f CalDAVTester/testcaldav.py ]; then
|
||||
git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester
|
||||
fi
|
||||
if [ ! -f pycalendar/setup.py ]; then
|
||||
git clone https://github.com/apple/ccs-pycalendar.git pycalendar
|
||||
fi
|
||||
|
||||
# create test user
|
||||
|
||||
@@ -3,12 +3,12 @@ SCRIPT=`realpath $0`
|
||||
SCRIPTPATH=`dirname $SCRIPT`
|
||||
|
||||
|
||||
if [ ! -f CalDAVTester/run.py ]; then
|
||||
cd "$SCRIPTPATH"
|
||||
git clone https://github.com/DeepDiver1975/CalDAVTester.git
|
||||
cd "$SCRIPTPATH/CalDAVTester"
|
||||
python run.py -s
|
||||
cd "$SCRIPTPATH"
|
||||
cd "$SCRIPTPATH"
|
||||
if [ ! -f CalDAVTester/testcaldav.py ]; then
|
||||
git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester
|
||||
fi
|
||||
if [ ! -f pycalendar/setup.py ]; then
|
||||
git clone https://github.com/apple/ccs-pycalendar.git pycalendar
|
||||
fi
|
||||
|
||||
# create test user
|
||||
|
||||
@@ -333,15 +333,20 @@ EOD;
|
||||
|
||||
public function testSubscriptions() {
|
||||
$id = $this->backend->createSubscription(self::UNIT_TEST_USER, 'Subscription', [
|
||||
'{http://calendarserver.org/ns/}source' => new Href('test-source')
|
||||
'{http://calendarserver.org/ns/}source' => new Href('test-source'),
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#1C4587',
|
||||
'{http://calendarserver.org/ns/}subscribed-strip-todos' => ''
|
||||
]);
|
||||
|
||||
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
|
||||
$this->assertEquals(1, count($subscriptions));
|
||||
$this->assertEquals('#1C4587', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
|
||||
$this->assertEquals(true, $subscriptions[0]['{http://calendarserver.org/ns/}subscribed-strip-todos']);
|
||||
$this->assertEquals($id, $subscriptions[0]['id']);
|
||||
|
||||
$patch = new PropPatch([
|
||||
'{DAV:}displayname' => 'Unit test',
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#ac0606',
|
||||
]);
|
||||
$this->backend->updateSubscription($id, $patch);
|
||||
$patch->commit();
|
||||
@@ -350,6 +355,7 @@ EOD;
|
||||
$this->assertEquals(1, count($subscriptions));
|
||||
$this->assertEquals($id, $subscriptions[0]['id']);
|
||||
$this->assertEquals('Unit test', $subscriptions[0]['{DAV:}displayname']);
|
||||
$this->assertEquals('#ac0606', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
|
||||
|
||||
$this->backend->deleteSubscription($id);
|
||||
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
|
||||
|
||||
@@ -178,6 +178,17 @@ class BirthdayServiceTest extends TestCase {
|
||||
], $users);
|
||||
}
|
||||
|
||||
public function testBirthdayCalendarHasComponentEvent() {
|
||||
$this->calDav->expects($this->once())
|
||||
->method('createCalendar')
|
||||
->with('principal001', 'contact_birthdays', [
|
||||
'{DAV:}displayname' => 'Contact birthdays',
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#FFFFCA',
|
||||
'components' => 'VEVENT',
|
||||
]);
|
||||
$this->service->ensureCalendarExists('principal001');
|
||||
}
|
||||
|
||||
public function providesBirthday() {
|
||||
return [
|
||||
[true,
|
||||
|
||||
@@ -606,6 +606,10 @@ class CardDavBackendTest extends TestCase {
|
||||
$this->assertSame(5489543, (int)$result['lastmodified']);
|
||||
$this->assertSame('etag0', $result['etag']);
|
||||
$this->assertSame(120, (int)$result['size']);
|
||||
|
||||
// this shouldn't return any result because 'uri1' is in address book 1
|
||||
$result = $this->backend->getContact(0, 'uri1');
|
||||
$this->assertEmpty($result);
|
||||
}
|
||||
|
||||
public function testGetContactFail() {
|
||||
|
||||
@@ -92,7 +92,7 @@ class ImageExportPluginTest extends TestCase {
|
||||
* @param bool $expected
|
||||
* @param array $getPhotoResult
|
||||
*/
|
||||
public function testCardWithOrWithoutPhoto($expected, $getPhotoResult) {
|
||||
public function testCardWithOrWithoutPhoto($expectedContentType, $getPhotoResult) {
|
||||
$this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]);
|
||||
$this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt');
|
||||
|
||||
@@ -101,20 +101,22 @@ class ImageExportPluginTest extends TestCase {
|
||||
|
||||
$this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult);
|
||||
|
||||
if (!$expected) {
|
||||
$this->response->expects($this->once())->method('setHeader');
|
||||
$this->response->expects($this->once())->method('setStatus');
|
||||
if (is_string($expectedContentType)) {
|
||||
$this->response->expects($this->exactly(2))->method('setHeader')->withConsecutive(
|
||||
['Content-Type', $expectedContentType],
|
||||
['Content-Disposition', 'attachment']);
|
||||
$this->response->expects($this->once())->method('setStatus')->with(200);
|
||||
$this->response->expects($this->once())->method('setBody');
|
||||
}
|
||||
|
||||
$result = $this->plugin->httpGet($this->request, $this->response);
|
||||
$this->assertEquals($expected, $result);
|
||||
$this->assertEquals(!is_string($expectedContentType), $result);
|
||||
}
|
||||
|
||||
public function providesCardWithOrWithoutPhoto() {
|
||||
return [
|
||||
[true, null],
|
||||
[false, ['Content-Type' => 'image/jpeg', 'body' => '1234']],
|
||||
['image/jpeg', ['Content-Type' => 'image/jpeg', 'body' => '1234']],
|
||||
];
|
||||
}
|
||||
|
||||
@@ -140,12 +142,11 @@ class ImageExportPluginTest extends TestCase {
|
||||
'empty vcard' => [false, ''],
|
||||
'vcard without PHOTO' => [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n"],
|
||||
'vcard 3 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
//
|
||||
// TODO: these three below are not working - needs debugging
|
||||
//
|
||||
//'vcard 3 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
//'vcard 4 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => 'http://example.org/photo.jpg'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
'vcard 3 with PHOTO URL' => [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO URL' => [false, "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
'vcard 3 with bad PHOTO' => [['Content-Type' => 'application/octet-stream', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=TXT:MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with bad PHOTO' => [['Content-Type' => 'application/octet-stream', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:video/mpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +166,10 @@ class CommentsNodeTest extends \Test\TestCase {
|
||||
$this->assertTrue($this->node->updateComment($msg));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessage buh!
|
||||
*/
|
||||
public function testUpdateCommentLogException() {
|
||||
$msg = null;
|
||||
|
||||
@@ -198,7 +202,7 @@ class CommentsNodeTest extends \Test\TestCase {
|
||||
$this->logger->expects($this->once())
|
||||
->method('logException');
|
||||
|
||||
$this->assertFalse($this->node->updateComment($msg));
|
||||
$this->node->updateComment($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,23 +22,28 @@
|
||||
*/
|
||||
namespace OCA\DAV\Tests\unit\Connector\Sabre;
|
||||
|
||||
use OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin;
|
||||
use Sabre\DAV\Server;
|
||||
use Test\TestCase;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
class CopyEtagHeaderPluginTest extends \Test\TestCase {
|
||||
class CopyEtagHeaderPluginTest extends TestCase {
|
||||
|
||||
/**
|
||||
* @var \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin
|
||||
*/
|
||||
/** @var CopyEtagHeaderPlugin */
|
||||
private $plugin;
|
||||
|
||||
/** @var Server */
|
||||
private $server;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
$this->server = new \Sabre\DAV\Server();
|
||||
$this->plugin = new \OCA\DAV\Connector\Sabre\CopyEtagHeaderPlugin();
|
||||
$this->plugin = new CopyEtagHeaderPlugin();
|
||||
$this->plugin->initialize($this->server);
|
||||
}
|
||||
|
||||
@@ -60,4 +65,26 @@ class CopyEtagHeaderPluginTest extends \Test\TestCase {
|
||||
|
||||
$this->assertNull($response->getHeader('OC-Etag'));
|
||||
}
|
||||
|
||||
public function testAfterMove() {
|
||||
$node = $this->getMockBuilder('OCA\DAV\Connector\Sabre\File')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$node->expects($this->once())
|
||||
->method('getETag')
|
||||
->willReturn('123456');
|
||||
$tree = $this->getMockBuilder('Sabre\DAV\Tree')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$tree->expects($this->once())
|
||||
->method('getNodeForPath')
|
||||
->with('test.txt')
|
||||
->willReturn($node);
|
||||
|
||||
$this->server->tree = $tree;
|
||||
$this->plugin->afterMove('', 'test.txt');
|
||||
|
||||
$this->assertEquals('123456', $this->server->httpResponse->getHeader('OC-Etag'));
|
||||
$this->assertEquals('123456', $this->server->httpResponse->getHeader('Etag'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +191,8 @@ class FilesPluginTest extends TestCase {
|
||||
$this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
|
||||
$this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME));
|
||||
$this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
|
||||
$this->assertEquals([self::SIZE_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
|
||||
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
|
||||
$this->assertEquals([self::SIZE_PROPERTYNAME], $propFind->get404Properties());
|
||||
}
|
||||
|
||||
public function testGetPropertiesForFileHome() {
|
||||
@@ -332,7 +333,8 @@ class FilesPluginTest extends TestCase {
|
||||
$this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME));
|
||||
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
|
||||
$this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
|
||||
$this->assertEquals([self::DOWNLOADURL_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
|
||||
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
|
||||
$this->assertEquals([self::DOWNLOADURL_PROPERTYNAME], $propFind->get404Properties());
|
||||
}
|
||||
|
||||
public function testGetPropertiesForRootDirectory() {
|
||||
|
||||
@@ -142,6 +142,88 @@ class ObjectTreeTest extends \Test\TestCase {
|
||||
$objectTree->move($source, $destination);
|
||||
}
|
||||
|
||||
public function copyDataProvider() {
|
||||
return [
|
||||
// copy into same dir
|
||||
['a', 'b', ''],
|
||||
// copy into same dir
|
||||
['a/a', 'a/b', 'a'],
|
||||
// copy into another dir
|
||||
['a', 'sub/a', 'sub'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider copyDataProvider
|
||||
*/
|
||||
public function testCopy($sourcePath, $targetPath, $targetParent) {
|
||||
$view = $this->getMock('\OC\Files\View');
|
||||
$view->expects($this->once())
|
||||
->method('verifyPath')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('isCreatable')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('copy')
|
||||
->with($sourcePath, $targetPath)
|
||||
->will($this->returnValue(true));
|
||||
|
||||
$info = new FileInfo('', null, null, array(), null);
|
||||
|
||||
$rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
|
||||
$objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
|
||||
array('nodeExists', 'getNodeForPath'),
|
||||
array($rootDir, $view));
|
||||
|
||||
$objectTree->expects($this->once())
|
||||
->method('getNodeForPath')
|
||||
->with($this->identicalTo($sourcePath))
|
||||
->will($this->returnValue(false));
|
||||
|
||||
/** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
|
||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
||||
$objectTree->init($rootDir, $view, $mountManager);
|
||||
$objectTree->copy($sourcePath, $targetPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider copyDataProvider
|
||||
* @expectedException \Sabre\DAV\Exception\Forbidden
|
||||
*/
|
||||
public function testCopyFailNotCreatable($sourcePath, $targetPath, $targetParent) {
|
||||
$view = $this->getMock('\OC\Files\View');
|
||||
$view->expects($this->once())
|
||||
->method('verifyPath')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('isCreatable')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(false));
|
||||
$view->expects($this->never())
|
||||
->method('copy');
|
||||
|
||||
$info = new FileInfo('', null, null, array(), null);
|
||||
|
||||
$rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
|
||||
$objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
|
||||
array('nodeExists', 'getNodeForPath'),
|
||||
array($rootDir, $view));
|
||||
|
||||
$objectTree->expects($this->once())
|
||||
->method('getNodeForPath')
|
||||
->with($this->identicalTo($sourcePath))
|
||||
->will($this->returnValue(false));
|
||||
|
||||
/** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
|
||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
||||
$objectTree->init($rootDir, $view, $mountManager);
|
||||
$objectTree->copy($sourcePath, $targetPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider nodeForPathProvider
|
||||
*/
|
||||
|
||||
@@ -22,22 +22,20 @@
|
||||
*
|
||||
*/
|
||||
namespace OCA\DAV\Tests\unit\Connector\Sabre;
|
||||
use Test\TestCase;
|
||||
|
||||
/**
|
||||
* Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
class QuotaPluginTest extends \Test\TestCase {
|
||||
class QuotaPluginTest extends TestCase {
|
||||
|
||||
/**
|
||||
* @var \Sabre\DAV\Server
|
||||
*/
|
||||
/** @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject */
|
||||
private $server;
|
||||
|
||||
/**
|
||||
* @var \OCA\DAV\Connector\Sabre\QuotaPlugin
|
||||
*/
|
||||
/** @var \OCA\DAV\Connector\Sabre\QuotaPlugin | \PHPUnit_Framework_MockObject_MockObject */
|
||||
private $plugin;
|
||||
|
||||
private function init($quota, $checkedPath = '') {
|
||||
@@ -124,13 +122,19 @@ class QuotaPluginTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
public function lengthProvider() {
|
||||
return array(
|
||||
array(null, array()),
|
||||
array(1024, array('X-EXPECTED-ENTITY-LENGTH' => '1024')),
|
||||
array(512, array('CONTENT-LENGTH' => '512')),
|
||||
array(2048, array('OC-TOTAL-LENGTH' => '2048', 'CONTENT-LENGTH' => '1024')),
|
||||
array(4096, array('OC-TOTAL-LENGTH' => '2048', 'X-EXPECTED-ENTITY-LENGTH' => '4096')),
|
||||
);
|
||||
return [
|
||||
[null, []],
|
||||
[1024, ['X-EXPECTED-ENTITY-LENGTH' => '1024']],
|
||||
[512, ['CONTENT-LENGTH' => '512']],
|
||||
[2048, ['OC-TOTAL-LENGTH' => '2048', 'CONTENT-LENGTH' => '1024']],
|
||||
[4096, ['OC-TOTAL-LENGTH' => '2048', 'X-EXPECTED-ENTITY-LENGTH' => '4096']],
|
||||
[null, ['X-EXPECTED-ENTITY-LENGTH' => 'A']],
|
||||
[null, ['CONTENT-LENGTH' => 'A']],
|
||||
[1024, ['OC-TOTAL-LENGTH' => 'A', 'CONTENT-LENGTH' => '1024']],
|
||||
[1024, ['OC-TOTAL-LENGTH' => 'A', 'X-EXPECTED-ENTITY-LENGTH' => '1024']],
|
||||
[null, ['OC-TOTAL-LENGTH' => '2048', 'X-EXPECTED-ENTITY-LENGTH' => 'A']],
|
||||
[null, ['OC-TOTAL-LENGTH' => '2048', 'CONTENT-LENGTH' => 'A']],
|
||||
];
|
||||
}
|
||||
|
||||
public function quotaChunkedOkProvider() {
|
||||
@@ -211,8 +215,11 @@ class QuotaPluginTest extends \Test\TestCase {
|
||||
}
|
||||
|
||||
private function buildFileViewMock($quota, $checkedPath) {
|
||||
// mock filesysten
|
||||
$view = $this->getMock('\OC\Files\View', array('free_space'), array(), '', false);
|
||||
// mock file systen
|
||||
$view = $this->getMockBuilder('\OC\Files\View')
|
||||
->setMethods(['free_space'])
|
||||
->setConstructorArgs([])
|
||||
->getMock();
|
||||
$view->expects($this->any())
|
||||
->method('free_space')
|
||||
->with($this->identicalTo($checkedPath))
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* 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, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Tests\unit\DAV\Migration;
|
||||
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCA\DAV\Migration\Classification;
|
||||
use OCA\DAV\Tests\unit\CalDAV\AbstractCalDavBackendTest;
|
||||
use OCP\IUser;
|
||||
|
||||
/**
|
||||
* Class ClassificationTest
|
||||
*
|
||||
* @group DB
|
||||
*
|
||||
* @package OCA\DAV\Tests\unit\DAV
|
||||
*/
|
||||
class ClassificationTest extends AbstractCalDavBackendTest {
|
||||
|
||||
/** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IUserManager */
|
||||
private $userManager;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->userManager = $this->getMockBuilder('OCP\IUserManager')
|
||||
->disableOriginalConstructor()->getMock();
|
||||
}
|
||||
|
||||
public function test() {
|
||||
// setup data
|
||||
$calendarId = $this->createTestCalendar();
|
||||
$eventUri = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
|
||||
// assert proper classification
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
|
||||
$this->backend->setClassification($object['id'], CalDavBackend::CLASSIFICATION_CONFIDENTIAL);
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_CONFIDENTIAL, $object['classification']);
|
||||
|
||||
// run migration
|
||||
$c = new Classification($this->backend, $this->userManager);
|
||||
|
||||
/** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
|
||||
$user = $this->getMockBuilder('OCP\IUser')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$user->expects($this->once())->method('getUID')->willReturn('caldav-unit-test');
|
||||
|
||||
$c->runForUser($user);
|
||||
|
||||
// assert classification after migration
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
|
||||
}
|
||||
}
|
||||
@@ -32,18 +32,78 @@ class AssemblyStreamTest extends \Test\TestCase {
|
||||
$this->assertEquals($expected, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providesNodes()
|
||||
*/
|
||||
public function testGetContentsFread($expected, $nodes) {
|
||||
$stream = \OCA\DAV\Upload\AssemblyStream::wrap($nodes);
|
||||
|
||||
$content = '';
|
||||
while (!feof($stream)) {
|
||||
$content .= fread($stream, 3);
|
||||
}
|
||||
|
||||
$this->assertEquals($expected, $content);
|
||||
}
|
||||
|
||||
function providesNodes() {
|
||||
$data8k = $this->makeData(8192);
|
||||
$dataLess8k = $this->makeData(8191);
|
||||
return[
|
||||
'one node only' => ['1234567890', [
|
||||
'one node zero bytes' => [
|
||||
'', [
|
||||
$this->buildNode('0', '')
|
||||
]],
|
||||
'one node only' => [
|
||||
'1234567890', [
|
||||
$this->buildNode('0', '1234567890')
|
||||
]],
|
||||
'two nodes' => ['1234567890', [
|
||||
'one node buffer boundary' => [
|
||||
$data8k, [
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes' => [
|
||||
'1234567890', [
|
||||
$this->buildNode('1', '67890'),
|
||||
$this->buildNode('0', '12345')
|
||||
]]
|
||||
]],
|
||||
'two nodes end on buffer boundary' => [
|
||||
$data8k . $data8k, [
|
||||
$this->buildNode('1', $data8k),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes with one on buffer boundary' => [
|
||||
$data8k . $dataLess8k, [
|
||||
$this->buildNode('1', $dataLess8k),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes on buffer boundary plus one byte' => [
|
||||
$data8k . 'X' . $data8k, [
|
||||
$this->buildNode('1', $data8k),
|
||||
$this->buildNode('0', $data8k . 'X')
|
||||
]],
|
||||
'two nodes on buffer boundary plus one byte at the end' => [
|
||||
$data8k . $data8k . 'X', [
|
||||
$this->buildNode('1', $data8k . 'X'),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
];
|
||||
}
|
||||
|
||||
private function makeData($count) {
|
||||
$data = '';
|
||||
$base = '1234567890';
|
||||
$j = 0;
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$data .= $base[$j];
|
||||
$j++;
|
||||
if (!isset($base[$j])) {
|
||||
$j = 0;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function buildNode($name, $data) {
|
||||
$node = $this->getMockBuilder('\Sabre\DAV\File')
|
||||
->setMethods(['getName', 'get', 'getSize'])
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
OC.L10N.register(
|
||||
"federatedfilesharing",
|
||||
{
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s"
|
||||
"Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s",
|
||||
"Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{ "translations": {
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s"
|
||||
"Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s",
|
||||
"Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -7,6 +7,8 @@ OC.L10N.register(
|
||||
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
|
||||
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s (au nom de %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s",
|
||||
"Accept" : "Accepter",
|
||||
"Decline" : "Refuser",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
|
||||
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s (au nom de %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s",
|
||||
"Accept" : "Accepter",
|
||||
"Decline" : "Refuser",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
|
||||
|
||||
@@ -2,14 +2,15 @@ OC.L10N.register(
|
||||
"federatedfilesharing",
|
||||
{
|
||||
"Federated sharing" : "連携共有",
|
||||
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
|
||||
"Invalid Federated Cloud ID" : "クラウド統合IDが無効",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
|
||||
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
|
||||
"File is already shared with %s" : "ファイルは既に %s と共有されています。",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。(%2$s の代理として)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。",
|
||||
"Accept" : "承諾",
|
||||
"Decline" : "拒否《はてなキーワード》",
|
||||
"Accept" : "受領",
|
||||
"Decline" : "拒否",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
|
||||
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
|
||||
"Federated Cloud Sharing" : "統合されたクラウド共有",
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
{ "translations": {
|
||||
"Federated sharing" : "連携共有",
|
||||
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
|
||||
"Invalid Federated Cloud ID" : "クラウド統合IDが無効",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
|
||||
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
|
||||
"File is already shared with %s" : "ファイルは既に %s と共有されています。",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。(%2$s の代理として)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。",
|
||||
"Accept" : "承諾",
|
||||
"Decline" : "拒否《はてなキーワード》",
|
||||
"Accept" : "受領",
|
||||
"Decline" : "拒否",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
|
||||
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
|
||||
"Federated Cloud Sharing" : "統合されたクラウド共有",
|
||||
|
||||
@@ -5,7 +5,10 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
|
||||
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
|
||||
"File is already shared with %s" : "Filen deles allerede med %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s (på vegne av %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s",
|
||||
"Accept" : "Aksepter",
|
||||
"Decline" : "Avslå",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
|
||||
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
|
||||
"File is already shared with %s" : "Filen deles allerede med %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s (på vegne av %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s",
|
||||
"Accept" : "Aksepter",
|
||||
"Decline" : "Avslå",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
|
||||
|
||||
@@ -5,7 +5,10 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
|
||||
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
|
||||
"File is already shared with %s" : "ไฟล์ได้ถูกแชร์แล้วกับ %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "คุณได้รับ \"/%3$s\" เป็นรีโมทแชร์จาก %1$s (ในนามของ %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "คุณได้รับ\"/%3$s\" เป็นรีโมทแชร์จาก %1$s",
|
||||
"Accept" : "ยอมรับ",
|
||||
"Decline" : "ลดลง",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
|
||||
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
|
||||
"File is already shared with %s" : "ไฟล์ได้ถูกแชร์แล้วกับ %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "คุณได้รับ \"/%3$s\" เป็นรีโมทแชร์จาก %1$s (ในนามของ %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "คุณได้รับ\"/%3$s\" เป็นรีโมทแชร์จาก %1$s",
|
||||
"Accept" : "ยอมรับ",
|
||||
"Decline" : "ลดลง",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
|
||||
|
||||
@@ -5,6 +5,7 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
|
||||
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
|
||||
"File is already shared with %s" : "Dosya önceden %s ile paylaşıldı",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
|
||||
"Accept" : "Kabul et",
|
||||
"Decline" : "Reddet",
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
|
||||
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
|
||||
"File is already shared with %s" : "Dosya önceden %s ile paylaşıldı",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
|
||||
"Accept" : "Kabul et",
|
||||
"Decline" : "Reddet",
|
||||
|
||||
@@ -39,6 +39,8 @@ class DiscoveryManager {
|
||||
private $cache;
|
||||
/** @var IClient */
|
||||
private $client;
|
||||
/** @var bool */
|
||||
public $underTest = false;
|
||||
|
||||
/**
|
||||
* @param ICacheFactory $cacheFactory
|
||||
@@ -82,6 +84,10 @@ class DiscoveryManager {
|
||||
'share' => '/ocs/v1.php/cloud/shares',
|
||||
];
|
||||
|
||||
if (defined('PHPUNIT_RUN') && !$this->underTest) {
|
||||
return $discoveredServices;
|
||||
}
|
||||
|
||||
// Read the data from the response body
|
||||
try {
|
||||
$response = $this->client->get($remote . '/ocs-provider/', [
|
||||
|
||||
@@ -473,6 +473,8 @@ class FederatedShareProvider implements IShareProvider {
|
||||
|
||||
$isOwner = false;
|
||||
|
||||
$this->removeShareFromTable($share);
|
||||
|
||||
// if the local user is the owner we can send the unShare request directly...
|
||||
if ($this->userManager->userExists($share->getShareOwner())) {
|
||||
$this->notifications->sendRemoteUnShare($remote, $share->getId(), $share->getToken());
|
||||
@@ -494,8 +496,6 @@ class FederatedShareProvider implements IShareProvider {
|
||||
}
|
||||
$this->notifications->sendRevokeShare($remote, $remoteId, $share->getToken());
|
||||
}
|
||||
|
||||
$this->removeShareFromTable($share);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -62,6 +62,7 @@ class DiscoveryManagerTest extends \Test\TestCase {
|
||||
$cacheFactory,
|
||||
$clientService
|
||||
);
|
||||
$this->discoveryManager->underTest = true;
|
||||
}
|
||||
|
||||
public function testWithMalformedFormattedEndpointCached() {
|
||||
|
||||
@@ -7,9 +7,9 @@ OC.L10N.register(
|
||||
"Could not add server" : "サーバーを追加できませんでした",
|
||||
"Federation" : "連携",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud 連携機能では信頼済のownCloudのユーザーディレクトリを相互に接続することができます。例えば、連携で共有したときには、連携先の外部ユーザー名の自動補完を使えるようになります。",
|
||||
"Add server automatically once a federated share was created successfully" : "追加するサーバは自動的に統合され、共有が追加されました",
|
||||
"Trusted ownCloud Servers" : "ownCloudサーバを信頼する",
|
||||
"+ Add ownCloud server" : "ownCloudサーバを追加",
|
||||
"Add server automatically once a federated share was created successfully" : "ownCloudサーバー連携で一度でも共有が作成できた場合は、サーバーを自動的に追加します。",
|
||||
"Trusted ownCloud Servers" : "信頼済 ownCloudサーバ",
|
||||
"+ Add ownCloud server" : "+ownCloudサーバを追加",
|
||||
"ownCloud Server" : "ownCloudサーバ"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"Could not add server" : "サーバーを追加できませんでした",
|
||||
"Federation" : "連携",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud 連携機能では信頼済のownCloudのユーザーディレクトリを相互に接続することができます。例えば、連携で共有したときには、連携先の外部ユーザー名の自動補完を使えるようになります。",
|
||||
"Add server automatically once a federated share was created successfully" : "追加するサーバは自動的に統合され、共有が追加されました",
|
||||
"Trusted ownCloud Servers" : "ownCloudサーバを信頼する",
|
||||
"+ Add ownCloud server" : "ownCloudサーバを追加",
|
||||
"Add server automatically once a federated share was created successfully" : "ownCloudサーバー連携で一度でも共有が作成できた場合は、サーバーを自動的に追加します。",
|
||||
"Trusted ownCloud Servers" : "信頼済 ownCloudサーバ",
|
||||
"+ Add ownCloud server" : "+ownCloudサーバを追加",
|
||||
"ownCloud Server" : "ownCloudサーバ"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
OC.L10N.register(
|
||||
"federation",
|
||||
{
|
||||
"Server added to the list of trusted ownClouds" : "De Server gouf op d'Lëscht vun den zouverlässegen ownClouds gesat.",
|
||||
"Server is already in the list of trusted servers." : "De Server ass schonn op der Lëscht vun den zouverlässegen Serveren.",
|
||||
"No ownCloud server found" : "Keen ownCloud Server fonnt",
|
||||
"Could not add server" : "De Server konnt net derbäi gesat ginn",
|
||||
"Federation" : "Federatioun",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "D'ownCloud Federatioun erlaabt der fir dech mat aneren zouverlässegen ownClouds ze verbannen an d'Benotzer Verzeechnes auszetauschen. Zum Beispill gëtt dëst hei benotzt fir extern Benotzer automatesch fir federatiivt Deelen ze vervollstännegen.",
|
||||
"Add server automatically once a federated share was created successfully" : "Setz de Server automatesch derbäi soubal e federativen Undeel erfollegräich erstallt gouf",
|
||||
"Trusted ownCloud Servers" : "Zouverlässeg ownCloud Serveren",
|
||||
"+ Add ownCloud server" : "+ ownCloud Server derbäi setzen",
|
||||
"ownCloud Server" : "ownCloud Server"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user