Compare commits
354 Commits
executeUpd
...
v9.1.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9a867b70c | ||
|
|
e21717029c | ||
|
|
0f8d950618 | ||
|
|
bd81fca428 | ||
|
|
6193f3f0a3 | ||
|
|
223bca73ab | ||
|
|
ba2d6def75 | ||
|
|
ee6fb9d699 | ||
|
|
5cc70a5252 | ||
|
|
abd55c5adf | ||
|
|
b9757cf88e | ||
|
|
e9ef72462b | ||
|
|
9725ee381c | ||
|
|
4a53f3543c | ||
|
|
37b05946f6 | ||
|
|
32327572fb | ||
|
|
274be16d6e | ||
|
|
af12b542a9 | ||
|
|
dfc86f16d9 | ||
|
|
f118ac6e37 | ||
|
|
8d6a7b756b | ||
|
|
b09e81496e | ||
|
|
d886da7a68 | ||
|
|
63ee829b76 | ||
|
|
1167dfb568 | ||
|
|
3113bcebf3 | ||
|
|
9c299610fc | ||
|
|
4b70d84b0c | ||
|
|
da83e2afd7 | ||
|
|
738c5e7199 | ||
|
|
f6d1e52ecc | ||
|
|
0ed3bb4f92 | ||
|
|
4f2a219942 | ||
|
|
b45e2677b1 | ||
|
|
3c24afe241 | ||
|
|
f131eb4c9a | ||
|
|
94a27b9889 | ||
|
|
c6b2a43bec | ||
|
|
600cd00ffb | ||
|
|
e5231df39c | ||
|
|
66bc5b538a | ||
|
|
497ab1a60a | ||
|
|
1ec9796a23 | ||
|
|
fa7f9a191e | ||
|
|
aefbe29971 | ||
|
|
a2fdd6f2e4 | ||
|
|
68aa221229 | ||
|
|
709d324754 | ||
|
|
556eb1d29f | ||
|
|
7f1fbc8aab | ||
|
|
dc0ea933aa | ||
|
|
547cde9fe7 | ||
|
|
d47c589b04 | ||
|
|
900b804d05 | ||
|
|
ef33460a4d | ||
|
|
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 |
3
.mailmap
3
.mailmap
@@ -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>
|
||||
|
||||
2
3rdparty
2
3rdparty
Submodule 3rdparty updated: 509385e674...f65a242bbd
@@ -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
|
||||
|
||||
144
Jenkinsfile
vendored
Normal file
144
Jenkinsfile
vendored
Normal file
@@ -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!
|
||||
|
||||
@@ -68,9 +68,12 @@ $server = $serverFactory->createServer($baseuri, $requestUri, $authBackend, func
|
||||
$owner = $share->getShareOwner();
|
||||
$fileId = $share->getNodeId();
|
||||
|
||||
// FIXME: should not add storage wrappers outside of preSetup, need to find a better way
|
||||
$previousLog = \OC\Files\Filesystem::logWarningWhenAddingStorageWrapper(false);
|
||||
\OC\Files\Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) {
|
||||
return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => $share->getPermissions() | \OCP\Constants::PERMISSION_SHARE));
|
||||
});
|
||||
\OC\Files\Filesystem::logWarningWhenAddingStorageWrapper($previousLog);
|
||||
|
||||
OC_Util::setupFS($owner);
|
||||
$ownerView = \OC\Files\Filesystem::getView();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
62
apps/dav/lib/Migration/FixBirthdayCalendarComponent.php
Normal file
62
apps/dav/lib/Migration/FixBirthdayCalendarComponent.php
Normal file
@@ -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.");
|
||||
}
|
||||
}
|
||||
@@ -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;"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user