Compare commits

...

191 Commits

Author SHA1 Message Date
Frank Karlitschek a4e842f19a 6.0.1 RC1 2014-01-16 17:09:54 +01:00
Volkan Gezer aec0f06501 Fix untranslated text when deleting user
This should fix issue #6728
2014-01-16 12:23:34 +01:00
ben-denham f9e4d0a5e2 updated the unit test for OCP\Share::unshareAll() to verify that shares by all users are removed for an item. 2014-01-16 12:14:53 +01:00
ben-denham 3093c63024 Unshare all will now delete all shares for the item, instead of only for a single owner. 2014-01-16 12:14:37 +01:00
Thomas Müller b0edbd8ebd Merge pull request #6783 from owncloud/backport-6530-stable6
Backport 6530 stable6
2014-01-15 11:01:47 -08:00
Vincent Petry 5dd20db05f Fixed Dropbox/Google storage async save call
When clicking "Grant access", the settings for Dropbox/Google were saved
through a call that gets cancelled when redirecting to the grant page
(for example in Firefox)

This fix makes sure the "save settings" call finished before redirecting
to the grant page.

Fixes #6176

Backport of e13be94 to stable6
2014-01-15 16:41:54 +01:00
Thomas Müller 0c140d5f6e in order to work properly with encryption ocTransferId is added to the file path - questionable usage of magic string 2014-01-15 16:37:23 +01:00
Thomas Müller 49969825ad Adding a random postfix to the part file. 2014-01-15 16:37:23 +01:00
Bjoern Schiessle 3b21499b34 extended test to also check the status messages 2014-01-15 16:10:31 +01:00
Bjoern Schiessle 3fde29ead4 keep response message 2014-01-15 16:10:22 +01:00
Bjoern Schiessle afe35ca12d call getFileInfo to enforce a file cache entry for the new version, fix #6286 2014-01-15 16:01:48 +01:00
Bjoern Schiessle a83e37c799 remove old code 2014-01-15 15:59:04 +01:00
Bjoern Schiessle 3c7541e97c don't try to encrypt/decrypt cache chunks or files in the trash bin 2014-01-15 15:58:56 +01:00
Bjoern Schiessle 3ec3ebb3db copy files to owner trash recursively 2014-01-15 15:58:48 +01:00
Morris Jobke 3e71827bea Merge pull request #6293 from owncloud/stable6-legacy-settings-popup
Stable6 legacy settings popup
2014-01-15 02:12:27 -08:00
Robin Appelman 6adac6a673 Use storage_mtime when determining if we can reuse cached data while scanning
Backport to stable6 of the following commits, in order:
- 203d5d0
- 4113042
- 7e4c80f
- 16b898d
2014-01-15 10:36:32 +01:00
Vincent Petry 88dc71381f Fix calculated folder size to use unencrypted size
The encrypted size was used when calculating folder sizes.
This fix now also sums up the unencrypted size and shows that one when
available.

Backport of 4faba49 to stable6
2014-01-14 16:37:48 +01:00
icewind1991 c6ca9be406 Merge pull request #6612 from owncloud/user-no-change-displayname-stable
Backport: Re-add the config options to remove the ability for users to change their displayname
2014-01-14 07:13:21 -08:00
Bjoern Schiessle 7dddf59942 it is not an urgent error... a DEBUG message is enough at this point 2014-01-14 15:09:26 +01:00
Vincent Petry 8ef32821be Fixed timezone issue with SMB storage
Now forcing smbclient to also run on UTC

Backport of 1eb5ebd to stable6
2014-01-14 15:04:41 +01:00
Thomas Müller 1e9f0409c3 Merge pull request #6408 from owncloud/ldap_fix_tls_detection
LDAP fix TLS detection
2014-01-14 05:01:08 -08:00
Andreas Fischer bcec9cea78 Merge pull request #6756 from owncloud/remove-ru_RU-stable6
remove ru_RU - it's almost untranslated

* owncloud/remove-ru_RU-stable6:
  remove ru_RU - it's almost untranslated
2014-01-14 00:45:55 +01:00
Björn Schießle 87cfbb3a2b Merge pull request #6753 from owncloud/no_unshare_on_delete
don't unshare on delete
2014-01-13 07:48:22 -08:00
Thomas Müller 3b1396b538 remove ru_RU - it's almost untranslated 2014-01-13 16:44:03 +01:00
Carlos Cerrillo ce1a1996f7 Fixing Issue #6301 on master branch
Added private var $certPath to store the user root cert

Move logic to determine the $certPath path to the constructor and modify to get the path from OC_User::getHome()

Add curl options to use the certificate to avoid certificate errors with self-signed certicates in the downdload/upload method so we don't get blank files

Only set SSL things when ```$this->secure``` is ```true```

Fix ```createCertificateBundle``` and  ```getCertificates``` methods
from ```OC_Mount_config``` to use ```OC_User::getHome``` to get the
path

Backport of 7c264c88fe,
b245e2e3d8 and
c06844c374 to stable6 (squashed)
2014-01-13 16:38:30 +01:00
st3so 5f2e8f7723 fixing typo in redirection query string
Backport of a2cae551f3 to stable6
2014-01-13 15:58:29 +01:00
Bjoern Schiessle 54cd174f61 don't unshare on delete 2014-01-13 15:25:59 +01:00
Vincent Petry 28be8496a9 Fixed various file name escaping issues in core apps
- Refactored file tr lookup into FileList.findFileEl that uses
  filterAttr to avoid escaping issues in jQuery selectors
- Fixed versions and sharing app to properly escape file names in
  attributes

Backport to stable6 of 1042733
2014-01-12 13:29:54 +01:00
Georg Ehrke 3ae7bfc298 fix preview for reshared file 2014-01-11 11:31:43 +01:00
Vincent Petry 1cbe1896e7 Prevent deleting storage root
Storage mount points are not deletable, so make sure that the unlink
operation and its hooks aren't run in such cases.

Note that some storages might recursively delete their contents when
calling unlink on their root. This fix prevents that as well.

Backport of f642ad3 to stable6
2014-01-10 16:50:26 +01:00
Arthur Schiwon ebe3872c64 Infowarning about 32bit 2014-01-09 17:00:35 +01:00
Arthur Schiwon f1ea0bcafc add tests for user counting 2014-01-09 17:00:28 +01:00
Arthur Schiwon cf8fc2294e if backends have the same class name, sum their users up instead of overwriting 2014-01-09 17:00:21 +01:00
Arthur Schiwon 1636c6dbd8 LDAP: add tests for countUsers 2014-01-09 17:00:14 +01:00
Arthur Schiwon 59ff8388ea remove unnecessary line 2014-01-09 17:00:06 +01:00
Arthur Schiwon 1c58d8b226 LDAP: implement userCount action. This required to (finally) clean up and refactor the search method, which will have a positive performance impact on paged search. 2014-01-09 16:59:58 +01:00
Arthur Schiwon 0f58bd02c1 Add command line tool to show numbers of users and user directories 2014-01-09 16:59:47 +01:00
Arthur Schiwon 4b4901519d Introduce user count action to user management 2014-01-09 16:59:39 +01:00
Vincent Petry a711d4e39a Removed special handling of part files in shared storage rename
This fixes the issue introduced by the transfer id which itself wasn't
taken into account by the shortcut code for part file in the shared
storage class.

Backport of 8eaa39f to stable6
2014-01-09 15:23:55 +01:00
Thomas Müller 52dc90d5fd Merge pull request #6696 from owncloud/backport-6693-stable6
Backport 6693 stable6
2014-01-09 04:56:26 -08:00
Thomas Müller 9a1cbabdd6 rename user-id to loginname to stay consistent 2014-01-09 12:34:19 +01:00
Thomas Müller 596ab7552e set login name within apache auth backend 2014-01-09 12:34:19 +01:00
Thomas Müller ea23a09c05 fixing PHPDoc and use cameCase names 2014-01-09 12:34:19 +01:00
Arthur Schiwon 394bd17251 typo, grammar 2014-01-08 19:55:28 +01:00
Thomas Müller 627612c9e0 Merge pull request #6679 from owncloud/backport-6675-stable6
Backport 6675 stable6
2014-01-08 04:33:40 -08:00
Thomas Müller c6fa2dd8e2 turn off mod_pagespeed 2014-01-08 12:19:30 +01:00
Thomas Müller 8d38228c98 Merge pull request #6678 from owncloud/backport-6660-stable6
Backport 6660 stable6
2014-01-08 02:50:15 -08:00
Thomas Müller bbba8fd09d trimming all array elements 2014-01-08 10:45:37 +01:00
Thomas Müller 5e928fc988 we shall explode on ',' only 2014-01-08 10:45:37 +01:00
Thomas Müller 7e36763631 reuse existing helper function OC_Helper::is_function_enabled 2014-01-08 10:45:37 +01:00
Vincent Petry 542cf79595 Now also preventing to override "files" dir size with -1
Fixes #6526

Backport of 5be4af9 to stable6
2014-01-08 09:56:00 +01:00
Vincent Petry 2ea3765359 Added isUserAgent() method to request
- added isUserAgent() method to OC_Request which makes it possible to
  test it
- OC_Response::setContentDisposition now uses OC_Request::isUserAgent()
2014-01-07 22:11:39 +01:00
Vincent Petry b7aaebf94f Added workaround for Android content disposition
Fixes #5807
2014-01-07 22:11:30 +01:00
Vincent Petry c9cb258616 Moved content disposition code+workarounds to OCP\Response
Added new OC\Response API called setContentDispositionHeader() that
contains the needed workarounds for UTF8 and IE.

Refactored download code to use the new API.

Removed unused trashbin download file.
2014-01-07 22:11:22 +01:00
Thomas Müller 697ad1ca9e Merge pull request #6666 from ogasser/decimal_precision_scale_stable6_bp
DB: Support DECIMAL(precision,scale) syntax in XML
2014-01-07 11:11:32 -08:00
Thomas Müller 6a838718df Merge pull request #6664 from owncloud/fix_empty_mimetypes_stable6
remove duplicate exe mimetype, add correct msi mimetype
2014-01-07 07:31:29 -08:00
Oliver Gasser 6a21922854 DB: Support DECIMAL(precision,scale) syntax in XML
Add support for specifying the precision and scale of a decimal data
type to the XML description language. Added new unit tests and adapted
existing ones.

See owncloud/core#6475

Backported from owncloud/core#6476
2014-01-07 16:07:54 +01:00
Jörn Friedrich Dreyer c81a05cbb1 remove duplicate exe mimetype, add correct msi mimetype 2014-01-07 15:54:33 +01:00
Robin Appelman 956a4419d8 Fix APCIterator syntax in \OC\Memcache\APCU::clear
see http://www.php.net/manual/en/apciterator.construct.php
2014-01-03 14:31:19 +01:00
Robin Appelman f356ef90d7 Return SPACE_UNKNOWN if disk_free_space is disabled when getting the free space on a local storage 2014-01-02 17:30:39 +01:00
Robin Appelman a8fd55d90d Pass config object in testGetHomeNotSupported 2014-01-02 16:58:30 +01:00
Robin Appelman 208037b56a Replace static usage of OC_Config and OC_Preferences with the injected \OC\ConfigAll 2014-01-02 16:58:12 +01:00
Robin Appelman 62887c67ab fix the config option to remove the ability for users to set their displayname 2014-01-02 16:58:05 +01:00
Robin Appelman 9960596f4e fix fallback overwriting result of getHome 2014-01-02 16:57:52 +01:00
Robin Appelman b5ef21b22d cache the home folder of a User 2014-01-02 16:57:45 +01:00
Robin Appelman 44fb817a4e Also add default to the \OCP\IConfig interface 2014-01-02 16:54:44 +01:00
Robin Appelman 2c54dcda89 add default parameter for AllConfig->get*Value() 2014-01-02 16:54:39 +01:00
Frank Karlitschek 0bb7202ff7 Merge pull request #6562 from syncloud/stable6
Made admin password field required on client side
2013-12-25 03:36:00 -08:00
Vladimir Sapronov 75eaea1dff Made password field required on client side
Fix for case described in https://github.com/syncloud/owncloud-setup/issues/19
2013-12-23 21:39:14 -05:00
Andreas Fischer 93b6c83814 Backport of PR #4378: Don't use xcache in case admin auth is enabled. 2013-12-20 17:15:48 +01:00
Andreas Fischer d9df271113 Do not use xcache variable cache if cache size is 0.
This is possible because it is possible to only use xcache as an opcode cache
but not a variable cache.
2013-12-20 16:50:18 +01:00
Bjoern Schiessle 13461698e4 tests added 2013-12-19 20:10:42 +01:00
Bjoern Schiessle eaa5dd0282 we can also have a path user/cache/... 2013-12-19 20:10:29 +01:00
Bjoern Schiessle 672cbc5378 check if the old owner and the old path is available 2013-12-19 19:20:29 +01:00
Bjoern Schiessle 2f568c9766 fix rename of shared files 2013-12-19 19:20:17 +01:00
Vincent Petry c4c972fd2f Merge pull request #6498 from owncloud/stable6-oracleencryptiontestfix
[stable6] Trying to fix failing encryption tests on Oracle
2013-12-19 06:45:37 -08:00
Thomas Müller 6de259e0ac Merge pull request #6291 from owncloud/ldap_doc_link
LDAP: Adjust help link to documentation
2013-12-19 02:56:34 -08:00
Vincent Petry 1f93b4e842 Removed numRows usage from encryption app
numRows on Oracle always seem to return 0.

This fix removes numRows usage from the encryption and sharing app.

This fixes unit tests and potentially the encryption app itself
(migration status) when running on Oracle
2013-12-18 21:14:26 +01:00
Robin Appelman 4c2d2f4dc9 check if a $_SESSION entry exists before we try to remove it 2013-12-18 14:26:27 +01:00
Robin Appelman 148c16bf70 preserve 3rd party values in in the Session destructor 2013-12-18 14:26:21 +01:00
Vincent Petry 77af1a7127 Fixed JS plural function to be per app
Some apps might not define the same "nplural" value.
To avoid conflicts, the plural function is now generated per app.

Fixes #6427
2013-12-18 12:13:22 +01:00
Bjoern Schiessle 2f0ec8256f reliable detect encrypted files 2013-12-17 18:14:36 +01:00
Frank Karlitschek 913df0c5ed clarifying license 2013-12-17 17:30:57 +01:00
Bjoern Schiessle c88109a496 always show home breadcrumb in files view 2013-12-17 11:02:02 +01:00
Bjoern Schiessle 8f5dfd0920 always show 'Deleted Files' breadcrumb 2013-12-17 11:01:43 +01:00
Vincent Petry ae58a385b7 Do not use L10n when logging exceptions
In some specific situations, the L10N bundle isn't loadable yet (for
example when there is an issue with the app_config table). In such case,
we still want to be able to log the real exception.

This fixes errors that say "OC_L10N_String::__toString must not throw
exceptions"
2013-12-17 10:56:02 +01:00
Bjoern Schiessle 3160b23291 update file cache for target file 2013-12-16 17:49:14 +01:00
Bjoern Schiessle 73a0b690e9 only remove encryption keys if a real file gets deleted, skip this method if a file outside of /data/user/files was deleted 2013-12-16 17:49:05 +01:00
Bjoern Schiessle bdb4890d04 call set password hook because it doesn't get triggered during test execution and fix paths 2013-12-16 17:48:52 +01:00
Bjoern Schiessle 9091dd7833 enable more tests 2013-12-16 17:48:44 +01:00
Thomas Tanghus a8a35f4d07 Use DEBUG instead of ERROR when favourites not found. Fix #6419 2013-12-16 17:31:03 +01:00
Frank Karlitschek 0d24b22485 6.0.0a 2013-12-14 20:40:17 +01:00
Frank Karlitschek e8a696cff9 Merge pull request #6389 from owncloud/ignore_comments_on_columns
ignore comments on schema as a quickfix for oc6
2013-12-14 11:31:20 -08:00
Vincent Petry 811ef19ada Removed comments in database schema of encryption app 2013-12-14 11:18:48 +01:00
Jörn Friedrich Dreyer db696a2dda ignore comments on schema as a quickfix for oc6 2013-12-13 19:21:14 +01:00
Arthur Schiwon 3d81009347 LDAP: only read config from database, if configID is given. Not what we want to do when on-the-fly-testing settings from the admin page 2013-12-13 18:01:42 +01:00
Vincent Petry 0b665700b5 Merge pull request #6406 from owncloud/stable6-no-backgroundjobs-during-upgrade
dont try to register background jobs if we haven't upgraded yet
2013-12-13 08:58:50 -08:00
Arthur Schiwon 1e407482be remove unused variables 2013-12-13 17:52:43 +01:00
Arthur Schiwon d343c66f85 LDAP: fix TLS detection 2013-12-13 17:52:19 +01:00
Robin Appelman 0a0d89296b dont try to register background jobs if we haven't upgraded yet 2013-12-13 17:13:18 +01:00
blizzz fede36d515 Merge pull request #6308 from owncloud/fix_webdav_session_login_user_comparison
Fix webdav session login user comparison
2013-12-13 07:56:28 -08:00
Vincent Petry 527a16852e Merge pull request #6367 from owncloud/fix_expiration_date_conversion
rely only on php DateTime to parse the db datetime string
2013-12-13 07:36:30 -08:00
blizzz aab7c187f2 Merge pull request #6372 from owncloud/ldap_fix_setConfig
LDAP: fix method behind save button on advancend and expert tabs, fixes ...
2013-12-13 07:28:44 -08:00
Vincent Petry dd7b074dfa Fix webroot for update page
On the update page, config.js was missing which caused oc_webroot to not
be available. That would trigger the faulty oc_webroot fallback that
didn't take URLs like "/owncloud/index.php/files/apps" into account.

This fix adds config.js in the update page and also a fix for the
oc_webroot fallback, in case it is used elsewhere.

Backport of df1a404
2013-12-13 14:36:35 +01:00
Robin Appelman 71e93c2b79 remove unneeded ; in comment 2013-12-13 13:52:39 +01:00
Robin Appelman ca161e2a96 Add test for having utf8 filenames in the cache 2013-12-13 13:52:32 +01:00
Arthur Schiwon ab8691d84b adjust test 2013-12-13 12:56:06 +01:00
Thomas Müller a48cf28e17 Merge pull request #6364 from owncloud/backport-6302-stable6
Send "SET NAMES utf8" to MySQL for PHP below 5.3.6
2013-12-13 00:56:28 -08:00
Thomas Müller cd7c974fb6 Updated 3rdparty ref 2013-12-13 00:03:20 +01:00
Arthur Schiwon 3b5d032dd5 LDAP: fix method behind save button on advancend and expert tabs, fixes at least Home Folder setinng 2013-12-12 23:09:31 +01:00
Jörn Friedrich Dreyer f8088ecd29 rely only on php DateTime to parse the db datetime string 2013-12-12 19:09:21 +01:00
Bjoern Schiessle e83ff69465 toggle select all checkbox 2013-12-12 18:47:31 +01:00
Andreas Fischer 66af605697 Send "SET NAMES utf8" to MySQL for PHP below 5.3.6 2013-12-12 12:26:17 -05:00
Jörn Friedrich Dreyer 71dc81d420 update 3rdparty 2013-12-12 17:59:46 +01:00
blizzz 02c9bb76ff Merge pull request #6350 from owncloud/ldap_dont_autofill
LDAP: the browser shall not autofill userdn and password, usually login ...
2013-12-12 05:14:44 -08:00
Arthur Schiwon 7b388eb4a8 LDAP: the browser shall not autofill userdn and password, usually login credentials are inserted. fixes #6283 2013-12-12 14:04:10 +01:00
Arthur Schiwon c770089b50 coding style 2013-12-11 14:01:48 +01:00
Arthur Schiwon afaac05f61 coding style 2013-12-11 13:57:02 +01:00
Arthur Schiwon aba8199a82 On webdav sesssions, loginname was compared to username which does not need to match necessarily 2013-12-11 13:56:45 +01:00
Arthur Schiwon 0134b1ebfa LDAP: adjust documentation URL for OC 6 2013-12-10 17:45:03 +01:00
Jan-Christoph Borchardt 339e073399 fix shadow size and arrow position 2013-12-10 14:39:23 +01:00
Jan-Christoph Borchardt 4feafda822 fix the legacy popup to make calendar settings look nicer 2013-12-10 14:39:15 +01:00
Andreas Fischer 5ac339b866 Document memcached settings in config.sample.php 2013-12-09 14:35:20 +01:00
Morris Jobke 95c90ddbc4 fix wrong test data in l10n 2013-12-09 10:41:57 +01:00
Morris Jobke 2417c8a49e fix plural translation - fixes #6226 2013-12-09 10:41:51 +01:00
Frank Karlitschek 26d0adf2fe 6.0.0 2013-12-06 21:20:22 +01:00
Frank Karlitschek 734fdbddea RC4 2013-12-06 21:06:42 +01:00
Robin Appelman 33144941a9 add test case for removing background jobs that are throwing exceptions 2013-12-06 20:58:12 +01:00
Robin Appelman f309920bef Dont use exceptions for the backgroundjob test cases 2013-12-06 20:58:06 +01:00
Robin Appelman e78a309111 remove background jobs if they are failing 2013-12-06 20:57:58 +01:00
Robin Appelman 46a4ad4f3c Catch exceptions from background jobs and log them 2013-12-06 20:57:52 +01:00
Frank Karlitschek 3842c0d766 Merge pull request #6225 from owncloud/stable6-backgroundscan-reuse-etag
Stable6 backgroundscan reuse etag
2013-12-06 11:55:23 -08:00
Robin Appelman 8369c1f05b get rid of failing test that don't cause additional downloads 2013-12-06 19:19:10 +01:00
Robin Appelman cadf1c232e extend test case for etag preservation 2013-12-06 19:19:10 +01:00
Robin Appelman 713651738c reuse etags when doing a background scan 2013-12-06 19:19:10 +01:00
Bart Visscher 1475245465 XSendfile and encryption don't work together
The file on disk is encrypted, and not readable on client systems
2013-12-06 19:07:22 +01:00
Bart Visscher 281bbf4bd4 Don't try to encrypt a file when the temp file isn't created 2013-12-06 19:07:11 +01:00
Bart Visscher a2bbbb1448 Users of getFolderContent are mostly interested in the unecrypted file size 2013-12-06 19:06:42 +01:00
root 87a28957aa correctly propagate the return value of ldap_set_option
otherwise LDAP_OPT_REFERRALS won't be set to 0 and in turn
active directory paging will stop working
(Operations error on ldap_control_paged_result_response)
2013-12-06 18:01:42 +01:00
Bjoern Schiessle 01de6c565a set unencrypted_size to 0 after decryption... so that the unencrypted_size gets re-calculated if encryption was enabled again 2013-12-06 17:08:17 +01:00
Bjoern Schiessle f3e341edac add a optional parameter to skip check for expired files, this is necessary to find out to whom a file was shared after it was expired. 2013-12-06 14:42:09 +01:00
Bjoern Schiessle c5d6af3c5a get owner from share item, if we expire a share while the user updates his /Shared folder than the owner is different from the currently logged in user 2013-12-06 14:41:59 +01:00
Bjoern Schiessle cc1577054d it is not possible to unshare files 2013-12-06 12:36:31 +01:00
Björn Schießle 3e6b18b2d0 Merge pull request #6208 from owncloud/enc_only_create_new_key_if_no_other_key_exists
[Encryption] Only create new key if no other key exists
2013-12-06 03:07:52 -08:00
Nico Kaiser 7eb505e6dd Fix user's displayName being overwritten by (old) cookie 2013-12-05 20:56:41 +01:00
Bjoern Schiessle 91ca1cf985 fix typo 2013-12-05 20:02:41 +01:00
Bjoern Schiessle f8a4bcdd50 only create new key on password change if a recovery key exists or if the user don't have any private/public keys 2013-12-05 19:41:01 +01:00
Bjoern Schiessle 418d401bf9 show change password form if key couldn't be decrypted 2013-12-05 18:50:52 +01:00
Bjoern Schiessle d0afd774b7 add method to check if users private/public key exists 2013-12-05 18:49:55 +01:00
Morris Jobke 0af65cae37 fix appearance of error message - .errors is outdated 2013-12-05 16:11:52 +01:00
Frank Karlitschek 4d50fe5f12 ownCloud 6 RC3 2013-12-05 12:02:53 +01:00
Vincent Petry f24aca61a9 Merge pull request #6180 from owncloud/fix_6143
fixes checkboxes in Advanced Tab don't save unchecked state anymore, #6143
2013-12-04 08:33:12 -08:00
Bjoern Schiessle d3e2226b38 config switch to disable auto expire for the trash bin 2013-12-04 16:55:07 +01:00
Arthur Schiwon 73fa6259be LDAP Wizard: avoid a manually deactivated LDAP configuration is enabled by just opening the admin page 2013-12-04 14:01:31 +01:00
Morris Jobke dffc2a8b1c Revert "Adjust files_encryption requirements to the new core requirement (PHP 5.3.8)."
This reverts commit efbf18652c.
2013-12-04 13:26:59 +01:00
Vincent Petry fd634fdec8 Added unit test for the test() method
This is to make sure that method isn't broken
2013-12-04 13:22:25 +01:00
Arthur Schiwon 328ebaefde LDAP: make unsetting checkboxes from Advanced tab work again, fixes #6143 2013-12-04 13:15:17 +01:00
Thomas Müller 4de8c4e5db Merge pull request #6175 from owncloud/fix_6142
LDAP Wizard: make sure auto-detected suggestions are really applied initially, fixes #6142
2013-12-04 02:54:07 -08:00
Frank Karlitschek 8dc3cb2ffb lower required php version to 5.3.3 2013-12-04 10:51:12 +01:00
Arthur Schiwon c67ece0f6b LDAP Wizard: don't generate filter when not allowed 2013-12-03 20:50:46 +01:00
Arthur Schiwon 6640e120b7 some equals are more equal than other equals 2013-12-03 20:45:05 +01:00
Thomas Mueller 6f7b394d99 fixing PHPDoc and spelling 2013-12-03 17:49:37 +01:00
Andreas Fischer 91f47645b0 Use getLastError() everywhere. 2013-12-03 17:49:37 +01:00
Andreas Fischer 18903cc8f7 Add getLastError() 2013-12-03 17:49:37 +01:00
Andreas Fischer 7e467484a8 No function as oci_last_error. It's oci_error. 2013-12-03 17:49:37 +01:00
Andreas Fischer 21bf6abd41 There is no property such as dbusername. It's 'dbuser'. 2013-12-03 17:49:37 +01:00
Andreas Fischer 401728b2a2 Correct property name. It's 'dbpassword', with the 'db' prefix. 2013-12-03 17:49:37 +01:00
Andreas Fischer bfd0dc3314 Correct property name. It's just 'tableprefix', without the 'db' prefix. 2013-12-03 17:49:37 +01:00
Jan-Christoph Borchardt ad92b12559 fix time input field properly, details 2013-12-03 17:42:03 +01:00
Morris Jobke 4391992b8c fix public page - gallery view issues 2013-12-03 17:20:29 +01:00
Morris Jobke 728e6d735a fix trashbin and pbulic page controls 2013-12-03 17:20:23 +01:00
Morris Jobke 66df8c3bb3 fix and cleanup CSS for public page 2013-12-03 17:20:17 +01:00
Jan-Christoph Borchardt ca08d21da0 change different shades of grey for public share page to white 2013-12-03 17:20:08 +01:00
Jan-Christoph Borchardt 7d0f458f11 remove app specific code 2013-12-03 17:20:00 +01:00
Jan-Christoph Borchardt f15aeb3bbc fix details for buttons in header and controls bar 2013-12-03 17:19:53 +01:00
Jan-Christoph Borchardt 9333244925 account for shift of controls bar due to app navigation, do not shift on public page 2013-12-03 17:19:38 +01:00
Vincent Petry 50f5ab8515 Merge pull request #6173 from owncloud/stable6-extstorage-s3fixes
Backport of S3 ext storage fixes to stable6
2013-12-03 08:16:10 -08:00
Arthur Schiwon 4df0d2e7e8 LDAP Wizard: return correct var 2013-12-03 16:37:11 +01:00
Vincent Petry f2e17a0b68 Fixed placeholder after page reload
The placeholder somehow had too many characters stripping from it...
2013-12-03 15:55:24 +01:00
Vincent Petry e372971f2b Fixed test function for S3
Fixes #5752
2013-12-03 15:55:15 +01:00
Vincent Petry 3bf30377b8 Fixed Amazon S3 ext storage config UI
Optional parameters are now really optional

Fixes #5861
2013-12-03 15:55:08 +01:00
Arthur Schiwon 67b67b6d66 LDAP Wizard: make sure auto-detected suggestions are really applied initially. Also make initial filter compilation and user counting robust against race conditions. 2013-12-03 13:27:45 +01:00
Arthur Schiwon b8390f15d4 LDAP: on testing configuration, set active property to true, otherwise inactive connections cannot be tested properly 2013-12-03 13:21:55 +01:00
Robin Appelman 5ac3f9bfa5 check if a directory exists before we try to remove it 2013-12-03 12:45:41 +01:00
Arthur Schiwon 02fe013d2f LDAP: set default value for login filter to empty, otherwise the wizard signals completed configuration too early when it might be not correct, i.e. login won't work 2013-12-03 12:11:43 +01:00
Bjoern Schiessle 5e5e4fe3a4 make it possible to select folders 2013-12-02 22:23:51 +01:00
Arthur Schiwon d49e4e53fd LDAP Wizard: don't send ldap_tls change back to the interface as the element was removed, for it is detected fully automatically. Resolves an JS error and thus an ever-spinning spinner 2013-12-02 21:11:20 +01:00
Bjoern Schiessle 2d11290121 check explicitely all possible dir values 2013-12-02 16:06:51 +01:00
Bjoern Schiessle 1a197292da set delete all to true if a complete folder was deleted 2013-12-02 16:06:36 +01:00
Bjoern Schiessle 3b59979746 fix delete files from trash bin 2013-12-02 16:06:24 +01:00
Bjoern Schiessle 259d619af3 fix restore from files in sub-folders 2013-12-02 16:06:14 +01:00
165 changed files with 2267 additions and 4208 deletions
+3
View File
@@ -38,3 +38,6 @@ DirectoryIndex index.php index.html
</IfModule>
AddDefaultCharset utf-8
Options -Indexes
<IfModule pagespeed_module>
ModPagespeed Off
</IfModule>
+1 -6
View File
@@ -37,12 +37,7 @@ if(!\OC\Files\Filesystem::file_exists($filename)) {
$ftype=\OC\Files\Filesystem::getMimeType( $filename );
header('Content-Type:'.$ftype);
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
} else {
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
}
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
OCP\Response::disableCaching();
header('Content-Length: '.\OC\Files\Filesystem::filesize($filename));
+10 -2
View File
@@ -222,6 +222,14 @@ $(document).ready(function() {
//examine file
var file = data.files[0];
try {
// FIXME: not so elegant... need to refactor that method to return a value
Files.isFileNameValid(file.name);
}
catch (errorMessage) {
data.textStatus = 'invalidcharacters';
data.errorThrown = errorMessage;
}
if (file.type === '' && file.size === 4096) {
data.textStatus = 'dirorzero';
@@ -605,7 +613,7 @@ $(document).ready(function() {
if (result.status === 'success') {
var date=new Date();
FileList.addDir(name, 0, date, hidden);
var tr=$('tr[data-file="'+name+'"]');
var tr = FileList.findFileEl(name);
tr.attr('data-id', result.data.id);
} else {
OC.dialogs.alert(result.data.message, t('core', 'Could not create folder'));
@@ -647,7 +655,7 @@ $(document).ready(function() {
$('#uploadprogressbar').fadeOut();
var date = new Date();
FileList.addFile(localName, size, date, false, hidden);
var tr = $('tr[data-file="'+localName+'"]');
var tr = FileList.findFileEl(localName);
tr.data('mime', mime).data('id', id);
tr.attr('data-id', id);
var path = $('#dir').val()+'/'+localName;
+1 -1
View File
@@ -71,7 +71,7 @@ var FileActions = {
FileActions.currentFile = parent;
var actions = FileActions.get(FileActions.getCurrentMimeType(), FileActions.getCurrentType(), FileActions.getCurrentPermissions());
var file = FileActions.getCurrentFile();
if ($('tr[data-file="'+file+'"]').data('renaming')) {
if (FileList.findFileEl(file).data('renaming')) {
return;
}
+30 -19
View File
@@ -6,6 +6,13 @@ var FileList={
$(this).attr('data-file',decodeURIComponent($(this).attr('data-file')));
});
},
/**
* Returns the tr element for a given file name
*/
findFileEl: function(fileName){
// use filterAttr to avoid escaping issues
return $('#fileList tr').filterAttr('data-file', fileName);
},
update:function(fileListHtml) {
var $fileList = $('#fileList');
$fileList.empty().html(fileListHtml);
@@ -292,8 +299,9 @@ var FileList={
$('#filestable').toggleClass('hidden', show);
},
remove:function(name){
$('tr').filterAttr('data-file',name).find('td.filename').draggable('destroy');
$('tr').filterAttr('data-file',name).remove();
var fileEl = FileList.findFileEl(name);
fileEl.find('td.filename').draggable('destroy');
fileEl.remove();
FileList.updateFileSummary();
if ( ! $('tr[data-file]').exists() ) {
$('#emptycontent').removeClass('hidden');
@@ -334,7 +342,7 @@ var FileList={
FileList.updateFileSummary();
},
loadingDone:function(name, id) {
var mime, tr = $('tr[data-file="'+name+'"]');
var mime, tr = FileList.findFileEl(name);
tr.data('loading', false);
mime = tr.data('mime');
tr.attr('data-mime', mime);
@@ -347,12 +355,12 @@ var FileList={
}, null, null, tr.attr('data-etag'));
tr.find('td.filename').draggable(dragOptions);
},
isLoading:function(name) {
return $('tr[data-file="'+name+'"]').data('loading');
isLoading:function(file) {
return FileList.findFileEl(file).data('loading');
},
rename:function(oldname) {
var tr, td, input, form;
tr = $('tr[data-file="'+oldname+'"]');
tr = FileList.findFileEl(oldname);
tr.data('renaming',true);
td = tr.children('td.filename');
input = $('<input type="text" class="filename"/>').val(oldname);
@@ -500,14 +508,16 @@ var FileList={
form.trigger('submit');
});
},
inList:function(filename) {
return $('#fileList tr[data-file="'+filename+'"]').length;
inList:function(file) {
return FileList.findFileEl(file).length;
},
replace:function(oldName, newName, isNewFile) {
// Finish any existing actions
$('tr[data-file="'+oldName+'"]').hide();
$('tr[data-file="'+newName+'"]').hide();
var tr = $('tr[data-file="'+oldName+'"]').clone();
var oldFileEl = FileList.findFileEl(oldName);
var newFileEl = FileList.findFileEl(newName);
oldFileEl.hide();
newFileEl.hide();
var tr = oldFileEl.clone();
tr.attr('data-replace', 'true');
tr.attr('data-file', newName);
var td = tr.children('td.filename');
@@ -559,7 +569,7 @@ var FileList={
files=[files];
}
for (var i=0; i<files.length; i++) {
var deleteAction = $('tr[data-file="'+files[i]+'"]').children("td.date").children(".action.delete");
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
}
// Finish any existing actions
@@ -573,7 +583,7 @@ var FileList={
function(result) {
if (result.status === 'success') {
$.each(files,function(index,file) {
var files = $('tr[data-file="'+file+'"]');
var files = FileList.findFileEl(file);
files.remove();
files.find('input[type="checkbox"]').removeAttr('checked');
files.removeClass('selected');
@@ -595,7 +605,7 @@ var FileList={
OC.Notification.hide();
}, 10000);
$.each(files,function(index,file) {
var deleteAction = $('tr[data-file="' + file + '"] .action.delete');
var deleteAction = FileList.findFileEl(file).find('.action.delete');
deleteAction.removeClass('progress-icon').addClass('delete-icon');
});
}
@@ -737,7 +747,7 @@ var FileList={
},
scrollTo:function(file) {
//scroll to and highlight preselected file
var $scrolltorow = $('tr[data-file="'+file+'"]');
var $scrolltorow = FileList.findFileEl(file);
if ($scrolltorow.exists()) {
$scrolltorow.addClass('searchresult');
$(window).scrollTop($scrolltorow.position().top);
@@ -949,7 +959,7 @@ $(document).ready(function() {
$('#notification').on('click', '.undo', function() {
if (FileList.deleteFiles) {
$.each(FileList.deleteFiles,function(index,file) {
$('tr[data-file="'+file+'"]').show();
FileList.findFileEl(file).show();
});
FileList.deleteCanceled=true;
FileList.deleteFiles=null;
@@ -959,10 +969,10 @@ $(document).ready(function() {
FileList.deleteCanceled = false;
FileList.deleteFiles = [FileList.replaceOldName];
} else {
$('tr[data-file="'+FileList.replaceOldName+'"]').show();
FileList.findFileEl(FileList.replaceOldName).show();
}
$('tr[data-replace="true"').remove();
$('tr[data-file="'+FileList.replaceNewName+'"]').show();
FileList.findFileEl(FileList.replaceNewName).show();
FileList.replaceCanceled = true;
FileList.replaceOldName = null;
FileList.replaceNewName = null;
@@ -977,7 +987,8 @@ $(document).ready(function() {
});
});
$('#notification:first-child').on('click', '.suggest', function() {
$('tr[data-file="'+$('#notification > span').attr('data-oldName')+'"]').show();
var file = $('#notification > span').attr('data-oldName');
FileList.findFileEl(file).show();
OC.Notification.hide();
});
$('#notification:first-child').on('click', '.cancel', function() {
+8 -6
View File
@@ -282,7 +282,7 @@ $(document).ready(function() {
procesSelection();
} else {
var filename=$(this).parent().parent().attr('data-file');
var tr=$('tr[data-file="'+filename+'"]');
var tr = FileList.findFileEl(filename);
var renaming=tr.data('renaming');
if (!renaming && !FileList.isLoading(filename)) {
FileActions.currentFile = $(this).parent();
@@ -541,10 +541,12 @@ var folderDropOptions={
if (result) {
if (result.status === 'success') {
//recalculate folder size
var oldSize = $('#fileList tr[data-file="'+target+'"]').data('size');
var newSize = oldSize + $('#fileList tr[data-file="'+file+'"]').data('size');
$('#fileList tr[data-file="'+target+'"]').data('size', newSize);
$('#fileList tr[data-file="'+target+'"]').find('td.filesize').text(humanFileSize(newSize));
var oldFile = FileList.findFileEl(target);
var newFile = FileList.findFileEl(file);
var oldSize = oldFile.data('size');
var newSize = oldSize + newFile.data('size');
oldFile.data('size', newSize);
oldFile.find('td.filesize').text(humanFileSize(newSize));
FileList.remove(file);
procesSelection();
@@ -738,7 +740,7 @@ Files.lazyLoadPreview = function(path, mime, ready, width, height, etag) {
}
function getUniqueName(name) {
if ($('tr[data-file="'+name+'"]').exists()) {
if (FileList.findFileEl(name).exists()) {
var parts=name.split('.');
var extension = "";
if (parts.length > 1) {
-17
View File
@@ -1,17 +0,0 @@
<?php
$TRANSLATIONS = array(
"Files" => "Файлы",
"Share" => "Сделать общим",
"Rename" => "Переименовать",
"_%n folder_::_%n folders_" => array("","",""),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
"Error" => "Ошибка",
"Size" => "Размер",
"Upload" => "Загрузка",
"Save" => "Сохранить",
"Cancel upload" => "Отмена загрузки",
"Download" => "Загрузка",
"Delete" => "Удалить"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+5 -14
View File
@@ -69,20 +69,11 @@
<th <?php if (!$_['fileHeader']):?>class="hidden"<?php endif; ?> id="headerDate">
<span id="modified"><?php p($l->t( 'Modified' )); ?></span>
<?php if ($_['permissions'] & OCP\PERMISSION_DELETE): ?>
<!-- NOTE: Temporary fix to allow unsharing of files in root of Shared folder -->
<?php if ($_['dir'] == '/Shared'): ?>
<span class="selectedActions"><a href="" class="delete-selected">
<?php p($l->t('Unshare'))?>
<img class="svg" alt="<?php p($l->t('Unshare'))?>"
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
</a></span>
<?php else: ?>
<span class="selectedActions"><a href="" class="delete-selected">
<?php p($l->t('Delete'))?>
<img class="svg" alt="<?php p($l->t('Delete'))?>"
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
</a></span>
<?php endif; ?>
<span class="selectedActions"><a href="" class="delete-selected">
<?php p($l->t('Delete'))?>
<img class="svg" alt="<?php p($l->t('Delete'))?>"
src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" />
</a></span>
<?php endif; ?>
</th>
</tr>
+5 -7
View File
@@ -1,10 +1,8 @@
<?php if(count($_["breadcrumb"])):?>
<div class="crumb" data-dir=''>
<a href="<?php print_unescaped($_['baseURL']); ?>">
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
</a>
</div>
<?php endif;?>
<div class="crumb <?php if(!count($_["breadcrumb"])) p('last');?>" data-dir=''>
<a href="<?php print_unescaped($_['baseURL']); ?>">
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
</a>
</div>
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
$crumb = $_["breadcrumb"][$i];
$dir = \OCP\Util::encodePath($crumb["dir"]); ?>
+1 -4
View File
@@ -18,22 +18,19 @@
<type>text</type>
<notnull>true</notnull>
<length>64</length>
<comments>What client-side / server-side configuration is used</comments>
</field>
<field>
<name>recovery_enabled</name>
<type>integer</type>
<notnull>true</notnull>
<default>0</default>
<comments>Whether encryption key recovery is enabled</comments>
</field>
<field>
<name>migration_status</name>
<type>integer</type>
<notnull>true</notnull>
<default>0</default>
<comments>Whether encryption migration has been performed</comments>
</field>
</declaration>
</table>
</database>
</database>
+73 -43
View File
@@ -30,6 +30,9 @@ use OC\Files\Filesystem;
*/
class Hooks {
// file for which we want to rename the keys after the rename operation was successful
private static $renamedFiles = array();
/**
* @brief Startup encryption backend upon user login
* @note This method should never be called for users using client side encryption
@@ -179,9 +182,9 @@ class Hooks {
// the necessary keys)
if (Crypt::mode() === 'server') {
if ($params['uid'] === \OCP\User::getUser()) {
$view = new \OC_FilesystemView('/');
$view = new \OC_FilesystemView('/');
if ($params['uid'] === \OCP\User::getUser()) {
$session = new \OCA\Encryption\Session($view);
@@ -202,36 +205,41 @@ class Hooks {
} else { // admin changed the password for a different user, create new keys and reencrypt file keys
$user = $params['uid'];
$recoveryPassword = $params['recoveryPassword'];
$newUserPassword = $params['password'];
$util = new Util($view, $user);
$recoveryPassword = isset($params['recoveryPassword']) ? $params['recoveryPassword'] : null;
$view = new \OC_FilesystemView('/');
if (($util->recoveryEnabledForUser() && $recoveryPassword)
|| !$util->userKeysExists()) {
// make sure that the users home is mounted
\OC\Files\Filesystem::initMountPoints($user);
$recoveryPassword = $params['recoveryPassword'];
$newUserPassword = $params['password'];
$keypair = Crypt::createKeypair();
// make sure that the users home is mounted
\OC\Files\Filesystem::initMountPoints($user);
// Disable encryption proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
$keypair = Crypt::createKeypair();
// Save public key
$view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']);
// Disable encryption proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
// Encrypt private key empty passphrase
$encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword);
// Save public key
$view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']);
// Save private key
$view->file_put_contents(
'/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey);
// Encrypt private key empty passphrase
$encryptedPrivateKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword);
if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
$util = new Util($view, $user);
$util->recoverUsersFiles($recoveryPassword);
// Save private key
$view->file_put_contents(
'/' . $user . '/files_encryption/' . $user . '.private.key', $encryptedPrivateKey);
if ($recoveryPassword) { // if recovery key is set we can re-encrypt the key files
$util = new Util($view, $user);
$util->recoverUsersFiles($recoveryPassword);
}
\OC_FileProxy::$enabled = $proxyStatus;
}
\OC_FileProxy::$enabled = $proxyStatus;
}
}
}
@@ -474,6 +482,18 @@ class Hooks {
}
}
/**
* @brief mark file as renamed so that we know the original source after the file was renamed
* @param array $params with the old path and the new path
*/
public static function preRename($params) {
$util = new Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']);
self::$renamedFiles[$params['oldpath']] = array(
'uid' => $ownerOld,
'path' => $pathOld);
}
/**
* @brief after a file is renamed, rename its keyfile and share-keys also fix the file size and fix also the sharing
* @param array with oldpath and newpath
@@ -496,19 +516,32 @@ class Hooks {
$userId = \OCP\User::getUser();
$util = new Util($view, $userId);
// Format paths to be relative to user files dir
if ($util->isSystemWideMountPoint($params['oldpath'])) {
$baseDir = 'files_encryption/';
$oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];
if (isset(self::$renamedFiles[$params['oldpath']]['uid']) &&
isset(self::$renamedFiles[$params['oldpath']]['path'])) {
$ownerOld = self::$renamedFiles[$params['oldpath']]['uid'];
$pathOld = self::$renamedFiles[$params['oldpath']]['path'];
} else {
$baseDir = $userId . '/' . 'files_encryption/';
$oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath'];
\OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::ERROR);
return false;
}
if ($util->isSystemWideMountPoint($params['newpath'])) {
$newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath'];
list($ownerNew, $pathNew) = $util->getUidAndFilename($params['newpath']);
// Format paths to be relative to user files dir
if ($util->isSystemWideMountPoint($pathOld)) {
$oldKeyfilePath = 'files_encryption/keyfiles/' . $pathOld;
$oldShareKeyPath = 'files_encryption/share-keys/' . $pathOld;
} else {
$newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath'];
$oldKeyfilePath = $ownerOld . '/' . 'files_encryption/keyfiles/' . $pathOld;
$oldShareKeyPath = $ownerOld . '/' . 'files_encryption/share-keys/' . $pathOld;
}
if ($util->isSystemWideMountPoint($pathNew)) {
$newKeyfilePath = 'files_encryption/keyfiles/' . $pathNew;
$newShareKeyPath = 'files_encryption/share-keys/' . $pathNew;
} else {
$newKeyfilePath = $ownerNew . '/files_encryption/keyfiles/' . $pathNew;
$newShareKeyPath = $ownerNew . '/files_encryption/share-keys/' . $pathNew;
}
// add key ext if this is not an folder
@@ -517,11 +550,11 @@ class Hooks {
$newKeyfilePath .= '.key';
// handle share-keys
$localKeyPath = $view->getLocalFile($baseDir . 'share-keys/' . $params['oldpath']);
$localKeyPath = $view->getLocalFile($oldShareKeyPath);
$escapedPath = Helper::escapeGlobPattern($localKeyPath);
$matches = glob($escapedPath . '*.shareKey');
foreach ($matches as $src) {
$dst = \OC\Files\Filesystem::normalizePath(str_replace($params['oldpath'], $params['newpath'], $src));
$dst = \OC\Files\Filesystem::normalizePath(str_replace($pathOld, $pathNew, $src));
// create destination folder if not exists
if (!file_exists(dirname($dst))) {
@@ -533,15 +566,13 @@ class Hooks {
} else {
// handle share-keys folders
$oldShareKeyfilePath = $baseDir . 'share-keys/' . $params['oldpath'];
$newShareKeyfilePath = $baseDir . 'share-keys/' . $params['newpath'];
// create destination folder if not exists
if (!$view->file_exists(dirname($newShareKeyfilePath))) {
$view->mkdir(dirname($newShareKeyfilePath), 0750, true);
if (!$view->file_exists(dirname($newShareKeyPath))) {
$view->mkdir(dirname($newShareKeyPath), 0750, true);
}
$view->rename($oldShareKeyfilePath, $newShareKeyfilePath);
$view->rename($oldShareKeyPath, $newShareKeyPath);
}
// Rename keyfile so it isn't orphaned
@@ -556,18 +587,17 @@ class Hooks {
}
// build the path to the file
$newPath = '/' . $userId . '/files' . $params['newpath'];
$newPathRelative = $params['newpath'];
$newPath = '/' . $ownerNew . '/files' . $pathNew;
if ($util->fixFileSize($newPath)) {
// get sharing app state
$sharingEnabled = \OCP\Share::isEnabled();
// get users
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $newPathRelative);
$usersSharing = $util->getSharingUsersArray($sharingEnabled, $pathNew);
// update sharing-keys
$util->setSharedFileKeyfiles($session, $usersSharing, $newPathRelative);
$util->setSharedFileKeyfiles($session, $usersSharing, $pathNew);
}
\OC_FileProxy::$enabled = $proxyStatus;
+10 -2
View File
@@ -59,6 +59,7 @@ class Helper {
*/
public static function registerFilesystemHooks() {
\OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Encryption\Hooks', 'preRename');
\OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRename');
}
@@ -274,7 +275,7 @@ class Helper {
$split = explode('/', $trimmed);
// it is not a file relative to data/user/files
if (count($split) < 2 || $split[1] !== 'files') {
if (count($split) < 2 || ($split[1] !== 'files' && $split[1] !== 'cache')) {
return false;
}
@@ -370,7 +371,14 @@ class Helper {
* @return bool true if requirements are met
*/
public static function checkRequirements() {
return extension_loaded('openssl');
$result = true;
//openssl extension needs to be loaded
$result &= extension_loaded("openssl");
// we need php >= 5.3.3
$result &= version_compare(phpversion(), '5.3.3', '>=');
return (bool) $result;
}
/**
+16 -4
View File
@@ -114,6 +114,15 @@ class Proxy extends \OC_FileProxy {
// get encrypted content
$data = $view->file_get_contents($tmpPath);
// update file cache for target file
$tmpFileInfo = $view->getFileInfo($tmpPath);
$fileInfo = $view->getFileInfo($path);
if (is_array($fileInfo) && is_array($tmpFileInfo)) {
$fileInfo['encrypted'] = true;
$fileInfo['unencrypted_size'] = $tmpFileInfo['size'];
$view->putFileInfo($path, $fileInfo);
}
// remove our temp file
$view->deleteAll('/' . \OCP\User::getUser() . '/cache/' . $cacheFolder);
@@ -182,8 +191,11 @@ class Proxy extends \OC_FileProxy {
*/
public function preUnlink($path) {
// let the trashbin handle this
if (\OCP\App::isEnabled('files_trashbin')) {
$relPath = Helper::stripUserFilesPath($path);
// skip this method if the trash bin is enabled or if we delete a file
// outside of /data/user/files
if (\OCP\App::isEnabled('files_trashbin') || $relPath === false) {
return true;
}
@@ -246,8 +258,8 @@ class Proxy extends \OC_FileProxy {
// split the path parts
$pathParts = explode('/', $path);
// FIXME: handling for /userId/cache used by webdav for chunking. The cache chunks are NOT encrypted
if (isset($pathParts[2]) && $pathParts[2] === 'cache') {
// don't try to encrypt/decrypt cache chunks or files in the trash bin
if (isset($pathParts[2]) && ($pathParts[2] === 'cache' || $pathParts[2] === 'files_trashbin')) {
return $result;
}
+64 -62
View File
@@ -101,15 +101,24 @@ class Util {
or !$this->view->file_exists($this->publicKeyPath)
or !$this->view->file_exists($this->privateKeyPath)
) {
return false;
} else {
return true;
}
}
/**
* @brief check if the users private & public key exists
* @return boolean
*/
public function userKeysExists() {
if (
$this->view->file_exists($this->privateKeyPath) &&
$this->view->file_exists($this->publicKeyPath)) {
return true;
} else {
return false;
}
}
/**
@@ -232,11 +241,9 @@ class Util {
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$row = $result->fetchRow();
if (isset($row['recovery_enabled'])) {
$recoveryEnabled[] = $row['recovery_enabled'];
}
$row = $result->fetchRow();
if ($row && isset($row['recovery_enabled'])) {
$recoveryEnabled[] = $row['recovery_enabled'];
}
}
@@ -280,7 +287,7 @@ class Util {
$sql = 'UPDATE `*PREFIX*encryption` SET `recovery_enabled` = ? WHERE `uid` = ?';
$args = array(
$enabled,
$enabled ? '1' : '0',
$this->userId
);
@@ -455,20 +462,22 @@ class Util {
*/
public function isEncryptedPath($path) {
$relPath = Helper::getPathToRealFile($path);
// Disable encryption proxy so data retrieved is in its
// original form
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
if ($relPath === false) {
$relPath = Helper::stripUserFilesPath($path);
// we only need 24 byte from the last chunk
$data = '';
$handle = $this->view->fopen($path, 'r');
if (is_resource($handle) && !fseek($handle, -24, SEEK_END)) {
$data = fgets($handle);
}
$fileKey = Keymanager::getFileKey($this->view, $this, $relPath);
if ($fileKey === false) {
return false;
}
return true;
// re-enable proxy
\OC_FileProxy::$enabled = $proxyStatus;
return Crypt::isCatfileContent($data);
}
/**
@@ -761,7 +770,7 @@ class Util {
\OC\Files\Filesystem::putFileInfo($relPath, array(
'encrypted' => false,
'size' => $size,
'unencrypted_size' => $size,
'unencrypted_size' => 0,
'etag' => $fileInfo['etag']
));
@@ -831,32 +840,35 @@ class Util {
// Open enc file handle for binary writing, with same filename as original plain file
$encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
// Move plain file to a temporary location
$size = stream_copy_to_stream($plainHandle, $encHandle);
if (is_resource($encHandle)) {
// Move plain file to a temporary location
$size = stream_copy_to_stream($plainHandle, $encHandle);
fclose($encHandle);
fclose($plainHandle);
fclose($encHandle);
fclose($plainHandle);
$fakeRoot = $this->view->getRoot();
$this->view->chroot('/' . $this->userId . '/files');
$fakeRoot = $this->view->getRoot();
$this->view->chroot('/' . $this->userId . '/files');
$this->view->rename($relPath . '.part', $relPath);
$this->view->rename($relPath . '.part', $relPath);
// set timestamp
$this->view->touch($relPath, $timestamp);
// set timestamp
$this->view->touch($relPath, $timestamp);
$this->view->chroot($fakeRoot);
$encSize = $this->view->filesize($relPath);
// Add the file to the cache
\OC\Files\Filesystem::putFileInfo($relPath, array(
'encrypted' => true,
'size' => $size,
'unencrypted_size' => $size,
'etag' => $fileInfo['etag']
));
$this->view->chroot($fakeRoot);
$encryptedFiles[] = $relPath;
// Add the file to the cache
\OC\Files\Filesystem::putFileInfo($relPath, array(
'encrypted' => true,
'size' => $encSize,
'unencrypted_size' => $size,
'etag' => $fileInfo['etag']
));
$encryptedFiles[] = $relPath;
}
}
// Encrypt legacy encrypted files
@@ -973,8 +985,8 @@ class Util {
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$row = $result->fetchRow();
$row = $result->fetchRow();
if ($row) {
$path = substr($row['path'], strlen('files'));
}
}
@@ -1254,11 +1266,9 @@ class Util {
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$row = $result->fetchRow();
if (isset($row['migration_status'])) {
$migrationStatus[] = $row['migration_status'];
}
$row = $result->fetchRow();
if ($row && isset($row['migration_status'])) {
$migrationStatus[] = $row['migration_status'];
}
}
@@ -1438,9 +1448,7 @@ class Util {
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$row = $result->fetchRow();
}
$row = $result->fetchRow();
}
return $row;
@@ -1464,9 +1472,7 @@ class Util {
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$row = $result->fetchRow();
}
$row = $result->fetchRow();
}
return $row;
@@ -1485,18 +1491,16 @@ class Util {
$result = $query->execute(array($id));
$source = array();
$source = null;
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$source = $result->fetchRow();
}
$source = $result->fetchRow();
}
$fileOwner = false;
if (isset($source['parent'])) {
if ($source && isset($source['parent'])) {
$parent = $source['parent'];
@@ -1506,16 +1510,14 @@ class Util {
$result = $query->execute(array($parent));
$item = array();
$item = null;
if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else {
if ($result->numRows() > 0) {
$item = $result->fetchRow();
}
$item = $result->fetchRow();
}
if (isset($item['parent'])) {
if ($item && isset($item['parent'])) {
$parent = $item['parent'];
@@ -2,7 +2,7 @@
<fieldset class="personalblock">
<h2><?php p( $l->t( 'Encryption' ) ); ?></h2>
<?php if ( ! $_["privateKeySet"] && $_["initialized"] ): ?>
<?php if ( $_["initialized"] === '1' ): ?>
<p>
<a name="changePKPasswd" />
<label for="changePrivateKeyPasswd">
+37
View File
@@ -8,6 +8,7 @@
require_once __DIR__ . '/../lib/helper.php';
require_once __DIR__ . '/util.php';
use OCA\Encryption;
@@ -16,6 +17,18 @@ use OCA\Encryption;
*/
class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
const TEST_ENCRYPTION_HELPER_USER1 = "test-helper-user1";
public static function setUpBeforeClass() {
// create test user
\Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1, true);
}
public static function tearDownAfterClass() {
// cleanup test user
\OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1);
}
/**
* @medium
*/
@@ -64,4 +77,28 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase {
$this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($cachePath));
}
function testGetUser() {
$path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt";
$path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt";
$path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/thumbnails/foo";
$path4 ="/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1;
// if we are logged-in every path should return the currently logged-in user
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path3));
// now log out
\Test_Encryption_Util::logoutHelper();
// now we should only get the user from /user/files and user/cache paths
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path1));
$this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path2));
$this->assertFalse(Encryption\Helper::getUser($path3));
$this->assertFalse(Encryption\Helper::getUser($path4));
// Log-in again
\Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1);
}
}
+62 -7
View File
@@ -44,8 +44,10 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
/**
* @var \OC_FilesystemView
*/
public $view;
public $view; // view in /data/user/files
public $rootView; // view on /data/user
public $data;
public $filename;
public static function setUpBeforeClass() {
// reset backend
@@ -74,9 +76,12 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
// init filesystem view
$this->view = new \OC_FilesystemView('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files');
$this->rootView = new \OC_FilesystemView('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 );
// init short data
$this->data = 'hats';
$this->filename = 'enc_proxy_tests-' . time() . '.txt';
}
public static function tearDownAfterClass() {
@@ -90,21 +95,71 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase {
*/
function testPostFileSize() {
// generate filename
$filename = 'tmp-' . time() . '.txt';
$this->view->file_put_contents($filename, $this->data);
$this->view->file_put_contents($this->filename, $this->data);
\OC_FileProxy::$enabled = false;
$unencryptedSize = $this->view->filesize($filename);
$unencryptedSize = $this->view->filesize($this->filename);
\OC_FileProxy::$enabled = true;
$encryptedSize = $this->view->filesize($filename);
$encryptedSize = $this->view->filesize($this->filename);
$this->assertTrue($encryptedSize !== $unencryptedSize);
// cleanup
$this->view->unlink($this->filename);
}
function testPreUnlinkWithoutTrash() {
// remember files_trashbin state
$stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
// we want to tests with app files_trashbin enabled
\OC_App::disable('files_trashbin');
$this->view->file_put_contents($this->filename, $this->data);
// create a dummy file that we can delete something outside of data/user/files
$this->rootView->file_put_contents("dummy.txt", $this->data);
// check if all keys are generated
$this->assertTrue($this->rootView->file_exists(
'/files_encryption/share-keys/'
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
$this->assertTrue($this->rootView->file_exists(
'/files_encryption/keyfiles/' . $this->filename . '.key'));
// delete dummy file outside of data/user/files
$this->rootView->unlink("dummy.txt");
// all keys should still exist
$this->assertTrue($this->rootView->file_exists(
'/files_encryption/share-keys/'
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
$this->assertTrue($this->rootView->file_exists(
'/files_encryption/keyfiles/' . $this->filename . '.key'));
// delete the file in data/user/files
$this->view->unlink($this->filename);
// now also the keys should be gone
$this->assertFalse($this->rootView->file_exists(
'/files_encryption/share-keys/'
. $this->filename . '.' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '.shareKey'));
$this->assertFalse($this->rootView->file_exists(
'/files_encryption/keyfiles/' . $this->filename . '.key'));
if ($stateFilesTrashbin) {
OC_App::enable('files_trashbin');
}
else {
OC_App::disable('files_trashbin');
}
}
}
+16 -11
View File
@@ -649,9 +649,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
* @large
*/
function testRecoveryFile() {
$this->markTestIncomplete(
'No idea what\'s wrong here, this works perfectly in real-world. removeRecoveryKeys(\'/\') L709 removes correctly the keys, but for some reasons afterwards also the top-level folder "share-keys" is gone...'
);
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@@ -754,13 +752,13 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
* @large
*/
function testRecoveryForUser() {
$this->markTestIncomplete(
'This test drives Jenkins crazy - "Cannot modify header information - headers already sent" - line 811'
);
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
$result = \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
$this->assertTrue($result);
$recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
// login as user2
@@ -771,6 +769,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// enable recovery for admin
$this->assertTrue($util->setRecoveryForUser(1));
// add recovery keys for existing files (e.g. the auto-generated welcome.txt)
$util->addRecoveryKeys();
// create folder structure
$this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1);
$this->view->mkdir(
@@ -809,6 +810,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// change password
\OC_User::setPassword(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, 'test', 'test123');
$params = array('uid' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2,
'password' => 'test',
'recoveryPassword' => 'test123');
\OCA\Encryption\Hooks::setPassphrase($params);
// login as user2
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, false, 'test');
@@ -823,8 +828,8 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->assertEquals($this->dataShort, $retrievedCryptedFile2);
// cleanup
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1);
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->filename);
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1);
$this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename);
// check if share key for user and recovery exists
$this->assertFalse($this->view->file_exists(
@@ -889,8 +894,8 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} catch (Exception $e) {
$this->assertEquals(0, strpos($e->getMessage(), "Following users are not set up for encryption"));
}
// login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
+6
View File
@@ -416,6 +416,12 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
OCA\Encryption\Hooks::login($params);
}
public static function logoutHelper() {
\OC_Util::tearDownFS();
\OC_User::setUserId('');
\OC\Files\Filesystem::tearDown();
}
/**
* helper function to set migration status to the right value
* to be able to test the migration path
+5 -1
View File
@@ -19,6 +19,10 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# Addition 17/12/2012 Frank Karlitschek (frank@owncloud.org)
# On the official website http://www.phpclasses.org/smb4php the
# license is listed as LGPL so we assume that this is
# dual-licensed GPL/LGPL
###################################################################
define ('SMB4PHP_VERSION', '0.8');
@@ -126,7 +130,7 @@ class smb {
// this put env is necessary to read the output of smbclient correctly
$old_locale = getenv('LC_ALL');
putenv('LC_ALL=en_US.UTF-8');
$output = popen (SMB4PHP_SMBCLIENT." -N {$auth} {$options} {$port} {$options} {$params} 2>/dev/null", 'r');
$output = popen ('TZ=UTC '.SMB4PHP_SMBCLIENT." -N {$auth} {$options} {$port} {$options} {$params} 2>/dev/null", 'r');
$gotInfo = false;
$info = array ();
$info['info']= array ();
+9 -8
View File
@@ -23,9 +23,12 @@ $(document).ready(function() {
$(token).val(result.access_token);
$(token_secret).val(result.access_token_secret);
$(configured).val('true');
OC.MountConfig.saveStorage(tr);
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append('<span id="access" style="padding-left:0.5em;">'+t('files_external', 'Access granted')+'</span>');
OC.MountConfig.saveStorage(tr, function(status) {
if (status) {
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append('<span id="access" style="padding-left:0.5em;">'+t('files_external', 'Access granted')+'</span>');
}
});
} else {
OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage'));
}
@@ -77,7 +80,6 @@ $(document).ready(function() {
var tr = $(this).parent().parent();
var app_key = $(this).parent().find('[data-parameter="app_key"]').val();
var app_secret = $(this).parent().find('[data-parameter="app_secret"]').val();
var statusSpan = $(tr).find('.status span');
if (app_key != '' && app_secret != '') {
var tr = $(this).parent().parent();
var configured = $(this).parent().find('[data-parameter="configured"]');
@@ -88,10 +90,9 @@ $(document).ready(function() {
$(configured).val('false');
$(token).val(result.data.request_token);
$(token_secret).val(result.data.request_token_secret);
OC.MountConfig.saveStorage(tr);
statusSpan.removeClass();
statusSpan.addClass('waiting');
window.location = result.data.url;
OC.MountConfig.saveStorage(tr, function() {
window.location = result.data.url;
});
} else {
OC.dialogs.alert(result.data.message, t('files_external', 'Error configuring Dropbox storage'));
}
+11 -10
View File
@@ -32,11 +32,14 @@ $(document).ready(function() {
if (result && result.status == 'success') {
$(token).val(result.data.token);
$(configured).val('true');
OC.MountConfig.saveStorage(tr);
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append($('<span/>')
.attr('id', 'access')
.text(t('files_external', 'Access granted')));
OC.MountConfig.saveStorage(tr, function(status) {
if (status) {
$(tr).find('.configuration input').attr('disabled', 'disabled');
$(tr).find('.configuration').append($('<span/>')
.attr('id', 'access')
.text(t('files_external', 'Access granted')));
}
});
} else {
OC.dialogs.alert(result.data.message,
t('files_external', 'Error configuring Google Drive storage')
@@ -99,7 +102,6 @@ $(document).ready(function() {
var configured = $(this).parent().find('[data-parameter="configured"]');
var client_id = $(this).parent().find('[data-parameter="client_id"]').val();
var client_secret = $(this).parent().find('[data-parameter="client_secret"]').val();
var statusSpan = $(tr).find('.status span');
if (client_id != '' && client_secret != '') {
var token = $(this).parent().find('[data-parameter="token"]');
$.post(OC.filePath('files_external', 'ajax', 'google.php'),
@@ -112,10 +114,9 @@ $(document).ready(function() {
if (result && result.status == 'success') {
$(configured).val('false');
$(token).val('false');
OC.MountConfig.saveStorage(tr);
statusSpan.removeClass();
statusSpan.addClass('waiting');
window.location = result.data.url;
OC.MountConfig.saveStorage(tr, function(status) {
window.location = result.data.url;
});
} else {
OC.dialogs.alert(result.data.message,
t('files_external', 'Error configuring Google Drive storage')
+13 -1
View File
@@ -12,7 +12,7 @@ function updateStatus(statusEl, result){
}
OC.MountConfig={
saveStorage:function(tr) {
saveStorage:function(tr, callback) {
var mountPoint = $(tr).find('.mountPoint input').val();
if (mountPoint == '') {
return false;
@@ -84,9 +84,15 @@ OC.MountConfig={
},
success: function(result) {
status = updateStatus(statusSpan, result);
if (callback) {
callback(status);
}
},
error: function(result){
status = updateStatus(statusSpan, result);
if (callback) {
callback(status);
}
}
});
});
@@ -137,9 +143,15 @@ OC.MountConfig={
},
success: function(result) {
status = updateStatus(statusSpan, result);
if (callback) {
callback(status);
}
},
error: function(result){
status = updateStatus(statusSpan, result);
if (callback) {
callback(status);
}
}
});
}
-6
View File
@@ -1,6 +0,0 @@
<?php
$TRANSLATIONS = array(
"Options" => "Опции",
"Delete" => "Удалить"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+7 -5
View File
@@ -81,9 +81,9 @@ class AmazonS3 extends \OC\Files\Storage\Common {
$scheme = ($params['use_ssl'] === 'false') ? 'http' : 'https';
$this->test = isset($params['test']);
$this->timeout = ( ! isset($params['timeout'])) ? 15 : $params['timeout'];
$params['region'] = ( ! isset($params['region'])) ? 'eu-west-1' : $params['region'];
$params['hostname'] = ( !isset($params['hostname'])) ? 's3.amazonaws.com' : $params['hostname'];
if (!isset($params['port'])) {
$params['region'] = ( ! isset($params['region']) || $params['region'] === '' ) ? 'eu-west-1' : $params['region'];
$params['hostname'] = ( !isset($params['hostname']) || $params['hostname'] === '' ) ? 's3.amazonaws.com' : $params['hostname'];
if (!isset($params['port']) || $params['port'] === '') {
$params['port'] = ($params['use_ssl'] === 'false') ? 80 : 443;
}
$base_url = $scheme.'://'.$params['hostname'].':'.$params['port'].'/';
@@ -507,8 +507,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
}
public function test() {
$test = $this->s3->get_canonical_user_id();
if (isset($test['id']) && $test['id'] != '') {
$test = $this->connection->getBucketAcl(array(
'Bucket' => $this->bucket,
));
if (isset($test) && !is_null($test->getPath('Owner/ID'))) {
return true;
}
return false;
+6 -7
View File
@@ -50,9 +50,9 @@ class OC_Mount_Config {
'key' => 'Access Key',
'secret' => '*Secret Key',
'bucket' => 'Bucket',
'hostname' => 'Hostname (optional)',
'port' => 'Port (optional)',
'region' => 'Region (optional)',
'hostname' => '&Hostname (optional)',
'port' => '&Port (optional)',
'region' => '&Region (optional)',
'use_ssl' => '!Enable SSL',
'use_path_style' => '!Enable Path Style'));
@@ -244,6 +244,7 @@ class OC_Mount_Config {
$storage = new $class($options);
return $storage->test();
} catch (Exception $exception) {
\OCP\Util::logException('files_external', $exception);
return false;
}
}
@@ -381,8 +382,7 @@ class OC_Mount_Config {
* @return array
*/
public static function getCertificates() {
$view = \OCP\Files::getStorage('files_external');
$path=\OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("").'uploads/';
$path=OC_User::getHome(OC_User::getUser()) . '/files_external/uploads/';
\OCP\Util::writeLog('files_external', 'checking path '.$path, \OCP\Util::INFO);
if ( ! is_dir($path)) {
//path might not exist (e.g. non-standard OC_User::getHome() value)
@@ -404,8 +404,7 @@ class OC_Mount_Config {
* creates certificate bundle
*/
public static function createCertificateBundle() {
$view = \OCP\Files::getStorage("files_external");
$path = \OCP\Config::getSystemValue('datadirectory').$view->getAbsolutePath("");
$path=OC_User::getHome(OC_User::getUser()) . '/files_external';
$certs = OC_Mount_Config::getCertificates();
$fh_certs = fopen($path."/rootcerts.crt", 'w');
+30 -12
View File
@@ -14,6 +14,7 @@ class DAV extends \OC\Files\Storage\Common{
private $host;
private $secure;
private $root;
private $certPath;
private $ready;
/**
* @var \Sabre_DAV_Client
@@ -40,6 +41,12 @@ class DAV extends \OC\Files\Storage\Common{
} else {
$this->secure = false;
}
if ($this->secure === true) {
$certPath=\OC_User::getHome(\OC_User::getUser()) . '/files_external/rootcerts.crt';
if (file_exists($certPath)) {
$this->certPath=$certPath;
}
}
$this->root=isset($params['root'])?$params['root']:'/';
if ( ! $this->root || $this->root[0]!='/') {
$this->root='/'.$this->root;
@@ -58,20 +65,16 @@ class DAV extends \OC\Files\Storage\Common{
}
$this->ready = true;
$settings = array(
'baseUri' => $this->createBaseUri(),
'userName' => $this->user,
'password' => $this->password,
);
$settings = array(
'baseUri' => $this->createBaseUri(),
'userName' => $this->user,
'password' => $this->password,
);
$this->client = new \Sabre_DAV_Client($settings);
$caview = \OCP\Files::getStorage('files_external');
if ($caview) {
$certPath=\OCP\Config::getSystemValue('datadirectory').$caview->getAbsolutePath("").'rootcerts.crt';
if (file_exists($certPath)) {
$this->client->addTrustedCertificates($certPath);
}
if ($this->secure === true && $this->certPath) {
$this->client->addTrustedCertificates($this->certPath);
}
}
@@ -166,7 +169,14 @@ class DAV extends \OC\Files\Storage\Common{
curl_setopt($curl, CURLOPT_URL, $this->createBaseUri().str_replace(' ', '%20', $path));
curl_setopt($curl, CURLOPT_FILE, $fp);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
if ($this->secure === true) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
if($this->certPath){
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
}
}
curl_exec ($curl);
curl_close ($curl);
rewind($fp);
@@ -254,6 +264,13 @@ class DAV extends \OC\Files\Storage\Common{
curl_setopt($curl, CURLOPT_INFILE, $source); // file pointer
curl_setopt($curl, CURLOPT_INFILESIZE, filesize($path));
curl_setopt($curl, CURLOPT_PUT, true);
if ($this->secure === true) {
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
if($this->certPath){
curl_setopt($curl, CURLOPT_CAINFO, $this->certPath);
}
}
curl_exec ($curl);
curl_close ($curl);
}
@@ -331,3 +348,4 @@ class DAV extends \OC\Files\Storage\Common{
}
}
}
+1 -1
View File
@@ -60,7 +60,7 @@
class="optional"
data-parameter="<?php p($parameter); ?>"
value="<?php p($value); ?>"
placeholder="<?php p(substr($placeholder, 5)); ?>" />
placeholder="<?php p(substr($placeholder, 1)); ?>" />
<?php elseif (strpos($placeholder, '#') !== false): ?>
<input type="hidden"
data-parameter="<?php p($parameter); ?>"
+3 -1
View File
@@ -36,7 +36,9 @@ if(!isset($linkedItem['uid_owner']) || !isset($linkedItem['file_source'])) {
exit;
}
$userId = $linkedItem['uid_owner'];
$rootLinkItem = OCP\Share::resolveReShare($linkedItem);
$userId = $rootLinkItem['uid_owner'];
\OC_Util::setupFS($userId);
\OC\Files\Filesystem::initMountPoints($userId);
$view = new \OC\Files\View('/' . $userId . '/files');
+18 -11
View File
@@ -1,5 +1,5 @@
body {
background:#ddd;
height: auto;
}
#header {
@@ -22,7 +22,7 @@ body {
#public_upload,
#download {
font-weight:700;
margin: 0 0.4em 0 0;
margin: 0 0 0 .4em;
padding: 0 5px;
height: 32px;
float: left;
@@ -49,12 +49,14 @@ body {
vertical-align:text-bottom;
}
#controls {
left: 0;
}
#preview {
background:#eee;
border-bottom:1px solid #f8f8f8;
min-height:30em;
text-align:center;
margin:45px auto;
background: #fff;
text-align: center;
margin: 45px auto 0;
}
#noPreview {
@@ -62,11 +64,16 @@ body {
padding-top:5em;
}
footer {
margin-top: 45px;
}
p.info {
color:#777;
text-align:center;
width:22em;
margin:2em auto;
color: #777;
text-align: center;
width: 22em;
margin: 0 auto;
padding: 20px;
}
p.info a {
+3 -3
View File
@@ -29,19 +29,19 @@ $(document).ready(function() {
}
}
FileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename) {
var tr = $('tr').filterAttr('data-file', filename);
var tr = FileList.findFileEl(filename);
if (tr.length > 0) {
window.location = $(tr).find('a.name').attr('href');
}
});
FileActions.register('file', 'Download', OC.PERMISSION_READ, '', function(filename) {
var tr = $('tr').filterAttr('data-file', filename);
var tr = FileList.findFileEl(filename);
if (tr.length > 0) {
window.location = $(tr).find('a.name').attr('href');
}
});
FileActions.register('dir', 'Download', OC.PERMISSION_READ, '', function(filename) {
var tr = $('tr').filterAttr('data-file', filename);
var tr = FileList.findFileEl(filename);
if (tr.length > 0) {
window.location = $(tr).find('a.name').attr('href')+'&download';
}
+1 -1
View File
@@ -22,7 +22,7 @@ $(document).ready(function() {
} else {
var item = $('#dir').val() + '/' + filename;
}
var tr = $('tr').filterAttr('data-file', filename);
var tr = FileList.findFileEl(filename);
if ($(tr).data('type') == 'dir') {
var itemType = 'folder';
} else {
-8
View File
@@ -1,8 +0,0 @@
<?php
$TRANSLATIONS = array(
"Password" => "Пароль",
"Download" => "Загрузка",
"Upload" => "Загрузка",
"Cancel upload" => "Отмена загрузки"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+1 -1
View File
@@ -172,7 +172,7 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent {
$source['fileOwner'] = $fileOwner;
return $source;
}
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::ERROR);
\OCP\Util::writeLog('files_sharing', 'File source not found for: '.$target, \OCP\Util::DEBUG);
return false;
}
+12 -29
View File
@@ -279,43 +279,26 @@ class Shared extends \OC\Files\Storage\Common {
if ($this->isDeletable($path)) {
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath($source);
return $storage->unlink($internalPath);
} else if (dirname($path) == '/' || dirname($path) == '.') {
// Unshare the file from the user if in the root of the Shared folder
if ($this->is_dir($path)) {
$itemType = 'folder';
} else {
$itemType = 'file';
}
return \OCP\Share::unshareFromSelf($itemType, $path);
}
}
return false;
}
public function rename($path1, $path2) {
// Check for partial files
if (pathinfo($path1, PATHINFO_EXTENSION) === 'part') {
if ($oldSource = $this->getSourcePath($path1)) {
// Renaming/moving is only allowed within shared folders
$pos1 = strpos($path1, '/', 1);
$pos2 = strpos($path2, '/', 1);
if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) {
$newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
// Within the same folder, we only need UPDATE permissions
if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
$newInternalPath = substr($oldInternalPath, 0, -5);
list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
return $storage->rename($oldInternalPath, $newInternalPath);
}
} else {
// Renaming/moving is only allowed within shared folders
$pos1 = strpos($path1, '/', 1);
$pos2 = strpos($path2, '/', 1);
if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) {
$newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2);
// Within the same folder, we only need UPDATE permissions
if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) {
list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource);
list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource);
return $storage->rename($oldInternalPath, $newInternalPath);
// otherwise DELETE and CREATE permissions required
} elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
$rootView = new \OC\Files\View('');
return $rootView->rename($oldSource, $newSource);
}
// otherwise DELETE and CREATE permissions required
} elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) {
$rootView = new \OC\Files\View('');
return $rootView->rename($oldSource, $newSource);
}
}
return false;
+6 -2
View File
@@ -112,8 +112,12 @@ class Shared_Updater {
*/
static public function shareHook($params) {
if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
$uidOwner = \OCP\User::getUser();
$users = \OCP\Share::getUsersItemShared($params['itemType'], $params['fileSource'], $uidOwner, true);
if (isset($params['uidOwner'])) {
$uidOwner = $params['uidOwner'];
} else {
$uidOwner = \OCP\User::getUser();
}
$users = \OCP\Share::getUsersItemShared($params['itemType'], $params['fileSource'], $uidOwner, true, false);
if (!empty($users)) {
while (!empty($users)) {
$reshareUsers = array();
+2 -2
View File
@@ -132,8 +132,8 @@ abstract class Test_Files_Sharing_Base extends \PHPUnit_Framework_TestCase {
$share = Null;
if ($result && $result->numRows() > 0) {
$share = $result->fetchRow();
if ($result) {
$share = $result->fetchRow();
}
return $share;
+18 -14
View File
@@ -4,14 +4,24 @@ OCP\JSON::checkLoggedIn();
OCP\JSON::callCheck();
// "empty trash" command
$deleteAll = false;
if (isset($_POST['allfiles']) and $_POST['allfiles'] === 'true'){
$user = \OCP\User::getUser();
$list = OCA\Files_Trashbin\Helper::getTrashFiles('/');
$deleteAll = true;
$dirlisting = '0';
$folder = isset($_POST['dir']) ? $_POST['dir'] : '/';
if ($folder === '/' || $folder === '') {
OCA\Files_Trashbin\Trashbin::deleteAll();
$list = array();
} else {
$dirname = dirname($folder);
if ( $dirname !== '/' && $dirname !== '.' ) {
$dirlisting = '1';
} else {
$dirlisting = '0';
}
$list[] = $folder;
}
}
else {
$deleteAll = false;
$files = $_POST['files'];
$dirlisting = $_POST['dirlisting'];
$list = json_decode($files);
@@ -19,19 +29,13 @@ else {
$error = array();
$success = array();
$i = 0;
foreach ($list as $file) {
if ( $dirlisting === '0') {
if ($deleteAll) {
$filename = $file['name'];
$timestamp = $file['timestamp'];
}
else {
$delimiter = strrpos($file, '.d');
$filename = substr($file, 0, $delimiter);
$timestamp = substr($file, $delimiter+2);
}
$file = ltrim($file, '/');
$delimiter = strrpos($file, '.d');
$filename = substr($file, 0, $delimiter);
$timestamp = substr($file, $delimiter+2);
} else {
$filename = $file;
$timestamp = null;
+1
View File
@@ -13,6 +13,7 @@ $success = array();
$i = 0;
foreach ($list as $file) {
if ( $dirlisting === '0') {
$file = ltrim($file, '/');
$delimiter = strrpos($file, '.d');
$filename = substr($file, 0, $delimiter);
$timestamp = substr($file, $delimiter+2);
+3
View File
@@ -0,0 +1,3 @@
#fileList td a.file, #fileList td a.file span {
cursor: default;
}
-51
View File
@@ -1,51 +0,0 @@
<?php
/**
* ownCloud - trash bin
*
* @author Bjoern Schiessle
* @copyright 2013 Bjoern Schiessle schiessle@owncloud.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
// Check if we are a user
OCP\User::checkLoggedIn();
$filename = $_GET["file"];
$view = new OC_FilesystemView('/'.\OCP\User::getUser().'/files_trashbin/files');
if(!$view->file_exists($filename)) {
header("HTTP/1.0 404 Not Found");
$tmpl = new OCP\Template( '', '404', 'guest' );
$tmpl->assign('file', $filename);
$tmpl->printPage();
exit;
}
$ftype=$view->getMimeType( $filename );
header('Content-Type:'.$ftype);if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
} else {
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
}
OCP\Response::disableCaching();
header('Content-Length: '. $view->filesize($filename));
OC_Util::obEnd();
$view->readfile( $filename );
+1
View File
@@ -10,6 +10,7 @@ OCP\Util::addScript('files', 'fileactions');
$tmpl = new OCP\Template('files_trashbin', 'index', 'user');
OCP\Util::addStyle('files', 'files');
OCP\Util::addStyle('files_trashbin', 'trash');
OCP\Util::addScript('files', 'filelist');
// filelist overrides
OCP\Util::addScript('files_trashbin', 'filelist');
+26 -46
View File
@@ -3,12 +3,12 @@ $(document).ready(function() {
if (typeof FileActions !== 'undefined') {
FileActions.register('all', 'Restore', OC.PERMISSION_READ, OC.imagePath('core', 'actions/history'), function(filename) {
var tr = $('tr').filterAttr('data-file', filename);
var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete");
var tr = FileList.findFileEl(filename);
var deleteAction = tr.children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
disableActions();
$.post(OC.filePath('files_trashbin', 'ajax', 'undelete.php'),
{files: JSON.stringify([filename]), dirlisting: tr.attr('data-dirlisting')},
{files: JSON.stringify([$('#dir').val() + '/' + filename]), dirlisting: tr.attr('data-dirlisting')},
function(result) {
for (var i = 0; i < result.data.success.length; i++) {
var row = document.getElementById(result.data.success[i].filename);
@@ -30,12 +30,12 @@ $(document).ready(function() {
return OC.imagePath('core', 'actions/delete');
}, function(filename) {
$('.tipsy').remove();
var tr = $('tr').filterAttr('data-file', filename);
var deleteAction = $('tr').filterAttr('data-file', filename).children("td.date").children(".action.delete");
var tr = FileList.findFileEl(filename);
var deleteAction = tr.children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
disableActions();
$.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'),
{files: JSON.stringify([filename]), dirlisting: tr.attr('data-dirlisting')},
{files: JSON.stringify([$('#dir').val() + '/' +filename]), dirlisting: tr.attr('data-dirlisting')},
function(result) {
for (var i = 0; i < result.data.success.length; i++) {
var row = document.getElementById(result.data.success[i].filename);
@@ -66,41 +66,6 @@ $(document).ready(function() {
procesSelection();
});
$('#fileList').on('click', 'td.filename a', function(event) {
if (event.shiftKey) {
event.preventDefault();
var last = $(lastChecked).parent().parent().prevAll().length;
var first = $(this).parent().parent().prevAll().length;
var start = Math.min(first, last);
var end = Math.max(first, last);
var rows = $(this).parent().parent().parent().children('tr');
for (var i = start; i < end; i++) {
$(rows).each(function(index) {
if (index == i) {
var checkbox = $(this).children().children('input:checkbox');
$(checkbox).attr('checked', 'checked');
$(checkbox).parent().parent().addClass('selected');
}
});
}
}
var checkbox = $(this).parent().children('input:checkbox');
lastChecked = checkbox;
if ($(checkbox).attr('checked')) {
$(checkbox).removeAttr('checked');
$(checkbox).parent().parent().removeClass('selected');
$('#select_all').removeAttr('checked');
} else {
$(checkbox).attr('checked', 'checked');
$(checkbox).parent().parent().toggleClass('selected');
var selectedCount = $('td.filename input:checkbox:checked').length;
if (selectedCount == $('td.filename input:checkbox').length) {
$('#select_all').attr('checked', 'checked');
}
}
procesSelection();
});
$('.undelete').click('click', function(event) {
event.preventDefault();
var files = getSelectedFiles('file');
@@ -108,7 +73,7 @@ $(document).ready(function() {
var dirlisting = getSelectedFiles('dirlisting')[0];
disableActions();
for (var i = 0; i < files.length; i++) {
var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete");
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
}
@@ -136,7 +101,8 @@ $(document).ready(function() {
var params = {};
if (allFiles) {
params = {
allfiles: true
allfiles: true,
dir: $('#dir').val()
};
}
else {
@@ -153,7 +119,7 @@ $(document).ready(function() {
}
else {
for (var i = 0; i < files.length; i++) {
var deleteAction = $('tr').filterAttr('data-file', files[i]).children("td.date").children(".action.delete");
var deleteAction = FileList.findFileEl(files[i]).children("td.date").children(".action.delete");
deleteAction.removeClass('delete-icon').addClass('progress-icon');
}
}
@@ -183,13 +149,27 @@ $(document).ready(function() {
});
$('#fileList').on('click', 'td.filename input', function() {
var checkbox = $(this).parent().children('input:checkbox');
$(checkbox).parent().parent().toggleClass('selected');
if ($(checkbox).is(':checked')) {
var selectedCount = $('td.filename input:checkbox:checked').length;
if (selectedCount === $('td.filename input:checkbox').length) {
$('#select_all').prop('checked', true);
}
} else {
$('#select_all').prop('checked',false);
}
procesSelection();
});
$('#fileList').on('click', 'td.filename a', function(event) {
var mime = $(this).parent().parent().data('mime');
if (mime !== 'httpd/unix-directory') {
event.preventDefault();
}
var filename = $(this).parent().parent().attr('data-file');
var tr = $('tr').filterAttr('data-file',filename);
var tr = FileList.findFileEl(filename);
var renaming = tr.data('renaming');
if(!renaming && !FileList.isLoading(filename)){
if(mime.substr(0, 5) === 'text/'){ //no texteditor for now
@@ -229,7 +209,7 @@ function getSelectedFiles(property){
elements.each(function(i,element){
var file={
name:$(element).attr('data-filename'),
file:$(element).attr('data-file'),
file:$('#dir').val() + "/" + $(element).attr('data-file'),
timestamp:$(element).attr('data-timestamp'),
type:$(element).attr('data-type'),
dirlisting:$(element).attr('data-dirlisting')
-6
View File
@@ -1,6 +0,0 @@
<?php
$TRANSLATIONS = array(
"Error" => "Ошибка",
"Delete" => "Удалить"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+2
View File
@@ -44,8 +44,10 @@ class Helper
}
$files = array();
$id = 0;
foreach ($result as $r) {
$i = array();
$i['id'] = $id++;
$i['name'] = $r['id'];
$i['date'] = \OCP\Util::formatDate($r['timestamp']);
$i['timestamp'] = $r['timestamp'];
+24 -4
View File
@@ -189,7 +189,7 @@ class Trashbin {
if ($rootView->is_dir($owner . '/files_versions/' . $ownerPath)) {
$size += self::calculateSize(new \OC\Files\View('/' . $owner . '/files_versions/' . $ownerPath));
if ($owner !== $user) {
$rootView->copy($owner . '/files_versions/' . $ownerPath, $owner . '/files_trashbin/versions/' . basename($ownerPath) . '.d' . $timestamp);
self::copy_recursive($owner . '/files_versions/' . $ownerPath, $owner . '/files_trashbin/versions/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
}
$rootView->rename($owner . '/files_versions/' . $ownerPath, $user . '/files_trashbin/versions/' . $filename . '.d' . $timestamp);
} else if ($versions = \OCA\Files_Versions\Storage::getVersions($owner, $ownerPath)) {
@@ -247,7 +247,7 @@ class Trashbin {
if ($rootView->is_dir($keyfile)) {
$size += self::calculateSize(new \OC\Files\View($keyfile));
if ($owner !== $user) {
$rootView->copy($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp);
self::copy_recursive($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
}
$rootView->rename($keyfile, $user . '/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp);
} else {
@@ -265,7 +265,7 @@ class Trashbin {
if ($rootView->is_dir($sharekeys)) {
$size += self::calculateSize(new \OC\Files\View($sharekeys));
if ($owner !== $user) {
$rootView->copy($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp);
self::copy_recursive($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp, $rootView);
}
$rootView->rename($sharekeys, $user . '/files_trashbin/share-keys/' . $filename . '.d' . $timestamp);
} else {
@@ -564,6 +564,21 @@ class Trashbin {
return $size;
}
/**
* @brief delete all files from the trash
*/
public static function deleteAll() {
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
$view->deleteAll('files_trashbin');
self::setTrashbinSize($user, 0);
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=?');
$query->execute(array($user));
return true;
}
/**
* @brief delete file from trash bin permanently
*
@@ -763,8 +778,13 @@ class Trashbin {
*/
private static function expire($trashbinSize, $user) {
// let the admin disable auto expire
$autoExpire = \OC_Config::getValue('trashbin_auto_expire', true);
if ($autoExpire === false) {
return 0;
}
$user = \OCP\User::getUser();
$view = new \OC\Files\View('/' . $user);
$availableSpace = self::calculateFreeSpace($trashbinSize);
$size = 0;
@@ -3,11 +3,11 @@
<img src="<?php print_unescaped(OCP\image_path('core', 'places/home.svg'));?>" class="svg" />
</a>
</div>
<?php if(count($_["breadcrumb"])):?>
<div class="crumb svg"
data-dir='/'>
<div class="crumb svg"
data-dir='/'>
<a href="<?php p($_['baseURL']); ?>"><?php p($l->t("Deleted Files")); ?></a>
</div>
</div>
<?php if(count($_["breadcrumb"])):?>
<?php endif;?>
<?php for($i=0; $i<count($_["breadcrumb"]); $i++):
$crumb = $_["breadcrumb"][$i];
+8 -5
View File
@@ -35,18 +35,21 @@
<?php endif; ?>
<?php endif; ?>
>
<?php if(!isset($_['readonly']) || !$_['readonly']): ?><input type="checkbox" /><?php endif; ?>
<?php if(!isset($_['readonly']) || !$_['readonly']): ?>
<input id="select-<?php p($file['id']); ?>" type="checkbox" />
<label for="select-<?php p($file['id']); ?>"></label>
<?php endif; ?>
<?php if($file['type'] === 'dir'): ?>
<?php if( $_['dirlisting'] ): ?>
<a class="name" href="<?php p($_['baseURL'].'/'.$name); ?>" title="">
<a class="name dir" href="<?php p($_['baseURL'].'/'.$name); ?>" title="">
<?php else: ?>
<a class="name" href="<?php p($_['baseURL'].'/'.$name.'.d'.$file['timestamp']); ?>" title="">
<a class="name dir" href="<?php p($_['baseURL'].'/'.$name.'.d'.$file['timestamp']); ?>" title="">
<?php endif; ?>
<?php else: ?>
<?php if( $_['dirlisting'] ): ?>
<a class="name" href="<?php p($_['downloadURL'].'/'.$name); ?>" title="">
<a class="name file" href="<?php p($_['downloadURL'].'/'.$name); ?>" title="">
<?php else: ?>
<a class="name" href="<?php p($_['downloadURL'].'/'.$name.'.d'.$file['timestamp']);?>" title="">
<a class="name file" href="<?php p($_['downloadURL'].'/'.$name.'.d'.$file['timestamp']);?>" title="">
<?php endif; ?>
<?php endif; ?>
<span class="nametext">
+1 -6
View File
@@ -36,12 +36,7 @@ $view = new OC\Files\View('/');
$ftype = $view->getMimeType('/'.$uid.'/files/'.$filename);
header('Content-Type:'.$ftype);
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' );
} else {
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) )
. '; filename="' . rawurlencode( basename($filename) ) . '"' );
}
OCP\Response::setContentDispositionHeader(basename($filename), 'attachment');
OCP\Response::disableCaching();
header('Content-Length: '.$view->filesize($versionName));
+8 -8
View File
@@ -77,6 +77,7 @@ function goToVersionPage(url){
function createVersionsDropdown(filename, files) {
var start = 0;
var fileEl;
var html = '<div id="dropdown" class="drop drop-versions" data-file="'+escapeHTML(files)+'">';
html += '<div id="private">';
@@ -86,8 +87,9 @@ function createVersionsDropdown(filename, files) {
html += '<input type="button" value="'+ t('files_versions', 'More versions...') + '" name="show-more-versions" id="show-more-versions" style="display: none;" />';
if (filename) {
$('tr').filterAttr('data-file',filename).addClass('mouseOver');
$(html).appendTo($('tr').filterAttr('data-file',filename).find('td.filename'));
fileEl = FileList.findFileEl(filename);
fileEl.addClass('mouseOver');
$(html).appendTo(fileEl.find('td.filename'));
} else {
$(html).appendTo($('thead .share'));
}
@@ -138,7 +140,7 @@ function createVersionsDropdown(filename, files) {
var preview = '<img class="preview" src="'+revision.preview+'"/>';
var download ='<a href="' + path + "?file=" + files + '&revision=' + revision.version + '">';
var download ='<a href="' + path + "?file=" + encodeURIComponent(files) + '&revision=' + revision.version + '">';
download+='<img';
download+=' src="' + OC.imagePath('core', 'actions/download') + '"';
download+=' name="downloadVersion" />';
@@ -146,8 +148,7 @@ function createVersionsDropdown(filename, files) {
download+='</a>';
var revert='<span class="revertVersion"';
revert+=' id="' + revision.version + '"';
revert+=' value="' + files + '">';
revert+=' id="' + revision.version + '">';
revert+='<img';
revert+=' src="' + OC.imagePath('core', 'actions/history') + '"';
revert+=' name="revertVersion"';
@@ -156,14 +157,13 @@ function createVersionsDropdown(filename, files) {
var version=$('<li/>');
version.attr('value', revision.version);
version.html(preview + download + revert);
// add file here for proper name escaping
version.find('span.revertVersion').attr('value', files);
version.appendTo('#found_versions');
}
$('tr').filterAttr('data-file',filename).addClass('mouseOver');
$('#dropdown').show('blind');
}
$(this).click(
+4 -2
View File
@@ -98,7 +98,6 @@ class Storage {
$files_view = new \OC\Files\View('/'.$uid .'/files');
$users_view = new \OC\Files\View('/'.$uid);
$versions_view = new \OC\Files\View('/'.$uid.'/files_versions');
// check if filename is a directory
if($files_view->is_dir($filename)) {
@@ -132,7 +131,10 @@ class Storage {
\OC_FileProxy::$enabled = false;
// store a new version of a file
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'.$users_view->filemtime('files'.$filename));
$mtime = $users_view->filemtime('files'.$filename);
$users_view->copy('files'.$filename, 'files_versions'.$filename.'.v'. $mtime);
// call getFileInfo to enforce a file cache entry for the new version
$users_view->getFileInfo('files_versions'.$filename.'.v'.$mtime);
// reset proxy state
\OC_FileProxy::$enabled = $proxyStatus;
+12
View File
@@ -27,6 +27,18 @@ OCP\JSON::checkAppEnabled('user_ldap');
OCP\JSON::callCheck();
$prefix = $_POST['ldap_serverconfig_chooser'];
// Checkboxes are not submitted, when they are unchecked. Set them manually.
// only legacy checkboxes (Advanced and Expert tab) need to be handled here,
// the Wizard-like tabs handle it on their own
$chkboxes = array('ldap_configuration_active', 'ldap_override_main_server',
'ldap_nocase', 'ldap_turn_off_cert_check');
foreach($chkboxes as $boxid) {
if(!isset($_POST[$boxid])) {
$_POST[$boxid] = 0;
}
}
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, $prefix);
$connection->setConfiguration($_POST);
@@ -30,6 +30,8 @@ $l=OC_L10N::get('user_ldap');
$ldapWrapper = new OCA\user_ldap\lib\LDAP();
$connection = new \OCA\user_ldap\lib\Connection($ldapWrapper, '', null);
//needs to be true, otherwise it will also fail with an irritating message
$_POST['ldap_configuration_active'] = 1;
if($connection->setConfiguration($_POST)) {
//Configuration is okay
if($connection->bind()) {
+66 -6
View File
@@ -407,6 +407,7 @@ var LdapWizard = {
if($('#rawLoginFilterContainer').hasClass('invisible')) {
$('#ldap_loginfilter_attributes').multiselect('enable');
}
LdapWizard.postInitLoginFilter();
},
function (result) {
//deactivate if no attributes found
@@ -443,10 +444,24 @@ var LdapWizard = {
//enable only when raw filter editing is not turned on
$('#'+multisel).multiselect('enable');
}
if(type === 'Users') {
//required for initial save
filter = $('#ldap_userlist_filter').val();
if(!filter) {
LdapWizard.saveMultiSelect(multisel,
$('#'+multisel).multiselect("getChecked"));
}
LdapWizard.userFilterAvailableGroupsHasRun = true;
LdapWizard.postInitUserFilter();
}
},
function (result) {
LdapWizard.hideSpinner('#'+multisel);
$('#'+multisel).multiselect('disable');
if(type == 'Users') {
LdapWizard.userFilterAvailableGroupsHasRun = true;
LdapWizard.postInitUserFilter();
}
}
);
},
@@ -471,9 +486,23 @@ var LdapWizard = {
LdapWizard.hideSpinner('#'+multisel);
LdapWizard.applyChanges(result);
$('#'+multisel).multiselect('refresh');
if(type === 'User') {
//required for initial save
filter = $('#ldap_userlist_filter').val();
if(!filter) {
LdapWizard.saveMultiSelect(multisel,
$('#'+multisel).multiselect("getChecked"));
}
LdapWizard.userFilterObjectClassesHasRun = true;
LdapWizard.postInitUserFilter();
}
},
function (result) {
LdapWizard.hideSpinner('#'+multisel);
if(type == 'User') {
LdapWizard.userFilterObjectClassesHasRun = true;
LdapWizard.postInitUserFilter();
}
//TODO: error handling
}
);
@@ -489,13 +518,17 @@ var LdapWizard = {
loginfilter = $('#ldap_login_filter').val();
//FIXME: activates a manually deactivated configuration.
if(host && port && base && userfilter && loginfilter) {
if(host && port && base && userfilter && loginfilter) {
LdapWizard.updateStatusIndicator(true);
if($('#ldap_configuration_active').is(':checked')) {
return;
}
$('#ldap_configuration_active').prop('checked', true);
LdapWizard.save($('#ldap_configuration_active')[0]);
if(!LdapWizard.isConfigurationActiveControlLocked) {
//avoids a manually deactivated connection will be activated
//upon opening the admin page
$('#ldap_configuration_active').prop('checked', true);
LdapWizard.save($('#ldap_configuration_active')[0]);
}
} else {
if($('#ldap_configuration_active').is(':checked')) {
$('#ldap_configuration_active').prop('checked', false);
@@ -517,9 +550,12 @@ var LdapWizard = {
$(id + " + button").css('display', 'inline');
},
isConfigurationActiveControlLocked: true,
init: function() {
LdapWizard.basicStatusCheck();
LdapWizard.functionalityCheck();
LdapWizard.isConfigurationActiveControlLocked = false;
},
initGroupFilter: function() {
@@ -529,11 +565,21 @@ var LdapWizard = {
LdapWizard.countGroups();
},
/** init login filter tab section **/
initLoginFilter: function() {
LdapWizard.regardFilterMode('Login');
LdapWizard.findAttributes();
},
postInitLoginFilter: function() {
if($('#rawLoginFilterContainer').hasClass('invisible')) {
LdapWizard.composeFilter('login');
}
},
/** end of init user filter tab section **/
initMultiSelect: function(object, id, caption) {
object.multiselect({
header: false,
@@ -546,13 +592,29 @@ var LdapWizard = {
});
},
/** init user filter tab section **/
userFilterObjectClassesHasRun: false,
userFilterAvailableGroupsHasRun: false,
initUserFilter: function() {
LdapWizard.userFilterObjectClassesHasRun = false;
LdapWizard.userFilterAvailableGroupsHasRun = false;
LdapWizard.regardFilterMode('User');
LdapWizard.findObjectClasses('ldap_userfilter_objectclass', 'User');
LdapWizard.findAvailableGroups('ldap_userfilter_groups', 'Users');
LdapWizard.countUsers();
},
postInitUserFilter: function() {
if(LdapWizard.userFilterObjectClassesHasRun
&& LdapWizard.userFilterAvailableGroupsHasRun) {
LdapWizard.composeFilter('user');
LdapWizard.countUsers();
}
},
/** end of init user filter tab section **/
onTabChange: function(event, ui) {
newTabIndex = 0;
if(ui.newTab[0].id === '#ldapWizard2') {
@@ -619,8 +681,6 @@ var LdapWizard = {
} else if(mode == LdapWizard.filterModeAssisted
&& !$('#raw'+subject+'FilterContainer').hasClass('invisible')) {
LdapWizard['toggleRaw'+subject+'Filter']();
} else {
c = $('#raw'+subject+'FilterContainer').hasClass('invisible');
}
},
function (result) {
-12
View File
@@ -1,12 +0,0 @@
<?php
$TRANSLATIONS = array(
"Error" => "Ошибка",
"Select groups" => "Выбрать группы",
"_%s group found_::_%s groups found_" => array("","",""),
"_%s user found_::_%s users found_" => array("","",""),
"Save" => "Сохранить",
"Help" => "Помощь",
"Password" => "Пароль",
"Back" => "Назад"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+118 -27
View File
@@ -634,6 +634,10 @@ class Access extends LDAPUtility {
return $this->search($filter, $this->connection->ldapBaseUsers, $attr, $limit, $offset);
}
public function countUsers($filter, $attr = array('dn'), $limit = null, $offset = null) {
return $this->count($filter, $this->connection->ldapBaseGroups, $attr, $limit, $offset);
}
/**
* @brief executes an LDAP search, optimized for Groups
* @param $filter the LDAP filter for the search
@@ -647,61 +651,68 @@ class Access extends LDAPUtility {
}
/**
* @brief executes an LDAP search
* @brief prepares and executes an LDAP search operation
* @param $filter the LDAP filter for the search
* @param $base an array containing the LDAP subtree(s) that shall be searched
* @param $attr optional, array, one or more attributes that shall be
* retrieved. Results will according to the order in the array.
* @returns array with the search result
*
* Executes an LDAP search
* @param $limit optional, maximum results to be counted
* @param $offset optional, a starting point
* @returns array with the search result as first value and pagedSearchOK as
* second | false if not successful
*/
private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
private function executeSearch($filter, $base, &$attr = null, $limit = null, $offset = null) {
if(!is_null($attr) && !is_array($attr)) {
$attr = array(mb_strtolower($attr, 'UTF-8'));
}
// See if we have a resource, in case not cancel with message
$link_resource = $this->connection->getConnectionResource();
if(!$this->ldap->isResource($link_resource)) {
$cr = $this->connection->getConnectionResource();
if(!$this->ldap->isResource($cr)) {
// Seems like we didn't find any resource.
// Return an empty array just like before.
\OCP\Util::writeLog('user_ldap', 'Could not search, because resource is missing.', \OCP\Util::DEBUG);
return array();
return false;
}
//check wether paged search should be attempted
$pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset);
$linkResources = array_pad(array(), count($base), $link_resource);
$linkResources = array_pad(array(), count($base), $cr);
$sr = $this->ldap->search($linkResources, $base, $filter, $attr);
$error = $this->ldap->errno($link_resource);
$error = $this->ldap->errno($cr);
if(!is_array($sr) || $error !== 0) {
\OCP\Util::writeLog('user_ldap',
'Error when searching: '.$this->ldap->error($link_resource).
' code '.$this->ldap->errno($link_resource),
'Error when searching: '.$this->ldap->error($cr).
' code '.$this->ldap->errno($cr),
\OCP\Util::ERROR);
\OCP\Util::writeLog('user_ldap', 'Attempt for Paging? '.print_r($pagedSearchOK, true), \OCP\Util::ERROR);
return array();
return false;
}
// Do the server-side sorting
foreach(array_reverse($attr) as $sortAttr){
foreach($sr as $searchResource) {
$this->ldap->sort($link_resource, $searchResource, $sortAttr);
}
}
return array($sr, $pagedSearchOK);
}
$findings = array();
foreach($sr as $key => $res) {
$findings = array_merge($findings, $this->ldap->getEntries($link_resource, $res ));
}
/**
* @brief processes an LDAP paged search operation
* @param $sr the array containing the LDAP search resources
* @param $filter the LDAP filter for the search
* @param $base an array containing the LDAP subtree(s) that shall be searched
* @param $iFoundItems number of results in the search operation
* @param $limit maximum results to be counted
* @param $offset a starting point
* @param $pagedSearchOK whether a paged search has been executed
* @param $skipHandling required for paged search when cookies to
* prior results need to be gained
* @returns array with the search result as first value and pagedSearchOK as
* second | false if not successful
*/
private function processPagedSearchStatus($sr, $filter, $base, $iFoundItems, $limit, $offset, $pagedSearchOK, $skipHandling) {
if($pagedSearchOK) {
\OCP\Util::writeLog('user_ldap', 'Paged search successful', \OCP\Util::INFO);
$cr = $this->connection->getConnectionResource();
foreach($sr as $key => $res) {
$cookie = null;
if($this->ldap->controlPagedResultResponse($link_resource, $res, $cookie)) {
\OCP\Util::writeLog('user_ldap', 'Set paged search cookie', \OCP\Util::INFO);
if($this->ldap->controlPagedResultResponse($cr, $res, $cookie)) {
$this->setPagedResultCookie($base[$key], $filter, $limit, $offset, $cookie);
}
}
@@ -713,7 +724,7 @@ class Access extends LDAPUtility {
// if count is bigger, then the server does not support
// paged search. Instead, he did a normal search. We set a
// flag here, so the callee knows how to deal with it.
if($findings['count'] <= $limit) {
if($iFoundItems <= $limit) {
$this->pagedSearchedSuccessful = true;
}
} else {
@@ -721,6 +732,86 @@ class Access extends LDAPUtility {
\OCP\Util::writeLog('user_ldap', 'Paged search failed :(', \OCP\Util::INFO);
}
}
}
/**
* @brief executes an LDAP search, but counts the results only
* @param $filter the LDAP filter for the search
* @param $base an array containing the LDAP subtree(s) that shall be searched
* @param $attr optional, array, one or more attributes that shall be
* retrieved. Results will according to the order in the array.
* @param $limit optional, maximum results to be counted
* @param $offset optional, a starting point
* @param $skipHandling indicates whether the pages search operation is
* completed
* @returns int | false if the search could not be initialized
*
*/
private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
\OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG);
$search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
if($search === false) {
return false;
}
list($sr, $pagedSearchOK) = $search;
$cr = $this->connection->getConnectionResource();
$counter = 0;
foreach($sr as $key => $res) {
$count = $this->ldap->countEntries($cr, $res);
if($count !== false) {
$counter += $count;
}
}
$this->processPagedSearchStatus($sr, $filter, $base, $counter, $limit,
$offset, $pagedSearchOK, $skipHandling);
return $counter;
}
/**
* @brief executes an LDAP search
* @param $filter the LDAP filter for the search
* @param $base an array containing the LDAP subtree(s) that shall be searched
* @param $attr optional, array, one or more attributes that shall be
* retrieved. Results will according to the order in the array.
* @returns array with the search result
*
* Executes an LDAP search
*/
private function search($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) {
$search = $this->executeSearch($filter, $base, $attr, $limit, $offset);
if($search === false) {
return array();
}
list($sr, $pagedSearchOK) = $search;
$cr = $this->connection->getConnectionResource();
if($skipHandling) {
//i.e. result do not need to be fetched, we just need the cookie
//thus pass 1 or any other value as $iFoundItems because it is not
//used
$this->processPagedSearchStatus($sr, $filter, $base, 1, $limit,
$offset, $pagedSearchOK,
$skipHandling);
return;
}
// Do the server-side sorting
foreach(array_reverse($attr) as $sortAttr){
foreach($sr as $searchResource) {
$this->ldap->sort($cr, $searchResource, $sortAttr);
}
}
$findings = array();
foreach($sr as $key => $res) {
$findings = array_merge($findings, $this->ldap->getEntries($cr , $res ));
}
$this->processPagedSearchStatus($sr, $filter, $base, $findings['count'],
$limit, $offset, $pagedSearchOK,
$skipHandling);
// if we're here, probably no connection resource is returned.
// to make ownCloud behave nicely, we simply give back an empty array.
+7 -6
View File
@@ -129,6 +129,7 @@ class Configuration {
if(!empty($val) && strpos($val, 'attr:') === false) {
$val = 'attr:'.$val;
}
break;
case 'ldapBase':
case 'ldapBaseUsers':
case 'ldapBaseGroups':
@@ -140,11 +141,11 @@ class Configuration {
case 'ldapGroupFilterGroups':
case 'ldapLoginFilterAttributes':
$setMethod = 'setMultiLine';
default:
$this->$setMethod($key, $val);
if(is_array($applied)) {
$applied[] = $inputkey;
}
break;
}
$this->$setMethod($key, $val);
if(is_array($applied)) {
$applied[] = $inputkey;
}
}
@@ -308,7 +309,7 @@ class Configuration {
'ldap_user_filter_mode' => 0,
'ldap_userfilter_objectclass' => '',
'ldap_userfilter_groups' => '',
'ldap_login_filter' => 'uid=%uid',
'ldap_login_filter' => '',
'ldap_login_filter_mode' => 0,
'ldap_loginfilter_email' => 0,
'ldap_loginfilter_username' => 1,
+2 -1
View File
@@ -50,7 +50,8 @@ class Connection extends LDAPUtility {
parent::__construct($ldap);
$this->configPrefix = $configPrefix;
$this->configID = $configID;
$this->configuration = new Configuration($configPrefix);
$this->configuration = new Configuration($configPrefix,
!is_null($configID));
$memcache = new \OC\Memcache\Factory();
if($memcache->isAvailable()) {
$this->cache = $memcache->create();
+1 -1
View File
@@ -91,7 +91,7 @@ class LDAP implements ILDAPWrapper {
}
public function setOption($link, $option, $value) {
$this->invokeLDAPMethod('set_option', $link, $option, $value);
return $this->invokeLDAPMethod('set_option', $link, $option, $value);
}
public function sort($link, $result, $sortfilter) {
+8 -6
View File
@@ -432,7 +432,6 @@ class Wizard extends LDAPUtility {
$this->configuration->setConfiguration($config);
\OCP\Util::writeLog('user_ldap', 'Wiz: detected Port '. $p, \OCP\Util::DEBUG);
$this->result->addChange('ldap_port', $p);
$this->result->addChange('ldap_tls', intval($t));
return $this->result;
}
}
@@ -793,10 +792,13 @@ class Wizard extends LDAPUtility {
\OCP\Util::writeLog('user_ldap', 'Wiz: Setting LDAP Options ', \OCP\Util::DEBUG);
//set LDAP options
$a = $this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
$c = $this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
$this->ldap->setOption($cr, LDAP_OPT_PROTOCOL_VERSION, 3);
$this->ldap->setOption($cr, LDAP_OPT_NETWORK_TIMEOUT, self::LDAP_NW_TIMEOUT);
if($tls) {
$this->ldap->startTls($cr);
$isTlsWorking = @$this->ldap->startTls($cr);
if(!$isTlsWorking) {
return false;
}
}
\OCP\Util::writeLog('user_ldap', 'Wiz: Attemping to Bind ', \OCP\Util::DEBUG);
@@ -810,7 +812,7 @@ class Wizard extends LDAPUtility {
if($ncc) {
throw new \Exception('Certificate cannot be validated.');
}
\OCP\Util::writeLog('user_ldap', 'Wiz: Bind succesfull with Port '. $port, \OCP\Util::DEBUG);
\OCP\Util::writeLog('user_ldap', 'Wiz: Bind successfull to Port '. $port . ' TLS ' . intval($tls), \OCP\Util::DEBUG);
return true;
}
@@ -1001,7 +1003,7 @@ class Wizard extends LDAPUtility {
private function getConnection() {
if(!is_null($this->cr)) {
return $cr;
return $this->cr;
}
$cr = $this->ldap->connect(
$this->configuration->ldapHost.':'.$this->configuration->ldapPort,
@@ -3,7 +3,7 @@
<button class="ldap_action_test_connection" name="ldap_action_test_connection">
<?php p($l->t('Test Configuration'));?>
</button>
<a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html"
<a href="<?php print_unescaped(link_to_docs('admin-ldap')); ?>"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
@@ -41,7 +41,7 @@
<div class="tablerow">
<input type="text" id="ldap_dn" name="ldap_dn"
class="tablecell lwautosave"
placeholder="<?php p($l->t('User DN'));?>"
placeholder="<?php p($l->t('User DN'));?>" autocomplete="off"
title="<?php p($l->t('The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty.'));?>"
/>
</div>
@@ -49,7 +49,7 @@
<div class="tablerow">
<input type="password" id="ldap_agent_password"
class="tablecell lwautosave" name="ldap_agent_password"
placeholder="<?php p($l->t('Password'));?>"
placeholder="<?php p($l->t('Password'));?>" autocomplete="off"
title="<?php p($l->t('For anonymous access, leave DN and Password empty.'));?>"
/>
</div>
@@ -7,7 +7,7 @@
<button class="ldap_action_continue" name="ldap_action_continue" type="button">
<?php p($l->t('Continue'));?>
</button>
<a href="<?php p($theme->getDocBaseUrl()); ?>/server/5.0/admin_manual/auth_ldap.html"
<a href="<?php print_unescaped(link_to_docs('admin-ldap')); ?>"
target="_blank">
<img src="<?php print_unescaped(OCP\Util::imagePath('', 'actions/info.png')); ?>"
style="height:1.75ex" />
+54
View File
@@ -408,4 +408,58 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase {
//no test for getDisplayNames, because it just invokes getUsers and
//getDisplayName
public function testCountUsers() {
$access = $this->getAccessMock();
$access->connection->expects($this->once())
->method('__get')
->will($this->returnCallback(function($name) {
if($name === 'ldapLoginFilter') {
return 'uid=%uid';
}
return null;
}));
$access->expects($this->once())
->method('countUsers')
->will($this->returnCallback(function($filter, $a, $b, $c) {
if($filter !== 'uid=*') {
return false;
}
return 5;
}));
$backend = new UserLDAP($access);
$result = $backend->countUsers();
$this->assertEquals(5, $result);
}
public function testCountUsersFailing() {
$access = $this->getAccessMock();
$access->connection->expects($this->once())
->method('__get')
->will($this->returnCallback(function($name) {
if($name === 'ldapLoginFilter') {
return 'invalidFilter';
}
return null;
}));
$access->expects($this->once())
->method('countUsers')
->will($this->returnCallback(function($filter, $a, $b, $c) {
if($filter !== 'uid=*') {
return false;
}
return 5;
}));
$backend = new UserLDAP($access);
$result = $backend->countUsers();
$this->assertFalse($result);
}
}
+14 -1
View File
@@ -363,7 +363,8 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
return (bool)((OC_USER_BACKEND_CHECK_PASSWORD
| OC_USER_BACKEND_GET_HOME
| OC_USER_BACKEND_GET_DISPLAYNAME
| OC_USER_BACKEND_PROVIDE_AVATAR)
| OC_USER_BACKEND_PROVIDE_AVATAR
| OC_USER_BACKEND_COUNT_USERS)
& $actions);
}
@@ -373,4 +374,16 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface {
public function hasUserListings() {
return true;
}
/**
* counts the users in LDAP
*
* @return int | bool
*/
public function countUsers() {
$filter = \OCP\Util::mb_str_replace(
'%uid', '*', $this->access->connection->ldapLoginFilter, 'UTF-8');
$entries = $this->access->countUsers($filter);
return $entries;
}
}
+15
View File
@@ -210,4 +210,19 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface {
return $this->refBackend->hasUserListings();
}
/**
* @brief Count the number of users
* @returns int | bool
*/
public function countUsers() {
$users = false;
foreach($this->backends as $backend) {
$backendUsers = $backend->countUsers();
if ($backendUsers !== false) {
$users += $backendUsers;
}
}
return $users;
}
}
Regular → Executable
+8 -2
View File
@@ -114,9 +114,15 @@ $CONFIG = array(
/* Password to use for sendmail mail, depends on mail_smtpauth if this is used */
"mail_smtppassword" => "",
/* memcached hostname and port (Only used when xCache, APC and APCu are absent.) */
"memcached_server" => array('localhost', 11211),
/* How long should ownCloud keep deleted files in the trash bin, default value: 30 days */
'trashbin_retention_obligation' => 30,
/* Disable/Enable auto expire for the trash bin, by default auto expire is enabled */
'trashbin_auto_expire' => true,
/* allow user to change his display name, if it is supported by the back-end */
'allow_user_to_change_display_name' => true,
@@ -185,8 +191,8 @@ $CONFIG = array(
// "datadirectory" => "",
/* Enable maintenance mode to disable ownCloud
If you want to prevent users to login to ownCloud before you start doing some maintenance work,
you need to set the value of the maintenance parameter to true.
If you want to prevent users to login to ownCloud before you start doing some maintenance work,
you need to set the value of the maintenance parameter to true.
Please keep in mind that users who are already logged-in are kicked out of ownCloud instantly.
*/
"maintenance" => false,
+61
View File
@@ -0,0 +1,61 @@
<?php
/**
* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Core\Command\User;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Helper\TableHelper;
class Report extends Command {
protected function configure() {
$this
->setName('user:report')
->setDescription('shows how many users have access');
}
protected function execute(InputInterface $input, OutputInterface $output) {
$table = $this->getHelperSet()->get('table');
$table->setHeaders(array('User Report', ''));
$userCountArray = $this->countUsers();
if(!empty($userCountArray)) {
$total = 0;
$rows = array();
foreach($userCountArray as $classname => $users) {
$total += $users;
$rows[] = array($classname, $users);
}
$rows[] = array(' ');
$rows[] = array('total users', $total);
} else {
$rows[] = array('No backend enabled that supports user counting', '');
}
$userDirectoryCount = $this->countUserDirectories();
$rows[] = array(' ');
$rows[] = array('user directories', $userDirectoryCount);
$table->setRows($rows);
$table->render($output);
}
private function countUsers() {
\OC_App::loadApps(array('authentication'));
$userManager = \OC::$server->getUserManager();
return $userManager->countUsers();
}
private function countUserDirectories() {
$dataview = new \OC\Files\View('/');
$userDirectories = $dataview->getDirectoryContent('/', 'httpd/unix-directory');
return count($userDirectories);
}
}
+21 -6
View File
@@ -105,8 +105,8 @@ textarea:hover, textarea:focus, textarea:active {
input[type="checkbox"] { margin:0; padding:0; height:auto; width:auto; }
input[type="checkbox"]:hover+label, input[type="checkbox"]:focus+label { color:#111 !important; }
input[type="time"] {
width: 110px;
height: 30px;
width: initial;
height: 31px;
-moz-box-sizing: border-box; box-sizing: border-box;
}
#quota {
@@ -202,13 +202,20 @@ input[type="submit"].enabled {
box-sizing: border-box;
position: fixed;
right: 0;
left: 80px;
left: 0;
height: 44px;
width: 100%;
padding: 0;
margin: 0;
background: #eee;
border-bottom: 1px solid #e7e7e7;
z-index: 50;
}
/* account for shift of controls bar due to app navigation */
#body-user #controls,
#body-settings #controls {
padding-left: 80px;
}
#controls .button,
#controls button,
#controls input[type='submit'],
@@ -822,15 +829,23 @@ span.ui-icon {float: left; margin: 3px 7px 30px 0;}
#tagsdialog .taglist li:hover, #tagsdialog .taglist li:active { background:#eee; }
#tagsdialog .addinput { width: 90%; clear: both; }
/* ---- APP SETTINGS ---- */
.popup { background-color:white; border-radius:10px 10px 10px 10px; box-shadow:0 0 20px #888; color:#333; padding:10px; position:fixed !important; z-index:100; }
/* ---- APP SETTINGS - LEGACY, DO NOT USE THE POPUP! ---- */
.popup {
background-color: #fff;
border-radius: 3px;
box-shadow: 0 0 10px #aaa;
color: #333;
padding: 10px;
position: fixed !important;
z-index: 100;
}
.popup.topright { top:7em; right:1em; }
.popup.bottomleft { bottom:1em; left:33em; }
.popup .close { position:absolute; top:0.2em; right:0.2em; height:20px; width:20px; background:url('../img/actions/close.svg') no-repeat center; }
.popup h2 { font-weight:bold; font-size:1.2em; }
.arrow { border-bottom:10px solid white; border-left:10px solid transparent; border-right:10px solid transparent; display:block; height:0; position:absolute; width:0; z-index:201; }
.arrow.left { left:-13px; bottom:1.2em; -webkit-transform:rotate(270deg); -moz-transform:rotate(270deg); -o-transform:rotate(270deg); -ms-transform:rotate(270deg); transform:rotate(270deg); }
.arrow.up { top:-8px; right:2em; }
.arrow.up { top:-8px; right:6px; }
.arrow.down { -webkit-transform:rotate(180deg); -moz-transform:rotate(180deg); -o-transform:rotate(180deg); -ms-transform:rotate(180deg); transform:rotate(180deg); }
.help-includes {
overflow: hidden;
+21 -10
View File
@@ -12,7 +12,14 @@ var oc_current_user = document.getElementsByTagName('head')[0].getAttribute('dat
var oc_requesttoken = document.getElementsByTagName('head')[0].getAttribute('data-requesttoken');
if (typeof oc_webroot === "undefined") {
oc_webroot = location.pathname.substr(0, location.pathname.lastIndexOf('/'));
oc_webroot = location.pathname;
var pos = oc_webroot.indexOf('/index.php/');
if (pos !== -1) {
oc_webroot = oc_webroot.substr(0, pos);
}
else {
oc_webroot = oc_webroot.substr(0, oc_webroot.lastIndexOf('/'));
}
}
if (oc_debug !== true || typeof console === "undefined" || typeof console.log === "undefined") {
if (!window.console) {
@@ -41,8 +48,8 @@ function initL10N(app) {
t.cache[app] = [];
}
}
if (typeof t.plural_function == 'undefined') {
t.plural_function = function (n) {
if (typeof t.plural_function[app] == 'undefined') {
t.plural_function[app] = function (n) {
var p = (n != 1) ? 1 : 0;
return { 'nplural' : 2, 'plural' : p };
};
@@ -67,7 +74,7 @@ function initL10N(app) {
Gettext._locale_data[domain].head.plural_func = eval("("+code+")");
*/
var code = 'var plural; var nplurals; '+pf+' return { "nplural" : nplurals, "plural" : (plural === true ? 1 : plural ? plural : 0) };';
t.plural_function = new Function("n", code);
t.plural_function[app] = new Function("n", code);
} else {
console.log("Syntax error in language file. Plural-Forms header is invalid ["+t.plural_forms+"]");
}
@@ -103,6 +110,10 @@ function t(app, text, vars, count){
}
}
t.cache = {};
// different apps might or might not redefine the nplurals function correctly
// this is to make sure that a "broken" app doesn't mess up with the
// other app's plural function
t.plural_function = {};
/**
* translate a string
@@ -115,11 +126,11 @@ t.cache = {};
*/
function n(app, text_singular, text_plural, count, vars) {
initL10N(app);
var identifier = '_' + text_singular + '__' + text_plural + '_';
var identifier = '_' + text_singular + '_::_' + text_plural + '_';
if( typeof( t.cache[app][identifier] ) !== 'undefined' ){
var translation = t.cache[app][identifier];
if ($.isArray(translation)) {
var plural = t.plural_function(count);
var plural = t.plural_function[app](count);
return t(app, translation[plural.plural], vars, count);
}
}
@@ -471,11 +482,11 @@ OC.Breadcrumb={
},
_show:function(container, dir, leafname, leaflink){
var self = this;
this._clear(container);
// show home + path in subdirectories
if (dir && dir !== '/') {
if (dir) {
//add home
var link = OC.linkTo('files','index.php');
@@ -502,7 +513,7 @@ OC.Breadcrumb={
}
});
}
//add leafname
if (leafname && leaflink) {
this._push(container, leafname, leaflink);
+7 -3
View File
@@ -181,7 +181,8 @@ OC.Share={
},
showDropDown:function(itemType, itemSource, appendTo, link, possiblePermissions, filename) {
var data = OC.Share.loadItem(itemType, itemSource);
var html = '<div id="dropdown" class="drop" data-item-type="'+itemType+'" data-item-source="'+itemSource+'"" data-item-source-name="'+filename+'">';
var dropDownEl;
var html = '<div id="dropdown" class="drop" data-item-type="'+itemType+'" data-item-source="'+itemSource+'">';
if (data !== false && data.reshare !== false && data.reshare.uid_owner !== undefined) {
if (data.reshare.share_type == OC.Share.SHARE_TYPE_GROUP) {
html += '<span class="reshare">'+t('core', 'Shared with you and the group {group} by {owner}', {group: escapeHTML(data.reshare.share_with), owner: escapeHTML(data.reshare.displayname_owner)})+'</span>';
@@ -239,7 +240,8 @@ OC.Share={
html += '<input type="checkbox" name="expirationCheckbox" id="expirationCheckbox" value="1" /><label for="expirationCheckbox">'+t('core', 'Set expiration date')+'</label>';
html += '<input id="expirationDate" type="text" placeholder="'+t('core', 'Expiration date')+'" style="display:none; width:90%;" />';
html += '</div>';
$(html).appendTo(appendTo);
dropDownEl = $(html);
dropDownEl = dropDownEl.appendTo(appendTo);
// Reset item shares
OC.Share.itemShares = [];
if (data.shares) {
@@ -332,8 +334,10 @@ OC.Share={
} else {
html += '<input id="shareWith" type="text" placeholder="'+t('core', 'Resharing is not allowed')+'" style="width:90%;" disabled="disabled"/>';
html += '</div>';
$(html).appendTo(appendTo);
dropDownEl = $(html);
dropDownEl.appendTo(appendTo);
}
dropDownEl.attr('data-item-source-name', filename);
$('#dropdown').show('blind', function() {
OC.Share.droppedDown = true;
});
-21
View File
@@ -1,21 +0,0 @@
<?php
$TRANSLATIONS = array(
"Settings" => "Настройки",
"_%n minute ago_::_%n minutes ago_" => array("","",""),
"_%n hour ago_::_%n hours ago_" => array("","",""),
"_%n day ago_::_%n days ago_" => array("","",""),
"_%n month ago_::_%n months ago_" => array("","",""),
"Yes" => "Да",
"No" => "Нет",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
"Cancel" => "Отмена",
"Share" => "Сделать общим",
"Error" => "Ошибка",
"Password" => "Пароль",
"can edit" => "возможно редактирование",
"Warning" => "Предупреждение",
"Delete" => "Удалить",
"Username" => "Имя пользователя",
"Help" => "Помощь"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+1
View File
@@ -15,3 +15,4 @@ $application->add(new OC\Core\Command\App\Disable());
$application->add(new OC\Core\Command\App\Enable());
$application->add(new OC\Core\Command\App\ListApps());
$application->add(new OC\Core\Command\Maintenance\Repair(new \OC\Repair()));
$application->add(new OC\Core\Command\User\Report());
+7 -6
View File
@@ -6,18 +6,19 @@
<form action="index.php" method="post">
<input type="hidden" name="install" value="true" />
<?php if(count($_['errors']) > 0): ?>
<ul class="errors">
<fieldset class="warning">
<legend><strong><?php p($l->t('Error'));?></strong></legend>
<?php foreach($_['errors'] as $err): ?>
<li>
<p>
<?php if(is_array($err)):?>
<?php print_unescaped($err['error']); ?>
<p class='hint'><?php print_unescaped($err['hint']); ?></p>
<span class='hint'><?php print_unescaped($err['hint']); ?></span>
<?php else: ?>
<?php print_unescaped($err); ?>
<?php endif; ?>
</li>
</p>
<?php endforeach; ?>
</ul>
</fieldset>
<?php endif; ?>
<?php if($_['vulnerableToNullByte']): ?>
<fieldset class="warning">
@@ -53,7 +54,7 @@
</p>
<p class="infield groupbottom">
<input type="password" name="adminpass" data-typetoggle="#show" id="adminpass" placeholder=""
value="<?php p(OC_Helper::init_var('adminpass')); ?>" />
value="<?php p(OC_Helper::init_var('adminpass')); ?>" required />
<label for="adminpass" class="infield"><?php p($l->t( 'Password' )); ?></label>
<img class="svg" id="adminpass-icon" src="<?php print_unescaped(image_path('', 'actions/password.svg')); ?>" alt="" />
<input type="checkbox" id="show" name="show" />
+4 -2
View File
@@ -50,6 +50,8 @@ try {
session_write_close();
$logger = \OC_Log::$object;
// Don't do anything if ownCloud has not been installed
if (!OC_Config::getValue('installed', false)) {
exit(0);
@@ -98,7 +100,7 @@ try {
$jobList = new \OC\BackgroundJob\JobList();
$jobs = $jobList->getAll();
foreach ($jobs as $job) {
$job->execute($jobList);
$job->execute($jobList, $logger);
}
} else {
// We call cron.php from some website
@@ -109,7 +111,7 @@ try {
// Work and success :-)
$jobList = new \OC\BackgroundJob\JobList();
$job = $jobList->getNext();
$job->execute($jobList);
$job->execute($jobList, $logger);
$jobList->setLastJob($job);
OC_JSON::success();
}
-773
View File
@@ -1,773 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-26 10:45-0500\n"
"PO-Revision-Date: 2013-11-26 15:45+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/share.php:119 ajax/share.php:198
#, php-format
msgid "%s shared »%s« with you"
msgstr ""
#: ajax/share.php:169
#, php-format
msgid "Couldn't send mail to following users: %s "
msgstr ""
#: ajax/update.php:11
msgid "Turned on maintenance mode"
msgstr ""
#: ajax/update.php:14
msgid "Turned off maintenance mode"
msgstr ""
#: ajax/update.php:17
msgid "Updated database"
msgstr ""
#: ajax/update.php:20
msgid "Updating filecache, this may take really long..."
msgstr ""
#: ajax/update.php:23
msgid "Updated filecache"
msgstr ""
#: ajax/update.php:26
#, php-format
msgid "... %d%% done ..."
msgstr ""
#: avatar/controller.php:62
msgid "No image or file provided"
msgstr ""
#: avatar/controller.php:81
msgid "Unknown filetype"
msgstr ""
#: avatar/controller.php:85
msgid "Invalid image"
msgstr ""
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
msgstr ""
#: avatar/controller.php:135
msgid "No crop data provided"
msgstr ""
#: js/config.php:32
msgid "Sunday"
msgstr ""
#: js/config.php:33
msgid "Monday"
msgstr ""
#: js/config.php:34
msgid "Tuesday"
msgstr ""
#: js/config.php:35
msgid "Wednesday"
msgstr ""
#: js/config.php:36
msgid "Thursday"
msgstr ""
#: js/config.php:37
msgid "Friday"
msgstr ""
#: js/config.php:38
msgid "Saturday"
msgstr ""
#: js/config.php:43
msgid "January"
msgstr ""
#: js/config.php:44
msgid "February"
msgstr ""
#: js/config.php:45
msgid "March"
msgstr ""
#: js/config.php:46
msgid "April"
msgstr ""
#: js/config.php:47
msgid "May"
msgstr ""
#: js/config.php:48
msgid "June"
msgstr ""
#: js/config.php:49
msgid "July"
msgstr ""
#: js/config.php:50
msgid "August"
msgstr ""
#: js/config.php:51
msgid "September"
msgstr ""
#: js/config.php:52
msgid "October"
msgstr ""
#: js/config.php:53
msgid "November"
msgstr ""
#: js/config.php:54
msgid "December"
msgstr ""
#: js/js.js:387
msgid "Settings"
msgstr "Настройки"
#: js/js.js:858
msgid "seconds ago"
msgstr ""
#: js/js.js:859
msgid "%n minute ago"
msgid_plural "%n minutes ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/js.js:860
msgid "%n hour ago"
msgid_plural "%n hours ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/js.js:861
msgid "today"
msgstr ""
#: js/js.js:862
msgid "yesterday"
msgstr ""
#: js/js.js:863
msgid "%n day ago"
msgid_plural "%n days ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/js.js:864
msgid "last month"
msgstr ""
#: js/js.js:865
msgid "%n month ago"
msgid_plural "%n months ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/js.js:866
msgid "months ago"
msgstr ""
#: js/js.js:867
msgid "last year"
msgstr ""
#: js/js.js:868
msgid "years ago"
msgstr ""
#: js/oc-dialogs.js:123
msgid "Choose"
msgstr ""
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
msgstr ""
#: js/oc-dialogs.js:172
msgid "Yes"
msgstr "Да"
#: js/oc-dialogs.js:182
msgid "No"
msgstr "Нет"
#: js/oc-dialogs.js:199
msgid "Ok"
msgstr ""
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
msgstr ""
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/oc-dialogs.js:361
msgid "One file conflict"
msgstr ""
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
msgstr ""
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
msgstr ""
#: js/oc-dialogs.js:376
msgid "Cancel"
msgstr "Отмена"
#: js/oc-dialogs.js:386
msgid "Continue"
msgstr ""
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
msgstr ""
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
msgstr ""
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
msgstr ""
#: js/share.js:51 js/share.js:66 js/share.js:106
msgid "Shared"
msgstr ""
#: js/share.js:109
msgid "Share"
msgstr "Сделать общим"
#: js/share.js:158 js/share.js:171 js/share.js:178 js/share.js:707
#: js/share.js:719
msgid "Error"
msgstr "Ошибка"
#: js/share.js:160 js/share.js:747
msgid "Error while sharing"
msgstr ""
#: js/share.js:171
msgid "Error while unsharing"
msgstr ""
#: js/share.js:178
msgid "Error while changing permissions"
msgstr ""
#: js/share.js:187
msgid "Shared with you and the group {group} by {owner}"
msgstr ""
#: js/share.js:189
msgid "Shared with you by {owner}"
msgstr ""
#: js/share.js:213
msgid "Share with user or group …"
msgstr ""
#: js/share.js:219
msgid "Share link"
msgstr ""
#: js/share.js:222
msgid "Password protect"
msgstr ""
#: js/share.js:224 templates/installation.php:57 templates/login.php:32
msgid "Password"
msgstr "Пароль"
#: js/share.js:229
msgid "Allow Public Upload"
msgstr ""
#: js/share.js:233
msgid "Email link to person"
msgstr ""
#: js/share.js:234
msgid "Send"
msgstr ""
#: js/share.js:239
msgid "Set expiration date"
msgstr ""
#: js/share.js:240
msgid "Expiration date"
msgstr ""
#: js/share.js:275
msgid "Share via email:"
msgstr ""
#: js/share.js:278
msgid "No people found"
msgstr ""
#: js/share.js:322 js/share.js:359
msgid "group"
msgstr ""
#: js/share.js:333
msgid "Resharing is not allowed"
msgstr ""
#: js/share.js:375
msgid "Shared in {item} with {user}"
msgstr ""
#: js/share.js:397
msgid "Unshare"
msgstr ""
#: js/share.js:405
msgid "notify by email"
msgstr ""
#: js/share.js:408
msgid "can edit"
msgstr "возможно редактирование"
#: js/share.js:410
msgid "access control"
msgstr ""
#: js/share.js:413
msgid "create"
msgstr ""
#: js/share.js:416
msgid "update"
msgstr ""
#: js/share.js:419
msgid "delete"
msgstr ""
#: js/share.js:422
msgid "share"
msgstr ""
#: js/share.js:464 js/share.js:694
msgid "Password protected"
msgstr ""
#: js/share.js:707
msgid "Error unsetting expiration date"
msgstr ""
#: js/share.js:719
msgid "Error setting expiration date"
msgstr ""
#: js/share.js:734
msgid "Sending ..."
msgstr ""
#: js/share.js:745
msgid "Email sent"
msgstr ""
#: js/share.js:769
msgid "Warning"
msgstr "Предупреждение"
#: js/tags.js:4
msgid "The object type is not specified."
msgstr ""
#: js/tags.js:13
msgid "Enter new"
msgstr ""
#: js/tags.js:27
msgid "Delete"
msgstr "Удалить"
#: js/tags.js:31
msgid "Add"
msgstr ""
#: js/tags.js:39
msgid "Edit tags"
msgstr ""
#: js/tags.js:57
msgid "Error loading dialog template: {error}"
msgstr ""
#: js/tags.js:261
msgid "No tags selected for deletion."
msgstr ""
#: js/update.js:8
msgid "Please reload the page."
msgstr ""
#: js/update.js:17
msgid ""
"The update was unsuccessful. Please report this issue to the <a "
"href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud "
"community</a>."
msgstr ""
#: js/update.js:21
msgid "The update was successful. Redirecting you to ownCloud now."
msgstr ""
#: lostpassword/controller.php:62
#, php-format
msgid "%s password reset"
msgstr ""
#: lostpassword/templates/email.php:2
msgid "Use the following link to reset your password: {link}"
msgstr ""
#: lostpassword/templates/lostpassword.php:7
msgid ""
"The link to reset your password has been sent to your email.<br>If you do "
"not receive it within a reasonable amount of time, check your spam/junk "
"folders.<br>If it is not there ask your local administrator ."
msgstr ""
#: lostpassword/templates/lostpassword.php:15
msgid "Request failed!<br>Did you make sure your email/username was right?"
msgstr ""
#: lostpassword/templates/lostpassword.php:18
msgid "You will receive a link to reset your password via Email."
msgstr ""
#: lostpassword/templates/lostpassword.php:21 templates/installation.php:51
#: templates/login.php:25
msgid "Username"
msgstr "Имя пользователя"
#: lostpassword/templates/lostpassword.php:25
msgid ""
"Your files are encrypted. If you haven't enabled the recovery key, there "
"will be no way to get your data back after your password is reset. If you "
"are not sure what to do, please contact your administrator before you "
"continue. Do you really want to continue?"
msgstr ""
#: lostpassword/templates/lostpassword.php:27
msgid "Yes, I really want to reset my password now"
msgstr ""
#: lostpassword/templates/lostpassword.php:30
msgid "Reset"
msgstr ""
#: lostpassword/templates/resetpassword.php:4
msgid "Your password was reset"
msgstr ""
#: lostpassword/templates/resetpassword.php:5
msgid "To login page"
msgstr ""
#: lostpassword/templates/resetpassword.php:8
msgid "New password"
msgstr ""
#: lostpassword/templates/resetpassword.php:11
msgid "Reset password"
msgstr ""
#: strings.php:5
msgid "Personal"
msgstr ""
#: strings.php:6
msgid "Users"
msgstr ""
#: strings.php:7 templates/layout.user.php:110
msgid "Apps"
msgstr ""
#: strings.php:8
msgid "Admin"
msgstr ""
#: strings.php:9
msgid "Help"
msgstr "Помощь"
#: tags/controller.php:22
msgid "Error loading tags"
msgstr ""
#: tags/controller.php:48
msgid "Tag already exists"
msgstr ""
#: tags/controller.php:64
msgid "Error deleting tag(s)"
msgstr ""
#: tags/controller.php:75
msgid "Error tagging"
msgstr ""
#: tags/controller.php:86
msgid "Error untagging"
msgstr ""
#: tags/controller.php:97
msgid "Error favoriting"
msgstr ""
#: tags/controller.php:108
msgid "Error unfavoriting"
msgstr ""
#: templates/403.php:12
msgid "Access forbidden"
msgstr ""
#: templates/404.php:15
msgid "Cloud not found"
msgstr ""
#: templates/altmail.php:2
#, php-format
msgid ""
"Hey there,\n"
"\n"
"just letting you know that %s shared %s with you.\n"
"View it: %s\n"
"\n"
msgstr ""
#: templates/altmail.php:4 templates/mail.php:17
#, php-format
msgid "The share will expire on %s."
msgstr ""
#: templates/altmail.php:7 templates/mail.php:20
msgid "Cheers!"
msgstr ""
#: templates/installation.php:24 templates/installation.php:31
#: templates/installation.php:38
msgid "Security Warning"
msgstr ""
#: templates/installation.php:25
msgid "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)"
msgstr ""
#: templates/installation.php:26
#, php-format
msgid "Please update your PHP installation to use %s securely."
msgstr ""
#: templates/installation.php:32
msgid ""
"No secure random number generator is available, please enable the PHP "
"OpenSSL extension."
msgstr ""
#: templates/installation.php:33
msgid ""
"Without a secure random number generator an attacker may be able to predict "
"password reset tokens and take over your account."
msgstr ""
#: templates/installation.php:39
msgid ""
"Your data directory and files are probably accessible from the internet "
"because the .htaccess file does not work."
msgstr ""
#: templates/installation.php:41
#, php-format
msgid ""
"For information how to properly configure your server, please see the <a "
"href=\"%s\" target=\"_blank\">documentation</a>."
msgstr ""
#: templates/installation.php:47
msgid "Create an <strong>admin account</strong>"
msgstr ""
#: templates/installation.php:66
msgid "Advanced"
msgstr ""
#: templates/installation.php:73
msgid "Data folder"
msgstr ""
#: templates/installation.php:85
msgid "Configure the database"
msgstr ""
#: templates/installation.php:90 templates/installation.php:102
#: templates/installation.php:113 templates/installation.php:124
#: templates/installation.php:136
msgid "will be used"
msgstr ""
#: templates/installation.php:148
msgid "Database user"
msgstr ""
#: templates/installation.php:155
msgid "Database password"
msgstr ""
#: templates/installation.php:160
msgid "Database name"
msgstr ""
#: templates/installation.php:168
msgid "Database tablespace"
msgstr ""
#: templates/installation.php:175
msgid "Database host"
msgstr ""
#: templates/installation.php:184
msgid "Finish setup"
msgstr ""
#: templates/installation.php:184
msgid "Finishing …"
msgstr ""
#: templates/layout.user.php:43
#, php-format
msgid "%s is available. Get more information on how to update."
msgstr ""
#: templates/layout.user.php:71 templates/singleuser.user.php:8
msgid "Log out"
msgstr ""
#: templates/login.php:9
msgid "Automatic logon rejected!"
msgstr ""
#: templates/login.php:10
msgid ""
"If you did not change your password recently, your account may be "
"compromised!"
msgstr ""
#: templates/login.php:12
msgid "Please change your password to secure your account again."
msgstr ""
#: templates/login.php:17
msgid "Server side authentication failed!"
msgstr ""
#: templates/login.php:18
msgid "Please contact your administrator."
msgstr ""
#: templates/login.php:38
msgid "Lost your password?"
msgstr ""
#: templates/login.php:43
msgid "remember"
msgstr ""
#: templates/login.php:46
msgid "Log in"
msgstr ""
#: templates/login.php:52
msgid "Alternative Logins"
msgstr ""
#: templates/mail.php:15
#, php-format
msgid ""
"Hey there,<br><br>just letting you know that %s shared »%s« with you.<br><a "
"href=\"%s\">View it!</a><br><br>"
msgstr ""
#: templates/singleuser.user.php:3
msgid "This ownCloud instance is currently in single user mode."
msgstr ""
#: templates/singleuser.user.php:4
msgid "This means only administrators can use the instance."
msgstr ""
#: templates/singleuser.user.php:5 templates/update.user.php:5
msgid ""
"Contact your system administrator if this message persists or appeared "
"unexpectedly."
msgstr ""
#: templates/singleuser.user.php:7 templates/update.user.php:6
msgid "Thank you for your patience."
msgstr ""
#: templates/update.admin.php:3
#, php-format
msgid "Updating ownCloud to version %s, this may take a while."
msgstr ""
#: templates/update.user.php:3
msgid ""
"This ownCloud instance is currently being updated, which may take a while."
msgstr ""
#: templates/update.user.php:4
msgid "Please reload this page after a short time to continue using ownCloud."
msgstr ""
-411
View File
@@ -1,411 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-29 14:08-0500\n"
"PO-Revision-Date: 2013-11-29 19:08+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/move.php:17
#, php-format
msgid "Could not move %s - File with this name already exists"
msgstr ""
#: ajax/move.php:27 ajax/move.php:30
#, php-format
msgid "Could not move %s"
msgstr ""
#: ajax/newfile.php:56 js/files.js:74
msgid "File name cannot be empty."
msgstr ""
#: ajax/newfile.php:62
msgid "File name must not contain \"/\". Please choose a different name."
msgstr ""
#: ajax/newfile.php:72 ajax/newfolder.php:37 lib/app.php:67
#, php-format
msgid ""
"The name %s is already used in the folder %s. Please choose a different "
"name."
msgstr ""
#: ajax/newfile.php:81
msgid "Not a valid source"
msgstr ""
#: ajax/newfile.php:94
#, php-format
msgid "Error while downloading %s to %s"
msgstr ""
#: ajax/newfile.php:128
msgid "Error when creating the file"
msgstr ""
#: ajax/newfolder.php:21
msgid "Folder name cannot be empty."
msgstr ""
#: ajax/newfolder.php:27
msgid "Folder name must not contain \"/\". Please choose a different name."
msgstr ""
#: ajax/newfolder.php:56
msgid "Error when creating the folder"
msgstr ""
#: ajax/upload.php:18 ajax/upload.php:50
msgid "Unable to set upload directory."
msgstr ""
#: ajax/upload.php:27
msgid "Invalid Token"
msgstr ""
#: ajax/upload.php:64
msgid "No file was uploaded. Unknown error"
msgstr ""
#: ajax/upload.php:71
msgid "There is no error, the file uploaded with success"
msgstr ""
#: ajax/upload.php:72
msgid ""
"The uploaded file exceeds the upload_max_filesize directive in php.ini: "
msgstr ""
#: ajax/upload.php:74
msgid ""
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in "
"the HTML form"
msgstr ""
#: ajax/upload.php:75
msgid "The uploaded file was only partially uploaded"
msgstr ""
#: ajax/upload.php:76
msgid "No file was uploaded"
msgstr ""
#: ajax/upload.php:77
msgid "Missing a temporary folder"
msgstr ""
#: ajax/upload.php:78
msgid "Failed to write to disk"
msgstr ""
#: ajax/upload.php:96
msgid "Not enough storage available"
msgstr ""
#: ajax/upload.php:127 ajax/upload.php:154
msgid "Upload failed. Could not get file info."
msgstr ""
#: ajax/upload.php:144
msgid "Upload failed. Could not find uploaded file"
msgstr ""
#: ajax/upload.php:172
msgid "Invalid directory."
msgstr ""
#: appinfo/app.php:11
msgid "Files"
msgstr "Файлы"
#: js/file-upload.js:228
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
msgstr ""
#: js/file-upload.js:239
msgid "Not enough space available"
msgstr ""
#: js/file-upload.js:306
msgid "Upload cancelled."
msgstr ""
#: js/file-upload.js:344
msgid "Could not get result from server."
msgstr ""
#: js/file-upload.js:436
msgid ""
"File upload is in progress. Leaving the page now will cancel the upload."
msgstr ""
#: js/file-upload.js:523
msgid "URL cannot be empty"
msgstr ""
#: js/file-upload.js:527 js/filelist.js:377
msgid "In the home folder 'Shared' is a reserved filename"
msgstr ""
#: js/file-upload.js:529 js/filelist.js:379
msgid "{new_name} already exists"
msgstr ""
#: js/file-upload.js:595
msgid "Could not create file"
msgstr ""
#: js/file-upload.js:611
msgid "Could not create folder"
msgstr ""
#: js/fileactions.js:125
msgid "Share"
msgstr "Сделать общим"
#: js/fileactions.js:137
msgid "Delete permanently"
msgstr ""
#: js/fileactions.js:194
msgid "Rename"
msgstr "Переименовать"
#: js/filelist.js:69 js/filelist.js:72 js/filelist.js:889
msgid "Pending"
msgstr ""
#: js/filelist.js:405
msgid "Could not rename file"
msgstr ""
#: js/filelist.js:539
msgid "replaced {new_name} with {old_name}"
msgstr ""
#: js/filelist.js:539
msgid "undo"
msgstr ""
#: js/filelist.js:591
msgid "Error deleting file."
msgstr ""
#: js/filelist.js:609 js/filelist.js:683 js/files.js:631
msgid "%n folder"
msgid_plural "%n folders"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/filelist.js:610 js/filelist.js:684 js/files.js:637
msgid "%n file"
msgid_plural "%n files"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/filelist.js:617
msgid "{dirs} and {files}"
msgstr ""
#: js/filelist.js:828 js/filelist.js:866
msgid "Uploading %n file"
msgid_plural "Uploading %n files"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: js/files.js:72
msgid "'.' is an invalid file name."
msgstr ""
#: js/files.js:81
msgid ""
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not "
"allowed."
msgstr ""
#: js/files.js:93
msgid "Your storage is full, files can not be updated or synced anymore!"
msgstr ""
#: js/files.js:97
msgid "Your storage is almost full ({usedSpacePercent}%)"
msgstr ""
#: js/files.js:110
msgid ""
"Encryption App is enabled but your keys are not initialized, please log-out "
"and log-in again"
msgstr ""
#: js/files.js:114
msgid ""
"Invalid private key for Encryption App. Please update your private key "
"password in your personal settings to recover access to your encrypted "
"files."
msgstr ""
#: js/files.js:118
msgid ""
"Encryption was disabled but your files are still encrypted. Please go to "
"your personal settings to decrypt your files."
msgstr ""
#: js/files.js:349
msgid ""
"Your download is being prepared. This might take some time if the files are "
"big."
msgstr ""
#: js/files.js:558 js/files.js:596
msgid "Error moving file"
msgstr ""
#: js/files.js:558 js/files.js:596
msgid "Error"
msgstr "Ошибка"
#: js/files.js:613 templates/index.php:56
msgid "Name"
msgstr ""
#: js/files.js:614 templates/index.php:68
msgid "Size"
msgstr "Размер"
#: js/files.js:615 templates/index.php:70
msgid "Modified"
msgstr ""
#: lib/app.php:60
msgid "Invalid folder name. Usage of 'Shared' is reserved."
msgstr ""
#: lib/app.php:101
#, php-format
msgid "%s could not be renamed"
msgstr ""
#: lib/helper.php:11 templates/index.php:16
msgid "Upload"
msgstr "Загрузка"
#: templates/admin.php:5
msgid "File handling"
msgstr ""
#: templates/admin.php:7
msgid "Maximum upload size"
msgstr ""
#: templates/admin.php:10
msgid "max. possible: "
msgstr ""
#: templates/admin.php:15
msgid "Needed for multi-file and folder downloads."
msgstr ""
#: templates/admin.php:17
msgid "Enable ZIP-download"
msgstr ""
#: templates/admin.php:20
msgid "0 is unlimited"
msgstr ""
#: templates/admin.php:22
msgid "Maximum input size for ZIP files"
msgstr ""
#: templates/admin.php:26
msgid "Save"
msgstr "Сохранить"
#: templates/index.php:5
msgid "New"
msgstr ""
#: templates/index.php:8
msgid "New text file"
msgstr ""
#: templates/index.php:8
msgid "Text file"
msgstr ""
#: templates/index.php:10
msgid "New folder"
msgstr ""
#: templates/index.php:10
msgid "Folder"
msgstr ""
#: templates/index.php:12
msgid "From link"
msgstr ""
#: templates/index.php:29
msgid "Deleted files"
msgstr ""
#: templates/index.php:34
msgid "Cancel upload"
msgstr "Отмена загрузки"
#: templates/index.php:40
msgid "You dont have permission to upload or create files here"
msgstr ""
#: templates/index.php:45
msgid "Nothing in here. Upload something!"
msgstr ""
#: templates/index.php:62
msgid "Download"
msgstr "Загрузка"
#: templates/index.php:75 templates/index.php:76
msgid "Unshare"
msgstr ""
#: templates/index.php:81 templates/index.php:82
msgid "Delete"
msgstr "Удалить"
#: templates/index.php:95
msgid "Upload too large"
msgstr ""
#: templates/index.php:97
msgid ""
"The files you are trying to upload exceed the maximum size for file uploads "
"on this server."
msgstr ""
#: templates/index.php:102
msgid "Files are being scanned, please wait."
msgstr ""
#: templates/index.php:105
msgid "Current scanning"
msgstr ""
#: templates/upgrade.php:2
msgid "Upgrading filesystem cache..."
msgstr ""
-201
View File
@@ -1,201 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-29 14:08-0500\n"
"PO-Revision-Date: 2013-11-29 19:08+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/adminrecovery.php:29
msgid "Recovery key successfully enabled"
msgstr ""
#: ajax/adminrecovery.php:34
msgid ""
"Could not enable recovery key. Please check your recovery key password!"
msgstr ""
#: ajax/adminrecovery.php:48
msgid "Recovery key successfully disabled"
msgstr ""
#: ajax/adminrecovery.php:53
msgid ""
"Could not disable recovery key. Please check your recovery key password!"
msgstr ""
#: ajax/changeRecoveryPassword.php:49
msgid "Password successfully changed."
msgstr ""
#: ajax/changeRecoveryPassword.php:51
msgid "Could not change the password. Maybe the old password was not correct."
msgstr ""
#: ajax/updatePrivateKeyPassword.php:52
msgid "Private key password successfully updated."
msgstr ""
#: ajax/updatePrivateKeyPassword.php:54
msgid ""
"Could not update the private key password. Maybe the old password was not "
"correct."
msgstr ""
#: files/error.php:12
msgid ""
"Encryption app not initialized! Maybe the encryption app was re-enabled "
"during your session. Please try to log out and log back in to initialize the"
" encryption app."
msgstr ""
#: files/error.php:16
#, php-format
msgid ""
"Your private key is not valid! Likely your password was changed outside of "
"%s (e.g. your corporate directory). You can update your private key password"
" in your personal settings to recover access to your encrypted files."
msgstr ""
#: files/error.php:19
msgid ""
"Can not decrypt this file, probably this is a shared file. Please ask the "
"file owner to reshare the file with you."
msgstr ""
#: files/error.php:22 files/error.php:27
msgid ""
"Unknown error please check your system settings or contact your "
"administrator"
msgstr ""
#: hooks/hooks.php:59
msgid "Missing requirements."
msgstr ""
#: hooks/hooks.php:60
msgid ""
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL "
"together with the PHP extension is enabled and configured properly. For now,"
" the encryption app has been disabled."
msgstr ""
#: hooks/hooks.php:273
msgid "Following users are not set up for encryption:"
msgstr ""
#: js/detect-migration.js:21
msgid "Initial encryption started... This can take some time. Please wait."
msgstr ""
#: js/settings-admin.js:13
msgid "Saving..."
msgstr ""
#: templates/invalid_private_key.php:8
msgid "Go directly to your "
msgstr ""
#: templates/invalid_private_key.php:8
msgid "personal settings"
msgstr ""
#: templates/settings-admin.php:4 templates/settings-personal.php:3
msgid "Encryption"
msgstr ""
#: templates/settings-admin.php:7
msgid ""
"Enable recovery key (allow to recover users files in case of password loss):"
msgstr ""
#: templates/settings-admin.php:11
msgid "Recovery key password"
msgstr ""
#: templates/settings-admin.php:14
msgid "Repeat Recovery key password"
msgstr ""
#: templates/settings-admin.php:21 templates/settings-personal.php:51
msgid "Enabled"
msgstr ""
#: templates/settings-admin.php:29 templates/settings-personal.php:59
msgid "Disabled"
msgstr ""
#: templates/settings-admin.php:34
msgid "Change recovery key password:"
msgstr ""
#: templates/settings-admin.php:40
msgid "Old Recovery key password"
msgstr ""
#: templates/settings-admin.php:47
msgid "New Recovery key password"
msgstr ""
#: templates/settings-admin.php:53
msgid "Repeat New Recovery key password"
msgstr ""
#: templates/settings-admin.php:58
msgid "Change Password"
msgstr ""
#: templates/settings-personal.php:9
msgid "Your private key password no longer match your log-in password:"
msgstr ""
#: templates/settings-personal.php:12
msgid "Set your old private key password to your current log-in password."
msgstr ""
#: templates/settings-personal.php:14
msgid ""
" If you don't remember your old password you can ask your administrator to "
"recover your files."
msgstr ""
#: templates/settings-personal.php:22
msgid "Old log-in password"
msgstr ""
#: templates/settings-personal.php:28
msgid "Current log-in password"
msgstr ""
#: templates/settings-personal.php:33
msgid "Update Private Key Password"
msgstr ""
#: templates/settings-personal.php:42
msgid "Enable password recovery:"
msgstr ""
#: templates/settings-personal.php:44
msgid ""
"Enabling this option will allow you to reobtain access to your encrypted "
"files in case of password loss"
msgstr ""
#: templates/settings-personal.php:60
msgid "File recovery settings updated"
msgstr ""
#: templates/settings-personal.php:61
msgid "Could not update file recovery"
msgstr ""
-123
View File
@@ -1,123 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
"PO-Revision-Date: 2013-11-16 07:50+0000\n"
"Last-Translator: masensio <masensio@solidgear.es>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: js/dropbox.js:7 js/dropbox.js:28 js/google.js:8 js/google.js:39
msgid "Access granted"
msgstr ""
#: js/dropbox.js:30 js/dropbox.js:96 js/dropbox.js:102
msgid "Error configuring Dropbox storage"
msgstr ""
#: js/dropbox.js:65 js/google.js:86
msgid "Grant access"
msgstr ""
#: js/dropbox.js:101
msgid "Please provide a valid Dropbox app key and secret."
msgstr ""
#: js/google.js:42 js/google.js:121
msgid "Error configuring Google Drive storage"
msgstr ""
#: lib/config.php:461
msgid ""
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares "
"is not possible. Please ask your system administrator to install it."
msgstr ""
#: lib/config.php:465
msgid ""
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting"
" of FTP shares is not possible. Please ask your system administrator to "
"install it."
msgstr ""
#: lib/config.php:468
msgid ""
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. "
"Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask "
"your system administrator to install it."
msgstr ""
#: templates/settings.php:3
msgid "External Storage"
msgstr ""
#: templates/settings.php:9 templates/settings.php:28
msgid "Folder name"
msgstr ""
#: templates/settings.php:10
msgid "External storage"
msgstr ""
#: templates/settings.php:11
msgid "Configuration"
msgstr ""
#: templates/settings.php:12
msgid "Options"
msgstr "Опции"
#: templates/settings.php:13
msgid "Applicable"
msgstr ""
#: templates/settings.php:33
msgid "Add storage"
msgstr ""
#: templates/settings.php:90
msgid "None set"
msgstr ""
#: templates/settings.php:91
msgid "All Users"
msgstr ""
#: templates/settings.php:92
msgid "Groups"
msgstr ""
#: templates/settings.php:100
msgid "Users"
msgstr ""
#: templates/settings.php:113 templates/settings.php:114
#: templates/settings.php:149 templates/settings.php:150
msgid "Delete"
msgstr "Удалить"
#: templates/settings.php:129
msgid "Enable User External Storage"
msgstr ""
#: templates/settings.php:130
msgid "Allow users to mount their own external storage"
msgstr ""
#: templates/settings.php:141
msgid "SSL root certificates"
msgstr ""
#: templates/settings.php:159
msgid "Import Root Certificate"
msgstr ""
-84
View File
@@ -1,84 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-15 22:54-0500\n"
"PO-Revision-Date: 2013-11-13 16:11+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: templates/authenticate.php:4
msgid "This share is password-protected"
msgstr ""
#: templates/authenticate.php:7
msgid "The password is wrong. Try again."
msgstr ""
#: templates/authenticate.php:10
msgid "Password"
msgstr "Пароль"
#: templates/part.404.php:3
msgid "Sorry, this link doesnt seem to work anymore."
msgstr ""
#: templates/part.404.php:4
msgid "Reasons might be:"
msgstr ""
#: templates/part.404.php:6
msgid "the item was removed"
msgstr ""
#: templates/part.404.php:7
msgid "the link expired"
msgstr ""
#: templates/part.404.php:8
msgid "sharing is disabled"
msgstr ""
#: templates/part.404.php:10
msgid "For more info, please ask the person who sent this link."
msgstr ""
#: templates/public.php:18
#, php-format
msgid "%s shared the folder %s with you"
msgstr ""
#: templates/public.php:21
#, php-format
msgid "%s shared the file %s with you"
msgstr ""
#: templates/public.php:29 templates/public.php:95
msgid "Download"
msgstr "Загрузка"
#: templates/public.php:46 templates/public.php:49
msgid "Upload"
msgstr "Загрузка"
#: templates/public.php:59
msgid "Cancel upload"
msgstr "Отмена загрузки"
#: templates/public.php:92
msgid "No preview available for"
msgstr ""
#: templates/public.php:99
msgid "Direct link"
msgstr ""
-60
View File
@@ -1,60 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
"PO-Revision-Date: 2013-11-16 07:50+0000\n"
"Last-Translator: masensio <masensio@solidgear.es>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/delete.php:42
#, php-format
msgid "Couldn't delete %s permanently"
msgstr ""
#: ajax/undelete.php:42
#, php-format
msgid "Couldn't restore %s"
msgstr ""
#: js/trash.js:18 js/trash.js:44 js/trash.js:121 js/trash.js:149
msgid "Error"
msgstr "Ошибка"
#: lib/trashbin.php:815 lib/trashbin.php:817
msgid "restored"
msgstr ""
#: templates/index.php:8
msgid "Nothing in here. Your trash bin is empty!"
msgstr ""
#: templates/index.php:22
msgid "Name"
msgstr ""
#: templates/index.php:25 templates/index.php:27
msgid "Restore"
msgstr ""
#: templates/index.php:33
msgid "Deleted"
msgstr ""
#: templates/index.php:36 templates/index.php:37
msgid "Delete"
msgstr "Удалить"
#: templates/part.breadcrumb.php:9
msgid "Deleted Files"
msgstr ""
-43
View File
@@ -1,43 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-19 08:26-0400\n"
"PO-Revision-Date: 2013-10-18 09:15+0000\n"
"Last-Translator: masensio <masensio@solidgear.es>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/rollbackVersion.php:13
#, php-format
msgid "Could not revert: %s"
msgstr ""
#: js/versions.js:14
msgid "Versions"
msgstr ""
#: js/versions.js:60
msgid "Failed to revert {file} to revision {timestamp}."
msgstr ""
#: js/versions.js:86
msgid "More versions..."
msgstr ""
#: js/versions.js:123
msgid "No other versions available"
msgstr ""
#: js/versions.js:154
msgid "Restore"
msgstr ""
-341
View File
@@ -1,341 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-21 10:01-0500\n"
"PO-Revision-Date: 2013-11-21 15:01+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: private/app.php:243
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
#: private/app.php:255
msgid "No app name specified"
msgstr ""
#: private/app.php:360
msgid "Help"
msgstr "Помощь"
#: private/app.php:373
msgid "Personal"
msgstr ""
#: private/app.php:384
msgid "Settings"
msgstr "Настройки"
#: private/app.php:396
msgid "Users"
msgstr ""
#: private/app.php:409
msgid "Admin"
msgstr ""
#: private/app.php:873
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
#: private/avatar.php:60
msgid "Unknown filetype"
msgstr ""
#: private/avatar.php:65
msgid "Invalid image"
msgstr ""
#: private/defaults.php:36
msgid "web services under your control"
msgstr ""
#: private/files.php:66 private/files.php:98
#, php-format
msgid "cannot open \"%s\""
msgstr ""
#: private/files.php:228
msgid "ZIP download is turned off."
msgstr ""
#: private/files.php:229
msgid "Files need to be downloaded one by one."
msgstr ""
#: private/files.php:230 private/files.php:258
msgid "Back to Files"
msgstr ""
#: private/files.php:255
msgid "Selected files too large to generate zip file."
msgstr ""
#: private/files.php:256
msgid ""
"Please download the files separately in smaller chunks or kindly ask your "
"administrator."
msgstr ""
#: private/installer.php:63
msgid "No source specified when installing app"
msgstr ""
#: private/installer.php:70
msgid "No href specified when installing app from http"
msgstr ""
#: private/installer.php:75
msgid "No path specified when installing app from local file"
msgstr ""
#: private/installer.php:89
#, php-format
msgid "Archives of type %s are not supported"
msgstr ""
#: private/installer.php:103
msgid "Failed to open archive when installing app"
msgstr ""
#: private/installer.php:125
msgid "App does not provide an info.xml file"
msgstr ""
#: private/installer.php:131
msgid "App can't be installed because of not allowed code in the App"
msgstr ""
#: private/installer.php:140
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
msgstr ""
#: private/installer.php:146
msgid ""
"App can't be installed because it contains the <shipped>true</shipped> tag "
"which is not allowed for non shipped apps"
msgstr ""
#: private/installer.php:159
msgid ""
"App can't be installed because the version in info.xml/version is not the "
"same as the version reported from the app store"
msgstr ""
#: private/installer.php:169
msgid "App directory already exists"
msgstr ""
#: private/installer.php:182
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
msgstr ""
#: private/json.php:28
msgid "Application is not enabled"
msgstr ""
#: private/json.php:39 private/json.php:62 private/json.php:73
msgid "Authentication error"
msgstr ""
#: private/json.php:51
msgid "Token expired. Please reload page."
msgstr ""
#: private/search/provider/file.php:18 private/search/provider/file.php:36
msgid "Files"
msgstr "Файлы"
#: private/search/provider/file.php:27 private/search/provider/file.php:34
msgid "Text"
msgstr "Текст"
#: private/search/provider/file.php:30
msgid "Images"
msgstr ""
#: private/setup/abstractdatabase.php:22
#, php-format
msgid "%s enter the database username."
msgstr ""
#: private/setup/abstractdatabase.php:25
#, php-format
msgid "%s enter the database name."
msgstr ""
#: private/setup/abstractdatabase.php:28
#, php-format
msgid "%s you may not use dots in the database name"
msgstr ""
#: private/setup/mssql.php:20
#, php-format
msgid "MS SQL username and/or password not valid: %s"
msgstr ""
#: private/setup/mssql.php:21 private/setup/mysql.php:13
#: private/setup/oci.php:114 private/setup/postgresql.php:24
#: private/setup/postgresql.php:70
msgid "You need to enter either an existing account or the administrator."
msgstr ""
#: private/setup/mysql.php:12
msgid "MySQL username and/or password not valid"
msgstr ""
#: private/setup/mysql.php:67 private/setup/oci.php:54
#: private/setup/oci.php:121 private/setup/oci.php:147
#: private/setup/oci.php:154 private/setup/oci.php:165
#: private/setup/oci.php:172 private/setup/oci.php:181
#: private/setup/oci.php:189 private/setup/oci.php:198
#: private/setup/oci.php:204 private/setup/postgresql.php:89
#: private/setup/postgresql.php:98 private/setup/postgresql.php:115
#: private/setup/postgresql.php:125 private/setup/postgresql.php:134
#, php-format
msgid "DB Error: \"%s\""
msgstr ""
#: private/setup/mysql.php:68 private/setup/oci.php:55
#: private/setup/oci.php:122 private/setup/oci.php:148
#: private/setup/oci.php:155 private/setup/oci.php:166
#: private/setup/oci.php:182 private/setup/oci.php:190
#: private/setup/oci.php:199 private/setup/postgresql.php:90
#: private/setup/postgresql.php:99 private/setup/postgresql.php:116
#: private/setup/postgresql.php:126 private/setup/postgresql.php:135
#, php-format
msgid "Offending command was: \"%s\""
msgstr ""
#: private/setup/mysql.php:85
#, php-format
msgid "MySQL user '%s'@'localhost' exists already."
msgstr ""
#: private/setup/mysql.php:86
msgid "Drop this user from MySQL"
msgstr ""
#: private/setup/mysql.php:91
#, php-format
msgid "MySQL user '%s'@'%%' already exists"
msgstr ""
#: private/setup/mysql.php:92
msgid "Drop this user from MySQL."
msgstr ""
#: private/setup/oci.php:34
msgid "Oracle connection could not be established"
msgstr ""
#: private/setup/oci.php:41 private/setup/oci.php:113
msgid "Oracle username and/or password not valid"
msgstr ""
#: private/setup/oci.php:173 private/setup/oci.php:205
#, php-format
msgid "Offending command was: \"%s\", name: %s, password: %s"
msgstr ""
#: private/setup/postgresql.php:23 private/setup/postgresql.php:69
msgid "PostgreSQL username and/or password not valid"
msgstr ""
#: private/setup.php:28
msgid "Set an admin username."
msgstr ""
#: private/setup.php:31
msgid "Set an admin password."
msgstr ""
#: private/setup.php:195
msgid ""
"Your web server is not yet properly setup to allow files synchronization "
"because the WebDAV interface seems to be broken."
msgstr ""
#: private/setup.php:196
#, php-format
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr ""
#: private/tags.php:194
#, php-format
msgid "Could not find category \"%s\""
msgstr ""
#: private/template/functions.php:130
msgid "seconds ago"
msgstr ""
#: private/template/functions.php:131
msgid "%n minute ago"
msgid_plural "%n minutes ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: private/template/functions.php:132
msgid "%n hour ago"
msgid_plural "%n hours ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: private/template/functions.php:133
msgid "today"
msgstr ""
#: private/template/functions.php:134
msgid "yesterday"
msgstr ""
#: private/template/functions.php:136
msgid "%n day go"
msgid_plural "%n days ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: private/template/functions.php:138
msgid "last month"
msgstr ""
#: private/template/functions.php:139
msgid "%n month ago"
msgid_plural "%n months ago"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: private/template/functions.php:141
msgid "last year"
msgstr ""
#: private/template/functions.php:142
msgid "years ago"
msgstr ""
#: private/template.php:297 public/util.php:108
msgid "Caused by:"
msgstr ""
-657
View File
@@ -1,657 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-27 12:08-0500\n"
"PO-Revision-Date: 2013-11-27 17:09+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/apps/ocs.php:20
msgid "Unable to load list from App Store"
msgstr ""
#: ajax/changedisplayname.php:25 ajax/removeuser.php:15 ajax/setquota.php:17
#: ajax/togglegroups.php:20 changepassword/controller.php:55
msgid "Authentication error"
msgstr ""
#: ajax/changedisplayname.php:31
msgid "Your full name has been changed."
msgstr ""
#: ajax/changedisplayname.php:34
msgid "Unable to change full name"
msgstr ""
#: ajax/creategroup.php:10
msgid "Group already exists"
msgstr ""
#: ajax/creategroup.php:19
msgid "Unable to add group"
msgstr ""
#: ajax/lostpassword.php:12
msgid "Email saved"
msgstr ""
#: ajax/lostpassword.php:14
msgid "Invalid email"
msgstr ""
#: ajax/removegroup.php:13
msgid "Unable to delete group"
msgstr ""
#: ajax/removeuser.php:25
msgid "Unable to delete user"
msgstr ""
#: ajax/setlanguage.php:15
msgid "Language changed"
msgstr ""
#: ajax/setlanguage.php:17 ajax/setlanguage.php:20
msgid "Invalid request"
msgstr ""
#: ajax/togglegroups.php:12
msgid "Admins can't remove themself from the admin group"
msgstr ""
#: ajax/togglegroups.php:30
#, php-format
msgid "Unable to add user to group %s"
msgstr ""
#: ajax/togglegroups.php:36
#, php-format
msgid "Unable to remove user from group %s"
msgstr ""
#: ajax/updateapp.php:14
msgid "Couldn't update app."
msgstr ""
#: changepassword/controller.php:20
msgid "Wrong password"
msgstr ""
#: changepassword/controller.php:42
msgid "No user supplied"
msgstr ""
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
msgstr ""
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
msgstr ""
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
msgstr ""
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
msgstr ""
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr ""
#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr ""
#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr ""
#: js/apps.js:71
msgid "Please wait...."
msgstr ""
#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr ""
#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr ""
#: js/apps.js:125
msgid "Updating...."
msgstr ""
#: js/apps.js:128
msgid "Error while updating app"
msgstr ""
#: js/apps.js:128
msgid "Error"
msgstr "Ошибка"
#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr ""
#: js/apps.js:132
msgid "Updated"
msgstr ""
#: js/personal.js:220
msgid "Select a profile picture"
msgstr ""
#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
#: js/personal.js:287
msgid "Saving..."
msgstr ""
#: js/users.js:47
msgid "deleted"
msgstr ""
#: js/users.js:47
msgid "undo"
msgstr ""
#: js/users.js:79
msgid "Unable to remove user"
msgstr ""
#: js/users.js:95 templates/users.php:26 templates/users.php:90
#: templates/users.php:118
msgid "Groups"
msgstr ""
#: js/users.js:100 templates/users.php:92 templates/users.php:130
msgid "Group Admin"
msgstr ""
#: js/users.js:123 templates/users.php:170
msgid "Delete"
msgstr "Удалить"
#: js/users.js:284
msgid "add group"
msgstr ""
#: js/users.js:451
msgid "A valid username must be provided"
msgstr ""
#: js/users.js:452 js/users.js:458 js/users.js:473
msgid "Error creating user"
msgstr ""
#: js/users.js:457
msgid "A valid password must be provided"
msgstr ""
#: js/users.js:481
msgid "Warning: Home directory for user \"{user}\" already exists"
msgstr ""
#: personal.php:45 personal.php:46
msgid "__language_name__"
msgstr ""
#: templates/admin.php:8
msgid "Everything (fatal issues, errors, warnings, info, debug)"
msgstr ""
#: templates/admin.php:9
msgid "Info, warnings, errors and fatal issues"
msgstr ""
#: templates/admin.php:10
msgid "Warnings, errors and fatal issues"
msgstr ""
#: templates/admin.php:11
msgid "Errors and fatal issues"
msgstr ""
#: templates/admin.php:12
msgid "Fatal issues only"
msgstr ""
#: templates/admin.php:22 templates/admin.php:36
msgid "Security Warning"
msgstr ""
#: templates/admin.php:25
#, php-format
msgid ""
"You are accessing %s via HTTP. We strongly suggest you configure your server"
" to require using HTTPS instead."
msgstr ""
#: templates/admin.php:39
msgid ""
"Your data directory and your files are probably accessible from the "
"internet. The .htaccess file is not working. We strongly suggest that you "
"configure your webserver in a way that the data directory is no longer "
"accessible or you move the data directory outside the webserver document "
"root."
msgstr ""
#: templates/admin.php:50
msgid "Setup Warning"
msgstr ""
#: templates/admin.php:53
msgid ""
"Your web server is not yet properly setup to allow files synchronization "
"because the WebDAV interface seems to be broken."
msgstr ""
#: templates/admin.php:54
#, php-format
msgid "Please double check the <a href=\"%s\">installation guides</a>."
msgstr ""
#: templates/admin.php:65
msgid "Module 'fileinfo' missing"
msgstr ""
#: templates/admin.php:68
msgid ""
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this "
"module to get best results with mime-type detection."
msgstr ""
#: templates/admin.php:79
msgid "Locale not working"
msgstr ""
#: templates/admin.php:84
msgid "System locale can not be set to a one which supports UTF-8."
msgstr ""
#: templates/admin.php:88
msgid ""
"This means that there might be problems with certain characters in file "
"names."
msgstr ""
#: templates/admin.php:92
#, php-format
msgid ""
"We strongly suggest to install the required packages on your system to "
"support one of the following locales: %s."
msgstr ""
#: templates/admin.php:104
msgid "Internet connection not working"
msgstr ""
#: templates/admin.php:107
msgid ""
"This server has no working internet connection. This means that some of the "
"features like mounting of external storage, notifications about updates or "
"installation of 3rd party apps don´t work. Accessing files from remote and "
"sending of notification emails might also not work. We suggest to enable "
"internet connection for this server if you want to have all features."
msgstr ""
#: templates/admin.php:121
msgid "Cron"
msgstr ""
#: templates/admin.php:128
msgid "Execute one task with each page loaded"
msgstr ""
#: templates/admin.php:136
msgid ""
"cron.php is registered at a webcron service to call cron.php every 15 "
"minutes over http."
msgstr ""
#: templates/admin.php:144
msgid "Use systems cron service to call the cron.php file every 15 minutes."
msgstr ""
#: templates/admin.php:149
msgid "Sharing"
msgstr ""
#: templates/admin.php:155
msgid "Enable Share API"
msgstr ""
#: templates/admin.php:156
msgid "Allow apps to use the Share API"
msgstr ""
#: templates/admin.php:163
msgid "Allow links"
msgstr ""
#: templates/admin.php:164
msgid "Allow users to share items to the public with links"
msgstr ""
#: templates/admin.php:172
msgid "Allow public uploads"
msgstr ""
#: templates/admin.php:173
msgid ""
"Allow users to enable others to upload into their publicly shared folders"
msgstr ""
#: templates/admin.php:181
msgid "Allow resharing"
msgstr ""
#: templates/admin.php:182
msgid "Allow users to share items shared with them again"
msgstr ""
#: templates/admin.php:189
msgid "Allow users to share with anyone"
msgstr ""
#: templates/admin.php:192
msgid "Allow users to only share with users in their groups"
msgstr ""
#: templates/admin.php:199
msgid "Allow mail notification"
msgstr ""
#: templates/admin.php:200
msgid "Allow user to send mail notification for shared files"
msgstr ""
#: templates/admin.php:207
msgid "Security"
msgstr ""
#: templates/admin.php:220
msgid "Enforce HTTPS"
msgstr ""
#: templates/admin.php:222
#, php-format
msgid "Forces the clients to connect to %s via an encrypted connection."
msgstr ""
#: templates/admin.php:228
#, php-format
msgid ""
"Please connect to your %s via HTTPS to enable or disable the SSL "
"enforcement."
msgstr ""
#: templates/admin.php:240
msgid "Log"
msgstr ""
#: templates/admin.php:241
msgid "Log level"
msgstr ""
#: templates/admin.php:273
msgid "More"
msgstr "Подробнее"
#: templates/admin.php:274
msgid "Less"
msgstr ""
#: templates/admin.php:280 templates/personal.php:173
msgid "Version"
msgstr ""
#: templates/admin.php:284 templates/personal.php:176
msgid ""
"Developed by the <a href=\"http://ownCloud.org/contact\" "
"target=\"_blank\">ownCloud community</a>, the <a "
"href=\"https://github.com/owncloud\" target=\"_blank\">source code</a> is "
"licensed under the <a href=\"http://www.gnu.org/licenses/agpl-3.0.html\" "
"target=\"_blank\"><abbr title=\"Affero General Public "
"License\">AGPL</abbr></a>."
msgstr ""
#: templates/apps.php:13
msgid "Add your App"
msgstr ""
#: templates/apps.php:28
msgid "More Apps"
msgstr ""
#: templates/apps.php:33
msgid "Select an App"
msgstr ""
#: templates/apps.php:39
msgid "See application page at apps.owncloud.com"
msgstr ""
#: templates/apps.php:41
msgid "<span class=\"licence\"></span>-licensed by <span class=\"author\"></span>"
msgstr ""
#: templates/help.php:4
msgid "User Documentation"
msgstr ""
#: templates/help.php:6
msgid "Administrator Documentation"
msgstr ""
#: templates/help.php:9
msgid "Online Documentation"
msgstr ""
#: templates/help.php:11
msgid "Forum"
msgstr ""
#: templates/help.php:14
msgid "Bugtracker"
msgstr ""
#: templates/help.php:17
msgid "Commercial Support"
msgstr ""
#: templates/personal.php:8
msgid "Get the apps to sync your files"
msgstr ""
#: templates/personal.php:19
msgid "Show First Run Wizard again"
msgstr ""
#: templates/personal.php:27
#, php-format
msgid "You have used <strong>%s</strong> of the available <strong>%s</strong>"
msgstr ""
#: templates/personal.php:39 templates/users.php:23 templates/users.php:89
msgid "Password"
msgstr "Пароль"
#: templates/personal.php:40
msgid "Your password was changed"
msgstr ""
#: templates/personal.php:41
msgid "Unable to change your password"
msgstr ""
#: templates/personal.php:42
msgid "Current password"
msgstr ""
#: templates/personal.php:44
msgid "New password"
msgstr ""
#: templates/personal.php:46
msgid "Change password"
msgstr ""
#: templates/personal.php:58 templates/users.php:88
msgid "Full Name"
msgstr ""
#: templates/personal.php:73
msgid "Email"
msgstr ""
#: templates/personal.php:75
msgid "Your email address"
msgstr ""
#: templates/personal.php:76
msgid "Fill in an email address to enable password recovery"
msgstr ""
#: templates/personal.php:86
msgid "Profile picture"
msgstr ""
#: templates/personal.php:91
msgid "Upload new"
msgstr ""
#: templates/personal.php:93
msgid "Select new from Files"
msgstr ""
#: templates/personal.php:94
msgid "Remove image"
msgstr ""
#: templates/personal.php:95
msgid "Either png or jpg. Ideally square but you will be able to crop it."
msgstr ""
#: templates/personal.php:97
msgid "Your avatar is provided by your original account."
msgstr ""
#: templates/personal.php:101
msgid "Abort"
msgstr ""
#: templates/personal.php:102
msgid "Choose as profile image"
msgstr ""
#: templates/personal.php:110 templates/personal.php:111
msgid "Language"
msgstr ""
#: templates/personal.php:130
msgid "Help translate"
msgstr ""
#: templates/personal.php:137
msgid "WebDAV"
msgstr ""
#: templates/personal.php:139
#, php-format
msgid ""
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via "
"WebDAV</a>"
msgstr ""
#: templates/personal.php:150
msgid "Encryption"
msgstr ""
#: templates/personal.php:152
msgid "The encryption app is no longer enabled, please decrypt all your files"
msgstr ""
#: templates/personal.php:158
msgid "Log-in password"
msgstr ""
#: templates/personal.php:163
msgid "Decrypt all Files"
msgstr ""
#: templates/users.php:21
msgid "Login Name"
msgstr ""
#: templates/users.php:30
msgid "Create"
msgstr "Создать"
#: templates/users.php:36
msgid "Admin Recovery Password"
msgstr ""
#: templates/users.php:37 templates/users.php:38
msgid ""
"Enter the recovery password in order to recover the users files during "
"password change"
msgstr ""
#: templates/users.php:42
msgid "Default Storage"
msgstr ""
#: templates/users.php:44 templates/users.php:139
msgid "Please enter storage quota (ex: \"512 MB\" or \"12 GB\")"
msgstr ""
#: templates/users.php:48 templates/users.php:148
msgid "Unlimited"
msgstr ""
#: templates/users.php:66 templates/users.php:163
msgid "Other"
msgstr ""
#: templates/users.php:87
msgid "Username"
msgstr "Имя пользователя"
#: templates/users.php:94
msgid "Storage"
msgstr ""
#: templates/users.php:108
msgid "change full name"
msgstr ""
#: templates/users.php:112
msgid "set new password"
msgstr ""
#: templates/users.php:143
msgid "Default"
msgstr ""
-515
View File
@@ -1,515 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
"POT-Creation-Date: 2013-11-27 12:08-0500\n"
"PO-Revision-Date: 2013-11-27 17:09+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: ajax/clearMappings.php:34
msgid "Failed to clear the mappings."
msgstr ""
#: ajax/deleteConfiguration.php:34
msgid "Failed to delete the server configuration"
msgstr ""
#: ajax/testConfiguration.php:37
msgid "The configuration is valid and the connection could be established!"
msgstr ""
#: ajax/testConfiguration.php:40
msgid ""
"The configuration is valid, but the Bind failed. Please check the server "
"settings and credentials."
msgstr ""
#: ajax/testConfiguration.php:44
msgid ""
"The configuration is invalid. Please have a look at the logs for further "
"details."
msgstr ""
#: ajax/wizard.php:32
msgid "No action specified"
msgstr ""
#: ajax/wizard.php:38
msgid "No configuration specified"
msgstr ""
#: ajax/wizard.php:81
msgid "No data specified"
msgstr ""
#: ajax/wizard.php:89
#, php-format
msgid " Could not set configuration %s"
msgstr ""
#: js/settings.js:67
msgid "Deletion failed"
msgstr ""
#: js/settings.js:83
msgid "Take over settings from recent server configuration?"
msgstr ""
#: js/settings.js:84
msgid "Keep settings?"
msgstr ""
#: js/settings.js:99
msgid "Cannot add server configuration"
msgstr ""
#: js/settings.js:127
msgid "mappings cleared"
msgstr ""
#: js/settings.js:128
msgid "Success"
msgstr ""
#: js/settings.js:133
msgid "Error"
msgstr "Ошибка"
#: js/settings.js:777
msgid "Configuration OK"
msgstr ""
#: js/settings.js:786
msgid "Configuration incorrect"
msgstr ""
#: js/settings.js:795
msgid "Configuration incomplete"
msgstr ""
#: js/settings.js:812 js/settings.js:821
msgid "Select groups"
msgstr "Выбрать группы"
#: js/settings.js:815 js/settings.js:824
msgid "Select object classes"
msgstr ""
#: js/settings.js:818
msgid "Select attributes"
msgstr ""
#: js/settings.js:845
msgid "Connection test succeeded"
msgstr ""
#: js/settings.js:852
msgid "Connection test failed"
msgstr ""
#: js/settings.js:861
msgid "Do you really want to delete the current Server Configuration?"
msgstr ""
#: js/settings.js:862
msgid "Confirm Deletion"
msgstr ""
#: lib/wizard.php:79 lib/wizard.php:93
#, php-format
msgid "%s group found"
msgid_plural "%s groups found"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: lib/wizard.php:122
#, php-format
msgid "%s user found"
msgid_plural "%s users found"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: lib/wizard.php:779 lib/wizard.php:791
msgid "Invalid Host"
msgstr ""
#: lib/wizard.php:952
msgid "Could not find the desired feature"
msgstr ""
#: templates/part.settingcontrols.php:2
msgid "Save"
msgstr "Сохранить"
#: templates/part.settingcontrols.php:4
msgid "Test Configuration"
msgstr ""
#: templates/part.settingcontrols.php:10 templates/part.wizardcontrols.php:14
msgid "Help"
msgstr "Помощь"
#: templates/part.wizard-groupfilter.php:4
#, php-format
msgid "Limit the access to %s to groups meeting this criteria:"
msgstr ""
#: templates/part.wizard-groupfilter.php:8
#: templates/part.wizard-userfilter.php:8
msgid "only those object classes:"
msgstr ""
#: templates/part.wizard-groupfilter.php:17
#: templates/part.wizard-userfilter.php:17
msgid "only from those groups:"
msgstr ""
#: templates/part.wizard-groupfilter.php:25
#: templates/part.wizard-loginfilter.php:32
#: templates/part.wizard-userfilter.php:25
msgid "Edit raw filter instead"
msgstr ""
#: templates/part.wizard-groupfilter.php:30
#: templates/part.wizard-loginfilter.php:37
#: templates/part.wizard-userfilter.php:30
msgid "Raw LDAP filter"
msgstr ""
#: templates/part.wizard-groupfilter.php:31
#, php-format
msgid ""
"The filter specifies which LDAP groups shall have access to the %s instance."
msgstr ""
#: templates/part.wizard-groupfilter.php:38
msgid "groups found"
msgstr ""
#: templates/part.wizard-loginfilter.php:4
msgid "What attribute shall be used as login name:"
msgstr ""
#: templates/part.wizard-loginfilter.php:8
msgid "LDAP Username:"
msgstr ""
#: templates/part.wizard-loginfilter.php:16
msgid "LDAP Email Address:"
msgstr ""
#: templates/part.wizard-loginfilter.php:24
msgid "Other Attributes:"
msgstr ""
#: templates/part.wizard-loginfilter.php:38
#, php-format
msgid ""
"Defines the filter to apply, when login is attempted. %%uid replaces the "
"username in the login action. Example: \"uid=%%uid\""
msgstr ""
#: templates/part.wizard-server.php:18
msgid "Add Server Configuration"
msgstr ""
#: templates/part.wizard-server.php:30
msgid "Host"
msgstr ""
#: templates/part.wizard-server.php:31
msgid ""
"You can omit the protocol, except you require SSL. Then start with ldaps://"
msgstr ""
#: templates/part.wizard-server.php:36
msgid "Port"
msgstr ""
#: templates/part.wizard-server.php:44
msgid "User DN"
msgstr ""
#: templates/part.wizard-server.php:45
msgid ""
"The DN of the client user with which the bind shall be done, e.g. "
"uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password "
"empty."
msgstr ""
#: templates/part.wizard-server.php:52
msgid "Password"
msgstr "Пароль"
#: templates/part.wizard-server.php:53
msgid "For anonymous access, leave DN and Password empty."
msgstr ""
#: templates/part.wizard-server.php:60
msgid "One Base DN per line"
msgstr ""
#: templates/part.wizard-server.php:61
msgid "You can specify Base DN for users and groups in the Advanced tab"
msgstr ""
#: templates/part.wizard-userfilter.php:4
#, php-format
msgid "Limit the access to %s to users meeting this criteria:"
msgstr ""
#: templates/part.wizard-userfilter.php:31
#, php-format
msgid ""
"The filter specifies which LDAP users shall have access to the %s instance."
msgstr ""
#: templates/part.wizard-userfilter.php:38
msgid "users found"
msgstr ""
#: templates/part.wizardcontrols.php:5
msgid "Back"
msgstr "Назад"
#: templates/part.wizardcontrols.php:8
msgid "Continue"
msgstr ""
#: templates/settings.php:11
msgid ""
"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may"
" experience unexpected behavior. Please ask your system administrator to "
"disable one of them."
msgstr ""
#: templates/settings.php:14
msgid ""
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not "
"work. Please ask your system administrator to install it."
msgstr ""
#: templates/settings.php:20
msgid "Connection Settings"
msgstr ""
#: templates/settings.php:22
msgid "Configuration Active"
msgstr ""
#: templates/settings.php:22
msgid "When unchecked, this configuration will be skipped."
msgstr ""
#: templates/settings.php:23
msgid "Backup (Replica) Host"
msgstr ""
#: templates/settings.php:23
msgid ""
"Give an optional backup host. It must be a replica of the main LDAP/AD "
"server."
msgstr ""
#: templates/settings.php:24
msgid "Backup (Replica) Port"
msgstr ""
#: templates/settings.php:25
msgid "Disable Main Server"
msgstr ""
#: templates/settings.php:25
msgid "Only connect to the replica server."
msgstr ""
#: templates/settings.php:26
msgid "Case insensitve LDAP server (Windows)"
msgstr ""
#: templates/settings.php:27
msgid "Turn off SSL certificate validation."
msgstr ""
#: templates/settings.php:27
#, php-format
msgid ""
"Not recommended, use it for testing only! If connection only works with this"
" option, import the LDAP server's SSL certificate in your %s server."
msgstr ""
#: templates/settings.php:28
msgid "Cache Time-To-Live"
msgstr ""
#: templates/settings.php:28
msgid "in seconds. A change empties the cache."
msgstr ""
#: templates/settings.php:30
msgid "Directory Settings"
msgstr ""
#: templates/settings.php:32
msgid "User Display Name Field"
msgstr ""
#: templates/settings.php:32
msgid "The LDAP attribute to use to generate the user's display name."
msgstr ""
#: templates/settings.php:33
msgid "Base User Tree"
msgstr ""
#: templates/settings.php:33
msgid "One User Base DN per line"
msgstr ""
#: templates/settings.php:34
msgid "User Search Attributes"
msgstr ""
#: templates/settings.php:34 templates/settings.php:37
msgid "Optional; one attribute per line"
msgstr ""
#: templates/settings.php:35
msgid "Group Display Name Field"
msgstr ""
#: templates/settings.php:35
msgid "The LDAP attribute to use to generate the groups's display name."
msgstr ""
#: templates/settings.php:36
msgid "Base Group Tree"
msgstr ""
#: templates/settings.php:36
msgid "One Group Base DN per line"
msgstr ""
#: templates/settings.php:37
msgid "Group Search Attributes"
msgstr ""
#: templates/settings.php:38
msgid "Group-Member association"
msgstr ""
#: templates/settings.php:40
msgid "Special Attributes"
msgstr ""
#: templates/settings.php:42
msgid "Quota Field"
msgstr ""
#: templates/settings.php:43
msgid "Quota Default"
msgstr ""
#: templates/settings.php:43
msgid "in bytes"
msgstr ""
#: templates/settings.php:44
msgid "Email Field"
msgstr ""
#: templates/settings.php:45
msgid "User Home Folder Naming Rule"
msgstr ""
#: templates/settings.php:45
msgid ""
"Leave empty for user name (default). Otherwise, specify an LDAP/AD "
"attribute."
msgstr ""
#: templates/settings.php:51
msgid "Internal Username"
msgstr ""
#: templates/settings.php:52
msgid ""
"By default the internal username will be created from the UUID attribute. It"
" makes sure that the username is unique and characters do not need to be "
"converted. The internal username has the restriction that only these "
"characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced "
"with their ASCII correspondence or simply omitted. On collisions a number "
"will be added/increased. The internal username is used to identify a user "
"internally. It is also the default name for the user home folder. It is also"
" a part of remote URLs, for instance for all *DAV services. With this "
"setting, the default behavior can be overridden. To achieve a similar "
"behavior as before ownCloud 5 enter the user display name attribute in the "
"following field. Leave it empty for default behavior. Changes will have "
"effect only on newly mapped (added) LDAP users."
msgstr ""
#: templates/settings.php:53
msgid "Internal Username Attribute:"
msgstr ""
#: templates/settings.php:54
msgid "Override UUID detection"
msgstr ""
#: templates/settings.php:55
msgid ""
"By default, the UUID attribute is automatically detected. The UUID attribute"
" is used to doubtlessly identify LDAP users and groups. Also, the internal "
"username will be created based on the UUID, if not specified otherwise "
"above. You can override the setting and pass an attribute of your choice. "
"You must make sure that the attribute of your choice can be fetched for both"
" users and groups and it is unique. Leave it empty for default behavior. "
"Changes will have effect only on newly mapped (added) LDAP users and groups."
msgstr ""
#: templates/settings.php:56
msgid "UUID Attribute for Users:"
msgstr ""
#: templates/settings.php:57
msgid "UUID Attribute for Groups:"
msgstr ""
#: templates/settings.php:58
msgid "Username-LDAP User Mapping"
msgstr ""
#: templates/settings.php:59
msgid ""
"Usernames are used to store and assign (meta) data. In order to precisely "
"identify and recognize users, each LDAP user will have a internal username. "
"This requires a mapping from username to LDAP user. The created username is "
"mapped to the UUID of the LDAP user. Additionally the DN is cached as well "
"to reduce LDAP interaction, but it is not used for identification. If the DN"
" changes, the changes will be found. The internal username is used all over."
" Clearing the mappings will have leftovers everywhere. Clearing the mappings"
" is not configuration sensitive, it affects all LDAP configurations! Never "
"clear the mappings in a production environment, only in a testing or "
"experimental stage."
msgstr ""
#: templates/settings.php:60
msgid "Clear Username-LDAP User Mapping"
msgstr ""
#: templates/settings.php:60
msgid "Clear Groupname-LDAP Group Mapping"
msgstr ""
-36
View File
@@ -1,36 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
# AnnaSch <cdewqazxsqwe@gmail.com>, 2013
# AnnaSch <cdewqazxsqwe@gmail.com>, 2012
# skoptev <skoptev@ukr.net>, 2012
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
"POT-Creation-Date: 2013-10-19 08:26-0400\n"
"PO-Revision-Date: 2013-10-18 09:15+0000\n"
"Last-Translator: masensio <masensio@solidgear.es>\n"
"Language-Team: Russian (Russia) (http://www.transifex.com/projects/p/owncloud/language/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru_RU\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
#: templates/settings.php:3
msgid "WebDAV Authentication"
msgstr ""
#: templates/settings.php:4
msgid "Address: "
msgstr ""
#: templates/settings.php:7
msgid ""
"The user credentials will be sent to this address. This plugin checks the "
"response and will interpret the HTTP statuscodes 401 and 403 as invalid "
"credentials, and all other responses as valid credentials."
msgstr ""
+50 -49
View File
@@ -131,8 +131,8 @@ class OC {
OC::$THIRDPARTYROOT = rtrim(dirname(OC::$SERVERROOT), '/');
} else {
throw new Exception('3rdparty directory not found! Please put the ownCloud 3rdparty'
.' folder in the ownCloud folder or the folder above.'
.' You can also configure the location in the config.php file.');
. ' folder in the ownCloud folder or the folder above.'
. ' You can also configure the location in the config.php file.');
}
// search the apps folder
$config_paths = OC_Config::getValue('apps_paths', array());
@@ -156,7 +156,7 @@ class OC {
if (empty(OC::$APPSROOTS)) {
throw new Exception('apps directory not found! Please put the ownCloud apps folder in the ownCloud folder'
.' or the folder above. You can also configure the location in the config.php file.');
. ' or the folder above. You can also configure the location in the config.php file.');
}
$paths = array();
foreach (OC::$APPSROOTS as $path) {
@@ -176,7 +176,8 @@ class OC {
public static function checkConfig() {
if (file_exists(OC::$SERVERROOT . "/config/config.php")
and !is_writable(OC::$SERVERROOT . "/config/config.php")) {
and !is_writable(OC::$SERVERROOT . "/config/config.php")
) {
$defaults = new OC_Defaults();
if (self::$CLI) {
echo "Can't write into config directory!\n";
@@ -188,7 +189,7 @@ class OC {
OC_Template::printErrorPage(
"Can't write into config directory!",
'This can usually be fixed by '
.'<a href="' . \OC_Helper::linkToDocs('admin-dir_permissions') . '" target="_blank">giving the webserver write access to the config directory</a>.'
. '<a href="' . \OC_Helper::linkToDocs('admin-dir_permissions') . '" target="_blank">giving the webserver write access to the config directory</a>.'
);
}
}
@@ -254,30 +255,42 @@ class OC {
}
}
public static function checkUpgrade($showTemplate = true) {
/**
* check if the instance needs to preform an upgrade
*
* @return bool
*/
public static function needUpgrade() {
if (OC_Config::getValue('installed', false)) {
$installedVersion = OC_Config::getValue('version', '0.0.0');
$currentVersion = implode('.', OC_Util::getVersion());
if (version_compare($currentVersion, $installedVersion, '>')) {
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
OC_Config::setValue('theme', '');
$minimizerCSS = new OC_Minimizer_CSS();
$minimizerCSS->clearCache();
$minimizerJS = new OC_Minimizer_JS();
$minimizerJS->clearCache();
OC_Util::addScript('update');
$tmpl = new OC_Template('', 'update.admin', 'guest');
$tmpl->assign('version', OC_Util::getVersionString());
$tmpl->printPage();
exit();
} else {
return true;
}
}
return version_compare($currentVersion, $installedVersion, '>');
} else {
return false;
}
}
public static function checkUpgrade($showTemplate = true) {
if (self::needUpgrade()) {
if ($showTemplate && !OC_Config::getValue('maintenance', false)) {
OC_Config::setValue('theme', '');
$minimizerCSS = new OC_Minimizer_CSS();
$minimizerCSS->clearCache();
$minimizerJS = new OC_Minimizer_JS();
$minimizerJS->clearCache();
OC_Util::addScript('config'); // needed for web root
OC_Util::addScript('update');
$tmpl = new OC_Template('', 'update.admin', 'guest');
$tmpl->assign('version', OC_Util::getVersionString());
$tmpl->printPage();
exit();
} else {
return true;
}
}
return false;
}
public static function initTemplateEngine() {
// Add the stuff we need always
OC_Util::addScript("jquery-1.10.0.min");
@@ -461,7 +474,7 @@ class OC {
// OC_Util::getInstanceId() for namespacing. See #5409.
try {
self::$loader->setMemoryCache(\OC\Memcache\Factory::createLowLatency('Autoloader'));
} catch(\Exception $ex) {
} catch (\Exception $ex) {
}
}
OC_Util::isSetLocaleWorking();
@@ -506,7 +519,7 @@ class OC {
if (count($errors) > 0) {
if (self::$CLI) {
foreach ($errors as $error) {
echo $error['error']."\n";
echo $error['error'] . "\n";
echo $error['hint'] . "\n\n";
}
} else {
@@ -527,12 +540,12 @@ class OC {
OC_User::useBackend(new OC_User_Database());
OC_Group::useBackend(new OC_Group_Database());
if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('user_id')
&& $_SERVER['PHP_AUTH_USER'] != self::$session->get('user_id')) {
$sessionUser = self::$session->get('user_id');
if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('loginname')
&& $_SERVER['PHP_AUTH_USER'] !== self::$session->get('loginname')) {
$sessionUser = self::$session->get('loginname');
$serverUser = $_SERVER['PHP_AUTH_USER'];
OC_Log::write('core',
"Session user-id ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).",
"Session loginname ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).",
OC_Log::WARN);
OC_User::logout();
}
@@ -601,13 +614,9 @@ class OC {
* register hooks for the cache
*/
public static function registerCacheHooks() {
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
} catch (Exception $e) {
if (OC_Config::getValue('installed', false) && !self::needUpgrade()) { //don't try to do this before we are properly setup
\OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
}
// NOTE: This will be replaced to use OCP
$userSession = \OC_User::getUserSession();
$userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
@@ -618,14 +627,9 @@ class OC {
* register hooks for the cache
*/
public static function registerLogRotate() {
if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false)) {
if (OC_Config::getValue('installed', false) && OC_Config::getValue('log_rotate_size', false) && !self::needUpgrade()) {
//don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue("datadirectory", OC::$SERVERROOT.'/data').'/owncloud.log');
} catch (Exception $e) {
}
\OCP\BackgroundJob::registerJob('OC\Log\Rotate', OC_Config::getValue("datadirectory", OC::$SERVERROOT . '/data') . '/owncloud.log');
}
}
@@ -652,7 +656,7 @@ class OC {
* register hooks for sharing
*/
public static function registerShareHooks() {
if(\OC_Config::getValue('installed')) {
if (\OC_Config::getValue('installed')) {
OC_Hook::connect('OC_User', 'post_deleteUser', 'OCP\Share', 'post_deleteUser');
OC_Hook::connect('OC_User', 'post_addToGroup', 'OCP\Share', 'post_addToGroup');
OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OCP\Share', 'post_removeFromGroup');
@@ -675,7 +679,7 @@ class OC {
}
$request = OC_Request::getPathInfo();
if(substr($request, -3) !== '.js') {// we need these files during the upgrade
if (substr($request, -3) !== '.js') { // we need these files during the upgrade
self::checkMaintenanceMode();
self::checkUpgrade();
}
@@ -793,18 +797,16 @@ class OC {
// auth possible via apache module?
if (OC::tryApacheAuth()) {
$error[] = 'apacheauthfailed';
}
// remember was checked after last login
} // remember was checked after last login
elseif (OC::tryRememberLogin()) {
$error[] = 'invalidcookie';
}
// logon via web form
} // logon via web form
elseif (OC::tryFormLogin()) {
$error[] = 'invalidpassword';
if ( OC_Config::getValue('log_authfailip', false) ) {
OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:'.$_SERVER['REMOTE_ADDR'],
OC_Log::WARN);
} else {
} else {
OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:set log_authfailip=true in conf',
OC_Log::WARN);
}
@@ -866,7 +868,6 @@ class OC {
OC_User::setMagicInCookie($_COOKIE['oc_username'], $token);
// login
OC_User::setUserId($_COOKIE['oc_username']);
OC_User::setDisplayName($_COOKIE['oc_username'], $_COOKIE['display_name']);
OC_Util::redirectToDefaultPage();
// doesn't return
}
-12
View File
@@ -1,12 +0,0 @@
<?php
$TRANSLATIONS = array(
"Help" => "Помощь",
"Settings" => "Настройки",
"Files" => "Файлы",
"Text" => "Текст",
"_%n minute ago_::_%n minutes ago_" => array("","",""),
"_%n hour ago_::_%n hours ago_" => array("","",""),
"_%n day go_::_%n days ago_" => array("","",""),
"_%n month ago_::_%n months ago_" => array("","","")
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
+17 -7
View File
@@ -4,7 +4,7 @@
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*
*
*/
namespace OC;
@@ -15,6 +15,7 @@ namespace OC;
class AllConfig implements \OCP\IConfig {
/**
* Sets a new system wide value
*
* @param string $key the key of the value, under which will be saved
* @param string $value the value that should be stored
* @todo need a use case for this
@@ -25,16 +26,19 @@ class AllConfig implements \OCP\IConfig {
/**
* Looks up a system wide defined value
*
* @param string $key the key of the value, under which it was saved
* @param string $default the default value to be returned if the value isn't set
* @return string the saved value
*/
public function getSystemValue($key) {
return \OCP\Config::getSystemValue($key, '');
public function getSystemValue($key, $default = '') {
return \OCP\Config::getSystemValue($key, $default);
}
/**
* Writes a new app wide value
*
* @param string $appName the appName that we want to store the value under
* @param string $key the key of the value, under which will be saved
* @param string $value the value that should be stored
@@ -45,17 +49,20 @@ class AllConfig implements \OCP\IConfig {
/**
* Looks up an app wide defined value
*
* @param string $appName the appName that we stored the value under
* @param string $key the key of the value, under which it was saved
* @param string $default the default value to be returned if the value isn't set
* @return string the saved value
*/
public function getAppValue($appName, $key) {
return \OCP\Config::getAppValue($appName, $key, '');
public function getAppValue($appName, $key, $default = '') {
return \OCP\Config::getAppValue($appName, $key, $default);
}
/**
* Set a user defined value
*
* @param string $userId the userId of the user that we want to store the value under
* @param string $appName the appName that we want to store the value under
* @param string $key the key under which the value is being stored
@@ -67,11 +74,14 @@ class AllConfig implements \OCP\IConfig {
/**
* Shortcut for getting a user defined value
*
* @param string $userId the userId of the user that we want to store the value under
* @param string $appName the appName that we stored the value under
* @param string $key the key under which the value is being stored
* @param string $default the default value to be returned if the value isn't set
* @return string
*/
public function getUserValue($userId, $appName, $key){
return \OCP\Config::getUserValue($userId, $appName, $key);
public function getUserValue($userId, $appName, $key, $default = '') {
return \OCP\Config::getUserValue($userId, $appName, $key, $default);
}
}
+22 -20
View File
@@ -33,7 +33,7 @@ class OC_API {
const USER_AUTH = 1;
const SUBADMIN_AUTH = 2;
const ADMIN_AUTH = 3;
/**
* API Response Codes
*/
@@ -41,13 +41,13 @@ class OC_API {
const RESPOND_SERVER_ERROR = 996;
const RESPOND_NOT_FOUND = 998;
const RESPOND_UNKNOWN_ERROR = 999;
/**
* api actions
*/
protected static $actions = array();
private static $logoutRequired = false;
/**
* registers an api call
* @param string $method the http method
@@ -58,7 +58,7 @@ class OC_API {
* @param array $defaults
* @param array $requirements
*/
public static function register($method, $url, $action, $app,
public static function register($method, $url, $action, $app,
$authLevel = OC_API::USER_AUTH,
$defaults = array(),
$requirements = array()) {
@@ -75,7 +75,7 @@ class OC_API {
}
self::$actions[$name][] = array('app' => $app, 'action' => $action, 'authlevel' => $authLevel);
}
/**
* handles an api call
* @param array $parameters
@@ -125,7 +125,7 @@ class OC_API {
self::respond($response, $format);
}
/**
* merge the returned result objects into one response
* @param array $responses
@@ -166,32 +166,31 @@ class OC_API {
// Maybe any that are not OC_API::RESPOND_SERVER_ERROR
// Merge failed responses if more than one
$data = array();
$meta = array();
foreach($shipped['failed'] as $failure) {
$data = array_merge_recursive($data, $failure['response']->getData());
}
$picked = reset($shipped['failed']);
$code = $picked['response']->getStatusCode();
$response = new OC_OCS_Result($data, $code);
$meta = $picked['response']->getMeta();
$response = new OC_OCS_Result($data, $code, $meta['message']);
return $response;
} elseif(!empty($shipped['succeeded'])) {
$responses = array_merge($shipped['succeeded'], $thirdparty['succeeded']);
} elseif(!empty($thirdparty['failed'])) {
// Merge failed responses if more than one
$data = array();
$meta = array();
foreach($thirdparty['failed'] as $failure) {
$data = array_merge_recursive($data, $failure['response']->getData());
}
$picked = reset($thirdparty['failed']);
$code = $picked['response']->getStatusCode();
$response = new OC_OCS_Result($data, $code);
$meta = $picked['response']->getMeta();
$response = new OC_OCS_Result($data, $code, $meta['message']);
return $response;
} else {
$responses = $thirdparty['succeeded'];
}
// Merge the successful responses
$meta = array();
$data = array();
foreach($responses as $app => $response) {
@@ -200,22 +199,25 @@ class OC_API {
} else {
$data = array_merge_recursive($data, $response['response']->getData());
}
$codes[] = $response['response']->getStatusCode();
$codes[] = array('code' => $response['response']->getStatusCode(),
'meta' => $response['response']->getMeta());
}
// Use any non 100 status codes
$statusCode = 100;
$statusMessage = null;
foreach($codes as $code) {
if($code != 100) {
$statusCode = $code;
if($code['code'] != 100) {
$statusCode = $code['code'];
$statusMessage = $code['meta']['message'];
break;
}
}
$result = new OC_OCS_Result($data, $statusCode);
$result = new OC_OCS_Result($data, $statusCode, $statusMessage);
return $result;
}
/**
* authenticate the api call
* @param array $action the action details as supplied to OC_API::register()
@@ -261,8 +263,8 @@ class OC_API {
return false;
break;
}
}
}
/**
* http basic auth
* @return string|false (username, or false on failure)
@@ -294,7 +296,7 @@ class OC_API {
return false;
}
/**
* respond to a call
* @param OC_OCS_Result $result
@@ -343,5 +345,5 @@ class OC_API {
}
}
}
}
+21 -2
View File
@@ -9,16 +9,35 @@
namespace OC\BackgroundJob;
abstract class Job {
/**
* @var int $id
*/
protected $id;
/**
* @var int $lastRun
*/
protected $lastRun;
/**
* @var mixed $argument
*/
protected $argument;
/**
* @param JobList $jobList
* @param \OC\Log $logger
*/
public function execute($jobList) {
public function execute($jobList, $logger = null) {
$jobList->setLastRun($this);
$this->run($this->argument);
try {
$this->run($this->argument);
} catch (\Exception $e) {
if ($logger) {
$logger->error('Error while running background job: ' . $e->getMessage());
}
$jobList->remove($this, $this->argument);
}
}
abstract protected function run($argument);
+3 -2
View File
@@ -20,9 +20,10 @@ abstract class QueuedJob extends Job {
* run the job, then remove it from the joblist
*
* @param JobList $jobList
* @param \OC\Log $logger
*/
public function execute($jobList) {
public function execute($jobList, $logger = null) {
$jobList->remove($this);
$this->run($this->argument);
parent::execute($jobList, $logger);
}
}
+3 -3
View File
@@ -31,11 +31,11 @@ abstract class TimedJob extends Job {
* run the job if
*
* @param JobList $jobList
* @param \OC\Log $logger
*/
public function execute($jobList) {
public function execute($jobList, $logger = null) {
if ((time() - $this->lastRun) > $this->interval) {
$jobList->setLastRun($this);
$this->run($this->argument);
parent::execute($jobList, $logger);
}
}
}
+5 -2
View File
@@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
}
// mark file as partial while uploading (ignored by the scanner)
$partpath = $this->path . '.part';
$partpath = $this->path . '.ocTransferId' . rand() . '.part';
// if file is located in /Shared we write the part file to the users
// root folder because we can't create new files in /shared
@@ -242,7 +242,10 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
$fileExists = $fs->file_exists($targetPath);
if ($renameOkay === false || $fileExists === false) {
\OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
$fs->unlink($targetPath);
// only delete if an error occurred and the target file was already created
if ($fileExists) {
$fs->unlink($targetPath);
}
throw new Sabre_DAV_Exception();
}
+3
View File
@@ -101,6 +101,9 @@ class OC_DB {
);
$connectionParams['adapter'] = '\OC\DB\Adapter';
$connectionParams['wrapperClass'] = 'OC\DB\Connection';
// Send "SET NAMES utf8". Only required on PHP 5.3 below 5.3.6.
// See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names#4361485
$eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit);
break;
case 'pgsql':
$connectionParams = array(
+11 -2
View File
@@ -176,13 +176,22 @@ class MDB2SchemaReader {
$options['default'] = $default;
break;
case 'comments':
$comment = (string)$child;
$options['comment'] = $comment;
//FIXME for now we ignore comments https://github.com/doctrine/dbal/pull/407
//$comment = (string)$child;
//$options['comment'] = $comment;
break;
case 'primary':
$primary = $this->asBool($child);
$options['primary'] = $primary;
break;
case 'precision':
$precision = (string)$child;
$options['precision'] = $precision;
break;
case 'scale':
$scale = (string)$child;
$options['scale'] = $scale;
break;
default:
throw new \DomainException('Unknown element: ' . $child->getName());
+4 -6
View File
@@ -109,15 +109,13 @@ class OC_Files {
$zip = false;
$filename = $dir . '/' . $files;
$name = $files;
if ($xsendfile && OC_App::isEnabled('files_encryption')) {
$xsendfile = false;
}
}
OC_Util::obEnd();
if ($zip or \OC\Files\Filesystem::isReadable($filename)) {
if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) {
header( 'Content-Disposition: attachment; filename="' . rawurlencode($name) . '"' );
} else {
header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($name)
. '; filename="' . rawurlencode($name) . '"' );
}
OC_Response::setContentDispositionHeader($name, 'attachment');
header('Content-Transfer-Encoding: binary');
OC_Response::disableCaching();
if ($zip) {
+20 -4
View File
@@ -178,6 +178,10 @@ class Cache {
if ($file['storage_mtime'] == 0) {
$file['storage_mtime'] = $file['mtime'];
}
if ($file['encrypted'] or ($file['unencrypted_size'] > 0 and $file['mimetype'] === 'httpd/unix-directory')) {
$file['encrypted_size'] = $file['size'];
$file['size'] = $file['unencrypted_size'];
}
}
return $files;
} else {
@@ -507,22 +511,34 @@ class Cache {
$entry = $this->get($path);
if ($entry && $entry['mimetype'] === 'httpd/unix-directory') {
$id = $entry['fileid'];
$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2 FROM `*PREFIX*filecache` '.
$sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' .
'SUM(`unencrypted_size`) AS f3 ' .
'FROM `*PREFIX*filecache` ' .
'WHERE `parent` = ? AND `storage` = ?';
$result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId()));
if ($row = $result->fetchRow()) {
list($sum, $min) = array_values($row);
list($sum, $min, $unencryptedSum) = array_values($row);
$sum = (int)$sum;
$min = (int)$min;
$unencryptedSum = (int)$unencryptedSum;
if ($min === -1) {
$totalSize = $min;
} else {
$totalSize = $sum;
}
$update = array();
if ($entry['size'] !== $totalSize) {
$this->update($id, array('size' => $totalSize));
$update['size'] = $totalSize;
}
if ($entry['unencrypted_size'] !== $unencryptedSum) {
$update['unencrypted_size'] = $unencryptedSum;
}
if (count($update) > 0) {
$this->update($id, $update);
}
if ($totalSize !== -1 and $unencryptedSum > 0) {
$totalSize = $unencryptedSum;
}
}
}
return $totalSize;
+1 -1
View File
@@ -16,7 +16,7 @@ class HomeCache extends Cache {
* @return int
*/
public function calculateFolderSize($path) {
if ($path !== '/' and $path !== '') {
if ($path !== '/' and $path !== '' and $path !== 'files') {
return parent::calculateFolderSize($path);
}

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