Compare commits

...

227 Commits

Author SHA1 Message Date
Vincent Petry 5cc7dd8922 Final 9.1.1 in version.php 2016-09-19 16:45:41 +02:00
Vincent Petry aed4ee9f81 Increased version for 9.1.1 RC3 2016-09-13 20:00:48 +02:00
Vincent Petry debe1c3f84 Improve chunk upload AssemblyStream performance (#26062) (#26072) 2016-09-09 14:53:12 +02:00
Vincent Petry 6fe80377e8 Only use realpath for real directories (#26060)
In some cross-local-storage use cases, the Local storage is
instantiated with "/" as data directory. In such cases, calling
realpath() would cause PHP warnings when open_basedir is set.

This fix bypasses the realpath() call when dealing with a root storage.
2016-09-08 15:14:20 +02:00
Vincent Petry f572239546 Increase version for 9.1.1RC2 2016-09-07 20:48:37 +02:00
Vincent Petry d614c12d3f Merge pull request #26050 from owncloud/stable9.1-prefilter-inaccessible-shares
[stable9.1] Prefilter inaccessible shares in DefaultShareProvider::getSharedWith()
2016-09-07 11:00:28 +02:00
Vincent Petry 64151706e6 Merge pull request #26041 from owncloud/stable9.1-fed-share-retry
[stable9.1] Fix fed share test call to return proper result
2016-09-07 10:58:39 +02:00
Vincent Petry bc81af74e7 Merge pull request #26048 from owncloud/stable9.1-cath-needs-upgrade-non-cli
[Stable9.1] catch needs upgrade non cli
2016-09-07 08:31:56 +02:00
Vincent Petry 39182a49ab Prefilter inaccessible shares in DefaultShareProvider::getSharedWith()
The DefaultShareProvider now does a DB-level check to find out whether
file_source is accessible at all (deleted file) or whether it's in the
trashbin of a home storage.

One small corner case where the home storage id is in md5 form cannot
be covered properly with this approach.
2016-09-07 07:35:26 +02:00
Vincent Petry 4f0d8d4943 Fix fed share test call to return proper result
Fixes an issue where retrying a previously failed federated share would
not properly reset the availability flag because the return value was
undefined instead of "true".
2016-09-07 07:31:18 +02:00
Vincent Petry faa6c45089 Merge pull request #26043 from owncloud/stable9.1-d17a7ff32a38804d9e6cfbc7dde36fe2f4b73c39
[stable9.1] Fix failing preview unit tests (#26039)
2016-09-07 07:30:43 +02:00
Victor Dubiniuk a2d01aab8a Pass web requests to occ controller if upgrade is needed 2016-09-06 23:32:14 +03:00
Vincent Petry 7cc8f4d7e9 Merge pull request #26045 from owncloud/stable9.1-fix-shareperms-increase-owner
[stable9.1] Allow increasing permissions for share owner
2016-09-06 17:51:12 +02:00
Vincent Petry d8d29f2221 Allow increasing permissions for share owner
In some cases, the owner of the share is also recipient through a group
share. The owner must still be able to increase permissions in that
situation.
2016-09-06 16:20:36 +02:00
Thomas Müller 3560458714 [stable9.1] Fix failing preview unit tests (#26039) 2016-09-06 15:28:10 +02:00
Jörn Friedrich Dreyer 7c042a47e8 forward port smbfixes (#25951) 2016-09-06 08:24:20 +02:00
Thomas Müller 8fe2daaa9e [stable9.1] Comments field is not properly escaped (#26008) (#26009) 2016-09-02 10:35:01 +02:00
Vincent Petry bb291e2932 Merge pull request #25987 from owncloud/stable9.1-integration_tests_local_external_storage
Stable9.1 integration tests local external storage
2016-08-31 10:00:30 +02:00
Sergio Bertolín c145ca0bac Changed enabled/disabled app in provisioning api tests 2016-08-30 14:57:02 +00:00
Sergio Bertolín d4d3e3b128 External storage was not enabled and content was not deleted before scenarios
Conflicts:
	build/integration/features/bootstrap/BasicStructure.php
	build/integration/run.sh
2016-08-30 14:56:45 +00:00
Sergio Bertolín 12b28f8b86 Added local_storage folder 2016-08-30 14:54:11 +00:00
Sergio Bertolin d87dbad598 Run as current user
Conflicts:
	build/integration/run.sh
2016-08-30 14:54:08 +00:00
Sergio Bertolin 46f23622c4 Removed extra context added needed option and remove storage after external storage scenarios
Conflicts:
	build/integration/features/bootstrap/BasicStructure.php
	build/integration/run.sh
2016-08-30 14:51:07 +00:00
Sergio Bertolin 2061fed3e2 Added feature and context, not working yet, option to allow sharing needs to be added 2016-08-30 14:43:39 +00:00
Sergio Bertolín 794229a783 Creating the folder when the tests run
Conflicts:
	build/integration/features/bootstrap/BasicStructure.php
	build/integration/run.sh
2016-08-30 14:43:33 +00:00
Vincent Petry 22c1ea893b Add integration test for sharing with group, then user in group
Add integration test for the use case where a group share exists and
then the same owner creates a direct share to a user in that group.
2016-08-30 14:37:00 +00:00
Vincent Petry 5119b630df Allow space for federated share id search (#25981) 2016-08-30 12:20:01 +02:00
Vincent Petry 0fae262b0b Added closeCursor in SharedMount numeric id (#25979) 2016-08-30 12:19:48 +02:00
Vincent Petry 6870045cf4 Merge pull request #25948 from owncloud/stable9.1-usermountcache-orphanedshare
[stable9.1] Prevent error with orphaned shares when updating user mount cache
2016-08-29 17:07:59 +02:00
Vincent Petry c195ee678d Prevent error with orphaned shares when updating user mount cache 2016-08-29 10:59:19 +02:00
VicDeo 1b558ae201 Fix redirection taking care of protocol and port (#25956) 2016-08-29 09:27:15 +02:00
Thomas Müller 74c2c63b31 [stable9.1] Don't log credentials of LoginController::tryLogin (#25902) (#25935)
* Don't log credentials of LoginController::tryLogin - fixes #25895

* Don't log password in loginWithPassword
2016-08-29 09:15:17 +02:00
Vincent Petry 5cb0d5823c Merge pull request #25929 from owncloud/stable9.1-integration-tests-subadmins
Stable9.1 integration tests subadmins
2016-08-26 15:01:19 +02:00
Sergio Bertolín 4a0b0bc53f Typo in scenario 2016-08-25 00:19:57 +02:00
Sergio Bertolin 7d641bbfdf Change of user missing 2016-08-25 00:19:57 +02:00
Sergio Bertolin 8c7491cac2 Only check the pertenence to groups 2016-08-25 00:19:57 +02:00
Sergio Bertolin ef16b119de Added testcases about adding and removing users to groups using subadmins 2016-08-25 00:19:56 +02:00
Vincent Petry a870db5cd2 Merge pull request #25931 from owncloud/stable9.1-users-lazydropdownwithpencil
[stable9.1] Users page lazy multiselect group dropdowns
2016-08-24 19:36:49 +02:00
Vincent Petry 7633cd967d Users page lazy multiselect group dropdowns
Instead of pre-rendering all multiselects with lots of group entries,
the current groups are now displayed as simple labels.
Behind the labels there is a pencil icon like for other fields.
When clicking the pencil icon, the dropdown will be spawned and will
open itself.
Upon closing of the dropdown, the label comes back with the updated
selection and the dropdown is destroyed.
2016-08-24 16:38:56 +02:00
Vincent Petry 72745eff07 Merge pull request #25914 from owncloud/stable9.1-4f73fb491a2bf12dbf4d20964cfd0f7129f998b1
[stable9.1] Add occ command to expire the trashbin (#25878)
2016-08-24 09:45:30 +02:00
Thomas Müller 85e8a46e14 [stable9.1] 2FA can now be enabled and disabled via the provisioning api (#25911)
* [stable9.1] 2FA can now be enabled and disabled via the provisioning api

* [9.1] Return proper 'true' and 'false' values for two_factor_auth_enabled in provisioning api
2016-08-23 15:12:10 +02:00
Thomas Müller cc65604955 [stable9.1] Add occ command to expire the trashbin (#25878)
* Add occ command to expire the trashbin

* Fix versions folder in setup check
2016-08-23 14:03:50 +02:00
Vincent Petry 04605ad442 Merge pull request #25906 from owncloud/stable9.1-db60e65409e7c6d4f1bde5062af53fbad6e8b412
[stable9.1] Fix issues where some user settings cannot be loaded when…
2016-08-23 09:34:56 +02:00
Thomas Müller 3ae319fdaa [stable9.1] Fix empty PATH_INFO (#25904) 2016-08-22 22:08:00 +02:00
Thomas Müller bbfa0fe833 [stable9.1] Fix issues where some user settings cannot be loaded when the user id differs in case sensitivity - fixes #25684 (#25686) 2016-08-22 20:38:10 +02:00
Vincent Petry 8003c16105 Merge pull request #25898 from owncloud/stable9.1-a9e633db0cd04cb6288ce74c197153920a0b4665
[stable9.1] Best practice through out the web speak of a max avatar i…
2016-08-22 18:47:34 +02:00
Vincent Petry 13d794ff88 Merge pull request #25866 from owncloud/stable9.1-3cebeb168023627a0e511cd9864df9372098b55e
[stable9.1] 25532_issue_password_update_notification_updated (#25756)
2016-08-22 17:32:40 +02:00
Vincent Petry 5aa789272a Merge pull request #25888 from owncloud/stable9.1-27a5be96f108d4ab2b91bcd765433e1646ba9bf2
[9.1] Before a user is getting scanned the database connection is re-…
2016-08-22 17:19:44 +02:00
Vincent Petry 4e8718a78e Merge pull request #25886 from owncloud/stable9.1-init-filesconfig
[stable9.1] Make sure file list files config always exists
2016-08-22 17:18:19 +02:00
Thomas Müller 4c7135a44d [stable9.1] Best practice through out the web speak of a max avatar image size of… (#25857)
* Best practice through out the web speak of a max avatar image size of 96 pixels

* Respect size argument

THX @felixboehm
2016-08-22 14:17:01 +02:00
Vincent Petry 6c64d36f48 [9.1] Before a user is getting scanned the database connection is re-establ… 2016-08-22 11:17:06 +02:00
Vincent Petry c4ba9f2f97 Make sure file list files config always exists
Initialize files config with defaults in case none was passed
2016-08-22 09:48:12 +02:00
Vincent Petry 20aa7ee280 Display number of hidden files in files summary (#25877)
When dot files are hidden, the table summary and selection summary will
not show how many hidden files were included.
2016-08-19 23:26:16 +02:00
Vincent Petry ced5ba0763 Fix hidden files handling (#25865)
Hidden files (dot files) are now always rendered in the DOM to make
sure that all file operations and selection still work as expected.

Their visibility is now toggled on CSS level.
2016-08-19 17:09:34 +02:00
Juan Pablo Villafañez e466349754 Hide the LDAP password in the client side (#25872)
Connection checks will be done by using the configuration id, with the
stored password. LDAP password won't be sent to the client.

Conflicts:
	apps/user_ldap/ajax/testConfiguration.php
2016-08-19 16:49:01 +02:00
Jack Davis e27efa5d52 [stable9.1] 25532_issue_password_update_notification_updated (#25756)
* Password Update Notification

Added an IF ELSE statement to ensure that feedback is provided to the
user on successfully updating a user password in settings.

* Password Update Success Message

Updated the password update success message
2016-08-19 10:48:29 +02:00
Thomas Müller c058e9456c [stable9.1] Move over to new CalDAVTester repo (#25859) (#25863)
* Move over to new caldac tester repo

* no run.py anymore
2016-08-19 10:30:16 +02:00
Vincent Petry 80a4940267 Merge pull request #25860 from owncloud/stable9.1-aedae12db5ebfaf56bec91b736fb8a569cecf16f
[stable9.1] In cases where the server dictates the link share expirat…
2016-08-19 10:16:14 +02:00
Thomas Müller 554e96cb1c [stable9.1] In cases where the server dictates the link share expiration the date is not updated on consequitive changes and enable/disable actions 2016-08-19 00:35:07 +02:00
Daniel Molkentin 8b9536c22b correct version string to 9.1.1 RC1 2016-08-18 13:20:29 +02:00
Daniel Molkentin 3737f5ad80 ownCloud Server 9.1.1 RC1 2016-08-18 13:16:34 +02:00
Vincent Petry fb9576df9e [stable9.1] Dont decrypt shared files (#25831)
* Take from https://github.com/nextcloud/server/pull/608/commits/351cab6bce41b53f9efd4ba9aed4e7435f843691 - THX @schiessle

* Fix unit tests
2016-08-18 12:00:52 +02:00
Vincent Petry d4ec50c637 Merge pull request #25849 from owncloud/stable9.1-fixtypo
[stable9.1] fix typo
2016-08-18 11:51:32 +02:00
Vincent Petry 98af8941ef Merge pull request #25837 from owncloud/stable9.1_nobodyifnocontent
[stable9.1] 204 and 304 must not have a body, see https://tools.ietf.org/html/rfc7230#section-3.3
2016-08-18 11:47:06 +02:00
Jörn Friedrich Dreyer 9bbf347e58 fix typo 2016-08-18 10:51:32 +02:00
Vincent Petry b59b6978de Merge pull request #25845 from owncloud/stable9.1-remove_reference_magic
[stable9.1] remove reference magic
2016-08-18 10:09:12 +02:00
Jörn Friedrich Dreyer c687c89354 remove reference magic 2016-08-17 17:21:52 +02:00
Vincent Petry 0815af34c0 Merge pull request #25841 from owncloud/stable9.1-fix-unmerged-shares-repair-betterregexp
[stable9.1] Improve regexp to detect duplicate folders when repairing unmerged shares
2016-08-17 17:02:20 +02:00
Vincent Petry aea66fabf4 Improve regexp to detect duplicate folders when repairing unmerged shares 2016-08-17 14:24:36 +02:00
Jörn Friedrich Dreyer 35f9a562df 204 and 304 must not have a body, see https://tools.ietf.org/html/rfc7230#section-3.3 2016-08-17 11:31:46 +02:00
Vincent Petry 4765f5b214 Merge pull request #25819 from owncloud/stable9.1-disable-nfd-wrapper
[stable9.1] Disable NFD encoding wrapper by default
2016-08-17 10:44:42 +02:00
Vincent Petry 64d78879db Merge pull request #25812 from owncloud/stable9.1-fix-unmerged-shares-repair-targetdecision
[stable9.1] Fix unmerged shares repair targetdecision
2016-08-17 09:41:46 +02:00
Vincent Petry b7356d881b Merge pull request #25811 from owncloud/stable9.1-smb-trace
[stable9.1] add conditional smb trace logging for debug purposes
2016-08-16 16:48:23 +02:00
Vincent Petry 22d20833b5 Disable NFD encoding wrapper by default
Seems I forgot to set it back to false after testing.
Will give a performance boost for all storages.
2016-08-16 15:46:35 +02:00
Vincent Petry 01a51543a5 Merge pull request #25776 from owncloud/stable9.1-eaecf0cfa9094eb5224e568b7bdde1bd49cfad73
[stable9.1] Merge pull request #25652 from owncloud/fix-getQuota-on-null
2016-08-16 13:55:04 +02:00
Vincent Petry 4b9879db3d Merge pull request #25789 from owncloud/stable9.1-usermountcache-hell-shortcutstorageid
[stable9.1] Fix sharedstorage recursion hell
2016-08-16 13:40:52 +02:00
Vincent Petry c5477ad059 Merge pull request #25797 from owncloud/stable9.1-provisioning-api-subadmin-addtogroup
[stable9.1] Fix subadmin permission check for addToGroup/removeFromGroup
2016-08-16 12:01:02 +02:00
Vincent Petry 8cca364160 Fix unmerged shares repair with mixed group and direct shares
Whenever a group share is created after a direct share, the stime order
needs to be properly considered in the repair routine, considering that
the direct user share is appended to the $subShares array and breaking
its order.
2016-08-16 11:08:07 +02:00
Vincent Petry 03a65e5e3a Improve file_target finding logic when repairing unmerged shares
Pick the most recent subshare that has no parenthesis from duplication
which should match whichever name the user picked last. If all
subshares have duplicate parenthesis names, use the least recent group
share's target instead.
2016-08-16 11:08:02 +02:00
Jörn Friedrich Dreyer 5d6a2b8041 add conditional smb trace logging for debug purposes 2016-08-16 11:05:37 +02:00
Vincent Petry c492277cf1 Merge pull request #25751 from owncloud/stable9.1-shared-cachethepropagatorinstance
[stable9.1] Store the shared propagator instance
2016-08-15 16:40:23 +02:00
Vincent Petry 837bf1c587 Use FailedStorage when share is invalid 2016-08-15 11:09:39 +02:00
Vincent Petry dc7d55c857 Flag to not recurse into shared mounts in getPath 2016-08-15 11:09:39 +02:00
Vincent Petry 3717e6237e Lazy init shared storage by tweaking jail 2016-08-15 11:09:39 +02:00
Vincent Petry c8a385d61e Get shared storage numeric id directly from DB
To prevent recursions in initMountPoints which requires the numeric id
to populate oc_mounts
2016-08-15 11:09:39 +02:00
Vincent Petry aacf391f8b Fix subadmin permission check for addToGroup/removeFromGroup
Fixes issue where subadmins could never add users to a group.
Added missing unit tests
2016-08-15 10:46:47 +02:00
Vincent Petry df16a0c5e3 Store the shared propagator instance
This instead of recreating it for every call.
2016-08-15 10:08:01 +02:00
Markus Goetz 4033a6b65a DAV: Return data-fingerprint always when asked (#25482)
For owncloud/client#5056
Users can configure arbitrary subfolders for syncing, therefore we should
always return it when asked for.
The sync client makes sure to not always ask for it to save bandwidth.
2016-08-13 17:03:54 +02:00
Jörn Friedrich Dreyer 563df59f58 [stable9.1] lastInsertId requires the prefix (#25785)
backport of https://github.com/owncloud/core/pull/25764
2016-08-12 15:10:01 +02:00
Juan Pablo Villafañez a986fd4b79 [stable9.1] Fix smb attributes stable9 1 (#25733)
* Fix file permissions for SMB (read-only folders will be writeable)

* Read-only folders won't be deletable

* Added comment for the read-only behaviour for folders
2016-08-12 12:06:30 +02:00
Vincent Petry 6e44ef83ff Fix OR operands in SharedMountTest (#25779) 2016-08-12 08:55:29 +02:00
Vincent Petry 80e106f04a Merge pull request #25737 from owncloud/stable9.1-99611d277521b84a943f68d48fe05f290127db7e
[stable9.1] getJailedPath expects $path to have a trailing /  (#25703)
2016-08-11 21:28:38 +02:00
Vincent Petry befed183e5 [stable9.1] Merge pull request #25652 from owncloud/fix-getQuota-on-null
Ensure the user exists before calling a method on it
2016-08-11 19:51:31 +02:00
Thomas Müller 912aa4f82b [Stable9.1] fix unit test on new jenkins setup and adjust Jenkinsfile (#25772)
* [stable9.1] Next step jenkinsfile (#25622)

* Adding timestamper and evaluation of test results even in case of failure

* Adding build timeout

* use fixed value 120 minutes as timeout for each test executing for now

* Terminate the build as soon as test execution fails

* Adjust external testing as well

* Finalize use of executeAndReport

* [stable9.1] Fix discoverymanager tests (#25769)

* Allow testing of the DiscoveryManager

* Array sort order is of no relevance
2016-08-11 19:33:33 +02:00
Thomas Müller 4b1b5adb34 [stable9.1] Faster classification migration (#25638)
* [stable9.1] Faster classification migration

* Update PHPDoc
2016-08-10 22:50:04 +02:00
Thomas Müller ed59de57bb [stable9.1] Add missing array element - fixes #25714 (#25732) 2016-08-10 22:48:45 +02:00
Jörn Friedrich Dreyer 4d47963a6e Skip version and trash expiry for users that never logged in (#25745) 2016-08-10 17:39:03 +02:00
Jörn Friedrich Dreyer ee7106ca71 log class name, ID only is hard to debug (#25746) 2016-08-10 16:51:30 +02:00
Thomas Müller a32f50a5bf [stable9.1] getJailedPath expects $path to have a trailing / (#25703)
* getJailedPath expects $path to have a trailing / - fixes #25464

* Adding test case for getPathById including a jailed cache where root is just empty
2016-08-09 10:05:53 +02:00
VicDeo ee72c9b1e8 Respect theme for external folder icon (#25487) (#25711)
See issue #25461. 
When using a theme with alternative filetype icons `OCA.External.StatusManager.Utils.getIconRoute` should respect that, rather than hard coding the default icon.

Note this change does not affect windows_network_drive and sharepoint icons, which appear not to be easily themeable.
2016-08-09 09:54:19 +02:00
Thomas Müller 1a497b1027 [stable9.1] Fix undefined OfflineUser::composeAndStoreDisplayName() - fixes #23248 (#25601) 2016-08-03 08:29:37 +02:00
Thomas Müller 66f86bc686 [stable9.1] Added integration test (#25675)
* [stable9.1] Added integration test

* A shared storage is never a home storage - fixes #25582
2016-08-02 22:28:37 +02:00
Thomas Müller f376122168 [stable9.1] Load the app before executing it's repair steps (#25650) (#25674) 2016-08-02 13:41:00 +02:00
Sergio Bertolín db85499697 Add integration test for sharing with group, then user in group (#25672)
Add integration test for the use case where a group share exists and
then the same owner creates a direct share to a user in that group.
2016-08-01 17:49:30 +02:00
Thomas Müller 62235e511d [stable9.1] Adding quota plugin to new dav endpoint (#25615) (#25648)
* Adding quota plugin to new dav endpoint

* Added integrated test failing in old endpoint

* Added 0B quota test
2016-08-01 11:12:06 +02:00
Vincent Petry 97e24aed58 Prevent setting email and triggering events at login time (#25554)
Whenever an LDAP user also has an email address defined in LDAP, the
LDAP code will try and update the email address of the locally known
user. This happens at login time or every time the user's LDAP
attributes are processed.

There is code listening to the email setting hook which updates the
system address book, which also will trigger FS setup due to avatars
and other things.

This fix only sets the email address when really necessary.
2016-07-26 21:09:25 +02:00
Vincent Petry 56ee571dc3 [stable9.1] Group shares with same source and target (#25534)
* Group shares with same source and target

Fixes #24575

Note that this is a very limited solution and eventually we want smarter
merging!

* Add integration tests for merging received shares

* Improved share grouping readability + fixed test

* Add repair step for unmerged shares (WIP)

* Added more tests for sharing's MountProvider

* Group incoming shares for resharing in JS

* Adjust repair version check for unmerged shares

* Fix RepairUnmergedShares to not skip valid repair cases

The repair step was a bit overeager to skip repairing so it missed the
case where a group share exists without subshares but with an
additional direct user share.

* Add integration tests for double shares with rename in between

* Make share target consistent when grouping group share with user share

In some situations, a group share is created before a user share, and
the recipient renamed the received share before the latter is created.
In this situation, the "file_target" was already modified and the second
created share must align to the already renamed share.

To achieve this, the MountProvider now groups only by "item_source"
value and sorts by share time. This makes it so that the least recent
share is selected as super-share and its "file_target" value is then
adjusted in all grouped shares.

This fixes the issue where this situation would have different
"file_target" values resulting in two shared folders appearing instead
of one.
2016-07-26 11:57:05 +02:00
Thomas Müller 2bf6f54366 [stable9.1] Simplify testPermissionMovedGroupShare (#25573) (#25607)
Reduces significantly the testing time but still cover the permission
change
2016-07-26 11:43:36 +02:00
Thomas Müller ec02b8bf25 [stable9.1] Redirect to default page after login - fixes #25562 (#25600) (#25609) 2016-07-26 11:07:17 +02:00
Thomas Müller f5c5bac0fe [stable9.1] Fixes undefined two-factor-providers (#25605) (#25606) 2016-07-25 22:29:14 +02:00
Thomas Müller b247e4e5ff [stable9.1] Especially with coverage enabled execution times are pretty high (#25517) (#25595) 2016-07-25 09:26:13 +02:00
Thomas Müller 716273a918 [stable9.1] Use explode() instead of split() - fixes #25483 (#25488) (#25499) 2016-07-24 10:54:23 +02:00
Thomas Müller 9f2117613d Add all properties while creating a subscription (#25318) (#25335)
Fixes #24469
2016-07-21 15:58:46 +02:00
Thomas Müller 1550ae93ef [stable9.1] Test jenkins pipeline (#25401) (#25501) 2016-07-21 10:54:36 +02:00
Vincent Petry 57a045efcb [stable9.1] Filelist change dir auto-prepend slash (#25377)
* Filelist change dir auto-prepend slash

Prepend a slash to directories in case it was missing since many places
assume that it's there.

* Fix js unit test in filelist spec
2016-07-21 10:52:34 +02:00
Daniel Molkentin b642b26f72 ownCloud Server 9.1.0 final 2016-07-20 11:05:19 +02:00
Daniel Molkentin 28a689c856 ownCloud Server 9.1.0 RC4 2016-07-18 19:43:34 +02:00
Vincent Petry dd3e5e0e88 Backport guzzlehttp fix from 5.3.1 2016-07-18 19:37:24 +02:00
Daniel Molkentin 425107ba2f ownCloud Server 9.1.0 RC3 2016-07-18 14:30:21 +02:00
Thomas Müller 0aef283dff [stable9.1] Added custom exception as non fatal (#25486) (#25489) 2016-07-16 01:19:14 +02:00
Vincent Petry ef7d362810 Change load order of auth backends so that we can throw an exception in OCA\DAV\Connector\Sabre\Auth - fixes #25362 (#25478) 2016-07-14 16:19:41 +02:00
Daniel Molkentin a9faa22241 ownCloud Server 9.1.0 RC2 2016-07-13 18:09:14 +02:00
Vincent Petry 084f46917a [stable9.1] Adding certificate revocation list and validate if the app certificate is revoked (#25468)
* Adding certificate revocation list and validate if the app certificate is revoked

* Check integrity of a signed app in any case on installation
2016-07-13 16:12:25 +02:00
Thomas Müller 0daddd5866 [stable9.1] Cast share id to string (#25402) (#25432) 2016-07-13 14:34:52 +02:00
Vincent Petry 92f49fbb39 [stable9.1] Workaround to check htaccess in case of redirects (#25434)
* Workaround to check htaccess in case of redirects

In some setups, the web server will redirect any call to "data/" to the
main page. This causes the XHR to return the 200 HTTP status code and
the body contains the HTML page of the main page / files app.

This fix improves the htaccess failure detection by adding a known
string inside the test file "htaccesstest.txt". If we are able to find
this string, it means that the web server didn't block access to that
file.

* Fix setup check unit test (#25439)
2016-07-13 10:40:33 +02:00
Vincent Petry 3de4dfb2e5 Merge pull request #25448 from owncloud/stable9.1-webdav-copypermissions
[stable9.1] Additional perm check in Webdav
2016-07-12 14:37:15 +02:00
Sergio Bertolín c301b8d71e Modified integration tests 2016-07-12 08:47:11 +02:00
Vincent Petry 9712c9db0f Additional perm check in Webdav 2016-07-12 08:47:07 +02:00
Vincent Petry 0ddbf5c981 [stable9.1] Revert invalid commits from master->stable9.1 merge (#25420)
* Revert "Merge pull request #25240 from owncloud/remove-svg"

This reverts commit 8b8d2b679a, reversing
changes made to a35747b6fa.

* Revert "Merge pull request #25253 from owncloud/users-fixotherquotadropdown"

This reverts commit a35747b6fa, reversing
changes made to a573b6863c.

* Revert "Merge pull request #25314 from owncloud/files_external-backends-config"

This reverts commit a573b6863c, reversing
changes made to 8147eefaeb.

* Revert "Add all properties while creating a subscription (#25318)"

This reverts commit aaf4c3073a.

* Revert "Merge pull request #25276 from owncloud/delete-own-session-token"

This reverts commit e42ce62ce2, reversing
changes made to aaf4c3073a.

* Revert "Merge pull request #25262 from owncloud/fed-sharing-error"

This reverts commit 027715f9ac, reversing
changes made to e42ce62ce2.
2016-07-08 16:56:13 +02:00
Thomas Müller 830c1f2fbf [stable9.1] Set content type when downloading log file to force download in some browsers (#25382) (#25397) 2016-07-08 09:15:38 +02:00
Thomas Müller 0ec43a4f0f [stable9.1] Use named parameter instead of direct value for system tags search param (#25380) (#25395) 2016-07-07 12:28:26 +02:00
VicDeo 8b601c567d Bypass upgrade page when occ controller is requested (#25366) 2016-07-06 22:08:34 +02:00
Jörn Friedrich Dreyer 513e4aac85 Cap LDAP user cache (#25326) 2016-07-06 21:28:17 +02:00
Vincent Petry de5b3c5d35 Merge pull request #25374 from owncloud/stable9.1-147c672f5866002d45ec68e99e379449792eeaf8
[stable9.1] Ignore invalid paths in the JS file list
2016-07-06 12:50:34 +02:00
Vincent Petry e2dbc0d0e6 Ignore invalid paths in the JS file list (#25368) 2016-07-06 12:01:23 +02:00
Carlos Damken 19cf727a0f Files_Versions don't show when the files are erased 2016-07-05 19:53:06 +02:00
Carlos Damken 7c4108ee4b Merge branch 'stable9.1' of https://github.com/owncloud/core 2016-07-05 19:03:28 +02:00
Vincent Petry e668cf1a33 Merge pull request #25356 from owncloud/checkupgrade-bypass
Bypass upgrade page when occ controller is requested
2016-07-05 12:04:19 +02:00
Vincent Petry 8a298c4635 Merge pull request #25347 from owncloud/fix-ldap-check-user-stable9.1
[stable9.1] check if renamed user is still valid by reapplying the ldap filter
2016-07-05 11:33:06 +02:00
Vincent Petry 1d10d58284 Merge pull request #25344 from owncloud/fix-ldap-check-user
check if renamed user is still valid by reapplying the ldap filter
2016-07-05 11:29:55 +02:00
Thomas Müller 3bde47cffe fix swift primary object store test (#25281)
* Wait for socket to be open

* Fix call on null

* Allow DB access for MountProviderTest

Makes unit tests pass when using object store, since their FS access is
actually oc_filecache DB access. It is currently not possible to mock
or bypass the logic from "SharedMount::verifyMountPoint()" triggered by
this test.
2016-07-05 08:54:51 +02:00
Jenkins for ownCloud e7cc8bac1e [tx-robot] updated from transifex 2016-07-05 02:31:32 -04:00
Victor Dubiniuk 89e581acf8 Bypass upgrade page when occ controller is requested 2016-07-05 09:20:37 +03:00
Morris Jobke 8b8d2b679a Merge pull request #25240 from owncloud/remove-svg
Remove SVG fallback
2016-07-04 17:49:00 +02:00
Vincent Petry a35747b6fa Merge pull request #25253 from owncloud/users-fixotherquotadropdown
Fix "Other" value handling in quota dropdown in users page
2016-07-04 16:13:18 +02:00
Vincent Petry a573b6863c Merge pull request #25314 from owncloud/files_external-backends-config
show configuration options for authentication backends
2016-07-04 16:10:03 +02:00
Joas Schilling 8147eefaeb Change nickvergessen mailmap entry (#25349) 2016-07-04 15:19:47 +02:00
felixboehm 325776eaf2 check if renamed user is still valid by reapplying the ldap filter (#25338) 2016-07-04 14:22:49 +02:00
felixboehm aa42d60c5f check if renamed user is still valid by reapplying the ldap filter (#25338) 2016-07-04 14:20:08 +02:00
Jörn Friedrich Dreyer 6b4b337e53 Cap LDAP user cache (#25323) 2016-07-04 13:57:15 +02:00
Jenkins for ownCloud 59fc3ff45a [tx-robot] updated from transifex 2016-07-04 01:56:34 -04:00
Jenkins for ownCloud 6a89a63d2e [tx-robot] updated from transifex 2016-07-03 01:54:52 -04:00
Jenkins for ownCloud b0bad03234 [tx-robot] updated from transifex 2016-07-02 01:54:53 -04:00
Hendrik Leppelsack 5cc01476e4 adjusts tests to removal of svg fallback 2016-07-01 16:36:37 +02:00
Hendrik Leppelsack 0a8f7bdc5b remove svg classes 2016-07-01 16:36:37 +02:00
Hendrik Leppelsack 9e7e3decd3 remove png references in core 2016-07-01 16:36:37 +02:00
Hendrik Leppelsack 6cc6538ad2 remove png actions, fileicons, etc 2016-07-01 16:36:37 +02:00
Hendrik Leppelsack 1ad97f8479 remove javascript png fallback for svg 2016-07-01 16:36:37 +02:00
Vincent Petry 027715f9ac Merge pull request #25262 from owncloud/fed-sharing-error
Only save federated share after remote server is notified
2016-07-01 16:20:39 +02:00
Vincent Petry e42ce62ce2 Merge pull request #25276 from owncloud/delete-own-session-token
prevent users from deleting their own session token
2016-07-01 16:15:31 +02:00
Thomas Citharel aaf4c3073a Add all properties while creating a subscription (#25318)
Fixes #24469
2016-07-01 13:42:35 +02:00
Vincent Petry 44a8a13655 Merge pull request #25315 from owncloud/stable9.1-search-preventinfiniteloop
[stable9.1] Prevent infinite loop in search auto-nextpage
2016-07-01 12:06:38 +02:00
Jenkins for ownCloud 74b29a0ffa [tx-robot] updated from transifex 2016-07-01 01:57:04 -04:00
Vincent Petry 54ecc4c375 Merge pull request #25304 from owncloud/local-karma
Always use local karma
2016-06-30 17:29:56 +02:00
Vincent Petry 779ee95834 Prevent infinite loop in search auto-nextpage
When loading the next page of search results, make sure that the loop
can end if there are no more elements in case the total doesn't match.

Also added a check to avoid recomputing the search results whenever the
setFilter() is called with the same value. This happens when navigating
away to another folder, the search field gets cleared automatically and
it calls FileList.setFilter('').
2016-06-30 17:20:26 +02:00
Vincent Petry 39723c5958 Merge pull request #25310 from owncloud/search-preventinfiniteloop
Prevent infinite loop in search auto-nextpage
2016-06-30 17:20:25 +02:00
Robin Appelman 17036c4cc3 show configuration options for authentication backends while listing storage
Fixes #22447
2016-06-30 15:50:14 +02:00
Robin Appelman cb3b678b2c hide hidden parameters from list backend/auth parameters 2016-06-30 15:44:42 +02:00
Vincent Petry dc35554091 Prevent infinite loop in search auto-nextpage
When loading the next page of search results, make sure that the loop
can end if there are no more elements in case the total doesn't match.

Also added a check to avoid recomputing the search results whenever the
setFilter() is called with the same value. This happens when navigating
away to another folder, the search field gets cleared automatically and
it calls FileList.setFilter('').
2016-06-30 11:10:48 +02:00
Jenkins for ownCloud e67615ef0c [tx-robot] updated from transifex 2016-06-30 01:55:56 -04:00
Daniel Molkentin 4c426ad970 fix version string 2016-06-29 15:11:48 +02:00
Daniel Molkentin 0ccc412fcc 9.1.0 RC 1 2016-06-29 15:09:40 +02:00
Thomas Müller fe007fd543 Various database migration fixes (#25209)
* String columns with a length higher then 4000 are converted into a CLOB columns automagically - we have to respect this when migrating

* Adding schema migration tests to prevent unnecessary and non-sense migration steps
Fix Oracle autoincrement and unsigned handling

* Fix sqlite integer type for autoincrement

* Use lower case table names - fixes pg

* Fix postgres with default -1 - this only affect pg 9.4 servers - 9.5 seems to work fine
2016-06-29 14:54:41 +02:00
Vincent Petry a29c65037e Merge pull request #25288 from owncloud/fix-versionrevertperms
Hide revert button when no permission to revert
2016-06-29 12:51:39 +02:00
Björn Schießle d2209d304f get only vcards which match both the address book id and the vcard uri (#25294) 2016-06-29 12:13:59 +02:00
Jenkins for ownCloud e1c24e7c50 [tx-robot] updated from transifex 2016-06-29 05:52:18 -04:00
Christoph Wurst dc6c2344f6 prevent users from deleting their own session token 2016-06-28 16:17:37 +02:00
Vincent Petry 6a1d9d0c32 Hide revert button when no permission to revert 2016-06-28 13:00:58 +02:00
Jenkins for ownCloud 20b1ba0771 [tx-robot] updated from transifex 2016-06-28 01:57:10 -04:00
Robin Appelman b40013928c Fix getting the certificate bundle for dav external storage (#25274)
* Fix getting the certificate bundle for dav external storages

* Log the original exception in dav external storage
2016-06-27 22:26:43 +02:00
Christoph Wurst 86a0e64628 Login hooks (#25260)
* fix login hooks

* adjust user session tests

* fix login return value of successful token logins

* trigger preLogin hook earlier; extract method 'loginWithPassword'

* call postLogin hook earlier; add PHPDoc
2016-06-27 22:16:22 +02:00
Robin Appelman 332b38fd92 handle unavailable fed shares while testing for availability (#25277)
* More explicit http status codes

* handle unavailable fed shares while testing for availability
2016-06-27 21:34:28 +02:00
Georg Ehrke f107be3d29 fix a ImageExportPlugin Test (#25215) 2016-06-27 21:26:56 +02:00
Robin Appelman 646c90cc4a Log reason why we removed the fed share 2016-06-27 16:38:47 +02:00
Vincent Petry 06331625a9 Merge pull request #25273 from owncloud/ext-fixsessioncredentialsnolazyload
Quickfix: do not lazy load auth mechanisms for ext storages
2016-06-27 14:57:29 +02:00
Robin Appelman 8d32e1d35b Handle exceptions thrown while trying to notify remote server of a fed share 2016-06-27 14:28:12 +02:00
Vincent Petry 79cfad0cc0 Merge pull request #25237 from owncloud/search-filelistnextpageresults
Prerender file list pages to include search results
2016-06-27 13:46:25 +02:00
Vincent Petry 72a3301ba4 Merge pull request #25261 from owncloud/app-password-login-name
show which login name to use for the new app password
2016-06-27 13:40:20 +02:00
Christoph Wurst 5e2a9dac14 Merge pull request #25263 from owncloud/decryptall-keepencryptionenabledforsingleuser
Keep encryption enabled if decrypting for single user
2016-06-27 12:19:45 +02:00
Vincent Petry 6e0c40ffd9 Merge pull request #25250 from owncloud/linkshare-includedeletewithuploadperms
Add explicit delete permission to link shares
2016-06-27 12:14:05 +02:00
Vincent Petry dbd176cfab Merge pull request #25258 from owncloud/integritycheck-whennotinstalled
Make code integrity check work when OC is not installed yet
2016-06-27 11:58:35 +02:00
Vincent Petry 95344d0625 Quickfix: do not lazy load auth mechanisms for ext storages
Some auth mechanisms like SessionCredentials need to register hooks
early, so they cannot be lazy loaded.
2016-06-27 10:50:10 +02:00
Morris Jobke 9681bf7cee Merge pull request #25252 from owncloud/authtoken-removetooltipondisconnect
Remove tooltip when disconnecting token
2016-06-27 10:42:35 +02:00
Vincent Petry 48116660f5 Merge pull request #25129 from owncloud/remove-ie
Remove ie8+9 support
2016-06-27 10:20:47 +02:00
Vincent Petry 9549e2ded7 Merge pull request #25247 from owncloud/fed-unshare-fail
Remove a fed share from the local table before trying to notify the remote server
2016-06-27 09:58:13 +02:00
Vincent Petry 4be95374a5 Merge pull request #25251 from owncloud/authtoken-assetpipelinefix
Use OC.Backbone instead of Backbone directly in authtoken JS code
2016-06-27 09:56:37 +02:00
Vincent Petry 089fcb45c0 Merge pull request #25154 from owncloud/token-login-check-loginname
check login name when authenticating via token and basic auth
2016-06-27 09:54:37 +02:00
Jenkins for ownCloud ee90bef50a [tx-robot] updated from transifex 2016-06-27 01:55:57 -04:00
Jenkins for ownCloud 52eab2a61a [tx-robot] updated from transifex 2016-06-26 01:55:53 -04:00
Jenkins for ownCloud 3d65979f0a [tx-robot] updated from transifex 2016-06-25 01:56:48 -04:00
Christoph Wurst c295523ae2 Merge pull request #25259 from owncloud/search-fixsearchfromotherfilelists
Fix search result link for file results outside default list
2016-06-24 17:12:02 +02:00
Christoph Wurst e9a0a6d83a Merge pull request #25257 from owncloud/comments-showerroronsave
Show error message when posting an invalid comment
2016-06-24 17:11:20 +02:00
Christoph Wurst 213d7119f9 fix layout 2016-06-24 17:00:59 +02:00
Vincent Petry 19a53982d4 Keep encryption enabled if decrypting for single user
When decrypting all files of a single user, the admin usually does not
intend encryption to be suddenly disabled for everyone. This fix
reenables encryption after decrypting for a single user.

Decrypting for all users will still disable encryption globally.
2016-06-24 16:46:25 +02:00
Robin Appelman ee674844f2 better detect errors in fed sharing response 2016-06-24 15:56:33 +02:00
Christoph Wurst d484fef837 show which login name to use for the new app password 2016-06-24 15:31:48 +02:00
Christoph Wurst db34671626 check login name when authenticating with client token 2016-06-24 13:57:09 +02:00
Vincent Petry 5e58b5115f Prerender file list pages to include search results
When filtering the file list, if a result is on an unrendered page,
make sure to call _nextPage() to prerender the pages in order to
display all matching results.
2016-06-24 13:55:14 +02:00
Vincent Petry 39b533d0d8 Hide search results after switching directory
When clicking on a folder result in the search result list, the result
box for "results in another folder" must disappear.
2016-06-24 11:32:14 +02:00
Vincent Petry bf3ee69d86 Fix search result link for file results outside default list
When outside the "All files" list, the search result link must properly
redirect to the "All files" list.
2016-06-24 11:31:29 +02:00
Vincent Petry d345047b0f Make code integrity check work when OC is not installed yet 2016-06-24 10:24:41 +02:00
Vincent Petry 04e3da0cf5 Merge pull request #25171 from owncloud/files_external-list-all
Add option to `occ files_external:list` to show all configured mounts
2016-06-24 10:18:14 +02:00
Vincent Petry 56ad4cdfec Show error message when posting an invalid comment
When an internal server error occurs while creating or updating a
comment, display a proper error notification in the UI.
2016-06-24 10:17:12 +02:00
Vincent Petry 7dc36289ab Repair step to adjust link share delete permissions 2016-06-24 09:48:48 +02:00
Vincent Petry 2ca1301494 Add explicit delete permission to link shares
Link shares always allowed deletion, however internally the permissions
were stored as 7 which lacked delete permissions. This created an
inconsistency in the Webdav permissions.

This fix makes sure we include delete permissions in the share
permissions, which now become 15.

In case a client is still passing 7 for legacy reasons, it gets
converted automatically to 15.
2016-06-24 09:48:48 +02:00
Vincent Petry dc78d26f2a Merge pull request #25239 from owncloud/setupchecks-preventreload
Don't reload page in case of auth errors during setup checks
2016-06-24 09:47:55 +02:00
Vincent Petry 819b7c45a9 Prevent negative or non-number values in quota input 2016-06-24 09:20:13 +02:00
Jenkins for ownCloud 29068d3845 [tx-robot] updated from transifex 2016-06-24 01:56:13 -04:00
Vincent Petry 6c1ea7a54b Fix "Other" value handling in quota dropdown in users page
Prevents "other" value to be deleted.
When appending custom value, put it above the "other" entry.
2016-06-23 18:42:11 +02:00
Vincent Petry 8fef9a197f Remove tooltip when disconnecting token 2016-06-23 18:30:45 +02:00
Vincent Petry e2a28db2b5 Use OC.Backbone instead of Backbone directly in authtoken JS code
Fixes asset pipeline issue with the auth token in personal page
2016-06-23 18:26:01 +02:00
Vincent Petry cc2aec11af Merge pull request #25238 from owncloud/files-trashlistnamecorruption
Fix trashed file name corruption when rerendering trashbin list
2016-06-23 15:36:14 +02:00
Robin Appelman 040c541138 Remove a fed share from the local table before trying to notify the remote server 2016-06-23 14:19:55 +02:00
Robin Appelman bac1a3a623 Add option to occ files_external:list to show all configured mounts 2016-06-23 13:12:03 +02:00
Hendrik Leppelsack e5d8726859 remove ie8+9 support 2016-06-23 12:34:53 +02:00
Vincent Petry 97f1813695 Don't reload page in case of auth errors during setup checks
If an error occurs during setup checks, do not let the global ajax
error handler reload the page.
2016-06-23 11:54:49 +02:00
Vincent Petry 508c580e67 Fix trashed file name corruption when rerendering trashbin list
The trashbin code does some gymnastics with the file data at render
time. This fix makes sure that the modifications done on the file data
are only local to the rendering code and doesn't affect the actual file
data from the file list.
2016-06-23 11:51:23 +02:00
468 changed files with 10065 additions and 1711 deletions
+2 -1
View File
@@ -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>
Vendored
+137
View File
@@ -0,0 +1,137 @@
#!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) {
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()
}
}
}
+7 -7
View File
@@ -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'));
}
});
}
+1
View File
@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Type in a new comment..." : "Напиши нов коментар...",
"Delete comment" : "Изтрий коментар",
"Post" : "Публикация",
"Cancel" : "Отказ",
"Edit comment" : "Редактирай коментра",
"[Deleted user]" : "[Изтрит потребител]",
+1
View File
@@ -1,6 +1,7 @@
{ "translations": {
"Type in a new comment..." : "Напиши нов коментар...",
"Delete comment" : "Изтрий коментар",
"Post" : "Публикация",
"Cancel" : "Отказ",
"Edit comment" : "Редактирай коментра",
"[Deleted user]" : "[Изтрит потребител]",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+4 -1
View File
@@ -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>",
+4 -1
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+6
View File
@@ -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);");
+6
View File
@@ -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);"
}
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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>",
+3
View File
@@ -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",
+3
View File
@@ -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",
+1 -1
View File
@@ -5,7 +5,7 @@
<description>ownCloud WebDAV endpoint</description>
<licence>AGPL</licence>
<author>owncloud.org</author>
<version>0.2.5</version>
<version>0.2.6</version>
<default_enable/>
<types>
<filesystem/>
+1 -1
View File
@@ -114,7 +114,7 @@ class Application extends App {
/** @var IAppContainer $c */
return new Classification(
$c->query('CalDavBackend'),
$c->getServer()->getUserManager()
$c->getServer()->getDatabaseConnection()
);
});
+14 -9
View File
@@ -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');
+1 -1
View File
@@ -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();
+1 -1
View File
@@ -161,7 +161,7 @@ class Converter {
*/
private function getAvatarImage(IUser $user) {
try {
$image = $user->getAvatarImage(-1);
$image = $user->getAvatarImage(96);
return $image;
} catch (\Exception $ex) {
return null;
+12 -2
View File
@@ -108,8 +108,18 @@ 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);
}
return [
'Content-Type' => $type,
'body' => $val
+1 -1
View File
@@ -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;
}
}
+1 -1
View File
@@ -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')))) {
@@ -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 */
+2 -7
View File
@@ -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) {
+37 -27
View File
@@ -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;
}
}
+7 -1
View File
@@ -66,13 +66,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());
@@ -158,6 +161,9 @@ class Server {
)
)
);
$this->server->addPlugin(
new \OCA\DAV\Connector\Sabre\QuotaPlugin($view));
}
});
}
+31 -8
View File
@@ -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 -6
View File
@@ -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
+6 -6
View File
@@ -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);
@@ -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() {
@@ -140,12 +140,9 @@ 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"],
];
}
}
@@ -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);
}
/**
@@ -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
*/
@@ -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'])
+4 -1
View File
@@ -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);");
+4 -1
View File
@@ -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);"
}
+2
View File
@@ -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",
+2
View File
@@ -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",
+4 -3
View File
@@ -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" : "統合されたクラウド共有",
+4 -3
View File
@@ -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" : "統合されたクラウド共有",
+3
View File
@@ -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",
+3
View File
@@ -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",
+1
View File
@@ -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",
+1
View File
@@ -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() {
+3 -3
View File
@@ -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;");
+3 -3
View File
@@ -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;"
}
+15
View File
@@ -0,0 +1,15 @@
OC.L10N.register(
"federation",
{
"Server added to the list of trusted ownClouds" : "De Server gouf op d'Lëscht vun den zouverlässegen ownClouds gesat.",
"Server is already in the list of trusted servers." : "De Server ass schonn op der Lëscht vun den zouverlässegen Serveren.",
"No ownCloud server found" : "Keen ownCloud Server fonnt",
"Could not add server" : "De Server konnt net derbäi gesat ginn",
"Federation" : "Federatioun",
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "D'ownCloud Federatioun erlaabt der fir dech mat aneren zouverlässegen ownClouds ze verbannen an d'Benotzer Verzeechnes auszetauschen. Zum Beispill gëtt dëst hei benotzt fir extern Benotzer automatesch fir federatiivt Deelen ze vervollstännegen.",
"Add server automatically once a federated share was created successfully" : "Setz de Server automatesch derbäi soubal e federativen Undeel erfollegräich erstallt gouf",
"Trusted ownCloud Servers" : "Zouverlässeg ownCloud Serveren",
"+ Add ownCloud server" : "+ ownCloud Server derbäi setzen",
"ownCloud Server" : "ownCloud Server"
},
"nplurals=2; plural=(n != 1);");
+13
View File
@@ -0,0 +1,13 @@
{ "translations": {
"Server added to the list of trusted ownClouds" : "De Server gouf op d'Lëscht vun den zouverlässegen ownClouds gesat.",
"Server is already in the list of trusted servers." : "De Server ass schonn op der Lëscht vun den zouverlässegen Serveren.",
"No ownCloud server found" : "Keen ownCloud Server fonnt",
"Could not add server" : "De Server konnt net derbäi gesat ginn",
"Federation" : "Federatioun",
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "D'ownCloud Federatioun erlaabt der fir dech mat aneren zouverlässegen ownClouds ze verbannen an d'Benotzer Verzeechnes auszetauschen. Zum Beispill gëtt dëst hei benotzt fir extern Benotzer automatesch fir federatiivt Deelen ze vervollstännegen.",
"Add server automatically once a federated share was created successfully" : "Setz de Server automatesch derbäi soubal e federativen Undeel erfollegräich erstallt gouf",
"Trusted ownCloud Servers" : "Zouverlässeg ownCloud Serveren",
"+ Add ownCloud server" : "+ ownCloud Server derbäi setzen",
"ownCloud Server" : "ownCloud Server"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+15
View File
@@ -329,6 +329,21 @@ table td.filename .nametext {
margin-right: 50px;
}
.hide-hidden-files #fileList tr.hidden-file,
.hide-hidden-files #fileList tr.hidden-file.dragging {
display: none;
}
#fileList tr.animate-opacity {
-webkit-transition:opacity 250ms;
-moz-transition:opacity 250ms;
-o-transition:opacity 250ms;
transition:opacity 250ms;
}
#fileList tr.dragging {
opacity: 0.2;
}
table td.filename .nametext .innernametext {
text-overflow: ellipsis;
overflow: hidden;
+78 -35
View File
@@ -194,6 +194,7 @@
* @param options.folderDropOptions folder drop options, disabled by default
* @param options.scrollTo name of file to scroll to after the first load
* @param {OC.Files.Client} [options.filesClient] files API client
* @param {OC.Backbone.Model} [options.filesConfig] files app configuration
* @private
*/
initialize: function($el, options) {
@@ -207,11 +208,9 @@
this._filesConfig = options.config;
} else if (!_.isUndefined(OCA.Files) && !_.isUndefined(OCA.Files.App)) {
this._filesConfig = OCA.Files.App.getFilesConfig();
}
if (!_.isUndefined(this._filesConfig)) {
this._filesConfig.on('change:showhidden', function() {
self.setFiles(self.files);
} else {
this._filesConfig = new OC.Backbone.Model({
'showhidden': false
});
}
@@ -236,6 +235,22 @@
this.$table = $el.find('table:first');
this.$fileList = $el.find('#fileList');
if (!_.isUndefined(this._filesConfig)) {
this._filesConfig.on('change:showhidden', function() {
var showHidden = this.get('showhidden');
self.$el.toggleClass('hide-hidden-files', !showHidden);
self.updateSelectionSummary();
if (!showHidden) {
// hiding files could make the page too small, need to try rendering next page
self._onScroll();
}
});
this.$el.toggleClass('hide-hidden-files', !this._filesConfig.get('showhidden'));
}
if (_.isUndefined(options.detailsViewEnabled) || options.detailsViewEnabled) {
this._detailsView = new OCA.Files.DetailsView();
this._detailsView.$el.insertBefore(this.$el);
@@ -250,7 +265,7 @@
this.files = [];
this._selectedFiles = {};
this._selectionSummary = new OCA.Files.FileSummary();
this._selectionSummary = new OCA.Files.FileSummary(undefined, {config: this._filesConfig});
// dummy root dir info
this.dirInfo = new OC.Files.FileInfo({});
@@ -513,7 +528,7 @@
* Event handler for when the URL changed
*/
_onUrlChanged: function(e) {
if (e && e.dir) {
if (e && _.isString(e.dir)) {
this.changeDirectory(e.dir, false, true);
}
},
@@ -875,10 +890,6 @@
* @return array of DOM elements of the newly added files
*/
_nextPage: function(animate) {
// Save full files list while rendering
var allFiles = this.files;
this.files = this._filterHiddenFiles(this.files);
var index = this.$fileList.children().length,
count = this.pageSize(),
hidden,
@@ -926,9 +937,6 @@
}, 0);
}
// Restore full files list after rendering
this.files = allFiles;
return newTrs;
},
@@ -967,8 +975,6 @@
this.$el.find('.select-all').prop('checked', false);
// Save full files list while rendering
var allFiles = this.files;
this.files = this._filterHiddenFiles(this.files);
this.isEmpty = this.files.length === 0;
this._nextPage();
@@ -982,9 +988,6 @@
this.updateSelectionSummary();
$(window).scrollTop(0);
// Restore full files list after rendering
this.files = allFiles;
this.$fileList.trigger(jQuery.Event('updated'));
_.defer(function() {
self.$el.closest('#app-content').trigger(jQuery.Event('apprendered'));
@@ -992,18 +995,14 @@
},
/**
* Filter hidden files of the given filesArray (dot-files)
* Returns whether the given file info must be hidden
*
* @param filesArray files to be filtered
* @returns {array}
* @param {OC.Files.FileInfo} fileInfo file info
*
* @return {boolean} true if the file is a hidden file, false otherwise
*/
_filterHiddenFiles: function(files) {
if (_.isUndefined(this._filesConfig) || this._filesConfig.get('showhidden')) {
return files;
}
return _.filter(files, function(file) {
return file.name.indexOf('.') !== 0;
});
_isHiddenFile: function(file) {
return file.name && file.name.charAt(0) === '.';
},
/**
@@ -1327,6 +1326,10 @@
tr.addClass('hidden');
}
if (this._isHiddenFile(fileData)) {
tr.addClass('hidden-file');
}
// display actions
this.fileActions.display(filenameTd, !options.silent, this);
@@ -1397,6 +1400,16 @@
return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
},
_isValidPath: function(path) {
var sections = path.split('/');
for (var i = 0; i < sections.length; i++) {
if (sections[i] === '..') {
return false;
}
}
return true;
},
/**
* Sets the current directory name and updates the breadcrumb.
* @param targetDir directory to display
@@ -1405,6 +1418,10 @@
*/
_setCurrentDir: function(targetDir, changeUrl, fileId) {
targetDir = targetDir.replace(/\\/g, '/');
if (!this._isValidPath(targetDir)) {
targetDir = '/';
changeUrl = true;
}
var previousDir = this.getCurrentDirectory(),
baseDir = OC.basename(targetDir);
@@ -1415,6 +1432,9 @@
this.setPageTitle();
}
if (targetDir.length > 0 && targetDir[0] !== '/') {
targetDir = '/' + targetDir;
}
this._currentDirectory = targetDir;
// legacy stuff
@@ -2283,7 +2303,7 @@
var $tr = $('<tr class="summary"></tr>');
this.$el.find('tfoot').append($tr);
return new OCA.Files.FileSummary($tr);
return new OCA.Files.FileSummary($tr, {config: this._filesConfig});
},
updateEmptyContent: function() {
var permissions = this.getDirectoryPermissions();
@@ -2351,22 +2371,39 @@
* @param filter
*/
setFilter:function(filter) {
var total = 0;
if (this._filter === filter) {
return;
}
this._filter = filter;
this.fileSummary.setFilter(filter, this.files);
total = this.fileSummary.getTotal();
if (!this.$el.find('.mask').exists()) {
this.hideIrrelevantUIWhenNoFilesMatch();
}
var that = this;
var visibleCount = 0;
filter = filter.toLowerCase();
this.$fileList.find('tr').each(function(i,e) {
var $e = $(e);
function filterRows(tr) {
var $e = $(tr);
if ($e.data('file').toString().toLowerCase().indexOf(filter) === -1) {
$e.addClass('hidden');
} else {
visibleCount++;
$e.removeClass('hidden');
}
});
that.$container.trigger('scroll');
}
var $trs = this.$fileList.find('tr');
do {
_.each($trs, filterRows);
if (visibleCount < total) {
$trs = this._nextPage(false);
}
} while (visibleCount < total && $trs.length > 0);
this.$container.trigger('scroll');
},
hideIrrelevantUIWhenNoFilesMatch:function() {
if (this._filter && this.fileSummary.summary.totalDirs + this.fileSummary.summary.totalFiles === 0) {
@@ -2413,6 +2450,7 @@
var summary = this._selectionSummary.summary;
var selection;
var showHidden = !!this._filesConfig.get('showhidden');
if (summary.totalFiles === 0 && summary.totalDirs === 0) {
this.$el.find('#headerName a.name>span:first').text(t('files','Name'));
this.$el.find('#headerSize a>span:first').text(t('files','Size'));
@@ -2439,6 +2477,11 @@
selection = fileInfo;
}
if (!showHidden && summary.totalHidden > 0) {
var hiddenInfo = n('files', 'including %n hidden', 'including %n hidden', summary.totalHidden);
selection += ' (' + hiddenInfo + ')';
}
this.$el.find('#headerName a.name>span:first').text(selection);
this.$el.find('#modified a>span:first').text('');
this.$el.find('table').addClass('multiselect');
+6 -2
View File
@@ -391,14 +391,18 @@ var dragOptions={
if (!$selectedFiles.length) {
$selectedFiles = $(this);
}
$selectedFiles.closest('tr').fadeTo(250, 0.2).addClass('dragging');
$selectedFiles.closest('tr').addClass('animate-opacity dragging');
},
stop: function(event, ui) {
var $selectedFiles = $('td.filename input:checkbox:checked');
if (!$selectedFiles.length) {
$selectedFiles = $(this);
}
$selectedFiles.closest('tr').fadeTo(250, 1).removeClass('dragging');
var $tr = $selectedFiles.closest('tr');
$tr.removeClass('dragging');
setTimeout(function() {
$tr.removeClass('animate-opacity');
}, 300);
},
drag: function(event, ui) {
var scrollingArea = FileList.$container;
+67 -25
View File
@@ -20,6 +20,15 @@
*/
(function() {
var INFO_TEMPLATE =
'<span class="info">' +
'<span class="dirinfo"></span>' +
'<span class="connector"> and </span>' +
'<span class="fileinfo"></span>' +
'<span class="hiddeninfo"></span>' +
'<span class="filter"></span>' +
'</span>';
/**
* The FileSummary class encapsulates the file summary values and
* the logic to render it in the given container
@@ -28,26 +37,51 @@
* @memberof OCA.Files
*
* @param $tr table row element
* @param {OC.Backbone.Model} [options.filesConfig] files app configuration
*/
var FileSummary = function($tr) {
var FileSummary = function($tr, options) {
options = options || {};
var self = this;
this.$el = $tr;
var filesConfig = options.config;
if (filesConfig) {
this._showHidden = !!filesConfig.get('showhidden');
filesConfig.on('change:showhidden', function() {
self._showHidden = !!this.get('showhidden');
self.update();
});
}
this.clear();
this.render();
};
FileSummary.prototype = {
_showHidden: null,
summary: {
totalFiles: 0,
totalDirs: 0,
totalHidden: 0,
totalSize: 0,
filter:'',
sumIsPending:false
},
/**
* Returns whether the given file info must be hidden
*
* @param {OC.Files.FileInfo} fileInfo file info
*
* @return {boolean} true if the file is a hidden file, false otherwise
*/
_isHiddenFile: function(file) {
return file.name && file.name.charAt(0) === '.';
},
/**
* Adds file
* @param file file to add
* @param update whether to update the display
* @param {OC.Files.FileInfo} file file to add
* @param {boolean} update whether to update the display
*/
add: function(file, update) {
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
@@ -59,6 +93,10 @@
else {
this.summary.totalFiles++;
}
if (this._isHiddenFile(file)) {
this.summary.totalHidden++;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
this.summary.totalSize += size;
@@ -71,8 +109,8 @@
},
/**
* Removes file
* @param file file to remove
* @param update whether to update the display
* @param {OC.Files.FileInfo} file file to remove
* @param {boolean} update whether to update the display
*/
remove: function(file, update) {
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
@@ -84,6 +122,9 @@
else {
this.summary.totalFiles--;
}
if (this._isHiddenFile(file)) {
this.summary.totalHidden--;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
this.summary.totalSize -= size;
@@ -111,6 +152,7 @@
var summary = {
totalDirs: 0,
totalFiles: 0,
totalHidden: 0,
totalSize: 0,
filter: this.summary.filter,
sumIsPending: false
@@ -127,6 +169,9 @@
else {
summary.totalFiles++;
}
if (this._isHiddenFile(file)) {
summary.totalHidden++;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
summary.totalSize += size;
@@ -154,6 +199,13 @@
this.update();
},
_infoTemplate: function(data) {
if (!this._infoTemplateCompiled) {
this._infoTemplateCompiled = Handlebars.compile(INFO_TEMPLATE);
}
return this._infoTemplateCompiled(data);
},
/**
* Renders the file summary element
*/
@@ -171,10 +223,12 @@
var $fileInfo = this.$el.find('.fileinfo');
var $connector = this.$el.find('.connector');
var $filterInfo = this.$el.find('.filter');
var $hiddenInfo = this.$el.find('.hiddeninfo');
// Substitute old content with new translations
$dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs));
$fileInfo.html(n('files', '%n file', '%n files', this.summary.totalFiles));
$hiddenInfo.html(' (' + n('files', 'including %n hidden', 'including %n hidden', this.summary.totalHidden) + ')');
var fileSize = this.summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(this.summary.totalSize);
this.$el.find('.filesize').html(fileSize);
@@ -194,6 +248,7 @@
if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) {
$connector.removeClass('hidden');
}
$hiddenInfo.toggleClass('hidden', this.summary.totalHidden === 0 || this._showHidden)
if (this.summary.filter === '') {
$filterInfo.html('');
$filterInfo.addClass('hidden');
@@ -206,19 +261,7 @@
if (!this.$el) {
return;
}
// TODO: ideally this should be separate to a template or something
var summary = this.summary;
var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs);
var fileInfo = n('files', '%n file', '%n files', summary.totalFiles);
var filterInfo = '';
if (this.summary.filter !== '') {
filterInfo = ' ' + n('files', 'matches \'{filter}\'', 'match \'{filter}\'', summary.totalFiles + summary.totalDirs, {filter: summary.filter});
}
var infoVars = {
dirs: '<span class="dirinfo">'+directoryInfo+'</span><span class="connector">',
files: '</span><span class="fileinfo">'+fileInfo+'</span>'
};
// don't show the filesize column, if filesize is NaN (e.g. in trashbin)
var fileSize = '';
@@ -227,15 +270,14 @@
fileSize = '<td class="filesize">' + fileSize + '</td>';
}
var info = t('files', '{dirs} and {files}', infoVars, null, {'escape': false});
var $summary = $('<td><span class="info">'+info+'<span class="filter">'+filterInfo+'</span></span></td>'+fileSize+'<td class="date"></td>');
if (!this.summary.totalFiles && !this.summary.totalDirs) {
this.$el.addClass('hidden');
}
var $summary = $(
'<td>' + this._infoTemplate() + '</td>' +
fileSize +
'<td class="date"></td>'
);
this.$el.addClass('hidden');
this.$el.append($summary);
this.update();
}
};
OCA.Files.FileSummary = FileSummary;
+9 -2
View File
@@ -133,7 +133,7 @@
this.handleFolderClick = function($row, result, event) {
// open folder
if (self.fileAppLoaded()) {
if (self.fileAppLoaded() && self.fileList.id === 'files') {
self.fileList.changeDirectory(result.path);
return false;
} else {
@@ -142,7 +142,7 @@
};
this.handleFileClick = function($row, result, event) {
if (self.fileAppLoaded()) {
if (self.fileAppLoaded() && self.fileList.id === 'files') {
self.fileList.changeDirectory(OC.dirname(result.path));
self.fileList.scrollTo(result.name);
return false;
@@ -184,6 +184,13 @@
search.setHandler('folder', this.handleFolderClick.bind(this));
search.setHandler(['file', 'audio', 'image'], this.handleFileClick.bind(this));
if (self.fileAppLoaded()) {
// hide results when switching directory outside of search results
$('#app-content').delegate('>div', 'changeDirectory', function() {
search.clear();
});
}
}
};
OCA.Search.Files = Files;
+28
View File
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "Direutoriu non válidu.",
"Files" : "Ficheros",
"All files" : "Tolos ficheros",
"File could not be found" : "Nun s'atopó el ficheru",
"Home" : "Casa",
"Close" : "Zarrar",
"Favorites" : "Favoritos",
@@ -28,8 +29,19 @@ OC.L10N.register(
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
"Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
"Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}",
"Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.",
"Uploading..." : "Xubiendo...",
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
"{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
"{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "En cualquier momentu...",
"Soon..." : "Pronto...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
"Actions" : "Aiciones",
"Download" : "Descargar",
@@ -43,6 +55,17 @@ OC.L10N.register(
"Unable to determine date" : "Imposible determinar la fecha",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
"Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
"Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
"{newName} already exists" : "{newName} yá esiste",
"Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
"Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
"Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
"Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
"Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
"Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
"Name" : "Nome",
"Size" : "Tamañu",
@@ -64,6 +87,7 @@ OC.L10N.register(
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
"Favorited" : "Favoritos",
"Favorite" : "Favoritu",
"Local link" : "Enllaz llocal",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
"{newname} already exists" : "{newname} yá existe",
@@ -91,8 +115,12 @@ OC.L10N.register(
"Maximum upload size" : "Tamañu máximu de xubida",
"max. possible: " : "máx. posible:",
"Save" : "Guardar",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.",
"Missing permissions to edit from here." : "Falten permisos pa editar dende equí.",
"Settings" : "Axustes",
"Show hidden files" : "Amosar ficheros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">p'acceder a los dos Ficheros via WebDAV</a>",
"No files in here" : "Nun hai nengún ficheru equí",
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
+28
View File
@@ -19,6 +19,7 @@
"Invalid directory." : "Direutoriu non válidu.",
"Files" : "Ficheros",
"All files" : "Tolos ficheros",
"File could not be found" : "Nun s'atopó el ficheru",
"Home" : "Casa",
"Close" : "Zarrar",
"Favorites" : "Favoritos",
@@ -26,8 +27,19 @@
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
"Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
"Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}",
"Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.",
"Uploading..." : "Xubiendo...",
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
"{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
"{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "En cualquier momentu...",
"Soon..." : "Pronto...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
"Actions" : "Aiciones",
"Download" : "Descargar",
@@ -41,6 +53,17 @@
"Unable to determine date" : "Imposible determinar la fecha",
"This operation is forbidden" : "La operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
"Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
"Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
"{newName} already exists" : "{newName} yá esiste",
"Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
"Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
"Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
"Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
"Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
"Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
"Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
"Name" : "Nome",
"Size" : "Tamañu",
@@ -62,6 +85,7 @@
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
"Favorited" : "Favoritos",
"Favorite" : "Favoritu",
"Local link" : "Enllaz llocal",
"Folder" : "Carpeta",
"New folder" : "Nueva carpeta",
"{newname} already exists" : "{newname} yá existe",
@@ -89,8 +113,12 @@
"Maximum upload size" : "Tamañu máximu de xubida",
"max. possible: " : "máx. posible:",
"Save" : "Guardar",
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.",
"Missing permissions to edit from here." : "Falten permisos pa editar dende equí.",
"Settings" : "Axustes",
"Show hidden files" : "Amosar ficheros ocultos",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">p'acceder a los dos Ficheros via WebDAV</a>",
"No files in here" : "Nun hai nengún ficheru equí",
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
+2 -1
View File
@@ -90,6 +90,7 @@ OC.L10N.register(
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
"No favorites" : "Няма любими",
"Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
"Text file" : "Текстов файл"
"Text file" : "Текстов файл",
"New text file.txt" : "Нов текст file.txt"
},
"nplurals=2; plural=(n != 1);");
+2 -1
View File
@@ -88,6 +88,7 @@
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
"No favorites" : "Няма любими",
"Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
"Text file" : "Текстов файл"
"Text file" : "Текстов файл",
"New text file.txt" : "Нов текст file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+8
View File
@@ -33,7 +33,15 @@ OC.L10N.register(
"Could not get result from server." : "Ne peut recevoir les résultats du serveur.",
"Uploading..." : "Téléversement en cours…",
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} heure{plural_s} restante{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
"{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minute{plural_s} restante{plural_s}",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
"{seconds} second{plural_s} left" : "{seconds} seconde{plural_s} restante{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "D'un instant à l'autre...",
"Soon..." : "Bientôt...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"Actions" : "Actions",
"Download" : "Télécharger",
+8
View File
@@ -31,7 +31,15 @@
"Could not get result from server." : "Ne peut recevoir les résultats du serveur.",
"Uploading..." : "Téléversement en cours…",
"..." : "...",
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} heure{plural_s} restante{plural_s}",
"{hours}:{minutes}h" : "{hours}:{minutes}h",
"{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minute{plural_s} restante{plural_s}",
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
"{seconds} second{plural_s} left" : "{seconds} seconde{plural_s} restante{plural_s}",
"{seconds}s" : "{seconds}s",
"Any moment now..." : "D'un instant à l'autre...",
"Soon..." : "Bientôt...",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"Actions" : "Actions",
"Download" : "Télécharger",
+1
View File
@@ -21,6 +21,7 @@ OC.L10N.register(
"Invalid directory." : "無効なディレクトリです。",
"Files" : "ファイル",
"All files" : "すべてのファイル",
"File could not be found" : "ファイルは見つかりませんでした。",
"Home" : "ホーム",
"Close" : "閉じる",
"Favorites" : "お気に入り",
+1
View File
@@ -19,6 +19,7 @@
"Invalid directory." : "無効なディレクトリです。",
"Files" : "ファイル",
"All files" : "すべてのファイル",
"File could not be found" : "ファイルは見つかりませんでした。",
"Home" : "ホーム",
"Close" : "閉じる",
"Favorites" : "お気に入り",

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