From 4da67b0a08272ecb6a99a04d6b16ba784f4791da Mon Sep 17 00:00:00 2001 From: Sam Tuke Date: Wed, 10 Oct 2012 18:40:59 +0100 Subject: Development snapshot; encryption stream wrapper now successfully writes files, and passes unit tests --- lib/filesystemview.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/filesystemview.php') diff --git a/lib/filesystemview.php b/lib/filesystemview.php index 448663bb081..893305e3470 100644 --- a/lib/filesystemview.php +++ b/lib/filesystemview.php @@ -38,6 +38,9 @@ * OC_Filestorage object */ + /** + * @note default root (if $root is empty or '/') is /data/[user]/ + */ class OC_FilesystemView { private $fakeRoot=''; private $internal_path_cache=array(); -- cgit v1.2.3 From 8b01286a5d14bae90607d5192c89b5f9d72d8bc2 Mon Sep 17 00:00:00 2001 From: Sam Tuke Date: Tue, 16 Oct 2012 16:57:07 +0100 Subject: Merged branch 'master' --- .gitignore | 2 + .tx/config | 182 - 3rdparty/Archive/Tar.php | 83 +- 3rdparty/MDB2/Driver/Datatype/Common.php | 2 +- 3rdparty/MDB2/Driver/Datatype/oci8.php | 499 + 3rdparty/MDB2/Driver/Function/oci8.php | 187 + 3rdparty/MDB2/Driver/Manager/oci8.php | 1340 + 3rdparty/MDB2/Driver/Native/oci8.php | 60 + 3rdparty/MDB2/Driver/Reverse/oci8.php | 625 + 3rdparty/MDB2/Driver/mysql.php | 2 +- 3rdparty/MDB2/Driver/oci8.php | 1700 + 3rdparty/Sabre.includes.php | 0 3rdparty/Sabre/CalDAV/Backend/Abstract.php | 0 3rdparty/Sabre/CalDAV/Backend/PDO.php | 0 3rdparty/Sabre/CalDAV/Calendar.php | 0 3rdparty/Sabre/CalDAV/CalendarObject.php | 0 3rdparty/Sabre/CalDAV/CalendarQueryParser.php | 0 3rdparty/Sabre/CalDAV/CalendarQueryValidator.php | 39 +- 3rdparty/Sabre/CalDAV/CalendarRootNode.php | 0 3rdparty/Sabre/CalDAV/ICSExportPlugin.php | 0 3rdparty/Sabre/CalDAV/ICalendar.php | 0 3rdparty/Sabre/CalDAV/ICalendarObject.php | 0 3rdparty/Sabre/CalDAV/Plugin.php | 146 +- 3rdparty/Sabre/CalDAV/Principal/Collection.php | 0 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php | 0 3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php | 0 3rdparty/Sabre/CalDAV/Principal/User.php | 0 .../Property/SupportedCalendarComponentSet.php | 0 .../CalDAV/Property/SupportedCalendarData.php | 0 .../CalDAV/Property/SupportedCollationSet.php | 0 3rdparty/Sabre/CalDAV/Schedule/IMip.php | 0 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php | 0 3rdparty/Sabre/CalDAV/Schedule/Outbox.php | 0 3rdparty/Sabre/CalDAV/Server.php | 0 3rdparty/Sabre/CalDAV/UserCalendars.php | 0 3rdparty/Sabre/CalDAV/Version.php | 2 +- 3rdparty/Sabre/CalDAV/includes.php | 0 3rdparty/Sabre/CardDAV/AddressBook.php | 4 +- 3rdparty/Sabre/CardDAV/AddressBookQueryParser.php | 18 +- 3rdparty/Sabre/CardDAV/AddressBookRoot.php | 0 3rdparty/Sabre/CardDAV/Backend/Abstract.php | 0 3rdparty/Sabre/CardDAV/Backend/PDO.php | 0 3rdparty/Sabre/CardDAV/Card.php | 0 3rdparty/Sabre/CardDAV/IAddressBook.php | 0 3rdparty/Sabre/CardDAV/ICard.php | 0 3rdparty/Sabre/CardDAV/IDirectory.php | 0 3rdparty/Sabre/CardDAV/Plugin.php | 84 +- .../CardDAV/Property/SupportedAddressData.php | 0 3rdparty/Sabre/CardDAV/UserAddressBooks.php | 0 3rdparty/Sabre/CardDAV/Version.php | 2 +- 3rdparty/Sabre/CardDAV/includes.php | 0 3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php | 0 3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php | 0 3rdparty/Sabre/DAV/Auth/Backend/Apache.php | 0 3rdparty/Sabre/DAV/Auth/Backend/File.php | 0 3rdparty/Sabre/DAV/Auth/Backend/PDO.php | 0 3rdparty/Sabre/DAV/Auth/IBackend.php | 0 3rdparty/Sabre/DAV/Auth/Plugin.php | 0 3rdparty/Sabre/DAV/Browser/GuessContentType.php | 0 3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php | 0 3rdparty/Sabre/DAV/Browser/Plugin.php | 0 3rdparty/Sabre/DAV/Browser/assets/favicon.ico | Bin .../Sabre/DAV/Browser/assets/icons/addressbook.png | Bin .../Sabre/DAV/Browser/assets/icons/calendar.png | Bin 3rdparty/Sabre/DAV/Browser/assets/icons/card.png | Bin .../Sabre/DAV/Browser/assets/icons/collection.png | Bin 3rdparty/Sabre/DAV/Browser/assets/icons/file.png | Bin 3rdparty/Sabre/DAV/Browser/assets/icons/parent.png | Bin .../Sabre/DAV/Browser/assets/icons/principal.png | Bin 3rdparty/Sabre/DAV/Client.php | 49 +- 3rdparty/Sabre/DAV/Collection.php | 0 3rdparty/Sabre/DAV/Directory.php | 0 3rdparty/Sabre/DAV/Exception.php | 0 3rdparty/Sabre/DAV/Exception/BadRequest.php | 0 3rdparty/Sabre/DAV/Exception/Conflict.php | 0 3rdparty/Sabre/DAV/Exception/ConflictingLock.php | 0 3rdparty/Sabre/DAV/Exception/FileNotFound.php | 0 3rdparty/Sabre/DAV/Exception/Forbidden.php | 0 .../Sabre/DAV/Exception/InsufficientStorage.php | 0 .../Sabre/DAV/Exception/InvalidResourceType.php | 0 .../DAV/Exception/LockTokenMatchesRequestUri.php | 0 3rdparty/Sabre/DAV/Exception/Locked.php | 0 3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php | 0 3rdparty/Sabre/DAV/Exception/NotAuthenticated.php | 0 3rdparty/Sabre/DAV/Exception/NotFound.php | 0 3rdparty/Sabre/DAV/Exception/NotImplemented.php | 0 3rdparty/Sabre/DAV/Exception/PaymentRequired.php | 0 .../Sabre/DAV/Exception/PreconditionFailed.php | 0 .../Sabre/DAV/Exception/ReportNotImplemented.php | 0 .../DAV/Exception/RequestedRangeNotSatisfiable.php | 0 .../Sabre/DAV/Exception/UnsupportedMediaType.php | 0 3rdparty/Sabre/DAV/FS/Directory.php | 0 3rdparty/Sabre/DAV/FS/File.php | 0 3rdparty/Sabre/DAV/FS/Node.php | 0 3rdparty/Sabre/DAV/FSExt/Directory.php | 0 3rdparty/Sabre/DAV/FSExt/File.php | 0 3rdparty/Sabre/DAV/FSExt/Node.php | 0 3rdparty/Sabre/DAV/File.php | 0 3rdparty/Sabre/DAV/ICollection.php | 0 3rdparty/Sabre/DAV/IExtendedCollection.php | 0 3rdparty/Sabre/DAV/IFile.php | 0 3rdparty/Sabre/DAV/INode.php | 0 3rdparty/Sabre/DAV/IProperties.php | 0 3rdparty/Sabre/DAV/IQuota.php | 0 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php | 0 3rdparty/Sabre/DAV/Locks/Backend/FS.php | 0 3rdparty/Sabre/DAV/Locks/Backend/File.php | 0 3rdparty/Sabre/DAV/Locks/Backend/PDO.php | 0 3rdparty/Sabre/DAV/Locks/LockInfo.php | 0 3rdparty/Sabre/DAV/Locks/Plugin.php | 5 +- 3rdparty/Sabre/DAV/Mount/Plugin.php | 0 3rdparty/Sabre/DAV/Node.php | 0 3rdparty/Sabre/DAV/ObjectTree.php | 0 3rdparty/Sabre/DAV/Property.php | 0 3rdparty/Sabre/DAV/Property/GetLastModified.php | 0 3rdparty/Sabre/DAV/Property/Href.php | 0 3rdparty/Sabre/DAV/Property/HrefList.php | 0 3rdparty/Sabre/DAV/Property/IHref.php | 0 3rdparty/Sabre/DAV/Property/LockDiscovery.php | 0 3rdparty/Sabre/DAV/Property/ResourceType.php | 0 3rdparty/Sabre/DAV/Property/Response.php | 0 3rdparty/Sabre/DAV/Property/ResponseList.php | 0 3rdparty/Sabre/DAV/Property/SupportedLock.php | 0 3rdparty/Sabre/DAV/Property/SupportedReportSet.php | 0 3rdparty/Sabre/DAV/Server.php | 9 +- 3rdparty/Sabre/DAV/ServerPlugin.php | 0 3rdparty/Sabre/DAV/SimpleCollection.php | 0 3rdparty/Sabre/DAV/SimpleDirectory.php | 0 3rdparty/Sabre/DAV/SimpleFile.php | 0 3rdparty/Sabre/DAV/StringUtil.php | 0 3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php | 0 3rdparty/Sabre/DAV/Tree.php | 0 3rdparty/Sabre/DAV/Tree/Filesystem.php | 4 +- 3rdparty/Sabre/DAV/URLUtil.php | 0 3rdparty/Sabre/DAV/UUIDUtil.php | 0 3rdparty/Sabre/DAV/Version.php | 2 +- 3rdparty/Sabre/DAV/XMLUtil.php | 0 3rdparty/Sabre/DAV/includes.php | 0 .../Sabre/DAVACL/AbstractPrincipalCollection.php | 0 3rdparty/Sabre/DAVACL/Exception/AceConflict.php | 0 3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php | 0 3rdparty/Sabre/DAVACL/Exception/NoAbstract.php | 0 .../DAVACL/Exception/NotRecognizedPrincipal.php | 0 .../DAVACL/Exception/NotSupportedPrivilege.php | 0 3rdparty/Sabre/DAVACL/IACL.php | 0 3rdparty/Sabre/DAVACL/IPrincipal.php | 0 3rdparty/Sabre/DAVACL/IPrincipalBackend.php | 0 3rdparty/Sabre/DAVACL/Plugin.php | 0 3rdparty/Sabre/DAVACL/Principal.php | 0 3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php | 0 3rdparty/Sabre/DAVACL/PrincipalCollection.php | 0 3rdparty/Sabre/DAVACL/Property/Acl.php | 0 3rdparty/Sabre/DAVACL/Property/AclRestrictions.php | 0 .../DAVACL/Property/CurrentUserPrivilegeSet.php | 0 3rdparty/Sabre/DAVACL/Property/Principal.php | 0 .../DAVACL/Property/SupportedPrivilegeSet.php | 0 3rdparty/Sabre/DAVACL/Version.php | 0 3rdparty/Sabre/DAVACL/includes.php | 0 3rdparty/Sabre/HTTP/AWSAuth.php | 0 3rdparty/Sabre/HTTP/AbstractAuth.php | 0 3rdparty/Sabre/HTTP/BasicAuth.php | 2 +- 3rdparty/Sabre/HTTP/DigestAuth.php | 0 3rdparty/Sabre/HTTP/Request.php | 0 3rdparty/Sabre/HTTP/Response.php | 0 3rdparty/Sabre/HTTP/Util.php | 0 3rdparty/Sabre/HTTP/Version.php | 2 +- 3rdparty/Sabre/HTTP/includes.php | 0 3rdparty/Sabre/VObject/Component.php | 0 3rdparty/Sabre/VObject/Component/VAlarm.php | 0 3rdparty/Sabre/VObject/Component/VCalendar.php | 0 3rdparty/Sabre/VObject/Component/VEvent.php | 15 +- 3rdparty/Sabre/VObject/Component/VJournal.php | 0 3rdparty/Sabre/VObject/Component/VTodo.php | 0 3rdparty/Sabre/VObject/DateTimeParser.php | 4 + 3rdparty/Sabre/VObject/Element.php | 0 3rdparty/Sabre/VObject/Element/DateTime.php | 0 3rdparty/Sabre/VObject/Element/MultiDateTime.php | 0 3rdparty/Sabre/VObject/ElementList.php | 0 3rdparty/Sabre/VObject/FreeBusyGenerator.php | 0 3rdparty/Sabre/VObject/Node.php | 0 3rdparty/Sabre/VObject/Parameter.php | 0 3rdparty/Sabre/VObject/ParseException.php | 0 3rdparty/Sabre/VObject/Property.php | 0 3rdparty/Sabre/VObject/Property/DateTime.php | 0 3rdparty/Sabre/VObject/Property/MultiDateTime.php | 0 3rdparty/Sabre/VObject/Reader.php | 0 3rdparty/Sabre/VObject/RecurrenceIterator.php | 40 +- 3rdparty/Sabre/VObject/Version.php | 2 +- 3rdparty/Sabre/VObject/WindowsTimezoneMap.php | 0 3rdparty/Sabre/VObject/includes.php | 0 3rdparty/Sabre/autoload.php | 0 3rdparty/class.phpmailer.php | 123 +- 3rdparty/class.smtp.php | 11 +- 3rdparty/css/chosen-sprite.png | Bin 742 -> 559 bytes 3rdparty/css/chosen.css | 259 +- 3rdparty/css/chosen/chosen.css | 206 +- 3rdparty/fullcalendar/css/fullcalendar.css | 4 +- 3rdparty/fullcalendar/css/fullcalendar.print.css | 4 +- 3rdparty/fullcalendar/js/fullcalendar.js | 38 +- 3rdparty/fullcalendar/js/fullcalendar.min.js | 14 +- 3rdparty/fullcalendar/js/gcal.js | 4 +- 3rdparty/js/chosen/VERSION | 2 +- 3rdparty/js/chosen/chosen.jquery.js | 741 +- 3rdparty/js/chosen/chosen.jquery.min.js | 4 +- 3rdparty/miniColors/GPL-LICENSE.txt | 278 + 3rdparty/miniColors/MIT-LICENSE.txt | 20 + 3rdparty/miniColors/css/images/colors.png | Bin 0 -> 12973 bytes 3rdparty/miniColors/css/images/trigger.png | Bin 0 -> 706 bytes 3rdparty/miniColors/css/jquery.miniColors.css | 125 + 3rdparty/miniColors/js/jquery.miniColors.js | 710 + 3rdparty/miniColors/js/jquery.miniColors.min.js | 9 + 3rdparty/openid/class.openid.v3.php | 326 + 3rdparty/openid/phpmyid.php | 1707 + 3rdparty/php-cloudfiles/cloudfiles.php | 4 +- .../simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE | 399 - 3rdparty/simpletest/LICENSE | 502 - 3rdparty/simpletest/README | 102 - 3rdparty/simpletest/VERSION | 1 - 3rdparty/simpletest/arguments.php | 224 - 3rdparty/simpletest/authentication.php | 237 - 3rdparty/simpletest/autorun.php | 101 - 3rdparty/simpletest/browser.php | 1144 - 3rdparty/simpletest/collector.php | 122 - 3rdparty/simpletest/compatibility.php | 166 - 3rdparty/simpletest/cookies.php | 380 - 3rdparty/simpletest/default_reporter.php | 163 - 3rdparty/simpletest/detached.php | 96 - .../docs/en/authentication_documentation.html | 378 - .../simpletest/docs/en/browser_documentation.html | 501 - 3rdparty/simpletest/docs/en/docs.css | 121 - .../docs/en/expectation_documentation.html | 476 - .../docs/en/form_testing_documentation.html | 351 - .../docs/en/group_test_documentation.html | 252 - 3rdparty/simpletest/docs/en/index.html | 542 - .../docs/en/mock_objects_documentation.html | 870 - 3rdparty/simpletest/docs/en/overview.html | 487 - .../docs/en/partial_mocks_documentation.html | 457 - .../simpletest/docs/en/reporter_documentation.html | 616 - .../docs/en/unit_test_documentation.html | 442 - .../docs/en/web_tester_documentation.html | 588 - .../docs/fr/authentication_documentation.html | 372 - .../simpletest/docs/fr/browser_documentation.html | 500 - 3rdparty/simpletest/docs/fr/docs.css | 84 - .../docs/fr/expectation_documentation.html | 451 - .../docs/fr/form_testing_documentation.html | 363 - .../docs/fr/group_test_documentation.html | 265 - 3rdparty/simpletest/docs/fr/index.html | 576 - .../docs/fr/mock_objects_documentation.html | 933 - 3rdparty/simpletest/docs/fr/overview.html | 321 - .../docs/fr/partial_mocks_documentation.html | 475 - .../simpletest/docs/fr/reporter_documentation.html | 630 - .../docs/fr/unit_test_documentation.html | 447 - .../docs/fr/web_tester_documentation.html | 570 - 3rdparty/simpletest/dumper.php | 407 - 3rdparty/simpletest/eclipse.php | 307 - 3rdparty/simpletest/encoding.php | 649 - 3rdparty/simpletest/errors.php | 267 - 3rdparty/simpletest/exceptions.php | 226 - 3rdparty/simpletest/expectation.php | 984 - 3rdparty/simpletest/extensions/pear_test_case.php | 196 - 3rdparty/simpletest/extensions/testdox.php | 53 - 3rdparty/simpletest/extensions/testdox/test.php | 107 - 3rdparty/simpletest/form.php | 361 - 3rdparty/simpletest/frames.php | 592 - 3rdparty/simpletest/http.php | 628 - 3rdparty/simpletest/invoker.php | 139 - 3rdparty/simpletest/mock_objects.php | 1641 - 3rdparty/simpletest/page.php | 542 - 3rdparty/simpletest/php_parser.php | 1054 - 3rdparty/simpletest/recorder.php | 101 - 3rdparty/simpletest/reflection_php4.php | 136 - 3rdparty/simpletest/reflection_php5.php | 386 - 3rdparty/simpletest/remote.php | 115 - 3rdparty/simpletest/reporter.php | 445 - 3rdparty/simpletest/scorer.php | 875 - 3rdparty/simpletest/selector.php | 141 - 3rdparty/simpletest/shell_tester.php | 330 - 3rdparty/simpletest/simpletest.php | 391 - 3rdparty/simpletest/socket.php | 312 - 3rdparty/simpletest/tag.php | 1527 - 3rdparty/simpletest/test_case.php | 658 - 3rdparty/simpletest/tidy_parser.php | 382 - 3rdparty/simpletest/unit_tester.php | 413 - 3rdparty/simpletest/url.php | 550 - 3rdparty/simpletest/user_agent.php | 328 - 3rdparty/simpletest/web_tester.php | 1532 - 3rdparty/simpletest/xml.php | 647 - 3rdparty/smb4php/smb.php | 14 + 3rdparty/timepicker/GPL-LICENSE.txt | 0 3rdparty/timepicker/MIT-LICENSE.txt | 0 .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin .../include/images/ui-bg_flat_10_000000_40x100.png | Bin .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin .../include/images/ui-bg_glass_65_ffffff_1x400.png | Bin .../images/ui-bg_gloss-wave_35_f6a828_500x100.png | Bin .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin .../css/include/images/ui-icons_222222_256x240.png | Bin .../css/include/images/ui-icons_228ef1_256x240.png | Bin .../css/include/images/ui-icons_ef8c08_256x240.png | Bin .../css/include/images/ui-icons_ffd27a_256x240.png | Bin .../css/include/images/ui-icons_ffffff_256x240.png | Bin .../timepicker/css/include/jquery-1.5.1.min.js | 0 .../css/include/jquery-ui-1.8.14.custom.css | 0 .../timepicker/css/include/jquery.ui.core.min.js | 0 .../css/include/jquery.ui.position.min.js | 0 .../timepicker/css/include/jquery.ui.tabs.min.js | 0 .../timepicker/css/include/jquery.ui.widget.min.js | 0 .../ui-bg_diagonals-thick_18_b81900_40x40.png | Bin .../ui-bg_diagonals-thick_20_666666_40x40.png | Bin .../images/ui-bg_flat_10_000000_40x100.png | Bin .../images/ui-bg_glass_100_f6f6f6_1x400.png | Bin .../images/ui-bg_glass_100_fdf5ce_1x400.png | Bin .../images/ui-bg_glass_65_ffffff_1x400.png | Bin .../images/ui-bg_gloss-wave_35_f6a828_500x100.png | Bin .../ui-bg_highlight-soft_100_eeeeee_1x100.png | Bin .../ui-bg_highlight-soft_75_ffe45c_1x100.png | Bin .../images/ui-icons_222222_256x240.png | Bin .../images/ui-icons_228ef1_256x240.png | Bin .../images/ui-icons_ef8c08_256x240.png | Bin .../images/ui-icons_ffd27a_256x240.png | Bin .../images/ui-icons_ffffff_256x240.png | Bin 3rdparty/timepicker/css/jquery.ui.timepicker.css | 2 +- 3rdparty/timepicker/js/i18n/i18n.html | 98 +- .../timepicker/js/i18n/jquery.ui.timepicker-cs.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-de.js | 11 +- .../timepicker/js/i18n/jquery.ui.timepicker-es.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-fr.js | 0 .../timepicker/js/i18n/jquery.ui.timepicker-hr.js | 13 + .../timepicker/js/i18n/jquery.ui.timepicker-it.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-ja.js | 5 +- .../timepicker/js/i18n/jquery.ui.timepicker-nl.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-pl.js | 12 + .../js/i18n/jquery.ui.timepicker-pt-BR.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-sl.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-sv.js | 12 + .../timepicker/js/i18n/jquery.ui.timepicker-tr.js | 12 + 3rdparty/timepicker/js/jquery.ui.timepicker.js | 115 +- 3rdparty/timepicker/releases.txt | 10 + AUTHORS | 10 + README | 14 +- apps/.gitkeep | 1 - apps/admin_audit/appinfo/app.php | 18 - apps/admin_audit/appinfo/info.xml | 10 - apps/admin_audit/lib/hooks_handlers.php | 72 - apps/admin_dependencies_chk/appinfo/app.php | 4 - apps/admin_dependencies_chk/appinfo/info.xml | 10 - apps/admin_dependencies_chk/appinfo/version | 1 - apps/admin_dependencies_chk/css/style.css | 9 - apps/admin_dependencies_chk/settings.php | 102 - apps/admin_dependencies_chk/templates/settings.php | 16 - apps/admin_migrate/appinfo/app.php | 33 - apps/admin_migrate/appinfo/info.xml | 11 - apps/admin_migrate/appinfo/version | 1 - apps/admin_migrate/settings.php | 57 - apps/admin_migrate/templates/settings.php | 31 - apps/bookmarks/addBm.php | 33 - apps/bookmarks/ajax/addBookmark.php | 37 - apps/bookmarks/ajax/delBookmark.php | 41 - apps/bookmarks/ajax/editBookmark.php | 88 - apps/bookmarks/ajax/recordClick.php | 44 - apps/bookmarks/ajax/updateList.php | 50 - apps/bookmarks/appinfo/app.php | 19 - apps/bookmarks/appinfo/database.xml | 112 - apps/bookmarks/appinfo/info.xml | 11 - apps/bookmarks/appinfo/migrate.php | 68 - apps/bookmarks/appinfo/version | 1 - apps/bookmarks/bookmarksHelper.php | 130 - apps/bookmarks/css/bookmarks.css | 87 - apps/bookmarks/img/bookmarks.png | Bin 496 -> 0 bytes apps/bookmarks/index.php | 37 - apps/bookmarks/js/addBm.js | 16 - apps/bookmarks/js/bookmarks.js | 201 - apps/bookmarks/js/bookmarksearch.js | 23 - apps/bookmarks/l10n/xgettextfiles | 5 - apps/bookmarks/lib/bookmarks.php | 148 - apps/bookmarks/lib/search.php | 47 - apps/bookmarks/settings.php | 11 - apps/bookmarks/templates/addBm.php | 11 - apps/bookmarks/templates/bookmarklet.php | 8 - apps/bookmarks/templates/list.php | 26 - apps/bookmarks/templates/settings.php | 17 - apps/calendar/ajax/cache/rescan.php | 15 - apps/calendar/ajax/cache/status.php | 22 - apps/calendar/ajax/calendar/activation.php | 23 - apps/calendar/ajax/calendar/delete.php | 24 - apps/calendar/ajax/calendar/edit.form.php | 19 - apps/calendar/ajax/calendar/edit.php | 23 - apps/calendar/ajax/calendar/new.form.php | 22 - apps/calendar/ajax/calendar/new.php | 43 - apps/calendar/ajax/calendar/overview.php | 14 - apps/calendar/ajax/calendar/update.php | 48 - apps/calendar/ajax/categories/rescan.php | 42 - apps/calendar/ajax/changeview.php | 21 - apps/calendar/ajax/event/delete.php | 20 - apps/calendar/ajax/event/edit.form.php | 272 - apps/calendar/ajax/event/edit.php | 45 - apps/calendar/ajax/event/move.php | 46 - apps/calendar/ajax/event/new.form.php | 75 - apps/calendar/ajax/event/new.php | 24 - apps/calendar/ajax/event/resize.php | 38 - apps/calendar/ajax/events.php | 30 - apps/calendar/ajax/import/dialog.php | 15 - apps/calendar/ajax/import/dropimport.php | 73 - apps/calendar/ajax/import/import.php | 122 - apps/calendar/ajax/settings/getfirstday.php | 11 - .../ajax/settings/gettimezonedetection.php | 11 - apps/calendar/ajax/settings/guesstimezone.php | 26 - apps/calendar/ajax/settings/setfirstday.php | 15 - apps/calendar/ajax/settings/settimeformat.php | 15 - apps/calendar/ajax/settings/settimezone.php | 25 - apps/calendar/ajax/settings/timeformat.php | 11 - apps/calendar/ajax/settings/timezonedetection.php | 16 - apps/calendar/ajax/share/activation.php | 11 - apps/calendar/ajax/share/changepermission.php | 48 - apps/calendar/ajax/share/dropdown.php | 18 - apps/calendar/ajax/share/share.php | 59 - apps/calendar/ajax/share/unshare.php | 51 - apps/calendar/appinfo/app.php | 33 - apps/calendar/appinfo/database.xml | 345 - apps/calendar/appinfo/info.xml | 19 - apps/calendar/appinfo/remote.php | 39 - apps/calendar/appinfo/update.php | 24 - apps/calendar/appinfo/version | 1 - apps/calendar/caldav.php | 6 - apps/calendar/css/style.css | 135 - apps/calendar/export.php | 30 - apps/calendar/img/Icon License | 2 - apps/calendar/img/icon.png | Bin 423 -> 0 bytes apps/calendar/img/icon.svg | 54 - apps/calendar/index.php | 64 - apps/calendar/js/calendar.js | 928 - apps/calendar/js/geo.js | 20 - apps/calendar/js/loader.js | 81 - apps/calendar/js/settings.js | 67 - apps/calendar/l10n/ar.php | 135 - apps/calendar/l10n/bg_BG.php | 40 - apps/calendar/l10n/ca.php | 162 - apps/calendar/l10n/cs_CZ.php | 162 - apps/calendar/l10n/da.php | 162 - apps/calendar/l10n/de.php | 162 - apps/calendar/l10n/el.php | 162 - apps/calendar/l10n/eo.php | 162 - apps/calendar/l10n/es.php | 162 - apps/calendar/l10n/et_EE.php | 162 - apps/calendar/l10n/eu.php | 159 - apps/calendar/l10n/fa.php | 162 - apps/calendar/l10n/fi_FI.php | 138 - apps/calendar/l10n/fr.php | 162 - apps/calendar/l10n/gl.php | 162 - apps/calendar/l10n/he.php | 162 - apps/calendar/l10n/hr.php | 158 - apps/calendar/l10n/hu_HU.php | 162 - apps/calendar/l10n/hy.php | 11 - apps/calendar/l10n/ia.php | 115 - apps/calendar/l10n/id.php | 40 - apps/calendar/l10n/it.php | 162 - apps/calendar/l10n/ja_JP.php | 160 - apps/calendar/l10n/ko.php | 161 - apps/calendar/l10n/lb.php | 132 - apps/calendar/l10n/lt_LT.php | 140 - apps/calendar/l10n/mk.php | 162 - apps/calendar/l10n/ms_MY.php | 135 - apps/calendar/l10n/nb_NO.php | 157 - apps/calendar/l10n/nl.php | 162 - apps/calendar/l10n/nn_NO.php | 135 - apps/calendar/l10n/pl.php | 162 - apps/calendar/l10n/pt_BR.php | 162 - apps/calendar/l10n/pt_PT.php | 162 - apps/calendar/l10n/ro.php | 162 - apps/calendar/l10n/ru.php | 159 - apps/calendar/l10n/sk_SK.php | 162 - apps/calendar/l10n/sl.php | 162 - apps/calendar/l10n/sr.php | 64 - apps/calendar/l10n/sr@latin.php | 64 - apps/calendar/l10n/sv.php | 162 - apps/calendar/l10n/th_TH.php | 162 - apps/calendar/l10n/tr.php | 162 - apps/calendar/l10n/uk.php | 89 - apps/calendar/l10n/xgettextfiles | 12 - apps/calendar/l10n/zh_CN.php | 162 - apps/calendar/l10n/zh_TW.php | 162 - apps/calendar/lib/alarm.php | 13 - apps/calendar/lib/app.php | 426 - apps/calendar/lib/attendees.php | 13 - apps/calendar/lib/calendar.php | 274 - apps/calendar/lib/connector_sabre.php | 308 - apps/calendar/lib/export.php | 94 - apps/calendar/lib/hooks.php | 29 - apps/calendar/lib/object.php | 937 - apps/calendar/lib/repeat.php | 204 - apps/calendar/lib/search.php | 49 - apps/calendar/lib/share.php | 298 - apps/calendar/settings.php | 17 - apps/calendar/share.php | 31 - apps/calendar/templates/calendar.php | 61 - apps/calendar/templates/part.choosecalendar.php | 51 - .../templates/part.choosecalendar.rowfields.php | 21 - .../part.choosecalendar.rowfields.shared.php | 4 - apps/calendar/templates/part.editcalendar.php | 44 - apps/calendar/templates/part.editevent.php | 13 - apps/calendar/templates/part.eventform.php | 251 - apps/calendar/templates/part.import.php | 30 - apps/calendar/templates/part.newevent.php | 9 - apps/calendar/templates/part.showevent.php | 243 - apps/calendar/templates/settings.php | 67 - apps/calendar/templates/share.dropdown.php | 77 - apps/contacts/ajax/activation.php | 28 - apps/contacts/ajax/addbook.php | 19 - apps/contacts/ajax/addcontact.php | 50 - apps/contacts/ajax/addproperty.php | 139 - apps/contacts/ajax/categories/categoriesfor.php | 27 - apps/contacts/ajax/categories/delete.php | 47 - apps/contacts/ajax/categories/list.php | 15 - apps/contacts/ajax/categories/rescan.php | 16 - apps/contacts/ajax/chooseaddressbook.php | 15 - apps/contacts/ajax/contactdetails.php | 54 - apps/contacts/ajax/contacts.php | 74 - apps/contacts/ajax/createaddressbook.php | 36 - apps/contacts/ajax/cropphoto.php | 36 - apps/contacts/ajax/currentphoto.php | 53 - apps/contacts/ajax/deletebook.php | 33 - apps/contacts/ajax/deletecard.php | 45 - apps/contacts/ajax/deleteproperty.php | 45 - apps/contacts/ajax/editaddress.php | 41 - apps/contacts/ajax/editaddressbook.php | 16 - apps/contacts/ajax/editname.php | 34 - apps/contacts/ajax/importaddressbook.php | 23 - apps/contacts/ajax/importdialog.php | 15 - apps/contacts/ajax/loadcard.php | 49 - apps/contacts/ajax/loadintro.php | 31 - apps/contacts/ajax/loadphoto.php | 46 - apps/contacts/ajax/loghandler.php | 40 - apps/contacts/ajax/movetoaddressbook.php | 41 - apps/contacts/ajax/oc_photo.php | 60 - apps/contacts/ajax/savecrop.php | 107 - apps/contacts/ajax/saveproperty.php | 128 - apps/contacts/ajax/updateaddressbook.php | 38 - apps/contacts/ajax/uploadimport.php | 72 - apps/contacts/ajax/uploadphoto.php | 104 - apps/contacts/appinfo/app.php | 24 - apps/contacts/appinfo/database.xml | 137 - apps/contacts/appinfo/info.xml | 16 - apps/contacts/appinfo/migrate.php | 71 - apps/contacts/appinfo/remote.php | 55 - apps/contacts/appinfo/update.php | 25 - apps/contacts/appinfo/version | 1 - apps/contacts/carddav.php | 6 - apps/contacts/css/contacts.css | 126 - apps/contacts/css/jquery.Jcrop.css | 84 - apps/contacts/css/jquery.combobox.css | 3 - apps/contacts/export.php | 34 - apps/contacts/img/Jcrop.gif | Bin 329 -> 0 bytes apps/contacts/img/contact-new.png | Bin 658 -> 0 bytes apps/contacts/img/contact-new.svg | 129 - apps/contacts/img/globe.svg | 102 - apps/contacts/img/person.png | Bin 978 -> 0 bytes apps/contacts/img/person.svg | 175 - apps/contacts/img/person_large.png | Bin 7929 -> 0 bytes apps/contacts/import.php | 112 - apps/contacts/index.php | 62 - apps/contacts/js/LICENSE.jquery.inview | 41 - apps/contacts/js/contacts.js | 1805 - apps/contacts/js/expanding.js | 118 - apps/contacts/js/jquery.Jcrop.js | 1765 - apps/contacts/js/jquery.Jcrop.min.js | 255 - apps/contacts/js/jquery.combobox.js | 158 - apps/contacts/js/jquery.inview.js | 134 - apps/contacts/js/jquery.inview.txt | 15 - apps/contacts/js/jquery.multi-autocomplete.js | 94 - apps/contacts/js/loader.js | 86 - apps/contacts/l10n/.gitkeep | 0 apps/contacts/l10n/ar.php | 58 - apps/contacts/l10n/ca.php | 157 - apps/contacts/l10n/cs_CZ.php | 157 - apps/contacts/l10n/da.php | 157 - apps/contacts/l10n/de.php | 157 - apps/contacts/l10n/el.php | 157 - apps/contacts/l10n/eo.php | 146 - apps/contacts/l10n/es.php | 157 - apps/contacts/l10n/et_EE.php | 157 - apps/contacts/l10n/eu.php | 124 - apps/contacts/l10n/fa.php | 157 - apps/contacts/l10n/fi_FI.php | 109 - apps/contacts/l10n/fr.php | 149 - apps/contacts/l10n/gl.php | 58 - apps/contacts/l10n/he.php | 65 - apps/contacts/l10n/hr.php | 63 - apps/contacts/l10n/hu_HU.php | 157 - apps/contacts/l10n/ia.php | 94 - apps/contacts/l10n/it.php | 157 - apps/contacts/l10n/ja_JP.php | 152 - apps/contacts/l10n/ko.php | 92 - apps/contacts/l10n/lb.php | 44 - apps/contacts/l10n/lt_LT.php | 49 - apps/contacts/l10n/mk.php | 157 - apps/contacts/l10n/ms_MY.php | 58 - apps/contacts/l10n/nb_NO.php | 135 - apps/contacts/l10n/nl.php | 142 - apps/contacts/l10n/nn_NO.php | 58 - apps/contacts/l10n/pl.php | 157 - apps/contacts/l10n/pt_BR.php | 157 - apps/contacts/l10n/pt_PT.php | 129 - apps/contacts/l10n/ro.php | 92 - apps/contacts/l10n/ru.php | 127 - apps/contacts/l10n/sk_SK.php | 155 - apps/contacts/l10n/sl.php | 157 - apps/contacts/l10n/sr.php | 47 - apps/contacts/l10n/sr@latin.php | 29 - apps/contacts/l10n/sv.php | 143 - apps/contacts/l10n/th_TH.php | 157 - apps/contacts/l10n/tr.php | 157 - apps/contacts/l10n/uk.php | 29 - apps/contacts/l10n/xgettextfiles | 18 - apps/contacts/l10n/zh_CN.php | 127 - apps/contacts/l10n/zh_TW.php | 93 - apps/contacts/lib/VCFExportPlugin.php | 100 - apps/contacts/lib/addressbook.php | 327 - apps/contacts/lib/app.php | 230 - apps/contacts/lib/connector_sabre.php | 198 - apps/contacts/lib/hooks.php | 110 - apps/contacts/lib/search.php | 21 - apps/contacts/lib/vcard.php | 623 - apps/contacts/photo.php | 72 - apps/contacts/settings.php | 6 - apps/contacts/templates/index.php | 29 - apps/contacts/templates/part.chooseaddressbook.php | 25 - .../templates/part.chooseaddressbook.rowfields.php | 18 - apps/contacts/templates/part.contact.php | 129 - apps/contacts/templates/part.cropphoto.php | 68 - .../templates/part.edit_address_dialog.php | 62 - .../templates/part.edit_categories_dialog.php | 16 - apps/contacts/templates/part.edit_name_dialog.php | 58 - apps/contacts/templates/part.editaddressbook.php | 31 - apps/contacts/templates/part.import.php | 27 - apps/contacts/templates/part.importaddressbook.php | 38 - apps/contacts/templates/part.no_contacts.php | 7 - apps/contacts/templates/settings.php | 19 - apps/contacts/thumbnail.php | 79 - apps/contacts/tmpphoto.php | 34 - apps/external/ajax/setsites.php | 25 - apps/external/appinfo/app.php | 33 - apps/external/appinfo/info.xml | 10 - apps/external/appinfo/version | 1 - apps/external/css/style.css | 14 - apps/external/img/external.png | Bin 459 -> 0 bytes apps/external/img/external.svg | 292 - apps/external/index.php | 42 - apps/external/js/admin.js | 57 - apps/external/lib/external.php | 34 - apps/external/settings.php | 9 - apps/external/templates/frame.php | 26 - apps/external/templates/settings.php | 21 - apps/files/admin.php | 11 +- apps/files/ajax/autocomplete.php | 24 +- apps/files/ajax/delete.php | 6 +- apps/files/ajax/list.php | 12 +- apps/files/ajax/mimeicon.php | 6 - apps/files/ajax/move.php | 4 +- apps/files/ajax/newfile.php | 91 +- apps/files/ajax/newfolder.php | 10 +- apps/files/ajax/rawlist.php | 8 +- apps/files/ajax/scan.php | 27 +- apps/files/ajax/timezone.php | 1 - apps/files/ajax/upload.php | 17 +- apps/files/appinfo/filesync.php | 64 + apps/files/appinfo/info.xml | 3 +- apps/files/appinfo/update.php | 15 +- apps/files/appinfo/version | 2 +- apps/files/css/files.css | 16 +- apps/files/download.php | 4 +- apps/files/index.php | 31 +- apps/files/js/fileactions.js | 70 +- apps/files/js/filelist.js | 269 +- apps/files/js/files.js | 242 +- apps/files/l10n/ar.php | 4 +- apps/files/l10n/bg_BG.php | 21 +- apps/files/l10n/ca.php | 41 +- apps/files/l10n/cs_CZ.php | 71 +- apps/files/l10n/da.php | 41 +- apps/files/l10n/de.php | 61 +- apps/files/l10n/el.php | 57 +- apps/files/l10n/eo.php | 41 +- apps/files/l10n/es.php | 43 +- apps/files/l10n/es_AR.php | 71 + apps/files/l10n/et_EE.php | 26 +- apps/files/l10n/eu.php | 41 +- apps/files/l10n/fa.php | 21 +- apps/files/l10n/fi_FI.php | 39 +- apps/files/l10n/fr.php | 45 +- apps/files/l10n/gl.php | 28 +- apps/files/l10n/he.php | 15 +- apps/files/l10n/hr.php | 41 +- apps/files/l10n/hu_HU.php | 21 +- apps/files/l10n/ia.php | 4 +- apps/files/l10n/id.php | 23 +- apps/files/l10n/it.php | 41 +- apps/files/l10n/ja_JP.php | 41 +- apps/files/l10n/ko.php | 21 +- apps/files/l10n/lb.php | 21 +- apps/files/l10n/lt_LT.php | 25 +- apps/files/l10n/lv.php | 42 + apps/files/l10n/mk.php | 14 +- apps/files/l10n/ms_MY.php | 34 +- apps/files/l10n/nb_NO.php | 22 +- apps/files/l10n/nl.php | 41 +- apps/files/l10n/nn_NO.php | 4 +- apps/files/l10n/oc.php | 71 + apps/files/l10n/pl.php | 41 +- apps/files/l10n/pt_BR.php | 41 +- apps/files/l10n/pt_PT.php | 53 +- apps/files/l10n/ro.php | 41 +- apps/files/l10n/ru.php | 44 +- apps/files/l10n/ru_RU.php | 71 + apps/files/l10n/si_LK.php | 18 + apps/files/l10n/sk_SK.php | 47 +- apps/files/l10n/sl.php | 31 +- apps/files/l10n/sr.php | 4 +- apps/files/l10n/sr@latin.php | 4 +- apps/files/l10n/sv.php | 55 +- apps/files/l10n/th_TH.php | 41 +- apps/files/l10n/tr.php | 22 +- apps/files/l10n/uk.php | 25 +- apps/files/l10n/vi.php | 54 + apps/files/l10n/zh_CN.GB2312.php | 71 + apps/files/l10n/zh_CN.php | 41 +- apps/files/l10n/zh_TW.php | 13 +- apps/files/settings.php | 8 +- apps/files/templates/admin.php | 5 +- apps/files/templates/index.php | 29 +- apps/files/templates/part.breadcrumb.php | 4 +- apps/files/templates/part.list.php | 12 +- apps/files_archive/appinfo/app.php | 13 - apps/files_archive/appinfo/info.xml | 14 - apps/files_archive/appinfo/version | 1 - apps/files_archive/js/archive.js | 19 - apps/files_archive/lib/storage.php | 146 - apps/files_archive/tests/data/data.tar.gz | Bin 4195 -> 0 bytes apps/files_archive/tests/data/data.zip | Bin 4705 -> 0 bytes apps/files_archive/tests/data/lorem.txt | 4 - apps/files_archive/tests/storage.php | 39 - apps/files_encryption/appinfo/info.xml | 4 +- apps/files_encryption/l10n/.gitkeep | 0 apps/files_encryption/l10n/ca.php | 6 + apps/files_encryption/l10n/cs_CZ.php | 6 + apps/files_encryption/l10n/da.php | 6 + apps/files_encryption/l10n/de.php | 6 + apps/files_encryption/l10n/el.php | 6 + apps/files_encryption/l10n/eo.php | 6 + apps/files_encryption/l10n/es.php | 6 + apps/files_encryption/l10n/es_AR.php | 6 + apps/files_encryption/l10n/et_EE.php | 6 + apps/files_encryption/l10n/eu.php | 6 + apps/files_encryption/l10n/fa.php | 5 + apps/files_encryption/l10n/fi_FI.php | 6 + apps/files_encryption/l10n/fr.php | 6 + apps/files_encryption/l10n/gl.php | 6 + apps/files_encryption/l10n/hu_HU.php | 6 + apps/files_encryption/l10n/it.php | 6 + apps/files_encryption/l10n/ja_JP.php | 6 + apps/files_encryption/l10n/ku_IQ.php | 6 + apps/files_encryption/l10n/lt_LT.php | 6 + apps/files_encryption/l10n/nb_NO.php | 6 + apps/files_encryption/l10n/nl.php | 6 + apps/files_encryption/l10n/pl.php | 6 + apps/files_encryption/l10n/pt_BR.php | 6 + apps/files_encryption/l10n/pt_PT.php | 6 + apps/files_encryption/l10n/ro.php | 6 + apps/files_encryption/l10n/ru.php | 6 + apps/files_encryption/l10n/ru_RU.php | 6 + apps/files_encryption/l10n/sk_SK.php | 6 + apps/files_encryption/l10n/sl.php | 6 + apps/files_encryption/l10n/sv.php | 6 + apps/files_encryption/l10n/th_TH.php | 6 + apps/files_encryption/l10n/vi.php | 6 + apps/files_encryption/l10n/zh_CN.GB2312.php | 6 + apps/files_encryption/l10n/zh_CN.php | 6 + apps/files_encryption/l10n/zh_TW.php | 6 + apps/files_encryption/tests/crypt.php | 1 + apps/files_encryption/tests/out.txt | 78 + apps/files_external/ajax/addRootCertificate.php | 44 +- apps/files_external/ajax/dropbox.php | 2 - apps/files_external/ajax/google.php | 2 - apps/files_external/ajax/removeRootCertificate.php | 13 +- apps/files_external/appinfo/info.xml | 2 +- apps/files_external/css/settings.css | 2 + apps/files_external/js/dropbox.js | 61 +- apps/files_external/js/google.js | 87 +- apps/files_external/js/settings.js | 37 +- apps/files_external/l10n/.gitkeep | 0 apps/files_external/l10n/ca.php | 24 + apps/files_external/l10n/cs_CZ.php | 24 + apps/files_external/l10n/da.php | 24 + apps/files_external/l10n/de.php | 24 + apps/files_external/l10n/el.php | 24 + apps/files_external/l10n/eo.php | 24 + apps/files_external/l10n/es.php | 24 + apps/files_external/l10n/es_AR.php | 24 + apps/files_external/l10n/et_EE.php | 18 + apps/files_external/l10n/eu.php | 24 + apps/files_external/l10n/fi_FI.php | 23 + apps/files_external/l10n/fr.php | 24 + apps/files_external/l10n/gl.php | 18 + apps/files_external/l10n/he.php | 13 + apps/files_external/l10n/it.php | 24 + apps/files_external/l10n/ja_JP.php | 24 + apps/files_external/l10n/lt_LT.php | 9 + apps/files_external/l10n/nb_NO.php | 8 + apps/files_external/l10n/nl.php | 24 + apps/files_external/l10n/pl.php | 24 + apps/files_external/l10n/pt_BR.php | 24 + apps/files_external/l10n/pt_PT.php | 24 + apps/files_external/l10n/ro.php | 18 + apps/files_external/l10n/ru.php | 18 + apps/files_external/l10n/ru_RU.php | 24 + apps/files_external/l10n/sk_SK.php | 23 + apps/files_external/l10n/sl.php | 18 + apps/files_external/l10n/sv.php | 24 + apps/files_external/l10n/th_TH.php | 24 + apps/files_external/l10n/uk.php | 5 + apps/files_external/l10n/vi.php | 18 + apps/files_external/l10n/zh_CN.GB2312.php | 24 + apps/files_external/lib/amazons3.php | 10 +- apps/files_external/lib/config.php | 100 +- apps/files_external/lib/dropbox.php | 39 +- apps/files_external/lib/ftp.php | 27 +- apps/files_external/lib/google.php | 49 +- apps/files_external/lib/smb.php | 40 +- apps/files_external/lib/streamwrapper.php | 34 +- apps/files_external/lib/swift.php | 210 +- apps/files_external/lib/webdav.php | 111 +- apps/files_external/personal.php | 2 - apps/files_external/settings.php | 4 +- apps/files_external/templates/settings.php | 38 +- apps/files_external/tests/amazons3.php | 63 +- apps/files_external/tests/config.php | 11 +- apps/files_external/tests/dropbox.php | 27 + apps/files_external/tests/ftp.php | 29 +- apps/files_external/tests/google.php | 65 +- apps/files_external/tests/smb.php | 27 +- apps/files_external/tests/swift.php | 32 +- apps/files_external/tests/webdav.php | 27 +- apps/files_imageviewer/appinfo/app.php | 6 - apps/files_imageviewer/appinfo/info.xml | 11 - apps/files_imageviewer/appinfo/version | 1 - .../css/jquery.fancybox-1.3.4.css | 359 - apps/files_imageviewer/img/blank.gif | Bin 43 -> 0 bytes apps/files_imageviewer/img/fancy_close.png | Bin 1517 -> 0 bytes apps/files_imageviewer/img/fancy_loading.png | Bin 10195 -> 0 bytes apps/files_imageviewer/img/fancy_nav_left.png | Bin 1446 -> 0 bytes apps/files_imageviewer/img/fancy_nav_right.png | Bin 1454 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_e.png | Bin 107 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_n.png | Bin 106 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_ne.png | Bin 347 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_nw.png | Bin 324 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_s.png | Bin 111 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_se.png | Bin 352 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_sw.png | Bin 340 -> 0 bytes apps/files_imageviewer/img/fancy_shadow_w.png | Bin 103 -> 0 bytes apps/files_imageviewer/img/fancy_title_left.png | Bin 503 -> 0 bytes apps/files_imageviewer/img/fancy_title_main.png | Bin 96 -> 0 bytes apps/files_imageviewer/img/fancy_title_over.png | Bin 70 -> 0 bytes apps/files_imageviewer/img/fancy_title_right.png | Bin 506 -> 0 bytes apps/files_imageviewer/img/fancybox-x.png | Bin 203 -> 0 bytes apps/files_imageviewer/img/fancybox-y.png | Bin 176 -> 0 bytes apps/files_imageviewer/img/fancybox.png | Bin 15287 -> 0 bytes apps/files_imageviewer/js/jquery.fancybox-1.3.4.js | 1158 - .../js/jquery.fancybox-1.3.4.pack.js | 1 - .../js/jquery.mousewheel-3.0.4.js | 78 - .../js/jquery.mousewheel-3.0.4.pack.js | 14 - apps/files_imageviewer/js/lightbox.js | 31 - apps/files_pdfviewer/appinfo/app.php | 8 - apps/files_pdfviewer/appinfo/info.xml | 11 - apps/files_pdfviewer/appinfo/version | 1 - apps/files_pdfviewer/css/history.png | Bin 539 -> 0 bytes apps/files_pdfviewer/css/viewer.css | 267 - apps/files_pdfviewer/js/pdfjs/LICENSE | 30 - apps/files_pdfviewer/js/pdfjs/README | 7 - apps/files_pdfviewer/js/pdfjs/build/pdf.js | 33830 ------------------- apps/files_pdfviewer/js/pdfjs/compatibility.js | 340 - apps/files_pdfviewer/js/pdfjs/update.sh | 6 - apps/files_pdfviewer/js/pdfjs/viewer.js | 1873 - .../js/pdfjs/web/images/bookmark.svg | 662 - apps/files_pdfviewer/js/pdfjs/web/images/check.svg | 3 - .../js/pdfjs/web/images/comment.svg | 3 - .../js/pdfjs/web/images/document-print.svg | 533 - .../js/pdfjs/web/images/download.svg | 620 - .../js/pdfjs/web/images/go-down.svg | 201 - apps/files_pdfviewer/js/pdfjs/web/images/go-up.svg | 197 - .../js/pdfjs/web/images/nav-outline.svg | 202 - .../js/pdfjs/web/images/nav-thumbs.svg | 283 - .../js/pdfjs/web/images/pin-down.svg | 297 - .../files_pdfviewer/js/pdfjs/web/images/pin-up.svg | 230 - .../js/pdfjs/web/images/zoom-in.svg | 437 - .../js/pdfjs/web/images/zoom-out.svg | 425 - apps/files_pdfviewer/js/pdfview.js | 762 - apps/files_pdfviewer/js/viewer.js | 50 - apps/files_sharing/ajax/email.php | 13 - apps/files_sharing/ajax/getitem.php | 66 - apps/files_sharing/ajax/getstatuses.php | 22 - apps/files_sharing/ajax/setpermissions.php | 12 - apps/files_sharing/ajax/share.php | 37 - apps/files_sharing/ajax/toggleresharing.php | 9 - apps/files_sharing/ajax/unshare.php | 11 - apps/files_sharing/ajax/userautocomplete.php | 30 - apps/files_sharing/appinfo/app.php | 27 +- apps/files_sharing/appinfo/database.xml | 42 - apps/files_sharing/appinfo/info.xml | 6 +- apps/files_sharing/appinfo/update.php | 72 + apps/files_sharing/appinfo/version | 2 +- apps/files_sharing/css/public.css | 11 + apps/files_sharing/css/sharing.css | 15 - apps/files_sharing/get.php | 88 - apps/files_sharing/js/list.js | 54 - apps/files_sharing/js/public.js | 49 + apps/files_sharing/js/settings.js | 9 - apps/files_sharing/js/share.js | 383 +- apps/files_sharing/l10n/.gitkeep | 0 apps/files_sharing/l10n/ca.php | 9 + apps/files_sharing/l10n/cs_CZ.php | 9 + apps/files_sharing/l10n/da.php | 9 + apps/files_sharing/l10n/de.php | 9 + apps/files_sharing/l10n/el.php | 9 + apps/files_sharing/l10n/eo.php | 9 + apps/files_sharing/l10n/es.php | 9 + apps/files_sharing/l10n/es_AR.php | 9 + apps/files_sharing/l10n/et_EE.php | 7 + apps/files_sharing/l10n/eu.php | 9 + apps/files_sharing/l10n/fa.php | 6 + apps/files_sharing/l10n/fi_FI.php | 9 + apps/files_sharing/l10n/fr.php | 9 + apps/files_sharing/l10n/gl.php | 7 + apps/files_sharing/l10n/he.php | 9 + apps/files_sharing/l10n/hu_HU.php | 6 + apps/files_sharing/l10n/it.php | 9 + apps/files_sharing/l10n/ja_JP.php | 9 + apps/files_sharing/l10n/ku_IQ.php | 9 + apps/files_sharing/l10n/lt_LT.php | 6 + apps/files_sharing/l10n/nb_NO.php | 6 + apps/files_sharing/l10n/nl.php | 9 + apps/files_sharing/l10n/pl.php | 9 + apps/files_sharing/l10n/pt_BR.php | 9 + apps/files_sharing/l10n/pt_PT.php | 9 + apps/files_sharing/l10n/ro.php | 9 + apps/files_sharing/l10n/ru.php | 7 + apps/files_sharing/l10n/ru_RU.php | 9 + apps/files_sharing/l10n/sk_SK.php | 9 + apps/files_sharing/l10n/sl.php | 9 + apps/files_sharing/l10n/sv.php | 9 + apps/files_sharing/l10n/th_TH.php | 9 + apps/files_sharing/l10n/uk.php | 4 + apps/files_sharing/l10n/vi.php | 7 + apps/files_sharing/l10n/zh_CN.GB2312.php | 9 + apps/files_sharing/l10n/zh_CN.php | 9 + apps/files_sharing/l10n/zh_TW.php | 6 + apps/files_sharing/lib/share/file.php | 127 + apps/files_sharing/lib/share/folder.php | 71 + apps/files_sharing/lib/sharedstorage.php | 450 + apps/files_sharing/lib_share.php | 515 - apps/files_sharing/list.php | 35 - apps/files_sharing/public.php | 199 + apps/files_sharing/settings.php | 9 - apps/files_sharing/sharedstorage.php | 541 - apps/files_sharing/templates/authenticate.php | 9 + apps/files_sharing/templates/list.php | 30 - apps/files_sharing/templates/public.php | 35 + apps/files_sharing/templates/settings.php | 6 - apps/files_sharing_log/appinfo/app.php | 22 - apps/files_sharing_log/appinfo/database.xml | 44 - apps/files_sharing_log/appinfo/info.xml | 10 - apps/files_sharing_log/appinfo/version | 1 - apps/files_sharing_log/css/style.css | 7 - apps/files_sharing_log/index.php | 21 - apps/files_sharing_log/log.php | 34 - apps/files_sharing_log/templates/index.php | 42 - apps/files_texteditor/ajax/loadfile.php | 51 - apps/files_texteditor/ajax/mtime.php | 49 - apps/files_texteditor/ajax/savefile.php | 76 - apps/files_texteditor/appinfo/app.php | 6 - apps/files_texteditor/appinfo/info.xml | 11 - apps/files_texteditor/appinfo/version | 1 - .../css/DroidSansMono/DroidSansMono-webfont.eot | Bin 78034 -> 0 bytes .../css/DroidSansMono/DroidSansMono-webfont.svg | 630 - .../css/DroidSansMono/DroidSansMono-webfont.ttf | Bin 77800 -> 0 bytes .../css/DroidSansMono/DroidSansMono-webfont.woff | Bin 46192 -> 0 bytes .../css/DroidSansMono/Google Android License.txt | 18 - apps/files_texteditor/css/DroidSansMono/demo.html | 33 - .../css/DroidSansMono/stylesheet.css | 15 - apps/files_texteditor/css/style.css | 11 - apps/files_texteditor/js/aceeditor/LICENSE | 476 - .../js/aceeditor/ace-compat-uncompressed.js | 480 - apps/files_texteditor/js/aceeditor/ace-compat.js | 1 - .../js/aceeditor/ace-uncompressed.js | 16616 --------- apps/files_texteditor/js/aceeditor/ace.js | 9 - .../js/aceeditor/keybinding-emacs-uncompressed.js | 150 - .../js/aceeditor/keybinding-emacs.js | 1 - .../js/aceeditor/keybinding-vim-uncompressed.js | 138 - .../js/aceeditor/keybinding-vim.js | 1 - .../js/aceeditor/mode-c_cpp-uncompressed.js | 920 - apps/files_texteditor/js/aceeditor/mode-c_cpp.js | 1 - .../js/aceeditor/mode-clojure-uncompressed.js | 422 - apps/files_texteditor/js/aceeditor/mode-clojure.js | 1 - .../js/aceeditor/mode-coffee-uncompressed.js | 605 - apps/files_texteditor/js/aceeditor/mode-coffee.js | 1 - .../js/aceeditor/mode-coldfusion-uncompressed.js | 2433 -- .../js/aceeditor/mode-coldfusion.js | 1 - .../js/aceeditor/mode-csharp-uncompressed.js | 770 - apps/files_texteditor/js/aceeditor/mode-csharp.js | 1 - .../js/aceeditor/mode-css-uncompressed.js | 640 - apps/files_texteditor/js/aceeditor/mode-css.js | 1 - .../js/aceeditor/mode-groovy-uncompressed.js | 1370 - apps/files_texteditor/js/aceeditor/mode-groovy.js | 1 - .../js/aceeditor/mode-haxe-uncompressed.js | 770 - apps/files_texteditor/js/aceeditor/mode-haxe.js | 1 - .../js/aceeditor/mode-html-uncompressed.js | 2449 -- apps/files_texteditor/js/aceeditor/mode-html.js | 1 - .../js/aceeditor/mode-java-uncompressed.js | 1372 - apps/files_texteditor/js/aceeditor/mode-java.js | 1 - .../js/aceeditor/mode-javascript-uncompressed.js | 1203 - .../js/aceeditor/mode-javascript.js | 1 - .../js/aceeditor/mode-json-uncompressed.js | 698 - apps/files_texteditor/js/aceeditor/mode-json.js | 1 - .../js/aceeditor/mode-latex-uncompressed.js | 95 - apps/files_texteditor/js/aceeditor/mode-latex.js | 1 - .../js/aceeditor/mode-less-uncompressed.js | 654 - apps/files_texteditor/js/aceeditor/mode-less.js | 1 - .../js/aceeditor/mode-liquid-uncompressed.js | 1332 - apps/files_texteditor/js/aceeditor/mode-liquid.js | 1 - .../js/aceeditor/mode-lua-uncompressed.js | 523 - apps/files_texteditor/js/aceeditor/mode-lua.js | 1 - .../js/aceeditor/mode-markdown-uncompressed.js | 2897 -- .../files_texteditor/js/aceeditor/mode-markdown.js | 1 - .../js/aceeditor/mode-ocaml-uncompressed.js | 539 - apps/files_texteditor/js/aceeditor/mode-ocaml.js | 1 - .../js/aceeditor/mode-perl-uncompressed.js | 573 - apps/files_texteditor/js/aceeditor/mode-perl.js | 1 - .../js/aceeditor/mode-pgsql-uncompressed.js | 1107 - apps/files_texteditor/js/aceeditor/mode-pgsql.js | 1 - .../js/aceeditor/mode-php-uncompressed.js | 1886 -- apps/files_texteditor/js/aceeditor/mode-php.js | 1 - .../js/aceeditor/mode-powershell-uncompressed.js | 708 - .../js/aceeditor/mode-powershell.js | 1 - .../js/aceeditor/mode-python-uncompressed.js | 506 - apps/files_texteditor/js/aceeditor/mode-python.js | 1 - .../js/aceeditor/mode-ruby-uncompressed.js | 391 - apps/files_texteditor/js/aceeditor/mode-ruby.js | 1 - .../js/aceeditor/mode-scad-uncompressed.js | 908 - apps/files_texteditor/js/aceeditor/mode-scad.js | 1 - .../js/aceeditor/mode-scala-uncompressed.js | 1372 - apps/files_texteditor/js/aceeditor/mode-scala.js | 1 - .../js/aceeditor/mode-scss-uncompressed.js | 678 - apps/files_texteditor/js/aceeditor/mode-scss.js | 1 - .../js/aceeditor/mode-sh-uncompressed.js | 281 - apps/files_texteditor/js/aceeditor/mode-sh.js | 1 - .../js/aceeditor/mode-sql-uncompressed.js | 159 - apps/files_texteditor/js/aceeditor/mode-sql.js | 1 - .../js/aceeditor/mode-svg-uncompressed.js | 2112 -- apps/files_texteditor/js/aceeditor/mode-svg.js | 1 - .../js/aceeditor/mode-text-uncompressed.js | 0 apps/files_texteditor/js/aceeditor/mode-text.js | 0 .../js/aceeditor/mode-textile-uncompressed.js | 254 - apps/files_texteditor/js/aceeditor/mode-textile.js | 1 - .../js/aceeditor/mode-xml-uncompressed.js | 1009 - apps/files_texteditor/js/aceeditor/mode-xml.js | 1 - .../js/aceeditor/mode-xquery-uncompressed.js | 540 - apps/files_texteditor/js/aceeditor/mode-xquery.js | 1 - .../js/aceeditor/theme-clouds-uncompressed.js | 155 - apps/files_texteditor/js/aceeditor/theme-clouds.js | 1 - .../files_texteditor/js/aceeditor/worker-coffee.js | 7477 ---- apps/files_texteditor/js/aceeditor/worker-css.js | 11714 ------- .../js/aceeditor/worker-javascript.js | 10614 ------ apps/files_texteditor/js/aceeditor/worker-json.js | 3083 -- apps/files_texteditor/js/editor.js | 331 - apps/files_versions/ajax/expireAll.php | 13 +- apps/files_versions/ajax/getVersions.php | 8 +- apps/files_versions/ajax/rollbackVersion.php | 3 +- apps/files_versions/ajax/togglesettings.php | 1 + apps/files_versions/appinfo/api.php | 34 + apps/files_versions/appinfo/app.php | 2 +- apps/files_versions/appinfo/info.xml | 2 +- apps/files_versions/appinfo/update.php | 15 + apps/files_versions/appinfo/version | 2 +- apps/files_versions/history.php | 46 +- apps/files_versions/js/settings-personal.js | 28 +- apps/files_versions/js/versions.js | 92 +- apps/files_versions/l10n/.gitkeep | 0 apps/files_versions/l10n/ca.php | 8 + apps/files_versions/l10n/cs_CZ.php | 8 + apps/files_versions/l10n/da.php | 8 + apps/files_versions/l10n/de.php | 8 + apps/files_versions/l10n/el.php | 8 + apps/files_versions/l10n/eo.php | 8 + apps/files_versions/l10n/es.php | 8 + apps/files_versions/l10n/es_AR.php | 8 + apps/files_versions/l10n/et_EE.php | 5 + apps/files_versions/l10n/eu.php | 8 + apps/files_versions/l10n/fa.php | 3 + apps/files_versions/l10n/fi_FI.php | 8 + apps/files_versions/l10n/fr.php | 8 + apps/files_versions/l10n/gl.php | 7 + apps/files_versions/l10n/he.php | 5 + apps/files_versions/l10n/it.php | 8 + apps/files_versions/l10n/ja_JP.php | 8 + apps/files_versions/l10n/ku_IQ.php | 8 + apps/files_versions/l10n/lt_LT.php | 3 + apps/files_versions/l10n/nb_NO.php | 3 + apps/files_versions/l10n/nl.php | 8 + apps/files_versions/l10n/pl.php | 8 + apps/files_versions/l10n/pt_BR.php | 8 + apps/files_versions/l10n/pt_PT.php | 8 + apps/files_versions/l10n/ro.php | 8 + apps/files_versions/l10n/ru.php | 5 + apps/files_versions/l10n/ru_RU.php | 8 + apps/files_versions/l10n/sk_SK.php | 8 + apps/files_versions/l10n/sl.php | 8 + apps/files_versions/l10n/sv.php | 8 + apps/files_versions/l10n/th_TH.php | 8 + apps/files_versions/l10n/vi.php | 5 + apps/files_versions/l10n/zh_CN.GB2312.php | 8 + apps/files_versions/l10n/zh_CN.php | 8 + apps/files_versions/lib/hooks.php | 33 +- apps/files_versions/lib/versions.php | 609 +- apps/files_versions/settings-personal.php | 1 - apps/files_versions/templates/history.php | 6 +- .../files_versions/templates/settings-personal.php | 13 +- apps/files_versions/templates/settings.php | 5 +- apps/gallery/ajax/createAlbum.php | 30 - apps/gallery/ajax/galleryOp.php | 188 - apps/gallery/ajax/sharing.php | 117 - apps/gallery/ajax/thumbnail.php | 36 - apps/gallery/appinfo/app.php | 55 - apps/gallery/appinfo/database.xml | 60 - apps/gallery/appinfo/info.xml | 15 - apps/gallery/appinfo/update.php | 11 - apps/gallery/appinfo/version | 1 - apps/gallery/css/sharing.css | 8 - apps/gallery/css/styles.css | 14 - apps/gallery/css/supersized.css | 25 - apps/gallery/css/supersized.shutter.css | 74 - apps/gallery/img/breadcrumb.png | Bin 220 -> 0 bytes apps/gallery/img/delete.png | Bin 275 -> 0 bytes apps/gallery/img/loading.gif | Bin 1849 -> 0 bytes apps/gallery/img/rename.png | Bin 310 -> 0 bytes apps/gallery/img/share.png | Bin 377 -> 0 bytes apps/gallery/img/supersized/back.png | Bin 2629 -> 0 bytes apps/gallery/img/supersized/bg-black.png | Bin 1074 -> 0 bytes apps/gallery/img/supersized/bg-hover.png | Bin 960 -> 0 bytes apps/gallery/img/supersized/button-tray-down.png | Bin 1506 -> 0 bytes apps/gallery/img/supersized/button-tray-up.png | Bin 1466 -> 0 bytes apps/gallery/img/supersized/forward.png | Bin 2614 -> 0 bytes apps/gallery/img/supersized/nav-bg.png | Bin 995 -> 0 bytes apps/gallery/img/supersized/nav-dot.png | Bin 1901 -> 0 bytes apps/gallery/img/supersized/pause.png | Bin 1131 -> 0 bytes apps/gallery/img/supersized/play.png | Bin 1562 -> 0 bytes apps/gallery/img/supersized/progress-back.png | Bin 929 -> 0 bytes apps/gallery/img/supersized/progress-bar.png | Bin 929 -> 0 bytes apps/gallery/img/supersized/progress.gif | Bin 2608 -> 0 bytes apps/gallery/img/supersized/supersized-logo.png | Bin 3982 -> 0 bytes apps/gallery/img/supersized/thumb-back.png | Bin 2122 -> 0 bytes apps/gallery/img/supersized/thumb-forward.png | Bin 2118 -> 0 bytes apps/gallery/index.php | 105 - apps/gallery/js/albums.js | 101 - apps/gallery/js/jquery.easing.min.js | 71 - apps/gallery/js/pictures.js | 68 - apps/gallery/js/scanner.js | 34 - apps/gallery/js/sharing.js | 57 - apps/gallery/js/slideshow.js | 58 - apps/gallery/js/supersized.3.2.7.js | 930 - apps/gallery/js/supersized.3.2.7.min.js | 13 - apps/gallery/js/supersized.shutter.js | 337 - apps/gallery/js/supersized.shutter.min.js | 14 - apps/gallery/l10n/ar.php | 4 - apps/gallery/l10n/ca.php | 12 - apps/gallery/l10n/cs_CZ.php | 12 - apps/gallery/l10n/da.php | 12 - apps/gallery/l10n/de.php | 12 - apps/gallery/l10n/el.php | 12 - apps/gallery/l10n/eo.php | 12 - apps/gallery/l10n/es.php | 12 - apps/gallery/l10n/et_EE.php | 12 - apps/gallery/l10n/eu.php | 12 - apps/gallery/l10n/fa.php | 12 - apps/gallery/l10n/fi_FI.php | 12 - apps/gallery/l10n/fr.php | 12 - apps/gallery/l10n/gl.php | 12 - apps/gallery/l10n/hr.php | 12 - apps/gallery/l10n/hu_HU.php | 12 - apps/gallery/l10n/ia.php | 4 - apps/gallery/l10n/id.php | 12 - apps/gallery/l10n/it.php | 12 - apps/gallery/l10n/ja_JP.php | 12 - apps/gallery/l10n/ko.php | 12 - apps/gallery/l10n/lb.php | 12 - apps/gallery/l10n/lt_LT.php | 12 - apps/gallery/l10n/mk.php | 12 - apps/gallery/l10n/ms_MY.php | 4 - apps/gallery/l10n/nb_NO.php | 12 - apps/gallery/l10n/nl.php | 12 - apps/gallery/l10n/nn_NO.php | 4 - apps/gallery/l10n/pl.php | 12 - apps/gallery/l10n/pt_BR.php | 12 - apps/gallery/l10n/pt_PT.php | 12 - apps/gallery/l10n/ro.php | 12 - apps/gallery/l10n/ru.php | 12 - apps/gallery/l10n/sk_SK.php | 12 - apps/gallery/l10n/sl.php | 12 - apps/gallery/l10n/sr.php | 4 - apps/gallery/l10n/sv.php | 12 - apps/gallery/l10n/th_TH.php | 12 - apps/gallery/l10n/tr.php | 12 - apps/gallery/l10n/uk.php | 4 - apps/gallery/l10n/zh_CN.php | 12 - apps/gallery/l10n/zh_TW.php | 12 - apps/gallery/lib/album.php | 111 - apps/gallery/lib/hooks_handlers.php | 40 - apps/gallery/lib/images_utils.php | 62 - apps/gallery/lib/managers.php | 113 - apps/gallery/lib/photo.php | 103 - apps/gallery/lib/scanner.php | 145 - apps/gallery/lib/sharing.php | 89 - apps/gallery/lib/tiles.php | 176 - apps/gallery/lib/tiles_test.php | 85 - apps/gallery/sharing.php | 47 - apps/gallery/templates/index.php | 84 - apps/gallery/templates/view_album.php | 47 - apps/media/ajax/api.php | 133 - apps/media/ajax/autoupdate.php | 37 - apps/media/appinfo/app.php | 47 - apps/media/appinfo/database.xml | 328 - apps/media/appinfo/info.xml | 15 - apps/media/appinfo/version | 1 - apps/media/css/music.css | 48 - apps/media/css/player.css | 23 - apps/media/index.php | 42 - apps/media/js/Jplayer.swf | Bin 7679 -> 0 bytes apps/media/js/collection.js | 368 - .../js/jQuery.jPlayer.2.1.0.source/Jplayer.as | 415 - .../js/jQuery.jPlayer.2.1.0.source/Jplayer.fla | Bin 61952 -> 0 bytes .../add-on/jplayer.playlist.js | 452 - .../add-on/jquery.jplayer.inspector.js | 331 - .../happyworm/jPlayer/JplayerEvent.as | 69 - .../happyworm/jPlayer/JplayerMp3.as | 328 - .../happyworm/jPlayer/JplayerMp4.as | 413 - .../happyworm/jPlayer/JplayerStatus.as | 101 - .../jQuery.jPlayer.2.1.0.source/jquery.jplayer.js | 2349 -- apps/media/js/jquery.jplayer.min.js | 2 - apps/media/js/loader.js | 59 - apps/media/js/music.js | 57 - apps/media/js/player.js | 214 - apps/media/js/playlist.js | 57 - apps/media/js/scanner.js | 44 - apps/media/l10n/ar.php | 13 - apps/media/l10n/bg_BG.php | 13 - apps/media/l10n/ca.php | 13 - apps/media/l10n/cs_CZ.php | 13 - apps/media/l10n/da.php | 13 - apps/media/l10n/de.php | 13 - apps/media/l10n/el.php | 13 - apps/media/l10n/eo.php | 13 - apps/media/l10n/es.php | 13 - apps/media/l10n/et_EE.php | 13 - apps/media/l10n/eu.php | 13 - apps/media/l10n/fa.php | 13 - apps/media/l10n/fi_FI.php | 13 - apps/media/l10n/fr.php | 13 - apps/media/l10n/gl.php | 13 - apps/media/l10n/he.php | 13 - apps/media/l10n/hr.php | 13 - apps/media/l10n/hu_HU.php | 13 - apps/media/l10n/ia.php | 13 - apps/media/l10n/id.php | 13 - apps/media/l10n/it.php | 13 - apps/media/l10n/ja_JP.php | 13 - apps/media/l10n/ko.php | 13 - apps/media/l10n/lb.php | 13 - apps/media/l10n/lt_LT.php | 13 - apps/media/l10n/mk.php | 13 - apps/media/l10n/ms_MY.php | 13 - apps/media/l10n/nb_NO.php | 13 - apps/media/l10n/nl.php | 13 - apps/media/l10n/nn_NO.php | 13 - apps/media/l10n/pl.php | 13 - apps/media/l10n/pt_BR.php | 13 - apps/media/l10n/pt_PT.php | 13 - apps/media/l10n/ro.php | 13 - apps/media/l10n/ru.php | 13 - apps/media/l10n/sk_SK.php | 13 - apps/media/l10n/sl.php | 13 - apps/media/l10n/sr.php | 13 - apps/media/l10n/sr@latin.php | 13 - apps/media/l10n/sv.php | 13 - apps/media/l10n/th_TH.php | 13 - apps/media/l10n/tr.php | 13 - apps/media/l10n/xgettextfiles | 6 - apps/media/l10n/zh_CN.php | 13 - apps/media/l10n/zh_TW.php | 13 - apps/media/lib_ampache.php | 421 - apps/media/lib_collection.php | 389 - apps/media/lib_media.php | 97 - apps/media/lib_scanner.php | 138 - apps/media/remote.php | 11 - apps/media/server/xml.server.php | 79 - apps/media/settings.php | 5 - apps/media/templates/music.php | 52 - apps/media/templates/player.php | 16 - apps/media/templates/settings.php | 7 - apps/remoteStorage/BearerAuth.php | 61 - apps/remoteStorage/WebDAV.php | 101 - apps/remoteStorage/ajax/revokeToken.php | 39 - apps/remoteStorage/appinfo/app.php | 2 - apps/remoteStorage/appinfo/database.xml | 52 - apps/remoteStorage/appinfo/info.xml | 10 - apps/remoteStorage/appinfo/version | 1 - apps/remoteStorage/appinfo/webfinger.php | 8 - apps/remoteStorage/auth.php | 123 - apps/remoteStorage/lib_remoteStorage.php | 69 - apps/remoteStorage/oauth_ro_auth.php | 70 - apps/remoteStorage/remoteStorage.png | Bin 1273 -> 0 bytes apps/remoteStorage/settings.php | 6 - apps/remoteStorage/templates/settings.php | 28 - apps/tasks/ajax/addtask.php | 27 - apps/tasks/ajax/addtaskform.php | 20 - apps/tasks/ajax/delete.php | 31 - apps/tasks/ajax/edittask.php | 31 - apps/tasks/ajax/edittaskform.php | 24 - apps/tasks/ajax/getdetails.php | 24 - apps/tasks/ajax/gettasks.php | 36 - apps/tasks/ajax/update_property.php | 68 - apps/tasks/appinfo/app.php | 11 - apps/tasks/appinfo/info.xml | 11 - apps/tasks/css/style.css | 62 - apps/tasks/img/icon.png | Bin 457 -> 0 bytes apps/tasks/img/icon.svg | 101 - apps/tasks/index.php | 33 - apps/tasks/js/tasks.js | 535 - apps/tasks/lib/app.php | 188 - apps/tasks/lib/vtodo.php | 27 - apps/tasks/templates/part.addtaskform.php | 15 - apps/tasks/templates/part.details.php | 42 - apps/tasks/templates/part.edittaskform.php | 5 - apps/tasks/templates/part.property.php | 22 - apps/tasks/templates/part.taskform.php | 36 - apps/tasks/templates/part.tasks.php | 3 - apps/tasks/templates/tasks.php | 34 - apps/user_ldap/ajax/testConfiguration.php | 39 + apps/user_ldap/appinfo/app.php | 16 +- apps/user_ldap/appinfo/database.xml | 49 + apps/user_ldap/appinfo/info.xml | 2 +- apps/user_ldap/appinfo/install.php | 2 +- apps/user_ldap/appinfo/update.php | 46 +- apps/user_ldap/appinfo/version | 2 +- apps/user_ldap/css/settings.css | 10 + apps/user_ldap/group_ldap.php | 193 +- apps/user_ldap/js/settings.js | 21 + apps/user_ldap/l10n/.gitkeep | 0 apps/user_ldap/l10n/ca.php | 37 + apps/user_ldap/l10n/cs_CZ.php | 37 + apps/user_ldap/l10n/da.php | 10 + apps/user_ldap/l10n/de.php | 37 + apps/user_ldap/l10n/el.php | 18 + apps/user_ldap/l10n/eo.php | 35 + apps/user_ldap/l10n/es.php | 37 + apps/user_ldap/l10n/es_AR.php | 37 + apps/user_ldap/l10n/et_EE.php | 31 + apps/user_ldap/l10n/eu.php | 37 + apps/user_ldap/l10n/fa.php | 5 + apps/user_ldap/l10n/fi_FI.php | 37 + apps/user_ldap/l10n/fr.php | 37 + apps/user_ldap/l10n/it.php | 37 + apps/user_ldap/l10n/ja_JP.php | 37 + apps/user_ldap/l10n/lt_LT.php | 9 + apps/user_ldap/l10n/pl.php | 37 + apps/user_ldap/l10n/pt_BR.php | 37 + apps/user_ldap/l10n/pt_PT.php | 18 + apps/user_ldap/l10n/ro.php | 37 + apps/user_ldap/l10n/ru.php | 37 + apps/user_ldap/l10n/ru_RU.php | 37 + apps/user_ldap/l10n/sl.php | 37 + apps/user_ldap/l10n/sv.php | 37 + apps/user_ldap/l10n/th_TH.php | 37 + apps/user_ldap/l10n/uk.php | 4 + apps/user_ldap/l10n/vi.php | 13 + apps/user_ldap/l10n/zh_CN.GB2312.php | 37 + apps/user_ldap/l10n/zh_CN.php | 9 + apps/user_ldap/lib/access.php | 683 + apps/user_ldap/lib/connection.php | 360 + apps/user_ldap/lib/jobs.php | 157 + apps/user_ldap/lib_ldap.php | 721 - apps/user_ldap/settings.php | 28 +- apps/user_ldap/templates/settings.php | 34 +- apps/user_ldap/tests/group_ldap.php | 10 +- apps/user_ldap/user_ldap.php | 168 +- apps/user_migrate/ajax/export.php | 62 - apps/user_migrate/appinfo/app.php | 33 - apps/user_migrate/appinfo/info.xml | 11 - apps/user_migrate/appinfo/version | 1 - apps/user_migrate/js/export.js | 27 - apps/user_migrate/settings.php | 89 - apps/user_migrate/templates/settings.php | 19 - apps/user_openid/appinfo/app.php | 52 - apps/user_openid/appinfo/info.xml | 14 - apps/user_openid/appinfo/version | 1 - apps/user_openid/class.openid.v3.php | 326 - apps/user_openid/js/settings.js | 10 - apps/user_openid/phpmyid.php | 1707 - apps/user_openid/settings.php | 10 - apps/user_openid/templates/nomode.php | 28 - apps/user_openid/templates/settings.php | 8 - apps/user_openid/user.php | 47 - apps/user_openid/user_openid.php | 65 - apps/user_webdavauth/appinfo/app.php | 37 + apps/user_webdavauth/appinfo/info.xml | 11 + apps/user_webdavauth/settings.php | 36 + apps/user_webdavauth/templates/settings.php | 7 + apps/user_webdavauth/user_webdavauth.php | 83 + apps/user_webfinger/appinfo/app.php | 3 - apps/user_webfinger/appinfo/info.xml | 10 - apps/user_webfinger/appinfo/version | 1 - apps/user_webfinger/host-meta.php | 11 - apps/user_webfinger/webfinger.php | 60 - autotest.sh | 111 + config/config.sample.php | 26 +- core/ajax/appconfig.php | 16 +- core/ajax/grouplist.php | 47 - core/ajax/requesttoken.php | 41 + core/ajax/share.php | 154 + core/ajax/translations.php | 2 +- core/ajax/userlist.php | 46 - core/ajax/validateuser.php | 38 - core/ajax/vcategories/add.php | 6 +- core/ajax/vcategories/delete.php | 6 +- core/ajax/vcategories/edit.php | 8 +- core/css/share.css | 22 + core/css/styles.css | 31 +- core/img/actions/add.png | Bin 488 -> 441 bytes core/img/actions/clock.png | Bin 0 -> 466 bytes core/img/actions/clock.svg | 20 + core/img/actions/delete.png | Bin 275 -> 240 bytes core/img/actions/download.png | Bin 246 -> 236 bytes core/img/actions/history.png | Bin 370 -> 363 bytes core/img/actions/info.png | Bin 474 -> 423 bytes core/img/actions/lock.png | Bin 0 -> 346 bytes core/img/actions/lock.svg | 8 + core/img/actions/logout.png | Bin 657 -> 592 bytes core/img/actions/mail.png | Bin 463 -> 405 bytes core/img/actions/pause-big.png | Bin 183 -> 166 bytes core/img/actions/pause.png | Bin 182 -> 170 bytes core/img/actions/play-add.png | Bin 275 -> 237 bytes core/img/actions/play-big.png | Bin 212 -> 210 bytes core/img/actions/play-next.png | Bin 253 -> 224 bytes core/img/actions/play-previous.png | Bin 260 -> 237 bytes core/img/actions/play.png | Bin 220 -> 201 bytes core/img/actions/public.png | Bin 459 -> 412 bytes core/img/actions/rename.png | Bin 310 -> 267 bytes core/img/actions/search.png | Bin 701 -> 554 bytes core/img/actions/settings.png | Bin 883 -> 683 bytes core/img/actions/share.png | Bin 377 -> 338 bytes core/img/actions/shared.png | Bin 437 -> 364 bytes core/img/actions/sound-off.png | Bin 217 -> 192 bytes core/img/actions/sound.png | Bin 292 -> 254 bytes core/img/actions/triangle-s.png | Bin 526 -> 515 bytes core/img/actions/upload-white.png | Bin 228 -> 226 bytes core/img/actions/upload.png | Bin 236 -> 235 bytes core/img/breadcrumb-start.png | Bin 452 -> 311 bytes core/img/breadcrumb.png | Bin 452 -> 320 bytes core/img/favicon-touch.png | Bin 5703 -> 3705 bytes core/img/favicon.png | Bin 1231 -> 912 bytes core/img/filetypes/application-msword.png | Bin 28346 -> 789 bytes core/img/filetypes/application-sgf.png | Bin 725 -> 702 bytes .../application-vnd.oasis.opendocument.formula.png | Bin 580 -> 479 bytes ...application-vnd.oasis.opendocument.graphics.png | Bin 572 -> 475 bytes ...ication-vnd.oasis.opendocument.presentation.png | Bin 441 -> 333 bytes ...lication-vnd.oasis.opendocument.spreadsheet.png | Bin 436 -> 344 bytes .../application-vnd.oasis.opendocument.text.png | Bin 420 -> 347 bytes core/img/filetypes/application-x-7z-compressed.png | Bin 652 -> 650 bytes .../application-x-bzip-compressed-tar.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-bzip.png | Bin 652 -> 650 bytes .../img/filetypes/application-x-compressed-tar.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-deb.png | Bin 652 -> 650 bytes .../img/filetypes/application-x-debian-package.png | Bin 570 -> 548 bytes core/img/filetypes/application-x-gzip.png | Bin 652 -> 650 bytes .../application-x-lzma-compressed-tar.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-rar.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-rpm.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-tar.png | Bin 652 -> 650 bytes core/img/filetypes/application-x-tarz.png | Bin 652 -> 650 bytes core/img/filetypes/application-zip.png | Bin 652 -> 650 bytes core/img/filetypes/flash.png | Bin 582 -> 580 bytes core/img/icon-error.png | Bin 1573 -> 1571 bytes core/img/icon-error.svg | 24 +- core/img/icon-sync.png | Bin 1577 -> 1544 bytes core/img/icon-sync.svg | 20 +- core/img/icon.png | Bin 1344 -> 1305 bytes core/img/icon.svg | 22 +- core/img/logo-inverted.png | Bin 8116 -> 5938 bytes core/img/logo-square.png | Bin 22792 -> 16048 bytes core/img/logo-wide.png | Bin 2293 -> 1908 bytes core/img/logo.png | Bin 7356 -> 5860 bytes core/img/places/file.png | Bin 391 -> 364 bytes core/img/places/folder.png | Bin 386 -> 339 bytes core/img/places/home.png | Bin 416 -> 372 bytes core/img/places/music.png | Bin 561 -> 532 bytes core/img/places/picture.png | Bin 307 -> 300 bytes core/img/rating/s1.png | Bin 0 -> 454 bytes core/img/rating/s10.png | Bin 0 -> 848 bytes core/img/rating/s11.png | Bin 0 -> 724 bytes core/img/rating/s2.png | Bin 0 -> 731 bytes core/img/rating/s3.png | Bin 0 -> 918 bytes core/img/rating/s4.png | Bin 0 -> 989 bytes core/img/rating/s5.png | Bin 0 -> 939 bytes core/img/rating/s6.png | Bin 0 -> 992 bytes core/img/rating/s7.png | Bin 0 -> 939 bytes core/img/rating/s8.png | Bin 0 -> 987 bytes core/img/rating/s9.png | Bin 0 -> 908 bytes core/img/remoteStorage-big.png | Bin 9742 -> 8997 bytes core/js/LICENSE.jquery.inview | 41 + core/js/backgroundjobs.js | 25 + core/js/config.js | 2 +- core/js/eventsource.js | 1 + core/js/jquery.inview.js | 134 + core/js/jquery.inview.txt | 15 + core/js/js.js | 360 +- core/js/listview.js | 10 +- core/js/oc-dialogs.js | 16 +- core/js/oc-vcategories.js | 4 +- core/js/requesttoken.js | 55 + core/js/setup.js | 11 +- core/js/share.js | 514 + core/l10n/ar.php | 5 +- core/l10n/bg_BG.php | 27 +- core/l10n/ca.php | 54 +- core/l10n/cs_CZ.php | 88 +- core/l10n/da.php | 51 +- core/l10n/de.php | 92 +- core/l10n/el.php | 52 +- core/l10n/eo.php | 58 +- core/l10n/es.php | 53 +- core/l10n/es_AR.php | 91 + core/l10n/et_EE.php | 23 +- core/l10n/eu.php | 50 +- core/l10n/fa.php | 23 +- core/l10n/fi_FI.php | 47 +- core/l10n/fr.php | 58 +- core/l10n/gl.php | 23 +- core/l10n/he.php | 24 +- core/l10n/hi.php | 14 + core/l10n/hr.php | 51 +- core/l10n/hu_HU.php | 49 +- core/l10n/ia.php | 5 +- core/l10n/id.php | 22 +- core/l10n/ignorelist | 1 + core/l10n/it.php | 58 +- core/l10n/ja_JP.php | 54 +- core/l10n/ko.php | 23 +- core/l10n/ku_IQ.php | 21 + core/l10n/lb.php | 26 +- core/l10n/lt_LT.php | 25 +- core/l10n/lv.php | 35 + core/l10n/mk.php | 23 +- core/l10n/ms_MY.php | 29 +- core/l10n/nb_NO.php | 23 +- core/l10n/nl.php | 53 +- core/l10n/nn_NO.php | 5 +- core/l10n/oc.php | 91 + core/l10n/pl.php | 51 +- core/l10n/pt_BR.php | 54 +- core/l10n/pt_PT.php | 51 +- core/l10n/ro.php | 45 +- core/l10n/ru.php | 24 +- core/l10n/ru_RU.php | 83 + core/l10n/si_LK.php | 29 + core/l10n/sk_SK.php | 46 +- core/l10n/sl.php | 25 +- core/l10n/sr.php | 5 +- core/l10n/sr@latin.php | 4 +- core/l10n/sv.php | 70 +- core/l10n/th_TH.php | 51 +- core/l10n/tr.php | 24 +- core/l10n/uk.php | 21 +- core/l10n/vi.php | 63 + core/l10n/zh_CN.GB2312.php | 91 + core/l10n/zh_CN.php | 45 +- core/l10n/zh_TW.php | 24 +- core/lostpassword/index.php | 27 +- core/lostpassword/resetpassword.php | 4 +- core/lostpassword/templates/email.php | 3 +- core/lostpassword/templates/lostpassword.php | 1 - core/minimizer.php | 4 +- core/templates/403.php | 2 +- core/templates/404.php | 2 +- core/templates/exception.php | 30 + core/templates/installation.php | 41 +- core/templates/layout.base.php | 33 + core/templates/layout.guest.php | 10 +- core/templates/layout.user.php | 26 +- core/templates/login.php | 22 +- core/templates/verify.php | 18 + cron.php | 89 + db_structure.xml | 1184 +- files/webdav.php | 8 +- index.php | 106 +- l10n/.tx/config | 52 +- l10n/af/admin_dependencies_chk.po | 73 + l10n/af/admin_migrate.po | 32 + l10n/af/bookmarks.po | 60 + l10n/af/calendar.po | 428 +- l10n/af/contacts.po | 755 +- l10n/af/core.po | 255 +- l10n/af/files.po | 189 +- l10n/af/files_encryption.po | 34 + l10n/af/files_external.po | 106 + l10n/af/files_odfviewer.po | 22 + l10n/af/files_pdfviewer.po | 42 + l10n/af/files_sharing.po | 48 + l10n/af/files_texteditor.po | 44 + l10n/af/files_versions.po | 42 + l10n/af/impress.po | 22 + l10n/af/lib.po | 125 + l10n/af/settings.po | 203 +- l10n/af/tasks.po | 106 + l10n/af/user_ldap.po | 170 + l10n/af/user_migrate.po | 51 + l10n/af/user_openid.po | 54 + l10n/ar/admin_dependencies_chk.po | 73 + l10n/ar/admin_migrate.po | 32 + l10n/ar/bookmarks.po | 60 + l10n/ar/calendar.po | 506 +- l10n/ar/contacts.po | 821 +- l10n/ar/core.po | 263 +- l10n/ar/files.po | 189 +- l10n/ar/files_encryption.po | 34 + l10n/ar/files_external.po | 106 + l10n/ar/files_odfviewer.po | 22 + l10n/ar/files_pdfviewer.po | 42 + l10n/ar/files_sharing.po | 48 + l10n/ar/files_texteditor.po | 44 + l10n/ar/files_versions.po | 42 + l10n/ar/impress.po | 22 + l10n/ar/lib.po | 125 + l10n/ar/media.po | 14 +- l10n/ar/settings.po | 209 +- l10n/ar/tasks.po | 106 + l10n/ar/user_ldap.po | 170 + l10n/ar/user_migrate.po | 51 + l10n/ar/user_openid.po | 54 + l10n/ar_SA/admin_dependencies_chk.po | 73 + l10n/ar_SA/admin_migrate.po | 32 + l10n/ar_SA/bookmarks.po | 60 + l10n/ar_SA/calendar.po | 813 + l10n/ar_SA/contacts.po | 952 + l10n/ar_SA/core.po | 431 + l10n/ar_SA/files.po | 299 + l10n/ar_SA/files_encryption.po | 34 + l10n/ar_SA/files_external.po | 106 + l10n/ar_SA/files_odfviewer.po | 22 + l10n/ar_SA/files_pdfviewer.po | 42 + l10n/ar_SA/files_sharing.po | 48 + l10n/ar_SA/files_texteditor.po | 44 + l10n/ar_SA/files_versions.po | 42 + l10n/ar_SA/gallery.po | 58 + l10n/ar_SA/impress.po | 22 + l10n/ar_SA/lib.po | 125 + l10n/ar_SA/media.po | 66 + l10n/ar_SA/settings.po | 321 + l10n/ar_SA/tasks.po | 106 + l10n/ar_SA/user_ldap.po | 170 + l10n/ar_SA/user_migrate.po | 51 + l10n/ar_SA/user_openid.po | 54 + l10n/bg_BG/admin_dependencies_chk.po | 73 + l10n/bg_BG/admin_migrate.po | 32 + l10n/bg_BG/bookmarks.po | 61 + l10n/bg_BG/calendar.po | 519 +- l10n/bg_BG/contacts.po | 755 +- l10n/bg_BG/core.po | 302 +- l10n/bg_BG/files.po | 216 +- l10n/bg_BG/files_encryption.po | 34 + l10n/bg_BG/files_external.po | 106 + l10n/bg_BG/files_odfviewer.po | 22 + l10n/bg_BG/files_pdfviewer.po | 42 + l10n/bg_BG/files_sharing.po | 48 + l10n/bg_BG/files_texteditor.po | 44 + l10n/bg_BG/files_versions.po | 42 + l10n/bg_BG/impress.po | 22 + l10n/bg_BG/lib.po | 125 + l10n/bg_BG/media.po | 13 +- l10n/bg_BG/settings.po | 236 +- l10n/bg_BG/tasks.po | 106 + l10n/bg_BG/user_ldap.po | 170 + l10n/bg_BG/user_migrate.po | 51 + l10n/bg_BG/user_openid.po | 54 + l10n/ca/admin_dependencies_chk.po | 74 + l10n/ca/admin_migrate.po | 33 + l10n/ca/bookmarks.po | 61 + l10n/ca/calendar.po | 460 +- l10n/ca/contacts.po | 907 +- l10n/ca/core.po | 301 +- l10n/ca/files.po | 215 +- l10n/ca/files_encryption.po | 35 + l10n/ca/files_external.po | 107 + l10n/ca/files_odfviewer.po | 22 + l10n/ca/files_pdfviewer.po | 42 + l10n/ca/files_sharing.po | 49 + l10n/ca/files_texteditor.po | 44 + l10n/ca/files_versions.po | 44 + l10n/ca/gallery.po | 64 +- l10n/ca/impress.po | 22 + l10n/ca/lib.po | 126 + l10n/ca/settings.po | 227 +- l10n/ca/tasks.po | 107 + l10n/ca/user_ldap.po | 171 + l10n/ca/user_migrate.po | 52 + l10n/ca/user_openid.po | 55 + l10n/cs_CZ/admin_dependencies_chk.po | 74 + l10n/cs_CZ/admin_migrate.po | 33 + l10n/cs_CZ/bookmarks.po | 61 + l10n/cs_CZ/calendar.po | 454 +- l10n/cs_CZ/contacts.po | 909 +- l10n/cs_CZ/core.po | 336 +- l10n/cs_CZ/files.po | 244 +- l10n/cs_CZ/files_encryption.po | 36 + l10n/cs_CZ/files_external.po | 110 + l10n/cs_CZ/files_odfviewer.po | 22 + l10n/cs_CZ/files_pdfviewer.po | 42 + l10n/cs_CZ/files_sharing.po | 51 + l10n/cs_CZ/files_texteditor.po | 44 + l10n/cs_CZ/files_versions.po | 44 + l10n/cs_CZ/gallery.po | 84 +- l10n/cs_CZ/impress.po | 22 + l10n/cs_CZ/lib.po | 127 + l10n/cs_CZ/settings.po | 250 +- l10n/cs_CZ/tasks.po | 107 + l10n/cs_CZ/user_ldap.po | 172 + l10n/cs_CZ/user_migrate.po | 52 + l10n/cs_CZ/user_openid.po | 55 + l10n/da/admin_dependencies_chk.po | 73 + l10n/da/admin_migrate.po | 33 + l10n/da/bookmarks.po | 60 + l10n/da/calendar.po | 460 +- l10n/da/contacts.po | 902 +- l10n/da/core.po | 304 +- l10n/da/files.po | 217 +- l10n/da/files_encryption.po | 35 + l10n/da/files_external.po | 108 + l10n/da/files_odfviewer.po | 22 + l10n/da/files_pdfviewer.po | 42 + l10n/da/files_sharing.po | 50 + l10n/da/files_texteditor.po | 44 + l10n/da/files_versions.po | 44 + l10n/da/impress.po | 22 + l10n/da/lib.po | 127 + l10n/da/settings.po | 227 +- l10n/da/tasks.po | 107 + l10n/da/user_ldap.po | 172 + l10n/da/user_migrate.po | 51 + l10n/da/user_openid.po | 54 + l10n/de/admin_dependencies_chk.po | 77 + l10n/de/admin_migrate.po | 34 + l10n/de/bookmarks.po | 63 + l10n/de/calendar.po | 479 +- l10n/de/contacts.po | 947 +- l10n/de/core.po | 345 +- l10n/de/files.po | 239 +- l10n/de/files_encryption.po | 35 + l10n/de/files_external.po | 110 + l10n/de/files_odfviewer.po | 23 + l10n/de/files_pdfviewer.po | 43 + l10n/de/files_sharing.po | 53 + l10n/de/files_texteditor.po | 45 + l10n/de/files_versions.po | 47 + l10n/de/gallery.po | 66 +- l10n/de/impress.po | 23 + l10n/de/lib.po | 129 + l10n/de/settings.po | 250 +- l10n/de/tasks.po | 109 + l10n/de/user_ldap.po | 176 + l10n/de/user_migrate.po | 54 + l10n/de/user_openid.po | 57 + l10n/de_DE/calendar.po | 636 - l10n/de_DE/core.po | 170 - l10n/de_DE/files.po | 108 - l10n/de_DE/media.po | 64 - l10n/de_DE/settings.po | 156 - l10n/el/admin_dependencies_chk.po | 74 + l10n/el/admin_migrate.po | 33 + l10n/el/bookmarks.po | 62 + l10n/el/calendar.po | 462 +- l10n/el/contacts.po | 916 +- l10n/el/core.po | 301 +- l10n/el/files.po | 232 +- l10n/el/files_encryption.po | 35 + l10n/el/files_external.po | 111 + l10n/el/files_odfviewer.po | 22 + l10n/el/files_pdfviewer.po | 42 + l10n/el/files_sharing.po | 51 + l10n/el/files_texteditor.po | 44 + l10n/el/files_versions.po | 45 + l10n/el/gallery.po | 65 +- l10n/el/impress.po | 22 + l10n/el/lib.po | 126 + l10n/el/settings.po | 259 +- l10n/el/tasks.po | 107 + l10n/el/user_ldap.po | 173 + l10n/el/user_migrate.po | 52 + l10n/el/user_openid.po | 55 + l10n/eo/admin_dependencies_chk.po | 74 + l10n/eo/admin_migrate.po | 33 + l10n/eo/bookmarks.po | 61 + l10n/eo/calendar.po | 459 +- l10n/eo/contacts.po | 896 +- l10n/eo/core.po | 312 +- l10n/eo/files.po | 212 +- l10n/eo/files_encryption.po | 35 + l10n/eo/files_external.po | 107 + l10n/eo/files_odfviewer.po | 22 + l10n/eo/files_pdfviewer.po | 42 + l10n/eo/files_sharing.po | 49 + l10n/eo/files_texteditor.po | 44 + l10n/eo/files_versions.po | 43 + l10n/eo/impress.po | 22 + l10n/eo/lib.po | 126 + l10n/eo/media.po | 19 +- l10n/eo/settings.po | 222 +- l10n/eo/tasks.po | 107 + l10n/eo/user_ldap.po | 171 + l10n/eo/user_migrate.po | 52 + l10n/eo/user_openid.po | 55 + l10n/es/admin_dependencies_chk.po | 74 + l10n/es/admin_migrate.po | 33 + l10n/es/bookmarks.po | 61 + l10n/es/calendar.po | 460 +- l10n/es/contacts.po | 895 +- l10n/es/core.po | 305 +- l10n/es/files.po | 216 +- l10n/es/files_encryption.po | 35 + l10n/es/files_external.po | 109 + l10n/es/files_odfviewer.po | 22 + l10n/es/files_pdfviewer.po | 42 + l10n/es/files_sharing.po | 51 + l10n/es/files_texteditor.po | 44 + l10n/es/files_versions.po | 46 + l10n/es/gallery.po | 65 +- l10n/es/impress.po | 22 + l10n/es/lib.po | 127 + l10n/es/settings.po | 227 +- l10n/es/tasks.po | 107 + l10n/es/user_ldap.po | 175 + l10n/es/user_migrate.po | 52 + l10n/es/user_openid.po | 55 + l10n/es_AR/core.po | 432 + l10n/es_AR/files.po | 300 + l10n/es_AR/files_encryption.po | 35 + l10n/es_AR/files_external.po | 107 + l10n/es_AR/files_sharing.po | 49 + l10n/es_AR/files_versions.po | 43 + l10n/es_AR/lib.po | 126 + l10n/es_AR/settings.po | 322 + l10n/es_AR/user_ldap.po | 171 + l10n/et_EE/admin_dependencies_chk.po | 74 + l10n/et_EE/admin_migrate.po | 33 + l10n/et_EE/bookmarks.po | 61 + l10n/et_EE/calendar.po | 458 +- l10n/et_EE/contacts.po | 883 +- l10n/et_EE/core.po | 295 +- l10n/et_EE/files.po | 205 +- l10n/et_EE/files_encryption.po | 35 + l10n/et_EE/files_external.po | 107 + l10n/et_EE/files_odfviewer.po | 22 + l10n/et_EE/files_pdfviewer.po | 42 + l10n/et_EE/files_sharing.po | 49 + l10n/et_EE/files_texteditor.po | 44 + l10n/et_EE/files_versions.po | 43 + l10n/et_EE/impress.po | 22 + l10n/et_EE/lib.po | 126 + l10n/et_EE/settings.po | 223 +- l10n/et_EE/tasks.po | 107 + l10n/et_EE/user_ldap.po | 171 + l10n/et_EE/user_migrate.po | 51 + l10n/et_EE/user_openid.po | 55 + l10n/eu/admin_dependencies_chk.po | 73 + l10n/eu/admin_migrate.po | 32 + l10n/eu/bookmarks.po | 60 + l10n/eu/calendar.po | 450 +- l10n/eu/contacts.po | 905 +- l10n/eu/core.po | 297 +- l10n/eu/files.po | 211 +- l10n/eu/files_encryption.po | 35 + l10n/eu/files_external.po | 107 + l10n/eu/files_odfviewer.po | 22 + l10n/eu/files_pdfviewer.po | 42 + l10n/eu/files_sharing.po | 49 + l10n/eu/files_texteditor.po | 44 + l10n/eu/files_versions.po | 43 + l10n/eu/impress.po | 22 + l10n/eu/lib.po | 126 + l10n/eu/settings.po | 225 +- l10n/eu/tasks.po | 106 + l10n/eu/user_ldap.po | 171 + l10n/eu/user_migrate.po | 51 + l10n/eu/user_openid.po | 54 + l10n/eu_ES/admin_dependencies_chk.po | 73 + l10n/eu_ES/admin_migrate.po | 32 + l10n/eu_ES/bookmarks.po | 60 + l10n/eu_ES/calendar.po | 813 + l10n/eu_ES/contacts.po | 952 + l10n/eu_ES/core.po | 431 + l10n/eu_ES/files.po | 299 + l10n/eu_ES/files_encryption.po | 34 + l10n/eu_ES/files_external.po | 106 + l10n/eu_ES/files_odfviewer.po | 22 + l10n/eu_ES/files_pdfviewer.po | 42 + l10n/eu_ES/files_sharing.po | 48 + l10n/eu_ES/files_texteditor.po | 44 + l10n/eu_ES/files_versions.po | 42 + l10n/eu_ES/gallery.po | 58 + l10n/eu_ES/impress.po | 22 + l10n/eu_ES/lib.po | 125 + l10n/eu_ES/media.po | 66 + l10n/eu_ES/settings.po | 321 + l10n/eu_ES/tasks.po | 106 + l10n/eu_ES/user_ldap.po | 170 + l10n/eu_ES/user_migrate.po | 51 + l10n/eu_ES/user_openid.po | 54 + l10n/fa/admin_dependencies_chk.po | 73 + l10n/fa/admin_migrate.po | 32 + l10n/fa/bookmarks.po | 61 + l10n/fa/calendar.po | 458 +- l10n/fa/contacts.po | 889 +- l10n/fa/core.po | 295 +- l10n/fa/files.po | 203 +- l10n/fa/files_encryption.po | 35 + l10n/fa/files_external.po | 106 + l10n/fa/files_odfviewer.po | 22 + l10n/fa/files_pdfviewer.po | 42 + l10n/fa/files_sharing.po | 49 + l10n/fa/files_texteditor.po | 44 + l10n/fa/files_versions.po | 43 + l10n/fa/impress.po | 22 + l10n/fa/lib.po | 126 + l10n/fa/settings.po | 222 +- l10n/fa/tasks.po | 107 + l10n/fa/user_ldap.po | 171 + l10n/fa/user_migrate.po | 51 + l10n/fa/user_openid.po | 54 + l10n/fi/admin_dependencies_chk.po | 73 + l10n/fi/admin_migrate.po | 32 + l10n/fi/bookmarks.po | 60 + l10n/fi/calendar.po | 813 + l10n/fi/contacts.po | 952 + l10n/fi/core.po | 431 + l10n/fi/files.po | 299 + l10n/fi/files_encryption.po | 34 + l10n/fi/files_external.po | 106 + l10n/fi/files_odfviewer.po | 22 + l10n/fi/files_pdfviewer.po | 42 + l10n/fi/files_sharing.po | 48 + l10n/fi/files_texteditor.po | 44 + l10n/fi/files_versions.po | 42 + l10n/fi/gallery.po | 58 + l10n/fi/impress.po | 22 + l10n/fi/lib.po | 125 + l10n/fi/media.po | 66 + l10n/fi/settings.po | 321 + l10n/fi/tasks.po | 106 + l10n/fi/user_ldap.po | 170 + l10n/fi/user_migrate.po | 51 + l10n/fi/user_openid.po | 54 + l10n/fi_FI/admin_dependencies_chk.po | 74 + l10n/fi_FI/admin_migrate.po | 33 + l10n/fi_FI/bookmarks.po | 61 + l10n/fi_FI/calendar.po | 446 +- l10n/fi_FI/contacts.po | 889 +- l10n/fi_FI/core.po | 299 +- l10n/fi_FI/files.po | 210 +- l10n/fi_FI/files_encryption.po | 35 + l10n/fi_FI/files_external.po | 109 + l10n/fi_FI/files_odfviewer.po | 22 + l10n/fi_FI/files_pdfviewer.po | 42 + l10n/fi_FI/files_sharing.po | 50 + l10n/fi_FI/files_texteditor.po | 44 + l10n/fi_FI/files_versions.po | 43 + l10n/fi_FI/gallery.po | 64 +- l10n/fi_FI/impress.po | 22 + l10n/fi_FI/lib.po | 126 + l10n/fi_FI/settings.po | 224 +- l10n/fi_FI/tasks.po | 107 + l10n/fi_FI/user_ldap.po | 173 + l10n/fi_FI/user_migrate.po | 52 + l10n/fi_FI/user_openid.po | 55 + l10n/fr/admin_dependencies_chk.po | 74 + l10n/fr/admin_migrate.po | 33 + l10n/fr/bookmarks.po | 62 + l10n/fr/calendar.po | 461 +- l10n/fr/contacts.po | 933 +- l10n/fr/core.po | 309 +- l10n/fr/files.po | 223 +- l10n/fr/files_encryption.po | 35 + l10n/fr/files_external.po | 107 + l10n/fr/files_odfviewer.po | 22 + l10n/fr/files_pdfviewer.po | 42 + l10n/fr/files_sharing.po | 53 + l10n/fr/files_texteditor.po | 44 + l10n/fr/files_versions.po | 43 + l10n/fr/gallery.po | 66 +- l10n/fr/impress.po | 22 + l10n/fr/lib.po | 127 + l10n/fr/media.po | 16 +- l10n/fr/settings.po | 227 +- l10n/fr/tasks.po | 109 + l10n/fr/user_ldap.po | 175 + l10n/fr/user_migrate.po | 53 + l10n/fr/user_openid.po | 55 + l10n/gl/admin_dependencies_chk.po | 73 + l10n/gl/admin_migrate.po | 33 + l10n/gl/bookmarks.po | 60 + l10n/gl/calendar.po | 458 +- l10n/gl/contacts.po | 1003 +- l10n/gl/core.po | 295 +- l10n/gl/files.po | 205 +- l10n/gl/files_encryption.po | 35 + l10n/gl/files_external.po | 107 + l10n/gl/files_odfviewer.po | 22 + l10n/gl/files_pdfviewer.po | 42 + l10n/gl/files_sharing.po | 49 + l10n/gl/files_texteditor.po | 44 + l10n/gl/files_versions.po | 43 + l10n/gl/impress.po | 22 + l10n/gl/lib.po | 126 + l10n/gl/settings.po | 221 +- l10n/gl/tasks.po | 106 + l10n/gl/user_ldap.po | 170 + l10n/gl/user_migrate.po | 51 + l10n/gl/user_openid.po | 54 + l10n/he/admin_dependencies_chk.po | 73 + l10n/he/admin_migrate.po | 32 + l10n/he/bookmarks.po | 60 + l10n/he/calendar.po | 459 +- l10n/he/contacts.po | 958 +- l10n/he/core.po | 297 +- l10n/he/files.po | 203 +- l10n/he/files_encryption.po | 34 + l10n/he/files_external.po | 107 + l10n/he/files_odfviewer.po | 22 + l10n/he/files_pdfviewer.po | 42 + l10n/he/files_sharing.po | 49 + l10n/he/files_texteditor.po | 44 + l10n/he/files_versions.po | 43 + l10n/he/impress.po | 22 + l10n/he/lib.po | 126 + l10n/he/settings.po | 222 +- l10n/he/tasks.po | 106 + l10n/he/user_ldap.po | 170 + l10n/he/user_migrate.po | 51 + l10n/he/user_openid.po | 54 + l10n/hi/core.po | 432 + l10n/hi/files.po | 299 + l10n/hi/files_encryption.po | 34 + l10n/hi/files_external.po | 106 + l10n/hi/files_sharing.po | 48 + l10n/hi/files_versions.po | 42 + l10n/hi/lib.po | 125 + l10n/hi/settings.po | 321 + l10n/hi/user_ldap.po | 170 + l10n/hr/admin_dependencies_chk.po | 73 + l10n/hr/admin_migrate.po | 32 + l10n/hr/bookmarks.po | 60 + l10n/hr/calendar.po | 448 +- l10n/hr/contacts.po | 877 +- l10n/hr/core.po | 302 +- l10n/hr/files.po | 214 +- l10n/hr/files_encryption.po | 34 + l10n/hr/files_external.po | 106 + l10n/hr/files_odfviewer.po | 22 + l10n/hr/files_pdfviewer.po | 42 + l10n/hr/files_sharing.po | 48 + l10n/hr/files_texteditor.po | 44 + l10n/hr/files_versions.po | 42 + l10n/hr/impress.po | 22 + l10n/hr/lib.po | 125 + l10n/hr/settings.po | 224 +- l10n/hr/tasks.po | 106 + l10n/hr/user_ldap.po | 170 + l10n/hr/user_migrate.po | 51 + l10n/hr/user_openid.po | 54 + l10n/hu_HU/admin_dependencies_chk.po | 73 + l10n/hu_HU/admin_migrate.po | 32 + l10n/hu_HU/bookmarks.po | 60 + l10n/hu_HU/calendar.po | 458 +- l10n/hu_HU/contacts.po | 889 +- l10n/hu_HU/core.po | 321 +- l10n/hu_HU/files.po | 201 +- l10n/hu_HU/files_encryption.po | 35 + l10n/hu_HU/files_external.po | 106 + l10n/hu_HU/files_odfviewer.po | 22 + l10n/hu_HU/files_pdfviewer.po | 42 + l10n/hu_HU/files_sharing.po | 49 + l10n/hu_HU/files_texteditor.po | 44 + l10n/hu_HU/files_versions.po | 42 + l10n/hu_HU/impress.po | 22 + l10n/hu_HU/lib.po | 126 + l10n/hu_HU/settings.po | 221 +- l10n/hu_HU/tasks.po | 106 + l10n/hu_HU/user_ldap.po | 170 + l10n/hu_HU/user_migrate.po | 51 + l10n/hu_HU/user_openid.po | 54 + l10n/hy/admin_dependencies_chk.po | 73 + l10n/hy/admin_migrate.po | 32 + l10n/hy/bookmarks.po | 60 + l10n/hy/calendar.po | 428 +- l10n/hy/contacts.po | 755 +- l10n/hy/core.po | 255 +- l10n/hy/files.po | 189 +- l10n/hy/files_encryption.po | 34 + l10n/hy/files_external.po | 106 + l10n/hy/files_odfviewer.po | 22 + l10n/hy/files_pdfviewer.po | 42 + l10n/hy/files_sharing.po | 48 + l10n/hy/files_texteditor.po | 44 + l10n/hy/files_versions.po | 42 + l10n/hy/impress.po | 22 + l10n/hy/lib.po | 125 + l10n/hy/settings.po | 203 +- l10n/hy/tasks.po | 106 + l10n/hy/user_ldap.po | 170 + l10n/hy/user_migrate.po | 51 + l10n/hy/user_openid.po | 54 + l10n/ia/admin_dependencies_chk.po | 73 + l10n/ia/admin_migrate.po | 32 + l10n/ia/bookmarks.po | 60 + l10n/ia/calendar.po | 438 +- l10n/ia/contacts.po | 825 +- l10n/ia/core.po | 263 +- l10n/ia/files.po | 189 +- l10n/ia/files_encryption.po | 34 + l10n/ia/files_external.po | 106 + l10n/ia/files_odfviewer.po | 22 + l10n/ia/files_pdfviewer.po | 42 + l10n/ia/files_sharing.po | 48 + l10n/ia/files_texteditor.po | 44 + l10n/ia/files_versions.po | 42 + l10n/ia/impress.po | 22 + l10n/ia/lib.po | 125 + l10n/ia/settings.po | 207 +- l10n/ia/tasks.po | 106 + l10n/ia/user_ldap.po | 170 + l10n/ia/user_migrate.po | 51 + l10n/ia/user_openid.po | 54 + l10n/id/admin_dependencies_chk.po | 73 + l10n/id/admin_migrate.po | 32 + l10n/id/bookmarks.po | 60 + l10n/id/calendar.po | 430 +- l10n/id/contacts.po | 755 +- l10n/id/core.po | 296 +- l10n/id/files.po | 206 +- l10n/id/files_encryption.po | 34 + l10n/id/files_external.po | 106 + l10n/id/files_odfviewer.po | 22 + l10n/id/files_pdfviewer.po | 42 + l10n/id/files_sharing.po | 48 + l10n/id/files_texteditor.po | 44 + l10n/id/files_versions.po | 42 + l10n/id/impress.po | 22 + l10n/id/lib.po | 125 + l10n/id/settings.po | 222 +- l10n/id/tasks.po | 106 + l10n/id/user_ldap.po | 170 + l10n/id/user_migrate.po | 51 + l10n/id/user_openid.po | 54 + l10n/id_ID/admin_dependencies_chk.po | 73 + l10n/id_ID/admin_migrate.po | 32 + l10n/id_ID/bookmarks.po | 60 + l10n/id_ID/calendar.po | 813 + l10n/id_ID/contacts.po | 952 + l10n/id_ID/core.po | 431 + l10n/id_ID/files.po | 299 + l10n/id_ID/files_encryption.po | 34 + l10n/id_ID/files_external.po | 106 + l10n/id_ID/files_odfviewer.po | 22 + l10n/id_ID/files_pdfviewer.po | 42 + l10n/id_ID/files_sharing.po | 48 + l10n/id_ID/files_texteditor.po | 44 + l10n/id_ID/files_versions.po | 42 + l10n/id_ID/gallery.po | 58 + l10n/id_ID/impress.po | 22 + l10n/id_ID/lib.po | 125 + l10n/id_ID/media.po | 66 + l10n/id_ID/settings.po | 321 + l10n/id_ID/tasks.po | 106 + l10n/id_ID/user_ldap.po | 170 + l10n/id_ID/user_migrate.po | 51 + l10n/id_ID/user_openid.po | 54 + l10n/it/admin_dependencies_chk.po | 74 + l10n/it/admin_migrate.po | 33 + l10n/it/bookmarks.po | 61 + l10n/it/calendar.po | 458 +- l10n/it/contacts.po | 907 +- l10n/it/core.po | 303 +- l10n/it/files.po | 211 +- l10n/it/files_encryption.po | 35 + l10n/it/files_external.po | 108 + l10n/it/files_odfviewer.po | 22 + l10n/it/files_pdfviewer.po | 42 + l10n/it/files_sharing.po | 49 + l10n/it/files_texteditor.po | 44 + l10n/it/files_versions.po | 43 + l10n/it/gallery.po | 64 +- l10n/it/impress.po | 22 + l10n/it/lib.po | 126 + l10n/it/settings.po | 223 +- l10n/it/tasks.po | 107 + l10n/it/user_ldap.po | 172 + l10n/it/user_migrate.po | 52 + l10n/it/user_openid.po | 55 + l10n/ja_JP/admin_dependencies_chk.po | 74 + l10n/ja_JP/admin_migrate.po | 33 + l10n/ja_JP/bookmarks.po | 60 + l10n/ja_JP/calendar.po | 503 +- l10n/ja_JP/contacts.po | 940 +- l10n/ja_JP/core.po | 300 +- l10n/ja_JP/files.po | 212 +- l10n/ja_JP/files_encryption.po | 35 + l10n/ja_JP/files_external.po | 107 + l10n/ja_JP/files_odfviewer.po | 22 + l10n/ja_JP/files_pdfviewer.po | 42 + l10n/ja_JP/files_sharing.po | 50 + l10n/ja_JP/files_texteditor.po | 44 + l10n/ja_JP/files_versions.po | 44 + l10n/ja_JP/impress.po | 22 + l10n/ja_JP/lib.po | 126 + l10n/ja_JP/settings.po | 221 +- l10n/ja_JP/tasks.po | 108 + l10n/ja_JP/user_ldap.po | 172 + l10n/ja_JP/user_migrate.po | 52 + l10n/ja_JP/user_openid.po | 55 + l10n/ko/admin_dependencies_chk.po | 73 + l10n/ko/admin_migrate.po | 32 + l10n/ko/bookmarks.po | 60 + l10n/ko/calendar.po | 460 +- l10n/ko/contacts.po | 959 +- l10n/ko/core.po | 295 +- l10n/ko/files.po | 201 +- l10n/ko/files_encryption.po | 34 + l10n/ko/files_external.po | 106 + l10n/ko/files_odfviewer.po | 22 + l10n/ko/files_pdfviewer.po | 42 + l10n/ko/files_sharing.po | 48 + l10n/ko/files_texteditor.po | 44 + l10n/ko/files_versions.po | 42 + l10n/ko/impress.po | 22 + l10n/ko/lib.po | 125 + l10n/ko/settings.po | 221 +- l10n/ko/tasks.po | 106 + l10n/ko/user_ldap.po | 170 + l10n/ko/user_migrate.po | 51 + l10n/ko/user_openid.po | 54 + l10n/ku_IQ/core.po | 432 + l10n/ku_IQ/files.po | 299 + l10n/ku_IQ/files_encryption.po | 35 + l10n/ku_IQ/files_external.po | 106 + l10n/ku_IQ/files_sharing.po | 49 + l10n/ku_IQ/files_versions.po | 43 + l10n/ku_IQ/lib.po | 125 + l10n/ku_IQ/settings.po | 321 + l10n/ku_IQ/user_ldap.po | 170 + l10n/l10n.pl | 2 +- l10n/lb/admin_dependencies_chk.po | 73 + l10n/lb/admin_migrate.po | 32 + l10n/lb/bookmarks.po | 60 + l10n/lb/calendar.po | 444 +- l10n/lb/contacts.po | 883 +- l10n/lb/core.po | 299 +- l10n/lb/files.po | 205 +- l10n/lb/files_encryption.po | 34 + l10n/lb/files_external.po | 106 + l10n/lb/files_odfviewer.po | 22 + l10n/lb/files_pdfviewer.po | 42 + l10n/lb/files_sharing.po | 48 + l10n/lb/files_texteditor.po | 44 + l10n/lb/files_versions.po | 42 + l10n/lb/impress.po | 22 + l10n/lb/lib.po | 125 + l10n/lb/settings.po | 223 +- l10n/lb/tasks.po | 106 + l10n/lb/user_ldap.po | 170 + l10n/lb/user_migrate.po | 51 + l10n/lb/user_openid.po | 54 + l10n/lt_LT/admin_dependencies_chk.po | 74 + l10n/lt_LT/admin_migrate.po | 33 + l10n/lt_LT/bookmarks.po | 61 + l10n/lt_LT/calendar.po | 448 +- l10n/lt_LT/contacts.po | 837 +- l10n/lt_LT/core.po | 299 +- l10n/lt_LT/files.po | 214 +- l10n/lt_LT/files_encryption.po | 35 + l10n/lt_LT/files_external.po | 107 + l10n/lt_LT/files_odfviewer.po | 22 + l10n/lt_LT/files_pdfviewer.po | 42 + l10n/lt_LT/files_sharing.po | 49 + l10n/lt_LT/files_texteditor.po | 44 + l10n/lt_LT/files_versions.po | 43 + l10n/lt_LT/impress.po | 22 + l10n/lt_LT/lib.po | 126 + l10n/lt_LT/settings.po | 217 +- l10n/lt_LT/tasks.po | 107 + l10n/lt_LT/user_ldap.po | 171 + l10n/lt_LT/user_migrate.po | 52 + l10n/lt_LT/user_openid.po | 54 + l10n/lv/admin_dependencies_chk.po | 73 + l10n/lv/admin_migrate.po | 32 + l10n/lv/bookmarks.po | 60 + l10n/lv/calendar.po | 813 + l10n/lv/contacts.po | 952 + l10n/lv/core.po | 432 + l10n/lv/files.po | 300 + l10n/lv/files_encryption.po | 34 + l10n/lv/files_external.po | 106 + l10n/lv/files_odfviewer.po | 22 + l10n/lv/files_pdfviewer.po | 42 + l10n/lv/files_sharing.po | 48 + l10n/lv/files_texteditor.po | 44 + l10n/lv/files_versions.po | 42 + l10n/lv/gallery.po | 58 + l10n/lv/impress.po | 22 + l10n/lv/lib.po | 125 + l10n/lv/media.po | 66 + l10n/lv/settings.po | 322 + l10n/lv/tasks.po | 106 + l10n/lv/user_ldap.po | 170 + l10n/lv/user_migrate.po | 51 + l10n/lv/user_openid.po | 54 + l10n/mk/admin_dependencies_chk.po | 73 + l10n/mk/admin_migrate.po | 32 + l10n/mk/bookmarks.po | 60 + l10n/mk/calendar.po | 459 +- l10n/mk/contacts.po | 890 +- l10n/mk/core.po | 296 +- l10n/mk/files.po | 202 +- l10n/mk/files_encryption.po | 34 + l10n/mk/files_external.po | 106 + l10n/mk/files_odfviewer.po | 22 + l10n/mk/files_pdfviewer.po | 42 + l10n/mk/files_sharing.po | 48 + l10n/mk/files_texteditor.po | 44 + l10n/mk/files_versions.po | 42 + l10n/mk/impress.po | 22 + l10n/mk/lib.po | 125 + l10n/mk/settings.po | 222 +- l10n/mk/tasks.po | 106 + l10n/mk/user_ldap.po | 170 + l10n/mk/user_migrate.po | 51 + l10n/mk/user_openid.po | 54 + l10n/ms_MY/admin_dependencies_chk.po | 73 + l10n/ms_MY/admin_migrate.po | 32 + l10n/ms_MY/bookmarks.po | 60 + l10n/ms_MY/calendar.po | 509 +- l10n/ms_MY/contacts.po | 1019 +- l10n/ms_MY/core.po | 308 +- l10n/ms_MY/files.po | 225 +- l10n/ms_MY/files_encryption.po | 34 + l10n/ms_MY/files_external.po | 106 + l10n/ms_MY/files_odfviewer.po | 22 + l10n/ms_MY/files_pdfviewer.po | 42 + l10n/ms_MY/files_sharing.po | 48 + l10n/ms_MY/files_texteditor.po | 44 + l10n/ms_MY/files_versions.po | 42 + l10n/ms_MY/impress.po | 22 + l10n/ms_MY/lib.po | 125 + l10n/ms_MY/settings.po | 245 +- l10n/ms_MY/tasks.po | 106 + l10n/ms_MY/user_ldap.po | 170 + l10n/ms_MY/user_migrate.po | 51 + l10n/ms_MY/user_openid.po | 54 + l10n/nb_NO/admin_dependencies_chk.po | 74 + l10n/nb_NO/admin_migrate.po | 33 + l10n/nb_NO/bookmarks.po | 62 + l10n/nb_NO/calendar.po | 450 +- l10n/nb_NO/contacts.po | 877 +- l10n/nb_NO/core.po | 296 +- l10n/nb_NO/files.po | 204 +- l10n/nb_NO/files_encryption.po | 35 + l10n/nb_NO/files_external.po | 107 + l10n/nb_NO/files_odfviewer.po | 22 + l10n/nb_NO/files_pdfviewer.po | 42 + l10n/nb_NO/files_sharing.po | 49 + l10n/nb_NO/files_texteditor.po | 44 + l10n/nb_NO/files_versions.po | 43 + l10n/nb_NO/gallery.po | 85 +- l10n/nb_NO/impress.po | 22 + l10n/nb_NO/lib.po | 127 + l10n/nb_NO/settings.po | 229 +- l10n/nb_NO/tasks.po | 107 + l10n/nb_NO/user_ldap.po | 170 + l10n/nb_NO/user_migrate.po | 51 + l10n/nb_NO/user_openid.po | 54 + l10n/nl/admin_dependencies_chk.po | 73 + l10n/nl/admin_migrate.po | 33 + l10n/nl/bookmarks.po | 61 + l10n/nl/calendar.po | 462 +- l10n/nl/contacts.po | 920 +- l10n/nl/core.po | 304 +- l10n/nl/files.po | 214 +- l10n/nl/files_encryption.po | 35 + l10n/nl/files_external.po | 107 + l10n/nl/files_odfviewer.po | 22 + l10n/nl/files_pdfviewer.po | 42 + l10n/nl/files_sharing.po | 50 + l10n/nl/files_texteditor.po | 44 + l10n/nl/files_versions.po | 43 + l10n/nl/gallery.po | 85 +- l10n/nl/impress.po | 22 + l10n/nl/lib.po | 126 + l10n/nl/settings.po | 225 +- l10n/nl/tasks.po | 106 + l10n/nl/user_ldap.po | 170 + l10n/nl/user_migrate.po | 51 + l10n/nl/user_openid.po | 55 + l10n/nn_NO/admin_dependencies_chk.po | 73 + l10n/nn_NO/admin_migrate.po | 32 + l10n/nn_NO/bookmarks.po | 60 + l10n/nn_NO/calendar.po | 446 +- l10n/nn_NO/contacts.po | 821 +- l10n/nn_NO/core.po | 263 +- l10n/nn_NO/files.po | 189 +- l10n/nn_NO/files_encryption.po | 34 + l10n/nn_NO/files_external.po | 106 + l10n/nn_NO/files_odfviewer.po | 22 + l10n/nn_NO/files_pdfviewer.po | 42 + l10n/nn_NO/files_sharing.po | 48 + l10n/nn_NO/files_texteditor.po | 44 + l10n/nn_NO/files_versions.po | 42 + l10n/nn_NO/impress.po | 22 + l10n/nn_NO/lib.po | 125 + l10n/nn_NO/settings.po | 217 +- l10n/nn_NO/tasks.po | 106 + l10n/nn_NO/user_ldap.po | 170 + l10n/nn_NO/user_migrate.po | 51 + l10n/nn_NO/user_openid.po | 54 + l10n/oc/core.po | 432 + l10n/oc/files.po | 300 + l10n/oc/files_encryption.po | 34 + l10n/oc/files_external.po | 106 + l10n/oc/files_sharing.po | 48 + l10n/oc/files_versions.po | 42 + l10n/oc/lib.po | 126 + l10n/oc/settings.po | 322 + l10n/oc/user_ldap.po | 170 + l10n/pl/admin_dependencies_chk.po | 74 + l10n/pl/admin_migrate.po | 33 + l10n/pl/bookmarks.po | 60 + l10n/pl/calendar.po | 459 +- l10n/pl/contacts.po | 902 +- l10n/pl/core.po | 302 +- l10n/pl/files.po | 215 +- l10n/pl/files_encryption.po | 35 + l10n/pl/files_external.po | 108 + l10n/pl/files_odfviewer.po | 22 + l10n/pl/files_pdfviewer.po | 42 + l10n/pl/files_sharing.po | 51 + l10n/pl/files_texteditor.po | 44 + l10n/pl/files_versions.po | 44 + l10n/pl/gallery.po | 65 +- l10n/pl/impress.po | 22 + l10n/pl/lib.po | 126 + l10n/pl/settings.po | 224 +- l10n/pl/tasks.po | 107 + l10n/pl/user_ldap.po | 172 + l10n/pl/user_migrate.po | 52 + l10n/pl/user_openid.po | 55 + l10n/pl_PL/core.po | 431 + l10n/pl_PL/files.po | 299 + l10n/pl_PL/files_encryption.po | 34 + l10n/pl_PL/files_external.po | 106 + l10n/pl_PL/files_sharing.po | 48 + l10n/pl_PL/files_versions.po | 42 + l10n/pl_PL/lib.po | 125 + l10n/pl_PL/settings.po | 321 + l10n/pl_PL/user_ldap.po | 170 + l10n/pt_BR/admin_dependencies_chk.po | 73 + l10n/pt_BR/admin_migrate.po | 32 + l10n/pt_BR/bookmarks.po | 60 + l10n/pt_BR/calendar.po | 459 +- l10n/pt_BR/contacts.po | 891 +- l10n/pt_BR/core.po | 302 +- l10n/pt_BR/files.po | 214 +- l10n/pt_BR/files_encryption.po | 35 + l10n/pt_BR/files_external.po | 107 + l10n/pt_BR/files_odfviewer.po | 22 + l10n/pt_BR/files_pdfviewer.po | 42 + l10n/pt_BR/files_sharing.po | 49 + l10n/pt_BR/files_texteditor.po | 44 + l10n/pt_BR/files_versions.po | 44 + l10n/pt_BR/impress.po | 22 + l10n/pt_BR/lib.po | 126 + l10n/pt_BR/settings.po | 224 +- l10n/pt_BR/tasks.po | 106 + l10n/pt_BR/user_ldap.po | 171 + l10n/pt_BR/user_migrate.po | 51 + l10n/pt_BR/user_openid.po | 54 + l10n/pt_PT/admin_dependencies_chk.po | 73 + l10n/pt_PT/admin_migrate.po | 32 + l10n/pt_PT/bookmarks.po | 60 + l10n/pt_PT/calendar.po | 457 +- l10n/pt_PT/contacts.po | 946 +- l10n/pt_PT/core.po | 300 +- l10n/pt_PT/files.po | 225 +- l10n/pt_PT/files_encryption.po | 35 + l10n/pt_PT/files_external.po | 107 + l10n/pt_PT/files_odfviewer.po | 22 + l10n/pt_PT/files_pdfviewer.po | 42 + l10n/pt_PT/files_sharing.po | 49 + l10n/pt_PT/files_texteditor.po | 44 + l10n/pt_PT/files_versions.po | 43 + l10n/pt_PT/gallery.po | 85 +- l10n/pt_PT/impress.po | 22 + l10n/pt_PT/lib.po | 126 + l10n/pt_PT/settings.po | 233 +- l10n/pt_PT/tasks.po | 106 + l10n/pt_PT/user_ldap.po | 172 + l10n/pt_PT/user_migrate.po | 51 + l10n/pt_PT/user_openid.po | 54 + l10n/ro/admin_dependencies_chk.po | 73 + l10n/ro/admin_migrate.po | 32 + l10n/ro/bookmarks.po | 60 + l10n/ro/calendar.po | 448 +- l10n/ro/contacts.po | 823 +- l10n/ro/core.po | 298 +- l10n/ro/files.po | 212 +- l10n/ro/files_encryption.po | 35 + l10n/ro/files_external.po | 107 + l10n/ro/files_odfviewer.po | 22 + l10n/ro/files_pdfviewer.po | 42 + l10n/ro/files_sharing.po | 49 + l10n/ro/files_texteditor.po | 44 + l10n/ro/files_versions.po | 43 + l10n/ro/impress.po | 22 + l10n/ro/lib.po | 126 + l10n/ro/settings.po | 223 +- l10n/ro/tasks.po | 107 + l10n/ro/user_ldap.po | 172 + l10n/ro/user_migrate.po | 51 + l10n/ro/user_openid.po | 54 + l10n/ru/admin_dependencies_chk.po | 74 + l10n/ru/admin_migrate.po | 33 + l10n/ru/bookmarks.po | 61 + l10n/ru/calendar.po | 474 +- l10n/ru/contacts.po | 958 +- l10n/ru/core.po | 297 +- l10n/ru/files.po | 224 +- l10n/ru/files_encryption.po | 35 + l10n/ru/files_external.po | 107 + l10n/ru/files_odfviewer.po | 22 + l10n/ru/files_pdfviewer.po | 42 + l10n/ru/files_sharing.po | 51 + l10n/ru/files_texteditor.po | 44 + l10n/ru/files_versions.po | 44 + l10n/ru/gallery.po | 85 +- l10n/ru/impress.po | 22 + l10n/ru/lib.po | 128 + l10n/ru/settings.po | 225 +- l10n/ru/tasks.po | 107 + l10n/ru/user_ldap.po | 172 + l10n/ru/user_migrate.po | 52 + l10n/ru/user_openid.po | 55 + l10n/ru_RU/core.po | 432 + l10n/ru_RU/files.po | 300 + l10n/ru_RU/files_encryption.po | 35 + l10n/ru_RU/files_external.po | 107 + l10n/ru_RU/files_sharing.po | 49 + l10n/ru_RU/files_versions.po | 43 + l10n/ru_RU/lib.po | 126 + l10n/ru_RU/settings.po | 322 + l10n/ru_RU/user_ldap.po | 171 + l10n/si_LK/core.po | 432 + l10n/si_LK/files.po | 300 + l10n/si_LK/files_encryption.po | 34 + l10n/si_LK/files_external.po | 106 + l10n/si_LK/files_sharing.po | 48 + l10n/si_LK/files_versions.po | 42 + l10n/si_LK/lib.po | 125 + l10n/si_LK/settings.po | 321 + l10n/si_LK/user_ldap.po | 170 + l10n/sk_SK/admin_dependencies_chk.po | 73 + l10n/sk_SK/admin_migrate.po | 32 + l10n/sk_SK/bookmarks.po | 60 + l10n/sk_SK/calendar.po | 458 +- l10n/sk_SK/contacts.po | 894 +- l10n/sk_SK/core.po | 300 +- l10n/sk_SK/files.po | 218 +- l10n/sk_SK/files_encryption.po | 35 + l10n/sk_SK/files_external.po | 108 + l10n/sk_SK/files_odfviewer.po | 22 + l10n/sk_SK/files_pdfviewer.po | 42 + l10n/sk_SK/files_sharing.po | 50 + l10n/sk_SK/files_texteditor.po | 44 + l10n/sk_SK/files_versions.po | 43 + l10n/sk_SK/impress.po | 22 + l10n/sk_SK/lib.po | 126 + l10n/sk_SK/settings.po | 222 +- l10n/sk_SK/tasks.po | 106 + l10n/sk_SK/user_ldap.po | 170 + l10n/sk_SK/user_migrate.po | 51 + l10n/sk_SK/user_openid.po | 54 + l10n/sl/admin_dependencies_chk.po | 74 + l10n/sl/admin_migrate.po | 33 + l10n/sl/bookmarks.po | 61 + l10n/sl/calendar.po | 458 +- l10n/sl/contacts.po | 907 +- l10n/sl/core.po | 295 +- l10n/sl/files.po | 209 +- l10n/sl/files_encryption.po | 35 + l10n/sl/files_external.po | 107 + l10n/sl/files_odfviewer.po | 22 + l10n/sl/files_pdfviewer.po | 42 + l10n/sl/files_sharing.po | 49 + l10n/sl/files_texteditor.po | 44 + l10n/sl/files_versions.po | 43 + l10n/sl/gallery.po | 64 +- l10n/sl/impress.po | 22 + l10n/sl/lib.po | 126 + l10n/sl/settings.po | 219 +- l10n/sl/tasks.po | 107 + l10n/sl/user_ldap.po | 171 + l10n/sl/user_migrate.po | 52 + l10n/sl/user_openid.po | 55 + l10n/so/admin_dependencies_chk.po | 73 + l10n/so/admin_migrate.po | 32 + l10n/so/bookmarks.po | 60 + l10n/so/calendar.po | 813 + l10n/so/contacts.po | 952 + l10n/so/core.po | 431 + l10n/so/files.po | 299 + l10n/so/files_encryption.po | 34 + l10n/so/files_external.po | 106 + l10n/so/files_odfviewer.po | 22 + l10n/so/files_pdfviewer.po | 42 + l10n/so/files_sharing.po | 48 + l10n/so/files_texteditor.po | 44 + l10n/so/files_versions.po | 42 + l10n/so/gallery.po | 58 + l10n/so/impress.po | 22 + l10n/so/lib.po | 125 + l10n/so/media.po | 66 + l10n/so/settings.po | 321 + l10n/so/tasks.po | 106 + l10n/so/user_ldap.po | 170 + l10n/so/user_migrate.po | 51 + l10n/so/user_openid.po | 54 + l10n/sr/admin_dependencies_chk.po | 73 + l10n/sr/admin_migrate.po | 32 + l10n/sr/bookmarks.po | 60 + l10n/sr/calendar.po | 430 +- l10n/sr/contacts.po | 809 +- l10n/sr/core.po | 263 +- l10n/sr/files.po | 189 +- l10n/sr/files_encryption.po | 34 + l10n/sr/files_external.po | 106 + l10n/sr/files_odfviewer.po | 22 + l10n/sr/files_pdfviewer.po | 42 + l10n/sr/files_sharing.po | 48 + l10n/sr/files_texteditor.po | 44 + l10n/sr/files_versions.po | 42 + l10n/sr/impress.po | 22 + l10n/sr/lib.po | 125 + l10n/sr/settings.po | 209 +- l10n/sr/tasks.po | 106 + l10n/sr/user_ldap.po | 170 + l10n/sr/user_migrate.po | 51 + l10n/sr/user_openid.po | 54 + l10n/sr@latin/admin_dependencies_chk.po | 73 + l10n/sr@latin/admin_migrate.po | 32 + l10n/sr@latin/bookmarks.po | 60 + l10n/sr@latin/calendar.po | 430 +- l10n/sr@latin/contacts.po | 785 +- l10n/sr@latin/core.po | 261 +- l10n/sr@latin/files.po | 189 +- l10n/sr@latin/files_encryption.po | 34 + l10n/sr@latin/files_external.po | 106 + l10n/sr@latin/files_odfviewer.po | 22 + l10n/sr@latin/files_pdfviewer.po | 42 + l10n/sr@latin/files_sharing.po | 48 + l10n/sr@latin/files_texteditor.po | 44 + l10n/sr@latin/files_versions.po | 42 + l10n/sr@latin/impress.po | 22 + l10n/sr@latin/lib.po | 125 + l10n/sr@latin/settings.po | 209 +- l10n/sr@latin/tasks.po | 106 + l10n/sr@latin/user_ldap.po | 170 + l10n/sr@latin/user_migrate.po | 51 + l10n/sr@latin/user_openid.po | 54 + l10n/sv/admin_dependencies_chk.po | 74 + l10n/sv/admin_migrate.po | 33 + l10n/sv/bookmarks.po | 61 + l10n/sv/calendar.po | 459 +- l10n/sv/contacts.po | 951 +- l10n/sv/core.po | 317 +- l10n/sv/files.po | 227 +- l10n/sv/files_encryption.po | 35 + l10n/sv/files_external.po | 107 + l10n/sv/files_odfviewer.po | 22 + l10n/sv/files_pdfviewer.po | 42 + l10n/sv/files_sharing.po | 49 + l10n/sv/files_texteditor.po | 44 + l10n/sv/files_versions.po | 43 + l10n/sv/gallery.po | 65 +- l10n/sv/impress.po | 22 + l10n/sv/lib.po | 127 + l10n/sv/media.po | 14 +- l10n/sv/settings.po | 230 +- l10n/sv/tasks.po | 107 + l10n/sv/user_ldap.po | 171 + l10n/sv/user_migrate.po | 52 + l10n/sv/user_openid.po | 55 + l10n/ta_LK/core.po | 431 + l10n/ta_LK/files.po | 299 + l10n/ta_LK/files_encryption.po | 34 + l10n/ta_LK/files_external.po | 106 + l10n/ta_LK/files_sharing.po | 48 + l10n/ta_LK/files_versions.po | 42 + l10n/ta_LK/lib.po | 125 + l10n/ta_LK/settings.po | 320 + l10n/ta_LK/user_ldap.po | 170 + l10n/templates/bookmarks.pot | 60 - l10n/templates/calendar.pot | 689 - l10n/templates/contacts.pot | 818 - l10n/templates/core.pot | 247 +- l10n/templates/files.pot | 181 +- l10n/templates/files_encryption.pot | 34 + l10n/templates/files_external.pot | 106 + l10n/templates/files_sharing.pot | 48 + l10n/templates/files_versions.pot | 42 + l10n/templates/gallery.pot | 94 - l10n/templates/lib.pot | 125 + l10n/templates/media.pot | 66 - l10n/templates/settings.pot | 194 +- l10n/templates/user_ldap.pot | 168 + l10n/th_TH/admin_dependencies_chk.po | 74 + l10n/th_TH/admin_migrate.po | 33 + l10n/th_TH/bookmarks.po | 61 + l10n/th_TH/calendar.po | 458 +- l10n/th_TH/contacts.po | 897 +- l10n/th_TH/core.po | 299 +- l10n/th_TH/files.po | 211 +- l10n/th_TH/files_encryption.po | 35 + l10n/th_TH/files_external.po | 107 + l10n/th_TH/files_odfviewer.po | 22 + l10n/th_TH/files_pdfviewer.po | 42 + l10n/th_TH/files_sharing.po | 49 + l10n/th_TH/files_texteditor.po | 44 + l10n/th_TH/files_versions.po | 43 + l10n/th_TH/gallery.po | 84 +- l10n/th_TH/impress.po | 22 + l10n/th_TH/lib.po | 126 + l10n/th_TH/settings.po | 221 +- l10n/th_TH/tasks.po | 107 + l10n/th_TH/user_ldap.po | 171 + l10n/th_TH/user_migrate.po | 52 + l10n/th_TH/user_openid.po | 55 + l10n/tr/admin_dependencies_chk.po | 73 + l10n/tr/admin_migrate.po | 32 + l10n/tr/bookmarks.po | 60 + l10n/tr/calendar.po | 460 +- l10n/tr/contacts.po | 890 +- l10n/tr/core.po | 297 +- l10n/tr/files.po | 205 +- l10n/tr/files_encryption.po | 34 + l10n/tr/files_external.po | 106 + l10n/tr/files_odfviewer.po | 22 + l10n/tr/files_pdfviewer.po | 42 + l10n/tr/files_sharing.po | 48 + l10n/tr/files_texteditor.po | 44 + l10n/tr/files_versions.po | 42 + l10n/tr/gallery.po | 66 +- l10n/tr/impress.po | 22 + l10n/tr/lib.po | 125 + l10n/tr/settings.po | 223 +- l10n/tr/tasks.po | 106 + l10n/tr/user_ldap.po | 170 + l10n/tr/user_migrate.po | 51 + l10n/tr/user_openid.po | 54 + l10n/uk/admin_dependencies_chk.po | 73 + l10n/uk/admin_migrate.po | 32 + l10n/uk/bookmarks.po | 60 + l10n/uk/calendar.po | 466 +- l10n/uk/contacts.po | 793 +- l10n/uk/core.po | 290 +- l10n/uk/files.po | 215 +- l10n/uk/files_encryption.po | 34 + l10n/uk/files_external.po | 107 + l10n/uk/files_odfviewer.po | 22 + l10n/uk/files_pdfviewer.po | 42 + l10n/uk/files_sharing.po | 49 + l10n/uk/files_texteditor.po | 44 + l10n/uk/files_versions.po | 42 + l10n/uk/impress.po | 22 + l10n/uk/lib.po | 127 + l10n/uk/media.po | 35 +- l10n/uk/settings.po | 232 +- l10n/uk/tasks.po | 106 + l10n/uk/user_ldap.po | 171 + l10n/uk/user_migrate.po | 51 + l10n/uk/user_openid.po | 54 + l10n/vi/admin_dependencies_chk.po | 73 + l10n/vi/admin_migrate.po | 32 + l10n/vi/bookmarks.po | 60 + l10n/vi/calendar.po | 815 + l10n/vi/contacts.po | 953 + l10n/vi/core.po | 432 + l10n/vi/files.po | 301 + l10n/vi/files_encryption.po | 35 + l10n/vi/files_external.po | 107 + l10n/vi/files_odfviewer.po | 22 + l10n/vi/files_pdfviewer.po | 42 + l10n/vi/files_sharing.po | 49 + l10n/vi/files_texteditor.po | 44 + l10n/vi/files_versions.po | 43 + l10n/vi/gallery.po | 60 + l10n/vi/impress.po | 22 + l10n/vi/lib.po | 126 + l10n/vi/media.po | 67 + l10n/vi/settings.po | 325 + l10n/vi/tasks.po | 106 + l10n/vi/user_ldap.po | 171 + l10n/vi/user_migrate.po | 51 + l10n/vi/user_openid.po | 54 + l10n/zh_CN.GB2312/admin_dependencies_chk.po | 73 + l10n/zh_CN.GB2312/admin_migrate.po | 32 + l10n/zh_CN.GB2312/bookmarks.po | 60 + l10n/zh_CN.GB2312/calendar.po | 814 + l10n/zh_CN.GB2312/contacts.po | 952 + l10n/zh_CN.GB2312/core.po | 433 + l10n/zh_CN.GB2312/files.po | 301 + l10n/zh_CN.GB2312/files_encryption.po | 35 + l10n/zh_CN.GB2312/files_external.po | 107 + l10n/zh_CN.GB2312/files_odfviewer.po | 22 + l10n/zh_CN.GB2312/files_pdfviewer.po | 42 + l10n/zh_CN.GB2312/files_sharing.po | 49 + l10n/zh_CN.GB2312/files_texteditor.po | 44 + l10n/zh_CN.GB2312/files_versions.po | 43 + l10n/zh_CN.GB2312/gallery.po | 58 + l10n/zh_CN.GB2312/impress.po | 22 + l10n/zh_CN.GB2312/lib.po | 126 + l10n/zh_CN.GB2312/media.po | 67 + l10n/zh_CN.GB2312/settings.po | 323 + l10n/zh_CN.GB2312/tasks.po | 106 + l10n/zh_CN.GB2312/user_ldap.po | 171 + l10n/zh_CN.GB2312/user_migrate.po | 51 + l10n/zh_CN.GB2312/user_openid.po | 54 + l10n/zh_CN/admin_dependencies_chk.po | 73 + l10n/zh_CN/admin_migrate.po | 32 + l10n/zh_CN/bookmarks.po | 61 + l10n/zh_CN/calendar.po | 451 +- l10n/zh_CN/contacts.po | 930 +- l10n/zh_CN/core.po | 300 +- l10n/zh_CN/files.po | 214 +- l10n/zh_CN/files_encryption.po | 35 + l10n/zh_CN/files_external.po | 106 + l10n/zh_CN/files_odfviewer.po | 22 + l10n/zh_CN/files_pdfviewer.po | 42 + l10n/zh_CN/files_sharing.po | 49 + l10n/zh_CN/files_texteditor.po | 44 + l10n/zh_CN/files_versions.po | 43 + l10n/zh_CN/gallery.po | 85 +- l10n/zh_CN/impress.po | 22 + l10n/zh_CN/lib.po | 127 + l10n/zh_CN/settings.po | 224 +- l10n/zh_CN/tasks.po | 106 + l10n/zh_CN/user_ldap.po | 171 + l10n/zh_CN/user_migrate.po | 51 + l10n/zh_CN/user_openid.po | 54 + l10n/zh_TW/admin_dependencies_chk.po | 73 + l10n/zh_TW/admin_migrate.po | 32 + l10n/zh_TW/bookmarks.po | 60 + l10n/zh_TW/calendar.po | 448 +- l10n/zh_TW/contacts.po | 829 +- l10n/zh_TW/core.po | 296 +- l10n/zh_TW/files.po | 198 +- l10n/zh_TW/files_encryption.po | 35 + l10n/zh_TW/files_external.po | 106 + l10n/zh_TW/files_odfviewer.po | 22 + l10n/zh_TW/files_pdfviewer.po | 42 + l10n/zh_TW/files_sharing.po | 49 + l10n/zh_TW/files_texteditor.po | 44 + l10n/zh_TW/files_versions.po | 42 + l10n/zh_TW/impress.po | 22 + l10n/zh_TW/lib.po | 127 + l10n/zh_TW/settings.po | 226 +- l10n/zh_TW/tasks.po | 106 + l10n/zh_TW/user_ldap.po | 170 + l10n/zh_TW/user_migrate.po | 51 + l10n/zh_TW/user_openid.po | 54 + lib/MDB2/Driver/Datatype/sqlite3.php | 6 +- lib/MDB2/Driver/Function/sqlite3.php | 8 +- lib/MDB2/Driver/Manager/sqlite3.php | 4 +- lib/MDB2/Driver/Native/sqlite3.php | 1 - lib/MDB2/Driver/Reverse/sqlite3.php | 4 +- lib/MDB2/Driver/sqlite3.php | 30 +- lib/app.php | 369 +- lib/appconfig.php | 96 +- lib/archive.php | 31 +- lib/archive/tar.php | 174 +- lib/archive/zip.php | 91 +- lib/backgroundjob/queuedtask.php | 104 + lib/backgroundjob/regulartask.php | 52 + lib/backgroundjob/worker.php | 118 + lib/base.php | 426 +- lib/cache.php | 108 +- lib/cache/apc.php | 5 +- lib/cache/broker.php | 6 +- lib/cache/file.php | 43 +- lib/cache/fileglobal.php | 45 +- lib/cache/xcache.php | 17 +- lib/config.php | 50 +- lib/connector/sabre/auth.php | 21 +- lib/connector/sabre/client.php | 342 +- lib/connector/sabre/directory.php | 76 +- lib/connector/sabre/file.php | 35 +- lib/connector/sabre/locks.php | 29 +- lib/connector/sabre/node.php | 64 +- lib/connector/sabre/principal.php | 12 +- lib/db.php | 463 +- lib/eventsource.php | 21 +- lib/filecache.php | 272 +- lib/filecache/cached.php | 43 +- lib/filecache/update.php | 124 +- lib/filechunking.php | 148 + lib/fileproxy.php | 40 +- lib/fileproxy/fileoperations.php | 37 + lib/fileproxy/quota.php | 40 +- lib/files.php | 187 +- lib/filestorage.php | 12 +- lib/filestorage/common.php | 147 +- lib/filestorage/commontest.php | 34 +- lib/filestorage/local.php | 112 +- lib/filestorage/temporary.php | 6 +- lib/filesystem.php | 506 +- lib/filesystemview.php | 570 +- lib/geo.php | 4 +- lib/group.php | 142 +- lib/group/backend.php | 48 +- lib/group/database.php | 132 +- lib/group/dummy.php | 37 +- lib/group/example.php | 18 +- lib/group/interface.php | 83 + lib/helper.php | 376 +- lib/hook.php | 45 +- lib/image.php | 154 +- lib/installer.php | 154 +- lib/json.php | 79 +- lib/l10n.php | 122 +- lib/l10n/ca.php | 28 + lib/l10n/cs_CZ.php | 28 + lib/l10n/da.php | 28 + lib/l10n/de.php | 28 + lib/l10n/el.php | 28 + lib/l10n/eo.php | 28 + lib/l10n/es.php | 28 + lib/l10n/es_AR.php | 28 + lib/l10n/et_EE.php | 28 + lib/l10n/eu.php | 28 + lib/l10n/fa.php | 16 + lib/l10n/fi_FI.php | 28 + lib/l10n/fr.php | 28 + lib/l10n/gl.php | 28 + lib/l10n/he.php | 28 + lib/l10n/hu_HU.php | 25 + lib/l10n/it.php | 28 + lib/l10n/ja_JP.php | 28 + lib/l10n/lt_LT.php | 21 + lib/l10n/nb_NO.php | 25 + lib/l10n/nl.php | 28 + lib/l10n/oc.php | 24 + lib/l10n/pl.php | 28 + lib/l10n/pt_BR.php | 28 + lib/l10n/pt_PT.php | 28 + lib/l10n/ro.php | 28 + lib/l10n/ru.php | 28 + lib/l10n/ru_RU.php | 28 + lib/l10n/sk_SK.php | 25 + lib/l10n/sl.php | 28 + lib/l10n/string.php | 6 +- lib/l10n/sv.php | 28 + lib/l10n/th_TH.php | 28 + lib/l10n/uk.php | 25 + lib/l10n/vi.php | 28 + lib/l10n/zh_CN.GB2312.php | 28 + lib/l10n/zh_CN.php | 28 + lib/l10n/zh_TW.php | 28 + lib/log.php | 35 +- lib/log/owncloud.php | 4 +- lib/mail.php | 72 +- lib/migrate.php | 206 +- lib/migration/content.php | 139 +- lib/migration/provider.php | 26 +- lib/mimetypes.fixlist.php | 22 - lib/mimetypes.list.php | 18 +- lib/minimizer.php | 41 +- lib/minimizer/css.php | 6 +- lib/minimizer/js.php | 4 +- lib/ocs.php | 266 +- lib/ocsclient.php | 90 +- lib/preferences.php | 118 +- lib/public/app.php | 182 +- lib/public/backgroundjob.php | 117 + lib/public/config.php | 123 +- lib/public/db.php | 23 +- lib/public/files.php | 35 +- lib/public/groupinterface.php | 31 + lib/public/json.php | 125 +- lib/public/response.php | 12 +- lib/public/share.php | 1251 + lib/public/template.php | 16 +- lib/public/user.php | 52 +- lib/public/userinterface.php | 31 + lib/public/util.php | 97 +- lib/request.php | 77 + lib/response.php | 3 +- lib/search.php | 22 +- lib/search/provider.php | 12 +- lib/search/provider/file.php | 36 +- lib/search/result.php | 2 +- lib/setup.php | 251 +- lib/streamwrappers.php | 45 +- lib/subadmin.php | 184 + lib/template.php | 208 +- lib/templatelayout.php | 43 +- lib/updater.php | 30 +- lib/user.php | 249 +- lib/user/backend.php | 25 +- lib/user/database.php | 76 +- lib/user/dummy.php | 20 +- lib/user/example.php | 22 +- lib/user/http.php | 37 +- lib/user/interface.php | 60 + lib/util.php | 413 +- lib/vcategories.php | 15 +- lib/vobject.php | 64 +- ocs/providers.php | 8 +- ocs/v1.php | 2 +- public.php | 14 +- remote.php | 31 +- search/ajax/search.php | 4 +- search/index.php | 51 - search/js/result.js | 3 +- search/templates/index.php | 17 - settings/admin.php | 14 +- settings/ajax/apps/ocs.php | 65 + settings/ajax/changepassword.php | 34 +- settings/ajax/creategroup.php | 18 +- settings/ajax/createuser.php | 44 +- settings/ajax/disableapp.php | 2 +- settings/ajax/enableapp.php | 12 +- settings/ajax/getlog.php | 6 +- settings/ajax/lostpassword.php | 6 +- settings/ajax/openid.php | 6 +- settings/ajax/removegroup.php | 6 +- settings/ajax/removeuser.php | 21 +- settings/ajax/setlanguage.php | 6 +- settings/ajax/setloglevel.php | 4 +- settings/ajax/setquota.php | 24 +- settings/ajax/togglegroups.php | 32 +- settings/ajax/togglesubadmins.php | 19 + settings/ajax/userlist.php | 52 + settings/apps.php | 135 +- settings/css/settings.css | 28 +- settings/help.php | 4 +- settings/img/admin.png | Bin 302 -> 224 bytes settings/img/apps.png | Bin 255 -> 229 bytes settings/img/help.png | Bin 474 -> 423 bytes settings/img/log.png | Bin 441 -> 342 bytes settings/img/personal.png | Bin 589 -> 504 bytes settings/img/users.png | Bin 743 -> 639 bytes settings/js/admin.js | 30 +- settings/js/apps.js | 153 +- settings/js/log.js | 3 + settings/js/personal.js | 2 +- settings/js/users.js | 301 +- settings/l10n/ar.php | 5 - settings/l10n/bg_BG.php | 18 +- settings/l10n/ca.php | 43 +- settings/l10n/cs_CZ.php | 67 +- settings/l10n/da.php | 41 +- settings/l10n/de.php | 63 +- settings/l10n/el.php | 71 +- settings/l10n/eo.php | 38 +- settings/l10n/es.php | 41 +- settings/l10n/es_AR.php | 73 + settings/l10n/et_EE.php | 31 +- settings/l10n/eu.php | 42 +- settings/l10n/fa.php | 12 +- settings/l10n/fi_FI.php | 39 +- settings/l10n/fr.php | 43 +- settings/l10n/gl.php | 15 +- settings/l10n/he.php | 11 +- settings/l10n/hr.php | 15 +- settings/l10n/hu_HU.php | 14 +- settings/l10n/ia.php | 4 - settings/l10n/id.php | 13 +- settings/l10n/it.php | 43 +- settings/l10n/ja_JP.php | 41 +- settings/l10n/ko.php | 16 +- settings/l10n/lb.php | 22 +- settings/l10n/lt_LT.php | 12 +- settings/l10n/lv.php | 48 + settings/l10n/mk.php | 11 +- settings/l10n/ms_MY.php | 32 +- settings/l10n/nb_NO.php | 19 +- settings/l10n/nl.php | 41 +- settings/l10n/nn_NO.php | 11 +- settings/l10n/oc.php | 61 + settings/l10n/pl.php | 41 +- settings/l10n/pt_BR.php | 41 +- settings/l10n/pt_PT.php | 51 +- settings/l10n/ro.php | 40 +- settings/l10n/ru.php | 33 +- settings/l10n/ru_RU.php | 72 + settings/l10n/si_LK.php | 15 + settings/l10n/sk_SK.php | 37 +- settings/l10n/sl.php | 40 +- settings/l10n/sr.php | 5 - settings/l10n/sr@latin.php | 5 - settings/l10n/sv.php | 47 +- settings/l10n/th_TH.php | 41 +- settings/l10n/tr.php | 13 +- settings/l10n/uk.php | 18 + settings/l10n/vi.php | 65 + settings/l10n/zh_CN.GB2312.php | 72 + settings/l10n/zh_CN.php | 42 +- settings/l10n/zh_TW.php | 30 +- settings/languageCodes.php | 9 + settings/log.php | 44 - settings/personal.php | 35 +- settings/settings.php | 9 +- settings/templates/admin.php | 69 +- settings/templates/apps.php | 23 +- settings/templates/help.php | 7 +- settings/templates/personal.php | 6 +- settings/templates/settings.php | 2 +- settings/templates/users.php | 73 +- settings/trans.png | Bin 187 -> 185 bytes settings/users.php | 46 +- status.php | 10 +- tests/apps.php | 41 + tests/bootstrap.php | 31 + tests/data/data.tar.gz | Bin 0 -> 4195 bytes tests/data/data.zip | Bin 0 -> 4705 bytes tests/data/db_structure.xml | 138 + tests/data/db_structure2.xml | 77 + tests/data/logo-wide.png | Bin 3559 -> 2882 bytes tests/index.php | 73 - tests/lib/archive.php | 58 +- tests/lib/archive/tar.php | 20 +- tests/lib/archive/zip.php | 20 +- tests/lib/cache.php | 37 +- tests/lib/cache/apc.php | 19 +- tests/lib/cache/file.php | 27 +- tests/lib/cache/xcache.php | 14 +- tests/lib/db.php | 70 + tests/lib/dbschema.php | 118 + tests/lib/filestorage.php | 333 +- tests/lib/filestorage/commontest.php | 6 +- tests/lib/filestorage/local.php | 4 +- tests/lib/filesystem.php | 127 +- tests/lib/geo.php | 19 + tests/lib/group.php | 6 +- tests/lib/group/backend.php | 8 +- tests/lib/group/database.php | 10 +- tests/lib/group/dummy.php | 2 +- tests/lib/helper.php | 140 + tests/lib/share/backend.php | 71 + tests/lib/share/share.php | 408 + tests/lib/streamwrappers.php | 16 +- tests/lib/user/backend.php | 6 +- tests/lib/user/database.php | 9 +- tests/lib/user/dummy.php | 2 +- tests/lib/util.php | 45 + tests/phpunit.xml | 7 + themes/README | 2 +- webapps.php | 54 - 3179 files changed, 194048 insertions(+), 256080 deletions(-) delete mode 100644 .tx/config create mode 100644 3rdparty/MDB2/Driver/Datatype/oci8.php create mode 100644 3rdparty/MDB2/Driver/Function/oci8.php create mode 100644 3rdparty/MDB2/Driver/Manager/oci8.php create mode 100644 3rdparty/MDB2/Driver/Native/oci8.php create mode 100644 3rdparty/MDB2/Driver/Reverse/oci8.php create mode 100644 3rdparty/MDB2/Driver/oci8.php mode change 100644 => 100755 3rdparty/Sabre.includes.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Backend/Abstract.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Backend/PDO.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Calendar.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/CalendarObject.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/CalendarQueryParser.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/CalendarQueryValidator.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/CalendarRootNode.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/ICSExportPlugin.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/ICalendar.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/ICalendarObject.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Principal/Collection.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Principal/ProxyRead.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Principal/User.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Schedule/IMip.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Schedule/IOutbox.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Schedule/Outbox.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Server.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/UserCalendars.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/Version.php mode change 100644 => 100755 3rdparty/Sabre/CalDAV/includes.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/AddressBook.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/AddressBookQueryParser.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/AddressBookRoot.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Backend/Abstract.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Backend/PDO.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Card.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/IAddressBook.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/ICard.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/IDirectory.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/UserAddressBooks.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/Version.php mode change 100644 => 100755 3rdparty/Sabre/CardDAV/includes.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Backend/Apache.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Backend/File.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Backend/PDO.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/IBackend.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Auth/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/GuessContentType.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/favicon.ico mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/card.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/collection.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/file.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/parent.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Browser/assets/icons/principal.png mode change 100644 => 100755 3rdparty/Sabre/DAV/Client.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Collection.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Directory.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/BadRequest.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/Conflict.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/ConflictingLock.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/FileNotFound.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/Forbidden.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/InsufficientStorage.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/InvalidResourceType.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/Locked.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/NotAuthenticated.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/NotFound.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/NotImplemented.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/PaymentRequired.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/PreconditionFailed.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FS/Directory.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FS/File.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FS/Node.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FSExt/Directory.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FSExt/File.php mode change 100644 => 100755 3rdparty/Sabre/DAV/FSExt/Node.php mode change 100644 => 100755 3rdparty/Sabre/DAV/File.php mode change 100644 => 100755 3rdparty/Sabre/DAV/ICollection.php mode change 100644 => 100755 3rdparty/Sabre/DAV/IExtendedCollection.php mode change 100644 => 100755 3rdparty/Sabre/DAV/IFile.php mode change 100644 => 100755 3rdparty/Sabre/DAV/INode.php mode change 100644 => 100755 3rdparty/Sabre/DAV/IProperties.php mode change 100644 => 100755 3rdparty/Sabre/DAV/IQuota.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/Backend/Abstract.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/Backend/FS.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/Backend/File.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/Backend/PDO.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/LockInfo.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Locks/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Mount/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Node.php mode change 100644 => 100755 3rdparty/Sabre/DAV/ObjectTree.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/GetLastModified.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/Href.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/HrefList.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/IHref.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/LockDiscovery.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/ResourceType.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/Response.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/ResponseList.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/SupportedLock.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Property/SupportedReportSet.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Server.php mode change 100644 => 100755 3rdparty/Sabre/DAV/ServerPlugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/SimpleCollection.php mode change 100644 => 100755 3rdparty/Sabre/DAV/SimpleDirectory.php mode change 100644 => 100755 3rdparty/Sabre/DAV/SimpleFile.php mode change 100644 => 100755 3rdparty/Sabre/DAV/StringUtil.php mode change 100644 => 100755 3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Tree.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Tree/Filesystem.php mode change 100644 => 100755 3rdparty/Sabre/DAV/URLUtil.php mode change 100644 => 100755 3rdparty/Sabre/DAV/UUIDUtil.php mode change 100644 => 100755 3rdparty/Sabre/DAV/Version.php mode change 100644 => 100755 3rdparty/Sabre/DAV/XMLUtil.php mode change 100644 => 100755 3rdparty/Sabre/DAV/includes.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Exception/AceConflict.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Exception/NoAbstract.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/IACL.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/IPrincipal.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/IPrincipalBackend.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Plugin.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Principal.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/PrincipalCollection.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Property/Acl.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Property/AclRestrictions.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Property/Principal.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/Version.php mode change 100644 => 100755 3rdparty/Sabre/DAVACL/includes.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/AWSAuth.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/AbstractAuth.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/BasicAuth.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/DigestAuth.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/Request.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/Response.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/Util.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/Version.php mode change 100644 => 100755 3rdparty/Sabre/HTTP/includes.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component/VAlarm.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component/VCalendar.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component/VEvent.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component/VJournal.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Component/VTodo.php mode change 100644 => 100755 3rdparty/Sabre/VObject/DateTimeParser.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Element.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Element/DateTime.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Element/MultiDateTime.php mode change 100644 => 100755 3rdparty/Sabre/VObject/ElementList.php mode change 100644 => 100755 3rdparty/Sabre/VObject/FreeBusyGenerator.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Node.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Parameter.php mode change 100644 => 100755 3rdparty/Sabre/VObject/ParseException.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Property.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Property/DateTime.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Property/MultiDateTime.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Reader.php mode change 100644 => 100755 3rdparty/Sabre/VObject/RecurrenceIterator.php mode change 100644 => 100755 3rdparty/Sabre/VObject/Version.php mode change 100644 => 100755 3rdparty/Sabre/VObject/WindowsTimezoneMap.php mode change 100644 => 100755 3rdparty/Sabre/VObject/includes.php mode change 100644 => 100755 3rdparty/Sabre/autoload.php mode change 100644 => 100755 3rdparty/css/chosen-sprite.png mode change 100644 => 100755 3rdparty/css/chosen.css mode change 100644 => 100755 3rdparty/css/chosen/chosen.css mode change 100644 => 100755 3rdparty/js/chosen/chosen.jquery.js mode change 100644 => 100755 3rdparty/js/chosen/chosen.jquery.min.js create mode 100644 3rdparty/miniColors/GPL-LICENSE.txt create mode 100644 3rdparty/miniColors/MIT-LICENSE.txt create mode 100755 3rdparty/miniColors/css/images/colors.png create mode 100755 3rdparty/miniColors/css/images/trigger.png create mode 100755 3rdparty/miniColors/css/jquery.miniColors.css create mode 100755 3rdparty/miniColors/js/jquery.miniColors.js create mode 100755 3rdparty/miniColors/js/jquery.miniColors.min.js create mode 100644 3rdparty/openid/class.openid.v3.php create mode 100644 3rdparty/openid/phpmyid.php delete mode 100644 3rdparty/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE delete mode 100644 3rdparty/simpletest/LICENSE delete mode 100644 3rdparty/simpletest/README delete mode 100644 3rdparty/simpletest/VERSION delete mode 100644 3rdparty/simpletest/arguments.php delete mode 100644 3rdparty/simpletest/authentication.php delete mode 100644 3rdparty/simpletest/autorun.php delete mode 100644 3rdparty/simpletest/browser.php delete mode 100644 3rdparty/simpletest/collector.php delete mode 100644 3rdparty/simpletest/compatibility.php delete mode 100644 3rdparty/simpletest/cookies.php delete mode 100644 3rdparty/simpletest/default_reporter.php delete mode 100644 3rdparty/simpletest/detached.php delete mode 100644 3rdparty/simpletest/docs/en/authentication_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/browser_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/docs.css delete mode 100644 3rdparty/simpletest/docs/en/expectation_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/form_testing_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/group_test_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/index.html delete mode 100644 3rdparty/simpletest/docs/en/mock_objects_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/overview.html delete mode 100644 3rdparty/simpletest/docs/en/partial_mocks_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/reporter_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/unit_test_documentation.html delete mode 100644 3rdparty/simpletest/docs/en/web_tester_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/authentication_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/browser_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/docs.css delete mode 100644 3rdparty/simpletest/docs/fr/expectation_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/form_testing_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/group_test_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/index.html delete mode 100644 3rdparty/simpletest/docs/fr/mock_objects_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/overview.html delete mode 100644 3rdparty/simpletest/docs/fr/partial_mocks_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/reporter_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/unit_test_documentation.html delete mode 100644 3rdparty/simpletest/docs/fr/web_tester_documentation.html delete mode 100644 3rdparty/simpletest/dumper.php delete mode 100644 3rdparty/simpletest/eclipse.php delete mode 100644 3rdparty/simpletest/encoding.php delete mode 100644 3rdparty/simpletest/errors.php delete mode 100644 3rdparty/simpletest/exceptions.php delete mode 100644 3rdparty/simpletest/expectation.php delete mode 100644 3rdparty/simpletest/extensions/pear_test_case.php delete mode 100644 3rdparty/simpletest/extensions/testdox.php delete mode 100644 3rdparty/simpletest/extensions/testdox/test.php delete mode 100644 3rdparty/simpletest/form.php delete mode 100644 3rdparty/simpletest/frames.php delete mode 100644 3rdparty/simpletest/http.php delete mode 100644 3rdparty/simpletest/invoker.php delete mode 100644 3rdparty/simpletest/mock_objects.php delete mode 100644 3rdparty/simpletest/page.php delete mode 100644 3rdparty/simpletest/php_parser.php delete mode 100644 3rdparty/simpletest/recorder.php delete mode 100644 3rdparty/simpletest/reflection_php4.php delete mode 100644 3rdparty/simpletest/reflection_php5.php delete mode 100644 3rdparty/simpletest/remote.php delete mode 100644 3rdparty/simpletest/reporter.php delete mode 100644 3rdparty/simpletest/scorer.php delete mode 100644 3rdparty/simpletest/selector.php delete mode 100644 3rdparty/simpletest/shell_tester.php delete mode 100644 3rdparty/simpletest/simpletest.php delete mode 100644 3rdparty/simpletest/socket.php delete mode 100644 3rdparty/simpletest/tag.php delete mode 100644 3rdparty/simpletest/test_case.php delete mode 100644 3rdparty/simpletest/tidy_parser.php delete mode 100644 3rdparty/simpletest/unit_tester.php delete mode 100644 3rdparty/simpletest/url.php delete mode 100644 3rdparty/simpletest/user_agent.php delete mode 100644 3rdparty/simpletest/web_tester.php delete mode 100644 3rdparty/simpletest/xml.php mode change 100644 => 100755 3rdparty/timepicker/GPL-LICENSE.txt mode change 100644 => 100755 3rdparty/timepicker/MIT-LICENSE.txt mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_diagonals-thick_18_b81900_40x40.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_diagonals-thick_20_666666_40x40.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_flat_10_000000_40x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_100_f6f6f6_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_100_fdf5ce_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_glass_65_ffffff_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_gloss-wave_35_f6a828_500x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_highlight-soft_100_eeeeee_1x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-bg_highlight-soft_75_ffe45c_1x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-icons_222222_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-icons_228ef1_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-icons_ef8c08_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-icons_ffd27a_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/images/ui-icons_ffffff_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery-1.5.1.min.js mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery-ui-1.8.14.custom.css mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery.ui.core.min.js mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery.ui.position.min.js mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery.ui.tabs.min.js mode change 100644 => 100755 3rdparty/timepicker/css/include/jquery.ui.widget.min.js mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_flat_10_000000_40x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_222222_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_228ef1_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ef8c08_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ffd27a_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/include/ui-lightness/images/ui-icons_ffffff_256x240.png mode change 100644 => 100755 3rdparty/timepicker/css/jquery.ui.timepicker.css mode change 100644 => 100755 3rdparty/timepicker/js/i18n/i18n.html create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-cs.js mode change 100644 => 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-de.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-es.js mode change 100644 => 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-fr.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-hr.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-it.js mode change 100644 => 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-ja.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-nl.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-pl.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-pt-BR.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-sl.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-sv.js create mode 100755 3rdparty/timepicker/js/i18n/jquery.ui.timepicker-tr.js mode change 100644 => 100755 3rdparty/timepicker/js/jquery.ui.timepicker.js mode change 100644 => 100755 3rdparty/timepicker/releases.txt delete mode 100644 apps/.gitkeep delete mode 100644 apps/admin_audit/appinfo/app.php delete mode 100644 apps/admin_audit/appinfo/info.xml delete mode 100644 apps/admin_audit/lib/hooks_handlers.php delete mode 100644 apps/admin_dependencies_chk/appinfo/app.php delete mode 100644 apps/admin_dependencies_chk/appinfo/info.xml delete mode 100644 apps/admin_dependencies_chk/appinfo/version delete mode 100644 apps/admin_dependencies_chk/css/style.css delete mode 100644 apps/admin_dependencies_chk/settings.php delete mode 100644 apps/admin_dependencies_chk/templates/settings.php delete mode 100644 apps/admin_migrate/appinfo/app.php delete mode 100644 apps/admin_migrate/appinfo/info.xml delete mode 100644 apps/admin_migrate/appinfo/version delete mode 100644 apps/admin_migrate/settings.php delete mode 100644 apps/admin_migrate/templates/settings.php delete mode 100644 apps/bookmarks/addBm.php delete mode 100644 apps/bookmarks/ajax/addBookmark.php delete mode 100644 apps/bookmarks/ajax/delBookmark.php delete mode 100644 apps/bookmarks/ajax/editBookmark.php delete mode 100644 apps/bookmarks/ajax/recordClick.php delete mode 100644 apps/bookmarks/ajax/updateList.php delete mode 100644 apps/bookmarks/appinfo/app.php delete mode 100644 apps/bookmarks/appinfo/database.xml delete mode 100644 apps/bookmarks/appinfo/info.xml delete mode 100644 apps/bookmarks/appinfo/migrate.php delete mode 100644 apps/bookmarks/appinfo/version delete mode 100644 apps/bookmarks/bookmarksHelper.php delete mode 100644 apps/bookmarks/css/bookmarks.css delete mode 100644 apps/bookmarks/img/bookmarks.png delete mode 100644 apps/bookmarks/index.php delete mode 100644 apps/bookmarks/js/addBm.js delete mode 100644 apps/bookmarks/js/bookmarks.js delete mode 100644 apps/bookmarks/js/bookmarksearch.js delete mode 100644 apps/bookmarks/l10n/xgettextfiles delete mode 100644 apps/bookmarks/lib/bookmarks.php delete mode 100644 apps/bookmarks/lib/search.php delete mode 100644 apps/bookmarks/settings.php delete mode 100644 apps/bookmarks/templates/addBm.php delete mode 100644 apps/bookmarks/templates/bookmarklet.php delete mode 100644 apps/bookmarks/templates/list.php delete mode 100644 apps/bookmarks/templates/settings.php delete mode 100644 apps/calendar/ajax/cache/rescan.php delete mode 100644 apps/calendar/ajax/cache/status.php delete mode 100644 apps/calendar/ajax/calendar/activation.php delete mode 100644 apps/calendar/ajax/calendar/delete.php delete mode 100644 apps/calendar/ajax/calendar/edit.form.php delete mode 100644 apps/calendar/ajax/calendar/edit.php delete mode 100644 apps/calendar/ajax/calendar/new.form.php delete mode 100644 apps/calendar/ajax/calendar/new.php delete mode 100644 apps/calendar/ajax/calendar/overview.php delete mode 100644 apps/calendar/ajax/calendar/update.php delete mode 100644 apps/calendar/ajax/categories/rescan.php delete mode 100644 apps/calendar/ajax/changeview.php delete mode 100644 apps/calendar/ajax/event/delete.php delete mode 100644 apps/calendar/ajax/event/edit.form.php delete mode 100644 apps/calendar/ajax/event/edit.php delete mode 100644 apps/calendar/ajax/event/move.php delete mode 100644 apps/calendar/ajax/event/new.form.php delete mode 100644 apps/calendar/ajax/event/new.php delete mode 100644 apps/calendar/ajax/event/resize.php delete mode 100644 apps/calendar/ajax/events.php delete mode 100644 apps/calendar/ajax/import/dialog.php delete mode 100644 apps/calendar/ajax/import/dropimport.php delete mode 100644 apps/calendar/ajax/import/import.php delete mode 100644 apps/calendar/ajax/settings/getfirstday.php delete mode 100644 apps/calendar/ajax/settings/gettimezonedetection.php delete mode 100644 apps/calendar/ajax/settings/guesstimezone.php delete mode 100644 apps/calendar/ajax/settings/setfirstday.php delete mode 100644 apps/calendar/ajax/settings/settimeformat.php delete mode 100644 apps/calendar/ajax/settings/settimezone.php delete mode 100644 apps/calendar/ajax/settings/timeformat.php delete mode 100644 apps/calendar/ajax/settings/timezonedetection.php delete mode 100644 apps/calendar/ajax/share/activation.php delete mode 100644 apps/calendar/ajax/share/changepermission.php delete mode 100644 apps/calendar/ajax/share/dropdown.php delete mode 100644 apps/calendar/ajax/share/share.php delete mode 100644 apps/calendar/ajax/share/unshare.php delete mode 100644 apps/calendar/appinfo/app.php delete mode 100644 apps/calendar/appinfo/database.xml delete mode 100644 apps/calendar/appinfo/info.xml delete mode 100644 apps/calendar/appinfo/remote.php delete mode 100644 apps/calendar/appinfo/update.php delete mode 100644 apps/calendar/appinfo/version delete mode 100644 apps/calendar/caldav.php delete mode 100644 apps/calendar/css/style.css delete mode 100644 apps/calendar/export.php delete mode 100644 apps/calendar/img/Icon License delete mode 100644 apps/calendar/img/icon.png delete mode 100644 apps/calendar/img/icon.svg delete mode 100644 apps/calendar/index.php delete mode 100644 apps/calendar/js/calendar.js delete mode 100644 apps/calendar/js/geo.js delete mode 100644 apps/calendar/js/loader.js delete mode 100644 apps/calendar/js/settings.js delete mode 100644 apps/calendar/l10n/ar.php delete mode 100644 apps/calendar/l10n/bg_BG.php delete mode 100644 apps/calendar/l10n/ca.php delete mode 100644 apps/calendar/l10n/cs_CZ.php delete mode 100644 apps/calendar/l10n/da.php delete mode 100644 apps/calendar/l10n/de.php delete mode 100644 apps/calendar/l10n/el.php delete mode 100644 apps/calendar/l10n/eo.php delete mode 100644 apps/calendar/l10n/es.php delete mode 100644 apps/calendar/l10n/et_EE.php delete mode 100644 apps/calendar/l10n/eu.php delete mode 100644 apps/calendar/l10n/fa.php delete mode 100644 apps/calendar/l10n/fi_FI.php delete mode 100644 apps/calendar/l10n/fr.php delete mode 100644 apps/calendar/l10n/gl.php delete mode 100644 apps/calendar/l10n/he.php delete mode 100644 apps/calendar/l10n/hr.php delete mode 100644 apps/calendar/l10n/hu_HU.php delete mode 100644 apps/calendar/l10n/hy.php delete mode 100644 apps/calendar/l10n/ia.php delete mode 100644 apps/calendar/l10n/id.php delete mode 100644 apps/calendar/l10n/it.php delete mode 100644 apps/calendar/l10n/ja_JP.php delete mode 100644 apps/calendar/l10n/ko.php delete mode 100644 apps/calendar/l10n/lb.php delete mode 100644 apps/calendar/l10n/lt_LT.php delete mode 100644 apps/calendar/l10n/mk.php delete mode 100644 apps/calendar/l10n/ms_MY.php delete mode 100644 apps/calendar/l10n/nb_NO.php delete mode 100644 apps/calendar/l10n/nl.php delete mode 100644 apps/calendar/l10n/nn_NO.php delete mode 100644 apps/calendar/l10n/pl.php delete mode 100644 apps/calendar/l10n/pt_BR.php delete mode 100644 apps/calendar/l10n/pt_PT.php delete mode 100644 apps/calendar/l10n/ro.php delete mode 100644 apps/calendar/l10n/ru.php delete mode 100644 apps/calendar/l10n/sk_SK.php delete mode 100644 apps/calendar/l10n/sl.php delete mode 100644 apps/calendar/l10n/sr.php delete mode 100644 apps/calendar/l10n/sr@latin.php delete mode 100644 apps/calendar/l10n/sv.php delete mode 100644 apps/calendar/l10n/th_TH.php delete mode 100644 apps/calendar/l10n/tr.php delete mode 100644 apps/calendar/l10n/uk.php delete mode 100644 apps/calendar/l10n/xgettextfiles delete mode 100644 apps/calendar/l10n/zh_CN.php delete mode 100644 apps/calendar/l10n/zh_TW.php delete mode 100644 apps/calendar/lib/alarm.php delete mode 100644 apps/calendar/lib/app.php delete mode 100644 apps/calendar/lib/attendees.php delete mode 100644 apps/calendar/lib/calendar.php delete mode 100644 apps/calendar/lib/connector_sabre.php delete mode 100644 apps/calendar/lib/export.php delete mode 100644 apps/calendar/lib/hooks.php delete mode 100644 apps/calendar/lib/object.php delete mode 100644 apps/calendar/lib/repeat.php delete mode 100644 apps/calendar/lib/search.php delete mode 100644 apps/calendar/lib/share.php delete mode 100644 apps/calendar/settings.php delete mode 100644 apps/calendar/share.php delete mode 100644 apps/calendar/templates/calendar.php delete mode 100644 apps/calendar/templates/part.choosecalendar.php delete mode 100644 apps/calendar/templates/part.choosecalendar.rowfields.php delete mode 100644 apps/calendar/templates/part.choosecalendar.rowfields.shared.php delete mode 100644 apps/calendar/templates/part.editcalendar.php delete mode 100644 apps/calendar/templates/part.editevent.php delete mode 100644 apps/calendar/templates/part.eventform.php delete mode 100644 apps/calendar/templates/part.import.php delete mode 100644 apps/calendar/templates/part.newevent.php delete mode 100644 apps/calendar/templates/part.showevent.php delete mode 100644 apps/calendar/templates/settings.php delete mode 100644 apps/calendar/templates/share.dropdown.php delete mode 100644 apps/contacts/ajax/activation.php delete mode 100644 apps/contacts/ajax/addbook.php delete mode 100644 apps/contacts/ajax/addcontact.php delete mode 100644 apps/contacts/ajax/addproperty.php delete mode 100644 apps/contacts/ajax/categories/categoriesfor.php delete mode 100644 apps/contacts/ajax/categories/delete.php delete mode 100644 apps/contacts/ajax/categories/list.php delete mode 100644 apps/contacts/ajax/categories/rescan.php delete mode 100644 apps/contacts/ajax/chooseaddressbook.php delete mode 100644 apps/contacts/ajax/contactdetails.php delete mode 100644 apps/contacts/ajax/contacts.php delete mode 100644 apps/contacts/ajax/createaddressbook.php delete mode 100644 apps/contacts/ajax/cropphoto.php delete mode 100644 apps/contacts/ajax/currentphoto.php delete mode 100644 apps/contacts/ajax/deletebook.php delete mode 100644 apps/contacts/ajax/deletecard.php delete mode 100644 apps/contacts/ajax/deleteproperty.php delete mode 100644 apps/contacts/ajax/editaddress.php delete mode 100644 apps/contacts/ajax/editaddressbook.php delete mode 100644 apps/contacts/ajax/editname.php delete mode 100644 apps/contacts/ajax/importaddressbook.php delete mode 100644 apps/contacts/ajax/importdialog.php delete mode 100644 apps/contacts/ajax/loadcard.php delete mode 100644 apps/contacts/ajax/loadintro.php delete mode 100644 apps/contacts/ajax/loadphoto.php delete mode 100644 apps/contacts/ajax/loghandler.php delete mode 100644 apps/contacts/ajax/movetoaddressbook.php delete mode 100644 apps/contacts/ajax/oc_photo.php delete mode 100644 apps/contacts/ajax/savecrop.php delete mode 100644 apps/contacts/ajax/saveproperty.php delete mode 100644 apps/contacts/ajax/updateaddressbook.php delete mode 100644 apps/contacts/ajax/uploadimport.php delete mode 100644 apps/contacts/ajax/uploadphoto.php delete mode 100644 apps/contacts/appinfo/app.php delete mode 100644 apps/contacts/appinfo/database.xml delete mode 100644 apps/contacts/appinfo/info.xml delete mode 100644 apps/contacts/appinfo/migrate.php delete mode 100644 apps/contacts/appinfo/remote.php delete mode 100644 apps/contacts/appinfo/update.php delete mode 100644 apps/contacts/appinfo/version delete mode 100644 apps/contacts/carddav.php delete mode 100644 apps/contacts/css/contacts.css delete mode 100644 apps/contacts/css/jquery.Jcrop.css delete mode 100644 apps/contacts/css/jquery.combobox.css delete mode 100644 apps/contacts/export.php delete mode 100644 apps/contacts/img/Jcrop.gif delete mode 100644 apps/contacts/img/contact-new.png delete mode 100644 apps/contacts/img/contact-new.svg delete mode 100644 apps/contacts/img/globe.svg delete mode 100644 apps/contacts/img/person.png delete mode 100644 apps/contacts/img/person.svg delete mode 100644 apps/contacts/img/person_large.png delete mode 100644 apps/contacts/import.php delete mode 100644 apps/contacts/index.php delete mode 100644 apps/contacts/js/LICENSE.jquery.inview delete mode 100644 apps/contacts/js/contacts.js delete mode 100644 apps/contacts/js/expanding.js delete mode 100644 apps/contacts/js/jquery.Jcrop.js delete mode 100644 apps/contacts/js/jquery.Jcrop.min.js delete mode 100644 apps/contacts/js/jquery.combobox.js delete mode 100644 apps/contacts/js/jquery.inview.js delete mode 100644 apps/contacts/js/jquery.inview.txt delete mode 100644 apps/contacts/js/jquery.multi-autocomplete.js delete mode 100644 apps/contacts/js/loader.js delete mode 100644 apps/contacts/l10n/.gitkeep delete mode 100644 apps/contacts/l10n/ar.php delete mode 100644 apps/contacts/l10n/ca.php delete mode 100644 apps/contacts/l10n/cs_CZ.php delete mode 100644 apps/contacts/l10n/da.php delete mode 100644 apps/contacts/l10n/de.php delete mode 100644 apps/contacts/l10n/el.php delete mode 100644 apps/contacts/l10n/eo.php delete mode 100644 apps/contacts/l10n/es.php delete mode 100644 apps/contacts/l10n/et_EE.php delete mode 100644 apps/contacts/l10n/eu.php delete mode 100644 apps/contacts/l10n/fa.php delete mode 100644 apps/contacts/l10n/fi_FI.php delete mode 100644 apps/contacts/l10n/fr.php delete mode 100644 apps/contacts/l10n/gl.php delete mode 100644 apps/contacts/l10n/he.php delete mode 100644 apps/contacts/l10n/hr.php delete mode 100644 apps/contacts/l10n/hu_HU.php delete mode 100644 apps/contacts/l10n/ia.php delete mode 100644 apps/contacts/l10n/it.php delete mode 100644 apps/contacts/l10n/ja_JP.php delete mode 100644 apps/contacts/l10n/ko.php delete mode 100644 apps/contacts/l10n/lb.php delete mode 100644 apps/contacts/l10n/lt_LT.php delete mode 100644 apps/contacts/l10n/mk.php delete mode 100644 apps/contacts/l10n/ms_MY.php delete mode 100644 apps/contacts/l10n/nb_NO.php delete mode 100644 apps/contacts/l10n/nl.php delete mode 100644 apps/contacts/l10n/nn_NO.php delete mode 100644 apps/contacts/l10n/pl.php delete mode 100644 apps/contacts/l10n/pt_BR.php delete mode 100644 apps/contacts/l10n/pt_PT.php delete mode 100644 apps/contacts/l10n/ro.php delete mode 100644 apps/contacts/l10n/ru.php delete mode 100644 apps/contacts/l10n/sk_SK.php delete mode 100644 apps/contacts/l10n/sl.php delete mode 100644 apps/contacts/l10n/sr.php delete mode 100644 apps/contacts/l10n/sr@latin.php delete mode 100644 apps/contacts/l10n/sv.php delete mode 100644 apps/contacts/l10n/th_TH.php delete mode 100644 apps/contacts/l10n/tr.php delete mode 100644 apps/contacts/l10n/uk.php delete mode 100644 apps/contacts/l10n/xgettextfiles delete mode 100644 apps/contacts/l10n/zh_CN.php delete mode 100644 apps/contacts/l10n/zh_TW.php delete mode 100644 apps/contacts/lib/VCFExportPlugin.php delete mode 100644 apps/contacts/lib/addressbook.php delete mode 100644 apps/contacts/lib/app.php delete mode 100644 apps/contacts/lib/connector_sabre.php delete mode 100644 apps/contacts/lib/hooks.php delete mode 100644 apps/contacts/lib/search.php delete mode 100644 apps/contacts/lib/vcard.php delete mode 100644 apps/contacts/photo.php delete mode 100644 apps/contacts/settings.php delete mode 100644 apps/contacts/templates/index.php delete mode 100644 apps/contacts/templates/part.chooseaddressbook.php delete mode 100644 apps/contacts/templates/part.chooseaddressbook.rowfields.php delete mode 100644 apps/contacts/templates/part.contact.php delete mode 100644 apps/contacts/templates/part.cropphoto.php delete mode 100644 apps/contacts/templates/part.edit_address_dialog.php delete mode 100644 apps/contacts/templates/part.edit_categories_dialog.php delete mode 100644 apps/contacts/templates/part.edit_name_dialog.php delete mode 100644 apps/contacts/templates/part.editaddressbook.php delete mode 100644 apps/contacts/templates/part.import.php delete mode 100644 apps/contacts/templates/part.importaddressbook.php delete mode 100644 apps/contacts/templates/part.no_contacts.php delete mode 100644 apps/contacts/templates/settings.php delete mode 100644 apps/contacts/thumbnail.php delete mode 100644 apps/contacts/tmpphoto.php delete mode 100644 apps/external/ajax/setsites.php delete mode 100644 apps/external/appinfo/app.php delete mode 100644 apps/external/appinfo/info.xml delete mode 100644 apps/external/appinfo/version delete mode 100644 apps/external/css/style.css delete mode 100644 apps/external/img/external.png delete mode 100644 apps/external/img/external.svg delete mode 100644 apps/external/index.php delete mode 100644 apps/external/js/admin.js delete mode 100644 apps/external/lib/external.php delete mode 100644 apps/external/settings.php delete mode 100644 apps/external/templates/frame.php delete mode 100644 apps/external/templates/settings.php create mode 100644 apps/files/appinfo/filesync.php create mode 100644 apps/files/l10n/es_AR.php create mode 100644 apps/files/l10n/lv.php create mode 100644 apps/files/l10n/oc.php create mode 100644 apps/files/l10n/ru_RU.php create mode 100644 apps/files/l10n/si_LK.php create mode 100644 apps/files/l10n/vi.php create mode 100644 apps/files/l10n/zh_CN.GB2312.php delete mode 100644 apps/files_archive/appinfo/app.php delete mode 100644 apps/files_archive/appinfo/info.xml delete mode 100644 apps/files_archive/appinfo/version delete mode 100644 apps/files_archive/js/archive.js delete mode 100644 apps/files_archive/lib/storage.php delete mode 100644 apps/files_archive/tests/data/data.tar.gz delete mode 100644 apps/files_archive/tests/data/data.zip delete mode 100644 apps/files_archive/tests/data/lorem.txt delete mode 100644 apps/files_archive/tests/storage.php create mode 100644 apps/files_encryption/l10n/.gitkeep create mode 100644 apps/files_encryption/l10n/ca.php create mode 100644 apps/files_encryption/l10n/cs_CZ.php create mode 100644 apps/files_encryption/l10n/da.php create mode 100644 apps/files_encryption/l10n/de.php create mode 100644 apps/files_encryption/l10n/el.php create mode 100644 apps/files_encryption/l10n/eo.php create mode 100644 apps/files_encryption/l10n/es.php create mode 100644 apps/files_encryption/l10n/es_AR.php create mode 100644 apps/files_encryption/l10n/et_EE.php create mode 100644 apps/files_encryption/l10n/eu.php create mode 100644 apps/files_encryption/l10n/fa.php create mode 100644 apps/files_encryption/l10n/fi_FI.php create mode 100644 apps/files_encryption/l10n/fr.php create mode 100644 apps/files_encryption/l10n/gl.php create mode 100644 apps/files_encryption/l10n/hu_HU.php create mode 100644 apps/files_encryption/l10n/it.php create mode 100644 apps/files_encryption/l10n/ja_JP.php create mode 100644 apps/files_encryption/l10n/ku_IQ.php create mode 100644 apps/files_encryption/l10n/lt_LT.php create mode 100644 apps/files_encryption/l10n/nb_NO.php create mode 100644 apps/files_encryption/l10n/nl.php create mode 100644 apps/files_encryption/l10n/pl.php create mode 100644 apps/files_encryption/l10n/pt_BR.php create mode 100644 apps/files_encryption/l10n/pt_PT.php create mode 100644 apps/files_encryption/l10n/ro.php create mode 100644 apps/files_encryption/l10n/ru.php create mode 100644 apps/files_encryption/l10n/ru_RU.php create mode 100644 apps/files_encryption/l10n/sk_SK.php create mode 100644 apps/files_encryption/l10n/sl.php create mode 100644 apps/files_encryption/l10n/sv.php create mode 100644 apps/files_encryption/l10n/th_TH.php create mode 100644 apps/files_encryption/l10n/vi.php create mode 100644 apps/files_encryption/l10n/zh_CN.GB2312.php create mode 100644 apps/files_encryption/l10n/zh_CN.php create mode 100644 apps/files_encryption/l10n/zh_TW.php create mode 100644 apps/files_encryption/tests/out.txt create mode 100644 apps/files_external/l10n/.gitkeep create mode 100644 apps/files_external/l10n/ca.php create mode 100644 apps/files_external/l10n/cs_CZ.php create mode 100644 apps/files_external/l10n/da.php create mode 100644 apps/files_external/l10n/de.php create mode 100644 apps/files_external/l10n/el.php create mode 100644 apps/files_external/l10n/eo.php create mode 100644 apps/files_external/l10n/es.php create mode 100644 apps/files_external/l10n/es_AR.php create mode 100644 apps/files_external/l10n/et_EE.php create mode 100644 apps/files_external/l10n/eu.php create mode 100644 apps/files_external/l10n/fi_FI.php create mode 100644 apps/files_external/l10n/fr.php create mode 100644 apps/files_external/l10n/gl.php create mode 100644 apps/files_external/l10n/he.php create mode 100644 apps/files_external/l10n/it.php create mode 100644 apps/files_external/l10n/ja_JP.php create mode 100644 apps/files_external/l10n/lt_LT.php create mode 100644 apps/files_external/l10n/nb_NO.php create mode 100644 apps/files_external/l10n/nl.php create mode 100644 apps/files_external/l10n/pl.php create mode 100644 apps/files_external/l10n/pt_BR.php create mode 100644 apps/files_external/l10n/pt_PT.php create mode 100644 apps/files_external/l10n/ro.php create mode 100644 apps/files_external/l10n/ru.php create mode 100644 apps/files_external/l10n/ru_RU.php create mode 100644 apps/files_external/l10n/sk_SK.php create mode 100644 apps/files_external/l10n/sl.php create mode 100644 apps/files_external/l10n/sv.php create mode 100644 apps/files_external/l10n/th_TH.php create mode 100644 apps/files_external/l10n/uk.php create mode 100644 apps/files_external/l10n/vi.php create mode 100644 apps/files_external/l10n/zh_CN.GB2312.php create mode 100644 apps/files_external/tests/dropbox.php delete mode 100644 apps/files_imageviewer/appinfo/app.php delete mode 100644 apps/files_imageviewer/appinfo/info.xml delete mode 100644 apps/files_imageviewer/appinfo/version delete mode 100644 apps/files_imageviewer/css/jquery.fancybox-1.3.4.css delete mode 100644 apps/files_imageviewer/img/blank.gif delete mode 100644 apps/files_imageviewer/img/fancy_close.png delete mode 100644 apps/files_imageviewer/img/fancy_loading.png delete mode 100644 apps/files_imageviewer/img/fancy_nav_left.png delete mode 100644 apps/files_imageviewer/img/fancy_nav_right.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_e.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_n.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_ne.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_nw.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_s.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_se.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_sw.png delete mode 100644 apps/files_imageviewer/img/fancy_shadow_w.png delete mode 100644 apps/files_imageviewer/img/fancy_title_left.png delete mode 100644 apps/files_imageviewer/img/fancy_title_main.png delete mode 100644 apps/files_imageviewer/img/fancy_title_over.png delete mode 100644 apps/files_imageviewer/img/fancy_title_right.png delete mode 100644 apps/files_imageviewer/img/fancybox-x.png delete mode 100644 apps/files_imageviewer/img/fancybox-y.png delete mode 100644 apps/files_imageviewer/img/fancybox.png delete mode 100644 apps/files_imageviewer/js/jquery.fancybox-1.3.4.js delete mode 100644 apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js delete mode 100644 apps/files_imageviewer/js/jquery.mousewheel-3.0.4.js delete mode 100644 apps/files_imageviewer/js/jquery.mousewheel-3.0.4.pack.js delete mode 100644 apps/files_imageviewer/js/lightbox.js delete mode 100644 apps/files_pdfviewer/appinfo/app.php delete mode 100644 apps/files_pdfviewer/appinfo/info.xml delete mode 100644 apps/files_pdfviewer/appinfo/version delete mode 100644 apps/files_pdfviewer/css/history.png delete mode 100644 apps/files_pdfviewer/css/viewer.css delete mode 100644 apps/files_pdfviewer/js/pdfjs/LICENSE delete mode 100644 apps/files_pdfviewer/js/pdfjs/README delete mode 100644 apps/files_pdfviewer/js/pdfjs/build/pdf.js delete mode 100644 apps/files_pdfviewer/js/pdfjs/compatibility.js delete mode 100755 apps/files_pdfviewer/js/pdfjs/update.sh delete mode 100644 apps/files_pdfviewer/js/pdfjs/viewer.js delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/bookmark.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/check.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/comment.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/document-print.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/download.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/go-down.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/go-up.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/nav-outline.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/nav-thumbs.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/pin-down.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/pin-up.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/zoom-in.svg delete mode 100644 apps/files_pdfviewer/js/pdfjs/web/images/zoom-out.svg delete mode 100644 apps/files_pdfviewer/js/pdfview.js delete mode 100644 apps/files_pdfviewer/js/viewer.js delete mode 100644 apps/files_sharing/ajax/email.php delete mode 100644 apps/files_sharing/ajax/getitem.php delete mode 100644 apps/files_sharing/ajax/getstatuses.php delete mode 100644 apps/files_sharing/ajax/setpermissions.php delete mode 100644 apps/files_sharing/ajax/share.php delete mode 100644 apps/files_sharing/ajax/toggleresharing.php delete mode 100644 apps/files_sharing/ajax/unshare.php delete mode 100644 apps/files_sharing/ajax/userautocomplete.php delete mode 100644 apps/files_sharing/appinfo/database.xml create mode 100644 apps/files_sharing/appinfo/update.php create mode 100644 apps/files_sharing/css/public.css delete mode 100644 apps/files_sharing/css/sharing.css delete mode 100644 apps/files_sharing/get.php delete mode 100644 apps/files_sharing/js/list.js create mode 100644 apps/files_sharing/js/public.js delete mode 100644 apps/files_sharing/js/settings.js create mode 100644 apps/files_sharing/l10n/.gitkeep create mode 100644 apps/files_sharing/l10n/ca.php create mode 100644 apps/files_sharing/l10n/cs_CZ.php create mode 100644 apps/files_sharing/l10n/da.php create mode 100644 apps/files_sharing/l10n/de.php create mode 100644 apps/files_sharing/l10n/el.php create mode 100644 apps/files_sharing/l10n/eo.php create mode 100644 apps/files_sharing/l10n/es.php create mode 100644 apps/files_sharing/l10n/es_AR.php create mode 100644 apps/files_sharing/l10n/et_EE.php create mode 100644 apps/files_sharing/l10n/eu.php create mode 100644 apps/files_sharing/l10n/fa.php create mode 100644 apps/files_sharing/l10n/fi_FI.php create mode 100644 apps/files_sharing/l10n/fr.php create mode 100644 apps/files_sharing/l10n/gl.php create mode 100644 apps/files_sharing/l10n/he.php create mode 100644 apps/files_sharing/l10n/hu_HU.php create mode 100644 apps/files_sharing/l10n/it.php create mode 100644 apps/files_sharing/l10n/ja_JP.php create mode 100644 apps/files_sharing/l10n/ku_IQ.php create mode 100644 apps/files_sharing/l10n/lt_LT.php create mode 100644 apps/files_sharing/l10n/nb_NO.php create mode 100644 apps/files_sharing/l10n/nl.php create mode 100644 apps/files_sharing/l10n/pl.php create mode 100644 apps/files_sharing/l10n/pt_BR.php create mode 100644 apps/files_sharing/l10n/pt_PT.php create mode 100644 apps/files_sharing/l10n/ro.php create mode 100644 apps/files_sharing/l10n/ru.php create mode 100644 apps/files_sharing/l10n/ru_RU.php create mode 100644 apps/files_sharing/l10n/sk_SK.php create mode 100644 apps/files_sharing/l10n/sl.php create mode 100644 apps/files_sharing/l10n/sv.php create mode 100644 apps/files_sharing/l10n/th_TH.php create mode 100644 apps/files_sharing/l10n/uk.php create mode 100644 apps/files_sharing/l10n/vi.php create mode 100644 apps/files_sharing/l10n/zh_CN.GB2312.php create mode 100644 apps/files_sharing/l10n/zh_CN.php create mode 100644 apps/files_sharing/l10n/zh_TW.php create mode 100644 apps/files_sharing/lib/share/file.php create mode 100644 apps/files_sharing/lib/share/folder.php create mode 100644 apps/files_sharing/lib/sharedstorage.php delete mode 100644 apps/files_sharing/lib_share.php delete mode 100644 apps/files_sharing/list.php create mode 100644 apps/files_sharing/public.php delete mode 100644 apps/files_sharing/settings.php delete mode 100644 apps/files_sharing/sharedstorage.php create mode 100644 apps/files_sharing/templates/authenticate.php delete mode 100644 apps/files_sharing/templates/list.php create mode 100644 apps/files_sharing/templates/public.php delete mode 100644 apps/files_sharing/templates/settings.php delete mode 100644 apps/files_sharing_log/appinfo/app.php delete mode 100644 apps/files_sharing_log/appinfo/database.xml delete mode 100644 apps/files_sharing_log/appinfo/info.xml delete mode 100644 apps/files_sharing_log/appinfo/version delete mode 100644 apps/files_sharing_log/css/style.css delete mode 100644 apps/files_sharing_log/index.php delete mode 100644 apps/files_sharing_log/log.php delete mode 100644 apps/files_sharing_log/templates/index.php delete mode 100644 apps/files_texteditor/ajax/loadfile.php delete mode 100644 apps/files_texteditor/ajax/mtime.php delete mode 100644 apps/files_texteditor/ajax/savefile.php delete mode 100644 apps/files_texteditor/appinfo/app.php delete mode 100644 apps/files_texteditor/appinfo/info.xml delete mode 100644 apps/files_texteditor/appinfo/version delete mode 100644 apps/files_texteditor/css/DroidSansMono/DroidSansMono-webfont.eot delete mode 100644 apps/files_texteditor/css/DroidSansMono/DroidSansMono-webfont.svg delete mode 100644 apps/files_texteditor/css/DroidSansMono/DroidSansMono-webfont.ttf delete mode 100644 apps/files_texteditor/css/DroidSansMono/DroidSansMono-webfont.woff delete mode 100644 apps/files_texteditor/css/DroidSansMono/Google Android License.txt delete mode 100644 apps/files_texteditor/css/DroidSansMono/demo.html delete mode 100644 apps/files_texteditor/css/DroidSansMono/stylesheet.css delete mode 100644 apps/files_texteditor/css/style.css delete mode 100644 apps/files_texteditor/js/aceeditor/LICENSE delete mode 100644 apps/files_texteditor/js/aceeditor/ace-compat-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/ace-compat.js delete mode 100644 apps/files_texteditor/js/aceeditor/ace-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/ace.js delete mode 100644 apps/files_texteditor/js/aceeditor/keybinding-emacs-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/keybinding-emacs.js delete mode 100644 apps/files_texteditor/js/aceeditor/keybinding-vim-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/keybinding-vim.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-c_cpp-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-c_cpp.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-clojure-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-clojure.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-coffee-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-coffee.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-coldfusion-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-coldfusion.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-csharp-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-csharp.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-css-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-css.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-groovy-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-groovy.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-haxe-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-haxe.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-html-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-html.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-java-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-java.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-javascript-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-javascript.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-json-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-json.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-latex-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-latex.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-less-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-less.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-liquid-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-liquid.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-lua-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-lua.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-markdown-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-markdown.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-ocaml-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-ocaml.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-perl-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-perl.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-pgsql-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-pgsql.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-php-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-php.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-powershell-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-powershell.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-python-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-python.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-ruby-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-ruby.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scad-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scad.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scala-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scala.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scss-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-scss.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-sh-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-sh.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-sql-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-sql.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-svg-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-svg.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-text-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-text.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-textile-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-textile.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-xml-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-xml.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-xquery-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/mode-xquery.js delete mode 100644 apps/files_texteditor/js/aceeditor/theme-clouds-uncompressed.js delete mode 100644 apps/files_texteditor/js/aceeditor/theme-clouds.js delete mode 100644 apps/files_texteditor/js/aceeditor/worker-coffee.js delete mode 100644 apps/files_texteditor/js/aceeditor/worker-css.js delete mode 100644 apps/files_texteditor/js/aceeditor/worker-javascript.js delete mode 100644 apps/files_texteditor/js/aceeditor/worker-json.js delete mode 100644 apps/files_texteditor/js/editor.js create mode 100644 apps/files_versions/appinfo/api.php create mode 100644 apps/files_versions/appinfo/update.php create mode 100644 apps/files_versions/l10n/.gitkeep create mode 100644 apps/files_versions/l10n/ca.php create mode 100644 apps/files_versions/l10n/cs_CZ.php create mode 100644 apps/files_versions/l10n/da.php create mode 100644 apps/files_versions/l10n/de.php create mode 100644 apps/files_versions/l10n/el.php create mode 100644 apps/files_versions/l10n/eo.php create mode 100644 apps/files_versions/l10n/es.php create mode 100644 apps/files_versions/l10n/es_AR.php create mode 100644 apps/files_versions/l10n/et_EE.php create mode 100644 apps/files_versions/l10n/eu.php create mode 100644 apps/files_versions/l10n/fa.php create mode 100644 apps/files_versions/l10n/fi_FI.php create mode 100644 apps/files_versions/l10n/fr.php create mode 100644 apps/files_versions/l10n/gl.php create mode 100644 apps/files_versions/l10n/he.php create mode 100644 apps/files_versions/l10n/it.php create mode 100644 apps/files_versions/l10n/ja_JP.php create mode 100644 apps/files_versions/l10n/ku_IQ.php create mode 100644 apps/files_versions/l10n/lt_LT.php create mode 100644 apps/files_versions/l10n/nb_NO.php create mode 100644 apps/files_versions/l10n/nl.php create mode 100644 apps/files_versions/l10n/pl.php create mode 100644 apps/files_versions/l10n/pt_BR.php create mode 100644 apps/files_versions/l10n/pt_PT.php create mode 100644 apps/files_versions/l10n/ro.php create mode 100644 apps/files_versions/l10n/ru.php create mode 100644 apps/files_versions/l10n/ru_RU.php create mode 100644 apps/files_versions/l10n/sk_SK.php create mode 100644 apps/files_versions/l10n/sl.php create mode 100644 apps/files_versions/l10n/sv.php create mode 100644 apps/files_versions/l10n/th_TH.php create mode 100644 apps/files_versions/l10n/vi.php create mode 100644 apps/files_versions/l10n/zh_CN.GB2312.php create mode 100644 apps/files_versions/l10n/zh_CN.php delete mode 100644 apps/gallery/ajax/createAlbum.php delete mode 100644 apps/gallery/ajax/galleryOp.php delete mode 100644 apps/gallery/ajax/sharing.php delete mode 100644 apps/gallery/ajax/thumbnail.php delete mode 100644 apps/gallery/appinfo/app.php delete mode 100644 apps/gallery/appinfo/database.xml delete mode 100644 apps/gallery/appinfo/info.xml delete mode 100644 apps/gallery/appinfo/update.php delete mode 100644 apps/gallery/appinfo/version delete mode 100644 apps/gallery/css/sharing.css delete mode 100644 apps/gallery/css/styles.css delete mode 100644 apps/gallery/css/supersized.css delete mode 100644 apps/gallery/css/supersized.shutter.css delete mode 100644 apps/gallery/img/breadcrumb.png delete mode 100644 apps/gallery/img/delete.png delete mode 100644 apps/gallery/img/loading.gif delete mode 100644 apps/gallery/img/rename.png delete mode 100644 apps/gallery/img/share.png delete mode 100644 apps/gallery/img/supersized/back.png delete mode 100644 apps/gallery/img/supersized/bg-black.png delete mode 100644 apps/gallery/img/supersized/bg-hover.png delete mode 100644 apps/gallery/img/supersized/button-tray-down.png delete mode 100644 apps/gallery/img/supersized/button-tray-up.png delete mode 100644 apps/gallery/img/supersized/forward.png delete mode 100644 apps/gallery/img/supersized/nav-bg.png delete mode 100644 apps/gallery/img/supersized/nav-dot.png delete mode 100644 apps/gallery/img/supersized/pause.png delete mode 100644 apps/gallery/img/supersized/play.png delete mode 100644 apps/gallery/img/supersized/progress-back.png delete mode 100644 apps/gallery/img/supersized/progress-bar.png delete mode 100644 apps/gallery/img/supersized/progress.gif delete mode 100644 apps/gallery/img/supersized/supersized-logo.png delete mode 100644 apps/gallery/img/supersized/thumb-back.png delete mode 100644 apps/gallery/img/supersized/thumb-forward.png delete mode 100644 apps/gallery/index.php delete mode 100644 apps/gallery/js/albums.js delete mode 100644 apps/gallery/js/jquery.easing.min.js delete mode 100644 apps/gallery/js/pictures.js delete mode 100644 apps/gallery/js/scanner.js delete mode 100644 apps/gallery/js/sharing.js delete mode 100644 apps/gallery/js/slideshow.js delete mode 100644 apps/gallery/js/supersized.3.2.7.js delete mode 100644 apps/gallery/js/supersized.3.2.7.min.js delete mode 100644 apps/gallery/js/supersized.shutter.js delete mode 100644 apps/gallery/js/supersized.shutter.min.js delete mode 100644 apps/gallery/l10n/ar.php delete mode 100644 apps/gallery/l10n/ca.php delete mode 100644 apps/gallery/l10n/cs_CZ.php delete mode 100644 apps/gallery/l10n/da.php delete mode 100644 apps/gallery/l10n/de.php delete mode 100644 apps/gallery/l10n/el.php delete mode 100644 apps/gallery/l10n/eo.php delete mode 100644 apps/gallery/l10n/es.php delete mode 100644 apps/gallery/l10n/et_EE.php delete mode 100644 apps/gallery/l10n/eu.php delete mode 100644 apps/gallery/l10n/fa.php delete mode 100644 apps/gallery/l10n/fi_FI.php delete mode 100644 apps/gallery/l10n/fr.php delete mode 100644 apps/gallery/l10n/gl.php delete mode 100644 apps/gallery/l10n/hr.php delete mode 100644 apps/gallery/l10n/hu_HU.php delete mode 100644 apps/gallery/l10n/ia.php delete mode 100644 apps/gallery/l10n/id.php delete mode 100644 apps/gallery/l10n/it.php delete mode 100644 apps/gallery/l10n/ja_JP.php delete mode 100644 apps/gallery/l10n/ko.php delete mode 100644 apps/gallery/l10n/lb.php delete mode 100644 apps/gallery/l10n/lt_LT.php delete mode 100644 apps/gallery/l10n/mk.php delete mode 100644 apps/gallery/l10n/ms_MY.php delete mode 100644 apps/gallery/l10n/nb_NO.php delete mode 100644 apps/gallery/l10n/nl.php delete mode 100644 apps/gallery/l10n/nn_NO.php delete mode 100644 apps/gallery/l10n/pl.php delete mode 100644 apps/gallery/l10n/pt_BR.php delete mode 100644 apps/gallery/l10n/pt_PT.php delete mode 100644 apps/gallery/l10n/ro.php delete mode 100644 apps/gallery/l10n/ru.php delete mode 100644 apps/gallery/l10n/sk_SK.php delete mode 100644 apps/gallery/l10n/sl.php delete mode 100644 apps/gallery/l10n/sr.php delete mode 100644 apps/gallery/l10n/sv.php delete mode 100644 apps/gallery/l10n/th_TH.php delete mode 100644 apps/gallery/l10n/tr.php delete mode 100644 apps/gallery/l10n/uk.php delete mode 100644 apps/gallery/l10n/zh_CN.php delete mode 100644 apps/gallery/l10n/zh_TW.php delete mode 100644 apps/gallery/lib/album.php delete mode 100644 apps/gallery/lib/hooks_handlers.php delete mode 100644 apps/gallery/lib/images_utils.php delete mode 100644 apps/gallery/lib/managers.php delete mode 100644 apps/gallery/lib/photo.php delete mode 100644 apps/gallery/lib/scanner.php delete mode 100644 apps/gallery/lib/sharing.php delete mode 100644 apps/gallery/lib/tiles.php delete mode 100644 apps/gallery/lib/tiles_test.php delete mode 100644 apps/gallery/sharing.php delete mode 100644 apps/gallery/templates/index.php delete mode 100644 apps/gallery/templates/view_album.php delete mode 100644 apps/media/ajax/api.php delete mode 100644 apps/media/ajax/autoupdate.php delete mode 100644 apps/media/appinfo/app.php delete mode 100644 apps/media/appinfo/database.xml delete mode 100644 apps/media/appinfo/info.xml delete mode 100644 apps/media/appinfo/version delete mode 100644 apps/media/css/music.css delete mode 100644 apps/media/css/player.css delete mode 100644 apps/media/index.php delete mode 100644 apps/media/js/Jplayer.swf delete mode 100644 apps/media/js/collection.js delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.as delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/Jplayer.fla delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jplayer.playlist.js delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/add-on/jquery.jplayer.inspector.js delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerEvent.as delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp3.as delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerMp4.as delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/happyworm/jPlayer/JplayerStatus.as delete mode 100644 apps/media/js/jQuery.jPlayer.2.1.0.source/jquery.jplayer.js delete mode 100644 apps/media/js/jquery.jplayer.min.js delete mode 100644 apps/media/js/loader.js delete mode 100644 apps/media/js/music.js delete mode 100644 apps/media/js/player.js delete mode 100644 apps/media/js/playlist.js delete mode 100644 apps/media/js/scanner.js delete mode 100644 apps/media/l10n/ar.php delete mode 100644 apps/media/l10n/bg_BG.php delete mode 100644 apps/media/l10n/ca.php delete mode 100644 apps/media/l10n/cs_CZ.php delete mode 100644 apps/media/l10n/da.php delete mode 100644 apps/media/l10n/de.php delete mode 100644 apps/media/l10n/el.php delete mode 100644 apps/media/l10n/eo.php delete mode 100644 apps/media/l10n/es.php delete mode 100644 apps/media/l10n/et_EE.php delete mode 100644 apps/media/l10n/eu.php delete mode 100644 apps/media/l10n/fa.php delete mode 100644 apps/media/l10n/fi_FI.php delete mode 100644 apps/media/l10n/fr.php delete mode 100644 apps/media/l10n/gl.php delete mode 100644 apps/media/l10n/he.php delete mode 100644 apps/media/l10n/hr.php delete mode 100644 apps/media/l10n/hu_HU.php delete mode 100644 apps/media/l10n/ia.php delete mode 100644 apps/media/l10n/id.php delete mode 100644 apps/media/l10n/it.php delete mode 100644 apps/media/l10n/ja_JP.php delete mode 100644 apps/media/l10n/ko.php delete mode 100644 apps/media/l10n/lb.php delete mode 100644 apps/media/l10n/lt_LT.php delete mode 100644 apps/media/l10n/mk.php delete mode 100644 apps/media/l10n/ms_MY.php delete mode 100644 apps/media/l10n/nb_NO.php delete mode 100644 apps/media/l10n/nl.php delete mode 100644 apps/media/l10n/nn_NO.php delete mode 100644 apps/media/l10n/pl.php delete mode 100644 apps/media/l10n/pt_BR.php delete mode 100644 apps/media/l10n/pt_PT.php delete mode 100644 apps/media/l10n/ro.php delete mode 100644 apps/media/l10n/ru.php delete mode 100644 apps/media/l10n/sk_SK.php delete mode 100644 apps/media/l10n/sl.php delete mode 100644 apps/media/l10n/sr.php delete mode 100644 apps/media/l10n/sr@latin.php delete mode 100644 apps/media/l10n/sv.php delete mode 100644 apps/media/l10n/th_TH.php delete mode 100644 apps/media/l10n/tr.php delete mode 100644 apps/media/l10n/xgettextfiles delete mode 100644 apps/media/l10n/zh_CN.php delete mode 100644 apps/media/l10n/zh_TW.php delete mode 100644 apps/media/lib_ampache.php delete mode 100644 apps/media/lib_collection.php delete mode 100644 apps/media/lib_media.php delete mode 100644 apps/media/lib_scanner.php delete mode 100644 apps/media/remote.php delete mode 100644 apps/media/server/xml.server.php delete mode 100644 apps/media/settings.php delete mode 100644 apps/media/templates/music.php delete mode 100644 apps/media/templates/player.php delete mode 100644 apps/media/templates/settings.php delete mode 100644 apps/remoteStorage/BearerAuth.php delete mode 100644 apps/remoteStorage/WebDAV.php delete mode 100644 apps/remoteStorage/ajax/revokeToken.php delete mode 100644 apps/remoteStorage/appinfo/app.php delete mode 100644 apps/remoteStorage/appinfo/database.xml delete mode 100644 apps/remoteStorage/appinfo/info.xml delete mode 100644 apps/remoteStorage/appinfo/version delete mode 100644 apps/remoteStorage/appinfo/webfinger.php delete mode 100644 apps/remoteStorage/auth.php delete mode 100644 apps/remoteStorage/lib_remoteStorage.php delete mode 100644 apps/remoteStorage/oauth_ro_auth.php delete mode 100644 apps/remoteStorage/remoteStorage.png delete mode 100644 apps/remoteStorage/settings.php delete mode 100644 apps/remoteStorage/templates/settings.php delete mode 100644 apps/tasks/ajax/addtask.php delete mode 100644 apps/tasks/ajax/addtaskform.php delete mode 100644 apps/tasks/ajax/delete.php delete mode 100644 apps/tasks/ajax/edittask.php delete mode 100644 apps/tasks/ajax/edittaskform.php delete mode 100644 apps/tasks/ajax/getdetails.php delete mode 100644 apps/tasks/ajax/gettasks.php delete mode 100644 apps/tasks/ajax/update_property.php delete mode 100644 apps/tasks/appinfo/app.php delete mode 100644 apps/tasks/appinfo/info.xml delete mode 100644 apps/tasks/css/style.css delete mode 100644 apps/tasks/img/icon.png delete mode 100644 apps/tasks/img/icon.svg delete mode 100644 apps/tasks/index.php delete mode 100644 apps/tasks/js/tasks.js delete mode 100644 apps/tasks/lib/app.php delete mode 100644 apps/tasks/lib/vtodo.php delete mode 100644 apps/tasks/templates/part.addtaskform.php delete mode 100644 apps/tasks/templates/part.details.php delete mode 100644 apps/tasks/templates/part.edittaskform.php delete mode 100644 apps/tasks/templates/part.property.php delete mode 100644 apps/tasks/templates/part.taskform.php delete mode 100644 apps/tasks/templates/part.tasks.php delete mode 100644 apps/tasks/templates/tasks.php create mode 100644 apps/user_ldap/ajax/testConfiguration.php create mode 100644 apps/user_ldap/css/settings.css create mode 100644 apps/user_ldap/l10n/.gitkeep create mode 100644 apps/user_ldap/l10n/ca.php create mode 100644 apps/user_ldap/l10n/cs_CZ.php create mode 100644 apps/user_ldap/l10n/da.php create mode 100644 apps/user_ldap/l10n/de.php create mode 100644 apps/user_ldap/l10n/el.php create mode 100644 apps/user_ldap/l10n/eo.php create mode 100644 apps/user_ldap/l10n/es.php create mode 100644 apps/user_ldap/l10n/es_AR.php create mode 100644 apps/user_ldap/l10n/et_EE.php create mode 100644 apps/user_ldap/l10n/eu.php create mode 100644 apps/user_ldap/l10n/fa.php create mode 100644 apps/user_ldap/l10n/fi_FI.php create mode 100644 apps/user_ldap/l10n/fr.php create mode 100644 apps/user_ldap/l10n/it.php create mode 100644 apps/user_ldap/l10n/ja_JP.php create mode 100644 apps/user_ldap/l10n/lt_LT.php create mode 100644 apps/user_ldap/l10n/pl.php create mode 100644 apps/user_ldap/l10n/pt_BR.php create mode 100644 apps/user_ldap/l10n/pt_PT.php create mode 100644 apps/user_ldap/l10n/ro.php create mode 100644 apps/user_ldap/l10n/ru.php create mode 100644 apps/user_ldap/l10n/ru_RU.php create mode 100644 apps/user_ldap/l10n/sl.php create mode 100644 apps/user_ldap/l10n/sv.php create mode 100644 apps/user_ldap/l10n/th_TH.php create mode 100644 apps/user_ldap/l10n/uk.php create mode 100644 apps/user_ldap/l10n/vi.php create mode 100644 apps/user_ldap/l10n/zh_CN.GB2312.php create mode 100644 apps/user_ldap/l10n/zh_CN.php create mode 100644 apps/user_ldap/lib/access.php create mode 100644 apps/user_ldap/lib/connection.php create mode 100644 apps/user_ldap/lib/jobs.php delete mode 100644 apps/user_ldap/lib_ldap.php delete mode 100644 apps/user_migrate/ajax/export.php delete mode 100644 apps/user_migrate/appinfo/app.php delete mode 100644 apps/user_migrate/appinfo/info.xml delete mode 100644 apps/user_migrate/appinfo/version delete mode 100644 apps/user_migrate/js/export.js delete mode 100644 apps/user_migrate/settings.php delete mode 100644 apps/user_migrate/templates/settings.php delete mode 100644 apps/user_openid/appinfo/app.php delete mode 100644 apps/user_openid/appinfo/info.xml delete mode 100644 apps/user_openid/appinfo/version delete mode 100644 apps/user_openid/class.openid.v3.php delete mode 100644 apps/user_openid/js/settings.js delete mode 100644 apps/user_openid/phpmyid.php delete mode 100644 apps/user_openid/settings.php delete mode 100644 apps/user_openid/templates/nomode.php delete mode 100644 apps/user_openid/templates/settings.php delete mode 100644 apps/user_openid/user.php delete mode 100644 apps/user_openid/user_openid.php create mode 100755 apps/user_webdavauth/appinfo/app.php create mode 100755 apps/user_webdavauth/appinfo/info.xml create mode 100755 apps/user_webdavauth/settings.php create mode 100755 apps/user_webdavauth/templates/settings.php create mode 100755 apps/user_webdavauth/user_webdavauth.php delete mode 100644 apps/user_webfinger/appinfo/app.php delete mode 100644 apps/user_webfinger/appinfo/info.xml delete mode 100644 apps/user_webfinger/appinfo/version delete mode 100644 apps/user_webfinger/host-meta.php delete mode 100644 apps/user_webfinger/webfinger.php create mode 100755 autotest.sh delete mode 100644 core/ajax/grouplist.php create mode 100644 core/ajax/requesttoken.php create mode 100644 core/ajax/share.php delete mode 100644 core/ajax/userlist.php delete mode 100644 core/ajax/validateuser.php create mode 100644 core/css/share.css create mode 100644 core/img/actions/clock.png create mode 100755 core/img/actions/clock.svg create mode 100644 core/img/actions/lock.png create mode 100755 core/img/actions/lock.svg create mode 100644 core/img/rating/s1.png create mode 100644 core/img/rating/s10.png create mode 100644 core/img/rating/s11.png create mode 100644 core/img/rating/s2.png create mode 100644 core/img/rating/s3.png create mode 100644 core/img/rating/s4.png create mode 100644 core/img/rating/s5.png create mode 100644 core/img/rating/s6.png create mode 100644 core/img/rating/s7.png create mode 100644 core/img/rating/s8.png create mode 100644 core/img/rating/s9.png create mode 100644 core/js/LICENSE.jquery.inview create mode 100644 core/js/backgroundjobs.js create mode 100644 core/js/jquery.inview.js create mode 100644 core/js/jquery.inview.txt create mode 100644 core/js/requesttoken.js create mode 100644 core/js/share.js create mode 100644 core/l10n/es_AR.php create mode 100644 core/l10n/hi.php create mode 100644 core/l10n/ignorelist create mode 100644 core/l10n/ku_IQ.php create mode 100644 core/l10n/lv.php create mode 100644 core/l10n/oc.php create mode 100644 core/l10n/ru_RU.php create mode 100644 core/l10n/si_LK.php create mode 100644 core/l10n/vi.php create mode 100644 core/l10n/zh_CN.GB2312.php create mode 100644 core/templates/exception.php create mode 100644 core/templates/layout.base.php create mode 100644 core/templates/verify.php create mode 100644 cron.php create mode 100644 l10n/af/admin_dependencies_chk.po create mode 100644 l10n/af/admin_migrate.po create mode 100644 l10n/af/bookmarks.po create mode 100644 l10n/af/files_encryption.po create mode 100644 l10n/af/files_external.po create mode 100644 l10n/af/files_odfviewer.po create mode 100644 l10n/af/files_pdfviewer.po create mode 100644 l10n/af/files_sharing.po create mode 100644 l10n/af/files_texteditor.po create mode 100644 l10n/af/files_versions.po create mode 100644 l10n/af/impress.po create mode 100644 l10n/af/lib.po create mode 100644 l10n/af/tasks.po create mode 100644 l10n/af/user_ldap.po create mode 100644 l10n/af/user_migrate.po create mode 100644 l10n/af/user_openid.po create mode 100644 l10n/ar/admin_dependencies_chk.po create mode 100644 l10n/ar/admin_migrate.po create mode 100644 l10n/ar/bookmarks.po create mode 100644 l10n/ar/files_encryption.po create mode 100644 l10n/ar/files_external.po create mode 100644 l10n/ar/files_odfviewer.po create mode 100644 l10n/ar/files_pdfviewer.po create mode 100644 l10n/ar/files_sharing.po create mode 100644 l10n/ar/files_texteditor.po create mode 100644 l10n/ar/files_versions.po create mode 100644 l10n/ar/impress.po create mode 100644 l10n/ar/lib.po create mode 100644 l10n/ar/tasks.po create mode 100644 l10n/ar/user_ldap.po create mode 100644 l10n/ar/user_migrate.po create mode 100644 l10n/ar/user_openid.po create mode 100644 l10n/ar_SA/admin_dependencies_chk.po create mode 100644 l10n/ar_SA/admin_migrate.po create mode 100644 l10n/ar_SA/bookmarks.po create mode 100644 l10n/ar_SA/calendar.po create mode 100644 l10n/ar_SA/contacts.po create mode 100644 l10n/ar_SA/core.po create mode 100644 l10n/ar_SA/files.po create mode 100644 l10n/ar_SA/files_encryption.po create mode 100644 l10n/ar_SA/files_external.po create mode 100644 l10n/ar_SA/files_odfviewer.po create mode 100644 l10n/ar_SA/files_pdfviewer.po create mode 100644 l10n/ar_SA/files_sharing.po create mode 100644 l10n/ar_SA/files_texteditor.po create mode 100644 l10n/ar_SA/files_versions.po create mode 100644 l10n/ar_SA/gallery.po create mode 100644 l10n/ar_SA/impress.po create mode 100644 l10n/ar_SA/lib.po create mode 100644 l10n/ar_SA/media.po create mode 100644 l10n/ar_SA/settings.po create mode 100644 l10n/ar_SA/tasks.po create mode 100644 l10n/ar_SA/user_ldap.po create mode 100644 l10n/ar_SA/user_migrate.po create mode 100644 l10n/ar_SA/user_openid.po create mode 100644 l10n/bg_BG/admin_dependencies_chk.po create mode 100644 l10n/bg_BG/admin_migrate.po create mode 100644 l10n/bg_BG/bookmarks.po create mode 100644 l10n/bg_BG/files_encryption.po create mode 100644 l10n/bg_BG/files_external.po create mode 100644 l10n/bg_BG/files_odfviewer.po create mode 100644 l10n/bg_BG/files_pdfviewer.po create mode 100644 l10n/bg_BG/files_sharing.po create mode 100644 l10n/bg_BG/files_texteditor.po create mode 100644 l10n/bg_BG/files_versions.po create mode 100644 l10n/bg_BG/impress.po create mode 100644 l10n/bg_BG/lib.po create mode 100644 l10n/bg_BG/tasks.po create mode 100644 l10n/bg_BG/user_ldap.po create mode 100644 l10n/bg_BG/user_migrate.po create mode 100644 l10n/bg_BG/user_openid.po create mode 100644 l10n/ca/admin_dependencies_chk.po create mode 100644 l10n/ca/admin_migrate.po create mode 100644 l10n/ca/bookmarks.po create mode 100644 l10n/ca/files_encryption.po create mode 100644 l10n/ca/files_external.po create mode 100644 l10n/ca/files_odfviewer.po create mode 100644 l10n/ca/files_pdfviewer.po create mode 100644 l10n/ca/files_sharing.po create mode 100644 l10n/ca/files_texteditor.po create mode 100644 l10n/ca/files_versions.po create mode 100644 l10n/ca/impress.po create mode 100644 l10n/ca/lib.po create mode 100644 l10n/ca/tasks.po create mode 100644 l10n/ca/user_ldap.po create mode 100644 l10n/ca/user_migrate.po create mode 100644 l10n/ca/user_openid.po create mode 100644 l10n/cs_CZ/admin_dependencies_chk.po create mode 100644 l10n/cs_CZ/admin_migrate.po create mode 100644 l10n/cs_CZ/bookmarks.po create mode 100644 l10n/cs_CZ/files_encryption.po create mode 100644 l10n/cs_CZ/files_external.po create mode 100644 l10n/cs_CZ/files_odfviewer.po create mode 100644 l10n/cs_CZ/files_pdfviewer.po create mode 100644 l10n/cs_CZ/files_sharing.po create mode 100644 l10n/cs_CZ/files_texteditor.po create mode 100644 l10n/cs_CZ/files_versions.po create mode 100644 l10n/cs_CZ/impress.po create mode 100644 l10n/cs_CZ/lib.po create mode 100644 l10n/cs_CZ/tasks.po create mode 100644 l10n/cs_CZ/user_ldap.po create mode 100644 l10n/cs_CZ/user_migrate.po create mode 100644 l10n/cs_CZ/user_openid.po create mode 100644 l10n/da/admin_dependencies_chk.po create mode 100644 l10n/da/admin_migrate.po create mode 100644 l10n/da/bookmarks.po create mode 100644 l10n/da/files_encryption.po create mode 100644 l10n/da/files_external.po create mode 100644 l10n/da/files_odfviewer.po create mode 100644 l10n/da/files_pdfviewer.po create mode 100644 l10n/da/files_sharing.po create mode 100644 l10n/da/files_texteditor.po create mode 100644 l10n/da/files_versions.po create mode 100644 l10n/da/impress.po create mode 100644 l10n/da/lib.po create mode 100644 l10n/da/tasks.po create mode 100644 l10n/da/user_ldap.po create mode 100644 l10n/da/user_migrate.po create mode 100644 l10n/da/user_openid.po create mode 100644 l10n/de/admin_dependencies_chk.po create mode 100644 l10n/de/admin_migrate.po create mode 100644 l10n/de/bookmarks.po create mode 100644 l10n/de/files_encryption.po create mode 100644 l10n/de/files_external.po create mode 100644 l10n/de/files_odfviewer.po create mode 100644 l10n/de/files_pdfviewer.po create mode 100644 l10n/de/files_sharing.po create mode 100644 l10n/de/files_texteditor.po create mode 100644 l10n/de/files_versions.po create mode 100644 l10n/de/impress.po create mode 100644 l10n/de/lib.po create mode 100644 l10n/de/tasks.po create mode 100644 l10n/de/user_ldap.po create mode 100644 l10n/de/user_migrate.po create mode 100644 l10n/de/user_openid.po delete mode 100644 l10n/de_DE/calendar.po delete mode 100644 l10n/de_DE/core.po delete mode 100644 l10n/de_DE/files.po delete mode 100644 l10n/de_DE/media.po delete mode 100644 l10n/de_DE/settings.po create mode 100644 l10n/el/admin_dependencies_chk.po create mode 100644 l10n/el/admin_migrate.po create mode 100644 l10n/el/bookmarks.po create mode 100644 l10n/el/files_encryption.po create mode 100644 l10n/el/files_external.po create mode 100644 l10n/el/files_odfviewer.po create mode 100644 l10n/el/files_pdfviewer.po create mode 100644 l10n/el/files_sharing.po create mode 100644 l10n/el/files_texteditor.po create mode 100644 l10n/el/files_versions.po create mode 100644 l10n/el/impress.po create mode 100644 l10n/el/lib.po create mode 100644 l10n/el/tasks.po create mode 100644 l10n/el/user_ldap.po create mode 100644 l10n/el/user_migrate.po create mode 100644 l10n/el/user_openid.po create mode 100644 l10n/eo/admin_dependencies_chk.po create mode 100644 l10n/eo/admin_migrate.po create mode 100644 l10n/eo/bookmarks.po create mode 100644 l10n/eo/files_encryption.po create mode 100644 l10n/eo/files_external.po create mode 100644 l10n/eo/files_odfviewer.po create mode 100644 l10n/eo/files_pdfviewer.po create mode 100644 l10n/eo/files_sharing.po create mode 100644 l10n/eo/files_texteditor.po create mode 100644 l10n/eo/files_versions.po create mode 100644 l10n/eo/impress.po create mode 100644 l10n/eo/lib.po create mode 100644 l10n/eo/tasks.po create mode 100644 l10n/eo/user_ldap.po create mode 100644 l10n/eo/user_migrate.po create mode 100644 l10n/eo/user_openid.po create mode 100644 l10n/es/admin_dependencies_chk.po create mode 100644 l10n/es/admin_migrate.po create mode 100644 l10n/es/bookmarks.po create mode 100644 l10n/es/files_encryption.po create mode 100644 l10n/es/files_external.po create mode 100644 l10n/es/files_odfviewer.po create mode 100644 l10n/es/files_pdfviewer.po create mode 100644 l10n/es/files_sharing.po create mode 100644 l10n/es/files_texteditor.po create mode 100644 l10n/es/files_versions.po create mode 100644 l10n/es/impress.po create mode 100644 l10n/es/lib.po create mode 100644 l10n/es/tasks.po create mode 100644 l10n/es/user_ldap.po create mode 100644 l10n/es/user_migrate.po create mode 100644 l10n/es/user_openid.po create mode 100644 l10n/es_AR/core.po create mode 100644 l10n/es_AR/files.po create mode 100644 l10n/es_AR/files_encryption.po create mode 100644 l10n/es_AR/files_external.po create mode 100644 l10n/es_AR/files_sharing.po create mode 100644 l10n/es_AR/files_versions.po create mode 100644 l10n/es_AR/lib.po create mode 100644 l10n/es_AR/settings.po create mode 100644 l10n/es_AR/user_ldap.po create mode 100644 l10n/et_EE/admin_dependencies_chk.po create mode 100644 l10n/et_EE/admin_migrate.po create mode 100644 l10n/et_EE/bookmarks.po create mode 100644 l10n/et_EE/files_encryption.po create mode 100644 l10n/et_EE/files_external.po create mode 100644 l10n/et_EE/files_odfviewer.po create mode 100644 l10n/et_EE/files_pdfviewer.po create mode 100644 l10n/et_EE/files_sharing.po create mode 100644 l10n/et_EE/files_texteditor.po create mode 100644 l10n/et_EE/files_versions.po create mode 100644 l10n/et_EE/impress.po create mode 100644 l10n/et_EE/lib.po create mode 100644 l10n/et_EE/tasks.po create mode 100644 l10n/et_EE/user_ldap.po create mode 100644 l10n/et_EE/user_migrate.po create mode 100644 l10n/et_EE/user_openid.po create mode 100644 l10n/eu/admin_dependencies_chk.po create mode 100644 l10n/eu/admin_migrate.po create mode 100644 l10n/eu/bookmarks.po create mode 100644 l10n/eu/files_encryption.po create mode 100644 l10n/eu/files_external.po create mode 100644 l10n/eu/files_odfviewer.po create mode 100644 l10n/eu/files_pdfviewer.po create mode 100644 l10n/eu/files_sharing.po create mode 100644 l10n/eu/files_texteditor.po create mode 100644 l10n/eu/files_versions.po create mode 100644 l10n/eu/impress.po create mode 100644 l10n/eu/lib.po create mode 100644 l10n/eu/tasks.po create mode 100644 l10n/eu/user_ldap.po create mode 100644 l10n/eu/user_migrate.po create mode 100644 l10n/eu/user_openid.po create mode 100644 l10n/eu_ES/admin_dependencies_chk.po create mode 100644 l10n/eu_ES/admin_migrate.po create mode 100644 l10n/eu_ES/bookmarks.po create mode 100644 l10n/eu_ES/calendar.po create mode 100644 l10n/eu_ES/contacts.po create mode 100644 l10n/eu_ES/core.po create mode 100644 l10n/eu_ES/files.po create mode 100644 l10n/eu_ES/files_encryption.po create mode 100644 l10n/eu_ES/files_external.po create mode 100644 l10n/eu_ES/files_odfviewer.po create mode 100644 l10n/eu_ES/files_pdfviewer.po create mode 100644 l10n/eu_ES/files_sharing.po create mode 100644 l10n/eu_ES/files_texteditor.po create mode 100644 l10n/eu_ES/files_versions.po create mode 100644 l10n/eu_ES/gallery.po create mode 100644 l10n/eu_ES/impress.po create mode 100644 l10n/eu_ES/lib.po create mode 100644 l10n/eu_ES/media.po create mode 100644 l10n/eu_ES/settings.po create mode 100644 l10n/eu_ES/tasks.po create mode 100644 l10n/eu_ES/user_ldap.po create mode 100644 l10n/eu_ES/user_migrate.po create mode 100644 l10n/eu_ES/user_openid.po create mode 100644 l10n/fa/admin_dependencies_chk.po create mode 100644 l10n/fa/admin_migrate.po create mode 100644 l10n/fa/bookmarks.po create mode 100644 l10n/fa/files_encryption.po create mode 100644 l10n/fa/files_external.po create mode 100644 l10n/fa/files_odfviewer.po create mode 100644 l10n/fa/files_pdfviewer.po create mode 100644 l10n/fa/files_sharing.po create mode 100644 l10n/fa/files_texteditor.po create mode 100644 l10n/fa/files_versions.po create mode 100644 l10n/fa/impress.po create mode 100644 l10n/fa/lib.po create mode 100644 l10n/fa/tasks.po create mode 100644 l10n/fa/user_ldap.po create mode 100644 l10n/fa/user_migrate.po create mode 100644 l10n/fa/user_openid.po create mode 100644 l10n/fi/admin_dependencies_chk.po create mode 100644 l10n/fi/admin_migrate.po create mode 100644 l10n/fi/bookmarks.po create mode 100644 l10n/fi/calendar.po create mode 100644 l10n/fi/contacts.po create mode 100644 l10n/fi/core.po create mode 100644 l10n/fi/files.po create mode 100644 l10n/fi/files_encryption.po create mode 100644 l10n/fi/files_external.po create mode 100644 l10n/fi/files_odfviewer.po create mode 100644 l10n/fi/files_pdfviewer.po create mode 100644 l10n/fi/files_sharing.po create mode 100644 l10n/fi/files_texteditor.po create mode 100644 l10n/fi/files_versions.po create mode 100644 l10n/fi/gallery.po create mode 100644 l10n/fi/impress.po create mode 100644 l10n/fi/lib.po create mode 100644 l10n/fi/media.po create mode 100644 l10n/fi/settings.po create mode 100644 l10n/fi/tasks.po create mode 100644 l10n/fi/user_ldap.po create mode 100644 l10n/fi/user_migrate.po create mode 100644 l10n/fi/user_openid.po create mode 100644 l10n/fi_FI/admin_dependencies_chk.po create mode 100644 l10n/fi_FI/admin_migrate.po create mode 100644 l10n/fi_FI/bookmarks.po create mode 100644 l10n/fi_FI/files_encryption.po create mode 100644 l10n/fi_FI/files_external.po create mode 100644 l10n/fi_FI/files_odfviewer.po create mode 100644 l10n/fi_FI/files_pdfviewer.po create mode 100644 l10n/fi_FI/files_sharing.po create mode 100644 l10n/fi_FI/files_texteditor.po create mode 100644 l10n/fi_FI/files_versions.po create mode 100644 l10n/fi_FI/impress.po create mode 100644 l10n/fi_FI/lib.po create mode 100644 l10n/fi_FI/tasks.po create mode 100644 l10n/fi_FI/user_ldap.po create mode 100644 l10n/fi_FI/user_migrate.po create mode 100644 l10n/fi_FI/user_openid.po create mode 100644 l10n/fr/admin_dependencies_chk.po create mode 100644 l10n/fr/admin_migrate.po create mode 100644 l10n/fr/bookmarks.po create mode 100644 l10n/fr/files_encryption.po create mode 100644 l10n/fr/files_external.po create mode 100644 l10n/fr/files_odfviewer.po create mode 100644 l10n/fr/files_pdfviewer.po create mode 100644 l10n/fr/files_sharing.po create mode 100644 l10n/fr/files_texteditor.po create mode 100644 l10n/fr/files_versions.po create mode 100644 l10n/fr/impress.po create mode 100644 l10n/fr/lib.po create mode 100644 l10n/fr/tasks.po create mode 100644 l10n/fr/user_ldap.po create mode 100644 l10n/fr/user_migrate.po create mode 100644 l10n/fr/user_openid.po create mode 100644 l10n/gl/admin_dependencies_chk.po create mode 100644 l10n/gl/admin_migrate.po create mode 100644 l10n/gl/bookmarks.po create mode 100644 l10n/gl/files_encryption.po create mode 100644 l10n/gl/files_external.po create mode 100644 l10n/gl/files_odfviewer.po create mode 100644 l10n/gl/files_pdfviewer.po create mode 100644 l10n/gl/files_sharing.po create mode 100644 l10n/gl/files_texteditor.po create mode 100644 l10n/gl/files_versions.po create mode 100644 l10n/gl/impress.po create mode 100644 l10n/gl/lib.po create mode 100644 l10n/gl/tasks.po create mode 100644 l10n/gl/user_ldap.po create mode 100644 l10n/gl/user_migrate.po create mode 100644 l10n/gl/user_openid.po create mode 100644 l10n/he/admin_dependencies_chk.po create mode 100644 l10n/he/admin_migrate.po create mode 100644 l10n/he/bookmarks.po create mode 100644 l10n/he/files_encryption.po create mode 100644 l10n/he/files_external.po create mode 100644 l10n/he/files_odfviewer.po create mode 100644 l10n/he/files_pdfviewer.po create mode 100644 l10n/he/files_sharing.po create mode 100644 l10n/he/files_texteditor.po create mode 100644 l10n/he/files_versions.po create mode 100644 l10n/he/impress.po create mode 100644 l10n/he/lib.po create mode 100644 l10n/he/tasks.po create mode 100644 l10n/he/user_ldap.po create mode 100644 l10n/he/user_migrate.po create mode 100644 l10n/he/user_openid.po create mode 100644 l10n/hi/core.po create mode 100644 l10n/hi/files.po create mode 100644 l10n/hi/files_encryption.po create mode 100644 l10n/hi/files_external.po create mode 100644 l10n/hi/files_sharing.po create mode 100644 l10n/hi/files_versions.po create mode 100644 l10n/hi/lib.po create mode 100644 l10n/hi/settings.po create mode 100644 l10n/hi/user_ldap.po create mode 100644 l10n/hr/admin_dependencies_chk.po create mode 100644 l10n/hr/admin_migrate.po create mode 100644 l10n/hr/bookmarks.po create mode 100644 l10n/hr/files_encryption.po create mode 100644 l10n/hr/files_external.po create mode 100644 l10n/hr/files_odfviewer.po create mode 100644 l10n/hr/files_pdfviewer.po create mode 100644 l10n/hr/files_sharing.po create mode 100644 l10n/hr/files_texteditor.po create mode 100644 l10n/hr/files_versions.po create mode 100644 l10n/hr/impress.po create mode 100644 l10n/hr/lib.po create mode 100644 l10n/hr/tasks.po create mode 100644 l10n/hr/user_ldap.po create mode 100644 l10n/hr/user_migrate.po create mode 100644 l10n/hr/user_openid.po create mode 100644 l10n/hu_HU/admin_dependencies_chk.po create mode 100644 l10n/hu_HU/admin_migrate.po create mode 100644 l10n/hu_HU/bookmarks.po create mode 100644 l10n/hu_HU/files_encryption.po create mode 100644 l10n/hu_HU/files_external.po create mode 100644 l10n/hu_HU/files_odfviewer.po create mode 100644 l10n/hu_HU/files_pdfviewer.po create mode 100644 l10n/hu_HU/files_sharing.po create mode 100644 l10n/hu_HU/files_texteditor.po create mode 100644 l10n/hu_HU/files_versions.po create mode 100644 l10n/hu_HU/impress.po create mode 100644 l10n/hu_HU/lib.po create mode 100644 l10n/hu_HU/tasks.po create mode 100644 l10n/hu_HU/user_ldap.po create mode 100644 l10n/hu_HU/user_migrate.po create mode 100644 l10n/hu_HU/user_openid.po create mode 100644 l10n/hy/admin_dependencies_chk.po create mode 100644 l10n/hy/admin_migrate.po create mode 100644 l10n/hy/bookmarks.po create mode 100644 l10n/hy/files_encryption.po create mode 100644 l10n/hy/files_external.po create mode 100644 l10n/hy/files_odfviewer.po create mode 100644 l10n/hy/files_pdfviewer.po create mode 100644 l10n/hy/files_sharing.po create mode 100644 l10n/hy/files_texteditor.po create mode 100644 l10n/hy/files_versions.po create mode 100644 l10n/hy/impress.po create mode 100644 l10n/hy/lib.po create mode 100644 l10n/hy/tasks.po create mode 100644 l10n/hy/user_ldap.po create mode 100644 l10n/hy/user_migrate.po create mode 100644 l10n/hy/user_openid.po create mode 100644 l10n/ia/admin_dependencies_chk.po create mode 100644 l10n/ia/admin_migrate.po create mode 100644 l10n/ia/bookmarks.po create mode 100644 l10n/ia/files_encryption.po create mode 100644 l10n/ia/files_external.po create mode 100644 l10n/ia/files_odfviewer.po create mode 100644 l10n/ia/files_pdfviewer.po create mode 100644 l10n/ia/files_sharing.po create mode 100644 l10n/ia/files_texteditor.po create mode 100644 l10n/ia/files_versions.po create mode 100644 l10n/ia/impress.po create mode 100644 l10n/ia/lib.po create mode 100644 l10n/ia/tasks.po create mode 100644 l10n/ia/user_ldap.po create mode 100644 l10n/ia/user_migrate.po create mode 100644 l10n/ia/user_openid.po create mode 100644 l10n/id/admin_dependencies_chk.po create mode 100644 l10n/id/admin_migrate.po create mode 100644 l10n/id/bookmarks.po create mode 100644 l10n/id/files_encryption.po create mode 100644 l10n/id/files_external.po create mode 100644 l10n/id/files_odfviewer.po create mode 100644 l10n/id/files_pdfviewer.po create mode 100644 l10n/id/files_sharing.po create mode 100644 l10n/id/files_texteditor.po create mode 100644 l10n/id/files_versions.po create mode 100644 l10n/id/impress.po create mode 100644 l10n/id/lib.po create mode 100644 l10n/id/tasks.po create mode 100644 l10n/id/user_ldap.po create mode 100644 l10n/id/user_migrate.po create mode 100644 l10n/id/user_openid.po create mode 100644 l10n/id_ID/admin_dependencies_chk.po create mode 100644 l10n/id_ID/admin_migrate.po create mode 100644 l10n/id_ID/bookmarks.po create mode 100644 l10n/id_ID/calendar.po create mode 100644 l10n/id_ID/contacts.po create mode 100644 l10n/id_ID/core.po create mode 100644 l10n/id_ID/files.po create mode 100644 l10n/id_ID/files_encryption.po create mode 100644 l10n/id_ID/files_external.po create mode 100644 l10n/id_ID/files_odfviewer.po create mode 100644 l10n/id_ID/files_pdfviewer.po create mode 100644 l10n/id_ID/files_sharing.po create mode 100644 l10n/id_ID/files_texteditor.po create mode 100644 l10n/id_ID/files_versions.po create mode 100644 l10n/id_ID/gallery.po create mode 100644 l10n/id_ID/impress.po create mode 100644 l10n/id_ID/lib.po create mode 100644 l10n/id_ID/media.po create mode 100644 l10n/id_ID/settings.po create mode 100644 l10n/id_ID/tasks.po create mode 100644 l10n/id_ID/user_ldap.po create mode 100644 l10n/id_ID/user_migrate.po create mode 100644 l10n/id_ID/user_openid.po create mode 100644 l10n/it/admin_dependencies_chk.po create mode 100644 l10n/it/admin_migrate.po create mode 100644 l10n/it/bookmarks.po create mode 100644 l10n/it/files_encryption.po create mode 100644 l10n/it/files_external.po create mode 100644 l10n/it/files_odfviewer.po create mode 100644 l10n/it/files_pdfviewer.po create mode 100644 l10n/it/files_sharing.po create mode 100644 l10n/it/files_texteditor.po create mode 100644 l10n/it/files_versions.po create mode 100644 l10n/it/impress.po create mode 100644 l10n/it/lib.po create mode 100644 l10n/it/tasks.po create mode 100644 l10n/it/user_ldap.po create mode 100644 l10n/it/user_migrate.po create mode 100644 l10n/it/user_openid.po create mode 100644 l10n/ja_JP/admin_dependencies_chk.po create mode 100644 l10n/ja_JP/admin_migrate.po create mode 100644 l10n/ja_JP/bookmarks.po create mode 100644 l10n/ja_JP/files_encryption.po create mode 100644 l10n/ja_JP/files_external.po create mode 100644 l10n/ja_JP/files_odfviewer.po create mode 100644 l10n/ja_JP/files_pdfviewer.po create mode 100644 l10n/ja_JP/files_sharing.po create mode 100644 l10n/ja_JP/files_texteditor.po create mode 100644 l10n/ja_JP/files_versions.po create mode 100644 l10n/ja_JP/impress.po create mode 100644 l10n/ja_JP/lib.po create mode 100644 l10n/ja_JP/tasks.po create mode 100644 l10n/ja_JP/user_ldap.po create mode 100644 l10n/ja_JP/user_migrate.po create mode 100644 l10n/ja_JP/user_openid.po create mode 100644 l10n/ko/admin_dependencies_chk.po create mode 100644 l10n/ko/admin_migrate.po create mode 100644 l10n/ko/bookmarks.po create mode 100644 l10n/ko/files_encryption.po create mode 100644 l10n/ko/files_external.po create mode 100644 l10n/ko/files_odfviewer.po create mode 100644 l10n/ko/files_pdfviewer.po create mode 100644 l10n/ko/files_sharing.po create mode 100644 l10n/ko/files_texteditor.po create mode 100644 l10n/ko/files_versions.po create mode 100644 l10n/ko/impress.po create mode 100644 l10n/ko/lib.po create mode 100644 l10n/ko/tasks.po create mode 100644 l10n/ko/user_ldap.po create mode 100644 l10n/ko/user_migrate.po create mode 100644 l10n/ko/user_openid.po create mode 100644 l10n/ku_IQ/core.po create mode 100644 l10n/ku_IQ/files.po create mode 100644 l10n/ku_IQ/files_encryption.po create mode 100644 l10n/ku_IQ/files_external.po create mode 100644 l10n/ku_IQ/files_sharing.po create mode 100644 l10n/ku_IQ/files_versions.po create mode 100644 l10n/ku_IQ/lib.po create mode 100644 l10n/ku_IQ/settings.po create mode 100644 l10n/ku_IQ/user_ldap.po create mode 100644 l10n/lb/admin_dependencies_chk.po create mode 100644 l10n/lb/admin_migrate.po create mode 100644 l10n/lb/bookmarks.po create mode 100644 l10n/lb/files_encryption.po create mode 100644 l10n/lb/files_external.po create mode 100644 l10n/lb/files_odfviewer.po create mode 100644 l10n/lb/files_pdfviewer.po create mode 100644 l10n/lb/files_sharing.po create mode 100644 l10n/lb/files_texteditor.po create mode 100644 l10n/lb/files_versions.po create mode 100644 l10n/lb/impress.po create mode 100644 l10n/lb/lib.po create mode 100644 l10n/lb/tasks.po create mode 100644 l10n/lb/user_ldap.po create mode 100644 l10n/lb/user_migrate.po create mode 100644 l10n/lb/user_openid.po create mode 100644 l10n/lt_LT/admin_dependencies_chk.po create mode 100644 l10n/lt_LT/admin_migrate.po create mode 100644 l10n/lt_LT/bookmarks.po create mode 100644 l10n/lt_LT/files_encryption.po create mode 100644 l10n/lt_LT/files_external.po create mode 100644 l10n/lt_LT/files_odfviewer.po create mode 100644 l10n/lt_LT/files_pdfviewer.po create mode 100644 l10n/lt_LT/files_sharing.po create mode 100644 l10n/lt_LT/files_texteditor.po create mode 100644 l10n/lt_LT/files_versions.po create mode 100644 l10n/lt_LT/impress.po create mode 100644 l10n/lt_LT/lib.po create mode 100644 l10n/lt_LT/tasks.po create mode 100644 l10n/lt_LT/user_ldap.po create mode 100644 l10n/lt_LT/user_migrate.po create mode 100644 l10n/lt_LT/user_openid.po create mode 100644 l10n/lv/admin_dependencies_chk.po create mode 100644 l10n/lv/admin_migrate.po create mode 100644 l10n/lv/bookmarks.po create mode 100644 l10n/lv/calendar.po create mode 100644 l10n/lv/contacts.po create mode 100644 l10n/lv/core.po create mode 100644 l10n/lv/files.po create mode 100644 l10n/lv/files_encryption.po create mode 100644 l10n/lv/files_external.po create mode 100644 l10n/lv/files_odfviewer.po create mode 100644 l10n/lv/files_pdfviewer.po create mode 100644 l10n/lv/files_sharing.po create mode 100644 l10n/lv/files_texteditor.po create mode 100644 l10n/lv/files_versions.po create mode 100644 l10n/lv/gallery.po create mode 100644 l10n/lv/impress.po create mode 100644 l10n/lv/lib.po create mode 100644 l10n/lv/media.po create mode 100644 l10n/lv/settings.po create mode 100644 l10n/lv/tasks.po create mode 100644 l10n/lv/user_ldap.po create mode 100644 l10n/lv/user_migrate.po create mode 100644 l10n/lv/user_openid.po create mode 100644 l10n/mk/admin_dependencies_chk.po create mode 100644 l10n/mk/admin_migrate.po create mode 100644 l10n/mk/bookmarks.po create mode 100644 l10n/mk/files_encryption.po create mode 100644 l10n/mk/files_external.po create mode 100644 l10n/mk/files_odfviewer.po create mode 100644 l10n/mk/files_pdfviewer.po create mode 100644 l10n/mk/files_sharing.po create mode 100644 l10n/mk/files_texteditor.po create mode 100644 l10n/mk/files_versions.po create mode 100644 l10n/mk/impress.po create mode 100644 l10n/mk/lib.po create mode 100644 l10n/mk/tasks.po create mode 100644 l10n/mk/user_ldap.po create mode 100644 l10n/mk/user_migrate.po create mode 100644 l10n/mk/user_openid.po create mode 100644 l10n/ms_MY/admin_dependencies_chk.po create mode 100644 l10n/ms_MY/admin_migrate.po create mode 100644 l10n/ms_MY/bookmarks.po create mode 100644 l10n/ms_MY/files_encryption.po create mode 100644 l10n/ms_MY/files_external.po create mode 100644 l10n/ms_MY/files_odfviewer.po create mode 100644 l10n/ms_MY/files_pdfviewer.po create mode 100644 l10n/ms_MY/files_sharing.po create mode 100644 l10n/ms_MY/files_texteditor.po create mode 100644 l10n/ms_MY/files_versions.po create mode 100644 l10n/ms_MY/impress.po create mode 100644 l10n/ms_MY/lib.po create mode 100644 l10n/ms_MY/tasks.po create mode 100644 l10n/ms_MY/user_ldap.po create mode 100644 l10n/ms_MY/user_migrate.po create mode 100644 l10n/ms_MY/user_openid.po create mode 100644 l10n/nb_NO/admin_dependencies_chk.po create mode 100644 l10n/nb_NO/admin_migrate.po create mode 100644 l10n/nb_NO/bookmarks.po create mode 100644 l10n/nb_NO/files_encryption.po create mode 100644 l10n/nb_NO/files_external.po create mode 100644 l10n/nb_NO/files_odfviewer.po create mode 100644 l10n/nb_NO/files_pdfviewer.po create mode 100644 l10n/nb_NO/files_sharing.po create mode 100644 l10n/nb_NO/files_texteditor.po create mode 100644 l10n/nb_NO/files_versions.po create mode 100644 l10n/nb_NO/impress.po create mode 100644 l10n/nb_NO/lib.po create mode 100644 l10n/nb_NO/tasks.po create mode 100644 l10n/nb_NO/user_ldap.po create mode 100644 l10n/nb_NO/user_migrate.po create mode 100644 l10n/nb_NO/user_openid.po create mode 100644 l10n/nl/admin_dependencies_chk.po create mode 100644 l10n/nl/admin_migrate.po create mode 100644 l10n/nl/bookmarks.po create mode 100644 l10n/nl/files_encryption.po create mode 100644 l10n/nl/files_external.po create mode 100644 l10n/nl/files_odfviewer.po create mode 100644 l10n/nl/files_pdfviewer.po create mode 100644 l10n/nl/files_sharing.po create mode 100644 l10n/nl/files_texteditor.po create mode 100644 l10n/nl/files_versions.po create mode 100644 l10n/nl/impress.po create mode 100644 l10n/nl/lib.po create mode 100644 l10n/nl/tasks.po create mode 100644 l10n/nl/user_ldap.po create mode 100644 l10n/nl/user_migrate.po create mode 100644 l10n/nl/user_openid.po create mode 100644 l10n/nn_NO/admin_dependencies_chk.po create mode 100644 l10n/nn_NO/admin_migrate.po create mode 100644 l10n/nn_NO/bookmarks.po create mode 100644 l10n/nn_NO/files_encryption.po create mode 100644 l10n/nn_NO/files_external.po create mode 100644 l10n/nn_NO/files_odfviewer.po create mode 100644 l10n/nn_NO/files_pdfviewer.po create mode 100644 l10n/nn_NO/files_sharing.po create mode 100644 l10n/nn_NO/files_texteditor.po create mode 100644 l10n/nn_NO/files_versions.po create mode 100644 l10n/nn_NO/impress.po create mode 100644 l10n/nn_NO/lib.po create mode 100644 l10n/nn_NO/tasks.po create mode 100644 l10n/nn_NO/user_ldap.po create mode 100644 l10n/nn_NO/user_migrate.po create mode 100644 l10n/nn_NO/user_openid.po create mode 100644 l10n/oc/core.po create mode 100644 l10n/oc/files.po create mode 100644 l10n/oc/files_encryption.po create mode 100644 l10n/oc/files_external.po create mode 100644 l10n/oc/files_sharing.po create mode 100644 l10n/oc/files_versions.po create mode 100644 l10n/oc/lib.po create mode 100644 l10n/oc/settings.po create mode 100644 l10n/oc/user_ldap.po create mode 100644 l10n/pl/admin_dependencies_chk.po create mode 100644 l10n/pl/admin_migrate.po create mode 100644 l10n/pl/bookmarks.po create mode 100644 l10n/pl/files_encryption.po create mode 100644 l10n/pl/files_external.po create mode 100644 l10n/pl/files_odfviewer.po create mode 100644 l10n/pl/files_pdfviewer.po create mode 100644 l10n/pl/files_sharing.po create mode 100644 l10n/pl/files_texteditor.po create mode 100644 l10n/pl/files_versions.po create mode 100644 l10n/pl/impress.po create mode 100644 l10n/pl/lib.po create mode 100644 l10n/pl/tasks.po create mode 100644 l10n/pl/user_ldap.po create mode 100644 l10n/pl/user_migrate.po create mode 100644 l10n/pl/user_openid.po create mode 100644 l10n/pl_PL/core.po create mode 100644 l10n/pl_PL/files.po create mode 100644 l10n/pl_PL/files_encryption.po create mode 100644 l10n/pl_PL/files_external.po create mode 100644 l10n/pl_PL/files_sharing.po create mode 100644 l10n/pl_PL/files_versions.po create mode 100644 l10n/pl_PL/lib.po create mode 100644 l10n/pl_PL/settings.po create mode 100644 l10n/pl_PL/user_ldap.po create mode 100644 l10n/pt_BR/admin_dependencies_chk.po create mode 100644 l10n/pt_BR/admin_migrate.po create mode 100644 l10n/pt_BR/bookmarks.po create mode 100644 l10n/pt_BR/files_encryption.po create mode 100644 l10n/pt_BR/files_external.po create mode 100644 l10n/pt_BR/files_odfviewer.po create mode 100644 l10n/pt_BR/files_pdfviewer.po create mode 100644 l10n/pt_BR/files_sharing.po create mode 100644 l10n/pt_BR/files_texteditor.po create mode 100644 l10n/pt_BR/files_versions.po create mode 100644 l10n/pt_BR/impress.po create mode 100644 l10n/pt_BR/lib.po create mode 100644 l10n/pt_BR/tasks.po create mode 100644 l10n/pt_BR/user_ldap.po create mode 100644 l10n/pt_BR/user_migrate.po create mode 100644 l10n/pt_BR/user_openid.po create mode 100644 l10n/pt_PT/admin_dependencies_chk.po create mode 100644 l10n/pt_PT/admin_migrate.po create mode 100644 l10n/pt_PT/bookmarks.po create mode 100644 l10n/pt_PT/files_encryption.po create mode 100644 l10n/pt_PT/files_external.po create mode 100644 l10n/pt_PT/files_odfviewer.po create mode 100644 l10n/pt_PT/files_pdfviewer.po create mode 100644 l10n/pt_PT/files_sharing.po create mode 100644 l10n/pt_PT/files_texteditor.po create mode 100644 l10n/pt_PT/files_versions.po create mode 100644 l10n/pt_PT/impress.po create mode 100644 l10n/pt_PT/lib.po create mode 100644 l10n/pt_PT/tasks.po create mode 100644 l10n/pt_PT/user_ldap.po create mode 100644 l10n/pt_PT/user_migrate.po create mode 100644 l10n/pt_PT/user_openid.po create mode 100644 l10n/ro/admin_dependencies_chk.po create mode 100644 l10n/ro/admin_migrate.po create mode 100644 l10n/ro/bookmarks.po create mode 100644 l10n/ro/files_encryption.po create mode 100644 l10n/ro/files_external.po create mode 100644 l10n/ro/files_odfviewer.po create mode 100644 l10n/ro/files_pdfviewer.po create mode 100644 l10n/ro/files_sharing.po create mode 100644 l10n/ro/files_texteditor.po create mode 100644 l10n/ro/files_versions.po create mode 100644 l10n/ro/impress.po create mode 100644 l10n/ro/lib.po create mode 100644 l10n/ro/tasks.po create mode 100644 l10n/ro/user_ldap.po create mode 100644 l10n/ro/user_migrate.po create mode 100644 l10n/ro/user_openid.po create mode 100644 l10n/ru/admin_dependencies_chk.po create mode 100644 l10n/ru/admin_migrate.po create mode 100644 l10n/ru/bookmarks.po create mode 100644 l10n/ru/files_encryption.po create mode 100644 l10n/ru/files_external.po create mode 100644 l10n/ru/files_odfviewer.po create mode 100644 l10n/ru/files_pdfviewer.po create mode 100644 l10n/ru/files_sharing.po create mode 100644 l10n/ru/files_texteditor.po create mode 100644 l10n/ru/files_versions.po create mode 100644 l10n/ru/impress.po create mode 100644 l10n/ru/lib.po create mode 100644 l10n/ru/tasks.po create mode 100644 l10n/ru/user_ldap.po create mode 100644 l10n/ru/user_migrate.po create mode 100644 l10n/ru/user_openid.po create mode 100644 l10n/ru_RU/core.po create mode 100644 l10n/ru_RU/files.po create mode 100644 l10n/ru_RU/files_encryption.po create mode 100644 l10n/ru_RU/files_external.po create mode 100644 l10n/ru_RU/files_sharing.po create mode 100644 l10n/ru_RU/files_versions.po create mode 100644 l10n/ru_RU/lib.po create mode 100644 l10n/ru_RU/settings.po create mode 100644 l10n/ru_RU/user_ldap.po create mode 100644 l10n/si_LK/core.po create mode 100644 l10n/si_LK/files.po create mode 100644 l10n/si_LK/files_encryption.po create mode 100644 l10n/si_LK/files_external.po create mode 100644 l10n/si_LK/files_sharing.po create mode 100644 l10n/si_LK/files_versions.po create mode 100644 l10n/si_LK/lib.po create mode 100644 l10n/si_LK/settings.po create mode 100644 l10n/si_LK/user_ldap.po create mode 100644 l10n/sk_SK/admin_dependencies_chk.po create mode 100644 l10n/sk_SK/admin_migrate.po create mode 100644 l10n/sk_SK/bookmarks.po create mode 100644 l10n/sk_SK/files_encryption.po create mode 100644 l10n/sk_SK/files_external.po create mode 100644 l10n/sk_SK/files_odfviewer.po create mode 100644 l10n/sk_SK/files_pdfviewer.po create mode 100644 l10n/sk_SK/files_sharing.po create mode 100644 l10n/sk_SK/files_texteditor.po create mode 100644 l10n/sk_SK/files_versions.po create mode 100644 l10n/sk_SK/impress.po create mode 100644 l10n/sk_SK/lib.po create mode 100644 l10n/sk_SK/tasks.po create mode 100644 l10n/sk_SK/user_ldap.po create mode 100644 l10n/sk_SK/user_migrate.po create mode 100644 l10n/sk_SK/user_openid.po create mode 100644 l10n/sl/admin_dependencies_chk.po create mode 100644 l10n/sl/admin_migrate.po create mode 100644 l10n/sl/bookmarks.po create mode 100644 l10n/sl/files_encryption.po create mode 100644 l10n/sl/files_external.po create mode 100644 l10n/sl/files_odfviewer.po create mode 100644 l10n/sl/files_pdfviewer.po create mode 100644 l10n/sl/files_sharing.po create mode 100644 l10n/sl/files_texteditor.po create mode 100644 l10n/sl/files_versions.po create mode 100644 l10n/sl/impress.po create mode 100644 l10n/sl/lib.po create mode 100644 l10n/sl/tasks.po create mode 100644 l10n/sl/user_ldap.po create mode 100644 l10n/sl/user_migrate.po create mode 100644 l10n/sl/user_openid.po create mode 100644 l10n/so/admin_dependencies_chk.po create mode 100644 l10n/so/admin_migrate.po create mode 100644 l10n/so/bookmarks.po create mode 100644 l10n/so/calendar.po create mode 100644 l10n/so/contacts.po create mode 100644 l10n/so/core.po create mode 100644 l10n/so/files.po create mode 100644 l10n/so/files_encryption.po create mode 100644 l10n/so/files_external.po create mode 100644 l10n/so/files_odfviewer.po create mode 100644 l10n/so/files_pdfviewer.po create mode 100644 l10n/so/files_sharing.po create mode 100644 l10n/so/files_texteditor.po create mode 100644 l10n/so/files_versions.po create mode 100644 l10n/so/gallery.po create mode 100644 l10n/so/impress.po create mode 100644 l10n/so/lib.po create mode 100644 l10n/so/media.po create mode 100644 l10n/so/settings.po create mode 100644 l10n/so/tasks.po create mode 100644 l10n/so/user_ldap.po create mode 100644 l10n/so/user_migrate.po create mode 100644 l10n/so/user_openid.po create mode 100644 l10n/sr/admin_dependencies_chk.po create mode 100644 l10n/sr/admin_migrate.po create mode 100644 l10n/sr/bookmarks.po create mode 100644 l10n/sr/files_encryption.po create mode 100644 l10n/sr/files_external.po create mode 100644 l10n/sr/files_odfviewer.po create mode 100644 l10n/sr/files_pdfviewer.po create mode 100644 l10n/sr/files_sharing.po create mode 100644 l10n/sr/files_texteditor.po create mode 100644 l10n/sr/files_versions.po create mode 100644 l10n/sr/impress.po create mode 100644 l10n/sr/lib.po create mode 100644 l10n/sr/tasks.po create mode 100644 l10n/sr/user_ldap.po create mode 100644 l10n/sr/user_migrate.po create mode 100644 l10n/sr/user_openid.po create mode 100644 l10n/sr@latin/admin_dependencies_chk.po create mode 100644 l10n/sr@latin/admin_migrate.po create mode 100644 l10n/sr@latin/bookmarks.po create mode 100644 l10n/sr@latin/files_encryption.po create mode 100644 l10n/sr@latin/files_external.po create mode 100644 l10n/sr@latin/files_odfviewer.po create mode 100644 l10n/sr@latin/files_pdfviewer.po create mode 100644 l10n/sr@latin/files_sharing.po create mode 100644 l10n/sr@latin/files_texteditor.po create mode 100644 l10n/sr@latin/files_versions.po create mode 100644 l10n/sr@latin/impress.po create mode 100644 l10n/sr@latin/lib.po create mode 100644 l10n/sr@latin/tasks.po create mode 100644 l10n/sr@latin/user_ldap.po create mode 100644 l10n/sr@latin/user_migrate.po create mode 100644 l10n/sr@latin/user_openid.po create mode 100644 l10n/sv/admin_dependencies_chk.po create mode 100644 l10n/sv/admin_migrate.po create mode 100644 l10n/sv/bookmarks.po create mode 100644 l10n/sv/files_encryption.po create mode 100644 l10n/sv/files_external.po create mode 100644 l10n/sv/files_odfviewer.po create mode 100644 l10n/sv/files_pdfviewer.po create mode 100644 l10n/sv/files_sharing.po create mode 100644 l10n/sv/files_texteditor.po create mode 100644 l10n/sv/files_versions.po create mode 100644 l10n/sv/impress.po create mode 100644 l10n/sv/lib.po create mode 100644 l10n/sv/tasks.po create mode 100644 l10n/sv/user_ldap.po create mode 100644 l10n/sv/user_migrate.po create mode 100644 l10n/sv/user_openid.po create mode 100644 l10n/ta_LK/core.po create mode 100644 l10n/ta_LK/files.po create mode 100644 l10n/ta_LK/files_encryption.po create mode 100644 l10n/ta_LK/files_external.po create mode 100644 l10n/ta_LK/files_sharing.po create mode 100644 l10n/ta_LK/files_versions.po create mode 100644 l10n/ta_LK/lib.po create mode 100644 l10n/ta_LK/settings.po create mode 100644 l10n/ta_LK/user_ldap.po delete mode 100644 l10n/templates/bookmarks.pot delete mode 100644 l10n/templates/calendar.pot delete mode 100644 l10n/templates/contacts.pot create mode 100644 l10n/templates/files_encryption.pot create mode 100644 l10n/templates/files_external.pot create mode 100644 l10n/templates/files_sharing.pot create mode 100644 l10n/templates/files_versions.pot delete mode 100644 l10n/templates/gallery.pot create mode 100644 l10n/templates/lib.pot delete mode 100644 l10n/templates/media.pot create mode 100644 l10n/templates/user_ldap.pot create mode 100644 l10n/th_TH/admin_dependencies_chk.po create mode 100644 l10n/th_TH/admin_migrate.po create mode 100644 l10n/th_TH/bookmarks.po create mode 100644 l10n/th_TH/files_encryption.po create mode 100644 l10n/th_TH/files_external.po create mode 100644 l10n/th_TH/files_odfviewer.po create mode 100644 l10n/th_TH/files_pdfviewer.po create mode 100644 l10n/th_TH/files_sharing.po create mode 100644 l10n/th_TH/files_texteditor.po create mode 100644 l10n/th_TH/files_versions.po create mode 100644 l10n/th_TH/impress.po create mode 100644 l10n/th_TH/lib.po create mode 100644 l10n/th_TH/tasks.po create mode 100644 l10n/th_TH/user_ldap.po create mode 100644 l10n/th_TH/user_migrate.po create mode 100644 l10n/th_TH/user_openid.po create mode 100644 l10n/tr/admin_dependencies_chk.po create mode 100644 l10n/tr/admin_migrate.po create mode 100644 l10n/tr/bookmarks.po create mode 100644 l10n/tr/files_encryption.po create mode 100644 l10n/tr/files_external.po create mode 100644 l10n/tr/files_odfviewer.po create mode 100644 l10n/tr/files_pdfviewer.po create mode 100644 l10n/tr/files_sharing.po create mode 100644 l10n/tr/files_texteditor.po create mode 100644 l10n/tr/files_versions.po create mode 100644 l10n/tr/impress.po create mode 100644 l10n/tr/lib.po create mode 100644 l10n/tr/tasks.po create mode 100644 l10n/tr/user_ldap.po create mode 100644 l10n/tr/user_migrate.po create mode 100644 l10n/tr/user_openid.po create mode 100644 l10n/uk/admin_dependencies_chk.po create mode 100644 l10n/uk/admin_migrate.po create mode 100644 l10n/uk/bookmarks.po create mode 100644 l10n/uk/files_encryption.po create mode 100644 l10n/uk/files_external.po create mode 100644 l10n/uk/files_odfviewer.po create mode 100644 l10n/uk/files_pdfviewer.po create mode 100644 l10n/uk/files_sharing.po create mode 100644 l10n/uk/files_texteditor.po create mode 100644 l10n/uk/files_versions.po create mode 100644 l10n/uk/impress.po create mode 100644 l10n/uk/lib.po create mode 100644 l10n/uk/tasks.po create mode 100644 l10n/uk/user_ldap.po create mode 100644 l10n/uk/user_migrate.po create mode 100644 l10n/uk/user_openid.po create mode 100644 l10n/vi/admin_dependencies_chk.po create mode 100644 l10n/vi/admin_migrate.po create mode 100644 l10n/vi/bookmarks.po create mode 100644 l10n/vi/calendar.po create mode 100644 l10n/vi/contacts.po create mode 100644 l10n/vi/core.po create mode 100644 l10n/vi/files.po create mode 100644 l10n/vi/files_encryption.po create mode 100644 l10n/vi/files_external.po create mode 100644 l10n/vi/files_odfviewer.po create mode 100644 l10n/vi/files_pdfviewer.po create mode 100644 l10n/vi/files_sharing.po create mode 100644 l10n/vi/files_texteditor.po create mode 100644 l10n/vi/files_versions.po create mode 100644 l10n/vi/gallery.po create mode 100644 l10n/vi/impress.po create mode 100644 l10n/vi/lib.po create mode 100644 l10n/vi/media.po create mode 100644 l10n/vi/settings.po create mode 100644 l10n/vi/tasks.po create mode 100644 l10n/vi/user_ldap.po create mode 100644 l10n/vi/user_migrate.po create mode 100644 l10n/vi/user_openid.po create mode 100644 l10n/zh_CN.GB2312/admin_dependencies_chk.po create mode 100644 l10n/zh_CN.GB2312/admin_migrate.po create mode 100644 l10n/zh_CN.GB2312/bookmarks.po create mode 100644 l10n/zh_CN.GB2312/calendar.po create mode 100644 l10n/zh_CN.GB2312/contacts.po create mode 100644 l10n/zh_CN.GB2312/core.po create mode 100644 l10n/zh_CN.GB2312/files.po create mode 100644 l10n/zh_CN.GB2312/files_encryption.po create mode 100644 l10n/zh_CN.GB2312/files_external.po create mode 100644 l10n/zh_CN.GB2312/files_odfviewer.po create mode 100644 l10n/zh_CN.GB2312/files_pdfviewer.po create mode 100644 l10n/zh_CN.GB2312/files_sharing.po create mode 100644 l10n/zh_CN.GB2312/files_texteditor.po create mode 100644 l10n/zh_CN.GB2312/files_versions.po create mode 100644 l10n/zh_CN.GB2312/gallery.po create mode 100644 l10n/zh_CN.GB2312/impress.po create mode 100644 l10n/zh_CN.GB2312/lib.po create mode 100644 l10n/zh_CN.GB2312/media.po create mode 100644 l10n/zh_CN.GB2312/settings.po create mode 100644 l10n/zh_CN.GB2312/tasks.po create mode 100644 l10n/zh_CN.GB2312/user_ldap.po create mode 100644 l10n/zh_CN.GB2312/user_migrate.po create mode 100644 l10n/zh_CN.GB2312/user_openid.po create mode 100644 l10n/zh_CN/admin_dependencies_chk.po create mode 100644 l10n/zh_CN/admin_migrate.po create mode 100644 l10n/zh_CN/bookmarks.po create mode 100644 l10n/zh_CN/files_encryption.po create mode 100644 l10n/zh_CN/files_external.po create mode 100644 l10n/zh_CN/files_odfviewer.po create mode 100644 l10n/zh_CN/files_pdfviewer.po create mode 100644 l10n/zh_CN/files_sharing.po create mode 100644 l10n/zh_CN/files_texteditor.po create mode 100644 l10n/zh_CN/files_versions.po create mode 100644 l10n/zh_CN/impress.po create mode 100644 l10n/zh_CN/lib.po create mode 100644 l10n/zh_CN/tasks.po create mode 100644 l10n/zh_CN/user_ldap.po create mode 100644 l10n/zh_CN/user_migrate.po create mode 100644 l10n/zh_CN/user_openid.po create mode 100644 l10n/zh_TW/admin_dependencies_chk.po create mode 100644 l10n/zh_TW/admin_migrate.po create mode 100644 l10n/zh_TW/bookmarks.po create mode 100644 l10n/zh_TW/files_encryption.po create mode 100644 l10n/zh_TW/files_external.po create mode 100644 l10n/zh_TW/files_odfviewer.po create mode 100644 l10n/zh_TW/files_pdfviewer.po create mode 100644 l10n/zh_TW/files_sharing.po create mode 100644 l10n/zh_TW/files_texteditor.po create mode 100644 l10n/zh_TW/files_versions.po create mode 100644 l10n/zh_TW/impress.po create mode 100644 l10n/zh_TW/lib.po create mode 100644 l10n/zh_TW/tasks.po create mode 100644 l10n/zh_TW/user_ldap.po create mode 100644 l10n/zh_TW/user_migrate.po create mode 100644 l10n/zh_TW/user_openid.po create mode 100644 lib/backgroundjob/queuedtask.php create mode 100644 lib/backgroundjob/regulartask.php create mode 100644 lib/backgroundjob/worker.php create mode 100644 lib/filechunking.php create mode 100644 lib/fileproxy/fileoperations.php create mode 100644 lib/group/interface.php create mode 100644 lib/l10n/ca.php create mode 100644 lib/l10n/cs_CZ.php create mode 100644 lib/l10n/da.php create mode 100644 lib/l10n/de.php create mode 100644 lib/l10n/el.php create mode 100644 lib/l10n/eo.php create mode 100644 lib/l10n/es.php create mode 100644 lib/l10n/es_AR.php create mode 100644 lib/l10n/et_EE.php create mode 100644 lib/l10n/eu.php create mode 100644 lib/l10n/fa.php create mode 100644 lib/l10n/fi_FI.php create mode 100644 lib/l10n/fr.php create mode 100644 lib/l10n/gl.php create mode 100644 lib/l10n/he.php create mode 100644 lib/l10n/hu_HU.php create mode 100644 lib/l10n/it.php create mode 100644 lib/l10n/ja_JP.php create mode 100644 lib/l10n/lt_LT.php create mode 100644 lib/l10n/nb_NO.php create mode 100644 lib/l10n/nl.php create mode 100644 lib/l10n/oc.php create mode 100644 lib/l10n/pl.php create mode 100644 lib/l10n/pt_BR.php create mode 100644 lib/l10n/pt_PT.php create mode 100644 lib/l10n/ro.php create mode 100644 lib/l10n/ru.php create mode 100644 lib/l10n/ru_RU.php create mode 100644 lib/l10n/sk_SK.php create mode 100644 lib/l10n/sl.php create mode 100644 lib/l10n/sv.php create mode 100644 lib/l10n/th_TH.php create mode 100644 lib/l10n/uk.php create mode 100644 lib/l10n/vi.php create mode 100644 lib/l10n/zh_CN.GB2312.php create mode 100644 lib/l10n/zh_CN.php create mode 100644 lib/l10n/zh_TW.php delete mode 100644 lib/mimetypes.fixlist.php create mode 100644 lib/public/backgroundjob.php create mode 100644 lib/public/groupinterface.php create mode 100644 lib/public/share.php create mode 100644 lib/public/userinterface.php create mode 100644 lib/subadmin.php create mode 100644 lib/user/interface.php delete mode 100644 search/index.php delete mode 100644 search/templates/index.php create mode 100644 settings/ajax/apps/ocs.php create mode 100644 settings/ajax/togglesubadmins.php create mode 100644 settings/ajax/userlist.php create mode 100644 settings/l10n/es_AR.php create mode 100644 settings/l10n/lv.php create mode 100644 settings/l10n/oc.php create mode 100644 settings/l10n/ru_RU.php create mode 100644 settings/l10n/si_LK.php create mode 100644 settings/l10n/uk.php create mode 100644 settings/l10n/vi.php create mode 100644 settings/l10n/zh_CN.GB2312.php delete mode 100644 settings/log.php mode change 100755 => 100644 settings/templates/admin.php create mode 100644 tests/apps.php create mode 100644 tests/bootstrap.php create mode 100644 tests/data/data.tar.gz create mode 100644 tests/data/data.zip create mode 100644 tests/data/db_structure.xml create mode 100644 tests/data/db_structure2.xml delete mode 100644 tests/index.php create mode 100644 tests/lib/db.php create mode 100644 tests/lib/dbschema.php create mode 100644 tests/lib/geo.php create mode 100644 tests/lib/helper.php create mode 100644 tests/lib/share/backend.php create mode 100644 tests/lib/share/share.php create mode 100644 tests/lib/util.php create mode 100644 tests/phpunit.xml delete mode 100644 webapps.php (limited to 'lib/filesystemview.php') diff --git a/.gitignore b/.gitignore index ae636931706..4749dea19dc 100644 --- a/.gitignore +++ b/.gitignore @@ -19,10 +19,12 @@ _darcs/* CVS/* .svn/* RCS/* +*.backup* # kdevelop .kdev *.kdev4 +*.kate-swp # Lokalize *lokalize* diff --git a/.tx/config b/.tx/config deleted file mode 100644 index b51860f8b2f..00000000000 --- a/.tx/config +++ /dev/null @@ -1,182 +0,0 @@ -[main] -host = https://www.transifex.net - -[owncloud.core] -file_filter = l10n//core.po -host = http://www.transifex.net -source_file = l10n/templates/core.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/core.po -trans.ca = l10n/ca/core.po -trans.cs_CZ = l10n/cs_CZ/core.po -trans.da = l10n/da/core.po -trans.de = l10n/de/core.po -trans.el = l10n/el/core.po -trans.es = l10n/es/core.po -trans.et_EE = l10n/et_EE/core.po -trans.fr = l10n/fr/core.po -trans.id = l10n/id/core.po -trans.it = l10n/it/core.po -trans.lb = l10n/lb/core.po -trans.ms_MY = l10n/ms_MY/core.po -trans.nb_NO = l10n/nb_NO/core.po -trans.nl = l10n/nl/core.po -trans.pl = l10n/pl/core.po -trans.pt_BR = l10n/pt_BR/core.po -trans.pt_PT = l10n/pt_PT/core.po -trans.ro = l10n/ro/core.po -trans.ru = l10n/ru/core.po -trans.sr = l10n/sr/core.po -trans.sr@latin = l10n/sr@latin/core.po -trans.sv = l10n/sv/core.po -trans.zh_CN = l10n/zh_CN/core.po - -[owncloud.settings] -file_filter = l10n//settings.po -host = http://www.transifex.net -source_file = l10n/templates/settings.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/settings.po -trans.ca = l10n/ca/settings.po -trans.cs_CZ = l10n/cs_CZ/settings.po -trans.da = l10n/da/settings.po -trans.de = l10n/de/settings.po -trans.el = l10n/el/settings.po -trans.es = l10n/es/settings.po -trans.et_EE = l10n/et_EE/settings.po -trans.fr = l10n/fr/settings.po -trans.id = l10n/id/settings.po -trans.it = l10n/it/settings.po -trans.lb = l10n/lb/settings.po -trans.ms_MY = l10n/ms_MY/settings.po -trans.nb_NO = l10n/nb_NO/settings.po -trans.nl = l10n/nl/settings.po -trans.pl = l10n/pl/settings.po -trans.pt_BR = l10n/pt_BR/settings.po -trans.pt_PT = l10n/pt_PT/settings.po -trans.ro = l10n/ro/settings.po -trans.ru = l10n/ru/settings.po -trans.sr = l10n/sr/settings.po -trans.sr@latin = l10n/sr@latin/settings.po -trans.sv = l10n/sv/settings.po -trans.zh_CN = l10n/zh_CN/settings.po - -[owncloud.files] -file_filter = translations/owncloud.files/.po -host = http://www.transifex.net -source_file = l10n/templates/files.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/files.po -trans.ca = l10n/ca/files.po -trans.cs_CZ = l10n/cs_CZ/files.po -trans.da = l10n/da/files.po -trans.de = l10n/de/files.po -trans.el = l10n/el/files.po -trans.es = l10n/es/files.po -trans.et_EE = l10n/et_EE/files.po -trans.fr = l10n/fr/files.po -trans.id = l10n/id/files.po -trans.it = l10n/it/files.po -trans.lb = l10n/lb/files.po -trans.ms_MY = l10n/ms_MY/files.po -trans.nb_NO = l10n/nb_NO/files.po -trans.nl = l10n/nl/files.po -trans.pl = l10n/pl/files.po -trans.pt_BR = l10n/pt_BR/files.po -trans.pt_PT = l10n/pt_PT/files.po -trans.ro = l10n/ro/files.po -trans.ru = l10n/ru/files.po -trans.sr = l10n/sr/files.po -trans.sr@latin = l10n/sr@latin/files.po -trans.sv = l10n/sv/files.po -trans.zh_CN = l10n/zh_CN/files.po - -[owncloud.media] -file_filter = translations/owncloud.media/.po -host = http://www.transifex.net -source_file = l10n/templates/media.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/media.po -trans.ca = l10n/ca/media.po -trans.cs_CZ = l10n/cs_CZ/media.po -trans.da = l10n/da/media.po -trans.de = l10n/de/media.po -trans.el = l10n/el/media.po -trans.es = l10n/es/media.po -trans.et_EE = l10n/et_EE/media.po -trans.fr = l10n/fr/media.po -trans.id = l10n/id/media.po -trans.it = l10n/it/media.po -trans.lb = l10n/lb/media.po -trans.ms_MY = l10n/ms_MY/media.po -trans.nb_NO = l10n/nb_NO/media.po -trans.nl = l10n/nl/media.po -trans.pl = l10n/pl/media.po -trans.pt_BR = l10n/pt_BR/media.po -trans.pt_PT = l10n/pt_PT/media.po -trans.ro = l10n/ro/media.po -trans.ru = l10n/ru/media.po -trans.sr = l10n/sr/media.po -trans.sr@latin = l10n/sr@latin/media.po -trans.sv = l10n/sv/media.po -trans.zh_CN = l10n/zh_CN/media.po - -[owncloud.calendar] -file_filter = l10n//calendar.po -host = http://www.transifex.net -source_file = l10n/templates/calendar.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/calendar.po -trans.ca = l10n/ca/calendar.po -trans.cs_CZ = l10n/cs_CZ/calendar.po -trans.da = l10n/da/calendar.po -trans.de = l10n/de/calendar.po -trans.el = l10n/el/calendar.po -trans.es = l10n/es/calendar.po -trans.et_EE = l10n/et_EE/calendar.po -trans.fr = l10n/fr/calendar.po -trans.id = l10n/id/calendar.po -trans.it = l10n/it/calendar.po -trans.lb = l10n/lb/calendar.po -trans.ms_MY = l10n/ms_MY/calendar.po -trans.nb_NO = l10n/nb_NO/calendar.po -trans.nl = l10n/nl/calendar.po -trans.pl = l10n/pl/calendar.po -trans.pt_BR = l10n/pt_BR/calendar.po -trans.pt_PT = l10n/pt_PT/calendar.po -trans.ro = l10n/ro/calendar.po -trans.ru = l10n/ru/calendar.po -trans.sr = l10n/sr/calendar.po -trans.sr@latin = l10n/sr@latin/calendar.po -trans.sv = l10n/sv/calendar.po -trans.zh_CN = l10n/zh_CN/calendar.po - -[owncloud.contacts] -file_filter = translations/owncloud.contacts/.po -host = http://www.transifex.net -source_file = l10n/templates/contacts.pot -source_lang = en -trans.bg_BG = l10n/bg_BG/contacts.po -trans.ca = l10n/ca/contacts.po -trans.cs_CZ = l10n/cs_CZ/contacts.po -trans.da = l10n/da/contacts.po -trans.de = l10n/de/contacts.po -trans.el = l10n/el/contacts.po -trans.es = l10n/es/contacts.po -trans.et_EE = l10n/et_EE/contacts.po -trans.fr = l10n/fr/contacts.po -trans.id = l10n/id/contacts.po -trans.it = l10n/it/contacts.po -trans.lb = l10n/lb/contacts.po -trans.ms_MY = l10n/ms_MY/contacts.po -trans.nb_NO = l10n/nb_NO/contacts.po -trans.nl = l10n/nl/contacts.po -trans.pl = l10n/pl/contacts.po -trans.pt_BR = l10n/pt_BR/contacts.po -trans.pt_PT = l10n/pt_PT/contacts.po -trans.ro = l10n/ro/contacts.po -trans.ru = l10n/ru/contacts.po -trans.sr = l10n/sr/contacts.po -trans.sr@latin = l10n/sr@latin/contacts.po -trans.sv = l10n/sv/contacts.po -trans.zh_CN = l10n/zh_CN/contacts.po diff --git a/3rdparty/Archive/Tar.php b/3rdparty/Archive/Tar.php index e9969501a07..fd2d5d7d9b8 100644 --- a/3rdparty/Archive/Tar.php +++ b/3rdparty/Archive/Tar.php @@ -35,7 +35,7 @@ * @author Vincent Blavet * @copyright 1997-2010 The Authors * @license http://www.opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Tar.php 323476 2012-02-24 15:27:26Z mrook $ + * @version CVS: $Id: Tar.php 324840 2012-04-05 08:44:41Z mrook $ * @link http://pear.php.net/package/Archive_Tar */ @@ -50,7 +50,7 @@ define('ARCHIVE_TAR_END_BLOCK', pack("a512", '')); * @package Archive_Tar * @author Vincent Blavet * @license http://www.opensource.org/licenses/bsd-license.php New BSD License -* @version $Revision: 323476 $ +* @version $Revision: 324840 $ */ class Archive_Tar extends PEAR { @@ -577,7 +577,7 @@ class Archive_Tar extends PEAR } // ----- Get the arguments - $v_att_list = func_get_args(); + $v_att_list = &func_get_args(); // ----- Read the attributes $i=0; @@ -649,14 +649,14 @@ class Archive_Tar extends PEAR // {{{ _error() function _error($p_message) { - $this->error_object = $this->raiseError($p_message); + $this->error_object = &$this->raiseError($p_message); } // }}} // {{{ _warning() function _warning($p_message) { - $this->error_object = $this->raiseError($p_message); + $this->error_object = &$this->raiseError($p_message); } // }}} @@ -981,7 +981,7 @@ class Archive_Tar extends PEAR // }}} // {{{ _addFile() - function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir,$v_stored_filename=null) + function _addFile($p_filename, &$p_header, $p_add_dir, $p_remove_dir, $v_stored_filename=null) { if (!$this->_file) { $this->_error('Invalid file descriptor'); @@ -992,31 +992,32 @@ class Archive_Tar extends PEAR $this->_error('Invalid file name'); return false; } - if(is_null($v_stored_filename)){ - - // ----- Calculate the stored filename - $p_filename = $this->_translateWinPath($p_filename, false); - $v_stored_filename = $p_filename; - if (strcmp($p_filename, $p_remove_dir) == 0) { - return true; - } - if ($p_remove_dir != '') { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= '/'; - - if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) - $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); - } - $v_stored_filename = $this->_translateWinPath($v_stored_filename); - if ($p_add_dir != '') { - if (substr($p_add_dir, -1) == '/') - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir.'/'.$v_stored_filename; - } - - $v_stored_filename = $this->_pathReduction($v_stored_filename); - } + + // ownCloud change to make it possible to specify the filename to use + if(is_null($v_stored_filename)) { + // ----- Calculate the stored filename + $p_filename = $this->_translateWinPath($p_filename, false); + $v_stored_filename = $p_filename; + if (strcmp($p_filename, $p_remove_dir) == 0) { + return true; + } + if ($p_remove_dir != '') { + if (substr($p_remove_dir, -1) != '/') + $p_remove_dir .= '/'; + + if (substr($p_filename, 0, strlen($p_remove_dir)) == $p_remove_dir) + $v_stored_filename = substr($p_filename, strlen($p_remove_dir)); + } + $v_stored_filename = $this->_translateWinPath($v_stored_filename); + if ($p_add_dir != '') { + if (substr($p_add_dir, -1) == '/') + $v_stored_filename = $p_add_dir.$v_stored_filename; + else + $v_stored_filename = $p_add_dir.'/'.$v_stored_filename; + } + + $v_stored_filename = $this->_pathReduction($v_stored_filename); + } if ($this->_isArchive($p_filename)) { if (($v_file = @fopen($p_filename, "rb")) == 0) { @@ -1775,12 +1776,20 @@ class Archive_Tar extends PEAR } if ($this->_compress_type == 'gz') { + $end_blocks = 0; + while (!@gzeof($v_temp_tar)) { $v_buffer = @gzread($v_temp_tar, 512); if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; // do not copy end blocks, we will re-make them // after appending continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); @@ -1789,9 +1798,19 @@ class Archive_Tar extends PEAR @gzclose($v_temp_tar); } elseif ($this->_compress_type == 'bz2') { + $end_blocks = 0; + while (strlen($v_buffer = @bzread($v_temp_tar, 512)) > 0) { - if ($v_buffer == ARCHIVE_TAR_END_BLOCK) { + if ($v_buffer == ARCHIVE_TAR_END_BLOCK || strlen($v_buffer) == 0) { + $end_blocks++; + // do not copy end blocks, we will re-make them + // after appending continue; + } elseif ($end_blocks > 0) { + for ($i = 0; $i < $end_blocks; $i++) { + $this->_writeBlock(ARCHIVE_TAR_END_BLOCK); + } + $end_blocks = 0; } $v_binary_data = pack("a512", $v_buffer); $this->_writeBlock($v_binary_data); diff --git a/3rdparty/MDB2/Driver/Datatype/Common.php b/3rdparty/MDB2/Driver/Datatype/Common.php index 3b02c86acda..dd7f1c7e0a9 100644 --- a/3rdparty/MDB2/Driver/Datatype/Common.php +++ b/3rdparty/MDB2/Driver/Datatype/Common.php @@ -1412,7 +1412,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common if (PEAR::isError($db)) { return $db; } - if (isset($db->function) && is_object($this->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { + if (isset($db->function) && is_object($db->function) && is_a($db->function, 'MDB2_Driver_Function_Common')) { return $db->function->now('timestamp'); } return 'CURRENT_TIMESTAMP'; diff --git a/3rdparty/MDB2/Driver/Datatype/oci8.php b/3rdparty/MDB2/Driver/Datatype/oci8.php new file mode 100644 index 00000000000..4d2e792a80e --- /dev/null +++ b/3rdparty/MDB2/Driver/Datatype/oci8.php @@ -0,0 +1,499 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Datatype/Common.php'; + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Datatype_oci8 extends MDB2_Driver_Datatype_Common +{ + // {{{ _baseConvertResult() + + /** + * general type conversion method + * + * @param mixed $value refernce to a value to be converted + * @param string $type specifies which type to convert to + * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text + * @return object a MDB2 error on failure + * @access protected + */ + function _baseConvertResult($value, $type, $rtrim = true) + { + if (null === $value) { + return null; + } + switch ($type) { + case 'text': + if (is_object($value) && is_a($value, 'OCI-Lob')) { + //LOB => fetch into variable + $clob = $this->_baseConvertResult($value, 'clob', $rtrim); + if (!PEAR::isError($clob) && is_resource($clob)) { + $clob_value = ''; + while (!feof($clob)) { + $clob_value .= fread($clob, 8192); + } + $this->destroyLOB($clob); + } + $value = $clob_value; + } + if ($rtrim) { + $value = rtrim($value); + } + return $value; + case 'date': + return substr($value, 0, strlen('YYYY-MM-DD')); + case 'time': + return substr($value, strlen('YYYY-MM-DD '), strlen('HH:MI:SS')); + } + return parent::_baseConvertResult($value, $type, $rtrim); + } + + // }}} + // {{{ getTypeDeclaration() + + /** + * Obtain DBMS specific SQL code portion needed to declare an text type + * field to be used in statements like CREATE TABLE. + * + * @param array $field associative array with the name of the properties + * of the field being declared as array indexes. Currently, the types + * of supported field properties are as follows: + * + * length + * Integer value that determines the maximum length of the text + * field. If this argument is missing the field should be + * declared to have the longest length allowed by the DBMS. + * + * default + * Text value to be used as default for this field. + * + * notnull + * Boolean flag that indicates whether this field is constrained + * to not be set to null. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field. + * @access public + */ + function getTypeDeclaration($field) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + switch ($field['type']) { + case 'text': + $length = !empty($field['length']) + ? $field['length'] : $db->options['default_text_field_length']; + $fixed = !empty($field['fixed']) ? $field['fixed'] : false; + return $fixed ? 'CHAR('.$length.')' : 'VARCHAR2('.$length.')'; + case 'clob': + return 'CLOB'; + case 'blob': + return 'BLOB'; + case 'integer': + if (!empty($field['length'])) { + switch((int)$field['length']) { + case 1: $digit = 3; break; + case 2: $digit = 5; break; + case 3: $digit = 8; break; + case 4: $digit = 10; break; + case 5: $digit = 13; break; + case 6: $digit = 15; break; + case 7: $digit = 17; break; + case 8: $digit = 20; break; + default: $digit = 10; + } + return 'NUMBER('.$digit.')'; + } + return 'INT'; + case 'boolean': + return 'NUMBER(1)'; + case 'date': + case 'time': + case 'timestamp': + return 'DATE'; + case 'float': + return 'NUMBER'; + case 'decimal': + $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; + return 'NUMBER(*,'.$scale.')'; + } + } + + // }}} + // {{{ _quoteCLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteCLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_CLOB()'; + } + + // }}} + // {{{ _quoteBLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteBLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_BLOB()'; + } + + // }}} + // {{{ _quoteDate() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteDate($value, $quote, $escape_wildcards) + { + return $this->_quoteText("$value 00:00:00", $quote, $escape_wildcards); + } + + // }}} + // {{{ _quoteTimestamp() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + //function _quoteTimestamp($value, $quote, $escape_wildcards) + //{ + // return $this->_quoteText($value, $quote, $escape_wildcards); + //} + + // }}} + // {{{ _quoteTime() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteTime($value, $quote, $escape_wildcards) + { + return $this->_quoteText("0001-01-01 $value", $quote, $escape_wildcards); + } + + // }}} + // {{{ writeLOBToFile() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @param string $file name of the file into which the LOb should be fetched + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function writeLOBToFile($lob, $file) + { + if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) { + if ($match[1] == 'file://') { + $file = $match[2]; + } + } + $lob_data = stream_get_meta_data($lob); + $lob_index = $lob_data['wrapper_data']->lob_index; + $result = $this->lobs[$lob_index]['resource']->writetofile($file); + $this->lobs[$lob_index]['resource']->seek(0); + if (!$result) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to write LOB to file', __FUNCTION__); + } + return MDB2_OK; + } + + // }}} + // {{{ _retrieveLOB() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function _retrieveLOB(&$lob) + { + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + if (!$lob['loaded'] +# && !method_exists($lob['resource'], 'read') + ) { + $lob['value'] = $lob['resource']->load(); + $lob['resource']->seek(0); + } + $lob['loaded'] = true; + return MDB2_OK; + } + + // }}} + // {{{ _readLOB() + + /** + * Read data from large object input stream. + * + * @param array $lob array + * @param blob $data reference to a variable that will hold data to be + * read from the large object input stream + * @param int $length integer value that indicates the largest ammount of + * data to be read from the large object input stream. + * @return mixed length on success, a MDB2 error on failure + * @access protected + */ + function _readLOB($lob, $length) + { + if ($lob['loaded']) { + return parent::_readLOB($lob, $length); + } + + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + $data = $lob['resource']->read($length); + if (!is_string($data)) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to read LOB', __FUNCTION__); + } + return $data; + } + + // }}} + // {{{ patternEscapeString() + + /** + * build string to define escape pattern string + * + * @access public + * + * + * @return string define escape pattern + */ + function patternEscapeString() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + return " ESCAPE '". $db->string_quoting['escape_pattern'] ."'"; + } + + // }}} + // {{{ _mapNativeDatatype() + + /** + * Maps a native array description of a field to a MDB2 datatype and length + * + * @param array $field native field description + * @return array containing the various possible types, length, sign, fixed + * @access public + */ + function _mapNativeDatatype($field) + { + $db_type = strtolower($field['type']); + $type = array(); + $length = $unsigned = $fixed = null; + if (!empty($field['length'])) { + $length = $field['length']; + } + switch ($db_type) { + case 'integer': + case 'pls_integer': + case 'binary_integer': + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + break; + case 'varchar': + case 'varchar2': + case 'nvarchar2': + $fixed = false; + case 'char': + case 'nchar': + $type[] = 'text'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + if ($fixed !== false) { + $fixed = true; + } + break; + case 'date': + case 'timestamp': + $type[] = 'timestamp'; + $length = null; + break; + case 'float': + $type[] = 'float'; + break; + case 'number': + if (!empty($field['scale'])) { + $type[] = 'decimal'; + $length = $length.','.$field['scale']; + } else { + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + } + break; + case 'long': + $type[] = 'text'; + case 'clob': + case 'nclob': + $type[] = 'clob'; + break; + case 'blob': + case 'raw': + case 'long raw': + case 'bfile': + $type[] = 'blob'; + $length = null; + break; + case 'rowid': + case 'urowid': + default: + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'unknown database attribute type: '.$db_type, __FUNCTION__); + } + + if ((int)$length <= 0) { + $length = null; + } + + return array($type, $length, $unsigned, $fixed); + } +} + +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/oci8.php b/3rdparty/MDB2/Driver/Function/oci8.php new file mode 100644 index 00000000000..757d17fcb8b --- /dev/null +++ b/3rdparty/MDB2/Driver/Function/oci8.php @@ -0,0 +1,187 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Function/Common.php'; + +/** + * MDB2 oci8 driver for the function modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Function_oci8 extends MDB2_Driver_Function_Common +{ + // {{{ executeStoredProc() + + /** + * Execute a stored procedure and return any results + * + * @param string $name string that identifies the function to execute + * @param mixed $params array that contains the paramaters to pass the stored proc + * @param mixed $types array that contains the types of the columns in + * the result set + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'EXEC '.$name; + $query .= $params ? '('.implode(', ', $params).')' : '()'; + return $db->query($query, $types, $result_class, $result_wrap_class); + } + + // }}} + // {{{ functionTable() + + /** + * return string for internal table used when calling only a function + * + * @return string for internal table used when calling only a function + * @access public + */ + function functionTable() + { + return ' FROM dual'; + } + + // }}} + // {{{ now() + + /** + * Return string to call a variable with the current timestamp inside an SQL statement + * There are three special variables for current date and time: + * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) + * - CURRENT_DATE (date, DATE type) + * - CURRENT_TIME (time, TIME type) + * + * @return string to call a variable with the current timestamp + * @access public + */ + function now($type = 'timestamp') + { + switch ($type) { + case 'date': + case 'time': + case 'timestamp': + default: + return 'TO_CHAR(CURRENT_TIMESTAMP, \'YYYY-MM-DD HH24:MI:SS\')'; + } + } + + // }}} + // {{{ unixtimestamp() + + /** + * return string to call a function to get the unix timestamp from a iso timestamp + * + * @param string $expression + * + * @return string to call a variable with the timestamp + * @access public + */ + function unixtimestamp($expression) + { + $utc_offset = 'CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP) AS DATE) - CAST(SYSTIMESTAMP AS DATE)'; + $epoch_date = 'to_date(\'19700101\', \'YYYYMMDD\')'; + return '(CAST('.$expression.' AS DATE) - '.$epoch_date.' + '.$utc_offset.') * 86400 seconds'; + } + + // }}} + // {{{ substring() + + /** + * return string to call a function to get a substring inside an SQL statement + * + * @return string to call a function to get a substring + * @access public + */ + function substring($value, $position = 1, $length = null) + { + if (null !== $length) { + return "SUBSTR($value, $position, $length)"; + } + return "SUBSTR($value, $position)"; + } + + // }}} + // {{{ random() + + /** + * return string to call a function to get random value inside an SQL statement + * + * @return return string to generate float between 0 and 1 + * @access public + */ + function random() + { + return 'dbms_random.value'; + } + + // }}}} + // {{{ guid() + + /** + * Returns global unique identifier + * + * @return string to get global unique identifier + * @access public + */ + function guid() + { + return 'SYS_GUID()'; + } + + // }}}} +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Manager/oci8.php b/3rdparty/MDB2/Driver/Manager/oci8.php new file mode 100644 index 00000000000..90ae8eb2302 --- /dev/null +++ b/3rdparty/MDB2/Driver/Manager/oci8.php @@ -0,0 +1,1340 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Manager/Common.php'; + +/** + * MDB2 oci8 driver for the management modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Manager_oci8 extends MDB2_Driver_Manager_Common +{ + // {{{ createDatabase() + + /** + * create a new database + * + * @param string $name name of the database that should be created + * @param array $options array with charset, collation info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createDatabase($name, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + $password = $db->dsn['password'] ? $db->dsn['password'] : $name; + $tablespace = $db->options['default_tablespace'] + ? ' DEFAULT TABLESPACE '.$db->options['default_tablespace'] : ''; + + $query = 'CREATE USER '.$username.' IDENTIFIED BY '.$password.$tablespace; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + return $result; + } + $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '.$username; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + $query = 'DROP USER '.$username.' CASCADE'; + $result2 = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result2)) { + return $db->raiseError($result2, null, null, + 'could not setup the database user', __FUNCTION__); + } + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ alterDatabase() + + /** + * alter an existing database + * + * IMPORTANT: the safe way to change the db charset is to do a full import/export! + * If - and only if - the new character set is a strict superset of the current + * character set, it is possible to use the ALTER DATABASE CHARACTER SET to + * expedite the change in the database character set. + * + * @param string $name name of the database that is intended to be changed + * @param array $options array with name, charset info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function alterDatabase($name, $options = array()) + { + //disabled + //return parent::alterDatabase($name, $options); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!empty($options['name'])) { + $query = 'ALTER DATABASE ' . $db->quoteIdentifier($name, true) + .' RENAME GLOBAL_NAME TO ' . $db->quoteIdentifier($options['name'], true); + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($options['charset'])) { + $queries = array(); + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP MOUNT'; + $queries[] = 'ALTER SYSTEM ENABLE RESTRICTED SESSION'; + $queries[] = 'ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0'; + $queries[] = 'ALTER DATABASE OPEN'; + $queries[] = 'ALTER DATABASE CHARACTER SET ' . $options['charset']; + $queries[] = 'ALTER DATABASE NATIONAL CHARACTER SET ' . $options['charset']; + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP'; + + foreach ($queries as $query) { + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + return MDB2_OK; + } + + // }}} + // {{{ dropDatabase() + + /** + * drop an existing database + * + * @param object $db database object that is extended by this class + * @param string $name name of the database that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropDatabase($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + return $db->standaloneQuery('DROP USER '.$username.' CASCADE', null, true); + } + + + // }}} + // {{{ _makeAutoincrement() + + /** + * add an autoincrement sequence + trigger + * + * @param string $name name of the PK field + * @param string $table name of the table + * @param string $start start value for the sequence + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _makeAutoincrement($name, $table, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table_uppercase = strtoupper($table); + $index_name = $table_uppercase . '_AI_PK'; + $definition = array( + 'primary' => true, + 'fields' => array($name => true), + ); + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result = $this->createConstraint($table, $index_name, $definition); + $db->setOption('idxname_format', $idxname_format); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'primary key for autoincrement PK could not be created', __FUNCTION__); + } + + if (null === $start) { + $db->beginTransaction(); + $query = 'SELECT MAX(' . $db->quoteIdentifier($name, true) . ') FROM ' . $db->quoteIdentifier($table, true); + $start = $this->db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + ++$start; + $result = $this->createSequence($table, $start); + $db->commit(); + } else { + $result = $this->createSequence($table, $start); + } + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be created', __FUNCTION__); + } + $seq_name = $db->getSequenceName($table); + $trigger_name = $db->quoteIdentifier($table_uppercase . '_AI_PK', true); + $seq_name_quoted = $db->quoteIdentifier($seq_name, true); + $table = $db->quoteIdentifier($table, true); + $name = $db->quoteIdentifier($name, true); + $trigger_sql = ' +CREATE TRIGGER '.$trigger_name.' + BEFORE INSERT + ON '.$table.' + FOR EACH ROW +DECLARE + last_Sequence NUMBER; + last_InsertID NUMBER; +BEGIN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + IF (:NEW.'.$name.' IS NULL OR :NEW.'.$name.' = 0) THEN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + ELSE + SELECT NVL(Last_Number, 0) INTO last_Sequence + FROM User_Sequences + WHERE UPPER(Sequence_Name) = UPPER(\''.$seq_name.'\'); + SELECT :NEW.'.$name.' INTO last_InsertID FROM DUAL; + WHILE (last_InsertID > last_Sequence) LOOP + SELECT '.$seq_name_quoted.'.NEXTVAL INTO last_Sequence FROM DUAL; + END LOOP; + END IF; +END; +'; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ _dropAutoincrement() + + /** + * drop an existing autoincrement sequence + trigger + * + * @param string $table name of the table + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropAutoincrement($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table = strtoupper($table); + $trigger_name = $table . '_AI_PK'; + $trigger_name_quoted = $db->quote($trigger_name, 'text'); + $query = 'SELECT trigger_name FROM user_triggers'; + $query.= ' WHERE trigger_name='.$trigger_name_quoted.' OR trigger_name='.strtoupper($trigger_name_quoted); + $trigger = $db->queryOne($query); + if (PEAR::isError($trigger)) { + return $trigger; + } + + if ($trigger) { + $trigger_name = $db->quoteIdentifier($table . '_AI_PK', true); + $trigger_sql = 'DROP TRIGGER ' . $trigger_name; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'trigger for autoincrement PK could not be dropped', __FUNCTION__); + } + + $result = $this->dropSequence($table); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be dropped', __FUNCTION__); + } + + $index_name = $table . '_AI_PK'; + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result1 = $this->dropConstraint($table, $index_name); + $db->setOption('idxname_format', $idxname_format); + $result2 = $this->dropConstraint($table, $index_name); + if (PEAR::isError($result1) && PEAR::isError($result2)) { + return $db->raiseError($result1, null, null, + 'primary key for autoincrement PK could not be dropped', __FUNCTION__); + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _getTemporaryTableQuery() + + /** + * A method to return the required SQL string that fits between CREATE ... TABLE + * to create the table as a temporary table. + * + * @return string The string required to be placed between "CREATE" and "TABLE" + * to generate a temporary table, if possible. + */ + function _getTemporaryTableQuery() + { + return 'GLOBAL TEMPORARY'; + } + + // }}} + // {{{ _getAdvancedFKOptions() + + /** + * Return the FOREIGN KEY query section dealing with non-standard options + * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... + * + * @param array $definition + * @return string + * @access protected + */ + function _getAdvancedFKOptions($definition) + { + $query = ''; + if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) { + $query .= ' ON DELETE '.$definition['ondelete']; + } + if (!empty($definition['deferrable'])) { + $query .= ' DEFERRABLE'; + } else { + $query .= ' NOT DEFERRABLE'; + } + if (!empty($definition['initiallydeferred'])) { + $query .= ' INITIALLY DEFERRED'; + } else { + $query .= ' INITIALLY IMMEDIATE'; + } + return $query; + } + + // }}} + // {{{ createTable() + + /** + * create a new table + * + * @param string $name Name of the database that should be created + * @param array $fields Associative array that contains the definition of each field of the new table + * The indexes of the array entries are the names of the fields of the table an + * the array entry values are associative arrays like those that are meant to be + * passed with the field definitions to get[Type]Declaration() functions. + * + * Example + * array( + * + * 'id' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * 'notnull' => 1 + * 'default' => 0 + * ), + * 'name' => array( + * 'type' => 'text', + * 'length' => 12 + * ), + * 'password' => array( + * 'type' => 'text', + * 'length' => 12 + * ) + * ); + * @param array $options An associative array of table options: + * array( + * 'comment' => 'Foo', + * 'temporary' => true|false, + * ); + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createTable($name, $fields, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = parent::createTable($name, $fields, $options); + if (!PEAR::isError($result)) { + foreach ($fields as $field_name => $field) { + if (!empty($field['autoincrement'])) { + $result = $this->_makeAutoincrement($field_name, $name); + } + } + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ dropTable() + + /** + * drop an existing table + * + * @param string $name name of the table that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = $this->_dropAutoincrement($name); + if (!PEAR::isError($result)) { + $result = parent::dropTable($name); + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ truncateTable() + + /** + * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, + * it falls back to a DELETE FROM TABLE query) + * + * @param string $name name of the table that should be truncated + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function truncateTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $name = $db->quoteIdentifier($name, true); + return $db->exec("TRUNCATE TABLE $name"); + } + + // }}} + // {{{ vacuum() + + /** + * Optimize (vacuum) all the tables in the db (or only the specified table) + * and optionally run ANALYZE. + * + * @param string $table table name (all the tables if empty) + * @param array $options an array with driver-specific options: + * - timeout [int] (in seconds) [mssql-only] + * - analyze [boolean] [pgsql and mysql] + * - full [boolean] [pgsql-only] + * - freeze [boolean] [pgsql-only] + * + * @return mixed MDB2_OK success, a MDB2 error on failure + * @access public + */ + function vacuum($table = null, $options = array()) + { + // not needed in Oracle + return MDB2_OK; + } + + // }}} + // {{{ alterTable() + + /** + * alter an existing table + * + * @param string $name name of the table that is intended to be changed. + * @param array $changes associative array that contains the details of each type + * of change that is intended to be performed. The types of + * changes that are currently supported are defined as follows: + * + * name + * + * New name for the table. + * + * add + * + * Associative array with the names of fields to be added as + * indexes of the array. The value of each entry of the array + * should be set to another associative array with the properties + * of the fields to be added. The properties of the fields should + * be the same as defined by the MDB2 parser. + * + * + * remove + * + * Associative array with the names of fields to be removed as indexes + * of the array. Currently the values assigned to each entry are ignored. + * An empty array should be used for future compatibility. + * + * rename + * + * Associative array with the names of fields to be renamed as indexes + * of the array. The value of each entry of the array should be set to + * another associative array with the entry named name with the new + * field name and the entry named Declaration that is expected to contain + * the portion of the field declaration already in DBMS specific SQL code + * as it is used in the CREATE TABLE statement. + * + * change + * + * Associative array with the names of the fields to be changed as indexes + * of the array. Keep in mind that if it is intended to change either the + * name of a field and any other properties, the change array entries + * should have the new names of the fields as array indexes. + * + * The value of each entry of the array should be set to another associative + * array with the properties of the fields to that are meant to be changed as + * array entries. These entries should be assigned to the new values of the + * respective properties. The properties of the fields should be the same + * as defined by the MDB2 parser. + * + * Example + * array( + * 'name' => 'userlist', + * 'add' => array( + * 'quota' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * ) + * ), + * 'remove' => array( + * 'file_limit' => array(), + * 'time_limit' => array() + * ), + * 'change' => array( + * 'name' => array( + * 'length' => '20', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 20, + * ), + * ) + * ), + * 'rename' => array( + * 'sex' => array( + * 'name' => 'gender', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 1, + * 'default' => 'M', + * ), + * ) + * ) + * ) + * + * @param boolean $check indicates whether the function should just check if the DBMS driver + * can perform the requested table alterations if the value is true or + * actually perform them otherwise. + * @access public + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + */ + function alterTable($name, $changes, $check) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + foreach ($changes as $change_name => $change) { + switch ($change_name) { + case 'add': + case 'remove': + case 'change': + case 'name': + case 'rename': + break; + default: + return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, + 'change type "'.$change_name.'" not yet supported', __FUNCTION__); + } + } + + if ($check) { + return MDB2_OK; + } + + $name = $db->quoteIdentifier($name, true); + + if (!empty($changes['add']) && is_array($changes['add'])) { + $fields = array(); + foreach ($changes['add'] as $field_name => $field) { + $fields[] = $db->getDeclaration($field['type'], $field_name, $field); + } + $result = $db->exec("ALTER TABLE $name ADD (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['change']) && is_array($changes['change'])) { + $fields = array(); + foreach ($changes['change'] as $field_name => $field) { + //fix error "column to be modified to NOT NULL is already NOT NULL" + if (!array_key_exists('notnull', $field)) { + unset($field['definition']['notnull']); + } + $fields[] = $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']); + } + $result = $db->exec("ALTER TABLE $name MODIFY (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['rename']) && is_array($changes['rename'])) { + foreach ($changes['rename'] as $field_name => $field) { + $field_name = $db->quoteIdentifier($field_name, true); + $query = "ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name']); + $result = $db->exec($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!empty($changes['remove']) && is_array($changes['remove'])) { + $fields = array(); + foreach ($changes['remove'] as $field_name => $field) { + $fields[] = $db->quoteIdentifier($field_name, true); + } + $result = $db->exec("ALTER TABLE $name DROP COLUMN ". implode(', ', $fields)); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['name'])) { + $change_name = $db->quoteIdentifier($changes['name'], true); + $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name); + if (PEAR::isError($result)) { + return $result; + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _fetchCol() + + /** + * Utility method to fetch and format a column from a resultset + * + * @param resource $result + * @param boolean $fixname (used when listing indices or constraints) + * @return mixed array of names on success, a MDB2 error on failure + * @access private + */ + function _fetchCol($result, $fixname = false) + { + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($fixname) { + foreach ($col as $k => $v) { + $col[$k] = $this->_fixIndexName($v); + } + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } + + // }}} + // {{{ listDatabases() + + /** + * list all databases + * + * @return mixed array of database names on success, a MDB2 error on failure + * @access public + */ + function listDatabases() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!$db->options['emulate_database']) { + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'database listing is only supported if the "emulate_database" option is enabled', __FUNCTION__); + } + + if ($db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + $result = $db->standaloneQuery($query, array('text'), false); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listUsers() + + /** + * list all users + * + * @return mixed array of user names on success, a MDB2 error on failure + * @access public + */ + function listUsers() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($db->options['emulate_database'] && $db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username NOT LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + return $db->queryCol($query); + } + + // }}} + // {{{ listViews() + + /** + * list all views in the current database + * + * @param string owner, the current is default + * @return mixed array of view names on success, a MDB2 error on failure + * @access public + */ + function listViews($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT view_name + FROM sys.all_views + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listFunctions() + + /** + * list all functions in the current database + * + * @param string owner, the current is default + * @return mixed array of function names on success, a MDB2 error on failure + * @access public + */ + function listFunctions($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT name + FROM sys.all_source + WHERE line = 1 + AND type = 'FUNCTION' + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableTriggers() + + /** + * list all triggers in the database that reference a given table + * + * @param string table for which all referenced triggers should be found + * @return mixed array of trigger names on success, a MDB2 error on failure + * @access public + */ + function listTableTriggers($table = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT trigger_name + FROM sys.all_triggers + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTables() + + /** + * list all tables in the database + * + * @param string owner, the current is default + * @return mixed array of table names on success, a MDB2 error on failure + * @access public + */ + function listTables($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT table_name + FROM sys.all_tables + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableFields() + + /** + * list all fields in a table in the current database + * + * @param string $table name of table that should be used in method + * @return mixed array of field names on success, a MDB2 error on failure + * @access public + */ + function listTableFields($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableIndexes() + + /** + * list all indexes in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of index names on success, a MDB2 error on failure + * @access public + */ + function listTableIndexes($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT i.index_name name + FROM all_indexes i + LEFT JOIN all_constraints c + ON c.index_name = i.index_name + AND c.owner = i.owner + AND c.table_name = i.table_name + WHERE (i.table_name=? OR i.table_name=?) + AND (i.owner=? OR i.owner=?) + AND c.index_name IS NULL + AND i.generated=' .$db->quote('N', 'text'); + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createConstraint() + + /** + * create a constraint on a table + * + * @param string $table name of the table on which the constraint is to be created + * @param string $name name of the constraint to be created + * @param array $definition associative array that defines properties of the constraint to be created. + * Currently, only one property named FIELDS is supported. This property + * is also an associative with the names of the constraint fields as array + * constraints. Each entry of this array is set to another type of associative + * array that specifies properties of the constraint that are specific to + * each field. + * + * Example + * array( + * 'fields' => array( + * 'user_name' => array(), + * 'last_login' => array() + * ) + * ) + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createConstraint($table, $name, $definition) + { + $result = parent::createConstraint($table, $name, $definition); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($definition['foreign'])) { + return $this->_createFKTriggers($table, array($name => $definition)); + } + return MDB2_OK; + } + + // }}} + // {{{ dropConstraint() + + /** + * drop existing constraint + * + * @param string $table name of table that should be used in method + * @param string $name name of the constraint to be dropped + * @param string $primary hint if the constraint is primary + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropConstraint($table, $name, $primary = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + //is it a FK constraint? If so, also delete the associated triggers + $db->loadModule('Reverse', null, true); + $definition = $db->reverse->getTableConstraintDefinition($table, $name); + if (!PEAR::isError($definition) && !empty($definition['foreign'])) { + //first drop the FK enforcing triggers + $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); + if (PEAR::isError($result)) { + return $result; + } + } + + return parent::dropConstraint($table, $name, $primary); + } + + // }}} + // {{{ _createFKTriggers() + + /** + * Create triggers to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param array $foreign_keys FOREIGN KEY definitions + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _createFKTriggers($table, $foreign_keys) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + // create triggers to enforce FOREIGN KEY constraints + if ($db->supports('triggers') && !empty($foreign_keys)) { + $table = $db->quoteIdentifier($table, true); + foreach ($foreign_keys as $fkname => $fkdef) { + if (empty($fkdef)) { + continue; + } + $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); + if ('RESTRICT' == $fkdef['onupdate'] || 'NO ACTION' == $fkdef['onupdate']) { + // already handled by default + continue; + } + + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $table_fields = array_keys($fkdef['fields']); + $referenced_fields = array_keys($fkdef['references']['fields']); + + //create the ON UPDATE trigger on the primary table + $restrict_action = ' IF (SELECT '; + $aliased_fields = array(); + foreach ($table_fields as $field) { + $aliased_fields[] = $table .'.'.$field .' AS '.$field; + } + $restrict_action .= implode(',', $aliased_fields) + .' FROM '.$table + .' WHERE '; + $conditions = array(); + $new_values = array(); + $null_values = array(); + for ($i=0; $iloadModule('Reverse', null, true); + $default_values = array(); + foreach ($table_fields as $table_field) { + $field_definition = $db->reverse->getTableFieldDefinition($table, $field); + if (PEAR::isError($field_definition)) { + return $field_definition; + } + $default_values[] = $table_field .' = '. $field_definition[0]['default']; + } + $setdefault_action = 'UPDATE '.$table.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; + } + + $query = 'CREATE TRIGGER %s' + .' %s ON '.$fkdef['references']['table'] + .' FOR EACH ROW ' + .' BEGIN '; + + if ('CASCADE' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $cascade_action; + } elseif ('SET NULL' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setnull_action; + } elseif ('SET DEFAULT' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setdefault_action; + } + $sql_update .= ' END;'; + $result = $db->exec($sql_update); + if (PEAR::isError($result)) { + if ($result->getCode() === MDB2_ERROR_ALREADY_EXISTS) { + return MDB2_OK; + } + return $result; + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ _dropFKTriggers() + + /** + * Drop the triggers created to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param string $fkname FOREIGN KEY constraint name + * @param string $referenced_table referenced table name + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropFKTriggers($table, $fkname, $referenced_table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $triggers = $this->listTableTriggers($table); + $triggers2 = $this->listTableTriggers($referenced_table); + if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { + $triggers = array_merge($triggers, $triggers2); + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $pattern = '/^'.$trigger_name.'$/i'; + foreach ($triggers as $trigger) { + if (preg_match($pattern, $trigger)) { + $result = $db->exec('DROP TRIGGER '.$trigger); + if (PEAR::isError($result)) { + return $result; + } + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ listTableConstraints() + + /** + * list all constraints in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of constraint names on success, a MDB2 error on failure + * @access public + */ + function listTableConstraints($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT constraint_name + FROM all_constraints + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createSequence() + + /** + * create sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be created + * @param string $start start value of the sequence; default is 1 + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createSequence($seq_name, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + $query = "CREATE SEQUENCE $sequence_name START WITH $start INCREMENT BY 1 NOCACHE"; + $query.= ($start < 1 ? " MINVALUE $start" : ''); + return $db->exec($query); + } + + // }}} + // {{{ dropSequence() + + /** + * drop existing sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropSequence($seq_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + return $db->exec("DROP SEQUENCE $sequence_name"); + } + + // }}} + // {{{ listSequences() + + /** + * list all sequences in the current database + * + * @param string owner, the current is default + * @return mixed array of sequence names on success, a MDB2 error on failure + * @access public + */ + function listSequences($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT sequence_name + FROM sys.all_sequences + WHERE (sequence_owner=? OR sequence_owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + foreach ($col as $k => $v) { + $col[$k] = $this->_fixSequenceName($v); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/oci8.php b/3rdparty/MDB2/Driver/Native/oci8.php new file mode 100644 index 00000000000..d198f9687a9 --- /dev/null +++ b/3rdparty/MDB2/Driver/Native/oci8.php @@ -0,0 +1,60 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 215004 2006-06-18 21:59:05Z lsmith $ +// + +require_once 'MDB2/Driver/Native/Common.php'; + +/** + * MDB2 Oracle driver for the native module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Native_oci8 extends MDB2_Driver_Native_Common +{ +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/oci8.php b/3rdparty/MDB2/Driver/Reverse/oci8.php new file mode 100644 index 00000000000..d89ad771374 --- /dev/null +++ b/3rdparty/MDB2/Driver/Reverse/oci8.php @@ -0,0 +1,625 @@ + | +// | Lorenzo Alberton | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ +// + +require_once 'MDB2/Driver/Reverse/Common.php'; + +/** + * MDB2 Oracle driver for the schema reverse engineering module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common +{ + // {{{ getTableFieldDefinition() + + /** + * Get the structure of a field into an array + * + * @param string $table_name name of table that should be used in method + * @param string $field_name name of field that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableFieldDefinition($table_name, $field_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $result = $db->loadModule('Datatype', null, true); + if (PEAR::isError($result)) { + return $result; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name AS "name", + data_type AS "type", + nullable AS "nullable", + data_default AS "default", + COALESCE(data_precision, data_length) AS "length", + data_scale AS "scale" + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + AND (column_name=? OR column_name=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + $field_name, + strtoupper($field_name) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $column = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($column)) { + return $column; + } + $stmt->free(); + $result->free(); + + if (empty($column)) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $field_name . ' is not a column in table ' . $table_name, __FUNCTION__); + } + + $column = array_change_key_case($column, CASE_LOWER); + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column['name'] = strtolower($column['name']); + } else { + $column['name'] = strtoupper($column['name']); + } + } + $mapped_datatype = $db->datatype->mapNativeDatatype($column); + if (PEAR::isError($mapped_datatype)) { + return $mapped_datatype; + } + list($types, $length, $unsigned, $fixed) = $mapped_datatype; + $notnull = false; + if (!empty($column['nullable']) && $column['nullable'] == 'N') { + $notnull = true; + } + $default = false; + if (array_key_exists('default', $column)) { + $default = $column['default']; + if ($default === 'NULL') { + $default = null; + } + //ugly hack, but works for the reverse direction + if ($default == "''") { + $default = ''; + } + if ((null === $default) && $notnull) { + $default = ''; + } + } + + $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); + if (null !== $length) { + $definition[0]['length'] = $length; + } + if (null !== $unsigned) { + $definition[0]['unsigned'] = $unsigned; + } + if (null !== $fixed) { + $definition[0]['fixed'] = $fixed; + } + if ($default !== false) { + $definition[0]['default'] = $default; + } + foreach ($types as $key => $type) { + $definition[$key] = $definition[0]; + if ($type == 'clob' || $type == 'blob') { + unset($definition[$key]['default']); + } + $definition[$key]['type'] = $type; + $definition[$key]['mdb2type'] = $type; + } + if ($type == 'integer') { + $query= "SELECT trigger_body + FROM all_triggers + WHERE table_name=? + AND triggering_event='INSERT' + AND trigger_type='BEFORE EACH ROW'"; + // ^^ pretty reasonable mimic for "auto_increment" in oracle? + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(strtoupper($table)); + if (PEAR::isError($result)) { + return $result; + } + while ($triggerstr = $result->fetchOne()) { + if (preg_match('/.*SELECT\W+(.+)\.nextval +into +\:NEW\.'.$field_name.' +FROM +dual/im', $triggerstr, $matches)) { + $definition[0]['autoincrement'] = $matches[1]; + } + } + $stmt->free(); + $result->free(); + } + return $definition; + } + + // }}} + // {{{ getTableIndexDefinition() + + /** + * Get the structure of an index into an array + * + * @param string $table_name name of table that should be used in method + * @param string $index_name name of index that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableIndexDefinition($table_name, $index_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT aic.column_name AS "column_name", + aic.column_position AS "column_position", + aic.descend AS "descend", + aic.table_owner AS "table_owner", + alc.constraint_type AS "constraint_type" + FROM all_ind_columns aic + LEFT JOIN all_constraints alc + ON aic.index_name = alc.constraint_name + AND aic.table_name = alc.table_name + AND aic.table_owner = alc.owner + WHERE (aic.table_name=? OR aic.table_name=?) + AND (aic.index_name=? OR aic.index_name=?) + AND (aic.table_owner=? OR aic.table_owner=?) + ORDER BY column_position'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $indexnames = array_unique(array($db->getIndexName($index_name), $index_name)); + $i = 0; + $row = null; + while ((null === $row) && array_key_exists($i, $indexnames)) { + $args = array( + $table, + strtoupper($table), + $indexnames[$i], + strtoupper($indexnames[$i]), + $owner, + strtoupper($owner) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $i++; + } + if (null === $row) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + if ($row['constraint_type'] == 'U' || $row['constraint_type'] == 'P') { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is a constraint, not an index on table '. $table_name, __FUNCTION__); + } + + $definition = array(); + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['column_position'], + ); + if (!empty($row['descend'])) { + $definition['fields'][$column_name]['sorting'] = + ($row['descend'] == 'ASC' ? 'ascending' : 'descending'); + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + return $definition; + } + + // }}} + // {{{ getTableConstraintDefinition() + + /** + * Get the structure of a constraint into an array + * + * @param string $table_name name of table that should be used in method + * @param string $constraint_name name of constraint that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableConstraintDefinition($table_name, $constraint_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT alc.constraint_name, + CASE alc.constraint_type WHEN \'P\' THEN 1 ELSE 0 END "primary", + CASE alc.constraint_type WHEN \'R\' THEN 1 ELSE 0 END "foreign", + CASE alc.constraint_type WHEN \'U\' THEN 1 ELSE 0 END "unique", + CASE alc.constraint_type WHEN \'C\' THEN 1 ELSE 0 END "check", + alc.DELETE_RULE "ondelete", + \'NO ACTION\' "onupdate", + \'SIMPLE\' "match", + CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable", + CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred", + alc.search_condition AS "search_condition", + alc.table_name, + cols.column_name AS "column_name", + cols.position, + r_alc.table_name "references_table", + r_cols.column_name "references_field", + r_cols.position "references_field_position" + FROM all_cons_columns cols + LEFT JOIN all_constraints alc + ON alc.constraint_name = cols.constraint_name + AND alc.owner = cols.owner + LEFT JOIN all_constraints r_alc + ON alc.r_constraint_name = r_alc.constraint_name + AND alc.r_owner = r_alc.owner + LEFT JOIN all_cons_columns r_cols + ON r_alc.constraint_name = r_cols.constraint_name + AND r_alc.owner = r_cols.owner + AND cols.position = r_cols.position + WHERE (alc.constraint_name=? OR alc.constraint_name=?) + AND alc.constraint_name = cols.constraint_name + AND (alc.owner=? OR alc.owner=?)'; + $tablenames = array(); + if (!empty($table)) { + $query.= ' AND (alc.table_name=? OR alc.table_name=?)'; + $tablenames = array($table, strtoupper($table)); + } + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + + $constraintnames = array_unique(array($db->getIndexName($constraint_name), $constraint_name)); + $c = 0; + $row = null; + while ((null === $row) && array_key_exists($c, $constraintnames)) { + $args = array( + $constraintnames[$c], + strtoupper($constraintnames[$c]), + $owner, + strtoupper($owner) + ); + if (!empty($table)) { + $args = array_merge($args, $tablenames); + } + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $c++; + } + + $definition = array( + 'primary' => (boolean)$row['primary'], + 'unique' => (boolean)$row['unique'], + 'foreign' => (boolean)$row['foreign'], + 'check' => (boolean)$row['check'], + 'deferrable' => (boolean)$row['deferrable'], + 'initiallydeferred' => (boolean)$row['initiallydeferred'], + 'ondelete' => $row['ondelete'], + 'onupdate' => $row['onupdate'], + 'match' => $row['match'], + ); + + if ($definition['check']) { + // pattern match constraint for check constraint values into enum-style output: + $enumregex = '/'.$row['column_name'].' in \((.+?)\)/i'; + if (preg_match($enumregex, $row['search_condition'], $rangestr)) { + $definition['fields'][$column_name] = array(); + $allowed = explode(',', $rangestr[1]); + foreach ($allowed as $val) { + $val = trim($val); + $val = preg_replace('/^\'/', '', $val); + $val = preg_replace('/\'$/', '', $val); + array_push($definition['fields'][$column_name], $val); + } + } + } + + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['position'] + ); + if ($row['foreign']) { + $ref_column_name = $row['references_field']; + $ref_table_name = $row['references_table']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $ref_column_name = strtolower($ref_column_name); + $ref_table_name = strtolower($ref_table_name); + } else { + $ref_column_name = strtoupper($ref_column_name); + $ref_table_name = strtoupper($ref_table_name); + } + } + $definition['references']['table'] = $ref_table_name; + $definition['references']['fields'][$ref_column_name] = array( + 'position' => (int)$row['references_field_position'] + ); + } + $lastrow = $row; + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $constraint_name . ' is not a constraint on table '. $table_name, __FUNCTION__); + } + + return $definition; + } + + // }}} + // {{{ getSequenceDefinition() + + /** + * Get the structure of a sequence into an array + * + * @param string $sequence name of sequence that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getSequenceDefinition($sequence) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->getSequenceName($sequence); + $query = 'SELECT last_number FROM user_sequences'; + $query.= ' WHERE sequence_name='.$db->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$db->quote(strtoupper($sequence_name), 'text'); + $start = $db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + $definition = array(); + if ($start != 1) { + $definition = array('start' => $start); + } + return $definition; + } + + // }}} + // {{{ getTriggerDefinition() + + /** + * Get the structure of a trigger into an array + * + * EXPERIMENTAL + * + * WARNING: this function is experimental and may change the returned value + * at any time until labelled as non-experimental + * + * @param string $trigger name of trigger that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTriggerDefinition($trigger) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'SELECT trigger_name AS "trigger_name", + table_name AS "table_name", + trigger_body AS "trigger_body", + trigger_type AS "trigger_type", + triggering_event AS "trigger_event", + description AS "trigger_comment", + 1 AS "trigger_enabled", + when_clause AS "when_clause" + FROM user_triggers + WHERE trigger_name = \''. strtoupper($trigger).'\''; + $types = array( + 'trigger_name' => 'text', + 'table_name' => 'text', + 'trigger_body' => 'text', + 'trigger_type' => 'text', + 'trigger_event' => 'text', + 'trigger_comment' => 'text', + 'trigger_enabled' => 'boolean', + 'when_clause' => 'text', + ); + $result = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($result['trigger_type'])) { + //$result['trigger_type'] = array_shift(explode(' ', $result['trigger_type'])); + $result['trigger_type'] = preg_replace('/(\S+).*/', '\\1', $result['trigger_type']); + } + return $result; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * NOTE: flags won't contain index information. + * + * @param object|string $result MDB2_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A MDB2_Error object on failure. + * + * @see MDB2_Driver_Common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + return parent::tableInfo($result, $mode); + } + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; + if (!is_resource($resource)) { + return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'Could not generate result resource', __FUNCTION__); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $case_func = 'strtolower'; + } else { + $case_func = 'strtoupper'; + } + } else { + $case_func = 'strval'; + } + + $count = @OCINumCols($resource); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + $db->loadModule('Datatype', null, true); + for ($i = 0; $i < $count; $i++) { + $column = array( + 'table' => '', + 'name' => $case_func(@OCIColumnName($resource, $i+1)), + 'type' => @OCIColumnType($resource, $i+1), + 'length' => @OCIColumnSize($resource, $i+1), + 'flags' => '', + ); + $res[$i] = $column; + $res[$i]['mdb2type'] = $db->datatype->mapNativeDatatype($res[$i]); + if ($mode & MDB2_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & MDB2_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + return $res; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/mysql.php b/3rdparty/MDB2/Driver/mysql.php index 3008bd04f09..1d22e61f460 100644 --- a/3rdparty/MDB2/Driver/mysql.php +++ b/3rdparty/MDB2/Driver/mysql.php @@ -80,7 +80,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common protected $start_transaction = false; - protected $varchar_max_length = 255; + public $varchar_max_length = 255; // }}} // {{{ constructor diff --git a/3rdparty/MDB2/Driver/oci8.php b/3rdparty/MDB2/Driver/oci8.php new file mode 100644 index 00000000000..a1eefc94d15 --- /dev/null +++ b/3rdparty/MDB2/Driver/oci8.php @@ -0,0 +1,1700 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_oci8 extends MDB2_Driver_Common +{ + // {{{ properties + var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '@'); + + var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); + + var $uncommitedqueries = 0; + // }}} + // {{{ constructor + + /** + * Constructor + */ + function __construct() + { + parent::__construct(); + + $this->phptype = 'oci8'; + $this->dbsyntax = 'oci8'; + + $this->supported['sequences'] = true; + $this->supported['indexes'] = true; + $this->supported['summary_functions'] = true; + $this->supported['order_by_text'] = true; + $this->supported['current_id'] = true; + $this->supported['affected_rows'] = true; + $this->supported['transactions'] = true; + $this->supported['savepoints'] = true; + $this->supported['limit_queries'] = true; + $this->supported['LOBs'] = true; + $this->supported['replace'] = 'emulated'; + $this->supported['sub_selects'] = true; + $this->supported['triggers'] = true; + $this->supported['auto_increment'] = false; // implementation is broken + $this->supported['primary_key'] = true; + $this->supported['result_introspection'] = true; + $this->supported['prepared_statements'] = true; + $this->supported['identifier_quoting'] = true; + $this->supported['pattern_escaping'] = true; + $this->supported['new_link'] = true; + + $this->options['DBA_username'] = false; + $this->options['DBA_password'] = false; + $this->options['database_name_prefix'] = false; + $this->options['emulate_database'] = true; + $this->options['default_tablespace'] = false; + $this->options['default_text_field_length'] = 2000; + $this->options['lob_allow_url_include'] = false; + $this->options['result_prefetching'] = false; + $this->options['max_identifiers_length'] = 30; + } + + // }}} + // {{{ errorInfo() + + /** + * This method is used to collect information about an error + * + * @param integer $error + * @return array + * @access public + */ + function errorInfo($error = null) + { + if (is_resource($error)) { + $error_data = @OCIError($error); + $error = null; + } elseif ($this->connection) { + $error_data = @OCIError($this->connection); + } else { + $error_data = @OCIError(); + } + $native_code = $error_data['code']; + $native_msg = $error_data['message']; + if (null === $error) { + static $ecode_map; + if (empty($ecode_map)) { + $ecode_map = array( + 1 => MDB2_ERROR_CONSTRAINT, + 900 => MDB2_ERROR_SYNTAX, + 904 => MDB2_ERROR_NOSUCHFIELD, + 911 => MDB2_ERROR_SYNTAX, //invalid character + 913 => MDB2_ERROR_VALUE_COUNT_ON_ROW, + 921 => MDB2_ERROR_SYNTAX, + 923 => MDB2_ERROR_SYNTAX, + 942 => MDB2_ERROR_NOSUCHTABLE, + 955 => MDB2_ERROR_ALREADY_EXISTS, + 1400 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1401 => MDB2_ERROR_INVALID, + 1407 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1418 => MDB2_ERROR_NOT_FOUND, + 1435 => MDB2_ERROR_NOT_FOUND, + 1476 => MDB2_ERROR_DIVZERO, + 1722 => MDB2_ERROR_INVALID_NUMBER, + 2289 => MDB2_ERROR_NOSUCHTABLE, + 2291 => MDB2_ERROR_CONSTRAINT, + 2292 => MDB2_ERROR_CONSTRAINT, + 2449 => MDB2_ERROR_CONSTRAINT, + 4081 => MDB2_ERROR_ALREADY_EXISTS, //trigger already exists + 24344 => MDB2_ERROR_SYNTAX, //success with compilation error + ); + } + if (isset($ecode_map[$native_code])) { + $error = $ecode_map[$native_code]; + } + } + return array($error, $native_code, $native_msg); + } + + // }}} + // {{{ beginTransaction() + + /** + * Start a transaction or set a savepoint. + * + * @param string name of a savepoint to set + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function beginTransaction($savepoint = null) + { + $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (null !== $savepoint) { + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'savepoint cannot be released when changes are auto committed', __FUNCTION__); + } + $query = 'SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + if ($this->in_transaction) { + return MDB2_OK; //nothing to do + } + if (!$this->destructor_registered && $this->opened_persistent) { + $this->destructor_registered = true; + register_shutdown_function('MDB2_closeOpenTransactions'); + } + $this->in_transaction = true; + ++$this->uncommitedqueries; + return MDB2_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the database changes done during a transaction that is in + * progress or release a savepoint. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after committing the pending changes. + * + * @param string name of a savepoint to release + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function commit($savepoint = null) + { + $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + return MDB2_OK; + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCICommit($connection)) { + return $this->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ rollback() + + /** + * Cancel any database changes done during a transaction or since a specific + * savepoint that is in progress. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after canceling the pending changes. + * + * @param string name of a savepoint to rollback to + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function rollback($savepoint = null) + { + $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'rollback cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCIRollback($connection)) { + return $this->raiseError(null, null, null, + 'Unable to rollback transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ function setTransactionIsolation() + + /** + * Set the transacton isolation level. + * + * @param string standard isolation level + * READ UNCOMMITTED (allows dirty reads) + * READ COMMITTED (prevents dirty reads) + * REPEATABLE READ (prevents nonrepeatable reads) + * SERIALIZABLE (prevents phantom reads) + * @param array some transaction options: + * 'wait' => 'WAIT' | 'NO WAIT' + * 'rw' => 'READ WRITE' | 'READ ONLY' + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + * @since 2.1.1 + */ + function setTransactionIsolation($isolation, $options = array()) + { + $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); + switch ($isolation) { + case 'READ UNCOMMITTED': + $isolation = 'READ COMMITTED'; + case 'READ COMMITTED': + case 'REPEATABLE READ': + $isolation = 'SERIALIZABLE'; + case 'SERIALIZABLE': + break; + default: + return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'isolation level is not supported: '.$isolation, __FUNCTION__); + } + + $query = "ALTER SESSION ISOLATION LEVEL $isolation"; + return $this->_doQuery($query, true); + } + + // }}} + // {{{ _doConnect() + + /** + * do the grunt work of the connect + * + * @return connection on success or MDB2 Error Object on failure + * @access protected + */ + function _doConnect($username, $password, $persistent = false) + { + if (!PEAR::loadExtension($this->phptype)) { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); + } + + $sid = ''; + + if (!empty($this->dsn['service']) && $this->dsn['hostspec']) { + //oci8://username:password@foo.example.com[:port]/?service=service + // service name is given, it is assumed that hostspec is really a + // hostname, we try to construct an oracle connection string from this + $port = $this->dsn['port'] ? $this->dsn['port'] : 1521; + $sid = sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) + (HOST=%s) (PORT=%s))) + (CONNECT_DATA=(SERVICE_NAME=%s)))", + $this->dsn['hostspec'], + $port, + $this->dsn['service'] + ); + } elseif ($this->dsn['hostspec']) { + // we are given something like 'oci8://username:password@foo/' + // we have hostspec but not a service name, now we assume that + // hostspec is a tnsname defined in tnsnames.ora + $sid = $this->dsn['hostspec']; + if (isset($this->dsn['port']) && $this->dsn['port']) { + $sid = $sid.':'.$this->dsn['port']; + } + } else { + // oci://username:password@ + // if everything fails, we have to rely on environment variables + // not before a check to 'emulate_database' + if (!$this->options['emulate_database'] && $this->database_name) { + $sid = $this->database_name; + } elseif (getenv('ORACLE_SID')) { + $sid = getenv('ORACLE_SID'); + } elseif ($sid = getenv('TWO_TASK')) { + $sid = getenv('TWO_TASK'); + } else { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'not a valid connection string or environment variable [ORACLE_SID|TWO_TASK] not set', + __FUNCTION__); + } + } + + if (function_exists('oci_connect')) { + if ($this->_isNewLinkSet()) { + $connect_function = 'oci_new_connect'; + } else { + $connect_function = $persistent ? 'oci_pconnect' : 'oci_connect'; + } + + $charset = empty($this->dsn['charset']) ? null : $this->dsn['charset']; + $session_mode = empty($this->dsn['session_mode']) ? null : $this->dsn['session_mode']; + $connection = @$connect_function($username, $password, $sid, $charset, $session_mode); + $error = @OCIError(); + if (isset($error['code']) && $error['code'] == 12541) { + // Couldn't find TNS listener. Try direct connection. + $connection = @$connect_function($username, $password, null, $charset); + } + } else { + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + $connection = @$connect_function($username, $password, $sid); + + if (!empty($this->dsn['charset'])) { + $result = $this->setCharset($this->dsn['charset'], $connection); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!$connection) { + return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, + 'unable to establish a connection', __FUNCTION__); + } + + if (empty($this->dsn['disable_iso_date'])) { + $query = "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + } + + $query = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS='. '"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + + return $connection; + } + + // }}} + // {{{ connect() + + /** + * Connect to the database + * + * @return MDB2_OK on success, MDB2 Error Object on failure + * @access public + */ + function connect() + { + if (is_resource($this->connection)) { + //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 + if (MDB2::areEquals($this->connected_dsn, $this->dsn) + && $this->opened_persistent == $this->options['persistent'] + ) { + return MDB2_OK; + } + $this->disconnect(false); + } + + if ($this->database_name && $this->options['emulate_database']) { + $this->dsn['username'] = $this->options['database_name_prefix'].$this->database_name; + } + + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + $this->connection = $connection; + $this->connected_dsn = $this->dsn; + $this->connected_database_name = ''; + $this->opened_persistent = $this->options['persistent']; + $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; + + if ($this->database_name) { + if ($this->database_name != $this->connected_database_name) { + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($this->database_name) .'"'; + $result = $this->_doQuery($query); + if (PEAR::isError($result)) { + $err = $this->raiseError($result, null, null, + 'Could not select the database: '.$this->database_name, __FUNCTION__); + return $err; + } + $this->connected_database_name = $this->database_name; + } + } + + $this->as_keyword = ' '; + $server_info = $this->getServerVersion(); + if (is_array($server_info)) { + if ($server_info['major'] >= '10') { + $this->as_keyword = ' AS '; + } + } + return MDB2_OK; + } + + // }}} + // {{{ databaseExists() + + /** + * check if given database name is exists? + * + * @param string $name name of the database that should be checked + * + * @return mixed true/false on success, a MDB2 error on failure + * @access public + */ + function databaseExists($name) + { + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($name) .'"'; + $result = $this->_doQuery($query, true, $connection, false); + if (PEAR::isError($result)) { + if (!MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { + return $result; + } + return false; + } + return true; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @param boolean $force if the disconnect should be forced even if the + * connection is opened persistently + * @return mixed true on success, false if not connected and error + * object on error + * @access public + */ + function disconnect($force = true) + { + if (is_resource($this->connection)) { + if ($this->in_transaction) { + $dsn = $this->dsn; + $database_name = $this->database_name; + $persistent = $this->options['persistent']; + $this->dsn = $this->connected_dsn; + $this->database_name = $this->connected_database_name; + $this->options['persistent'] = $this->opened_persistent; + $this->rollback(); + $this->dsn = $dsn; + $this->database_name = $database_name; + $this->options['persistent'] = $persistent; + } + + if (!$this->opened_persistent || $force) { + $ok = false; + if (function_exists('oci_close')) { + $ok = @oci_close($this->connection); + } else { + $ok = @OCILogOff($this->connection); + } + if (!$ok) { + return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, + null, null, null, __FUNCTION__); + } + } + $this->uncommitedqueries = 0; + } else { + return false; + } + return parent::disconnect($force); + } + + // }}} + // {{{ standaloneQuery() + + /** + * execute a query as DBA + * + * @param string $query the SQL query + * @param mixed $types array containing the types of the columns in + * the result set + * @param boolean $is_manip if the query is a manipulation query + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function standaloneQuery($query, $types = null, $is_manip = false) + { + $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; + $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; + $connection = $this->_doConnect($user, $pass, $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + + $result = $this->_doQuery($query, $is_manip, $connection, false); + if (!PEAR::isError($result)) { + if ($is_manip) { + $result = $this->_affectedRows($connection, $result); + } else { + $result = $this->_wrapResult($result, $types, true, false, $limit, $offset); + } + } + + @OCILogOff($connection); + return $result; + } + + // }}} + // {{{ _modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * @param string $query query to modify + * @param boolean $is_manip if it is a DML query + * @param integer $limit limit the number of rows + * @param integer $offset start reading from given offset + * @return string modified query + * @access protected + */ + function _modifyQuery($query, $is_manip, $limit, $offset) + { + if (preg_match('/^\s*SELECT/i', $query)) { + if (!preg_match('/\sFROM\s/i', $query)) { + $query.= " FROM dual"; + } + if ($limit > 0) { + // taken from http://svn.ez.no/svn/ezcomponents/packages/Database + $max = $offset + $limit; + if ($offset > 0) { + $min = $offset + 1; + $query = "SELECT * FROM (SELECT a.*, ROWNUM mdb2rn FROM ($query) a WHERE ROWNUM <= $max) WHERE mdb2rn >= $min"; + } else { + $query = "SELECT a.* FROM ($query) a WHERE ROWNUM <= $max"; + } + } + } + return $query; + } + + /** + * Obtain DBMS specific SQL code portion needed to declare a generic type + * field to be used in statement like CREATE TABLE, without the field name + * and type values (ie. just the character set, default value, if the + * field is permitted to be NULL or not, and the collation options). + * + * @param array $field associative array with the name of the properties + * of the field being declared as array indexes. Currently, the types + * of supported field properties are as follows: + * + * default + * Text value to be used as default for this field. + * notnull + * Boolean flag that indicates whether this field is constrained + * to not be set to null. + * charset + * Text value with the default CHARACTER SET for this field. + * collation + * Text value with the default COLLATION for this field. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field's options. + * @access protected + */ + function _getDeclarationOptions($field) + { + $charset = empty($field['charset']) ? '' : + ' '.$this->_getCharsetFieldDeclaration($field['charset']); + + $notnull = empty($field['notnull']) ? ' NULL' : ' NOT NULL'; + $default = ''; + if (array_key_exists('default', $field)) { + if ($field['default'] === '') { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $valid_default_values = $this->getValidTypes(); + $field['default'] = $valid_default_values[$field['type']]; + if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) { + $field['default'] = ' '; + } + } + if (null !== $field['default']) { + $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']); + } + } + + $collation = empty($field['collation']) ? '' : + ' '.$this->_getCollationFieldDeclaration($field['collation']); + + return $charset.$default.$notnull.$collation; + } + + // }}} + // {{{ _doQuery() + + /** + * Execute a query + * @param string $query query + * @param boolean $is_manip if the query is a manipulation query + * @param resource $connection + * @param string $database_name + * @return result or error object + * @access protected + */ + function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) + { + $this->last_query = $query; + $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + if ($this->getOption('disable_query')) { + if ($is_manip) { + return 0; + } + return null; + } + + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + + $query = str_replace("\r\n", "\n", $query); //for fixing end-of-line character in the PL/SQL in windows + $result = @OCIParse($connection, $query); + if (!$result) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $mode = $this->in_transaction ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($result, $mode)) { + $err = $this->raiseError($result, null, null, + 'Could not execute statement', __FUNCTION__); + return $err; + } + + if (is_numeric($this->options['result_prefetching'])) { + @ocisetprefetch($result, $this->options['result_prefetching']); + } + + $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ _affectedRows() + + /** + * Returns the number of rows affected + * + * @param resource $result + * @param resource $connection + * @return mixed MDB2 Error Object or the number of rows affected + * @access private + */ + function _affectedRows($connection, $result = null) + { + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + return @OCIRowCount($result); + } + + // }}} + // {{{ getServerVersion() + + /** + * return version information about the server + * + * @param bool $native determines if the raw version string should be returned + * @return mixed array/string with version information or MDB2 error object + * @access public + */ + function getServerVersion($native = false) + { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if ($this->connected_server_info) { + $server_info = $this->connected_server_info; + } else { + $server_info = @ociserverversion($connection); + } + if (!$server_info) { + return $this->raiseError(null, null, null, + 'Could not get server information', __FUNCTION__); + } + // cache server_info + $this->connected_server_info = $server_info; + if (!$native) { + if (!preg_match('/ (\d+)\.(\d+)\.(\d+)\.([\d\.]+) /', $server_info, $tmp)) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'Could not parse version information:'.$server_info, __FUNCTION__); + } + $server_info = array( + 'major' => $tmp[1], + 'minor' => $tmp[2], + 'patch' => $tmp[3], + 'extra' => $tmp[4], + 'native' => $server_info, + ); + } + return $server_info; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * With some database backends, this is emulated. + * prepare() requires a generic query as string like + * 'INSERT INTO numbers VALUES(?,?)' or + * 'INSERT INTO numbers VALUES(:foo,:bar)'. + * The ? and :name and are placeholders which can be set using + * bindParam() and the query can be sent off using the execute() method. + * The allowed format for :name can be set with the 'bindname_format' option. + * + * @param string $query the query to prepare + * @param mixed $types array that contains the types of the placeholders + * @param mixed $result_types array that contains the types of the columns in + * the result set or MDB2_PREPARE_RESULT, if set to + * MDB2_PREPARE_MANIP the query is handled as a manipulation query + * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders + * @return mixed resource handle for the prepared query on success, a MDB2 + * error on failure + * @access public + * @see bindParam, execute + */ + function prepare($query, $types = null, $result_types = null, $lobs = array()) + { + if ($this->options['emulate_prepared']) { + return parent::prepare($query, $types, $result_types, $lobs); + } + $is_manip = ($result_types === MDB2_PREPARE_MANIP); + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + $placeholder_type_guess = $placeholder_type = null; + $question = '?'; + $colon = ':'; + $positions = array(); + $position = 0; + $parameter = -1; + while ($position < strlen($query)) { + $q_position = strpos($query, $question, $position); + $c_position = strpos($query, $colon, $position); + if ($q_position && $c_position) { + $p_position = min($q_position, $c_position); + } elseif ($q_position) { + $p_position = $q_position; + } elseif ($c_position) { + $p_position = $c_position; + } else { + break; + } + if (null === $placeholder_type) { + $placeholder_type_guess = $query[$p_position]; + } + + $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); + if (PEAR::isError($new_pos)) { + return $new_pos; + } + if ($new_pos != $position) { + $position = $new_pos; + continue; //evaluate again starting from the new position + } + + if ($query[$position] == $placeholder_type_guess) { + if (null === $placeholder_type) { + $placeholder_type = $query[$p_position]; + $question = $colon = $placeholder_type; + if (!empty($types) && is_array($types)) { + if ($placeholder_type == ':') { + if (is_int(key($types))) { + $types_tmp = $types; + $types = array(); + $count = -1; + } + } else { + $types = array_values($types); + } + } + } + if ($placeholder_type == ':') { + $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; + $parameter = preg_replace($regexp, '\\1', $query); + if ($parameter === '') { + $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, + 'named parameter name must match "bindname_format" option', __FUNCTION__); + return $err; + } + // use parameter name in type array + if (isset($count) && isset($types_tmp[++$count])) { + $types[$parameter] = $types_tmp[$count]; + } + $length = strlen($parameter) + 1; + } else { + ++$parameter; + //$length = strlen($parameter); + $length = 1; // strlen('?') + } + if (!in_array($parameter, $positions)) { + $positions[] = $parameter; + } + if (isset($types[$parameter]) + && ($types[$parameter] == 'clob' || $types[$parameter] == 'blob') + ) { + if (!isset($lobs[$parameter])) { + $lobs[$parameter] = $parameter; + } + $value = $this->quote(true, $types[$parameter]); + if (PEAR::isError($value)) { + return $value; + } + $query = substr_replace($query, $value, $p_position, $length); + $position = $p_position + strlen($value) - 1; + } elseif ($placeholder_type == '?') { + $query = substr_replace($query, ':'.$parameter, $p_position, 1); + $position = $p_position + $length; + } else { + $position = $p_position + 1; + } + } else { + $position = $p_position; + } + } + if (is_array($lobs)) { + $columns = $variables = ''; + foreach ($lobs as $parameter => $field) { + $columns.= ($columns ? ', ' : ' RETURNING ').$field; + $variables.= ($variables ? ', ' : ' INTO ').':'.$parameter; + } + $query.= $columns.$variables; + } + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + $statement = @OCIParse($connection, $query); + if (!$statement) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $class_name = 'MDB2_Statement_'.$this->phptype; + $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); + $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); + return $obj; + } + + // }}} + // {{{ nextID() + + /** + * Returns the next free id of a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true the sequence is + * automatic created, if it + * not exists + * @return mixed MDB2 Error Object or id + * @access public + */ + function nextID($seq_name, $ondemand = true) + { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); + $query = "SELECT $sequence_name.nextval FROM DUAL"; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $this->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = $this->queryOne($query, 'integer'); + $this->popExpect(); + $this->popErrorHandling(); + if (PEAR::isError($result)) { + if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { + $this->loadModule('Manager', null, true); + $result = $this->manager->createSequence($seq_name); + if (PEAR::isError($result)) { + return $result; + } + return $this->nextId($seq_name, false); + } + } + return $result; + } + + // }}} + // {{{ lastInsertID() + + /** + * Returns the autoincrement ID if supported or $id or fetches the current + * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) + * + * @param string $table name of the table into which a new row was inserted + * @param string $field name of the field into which a new row was inserted + * @return mixed MDB2 Error Object or id + * @access public + */ + function lastInsertID($table = null, $field = null) + { + $old_seq = $table.(empty($field) ? '' : '_'.$field); + $sequence_name = $this->quoteIdentifier($this->getSequenceName($table), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + if (PEAR::isError($result)) { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($old_seq), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + } + + return $result; + } + + // }}} + // {{{ currId() + + /** + * Returns the current id of a sequence + * + * @param string $seq_name name of the sequence + * @return mixed MDB2_Error or id + * @access public + */ + function currId($seq_name) + { + $sequence_name = $this->getSequenceName($seq_name); + $query = 'SELECT (last_number-1) FROM all_sequences'; + $query.= ' WHERE sequence_name='.$this->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$this->quote(strtoupper($sequence_name), 'text'); + return $this->queryOne($query, 'integer'); + } +} + +/** + * MDB2 OCI8 result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Result_oci8 extends MDB2_Result_Common +{ + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + @OCIFetchInto($this->result, $row, OCI_ASSOC+OCI_RETURN_NULLS); + if (is_array($row) + && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + ) { + $row = array_change_key_case($row, $this->db->options['field_case']); + } + } else { + @OCIFetchInto($this->result, $row, OCI_RETURN_NULLS); + } + if (!$row) { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + return null; + } + // remove additional column at the end + if ($this->offset > 0) { + array_pop($row); + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ _getColumnNames() + + /** + * Retrieve the names of columns returned by the DBMS in a query result. + * + * @return mixed Array variable that holds the names of columns as keys + * or an MDB2 error on failure. + * Some DBMS may not return any columns when the result set + * does not contain any rows. + * @access private + */ + function _getColumnNames() + { + $columns = array(); + $numcols = $this->numCols(); + if (PEAR::isError($numcols)) { + return $numcols; + } + for ($column = 0; $column < $numcols; $column++) { + $column_name = @OCIColumnName($this->result, $column + 1); + $columns[$column_name] = $column; + } + if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + $columns = array_change_key_case($columns, $this->db->options['field_case']); + } + return $columns; + } + + // }}} + // {{{ numCols() + + /** + * Count the number of columns returned by the DBMS in a query result. + * + * @return mixed integer value with the number of columns, a MDB2 error + * on failure + * @access public + */ + function numCols() + { + $cols = @OCINumCols($this->result); + if (null === $cols) { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return count($this->types); + } + return $this->db->raiseError(null, null, null, + 'Could not get column count', __FUNCTION__); + } + if ($this->offset > 0) { + --$cols; + } + return $cols; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + if (is_resource($this->result) && $this->db->connection) { + $free = @OCIFreeCursor($this->result); + if (false === $free) { + return $this->db->raiseError(null, null, null, + 'Could not free result', __FUNCTION__); + } + } + $this->result = false; + return MDB2_OK; + + } +} + +/** + * MDB2 OCI8 buffered result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_BufferedResult_oci8 extends MDB2_Result_oci8 +{ + var $buffer; + var $buffer_rownum = - 1; + + // {{{ _fillBuffer() + + /** + * Fill the row buffer + * + * @param int $rownum row number upto which the buffer should be filled + if the row number is null all rows are ready into the buffer + * @return boolean true on success, false on failure + * @access protected + */ + function _fillBuffer($rownum = null) + { + if (isset($this->buffer) && is_array($this->buffer)) { + if (null === $rownum) { + if (!end($this->buffer)) { + return false; + } + } elseif (isset($this->buffer[$rownum])) { + return (bool)$this->buffer[$rownum]; + } + } + + $row = true; + while (((null === $rownum) || $this->buffer_rownum < $rownum) + && ($row = @OCIFetchInto($this->result, $buffer, OCI_RETURN_NULLS)) + ) { + ++$this->buffer_rownum; + // remove additional column at the end + if ($this->offset > 0) { + array_pop($buffer); + } + if (empty($this->types)) { + foreach (array_keys($buffer) as $key) { + if (is_a($buffer[$key], 'oci-lob')) { + $buffer[$key] = $buffer[$key]->load(); + } + } + } + $this->buffer[$this->buffer_rownum] = $buffer; + } + + if (!$row) { + ++$this->buffer_rownum; + $this->buffer[$this->buffer_rownum] = false; + return false; + } + return true; + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + if (null === $this->result) { + return null; + } + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + $target_rownum = $this->rownum + 1; + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if (!$this->_fillBuffer($target_rownum)) { + return null; + } + $row = $this->buffer[$target_rownum]; + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + $column_names = $this->getColumnNames(); + foreach ($column_names as $name => $i) { + $column_names[$name] = $row[$i]; + } + $row = $column_names; + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ seek() + + /** + * Seek to a specific row in a result set + * + * @param int $rownum number of the row where the data can be found + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function seek($rownum = 0) + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + $this->rownum = $rownum - 1; + return MDB2_OK; + } + + // }}} + // {{{ valid() + + /** + * Check if the end of the result set has been reached + * + * @return mixed true or false on sucess, a MDB2 error on failure + * @access public + */ + function valid() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return true; + } + if ($this->_fillBuffer($this->rownum + 1)) { + return true; + } + return false; + } + + // }}} + // {{{ numRows() + + /** + * Returns the number of rows in a result object + * + * @return mixed MDB2 Error Object or the number of rows + * @access public + */ + function numRows() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return 0; + } + $this->_fillBuffer(); + return $this->buffer_rownum; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + $this->buffer = null; + $this->buffer_rownum = null; + return parent::free(); + } +} + +/** + * MDB2 OCI8 statement driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Statement_oci8 extends MDB2_Statement_Common +{ + // {{{ Variables (Properties) + + var $type_maxlengths = array(); + + // }}} + // {{{ bindParam() + + /** + * Bind a variable to a parameter of a prepared query. + * + * @param int $parameter the order number of the parameter in the query + * statement. The order number of the first parameter is 1. + * @param mixed &$value variable that is meant to be bound to specified + * parameter. The type of the value depends on the $type argument. + * @param string $type specifies the type of the field + * @param int $maxlength specifies the maximum length of the field; if set to -1, the + * current length of $value is used + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function bindParam($parameter, &$value, $type = null, $maxlength = -1) + { + if (!is_numeric($parameter)) { + $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter); + } + if (MDB2_OK === ($ret = parent::bindParam($parameter, $value, $type))) { + $this->type_maxlengths[$parameter] = $maxlength; + } + + return $ret; + } + + // }}} + // {{{ _execute() + + /** + * Execute a prepared query statement helper method. + * + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * + * @return mixed MDB2_Result or integer (affected rows) on success, + * a MDB2 error on failure + * @access private + */ + function _execute($result_class = true, $result_wrap_class = false) + { + if (null === $this->statement) { + return parent::_execute($result_class, $result_wrap_class); + } + $this->db->last_query = $this->query; + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); + if ($this->db->getOption('disable_query')) { + $result = $this->is_manip ? 0 : null; + return $result; + } + + $connection = $this->db->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + + $result = MDB2_OK; + $lobs = $quoted_values = array(); + $i = 0; + foreach ($this->positions as $parameter) { + if (!array_key_exists($parameter, $this->values)) { + return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); + } + $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; + if ($type == 'clob' || $type == 'blob') { + $lobs[$i]['file'] = false; + if (is_resource($this->values[$parameter])) { + $fp = $this->values[$parameter]; + $this->values[$parameter] = ''; + while (!feof($fp)) { + $this->values[$parameter] .= fread($fp, 8192); + } + } elseif (is_a($this->values[$parameter], 'OCI-Lob')) { + //do nothing + } elseif ($this->db->getOption('lob_allow_url_include') + && preg_match('/^(\w+:\/\/)(.*)$/', $this->values[$parameter], $match) + ) { + $lobs[$i]['file'] = true; + if ($match[1] == 'file://') { + $this->values[$parameter] = $match[2]; + } + } + $lobs[$i]['value'] = $this->values[$parameter]; + $lobs[$i]['descriptor'] =& $this->values[$parameter]; + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], 'OCI-Lob')) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_LOB); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for LOB in parameter: '.$parameter, __FUNCTION__); + break; + } + } + $lob_type = ($type == 'blob' ? OCI_B_BLOB : OCI_B_CLOB); + if (!@OCIBindByName($this->statement, ':'.$parameter, $lobs[$i]['descriptor'], -1, $lob_type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind LOB parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_BFILE) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_FILE); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for BFILE in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind BFILE parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_ROWID) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_ROWID); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for ROWID in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind ROWID parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_CURSOR) { + // Test to see if cursor has already been allocated for this + // variable (i.e. if it has been bound more than once): + if (!is_resource($this->values[$parameter]) || !get_resource_type($this->values[$parameter]) == "oci8 statement") { + $this->values[$parameter] = @OCINewCursor($connection); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to allocate cursor for parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind CURSOR parameter', __FUNCTION__); + break; + } + } else { + $maxlength = array_key_exists($parameter, $this->type_maxlengths) ? $this->type_maxlengths[$parameter] : -1; + $this->values[$parameter] = $this->db->quote($this->values[$parameter], $type, false); + $quoted_values[$i] =& $this->values[$parameter]; + if (PEAR::isError($quoted_values[$i])) { + return $quoted_values[$i]; + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $quoted_values[$i], $maxlength)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind non-abstract parameter', __FUNCTION__); + break; + } + } + ++$i; + } + + $lob_keys = array_keys($lobs); + if (!PEAR::isError($result)) { + $mode = (!empty($lobs) || $this->db->in_transaction) ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($this->statement, $mode)) { + $err = $this->db->raiseError($this->statement, null, null, + 'could not execute statement', __FUNCTION__); + return $err; + } + + if (!empty($lobs)) { + foreach ($lob_keys as $i) { + if ((null !== $lobs[$i]['value']) && $lobs[$i]['value'] !== '') { + if (is_object($lobs[$i]['value'])) { + // Probably a NULL LOB + // @see http://bugs.php.net/bug.php?id=27485 + continue; + } + if ($lobs[$i]['file']) { + $result = $lobs[$i]['descriptor']->savefile($lobs[$i]['value']); + } else { + $result = $lobs[$i]['descriptor']->save($lobs[$i]['value']); + } + if (!$result) { + $result = $this->db->raiseError(null, null, null, + 'Unable to save descriptor contents', __FUNCTION__); + break; + } + } + } + + if (!PEAR::isError($result)) { + if (!$this->db->in_transaction) { + if (!@OCICommit($connection)) { + $result = $this->db->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + } else { + ++$this->db->uncommitedqueries; + } + } + } + } + + if (PEAR::isError($result)) { + return $result; + } + + if ($this->is_manip) { + $affected_rows = $this->db->_affectedRows($connection, $this->statement); + return $affected_rows; + } + + $result = $this->db->_wrapResult($this->statement, $this->result_types, + $result_class, $result_wrap_class, $this->limit, $this->offset); + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ free() + + /** + * Release resources allocated for the specified prepared query. + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function free() + { + if (null === $this->positions) { + return $this->db->raiseError(MDB2_ERROR, null, null, + 'Prepared statement has already been freed', __FUNCTION__); + } + $result = MDB2_OK; + + if ((null !== $this->statement) && !@OCIFreeStatement($this->statement)) { + $result = $this->db->raiseError(null, null, null, + 'Could not free statement', __FUNCTION__); + } + + parent::free(); + return $result; + } +} +?> \ No newline at end of file diff --git a/3rdparty/Sabre.includes.php b/3rdparty/Sabre.includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Backend/Abstract.php b/3rdparty/Sabre/CalDAV/Backend/Abstract.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Backend/PDO.php b/3rdparty/Sabre/CalDAV/Backend/PDO.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Calendar.php b/3rdparty/Sabre/CalDAV/Calendar.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/CalendarObject.php b/3rdparty/Sabre/CalDAV/CalendarObject.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryParser.php b/3rdparty/Sabre/CalDAV/CalendarQueryParser.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php old mode 100644 new mode 100755 index 1bb6b5d53fa..8f674840e87 --- a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php +++ b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php @@ -294,6 +294,7 @@ class Sabre_CalDAV_CalendarQueryValidator { // in the VALARM component code, so this is a hack, and an // expensive one too. if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) { + // Fire up the iterator! $it = new Sabre_VObject_RecurrenceIterator($component->parent->parent, (string)$component->parent->UID); while($it->valid()) { @@ -303,15 +304,37 @@ class Sabre_CalDAV_CalendarQueryValidator { // one is the first to trigger. Based on this, we can // determine if we can 'give up' expanding events. $firstAlarm = null; - foreach($expandedEvent->VALARM as $expandedAlarm) { - $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); - if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { - $firstAlarm = $effectiveTrigger; - } - if ($expandedAlarm->isInTimeRange($start, $end)) { - return true; + if ($expandedEvent->VALARM !== null) { + foreach($expandedEvent->VALARM as $expandedAlarm) { + + $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime(); + if ($expandedAlarm->isInTimeRange($start, $end)) { + return true; + } + + if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') { + // This is an alarm with a non-relative trigger + // time, likely created by a buggy client. The + // implication is that every alarm in this + // recurring event trigger at the exact same + // time. It doesn't make sense to traverse + // further. + } else { + // We store the first alarm as a means to + // figure out when we can stop traversing. + if (!$firstAlarm || $effectiveTrigger < $firstAlarm) { + $firstAlarm = $effectiveTrigger; + } + } } - + } + if (is_null($firstAlarm)) { + // No alarm was found. + // + // Or technically: No alarm that will change for + // every instance of the recurrence was found, + // which means we can assume there was no match. + return false; } if ($firstAlarm > $end) { return false; diff --git a/3rdparty/Sabre/CalDAV/CalendarRootNode.php b/3rdparty/Sabre/CalDAV/CalendarRootNode.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/ICSExportPlugin.php b/3rdparty/Sabre/CalDAV/ICSExportPlugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/ICalendar.php b/3rdparty/Sabre/CalDAV/ICalendar.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/ICalendarObject.php b/3rdparty/Sabre/CalDAV/ICalendarObject.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php old mode 100644 new mode 100755 index d7d1d970518..c56ab384844 --- a/3rdparty/Sabre/CalDAV/Plugin.php +++ b/3rdparty/Sabre/CalDAV/Plugin.php @@ -49,23 +49,23 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { /** * The email handler for invites and other scheduling messages. - * - * @var Sabre_CalDAV_Schedule_IMip + * + * @var Sabre_CalDAV_Schedule_IMip */ protected $imipHandler; /** * Sets the iMIP handler. * - * iMIP = The email transport of iCalendar scheduling messages. Setting - * this is optional, but if you want the server to allow invites to be sent + * iMIP = The email transport of iCalendar scheduling messages. Setting + * this is optional, but if you want the server to allow invites to be sent * out, you must set a handler. * - * Specifically iCal will plain assume that the server supports this. If - * the server doesn't, iCal will display errors when inviting people to + * Specifically iCal will plain assume that the server supports this. If + * the server doesn't, iCal will display errors when inviting people to * events. * - * @param Sabre_CalDAV_Schedule_IMip $imipHandler + * @param Sabre_CalDAV_Schedule_IMip $imipHandler * @return void */ public function setIMipHandler(Sabre_CalDAV_Schedule_IMip $imipHandler) { @@ -672,6 +672,42 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } + if ($vobj->name !== 'VCALENDAR') { + throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support iCalendar objects.'); + } + + $foundType = null; + $foundUID = null; + foreach($vobj->getComponents() as $component) { + switch($component->name) { + case 'VTIMEZONE' : + continue 2; + case 'VEVENT' : + case 'VTODO' : + case 'VJOURNAL' : + if (is_null($foundType)) { + $foundType = $component->name; + if (!isset($component->UID)) { + throw new Sabre_DAV_Exception_BadRequest('Every ' . $component->name . ' component must have an UID'); + } + $foundUID = (string)$component->UID; + } else { + if ($foundType !== $component->name) { + throw new Sabre_DAV_Exception_BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType); + } + if ($foundUID !== (string)$component->UID) { + throw new Sabre_DAV_Exception_BadRequest('Every ' . $component->name . ' in this object must have identical UIDs'); + } + } + break; + default : + throw new Sabre_DAV_Exception_BadRequest('You are not allowed to create components of type: ' . $component->name . ' here'); + + } + } + if (!$foundType) + throw new Sabre_DAV_Exception_BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL'); + } /** @@ -687,12 +723,12 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { if (!$originator) { throw new Sabre_DAV_Exception_BadRequest('The Originator: header must be specified when making POST requests'); - } + } if (!$recipients) { throw new Sabre_DAV_Exception_BadRequest('The Recipient: header must be specified when making POST requests'); - } + } - if (!preg_match('/^mailto:(.*)@(.*)$/', $originator)) { + if (!preg_match('/^mailto:(.*)@(.*)$/i', $originator)) { throw new Sabre_DAV_Exception_BadRequest('Originator must start with mailto: and must be valid email address'); } $originator = substr($originator,7); @@ -701,14 +737,14 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { foreach($recipients as $k=>$recipient) { $recipient = trim($recipient); - if (!preg_match('/^mailto:(.*)@(.*)$/', $recipient)) { + if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) { throw new Sabre_DAV_Exception_BadRequest('Recipients must start with mailto: and must be valid email address'); } $recipient = substr($recipient, 7); $recipients[$k] = $recipient; } - // We need to make sure that 'originator' matches one of the email + // We need to make sure that 'originator' matches one of the email // addresses of the selected principal. $principal = $outboxNode->getOwner(); $props = $this->server->getProperties($principal,array( @@ -724,7 +760,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { throw new Sabre_DAV_Exception_Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header'); } - try { + try { $vObject = Sabre_VObject_Reader::read($this->server->httpRequest->getBody(true)); } catch (Sabre_VObject_ParseException $e) { throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage()); @@ -749,9 +785,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { } if (in_array($method, array('REQUEST','REPLY','ADD','CANCEL')) && $componentType==='VEVENT') { - $this->iMIPMessage($originator, $recipients, $vObject); + $result = $this->iMIPMessage($originator, $recipients, $vObject); $this->server->httpResponse->sendStatus(200); - $this->server->httpResponse->sendBody('Messages sent'); + $this->server->httpResponse->setHeader('Content-Type','application/xml'); + $this->server->httpResponse->sendBody($this->generateScheduleResponse($result)); } else { throw new Sabre_DAV_Exception_NotImplemented('This iTIP method is currently not implemented'); } @@ -760,18 +797,83 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin { /** * Sends an iMIP message by email. - * - * @param string $originator - * @param array $recipients - * @param Sabre_VObject_Component $vObject - * @return void + * + * This method must return an array with status codes per recipient. + * This should look something like: + * + * array( + * 'user1@example.org' => '2.0;Success' + * ) + * + * Formatting for this status code can be found at: + * https://tools.ietf.org/html/rfc5545#section-3.8.8.3 + * + * A list of valid status codes can be found at: + * https://tools.ietf.org/html/rfc5546#section-3.6 + * + * @param string $originator + * @param array $recipients + * @param Sabre_VObject_Component $vObject + * @return array */ protected function iMIPMessage($originator, array $recipients, Sabre_VObject_Component $vObject) { if (!$this->imipHandler) { - throw new Sabre_DAV_Exception_NotImplemented('No iMIP handler is setup on this server.'); + $resultStatus = '5.2;This server does not support this operation'; + } else { + $this->imipHandler->sendMessage($originator, $recipients, $vObject); + $resultStatus = '2.0;Success'; } - $this->imipHandler->sendMessage($originator, $recipients, $vObject); + + $result = array(); + foreach($recipients as $recipient) { + $result[$recipient] = $resultStatus; + } + + return $result; + + + } + + /** + * Generates a schedule-response XML body + * + * The recipients array is a key->value list, containing email addresses + * and iTip status codes. See the iMIPMessage method for a description of + * the value. + * + * @param array $recipients + * @return string + */ + public function generateScheduleResponse(array $recipients) { + + $dom = new DOMDocument('1.0','utf-8'); + $dom->formatOutput = true; + $xscheduleResponse = $dom->createElement('cal:schedule-response'); + $dom->appendChild($xscheduleResponse); + + foreach($this->server->xmlNamespaces as $namespace=>$prefix) { + + $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace); + + } + + foreach($recipients as $recipient=>$status) { + $xresponse = $dom->createElement('cal:response'); + + $xrecipient = $dom->createElement('cal:recipient'); + $xrecipient->appendChild($dom->createTextNode($recipient)); + $xresponse->appendChild($xrecipient); + + $xrequestStatus = $dom->createElement('cal:request-status'); + $xrequestStatus->appendChild($dom->createTextNode($status)); + $xresponse->appendChild($xrequestStatus); + + $xscheduleResponse->appendChild($xresponse); + + } + + return $dom->saveXML(); } diff --git a/3rdparty/Sabre/CalDAV/Principal/Collection.php b/3rdparty/Sabre/CalDAV/Principal/Collection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php b/3rdparty/Sabre/CalDAV/Principal/ProxyRead.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php b/3rdparty/Sabre/CalDAV/Principal/ProxyWrite.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Principal/User.php b/3rdparty/Sabre/CalDAV/Principal/User.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php b/3rdparty/Sabre/CalDAV/Property/SupportedCalendarData.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php b/3rdparty/Sabre/CalDAV/Property/SupportedCollationSet.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Schedule/IMip.php b/3rdparty/Sabre/CalDAV/Schedule/IMip.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php b/3rdparty/Sabre/CalDAV/Schedule/IOutbox.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Schedule/Outbox.php b/3rdparty/Sabre/CalDAV/Schedule/Outbox.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Server.php b/3rdparty/Sabre/CalDAV/Server.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/UserCalendars.php b/3rdparty/Sabre/CalDAV/UserCalendars.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php old mode 100644 new mode 100755 index 939e903c89f..ace9901c089 --- a/3rdparty/Sabre/CalDAV/Version.php +++ b/3rdparty/Sabre/CalDAV/Version.php @@ -14,7 +14,7 @@ class Sabre_CalDAV_Version { /** * Full version number */ - const VERSION = '1.6.2'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/CalDAV/includes.php b/3rdparty/Sabre/CalDAV/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/AddressBook.php b/3rdparty/Sabre/CardDAV/AddressBook.php old mode 100644 new mode 100755 index 3b381e1eea3..12297175a85 --- a/3rdparty/Sabre/CardDAV/AddressBook.php +++ b/3rdparty/Sabre/CardDAV/AddressBook.php @@ -108,7 +108,9 @@ class Sabre_CardDAV_AddressBook extends Sabre_DAV_Collection implements Sabre_Ca */ public function createFile($name,$vcardData = null) { - $vcardData = stream_get_contents($vcardData); + if (is_resource($vcardData)) { + $vcardData = stream_get_contents($vcardData); + } // Converting to UTF-8, if needed $vcardData = Sabre_DAV_StringUtil::ensureUTF8($vcardData); diff --git a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php old mode 100644 new mode 100755 index 85a4963127b..46bb8ff18dd --- a/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php +++ b/3rdparty/Sabre/CardDAV/AddressBookQueryParser.php @@ -9,7 +9,7 @@ * @package Sabre * @subpackage CardDAV * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Sabre_CardDAV_AddressBookQueryParser { @@ -88,12 +88,22 @@ class Sabre_CardDAV_AddressBookQueryParser { if (is_nan($limit)) $limit = null; $filter = $this->xpath->query('/card:addressbook-query/card:filter'); - if ($filter->length !== 1) { + + // According to the CardDAV spec there needs to be exactly 1 filter + // element. However, KDE 4.8.2 contains a bug that will encode 0 filter + // elements, so this is a workaround for that. + // + // See: https://bugs.kde.org/show_bug.cgi?id=300047 + if ($filter->length === 0) { + $test = null; + $filter = null; + } elseif ($filter->length === 1) { + $filter = $filter->item(0); + $test = $this->xpath->evaluate('string(@test)', $filter); + } else { throw new Sabre_DAV_Exception_BadRequest('Only one filter element is allowed'); } - $filter = $filter->item(0); - $test = $this->xpath->evaluate('string(@test)', $filter); if (!$test) $test = self::TEST_ANYOF; if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) { throw new Sabre_DAV_Exception_BadRequest('The test attribute must either hold "anyof" or "allof"'); diff --git a/3rdparty/Sabre/CardDAV/AddressBookRoot.php b/3rdparty/Sabre/CardDAV/AddressBookRoot.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/Backend/Abstract.php b/3rdparty/Sabre/CardDAV/Backend/Abstract.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/Backend/PDO.php b/3rdparty/Sabre/CardDAV/Backend/PDO.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/Card.php b/3rdparty/Sabre/CardDAV/Card.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/IAddressBook.php b/3rdparty/Sabre/CardDAV/IAddressBook.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/ICard.php b/3rdparty/Sabre/CardDAV/ICard.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/IDirectory.php b/3rdparty/Sabre/CardDAV/IDirectory.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/Plugin.php b/3rdparty/Sabre/CardDAV/Plugin.php old mode 100644 new mode 100755 index 9ebec243eb0..96def6dd96b --- a/3rdparty/Sabre/CardDAV/Plugin.php +++ b/3rdparty/Sabre/CardDAV/Plugin.php @@ -52,6 +52,8 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $server->subscribeEvent('report', array($this,'report')); $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel')); $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction')); + $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent')); + $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile')); /* Namespaces */ $server->xmlNamespaces[self::NS_CARDDAV] = 'card'; @@ -152,7 +154,10 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $val = stream_get_contents($val); // Taking out \r to not screw up the xml output - $returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); + //$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val); + // The stripping of \r breaks the Mail App in OSX Mountain Lion + // this is fixed in master, but not backported. /Tanghus + $returnedProperties[200][$addressDataProp] = $val; } } @@ -283,6 +288,81 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { } + /** + * This method is triggered before a file gets updated with new content. + * + * This plugin uses this method to ensure that Card nodes receive valid + * vcard data. + * + * @param string $path + * @param Sabre_DAV_IFile $node + * @param resource $data + * @return void + */ + public function beforeWriteContent($path, Sabre_DAV_IFile $node, &$data) { + + if (!$node instanceof Sabre_CardDAV_ICard) + return; + + $this->validateVCard($data); + + } + + /** + * This method is triggered before a new file is created. + * + * This plugin uses this method to ensure that Card nodes receive valid + * vcard data. + * + * @param string $path + * @param resource $data + * @param Sabre_DAV_ICollection $parentNode + * @return void + */ + public function beforeCreateFile($path, &$data, Sabre_DAV_ICollection $parentNode) { + + if (!$parentNode instanceof Sabre_CardDAV_IAddressBook) + return; + + $this->validateVCard($data); + + } + + /** + * Checks if the submitted iCalendar data is in fact, valid. + * + * An exception is thrown if it's not. + * + * @param resource|string $data + * @return void + */ + protected function validateVCard(&$data) { + + // If it's a stream, we convert it to a string first. + if (is_resource($data)) { + $data = stream_get_contents($data); + } + + // Converting the data to unicode, if needed. + $data = Sabre_DAV_StringUtil::ensureUTF8($data); + + try { + + $vobj = Sabre_VObject_Reader::read($data); + + } catch (Sabre_VObject_ParseException $e) { + + throw new Sabre_DAV_Exception_UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage()); + + } + + if ($vobj->name !== 'VCARD') { + throw new Sabre_DAV_Exception_UnsupportedMediaType('This collection can only support vcard objects.'); + } + + } + + /** * This function handles the addressbook-query REPORT * @@ -362,6 +442,8 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin { $vcard = Sabre_VObject_Reader::read($vcardData); + if (!$filters) return true; + foreach($filters as $filter) { $isDefined = isset($vcard->{$filter['name']}); diff --git a/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php b/3rdparty/Sabre/CardDAV/Property/SupportedAddressData.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/UserAddressBooks.php b/3rdparty/Sabre/CardDAV/UserAddressBooks.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/CardDAV/Version.php b/3rdparty/Sabre/CardDAV/Version.php old mode 100644 new mode 100755 index 811b929e397..d0623f0d3e8 --- a/3rdparty/Sabre/CardDAV/Version.php +++ b/3rdparty/Sabre/CardDAV/Version.php @@ -16,7 +16,7 @@ class Sabre_CardDAV_Version { /** * Full version number */ - const VERSION = '1.6.1'; + const VERSION = '1.6.3'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/CardDAV/includes.php b/3rdparty/Sabre/CardDAV/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractBasic.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php b/3rdparty/Sabre/DAV/Auth/Backend/AbstractDigest.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/Apache.php b/3rdparty/Sabre/DAV/Auth/Backend/Apache.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/File.php b/3rdparty/Sabre/DAV/Auth/Backend/File.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Backend/PDO.php b/3rdparty/Sabre/DAV/Auth/Backend/PDO.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/IBackend.php b/3rdparty/Sabre/DAV/Auth/IBackend.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Auth/Plugin.php b/3rdparty/Sabre/DAV/Auth/Plugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/GuessContentType.php b/3rdparty/Sabre/DAV/Browser/GuessContentType.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php b/3rdparty/Sabre/DAV/Browser/MapGetToPropFind.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/Plugin.php b/3rdparty/Sabre/DAV/Browser/Plugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/favicon.ico b/3rdparty/Sabre/DAV/Browser/assets/favicon.ico old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png b/3rdparty/Sabre/DAV/Browser/assets/icons/addressbook.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png b/3rdparty/Sabre/DAV/Browser/assets/icons/calendar.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/card.png b/3rdparty/Sabre/DAV/Browser/assets/icons/card.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/collection.png b/3rdparty/Sabre/DAV/Browser/assets/icons/collection.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/file.png b/3rdparty/Sabre/DAV/Browser/assets/icons/file.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png b/3rdparty/Sabre/DAV/Browser/assets/icons/parent.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Browser/assets/icons/principal.png b/3rdparty/Sabre/DAV/Browser/assets/icons/principal.png old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Client.php b/3rdparty/Sabre/DAV/Client.php old mode 100644 new mode 100755 index 075e84caa1d..9a428765e90 --- a/3rdparty/Sabre/DAV/Client.php +++ b/3rdparty/Sabre/DAV/Client.php @@ -11,7 +11,7 @@ * @package Sabre * @subpackage DAVClient * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. - * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ class Sabre_DAV_Client { @@ -23,6 +23,28 @@ class Sabre_DAV_Client { protected $password; protected $proxy; + /** + * Basic authentication + */ + const AUTH_BASIC = 1; + + /** + * Digest authentication + */ + const AUTH_DIGEST = 2; + + /** + * The authentication type we're using. + * + * This is a bitmask of AUTH_BASIC and AUTH_DIGEST. + * + * If DIGEST is used, the client makes 1 extra request per request, to get + * the authentication tokens. + * + * @var int + */ + protected $authType; + /** * Constructor * @@ -46,16 +68,21 @@ class Sabre_DAV_Client { 'baseUri', 'userName', 'password', - 'proxy' + 'proxy', ); - foreach($validSettings as $validSetting) { if (isset($settings[$validSetting])) { $this->$validSetting = $settings[$validSetting]; } } + if (isset($settings['authType'])) { + $this->authType = $settings['authType']; + } else { + $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST; + } + $this->propertyMap['{DAV:}resourcetype'] = 'Sabre_DAV_Property_ResourceType'; } @@ -250,14 +277,9 @@ class Sabre_DAV_Client { // Automatically follow redirects CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, - CURLOPT_SSL_VERIFYPEER => true, - //CURLOPT_SSL_VERIFYPEER => false, ); switch ($method) { - case 'PUT': - $curlSettings[CURLOPT_PUT] = true; - break; case 'HEAD' : // do not read body with HEAD requests (this is neccessary because cURL does not ignore the body with HEAD @@ -288,8 +310,15 @@ class Sabre_DAV_Client { $curlSettings[CURLOPT_PROXY] = $this->proxy; } - if ($this->userName) { - $curlSettings[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC | CURLAUTH_DIGEST; + if ($this->userName && $this->authType) { + $curlType = 0; + if ($this->authType & self::AUTH_BASIC) { + $curlType |= CURLAUTH_BASIC; + } + if ($this->authType & self::AUTH_DIGEST) { + $curlType |= CURLAUTH_DIGEST; + } + $curlSettings[CURLOPT_HTTPAUTH] = $curlType; $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password; } diff --git a/3rdparty/Sabre/DAV/Collection.php b/3rdparty/Sabre/DAV/Collection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Directory.php b/3rdparty/Sabre/DAV/Directory.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception.php b/3rdparty/Sabre/DAV/Exception.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/BadRequest.php b/3rdparty/Sabre/DAV/Exception/BadRequest.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/Conflict.php b/3rdparty/Sabre/DAV/Exception/Conflict.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/ConflictingLock.php b/3rdparty/Sabre/DAV/Exception/ConflictingLock.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/FileNotFound.php b/3rdparty/Sabre/DAV/Exception/FileNotFound.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/Forbidden.php b/3rdparty/Sabre/DAV/Exception/Forbidden.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/InsufficientStorage.php b/3rdparty/Sabre/DAV/Exception/InsufficientStorage.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/InvalidResourceType.php b/3rdparty/Sabre/DAV/Exception/InvalidResourceType.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/3rdparty/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/Locked.php b/3rdparty/Sabre/DAV/Exception/Locked.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php b/3rdparty/Sabre/DAV/Exception/MethodNotAllowed.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php b/3rdparty/Sabre/DAV/Exception/NotAuthenticated.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/NotFound.php b/3rdparty/Sabre/DAV/Exception/NotFound.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/NotImplemented.php b/3rdparty/Sabre/DAV/Exception/NotImplemented.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/PaymentRequired.php b/3rdparty/Sabre/DAV/Exception/PaymentRequired.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/PreconditionFailed.php b/3rdparty/Sabre/DAV/Exception/PreconditionFailed.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php b/3rdparty/Sabre/DAV/Exception/ReportNotImplemented.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/3rdparty/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php b/3rdparty/Sabre/DAV/Exception/UnsupportedMediaType.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FS/Directory.php b/3rdparty/Sabre/DAV/FS/Directory.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FS/File.php b/3rdparty/Sabre/DAV/FS/File.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FS/Node.php b/3rdparty/Sabre/DAV/FS/Node.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FSExt/Directory.php b/3rdparty/Sabre/DAV/FSExt/Directory.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FSExt/File.php b/3rdparty/Sabre/DAV/FSExt/File.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/FSExt/Node.php b/3rdparty/Sabre/DAV/FSExt/Node.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/File.php b/3rdparty/Sabre/DAV/File.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/ICollection.php b/3rdparty/Sabre/DAV/ICollection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/IExtendedCollection.php b/3rdparty/Sabre/DAV/IExtendedCollection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/IFile.php b/3rdparty/Sabre/DAV/IFile.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/INode.php b/3rdparty/Sabre/DAV/INode.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/IProperties.php b/3rdparty/Sabre/DAV/IProperties.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/IQuota.php b/3rdparty/Sabre/DAV/IQuota.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/Abstract.php b/3rdparty/Sabre/DAV/Locks/Backend/Abstract.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/FS.php b/3rdparty/Sabre/DAV/Locks/Backend/FS.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/File.php b/3rdparty/Sabre/DAV/Locks/Backend/File.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/Backend/PDO.php b/3rdparty/Sabre/DAV/Locks/Backend/PDO.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/LockInfo.php b/3rdparty/Sabre/DAV/Locks/LockInfo.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Locks/Plugin.php b/3rdparty/Sabre/DAV/Locks/Plugin.php old mode 100644 new mode 100755 index fd956950b8a..035b3a63863 --- a/3rdparty/Sabre/DAV/Locks/Plugin.php +++ b/3rdparty/Sabre/DAV/Locks/Plugin.php @@ -292,7 +292,10 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin { $this->server->tree->getNodeForPath($uri); // We need to call the beforeWriteContent event for RFC3744 - $this->server->broadcastEvent('beforeWriteContent',array($uri)); + // Edit: looks like this is not used, and causing problems now. + // + // See Issue 222 + // $this->server->broadcastEvent('beforeWriteContent',array($uri)); } catch (Sabre_DAV_Exception_NotFound $e) { diff --git a/3rdparty/Sabre/DAV/Mount/Plugin.php b/3rdparty/Sabre/DAV/Mount/Plugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Node.php b/3rdparty/Sabre/DAV/Node.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/ObjectTree.php b/3rdparty/Sabre/DAV/ObjectTree.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property.php b/3rdparty/Sabre/DAV/Property.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/GetLastModified.php b/3rdparty/Sabre/DAV/Property/GetLastModified.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/Href.php b/3rdparty/Sabre/DAV/Property/Href.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/HrefList.php b/3rdparty/Sabre/DAV/Property/HrefList.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/IHref.php b/3rdparty/Sabre/DAV/Property/IHref.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/LockDiscovery.php b/3rdparty/Sabre/DAV/Property/LockDiscovery.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/ResourceType.php b/3rdparty/Sabre/DAV/Property/ResourceType.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/Response.php b/3rdparty/Sabre/DAV/Property/Response.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/ResponseList.php b/3rdparty/Sabre/DAV/Property/ResponseList.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/SupportedLock.php b/3rdparty/Sabre/DAV/Property/SupportedLock.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Property/SupportedReportSet.php b/3rdparty/Sabre/DAV/Property/SupportedReportSet.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Server.php b/3rdparty/Sabre/DAV/Server.php old mode 100644 new mode 100755 index 50b190e8fab..0dfac8b0c71 --- a/3rdparty/Sabre/DAV/Server.php +++ b/3rdparty/Sabre/DAV/Server.php @@ -215,7 +215,7 @@ class Sabre_DAV_Server { $DOM->appendChild($error); $error->appendChild($DOM->createElement('s:exception',get_class($e))); - $error->appendChild($DOM->createElement('s:message',htmlentities($e->getMessage()))); + $error->appendChild($DOM->createElement('s:message',$e->getMessage())); if ($this->debugExceptions) { $error->appendChild($DOM->createElement('s:file',$e->getFile())); $error->appendChild($DOM->createElement('s:line',$e->getLine())); @@ -1784,7 +1784,14 @@ class Sabre_DAV_Server { $etag = $node->getETag(); if ($etag===$ifMatchItem) { $haveMatch = true; + } else { + // Evolution has a bug where it sometimes prepends the " + // with a \. This is our workaround. + if (str_replace('\\"','"', $ifMatchItem) === $etag) { + $haveMatch = true; + } } + } if (!$haveMatch) { throw new Sabre_DAV_Exception_PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match'); diff --git a/3rdparty/Sabre/DAV/ServerPlugin.php b/3rdparty/Sabre/DAV/ServerPlugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/SimpleCollection.php b/3rdparty/Sabre/DAV/SimpleCollection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/SimpleDirectory.php b/3rdparty/Sabre/DAV/SimpleDirectory.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/SimpleFile.php b/3rdparty/Sabre/DAV/SimpleFile.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/StringUtil.php b/3rdparty/Sabre/DAV/StringUtil.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php b/3rdparty/Sabre/DAV/TemporaryFileFilterPlugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Tree.php b/3rdparty/Sabre/DAV/Tree.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Tree/Filesystem.php b/3rdparty/Sabre/DAV/Tree/Filesystem.php old mode 100644 new mode 100755 index 85a9ee317be..40580ae366f --- a/3rdparty/Sabre/DAV/Tree/Filesystem.php +++ b/3rdparty/Sabre/DAV/Tree/Filesystem.php @@ -42,9 +42,9 @@ class Sabre_DAV_Tree_Filesystem extends Sabre_DAV_Tree { $realPath = $this->getRealPath($path); if (!file_exists($realPath)) throw new Sabre_DAV_Exception_NotFound('File at location ' . $realPath . ' not found'); if (is_dir($realPath)) { - return new Sabre_DAV_FS_Directory($path); + return new Sabre_DAV_FS_Directory($realPath); } else { - return new Sabre_DAV_FS_File($path); + return new Sabre_DAV_FS_File($realPath); } } diff --git a/3rdparty/Sabre/DAV/URLUtil.php b/3rdparty/Sabre/DAV/URLUtil.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/UUIDUtil.php b/3rdparty/Sabre/DAV/UUIDUtil.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/Version.php b/3rdparty/Sabre/DAV/Version.php old mode 100644 new mode 100755 index 5e5d15e4039..274646240ab --- a/3rdparty/Sabre/DAV/Version.php +++ b/3rdparty/Sabre/DAV/Version.php @@ -14,7 +14,7 @@ class Sabre_DAV_Version { /** * Full version number */ - const VERSION = '1.6.2'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/DAV/XMLUtil.php b/3rdparty/Sabre/DAV/XMLUtil.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAV/includes.php b/3rdparty/Sabre/DAV/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php b/3rdparty/Sabre/DAVACL/AbstractPrincipalCollection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Exception/AceConflict.php b/3rdparty/Sabre/DAVACL/Exception/AceConflict.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php b/3rdparty/Sabre/DAVACL/Exception/NeedPrivileges.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php b/3rdparty/Sabre/DAVACL/Exception/NoAbstract.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/3rdparty/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/3rdparty/Sabre/DAVACL/Exception/NotSupportedPrivilege.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/IACL.php b/3rdparty/Sabre/DAVACL/IACL.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/IPrincipal.php b/3rdparty/Sabre/DAVACL/IPrincipal.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/IPrincipalBackend.php b/3rdparty/Sabre/DAVACL/IPrincipalBackend.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Plugin.php b/3rdparty/Sabre/DAVACL/Plugin.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Principal.php b/3rdparty/Sabre/DAVACL/Principal.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php b/3rdparty/Sabre/DAVACL/PrincipalBackend/PDO.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/PrincipalCollection.php b/3rdparty/Sabre/DAVACL/PrincipalCollection.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Property/Acl.php b/3rdparty/Sabre/DAVACL/Property/Acl.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php b/3rdparty/Sabre/DAVACL/Property/AclRestrictions.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Property/Principal.php b/3rdparty/Sabre/DAVACL/Property/Principal.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/3rdparty/Sabre/DAVACL/Property/SupportedPrivilegeSet.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/Version.php b/3rdparty/Sabre/DAVACL/Version.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/DAVACL/includes.php b/3rdparty/Sabre/DAVACL/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/AWSAuth.php b/3rdparty/Sabre/HTTP/AWSAuth.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/AbstractAuth.php b/3rdparty/Sabre/HTTP/AbstractAuth.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php old mode 100644 new mode 100755 index a747cc6a31b..f90ed24f5d8 --- a/3rdparty/Sabre/HTTP/BasicAuth.php +++ b/3rdparty/Sabre/HTTP/BasicAuth.php @@ -46,7 +46,7 @@ class Sabre_HTTP_BasicAuth extends Sabre_HTTP_AbstractAuth { if (strpos(strtolower($auth),'basic')!==0) return false; - return explode(':', base64_decode(substr($auth, 6))); + return explode(':', base64_decode(substr($auth, 6)),2); } diff --git a/3rdparty/Sabre/HTTP/DigestAuth.php b/3rdparty/Sabre/HTTP/DigestAuth.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/Request.php b/3rdparty/Sabre/HTTP/Request.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/Response.php b/3rdparty/Sabre/HTTP/Response.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/Util.php b/3rdparty/Sabre/HTTP/Util.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php old mode 100644 new mode 100755 index 23dc7f8a7a1..e6b4f7e5358 --- a/3rdparty/Sabre/HTTP/Version.php +++ b/3rdparty/Sabre/HTTP/Version.php @@ -14,7 +14,7 @@ class Sabre_HTTP_Version { /** * Full version number */ - const VERSION = '1.6.2'; + const VERSION = '1.6.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/HTTP/includes.php b/3rdparty/Sabre/HTTP/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Component.php b/3rdparty/Sabre/VObject/Component.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Component/VAlarm.php b/3rdparty/Sabre/VObject/Component/VAlarm.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Component/VCalendar.php b/3rdparty/Sabre/VObject/Component/VCalendar.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Component/VEvent.php b/3rdparty/Sabre/VObject/Component/VEvent.php old mode 100644 new mode 100755 index 4cc1e36d7d6..d6b910874d0 --- a/3rdparty/Sabre/VObject/Component/VEvent.php +++ b/3rdparty/Sabre/VObject/Component/VEvent.php @@ -42,14 +42,15 @@ class Sabre_VObject_Component_VEvent extends Sabre_VObject_Component { $effectiveStart = $this->DTSTART->getDateTime(); if (isset($this->DTEND)) { + + // The DTEND property is considered non inclusive. So for a 3 day + // event in july, dtstart and dtend would have to be July 1st and + // July 4th respectively. + // + // See: + // http://tools.ietf.org/html/rfc5545#page-54 $effectiveEnd = $this->DTEND->getDateTime(); - // If this was an all-day event, we should just increase the - // end-date by 1. Otherwise the event will last until the second - // the date changed, by increasing this by 1 day the event lasts - // all of the last day as well. - if ($this->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE) { - $effectiveEnd->modify('+1 day'); - } + } elseif (isset($this->DURATION)) { $effectiveEnd = clone $effectiveStart; $effectiveEnd->add( Sabre_VObject_DateTimeParser::parseDuration($this->DURATION) ); diff --git a/3rdparty/Sabre/VObject/Component/VJournal.php b/3rdparty/Sabre/VObject/Component/VJournal.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Component/VTodo.php b/3rdparty/Sabre/VObject/Component/VTodo.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/DateTimeParser.php b/3rdparty/Sabre/VObject/DateTimeParser.php old mode 100644 new mode 100755 index 1e2d54ef3a9..23a4bb69916 --- a/3rdparty/Sabre/VObject/DateTimeParser.php +++ b/3rdparty/Sabre/VObject/DateTimeParser.php @@ -125,6 +125,9 @@ class Sabre_VObject_DateTimeParser { } + if ($duration==='P') { + $duration = 'PT0S'; + } $iv = new DateInterval($duration); if ($invert) $iv->invert = true; @@ -150,6 +153,7 @@ class Sabre_VObject_DateTimeParser { } $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur); + if ($newDur === '+') { $newDur = '+0 seconds'; }; return $newDur; } diff --git a/3rdparty/Sabre/VObject/Element.php b/3rdparty/Sabre/VObject/Element.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Element/DateTime.php b/3rdparty/Sabre/VObject/Element/DateTime.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Element/MultiDateTime.php b/3rdparty/Sabre/VObject/Element/MultiDateTime.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/ElementList.php b/3rdparty/Sabre/VObject/ElementList.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/FreeBusyGenerator.php b/3rdparty/Sabre/VObject/FreeBusyGenerator.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Node.php b/3rdparty/Sabre/VObject/Node.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Parameter.php b/3rdparty/Sabre/VObject/Parameter.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/ParseException.php b/3rdparty/Sabre/VObject/ParseException.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Property.php b/3rdparty/Sabre/VObject/Property.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Property/DateTime.php b/3rdparty/Sabre/VObject/Property/DateTime.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Property/MultiDateTime.php b/3rdparty/Sabre/VObject/Property/MultiDateTime.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/Reader.php b/3rdparty/Sabre/VObject/Reader.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/RecurrenceIterator.php b/3rdparty/Sabre/VObject/RecurrenceIterator.php old mode 100644 new mode 100755 index 833aa091ab7..740270dd8f0 --- a/3rdparty/Sabre/VObject/RecurrenceIterator.php +++ b/3rdparty/Sabre/VObject/RecurrenceIterator.php @@ -337,6 +337,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { $this->endDate = clone $this->startDate; if (isset($this->baseEvent->DURATION)) { $this->endDate->add(Sabre_VObject_DateTimeParser::parse($this->baseEvent->DURATION->value)); + } elseif ($this->baseEvent->DTSTART->getDateType()===Sabre_VObject_Property_DateTime::DATE) { + $this->endDate->modify('+1 day'); } } $this->currentDate = clone $this->startDate; @@ -561,7 +563,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { */ public function fastForward(DateTime $dt) { - while($this->valid() && $this->getDTEnd() < $dt) { + while($this->valid() && $this->getDTEnd() <= $dt) { $this->next(); } @@ -823,9 +825,40 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { */ protected function nextYearly() { + $currentMonth = $this->currentDate->format('n'); + $currentYear = $this->currentDate->format('Y'); + $currentDayOfMonth = $this->currentDate->format('j'); + + // No sub-rules, so we just advance by year if (!$this->byMonth) { + + // Unless it was a leap day! + if ($currentMonth==2 && $currentDayOfMonth==29) { + + $counter = 0; + do { + $counter++; + // Here we increase the year count by the interval, until + // we hit a date that's also in a leap year. + // + // We could just find the next interval that's dividable by + // 4, but that would ignore the rule that there's no leap + // year every year that's dividable by a 100, but not by + // 400. (1800, 1900, 2100). So we just rely on the datetime + // functions instead. + $nextDate = clone $this->currentDate; + $nextDate->modify('+ ' . ($this->interval*$counter) . ' years'); + } while ($nextDate->format('n')!=2); + $this->currentDate = $nextDate; + + return; + + } + + // The easiest form $this->currentDate->modify('+' . $this->interval . ' years'); return; + } $currentMonth = $this->currentDate->format('n'); @@ -877,8 +910,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } else { - // no byDay or byMonthDay, so we can just loop through the - // months. + // These are the 'byMonth' rules, if there are no byDay or + // byMonthDay sub-rules. do { $currentMonth++; @@ -888,6 +921,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator { } } while (!in_array($currentMonth, $this->byMonth)); $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth); + return; } diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php old mode 100644 new mode 100755 index 00110febc07..9ee03d87118 --- a/3rdparty/Sabre/VObject/Version.php +++ b/3rdparty/Sabre/VObject/Version.php @@ -14,7 +14,7 @@ class Sabre_VObject_Version { /** * Full version number */ - const VERSION = '1.3.2'; + const VERSION = '1.3.4'; /** * Stability : alpha, beta, stable diff --git a/3rdparty/Sabre/VObject/WindowsTimezoneMap.php b/3rdparty/Sabre/VObject/WindowsTimezoneMap.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/VObject/includes.php b/3rdparty/Sabre/VObject/includes.php old mode 100644 new mode 100755 diff --git a/3rdparty/Sabre/autoload.php b/3rdparty/Sabre/autoload.php old mode 100644 new mode 100755 diff --git a/3rdparty/class.phpmailer.php b/3rdparty/class.phpmailer.php index 4589cd791e9..af089d59789 100644 --- a/3rdparty/class.phpmailer.php +++ b/3rdparty/class.phpmailer.php @@ -2,7 +2,7 @@ /*~ class.phpmailer.php .---------------------------------------------------------------------------. | Software: PHPMailer - PHP email class | -| Version: 5.2 | +| Version: 5.2.1 | | Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ | | ------------------------------------------------------------------------- | | Admin: Jim Jagielski (project admininistrator) | @@ -10,7 +10,7 @@ | : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | | : Jim Jagielski (jimjag) jimjag@gmail.com | | Founder: Brent R. Matzelle (original founder) | -| Copyright (c) 2010-2011, Jim Jagielski. All Rights Reserved. | +| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. | | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | | Copyright (c) 2001-2003, Brent R. Matzelle | | ------------------------------------------------------------------------- | @@ -29,7 +29,7 @@ * @author Andy Prevost * @author Marcus Bointon * @author Jim Jagielski - * @copyright 2010 - 2011 Jim Jagielski + * @copyright 2010 - 2012 Jim Jagielski * @copyright 2004 - 2009 Andy Prevost * @version $Id: class.phpmailer.php 450 2010-06-23 16:46:33Z coolbru $ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License @@ -129,6 +129,13 @@ class PHPMailer { */ protected $MIMEHeader = ''; + /** + * Stores the complete sent MIME message (Body and Headers) + * @var string + * @access protected + */ + protected $SentMIMEMessage = ''; + /** * Sets word wrapping on the body of the message to a given number of * characters. @@ -317,7 +324,7 @@ class PHPMailer { * Sets the PHPMailer Version number * @var string */ - public $Version = '5.2'; + public $Version = '5.2.1'; /** * What to use in the X-Mailer header @@ -460,7 +467,7 @@ class PHPMailer { * @return boolean */ public function AddReplyTo($address, $name = '') { - return $this->AddAnAddress('ReplyTo', $address, $name); + return $this->AddAnAddress('Reply-To', $address, $name); } /** @@ -473,12 +480,14 @@ class PHPMailer { * @access protected */ protected function AddAnAddress($kind, $address, $name = '') { - if (!preg_match('/^(to|cc|bcc|ReplyTo)$/', $kind)) { + if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) { $this->SetError($this->Lang('Invalid recipient array').': '.$kind); if ($this->exceptions) { throw new phpmailerException('Invalid recipient array: ' . $kind); } - echo $this->Lang('Invalid recipient array').': '.$kind; + if ($this->SMTPDebug) { + echo $this->Lang('Invalid recipient array').': '.$kind; + } return false; } $address = trim($address); @@ -488,10 +497,12 @@ class PHPMailer { if ($this->exceptions) { throw new phpmailerException($this->Lang('invalid_address').': '.$address); } - echo $this->Lang('invalid_address').': '.$address; + if ($this->SMTPDebug) { + echo $this->Lang('invalid_address').': '.$address; + } return false; } - if ($kind != 'ReplyTo') { + if ($kind != 'Reply-To') { if (!isset($this->all_recipients[strtolower($address)])) { array_push($this->$kind, array($address, $name)); $this->all_recipients[strtolower($address)] = true; @@ -520,14 +531,16 @@ class PHPMailer { if ($this->exceptions) { throw new phpmailerException($this->Lang('invalid_address').': '.$address); } - echo $this->Lang('invalid_address').': '.$address; + if ($this->SMTPDebug) { + echo $this->Lang('invalid_address').': '.$address; + } return false; } $this->From = $address; $this->FromName = $name; if ($auto) { if (empty($this->ReplyTo)) { - $this->AddAnAddress('ReplyTo', $address, $name); + $this->AddAnAddress('Reply-To', $address, $name); } if (empty($this->Sender)) { $this->Sender = $address; @@ -574,6 +587,7 @@ class PHPMailer { if(!$this->PreSend()) return false; return $this->PostSend(); } catch (phpmailerException $e) { + $this->SentMIMEMessage = ''; $this->SetError($e->getMessage()); if ($this->exceptions) { throw $e; @@ -584,6 +598,7 @@ class PHPMailer { protected function PreSend() { try { + $mailHeader = ""; if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { throw new phpmailerException($this->Lang('provide_address'), self::STOP_CRITICAL); } @@ -603,6 +618,19 @@ class PHPMailer { $this->MIMEHeader = $this->CreateHeader(); $this->MIMEBody = $this->CreateBody(); + // To capture the complete message when using mail(), create + // an extra header list which CreateHeader() doesn't fold in + if ($this->Mailer == 'mail') { + if (count($this->to) > 0) { + $mailHeader .= $this->AddrAppend("To", $this->to); + } else { + $mailHeader .= $this->HeaderLine("To", "undisclosed-recipients:;"); + } + $mailHeader .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader(trim($this->Subject)))); + // if(count($this->cc) > 0) { + // $mailHeader .= $this->AddrAppend("Cc", $this->cc); + // } + } // digitally sign with DKIM if enabled if ($this->DKIM_domain && $this->DKIM_private) { @@ -610,7 +638,9 @@ class PHPMailer { $this->MIMEHeader = str_replace("\r\n", "\n", $header_dkim) . $this->MIMEHeader; } + $this->SentMIMEMessage = sprintf("%s%s\r\n\r\n%s",$this->MIMEHeader,$mailHeader,$this->MIMEBody); return true; + } catch (phpmailerException $e) { $this->SetError($e->getMessage()); if ($this->exceptions) { @@ -628,6 +658,8 @@ class PHPMailer { return $this->SendmailSend($this->MIMEHeader, $this->MIMEBody); case 'smtp': return $this->SmtpSend($this->MIMEHeader, $this->MIMEBody); + case 'mail': + return $this->MailSend($this->MIMEHeader, $this->MIMEBody); default: return $this->MailSend($this->MIMEHeader, $this->MIMEBody); } @@ -637,7 +669,9 @@ class PHPMailer { if ($this->exceptions) { throw $e; } - echo $e->getMessage()."\n"; + if ($this->SMTPDebug) { + echo $e->getMessage()."\n"; + } return false; } } @@ -703,7 +737,7 @@ class PHPMailer { $to = implode(', ', $toArr); if (empty($this->Sender)) { - $params = "-oi -f %s"; + $params = "-oi "; } else { $params = sprintf("-oi -f %s", $this->Sender); } @@ -732,7 +766,7 @@ class PHPMailer { $this->doCallback($isSent, $val, $this->cc, $this->bcc, $this->Subject, $body); } } else { - $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); // implement call back function if it exists $isSent = ($rt == 1) ? 1 : 0; $this->doCallback($isSent, $to, $this->cc, $this->bcc, $this->Subject, $body); @@ -880,7 +914,9 @@ class PHPMailer { } } catch (phpmailerException $e) { $this->smtp->Reset(); - throw $e; + if ($this->exceptions) { + throw $e; + } } return true; } @@ -1159,7 +1195,7 @@ class PHPMailer { $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); } } - } + } $from = array(); $from[0][0] = trim($this->From); @@ -1177,7 +1213,7 @@ class PHPMailer { } if(count($this->ReplyTo) > 0) { - $result .= $this->AddrAppend('Reply-to', $this->ReplyTo); + $result .= $this->AddrAppend('Reply-To', $this->ReplyTo); } // mail() sets the subject itself @@ -1250,6 +1286,16 @@ class PHPMailer { return $result; } + /** + * Returns the MIME message (headers and body). Only really valid post PreSend(). + * @access public + * @return string + */ + public function GetSentMIMEMessage() { + return $this->SentMIMEMessage; + } + + /** * Assembles the message body. Returns an empty string on failure. * @access public @@ -1363,8 +1409,8 @@ class PHPMailer { $signed = tempnam("", "signed"); if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), NULL)) { @unlink($file); - @unlink($signed); $body = file_get_contents($signed); + @unlink($signed); } else { @unlink($file); @unlink($signed); @@ -1487,7 +1533,9 @@ class PHPMailer { if ($this->exceptions) { throw $e; } - echo $e->getMessage()."\n"; + if ($this->SMTPDebug) { + echo $e->getMessage()."\n"; + } if ( $e->getCode() == self::STOP_CRITICAL ) { return false; } @@ -1590,15 +1638,23 @@ class PHPMailer { return false; } } - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $magic_quotes = get_magic_quotes_runtime(); - set_magic_quotes_runtime(0); - } + $magic_quotes = get_magic_quotes_runtime(); + if ($magic_quotes) { + if (version_compare(PHP_VERSION, '5.3.0', '<')) { + set_magic_quotes_runtime(0); + } else { + ini_set('magic_quotes_runtime', 0); + } + } $file_buffer = file_get_contents($path); $file_buffer = $this->EncodeString($file_buffer, $encoding); - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime($magic_quotes); - } + if ($magic_quotes) { + if (version_compare(PHP_VERSION, '5.3.0', '<')) { + set_magic_quotes_runtime($magic_quotes); + } else { + ini_set('magic_quotes_runtime', $magic_quotes); + } + } return $file_buffer; } catch (Exception $e) { $this->SetError($e->getMessage()); @@ -2154,7 +2210,7 @@ class PHPMailer { * @return $message */ public function MsgHTML($message, $basedir = '') { - preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); + preg_match_all("/(src|background)=[\"'](.*)[\"']/Ui", $message, $images); if(isset($images[2])) { foreach($images[2] as $i => $url) { // do not change urls for absolute images (thanks to corvuscorax) @@ -2168,20 +2224,23 @@ class PHPMailer { if ( strlen($basedir) > 1 && substr($basedir, -1) != '/') { $basedir .= '/'; } if ( strlen($directory) > 1 && substr($directory, -1) != '/') { $directory .= '/'; } if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64', $mimeType) ) { - $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); + $message = preg_replace("/".$images[1][$i]."=[\"']".preg_quote($url, '/')."[\"']/Ui", $images[1][$i]."=\"".$cid."\"", $message); } } } } $this->IsHTML(true); $this->Body = $message; - $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s', '', $message))); - if (!empty($textMsg) && empty($this->AltBody)) { - $this->AltBody = html_entity_decode($textMsg); - } + if (empty($this->AltBody)) { + $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s', '', $message))); + if (!empty($textMsg)) { + $this->AltBody = html_entity_decode($textMsg, ENT_QUOTES, $this->CharSet); + } + } if (empty($this->AltBody)) { $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . "\n\n"; } + return $message; } /** diff --git a/3rdparty/class.smtp.php b/3rdparty/class.smtp.php index 07c275936cf..6977bffad14 100644 --- a/3rdparty/class.smtp.php +++ b/3rdparty/class.smtp.php @@ -2,7 +2,7 @@ /*~ class.smtp.php .---------------------------------------------------------------------------. | Software: PHPMailer - PHP email class | -| Version: 5.2 | +| Version: 5.2.1 | | Site: https://code.google.com/a/apache-extras.org/p/phpmailer/ | | ------------------------------------------------------------------------- | | Admin: Jim Jagielski (project admininistrator) | @@ -10,7 +10,7 @@ | : Marcus Bointon (coolbru) coolbru@users.sourceforge.net | | : Jim Jagielski (jimjag) jimjag@gmail.com | | Founder: Brent R. Matzelle (original founder) | -| Copyright (c) 2010-2011, Jim Jagielski. All Rights Reserved. | +| Copyright (c) 2010-2012, Jim Jagielski. All Rights Reserved. | | Copyright (c) 2004-2009, Andy Prevost. All Rights Reserved. | | Copyright (c) 2001-2003, Brent R. Matzelle | | ------------------------------------------------------------------------- | @@ -30,7 +30,7 @@ * @author Marcus Bointon * @copyright 2004 - 2008 Andy Prevost * @author Jim Jagielski - * @copyright 2010 - 2011 Jim Jagielski + * @copyright 2010 - 2012 Jim Jagielski * @license http://www.gnu.org/copyleft/lesser.html Distributed under the Lesser General Public License (LGPL) * @version $Id: class.smtp.php 450 2010-06-23 16:46:33Z coolbru $ */ @@ -72,7 +72,7 @@ class SMTP { * Sets the SMTP PHPMailer Version number * @var string */ - public $Version = '5.2'; + public $Version = '5.2.1'; ///////////////////////////////////////////////// // PROPERTIES, PRIVATE AND PROTECTED @@ -797,7 +797,8 @@ class SMTP { */ private function get_lines() { $data = ""; - while($str = @fgets($this->smtp_conn,515)) { + while(!feof($this->smtp_conn)) { + $str = @fgets($this->smtp_conn,515); if($this->do_debug >= 4) { echo "SMTP -> get_lines(): \$data was \"$data\"" . $this->CRLF . '
'; echo "SMTP -> get_lines(): \$str is \"$str\"" . $this->CRLF . '
'; diff --git a/3rdparty/css/chosen-sprite.png b/3rdparty/css/chosen-sprite.png old mode 100644 new mode 100755 index f20db4439ea..113dc9885a6 Binary files a/3rdparty/css/chosen-sprite.png and b/3rdparty/css/chosen-sprite.png differ diff --git a/3rdparty/css/chosen.css b/3rdparty/css/chosen.css old mode 100644 new mode 100755 index 96bae0fe95a..89b5970e57c --- a/3rdparty/css/chosen.css +++ b/3rdparty/css/chosen.css @@ -1,16 +1,10 @@ /* @group Base */ -select.chzn-select { - visibility: hidden; - height: 28px !important; - min-height: 28px !important; -} .chzn-container { font-size: 13px; position: relative; display: inline-block; zoom: 1; *display: inline; - vertical-align: bottom; } .chzn-container .chzn-drop { background: #fff; @@ -29,31 +23,37 @@ select.chzn-select { /* @group Single Chosen */ .chzn-container-single .chzn-single { - background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); - background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); - background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%); - -webkit-border-radius: 4px; - -moz-border-radius : 4px; - border-radius : 4px; + background-color: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + -webkit-border-radius: 5px; + -moz-border-radius : 5px; + border-radius : 5px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; - border: 1px solid #aaa; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); + -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); + box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); display: block; overflow: hidden; white-space: nowrap; position: relative; - height: 26px; - line-height: 26px; + height: 23px; + line-height: 24px; padding: 0 0 0 8px; - color: #444; + color: #444444; text-decoration: none; } +.chzn-container-single .chzn-default { + color: #999; +} .chzn-container-single .chzn-single span { margin-right: 26px; display: block; @@ -61,25 +61,22 @@ select.chzn-select { white-space: nowrap; -o-text-overflow: ellipsis; -ms-text-overflow: ellipsis; - -moz-binding: url('/xml/ellipsis.xml#ellipsis'); text-overflow: ellipsis; } +.chzn-container-single .chzn-single abbr { + display: block; + position: absolute; + right: 26px; + top: 6px; + width: 12px; + height: 13px; + font-size: 1px; + background: url(chosen-sprite.png) right top no-repeat; +} +.chzn-container-single .chzn-single abbr:hover { + background-position: right -11px; +} .chzn-container-single .chzn-single div { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius : 0 4px 4px 0; - border-radius : 0 4px 4px 0; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; - background: #ccc; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); - background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); - background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%); - border-left: 1px solid #aaa; position: absolute; right: 0; top: 0; @@ -88,25 +85,26 @@ select.chzn-select { width: 18px; } .chzn-container-single .chzn-single div b { - background: url('chosen-sprite.png') no-repeat 0 1px; + background: url('chosen-sprite.png') no-repeat 0 0; display: block; width: 100%; height: 100%; } .chzn-container-single .chzn-search { padding: 3px 4px; + position: relative; margin: 0; white-space: nowrap; + z-index: 1010; } .chzn-container-single .chzn-search input { - background: #fff url('chosen-sprite.png') no-repeat 100% -20px; - background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: #fff url('chosen-sprite.png') no-repeat 100% -22px; + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); margin: 1px 0; padding: 4px 20px 4px 5px; outline: 0; @@ -124,16 +122,20 @@ select.chzn-select { } /* @end */ +.chzn-container-single-nosearch .chzn-search input { + position: absolute; + left: -9000px; +} + /* @group Multi Chosen */ .chzn-container-multi .chzn-choices { background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); border: 1px solid #aaa; margin: 0; padding: 0; @@ -156,6 +158,9 @@ select.chzn-select { color: #666; background: transparent !important; border: 0 !important; + font-family: sans-serif; + font-size: 100%; + height: 15px; padding: 5px; margin: 1px 0; outline: 0; @@ -175,21 +180,22 @@ select.chzn-select { -webkit-background-clip: padding-box; background-clip : padding-box; background-color: #e4e4e4; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); color: #333; - border: 1px solid #b4b4b4; + border: 1px solid #aaaaaa; line-height: 13px; - padding: 3px 19px 3px 6px; + padding: 3px 20px 3px 5px; margin: 3px 0 3px 5px; position: relative; -} -.chzn-container-multi .chzn-choices .search-choice span { cursor: default; } .chzn-container-multi .chzn-choices .search-choice-focus { @@ -198,25 +204,25 @@ select.chzn-select { .chzn-container-multi .chzn-choices .search-choice .search-choice-close { display: block; position: absolute; - right: 5px; - top: 6px; - width: 8px; - height: 9px; + right: 3px; + top: 4px; + width: 12px; + height: 13px; font-size: 1px; background: url(chosen-sprite.png) right top no-repeat; } .chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover { - background-position: right -9px; + background-position: right -11px; } .chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close { - background-position: right -9px; + background-position: right -11px; } /* @end */ /* @group Results */ .chzn-container .chzn-results { margin: 0 4px 4px 0; - max-height: 190px; + max-height: 240px; padding: 0 0 0 4px; position: relative; overflow-x: hidden; @@ -227,16 +233,25 @@ select.chzn-select { padding: 0; } .chzn-container .chzn-results li { - line-height: 80%; - padding: 7px 7px 8px; + display: none; + line-height: 15px; + padding: 5px 6px; margin: 0; list-style: none; } .chzn-container .chzn-results .active-result { cursor: pointer; + display: list-item; } .chzn-container .chzn-results .highlighted { - background: #3875d7; + background-color: #3875d7; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%); color: #fff; } .chzn-container .chzn-results li em { @@ -248,6 +263,7 @@ select.chzn-select { } .chzn-container .chzn-results .no-results { background: #f4f4f4; + display: list-item; } .chzn-container .chzn-results .group-result { cursor: default; @@ -255,11 +271,34 @@ select.chzn-select { font-weight: bold; } .chzn-container .chzn-results .group-option { - padding-left: 20px; + padding-left: 15px; } .chzn-container-multi .chzn-drop .result-selected { display: none; } +.chzn-container .chzn-results-scroll { + background: white; + margin: 0 4px; + position: absolute; + text-align: center; + width: 321px; /* This should by dynamic with js */ + z-index: 1; +} +.chzn-container .chzn-results-scroll span { + display: inline-block; + height: 17px; + text-indent: -5000px; + width: 9px; +} +.chzn-container .chzn-results-scroll-down { + bottom: 0; +} +.chzn-container .chzn-results-scroll-down span { + background: url('chosen-sprite.png') no-repeat -4px -3px; +} +.chzn-container .chzn-results-scroll-up span { + background: url('chosen-sprite.png') no-repeat -22px -3px; +} /* @end */ /* @group Active */ @@ -277,13 +316,13 @@ select.chzn-select { -o-box-shadow : 0 1px 0 #fff inset; box-shadow : 0 1px 0 #fff inset; background-color: #eee; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); - background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%); -webkit-border-bottom-left-radius : 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomleft : 0; @@ -310,32 +349,44 @@ select.chzn-select { } /* @end */ +/* @group Disabled Support */ +.chzn-disabled { + cursor: default; + opacity:0.5 !important; +} +.chzn-disabled .chzn-single { + cursor: default; +} +.chzn-disabled .chzn-choices .search-choice .search-choice-close { + cursor: default; +} + /* @group Right to Left */ -.chzn-rtl { direction:rtl;text-align: right; } -.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; } -.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; } -.chzn-rtl .chzn-single div { - left: 0; right: auto; - border-left: none; border-right: 1px solid #aaaaaa; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius : 4px 0 0 4px; - border-radius : 4px 0 0 4px; +.chzn-rtl { text-align: right; } +.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; } +.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; } + +.chzn-rtl .chzn-single div { left: 3px; right: auto; } +.chzn-rtl .chzn-single abbr { + left: 26px; + right: auto; } +.chzn-rtl .chzn-choices .search-field input { direction: rtl; } .chzn-rtl .chzn-choices li { float: right; } -.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; } -.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;} -.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; } -.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; } +.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; } +.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;} +.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; } +.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; } .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; } .chzn-rtl .chzn-search input { - background: url('chosen-sprite.png') no-repeat -38px -20px, #ffffff; - background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: #fff url('chosen-sprite.png') no-repeat -38px -22px; + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); padding: 4px 5px 4px 20px; + direction: rtl; } -/* @end */ \ No newline at end of file +/* @end */ diff --git a/3rdparty/css/chosen/chosen.css b/3rdparty/css/chosen/chosen.css old mode 100644 new mode 100755 index b9c6d88028f..89b5970e57c --- a/3rdparty/css/chosen/chosen.css +++ b/3rdparty/css/chosen/chosen.css @@ -23,31 +23,37 @@ /* @group Single Chosen */ .chzn-container-single .chzn-single { - background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white)); - background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%); - background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 ); - background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%); - -webkit-border-radius: 4px; - -moz-border-radius : 4px; - border-radius : 4px; + background-color: #ffffff; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background-image: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: -ms-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-image: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + -webkit-border-radius: 5px; + -moz-border-radius : 5px; + border-radius : 5px; -moz-background-clip : padding; -webkit-background-clip: padding-box; background-clip : padding-box; - border: 1px solid #aaa; + border: 1px solid #aaaaaa; + -webkit-box-shadow: 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); + -moz-box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); + box-shadow : 0 0 3px #ffffff inset, 0 1px 1px rgba(0,0,0,0.1); display: block; overflow: hidden; white-space: nowrap; position: relative; - height: 26px; - line-height: 26px; + height: 23px; + line-height: 24px; padding: 0 0 0 8px; - color: #444; + color: #444444; text-decoration: none; } +.chzn-container-single .chzn-default { + color: #999; +} .chzn-container-single .chzn-single span { margin-right: 26px; display: block; @@ -61,7 +67,7 @@ display: block; position: absolute; right: 26px; - top: 8px; + top: 6px; width: 12px; height: 13px; font-size: 1px; @@ -71,21 +77,6 @@ background-position: right -11px; } .chzn-container-single .chzn-single div { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius : 0 4px 4px 0; - border-radius : 0 4px 4px 0; - -moz-background-clip : padding; - -webkit-background-clip: padding-box; - background-clip : padding-box; - background: #ccc; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); - background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); - background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%); - background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%); - border-left: 1px solid #aaa; position: absolute; right: 0; top: 0; @@ -94,7 +85,7 @@ width: 18px; } .chzn-container-single .chzn-single div b { - background: url('chosen-sprite.png') no-repeat 0 1px; + background: url('chosen-sprite.png') no-repeat 0 0; display: block; width: 100%; height: 100%; @@ -104,16 +95,16 @@ position: relative; margin: 0; white-space: nowrap; + z-index: 1010; } .chzn-container-single .chzn-search input { background: #fff url('chosen-sprite.png') no-repeat 100% -22px; - background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); margin: 1px 0; padding: 4px 20px 4px 5px; outline: 0; @@ -139,13 +130,12 @@ /* @group Multi Chosen */ .chzn-container-multi .chzn-choices { background-color: #fff; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background-image: linear-gradient(top, #eeeeee 1%, #ffffff 15%); border: 1px solid #aaa; margin: 0; padding: 0; @@ -168,6 +158,9 @@ color: #666; background: transparent !important; border: 0 !important; + font-family: sans-serif; + font-size: 100%; + height: 15px; padding: 5px; margin: 1px 0; outline: 0; @@ -187,21 +180,22 @@ -webkit-background-clip: padding-box; background-clip : padding-box; background-color: #e4e4e4; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%); - background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f4f4f4', endColorstr='#eeeeee', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -ms-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + -webkit-box-shadow: 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + -moz-box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); + box-shadow : 0 0 2px #ffffff inset, 0 1px 0 rgba(0,0,0,0.05); color: #333; - border: 1px solid #b4b4b4; + border: 1px solid #aaaaaa; line-height: 13px; - padding: 3px 19px 3px 6px; + padding: 3px 20px 3px 5px; margin: 3px 0 3px 5px; position: relative; -} -.chzn-container-multi .chzn-choices .search-choice span { cursor: default; } .chzn-container-multi .chzn-choices .search-choice-focus { @@ -228,7 +222,7 @@ /* @group Results */ .chzn-container .chzn-results { margin: 0 4px 4px 0; - max-height: 190px; + max-height: 240px; padding: 0 0 0 4px; position: relative; overflow-x: hidden; @@ -240,8 +234,8 @@ } .chzn-container .chzn-results li { display: none; - line-height: 80%; - padding: 7px 7px 8px; + line-height: 15px; + padding: 5px 6px; margin: 0; list-style: none; } @@ -250,7 +244,14 @@ display: list-item; } .chzn-container .chzn-results .highlighted { - background: #3875d7; + background-color: #3875d7; + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3875d7', endColorstr='#2a62bc', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: -ms-linear-gradient(top, #3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(top, #3875d7 20%, #2a62bc 90%); color: #fff; } .chzn-container .chzn-results li em { @@ -270,11 +271,34 @@ font-weight: bold; } .chzn-container .chzn-results .group-option { - padding-left: 20px; + padding-left: 15px; } .chzn-container-multi .chzn-drop .result-selected { display: none; } +.chzn-container .chzn-results-scroll { + background: white; + margin: 0 4px; + position: absolute; + text-align: center; + width: 321px; /* This should by dynamic with js */ + z-index: 1; +} +.chzn-container .chzn-results-scroll span { + display: inline-block; + height: 17px; + text-indent: -5000px; + width: 9px; +} +.chzn-container .chzn-results-scroll-down { + bottom: 0; +} +.chzn-container .chzn-results-scroll-down span { + background: url('chosen-sprite.png') no-repeat -4px -3px; +} +.chzn-container .chzn-results-scroll-up span { + background: url('chosen-sprite.png') no-repeat -22px -3px; +} /* @end */ /* @group Active */ @@ -292,13 +316,13 @@ -o-box-shadow : 0 1px 0 #fff inset; box-shadow : 0 1px 0 #fff inset; background-color: #eee; - background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee)); - background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%); - background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%); - background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 ); - background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 ); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #eeeeee), color-stop(80%, #ffffff)); + background-image: -webkit-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -moz-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -o-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: -ms-linear-gradient(top, #eeeeee 20%, #ffffff 80%); + background-image: linear-gradient(top, #eeeeee 20%, #ffffff 80%); -webkit-border-bottom-left-radius : 0; -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomleft : 0; @@ -338,31 +362,31 @@ } /* @group Right to Left */ -.chzn-rtl { direction:rtl;text-align: right; } -.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; } -.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; } -.chzn-rtl .chzn-single div { - left: 0; right: auto; - border-left: none; border-right: 1px solid #aaaaaa; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius : 4px 0 0 4px; - border-radius : 4px 0 0 4px; +.chzn-rtl { text-align: right; } +.chzn-rtl .chzn-single { padding: 0 8px 0 0; overflow: visible; } +.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; direction: rtl; } + +.chzn-rtl .chzn-single div { left: 3px; right: auto; } +.chzn-rtl .chzn-single abbr { + left: 26px; + right: auto; } +.chzn-rtl .chzn-choices .search-field input { direction: rtl; } .chzn-rtl .chzn-choices li { float: right; } -.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; } -.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;} -.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; } -.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; } +.chzn-rtl .chzn-choices .search-choice { padding: 3px 5px 3px 19px; margin: 3px 5px 3px 0; } +.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 4px; right: auto; background-position: right top;} +.chzn-rtl.chzn-container-single .chzn-results { margin: 0 0 4px 4px; padding: 0 4px 0 0; } +.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 15px; } .chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; } .chzn-rtl .chzn-search input { - background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff; - background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%); - background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%); + background: #fff url('chosen-sprite.png') no-repeat -38px -22px; + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eeeeee), color-stop(15%, #ffffff)); + background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #eeeeee 1%, #ffffff 15%); + background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #eeeeee 1%, #ffffff 15%); padding: 4px 5px 4px 20px; + direction: rtl; } -/* @end */ \ No newline at end of file +/* @end */ diff --git a/3rdparty/fullcalendar/css/fullcalendar.css b/3rdparty/fullcalendar/css/fullcalendar.css index 04f118493a4..1f02ba428ea 100644 --- a/3rdparty/fullcalendar/css/fullcalendar.css +++ b/3rdparty/fullcalendar/css/fullcalendar.css @@ -1,11 +1,11 @@ /* - * FullCalendar v1.5.3 Stylesheet + * FullCalendar v1.5.4 Stylesheet * * Copyright (c) 2011 Adam Shaw * Dual licensed under the MIT and GPL licenses, located in * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. * - * Date: Mon Feb 6 22:40:40 2012 -0800 + * Date: Tue Sep 4 23:38:33 2012 -0700 * */ diff --git a/3rdparty/fullcalendar/css/fullcalendar.print.css b/3rdparty/fullcalendar/css/fullcalendar.print.css index e11c1816373..227b80e0bca 100644 --- a/3rdparty/fullcalendar/css/fullcalendar.print.css +++ b/3rdparty/fullcalendar/css/fullcalendar.print.css @@ -1,5 +1,5 @@ /* - * FullCalendar v1.5.3 Print Stylesheet + * FullCalendar v1.5.4 Print Stylesheet * * Include this stylesheet on your page to get a more printer-friendly calendar. * When including this stylesheet, use the media='print' attribute of the tag. @@ -9,7 +9,7 @@ * Dual licensed under the MIT and GPL licenses, located in * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. * - * Date: Mon Feb 6 22:40:40 2012 -0800 + * Date: Tue Sep 4 23:38:33 2012 -0700 * */ diff --git a/3rdparty/fullcalendar/js/fullcalendar.js b/3rdparty/fullcalendar/js/fullcalendar.js index 314f8c8a1a5..d59de77c844 100644 --- a/3rdparty/fullcalendar/js/fullcalendar.js +++ b/3rdparty/fullcalendar/js/fullcalendar.js @@ -1,6 +1,6 @@ /** * @preserve - * FullCalendar v1.5.3 + * FullCalendar v1.5.4 * http://arshaw.com/fullcalendar/ * * Use fullcalendar.css for basic styling. @@ -11,7 +11,7 @@ * Dual licensed under the MIT and GPL licenses, located in * MIT-LICENSE.txt and GPL-LICENSE.txt respectively. * - * Date: Mon Feb 6 22:40:40 2012 -0800 + * Date: Tue Sep 4 23:38:33 2012 -0700 * */ @@ -111,7 +111,7 @@ var rtlDefaults = { -var fc = $.fullCalendar = { version: "1.5.3" }; +var fc = $.fullCalendar = { version: "1.5.4" }; var fcViews = fc.views = {}; @@ -1658,7 +1658,7 @@ function sliceSegs(events, visEventEnds, start, end) { msLength: segEnd - segStart }); } - } + } return segs.sort(segCmp); } @@ -1742,29 +1742,26 @@ function setOuterHeight(element, height, includeMargins) { } -// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010) - - function hsides(element, includeMargins) { return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0); } function hpadding(element) { - return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) + - (parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0); + return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) + + (parseFloat($.css(element[0], 'paddingRight', true)) || 0); } function hmargins(element) { - return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) + - (parseFloat($.curCSS(element[0], 'marginRight', true)) || 0); + return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) + + (parseFloat($.css(element[0], 'marginRight', true)) || 0); } function hborders(element) { - return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) + - (parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0); + return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) + + (parseFloat($.css(element[0], 'borderRightWidth', true)) || 0); } @@ -1774,20 +1771,20 @@ function vsides(element, includeMargins) { function vpadding(element) { - return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) + - (parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0); + return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) + + (parseFloat($.css(element[0], 'paddingBottom', true)) || 0); } function vmargins(element) { - return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) + - (parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0); + return (parseFloat($.css(element[0], 'marginTop', true)) || 0) + + (parseFloat($.css(element[0], 'marginBottom', true)) || 0); } function vborders(element) { - return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) + - (parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0); + return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) + + (parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0); } @@ -1956,7 +1953,6 @@ function firstDefined() { } - fcViews.month = MonthView; function MonthView(element, calendar) { @@ -4662,7 +4658,7 @@ function DayEventRenderer() { ""; } html += - "" + event.title + "" + + "" + htmlEscape(event.title) + "" + ""; if (seg.isEnd && isEventResizable(event)) { html += diff --git a/3rdparty/fullcalendar/js/fullcalendar.min.js b/3rdparty/fullcalendar/js/fullcalendar.min.js index df37bdfd803..da6c7c09fda 100644 --- a/3rdparty/fullcalendar/js/fullcalendar.min.js +++ b/3rdparty/fullcalendar/js/fullcalendar.min.js @@ -1,6 +1,6 @@ /* - FullCalendar v1.5.3 + FullCalendar v1.5.4 http://arshaw.com/fullcalendar/ Use fullcalendar.css for basic styling. @@ -11,7 +11,7 @@ Dual licensed under the MIT and GPL licenses, located in MIT-LICENSE.txt and GPL-LICENSE.txt respectively. - Date: Mon Feb 6 22:40:40 2012 -0800 + Date: Tue Sep 4 23:38:33 2012 -0700 */ (function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("
").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy(); @@ -39,10 +39,10 @@ a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHo 10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;ll;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.starte&&td){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e=0;e--){d=a[b[e].toLowerCase()];if(d!== -ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")} +g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d=0;e--){d=a[b[e].toLowerCase()];if(d!==ma)return d}return a[""]}function Qa(a){return a.replace(/&/g, +"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")} function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a= [a];if(a){var d,f;for(d=0;d=e[t][0]&&g' + option.html + ''; + } else { + return ""; + } + }; + + AbstractChosen.prototype.results_update_field = function() { + this.result_clear_highlight(); + this.result_single_selected = null; + return this.results_build(); + }; + + AbstractChosen.prototype.results_toggle = function() { + if (this.results_showing) { + return this.results_hide(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.results_search = function(evt) { + if (this.results_showing) { + return this.winnow_results(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.keyup_checker = function(evt) { + var stroke, _ref; + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; + this.search_field_scale(); + switch (stroke) { + case 8: + if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) { + return this.keydown_backstroke(); + } else if (!this.pending_backstroke) { + this.result_clear_highlight(); + return this.results_search(); + } + break; + case 13: + evt.preventDefault(); + if (this.results_showing) return this.result_select(evt); + break; + case 27: + if (this.results_showing) this.results_hide(); + return true; + case 9: + case 38: + case 40: + case 16: + case 91: + case 17: + break; + default: + return this.results_search(); + } + }; + + AbstractChosen.prototype.generate_field_id = function() { + var new_id; + new_id = this.generate_random_id(); + this.form_field.id = new_id; + return new_id; + }; + + AbstractChosen.prototype.generate_random_char = function() { + var chars, newchar, rand; + chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"; + rand = Math.floor(Math.random() * chars.length); + return newchar = chars.substring(rand, rand + 1); + }; + + return AbstractChosen; + + })(); + + root.AbstractChosen = AbstractChosen; + +}).call(this); + +/* +Chosen source: generate output using 'cake build' +Copyright (c) 2011 by Harvest +*/ + +(function() { + var $, Chosen, get_side_border_padding, root, + __hasProp = Object.prototype.hasOwnProperty, + __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor; child.__super__ = parent.prototype; return child; }; + + root = this; + + $ = jQuery; + + $.fn.extend({ + chosen: function(options) { + if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) { + return this; + } + return $(this).each(function(input_field) { + if (!($(this)).hasClass("chzn-done")) return new Chosen(this, options); + }); + } + }); + + Chosen = (function(_super) { + + __extends(Chosen, _super); + + function Chosen() { + Chosen.__super__.constructor.apply(this, arguments); + } + + Chosen.prototype.setup = function() { + this.form_field_jq = $(this.form_field); + return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl"); + }; + + Chosen.prototype.finish_setup = function() { + return this.form_field_jq.addClass("chzn-done"); + }; + Chosen.prototype.set_up_html = function() { var container_div, dd_top, dd_width, sf_width; this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id(); @@ -71,14 +308,11 @@ if (this.is_multiple) { container_div.html('
    '); } else { - container_div.html('' + this.default_text + '
      '); + container_div.html('' + this.default_text + '
        '); } this.form_field_jq.hide().after(container_div); this.container = $('#' + this.container_id); this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single")); - if (!this.is_multiple && this.form_field.options.length <= this.disable_search_threshold) { - this.container.addClass("chzn-container-single-nosearch"); - } this.dropdown = this.container.find('div.chzn-drop').first(); dd_top = this.container.height(); dd_width = this.f_width - get_side_border_padding(this.dropdown); @@ -102,83 +336,92 @@ }); } this.results_build(); - return this.set_tab_index(); + this.set_tab_index(); + return this.form_field_jq.trigger("liszt:ready", { + chosen: this + }); }; + Chosen.prototype.register_observers = function() { - this.container.mousedown(__bind(function(evt) { - return this.container_mousedown(evt); - }, this)); - this.container.mouseup(__bind(function(evt) { - return this.container_mouseup(evt); - }, this)); - this.container.mouseenter(__bind(function(evt) { - return this.mouse_enter(evt); - }, this)); - this.container.mouseleave(__bind(function(evt) { - return this.mouse_leave(evt); - }, this)); - this.search_results.mouseup(__bind(function(evt) { - return this.search_results_mouseup(evt); - }, this)); - this.search_results.mouseover(__bind(function(evt) { - return this.search_results_mouseover(evt); - }, this)); - this.search_results.mouseout(__bind(function(evt) { - return this.search_results_mouseout(evt); - }, this)); - this.form_field_jq.bind("liszt:updated", __bind(function(evt) { - return this.results_update_field(evt); - }, this)); - this.search_field.blur(__bind(function(evt) { - return this.input_blur(evt); - }, this)); - this.search_field.keyup(__bind(function(evt) { - return this.keyup_checker(evt); - }, this)); - this.search_field.keydown(__bind(function(evt) { - return this.keydown_checker(evt); - }, this)); + var _this = this; + this.container.mousedown(function(evt) { + return _this.container_mousedown(evt); + }); + this.container.mouseup(function(evt) { + return _this.container_mouseup(evt); + }); + this.container.mouseenter(function(evt) { + return _this.mouse_enter(evt); + }); + this.container.mouseleave(function(evt) { + return _this.mouse_leave(evt); + }); + this.search_results.mouseup(function(evt) { + return _this.search_results_mouseup(evt); + }); + this.search_results.mouseover(function(evt) { + return _this.search_results_mouseover(evt); + }); + this.search_results.mouseout(function(evt) { + return _this.search_results_mouseout(evt); + }); + this.form_field_jq.bind("liszt:updated", function(evt) { + return _this.results_update_field(evt); + }); + this.search_field.blur(function(evt) { + return _this.input_blur(evt); + }); + this.search_field.keyup(function(evt) { + return _this.keyup_checker(evt); + }); + this.search_field.keydown(function(evt) { + return _this.keydown_checker(evt); + }); if (this.is_multiple) { - this.search_choices.click(__bind(function(evt) { - return this.choices_click(evt); - }, this)); - return this.search_field.focus(__bind(function(evt) { - return this.input_focus(evt); - }, this)); + this.search_choices.click(function(evt) { + return _this.choices_click(evt); + }); + return this.search_field.focus(function(evt) { + return _this.input_focus(evt); + }); + } else { + return this.container.click(function(evt) { + return evt.preventDefault(); + }); } }; + Chosen.prototype.search_field_disabled = function() { - this.is_disabled = this.form_field_jq.attr('disabled'); + this.is_disabled = this.form_field_jq[0].disabled; if (this.is_disabled) { this.container.addClass('chzn-disabled'); - this.search_field.attr('disabled', true); + this.search_field[0].disabled = true; if (!this.is_multiple) { this.selected_item.unbind("focus", this.activate_action); } return this.close_field(); } else { this.container.removeClass('chzn-disabled'); - this.search_field.attr('disabled', false); + this.search_field[0].disabled = false; if (!this.is_multiple) { return this.selected_item.bind("focus", this.activate_action); } } }; + Chosen.prototype.container_mousedown = function(evt) { var target_closelink; if (!this.is_disabled) { target_closelink = evt != null ? ($(evt.target)).hasClass("search-choice-close") : false; - if (evt && evt.type === "mousedown") { + if (evt && evt.type === "mousedown" && !this.results_showing) { evt.stopPropagation(); } if (!this.pending_destroy_click && !target_closelink) { if (!this.active_field) { - if (this.is_multiple) { - this.search_field.val(""); - } + if (this.is_multiple) this.search_field.val(""); $(document).click(this.click_test_action); this.results_show(); - } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) { + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chzn-single").length)) { evt.preventDefault(); this.results_toggle(); } @@ -188,37 +431,17 @@ } } }; + Chosen.prototype.container_mouseup = function(evt) { - if (evt.target.nodeName === "ABBR") { - return this.results_reset(evt); - } - }; - Chosen.prototype.mouse_enter = function() { - return this.mouse_on_container = true; - }; - Chosen.prototype.mouse_leave = function() { - return this.mouse_on_container = false; - }; - Chosen.prototype.input_focus = function(evt) { - if (!this.active_field) { - return setTimeout((__bind(function() { - return this.container_mousedown(); - }, this)), 50); - } - }; - Chosen.prototype.input_blur = function(evt) { - if (!this.mouse_on_container) { - this.active_field = false; - return setTimeout((__bind(function() { - return this.blur_test(); - }, this)), 100); - } + if (evt.target.nodeName === "ABBR") return this.results_reset(evt); }; + Chosen.prototype.blur_test = function(evt) { if (!this.active_field && this.container.hasClass("chzn-container-active")) { return this.close_field(); } }; + Chosen.prototype.close_field = function() { $(document).unbind("click", this.click_test_action); if (!this.is_multiple) { @@ -233,6 +456,7 @@ this.show_search_field_default(); return this.search_field_scale(); }; + Chosen.prototype.activate_field = function() { if (!this.is_multiple && !this.active_field) { this.search_field.attr("tabindex", this.selected_item.attr("tabindex")); @@ -243,6 +467,7 @@ this.search_field.val(this.search_field.val()); return this.search_field.focus(); }; + Chosen.prototype.test_active_click = function(evt) { if ($(evt.target).parents('#' + this.container_id).length) { return this.active_field = true; @@ -250,9 +475,9 @@ return this.close_field(); } }; + Chosen.prototype.results_build = function() { - var content, data, startTime, _i, _len, _ref; - startTime = new Date(); + var content, data, _i, _len, _ref; this.parsing = true; this.results_data = root.SelectParser.select_to_array(this.form_field); if (this.is_multiple && this.choices > 0) { @@ -260,6 +485,11 @@ this.choices = 0; } else if (!this.is_multiple) { this.selected_item.find("span").text(this.default_text); + if (this.form_field.options.length <= this.disable_search_threshold) { + this.container.addClass("chzn-container-single-nosearch"); + } else { + this.container.removeClass("chzn-container-single-nosearch"); + } } content = ''; _ref = this.results_data; @@ -272,10 +502,8 @@ if (data.selected && this.is_multiple) { this.choice_build(data); } else if (data.selected && !this.is_multiple) { - this.selected_item.find("span").text(data.text); - if (this.allow_single_deselect) { - this.selected_item.find("span").first().after(""); - } + this.selected_item.removeClass("chzn-default").find("span").text(data.text); + if (this.allow_single_deselect) this.single_deselect_control_build(); } } } @@ -285,6 +513,7 @@ this.search_results.html(content); return this.parsing = false; }; + Chosen.prototype.result_add_group = function(group) { if (!group.disabled) { group.dom_id = this.container_id + "_g_" + group.array_index; @@ -293,31 +522,7 @@ return ""; } }; - Chosen.prototype.result_add_option = function(option) { - var classes, style; - if (!option.disabled) { - option.dom_id = this.container_id + "_o_" + option.array_index; - classes = option.selected && this.is_multiple ? [] : ["active-result"]; - if (option.selected) { - classes.push("result-selected"); - } - if (option.group_array_index != null) { - classes.push("group-option"); - } - if (option.classes !== "") { - classes.push(option.classes); - } - style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : ""; - return '
      • ' + option.html + '
      • '; - } else { - return ""; - } - }; - Chosen.prototype.results_update_field = function() { - this.result_clear_highlight(); - this.result_single_selected = null; - return this.results_build(); - }; + Chosen.prototype.result_do_highlight = function(el) { var high_bottom, high_top, maxHeight, visible_bottom, visible_top; if (el.length) { @@ -336,19 +541,12 @@ } } }; + Chosen.prototype.result_clear_highlight = function() { - if (this.result_highlight) { - this.result_highlight.removeClass("highlighted"); - } + if (this.result_highlight) this.result_highlight.removeClass("highlighted"); return this.result_highlight = null; }; - Chosen.prototype.results_toggle = function() { - if (this.results_showing) { - return this.results_hide(); - } else { - return this.results_show(); - } - }; + Chosen.prototype.results_show = function() { var dd_top; if (!this.is_multiple) { @@ -367,6 +565,7 @@ this.search_field.val(this.search_field.val()); return this.winnow_results(); }; + Chosen.prototype.results_hide = function() { if (!this.is_multiple) { this.selected_item.removeClass("chzn-single-with-drop"); @@ -377,6 +576,7 @@ }); return this.results_showing = false; }; + Chosen.prototype.set_tab_index = function(el) { var ti; if (this.form_field_jq.attr("tabindex")) { @@ -390,6 +590,7 @@ } } }; + Chosen.prototype.show_search_field_default = function() { if (this.is_multiple && this.choices < 1 && !this.active_field) { this.search_field.val(this.default_text); @@ -399,6 +600,7 @@ return this.search_field.removeClass("default"); } }; + Chosen.prototype.search_results_mouseup = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); @@ -407,34 +609,38 @@ return this.result_select(evt); } }; + Chosen.prototype.search_results_mouseover = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); - if (target) { - return this.result_do_highlight(target); - } + if (target) return this.result_do_highlight(target); }; + Chosen.prototype.search_results_mouseout = function(evt) { if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { return this.result_clear_highlight(); } }; + Chosen.prototype.choices_click = function(evt) { evt.preventDefault(); if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) { return this.results_show(); } }; + Chosen.prototype.choice_build = function(item) { - var choice_id, link; + var choice_id, link, + _this = this; choice_id = this.container_id + "_c_" + item.array_index; this.choices += 1; this.search_container.before('
      • ' + item.html + '
      • '); link = $('#' + choice_id).find("a").first(); - return link.click(__bind(function(evt) { - return this.choice_destroy_link_click(evt); - }, this)); + return link.click(function(evt) { + return _this.choice_destroy_link_click(evt); + }); }; + Chosen.prototype.choice_destroy_link_click = function(evt) { evt.preventDefault(); if (!this.is_disabled) { @@ -444,6 +650,7 @@ return evt.stopPropagation; } }; + Chosen.prototype.choice_destroy = function(link) { this.choices -= 1; this.show_search_field_default(); @@ -453,16 +660,17 @@ this.result_deselect(link.attr("rel")); return link.parents('li').first().remove(); }; + Chosen.prototype.results_reset = function(evt) { this.form_field.options[0].selected = true; this.selected_item.find("span").text(this.default_text); + if (!this.is_multiple) this.selected_item.addClass("chzn-default"); this.show_search_field_default(); $(evt.target).remove(); this.form_field_jq.trigger("change"); - if (this.active_field) { - return this.results_hide(); - } + if (this.active_field) return this.results_hide(); }; + Chosen.prototype.result_select = function(evt) { var high, high_id, item, position; if (this.result_highlight) { @@ -474,6 +682,7 @@ } else { this.search_results.find(".result-selected").removeClass("result-selected"); this.result_single_selected = high; + this.selected_item.removeClass("chzn-default"); } high.addClass("result-selected"); position = high_id.substr(high_id.lastIndexOf("_") + 1); @@ -484,24 +693,23 @@ this.choice_build(item); } else { this.selected_item.find("span").first().text(item.text); - if (this.allow_single_deselect) { - this.selected_item.find("span").first().after(""); - } - } - if (!(evt.metaKey && this.is_multiple)) { - this.results_hide(); + if (this.allow_single_deselect) this.single_deselect_control_build(); } + if (!(evt.metaKey && this.is_multiple)) this.results_hide(); this.search_field.val(""); this.form_field_jq.trigger("change"); return this.search_field_scale(); } }; + Chosen.prototype.result_activate = function(el) { return el.addClass("active-result"); }; + Chosen.prototype.result_deactivate = function(el) { return el.removeClass("active-result"); }; + Chosen.prototype.result_deselect = function(pos) { var result, result_data; result_data = this.results_data[pos]; @@ -514,30 +722,31 @@ this.form_field_jq.trigger("change"); return this.search_field_scale(); }; - Chosen.prototype.results_search = function(evt) { - if (this.results_showing) { - return this.winnow_results(); - } else { - return this.results_show(); + + Chosen.prototype.single_deselect_control_build = function() { + if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) { + return this.selected_item.find("span").first().after(""); } }; + Chosen.prototype.winnow_results = function() { - var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref; - startTime = new Date(); + var found, option, part, parts, regex, regexAnchor, result, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len2, _ref; this.no_results_clear(); results = 0; searchText = this.search_field.val() === this.default_text ? "" : $('
        ').text($.trim(this.search_field.val())).html(); - regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i'); + regexAnchor = this.search_contains ? "" : "^"; + regex = new RegExp(regexAnchor + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i'); zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i'); _ref = this.results_data; for (_i = 0, _len = _ref.length; _i < _len; _i++) { option = _ref[_i]; if (!option.disabled && !option.empty) { if (option.group) { - $('#' + option.dom_id).hide(); + $('#' + option.dom_id).css('display', 'none'); } else if (!(this.is_multiple && option.selected)) { found = false; result_id = option.dom_id; + result = $("#" + result_id); if (regex.test(option.html)) { found = true; results += 1; @@ -561,18 +770,16 @@ } else { text = option.html; } - if ($("#" + result_id).html !== text) { - $("#" + result_id).html(text); - } - this.result_activate($("#" + result_id)); + result.html(text); + this.result_activate(result); if (option.group_array_index != null) { - $("#" + this.results_data[option.group_array_index].dom_id).show(); + $("#" + this.results_data[option.group_array_index].dom_id).css('display', 'list-item'); } } else { if (this.result_highlight && result_id === this.result_highlight.attr('id')) { this.result_clear_highlight(); } - this.result_deactivate($("#" + result_id)); + this.result_deactivate(result); } } } @@ -583,6 +790,7 @@ return this.winnow_results_set_highlight(); } }; + Chosen.prototype.winnow_results_clear = function() { var li, lis, _i, _len, _results; this.search_field.val(""); @@ -591,46 +799,49 @@ for (_i = 0, _len = lis.length; _i < _len; _i++) { li = lis[_i]; li = $(li); - _results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0); + if (li.hasClass("group-result")) { + _results.push(li.css('display', 'auto')); + } else if (!this.is_multiple || !li.hasClass("result-selected")) { + _results.push(this.result_activate(li)); + } else { + _results.push(void 0); + } } return _results; }; + Chosen.prototype.winnow_results_set_highlight = function() { var do_high, selected_results; if (!this.result_highlight) { selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); - if (do_high != null) { - return this.result_do_highlight(do_high); - } + if (do_high != null) return this.result_do_highlight(do_high); } }; + Chosen.prototype.no_results = function(terms) { var no_results_html; no_results_html = $('
      • ' + this.results_none_found + ' ""
      • '); no_results_html.find("span").first().html(terms); return this.search_results.append(no_results_html); }; + Chosen.prototype.no_results_clear = function() { return this.search_results.find(".no-results").remove(); }; + Chosen.prototype.keydown_arrow = function() { var first_active, next_sib; if (!this.result_highlight) { first_active = this.search_results.find("li.active-result").first(); - if (first_active) { - this.result_do_highlight($(first_active)); - } + if (first_active) this.result_do_highlight($(first_active)); } else if (this.results_showing) { next_sib = this.result_highlight.nextAll("li.active-result").first(); - if (next_sib) { - this.result_do_highlight(next_sib); - } - } - if (!this.results_showing) { - return this.results_show(); + if (next_sib) this.result_do_highlight(next_sib); } + if (!this.results_showing) return this.results_show(); }; + Chosen.prototype.keyup_arrow = function() { var prev_sibs; if (!this.results_showing && !this.is_multiple) { @@ -640,13 +851,12 @@ if (prev_sibs.length) { return this.result_do_highlight(prev_sibs.first()); } else { - if (this.choices > 0) { - this.results_hide(); - } + if (this.choices > 0) this.results_hide(); return this.result_clear_highlight(); } } }; + Chosen.prototype.keydown_backstroke = function() { if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.find("a").first()); @@ -656,59 +866,25 @@ return this.pending_backstroke.addClass("search-choice-focus"); } }; + Chosen.prototype.clear_backstroke = function() { if (this.pending_backstroke) { this.pending_backstroke.removeClass("search-choice-focus"); } return this.pending_backstroke = null; }; - Chosen.prototype.keyup_checker = function(evt) { - var stroke, _ref; - stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; - this.search_field_scale(); - switch (stroke) { - case 8: - if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) { - return this.keydown_backstroke(); - } else if (!this.pending_backstroke) { - this.result_clear_highlight(); - return this.results_search(); - } - break; - case 13: - evt.preventDefault(); - if (this.results_showing) { - return this.result_select(evt); - } - break; - case 27: - if (this.results_showing) { - return this.results_hide(); - } - break; - case 9: - case 38: - case 40: - case 16: - case 91: - case 17: - break; - default: - return this.results_search(); - } - }; + Chosen.prototype.keydown_checker = function(evt) { var stroke, _ref; stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; this.search_field_scale(); - if (stroke !== 8 && this.pending_backstroke) { - this.clear_backstroke(); - } + if (stroke !== 8 && this.pending_backstroke) this.clear_backstroke(); switch (stroke) { case 8: this.backstroke_length = this.search_field.val().length; break; case 9: + if (this.results_showing && !this.is_multiple) this.result_select(evt); this.mouse_on_container = false; break; case 13: @@ -723,6 +899,7 @@ break; } }; + Chosen.prototype.search_field_scale = function() { var dd_top, div, h, style, style_block, styles, w, _i, _len; if (this.is_multiple) { @@ -741,9 +918,7 @@ $('body').append(div); w = div.width() + 25; div.remove(); - if (w > this.f_width - 10) { - w = this.f_width - 10; - } + if (w > this.f_width - 10) w = this.f_width - 10; this.search_field.css({ 'width': w + 'px' }); @@ -753,12 +928,7 @@ }); } }; - Chosen.prototype.generate_field_id = function() { - var new_id; - new_id = this.generate_random_id(); - this.form_field.id = new_id; - return new_id; - }; + Chosen.prototype.generate_random_id = function() { var string; string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char(); @@ -767,91 +937,16 @@ } return string; }; - Chosen.prototype.generate_random_char = function() { - var chars, newchar, rand; - chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"; - rand = Math.floor(Math.random() * chars.length); - return newchar = chars.substring(rand, rand + 1); - }; + return Chosen; - })(); + + })(AbstractChosen); + get_side_border_padding = function(elmt) { var side_border_padding; return side_border_padding = elmt.outerWidth() - elmt.width(); }; + root.get_side_border_padding = get_side_border_padding; -}).call(this); -(function() { - var SelectParser; - SelectParser = (function() { - function SelectParser() { - this.options_index = 0; - this.parsed = []; - } - SelectParser.prototype.add_node = function(child) { - if (child.nodeName === "OPTGROUP") { - return this.add_group(child); - } else { - return this.add_option(child); - } - }; - SelectParser.prototype.add_group = function(group) { - var group_position, option, _i, _len, _ref, _results; - group_position = this.parsed.length; - this.parsed.push({ - array_index: group_position, - group: true, - label: group.label, - children: 0, - disabled: group.disabled - }); - _ref = group.childNodes; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - option = _ref[_i]; - _results.push(this.add_option(option, group_position, group.disabled)); - } - return _results; - }; - SelectParser.prototype.add_option = function(option, group_position, group_disabled) { - if (option.nodeName === "OPTION") { - if (option.text !== "") { - if (group_position != null) { - this.parsed[group_position].children += 1; - } - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - value: option.value, - text: option.text, - html: option.innerHTML, - selected: option.selected, - disabled: group_disabled === true ? group_disabled : option.disabled, - group_array_index: group_position, - classes: option.className, - style: option.style.cssText - }); - } else { - this.parsed.push({ - array_index: this.parsed.length, - options_index: this.options_index, - empty: true - }); - } - return this.options_index += 1; - } - }; - return SelectParser; - })(); - SelectParser.select_to_array = function(select) { - var child, parser, _i, _len, _ref; - parser = new SelectParser(); - _ref = select.childNodes; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - child = _ref[_i]; - parser.add_node(child); - } - return parser.parsed; - }; - this.SelectParser = SelectParser; + }).call(this); diff --git a/3rdparty/js/chosen/chosen.jquery.min.js b/3rdparty/js/chosen/chosen.jquery.min.js old mode 100644 new mode 100755 index 371ee53e7a3..9ba164cc47a --- a/3rdparty/js/chosen/chosen.jquery.min.js +++ b/3rdparty/js/chosen/chosen.jquery.min.js @@ -1,10 +1,10 @@ // Chosen, a Select Box Enhancer for jQuery and Protoype // by Patrick Filler for Harvest, http://getharvest.com // -// Version 0.9.5 +// Version 0.9.8 // Full source at https://github.com/harvesthq/chosen // Copyright (c) 2011 Harvest http://getharvest.com // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md // This file is generated by `cake build`, do not edit it by hand. -(function(){var a,b,c,d,e=function(a,b){return function(){return a.apply(b,arguments)}};d=this,a=jQuery,a.fn.extend({chosen:function(c){return a.browser!=="msie"||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(d){if(!a(this).hasClass("chzn-done"))return new b(this,c)}):this}}),b=function(){function b(b,c){this.form_field=b,this.options=c!=null?c:{},this.set_default_values(),this.form_field_jq=a(this.form_field),this.is_multiple=this.form_field.multiple,this.is_rtl=this.form_field_jq.hasClass("chzn-rtl"),this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option",this.set_up_html(),this.register_observers(),this.form_field_jq.addClass("chzn-done")}b.prototype.set_default_values=function(){this.click_test_action=e(function(a){return this.test_active_click(a)},this),this.activate_action=e(function(a){return this.activate_field(a)},this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.allow_single_deselect=this.options.allow_single_deselect!=null&&this.form_field.options[0].text===""?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.choices=0;return this.results_none_found=this.options.no_results_text||"No results match"},b.prototype.set_up_html=function(){var b,d,e,f;this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("
        ",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('
          '):b.html(''+this.default_text+'
            '),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),!this.is_multiple&&this.form_field.options.length<=this.disable_search_threshold&&this.container.addClass("chzn-container-single-nosearch"),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build();return this.set_tab_index()},b.prototype.register_observers=function(){this.container.mousedown(e(function(a){return this.container_mousedown(a)},this)),this.container.mouseup(e(function(a){return this.container_mouseup(a)},this)),this.container.mouseenter(e(function(a){return this.mouse_enter(a)},this)),this.container.mouseleave(e(function(a){return this.mouse_leave(a)},this)),this.search_results.mouseup(e(function(a){return this.search_results_mouseup(a)},this)),this.search_results.mouseover(e(function(a){return this.search_results_mouseover(a)},this)),this.search_results.mouseout(e(function(a){return this.search_results_mouseout(a)},this)),this.form_field_jq.bind("liszt:updated",e(function(a){return this.results_update_field(a)},this)),this.search_field.blur(e(function(a){return this.input_blur(a)},this)),this.search_field.keyup(e(function(a){return this.keyup_checker(a)},this)),this.search_field.keydown(e(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.click(e(function(a){return this.choices_click(a)},this));return this.search_field.focus(e(function(a){return this.input_focus(a)},this))}},b.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq.attr("disabled");if(this.is_disabled){this.container.addClass("chzn-disabled"),this.search_field.attr("disabled",!0),this.is_multiple||this.selected_item.unbind("focus",this.activate_action);return this.close_field()}this.container.removeClass("chzn-disabled"),this.search_field.attr("disabled",!1);if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},b.prototype.container_mousedown=function(b){var c;if(!this.is_disabled){c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&b.stopPropagation();if(!this.pending_destroy_click&&!c){this.active_field?!this.is_multiple&&b&&(a(b.target)===this.selected_item||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show());return this.activate_field()}return this.pending_destroy_click=!1}},b.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},b.prototype.mouse_enter=function(){return this.mouse_on_container=!0},b.prototype.mouse_leave=function(){return this.mouse_on_container=!1},b.prototype.input_focus=function(a){if(!this.active_field)return setTimeout(e(function(){return this.container_mousedown()},this),50)},b.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(e(function(){return this.blur_test()},this),100)}},b.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},b.prototype.close_field=function(){a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default();return this.search_field_scale()},b.prototype.activate_field=function(){!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val());return this.search_field.focus()},b.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},b.prototype.results_build=function(){var a,b,c,e,f,g;c=new Date,this.parsing=!0,this.results_data=d.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||this.selected_item.find("span").text(this.default_text),a="",g=this.results_data;for(e=0,f=g.length;e')));this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.search_results.html(a);return this.parsing=!1},b.prototype.result_add_group=function(b){if(!b.disabled){b.dom_id=this.container_id+"_g_"+b.array_index;return'
          • '+a("
            ").text(b.label).html()+"
          • "}return""},b.prototype.result_add_option=function(a){var b,c;if(!a.disabled){a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option"),a.classes!==""&&b.push(a.classes),c=a.style.cssText!==""?' style="'+a.style+'"':"";return'
          • "+a.html+"
          • "}return""},b.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return this.results_build()},b.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c'+b.html+''),d=a("#"+c).find("a").first();return d.click(e(function(a){return this.choice_destroy_link_click(a)},this))},b.prototype.choice_destroy_link_click=function(b){b.preventDefault();if(!this.is_disabled){this.pending_destroy_click=!0;return this.choice_destroy(a(b.target))}return b.stopPropagation},b.prototype.choice_destroy=function(a){this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel"));return a.parents("li").first().remove()},b.prototype.results_reset=function(b){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.show_search_field_default(),a(b.target).remove(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},b.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight){b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.selected_item.find("span").first().after('')),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change");return this.search_field_scale()}},b.prototype.result_activate=function(a){return a.addClass("active-result")},b.prototype.result_deactivate=function(a){return a.removeClass("active-result")},b.prototype.result_deselect=function(b){var c,d;d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change");return this.search_field_scale()},b.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},b.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;j=new Date,this.no_results_clear(),h=0,i=this.search_field.val()===this.default_text?"":a("
            ").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o"+c.html.substr(k+i.length),l=l.substr(0,k)+""+l.substr(k)):l=c.html,a("#"+g).html!==l&&a("#"+g).html(l),this.result_activate(a("#"+g)),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).show()):(this.result_highlight&&g===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(a("#"+g)))}}return h<1&&i.length?this.no_results(i):this.winnow_results_set_highlight()},b.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d'+this.results_none_found+' ""'),c.find("span").first().html(b);return this.search_results.append(c)},b.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},b.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},b.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight){a=this.result_highlight.prevAll("li.active-result");if(a.length)return this.result_do_highlight(a.first());this.choices>0&&this.results_hide();return this.result_clear_highlight()}},b.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.find("a").first());return this.clear_backstroke()}this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClass("search-choice-focus")},b.prototype.clear_backstroke=function(){this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus");return this.pending_backstroke=null},b.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:if(this.results_showing)return this.results_hide();break;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},b.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},b.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height();return this.dropdown.css({top:b+"px"})}},b.prototype.generate_field_id=function(){var a;a=this.generate_random_id(),this.form_field.id=a;return a},b.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},b.prototype.generate_random_char=function(){var a,b,c;a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length);return b=a.substring(c,c+1)};return b}(),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}).call(this),function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d"+a.html+"")},a.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d,e=Object.prototype.hasOwnProperty,f=function(a,b){function d(){this.constructor=a}for(var c in b)e.call(b,c)&&(a[c]=b[c]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};d=this,a=jQuery,a.fn.extend({chosen:function(c){return!a.browser.msie||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(d){if(!a(this).hasClass("chzn-done"))return new b(this,c)}):this}}),b=function(b){function e(){e.__super__.constructor.apply(this,arguments)}return f(e,b),e.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},e.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},e.prototype.set_up_html=function(){var b,d,e,f;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("
            ",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('
              '):b.html(''+this.default_text+'
                '),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},e.prototype.register_observers=function(){var a=this;return this.container.mousedown(function(b){return a.container_mousedown(b)}),this.container.mouseup(function(b){return a.container_mouseup(b)}),this.container.mouseenter(function(b){return a.mouse_enter(b)}),this.container.mouseleave(function(b){return a.mouse_leave(b)}),this.search_results.mouseup(function(b){return a.search_results_mouseup(b)}),this.search_results.mouseover(function(b){return a.search_results_mouseover(b)}),this.search_results.mouseout(function(b){return a.search_results_mouseout(b)}),this.form_field_jq.bind("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.blur(function(b){return a.input_blur(b)}),this.search_field.keyup(function(b){return a.keyup_checker(b)}),this.search_field.keydown(function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.click(function(b){return a.choices_click(b)}),this.search_field.focus(function(b){return a.input_focus(b)})):this.container.click(function(a){return a.preventDefault()})},e.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},e.prototype.container_mousedown=function(b){var c;if(!this.is_disabled)return c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&!this.results_showing&&b.stopPropagation(),!this.pending_destroy_click&&!c?(this.active_field?!this.is_multiple&&b&&(a(b.target)[0]===this.selected_item[0]||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},e.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},e.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},e.prototype.close_field=function(){return a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},e.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},e.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},e.prototype.results_build=function(){var a,b,c,e,f;this.parsing=!0,this.results_data=d.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.find("span").text(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),a="",f=this.results_data;for(c=0,e=f.length;c'+a("
                ").text(b.label).html()+"")},e.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c'+b.html+''),d=a("#"+c).find("a").first(),d.click(function(a){return e.choice_destroy_link_click(a)})},e.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),this.is_disabled?b.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(a(b.target)))},e.prototype.choice_destroy=function(a){return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel")),a.parents("li").first().remove()},e.prototype.results_reset=function(b){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.is_multiple||this.selected_item.addClass("chzn-default"),this.show_search_field_default(),a(b.target).remove(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},e.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight)return b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b,this.selected_item.removeClass("chzn-default")),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.result_activate=function(a){return a.addClass("active-result")},e.prototype.result_deactivate=function(a){return a.removeClass("active-result")},e.prototype.result_deselect=function(b){var c,d;return d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('')},e.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;this.no_results_clear(),j=0,k=this.search_field.val()===this.default_text?"":a("
                ").text(a.trim(this.search_field.val())).html(),g=this.search_contains?"":"^",f=new RegExp(g+k.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),n=new RegExp(k.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),s=this.results_data;for(o=0,q=s.length;o=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(p=0,r=e.length;p"+c.html.substr(l+k.length),m=m.substr(0,l)+""+m.substr(l)):m=c.html,h.html(m),this.result_activate(h),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&i===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(h))}}return j<1&&k.length?this.no_results(k):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d'+this.results_none_found+' ""'),c.find("span").first().html(b),this.search_results.append(c)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClass("search-choice-focus"))},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this) \ No newline at end of file diff --git a/3rdparty/miniColors/GPL-LICENSE.txt b/3rdparty/miniColors/GPL-LICENSE.txt new file mode 100644 index 00000000000..11dddd00ef0 --- /dev/null +++ b/3rdparty/miniColors/GPL-LICENSE.txt @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/3rdparty/miniColors/MIT-LICENSE.txt b/3rdparty/miniColors/MIT-LICENSE.txt new file mode 100644 index 00000000000..ec6f7581576 --- /dev/null +++ b/3rdparty/miniColors/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) Cory LaViska + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/3rdparty/miniColors/css/images/colors.png b/3rdparty/miniColors/css/images/colors.png new file mode 100755 index 00000000000..deb50a9ae10 Binary files /dev/null and b/3rdparty/miniColors/css/images/colors.png differ diff --git a/3rdparty/miniColors/css/images/trigger.png b/3rdparty/miniColors/css/images/trigger.png new file mode 100755 index 00000000000..96c91294f3f Binary files /dev/null and b/3rdparty/miniColors/css/images/trigger.png differ diff --git a/3rdparty/miniColors/css/jquery.miniColors.css b/3rdparty/miniColors/css/jquery.miniColors.css new file mode 100755 index 00000000000..592f44894d1 --- /dev/null +++ b/3rdparty/miniColors/css/jquery.miniColors.css @@ -0,0 +1,125 @@ +INPUT.miniColors { + margin-right: 4px; +} + +.miniColors-selector { + position: absolute; + width: 175px; + height: 150px; + background: white; + border: solid 1px #bababa; + -moz-box-shadow: 0 0 6px rgba(0, 0, 0, .25); + -webkit-box-shadow: 0 0 6px rgba(0, 0, 0, .25); + box-shadow: 0 0 6px rgba(0, 0, 0, .25); + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + padding: 5px; + z-index: 999999; +} + +.miniColors.opacity.miniColors-selector { + width: 200px; +} + +.miniColors-selector.black { + background: black; + border-color: black; +} + +.miniColors-colors { + position: absolute; + top: 5px; + left: 5px; + width: 150px; + height: 150px; + background: url(images/colors.png) -40px 0 no-repeat; + cursor: crosshair; +} + +.miniColors.opacity .miniColors-colors { + left: 30px; +} + +.miniColors-hues { + position: absolute; + top: 5px; + left: 160px; + width: 20px; + height: 150px; + background: url(images/colors.png) 0 0 no-repeat; + cursor: crosshair; +} + +.miniColors.opacity .miniColors-hues { + left: 185px; +} + +.miniColors-opacity { + position: absolute; + top: 5px; + left: 5px; + width: 20px; + height: 150px; + background: url(images/colors.png) -20px 0 no-repeat; + cursor: crosshair; +} + +.miniColors-colorPicker { + position: absolute; + width: 11px; + height: 11px; + border: 1px solid black; + -moz-border-radius: 11px; + -webkit-border-radius: 11px; + border-radius: 11px; +} +.miniColors-colorPicker-inner { + position: absolute; + top: 0; + left: 0; + width: 7px; + height: 7px; + border: 2px solid white; + -moz-border-radius: 9px; + -webkit-border-radius: 9px; + border-radius: 9px; +} + +.miniColors-huePicker, +.miniColors-opacityPicker { + position: absolute; + left: -2px; + width: 22px; + height: 2px; + border: 1px solid black; + background: white; + margin-top: -1px; + border-radius: 2px; +} + +.miniColors-trigger, +.miniColors-triggerWrap { + width: 22px; + height: 22px; + display: inline-block; +} + +.miniColors-triggerWrap { + background: url(images/trigger.png) -22px 0 no-repeat; +} + +.miniColors-triggerWrap.disabled { + filter: alpha(opacity=50); + opacity: .5; +} + +.miniColors-trigger { + vertical-align: middle; + outline: none; + background: url(images/trigger.png) 0 0 no-repeat; +} + +.miniColors-triggerWrap.disabled .miniColors-trigger { + cursor: default; +} \ No newline at end of file diff --git a/3rdparty/miniColors/js/jquery.miniColors.js b/3rdparty/miniColors/js/jquery.miniColors.js new file mode 100755 index 00000000000..a0f439c2c49 --- /dev/null +++ b/3rdparty/miniColors/js/jquery.miniColors.js @@ -0,0 +1,710 @@ +/* + * jQuery miniColors: A small color selector + * + * Copyright 2012 Cory LaViska for A Beautiful Site, LLC. (http://www.abeautifulsite.net/) + * + * Dual licensed under the MIT or GPL Version 2 licenses + * +*/ +if(jQuery) (function($) { + + $.extend($.fn, { + + miniColors: function(o, data) { + + var create = function(input, o, data) { + // + // Creates a new instance of the miniColors selector + // + + // Determine initial color (defaults to white) + var color = expandHex(input.val()) || 'ffffff', + hsb = hex2hsb(color), + rgb = hsb2rgb(hsb), + alpha = parseFloat(input.attr('data-opacity')).toFixed(2); + + if( alpha > 1 ) alpha = 1; + if( alpha < 0 ) alpha = 0; + + // Create trigger + var trigger = $(''); + trigger.insertAfter(input); + trigger.wrap(''); + if( o.opacity ) { + trigger.css('backgroundColor', 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + alpha + ')'); + } + + // Set input data and update attributes + input + .addClass('miniColors') + .data('original-maxlength', input.attr('maxlength') || null) + .data('original-autocomplete', input.attr('autocomplete') || null) + .data('letterCase', o.letterCase === 'uppercase' ? 'uppercase' : 'lowercase') + .data('opacity', o.opacity ? true : false) + .data('alpha', alpha) + .data('trigger', trigger) + .data('hsb', hsb) + .data('change', o.change ? o.change : null) + .data('close', o.close ? o.close : null) + .data('open', o.open ? o.open : null) + .attr('maxlength', 7) + .attr('autocomplete', 'off') + .val('#' + convertCase(color, o.letterCase)); + + // Handle options + if( o.readonly || input.prop('readonly') ) input.prop('readonly', true); + if( o.disabled || input.prop('disabled') ) disable(input); + + // Show selector when trigger is clicked + trigger.on('click.miniColors', function(event) { + event.preventDefault(); + if( input.val() === '' ) input.val('#'); + show(input); + + }); + + // Show selector when input receives focus + input.on('focus.miniColors', function(event) { + if( input.val() === '' ) input.val('#'); + show(input); + }); + + // Hide on blur + input.on('blur.miniColors', function(event) { + var hex = expandHex( hsb2hex(input.data('hsb')) ); + input.val( hex ? '#' + convertCase(hex, input.data('letterCase')) : '' ); + }); + + // Hide when tabbing out of the input + input.on('keydown.miniColors', function(event) { + if( event.keyCode === 9 ) hide(input); + }); + + // Update when color is typed in + input.on('keyup.miniColors', function(event) { + setColorFromInput(input); + }); + + // Handle pasting + input.on('paste.miniColors', function(event) { + // Short pause to wait for paste to complete + setTimeout( function() { + setColorFromInput(input); + }, 5); + }); + + }; + + var destroy = function(input) { + // + // Destroys an active instance of the miniColors selector + // + hide(); + input = $(input); + + // Restore to original state + input.data('trigger').parent().remove(); + input + .attr('autocomplete', input.data('original-autocomplete')) + .attr('maxlength', input.data('original-maxlength')) + .removeData() + .removeClass('miniColors') + .off('.miniColors'); + $(document).off('.miniColors'); + }; + + var enable = function(input) { + // + // Enables the input control and the selector + // + input + .prop('disabled', false) + .data('trigger').parent().removeClass('disabled'); + }; + + var disable = function(input) { + // + // Disables the input control and the selector + // + hide(input); + input + .prop('disabled', true) + .data('trigger').parent().addClass('disabled'); + }; + + var show = function(input) { + // + // Shows the miniColors selector + // + if( input.prop('disabled') ) return false; + + // Hide all other instances + hide(); + + // Generate the selector + var selector = $('
                '); + selector + .append('
                ') + .append('
                ') + .css('display', 'none') + .addClass( input.attr('class') ); + + // Opacity + if( input.data('opacity') ) { + selector + .addClass('opacity') + .prepend('
                '); + } + + // Set background for colors + var hsb = input.data('hsb'); + selector + .find('.miniColors-colors').css('backgroundColor', '#' + hsb2hex({ h: hsb.h, s: 100, b: 100 })).end() + .find('.miniColors-opacity').css('backgroundColor', '#' + hsb2hex({ h: hsb.h, s: hsb.s, b: hsb.b })).end(); + + // Set colorPicker position + var colorPosition = input.data('colorPosition'); + if( !colorPosition ) colorPosition = getColorPositionFromHSB(hsb); + selector.find('.miniColors-colorPicker') + .css('top', colorPosition.y + 'px') + .css('left', colorPosition.x + 'px'); + + // Set huePicker position + var huePosition = input.data('huePosition'); + if( !huePosition ) huePosition = getHuePositionFromHSB(hsb); + selector.find('.miniColors-huePicker').css('top', huePosition + 'px'); + + // Set opacity position + var opacityPosition = input.data('opacityPosition'); + if( !opacityPosition ) opacityPosition = getOpacityPositionFromAlpha(input.attr('data-opacity')); + selector.find('.miniColors-opacityPicker').css('top', opacityPosition + 'px'); + + // Set input data + input + .data('selector', selector) + .data('huePicker', selector.find('.miniColors-huePicker')) + .data('opacityPicker', selector.find('.miniColors-opacityPicker')) + .data('colorPicker', selector.find('.miniColors-colorPicker')) + .data('mousebutton', 0); + + $('BODY').append(selector); + + // Position the selector + var trigger = input.data('trigger'), + hidden = !input.is(':visible'), + top = hidden ? trigger.offset().top + trigger.outerHeight() : input.offset().top + input.outerHeight(), + left = hidden ? trigger.offset().left : input.offset().left, + selectorWidth = selector.outerWidth(), + selectorHeight = selector.outerHeight(), + triggerWidth = trigger.outerWidth(), + triggerHeight = trigger.outerHeight(), + windowHeight = $(window).height(), + windowWidth = $(window).width(), + scrollTop = $(window).scrollTop(), + scrollLeft = $(window).scrollLeft(); + + // Adjust based on viewport + if( (top + selectorHeight) > windowHeight + scrollTop ) top = top - selectorHeight - triggerHeight; + if( (left + selectorWidth) > windowWidth + scrollLeft ) left = left - selectorWidth + triggerWidth; + + // Set position and show + selector.css({ + top: top, + left: left + }).fadeIn(100); + + // Prevent text selection in IE + selector.on('selectstart', function() { return false; }); + + // Hide on resize (IE7/8 trigger this when any element is resized...) + if( !$.browser.msie || ($.browser.msie && $.browser.version >= 9) ) { + $(window).on('resize.miniColors', function(event) { + hide(input); + }); + } + + $(document) + .on('mousedown.miniColors touchstart.miniColors', function(event) { + + input.data('mousebutton', 1); + var testSubject = $(event.target).parents().andSelf(); + + if( testSubject.hasClass('miniColors-colors') ) { + event.preventDefault(); + input.data('moving', 'colors'); + moveColor(input, event); + } + + if( testSubject.hasClass('miniColors-hues') ) { + event.preventDefault(); + input.data('moving', 'hues'); + moveHue(input, event); + } + + if( testSubject.hasClass('miniColors-opacity') ) { + event.preventDefault(); + input.data('moving', 'opacity'); + moveOpacity(input, event); + } + + if( testSubject.hasClass('miniColors-selector') ) { + event.preventDefault(); + return; + } + + if( testSubject.hasClass('miniColors') ) return; + + hide(input); + }) + .on('mouseup.miniColors touchend.miniColors', function(event) { + event.preventDefault(); + input.data('mousebutton', 0).removeData('moving'); + }) + .on('mousemove.miniColors touchmove.miniColors', function(event) { + event.preventDefault(); + if( input.data('mousebutton') === 1 ) { + if( input.data('moving') === 'colors' ) moveColor(input, event); + if( input.data('moving') === 'hues' ) moveHue(input, event); + if( input.data('moving') === 'opacity' ) moveOpacity(input, event); + } + }); + + // Fire open callback + if( input.data('open') ) { + input.data('open').call(input.get(0), '#' + hsb2hex(hsb), $.extend(hsb2rgb(hsb), { a: parseFloat(input.attr('data-opacity')) })); + } + + }; + + var hide = function(input) { + + // + // Hides one or more miniColors selectors + // + + // Hide all other instances if input isn't specified + if( !input ) input = $('.miniColors'); + + input.each( function() { + var selector = $(this).data('selector'); + $(this).removeData('selector'); + $(selector).fadeOut(100, function() { + // Fire close callback + if( input.data('close') ) { + var hsb = input.data('hsb'), hex = hsb2hex(hsb); + input.data('close').call(input.get(0), '#' + hex, $.extend(hsb2rgb(hsb), { a: parseFloat(input.attr('data-opacity')) })); + } + $(this).remove(); + }); + }); + + $(document).off('.miniColors'); + + }; + + var moveColor = function(input, event) { + + var colorPicker = input.data('colorPicker'); + + colorPicker.hide(); + + var position = { + x: event.pageX, + y: event.pageY + }; + + // Touch support + if( event.originalEvent.changedTouches ) { + position.x = event.originalEvent.changedTouches[0].pageX; + position.y = event.originalEvent.changedTouches[0].pageY; + } + position.x = position.x - input.data('selector').find('.miniColors-colors').offset().left - 6; + position.y = position.y - input.data('selector').find('.miniColors-colors').offset().top - 6; + if( position.x <= -5 ) position.x = -5; + if( position.x >= 144 ) position.x = 144; + if( position.y <= -5 ) position.y = -5; + if( position.y >= 144 ) position.y = 144; + + input.data('colorPosition', position); + colorPicker.css('left', position.x).css('top', position.y).show(); + + // Calculate saturation + var s = Math.round((position.x + 5) * 0.67); + if( s < 0 ) s = 0; + if( s > 100 ) s = 100; + + // Calculate brightness + var b = 100 - Math.round((position.y + 5) * 0.67); + if( b < 0 ) b = 0; + if( b > 100 ) b = 100; + + // Update HSB values + var hsb = input.data('hsb'); + hsb.s = s; + hsb.b = b; + + // Set color + setColor(input, hsb, true); + }; + + var moveHue = function(input, event) { + + var huePicker = input.data('huePicker'); + + huePicker.hide(); + + var position = event.pageY; + + // Touch support + if( event.originalEvent.changedTouches ) { + position = event.originalEvent.changedTouches[0].pageY; + } + + position = position - input.data('selector').find('.miniColors-colors').offset().top - 1; + if( position <= -1 ) position = -1; + if( position >= 149 ) position = 149; + input.data('huePosition', position); + huePicker.css('top', position).show(); + + // Calculate hue + var h = Math.round((150 - position - 1) * 2.4); + if( h < 0 ) h = 0; + if( h > 360 ) h = 360; + + // Update HSB values + var hsb = input.data('hsb'); + hsb.h = h; + + // Set color + setColor(input, hsb, true); + + }; + + var moveOpacity = function(input, event) { + + var opacityPicker = input.data('opacityPicker'); + + opacityPicker.hide(); + + var position = event.pageY; + + // Touch support + if( event.originalEvent.changedTouches ) { + position = event.originalEvent.changedTouches[0].pageY; + } + + position = position - input.data('selector').find('.miniColors-colors').offset().top - 1; + if( position <= -1 ) position = -1; + if( position >= 149 ) position = 149; + input.data('opacityPosition', position); + opacityPicker.css('top', position).show(); + + // Calculate opacity + var alpha = parseFloat((150 - position - 1) / 150).toFixed(2); + if( alpha < 0 ) alpha = 0; + if( alpha > 1 ) alpha = 1; + + // Update opacity + input + .data('alpha', alpha) + .attr('data-opacity', alpha); + + // Set color + setColor(input, input.data('hsb'), true); + + }; + + var setColor = function(input, hsb, updateInput) { + input.data('hsb', hsb); + var hex = hsb2hex(hsb), + selector = $(input.data('selector')); + if( updateInput ) input.val( '#' + convertCase(hex, input.data('letterCase')) ); + + selector + .find('.miniColors-colors').css('backgroundColor', '#' + hsb2hex({ h: hsb.h, s: 100, b: 100 })).end() + .find('.miniColors-opacity').css('backgroundColor', '#' + hex).end(); + + var rgb = hsb2rgb(hsb); + + // Set background color (also fallback for non RGBA browsers) + input.data('trigger').css('backgroundColor', '#' + hex); + + // Set background color + opacity + if( input.data('opacity') ) { + input.data('trigger').css('backgroundColor', 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + input.attr('data-opacity') + ')'); + } + + // Fire change callback + if( input.data('change') ) { + if( (hex + ',' + input.attr('data-opacity')) === input.data('lastChange') ) return; + input.data('change').call(input.get(0), '#' + hex, $.extend(hsb2rgb(hsb), { a: parseFloat(input.attr('data-opacity')) })); + input.data('lastChange', hex + ',' + input.attr('data-opacity')); + } + + }; + + var setColorFromInput = function(input) { + + input.val('#' + cleanHex(input.val())); + var hex = expandHex(input.val()); + if( !hex ) return false; + + // Get HSB equivalent + var hsb = hex2hsb(hex); + + // Set colorPicker position + var colorPosition = getColorPositionFromHSB(hsb); + var colorPicker = $(input.data('colorPicker')); + colorPicker.css('top', colorPosition.y + 'px').css('left', colorPosition.x + 'px'); + input.data('colorPosition', colorPosition); + + // Set huePosition position + var huePosition = getHuePositionFromHSB(hsb); + var huePicker = $(input.data('huePicker')); + huePicker.css('top', huePosition + 'px'); + input.data('huePosition', huePosition); + + // Set opacity position + var opacityPosition = getOpacityPositionFromAlpha(input.attr('data-opacity')); + var opacityPicker = $(input.data('opacityPicker')); + opacityPicker.css('top', opacityPosition + 'px'); + input.data('opacityPosition', opacityPosition); + setColor(input, hsb); + + return true; + + }; + + var convertCase = function(string, letterCase) { + if( letterCase === 'uppercase' ) { + return string.toUpperCase(); + } else { + return string.toLowerCase(); + } + }; + + var getColorPositionFromHSB = function(hsb) { + var x = Math.ceil(hsb.s / 0.67); + if( x < 0 ) x = 0; + if( x > 150 ) x = 150; + var y = 150 - Math.ceil(hsb.b / 0.67); + if( y < 0 ) y = 0; + if( y > 150 ) y = 150; + return { x: x - 5, y: y - 5 }; + }; + + var getHuePositionFromHSB = function(hsb) { + var y = 150 - (hsb.h / 2.4); + if( y < 0 ) h = 0; + if( y > 150 ) h = 150; + return y; + }; + + var getOpacityPositionFromAlpha = function(alpha) { + var y = 150 * alpha; + if( y < 0 ) y = 0; + if( y > 150 ) y = 150; + return 150 - y; + }; + + var cleanHex = function(hex) { + return hex.replace(/[^A-F0-9]/ig, ''); + }; + + var expandHex = function(hex) { + hex = cleanHex(hex); + if( !hex ) return null; + if( hex.length === 3 ) hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + return hex.length === 6 ? hex : null; + }; + + var hsb2rgb = function(hsb) { + var rgb = {}; + var h = Math.round(hsb.h); + var s = Math.round(hsb.s*255/100); + var v = Math.round(hsb.b*255/100); + if(s === 0) { + rgb.r = rgb.g = rgb.b = v; + } else { + var t1 = v; + var t2 = (255 - s) * v / 255; + var t3 = (t1 - t2) * (h % 60) / 60; + if( h === 360 ) h = 0; + if( h < 60 ) { rgb.r = t1; rgb.b = t2; rgb.g = t2 + t3; } + else if( h < 120 ) {rgb.g = t1; rgb.b = t2; rgb.r = t1 - t3; } + else if( h < 180 ) {rgb.g = t1; rgb.r = t2; rgb.b = t2 + t3; } + else if( h < 240 ) {rgb.b = t1; rgb.r = t2; rgb.g = t1 - t3; } + else if( h < 300 ) {rgb.b = t1; rgb.g = t2; rgb.r = t2 + t3; } + else if( h < 360 ) {rgb.r = t1; rgb.g = t2; rgb.b = t1 - t3; } + else { rgb.r = 0; rgb.g = 0; rgb.b = 0; } + } + return { + r: Math.round(rgb.r), + g: Math.round(rgb.g), + b: Math.round(rgb.b) + }; + }; + + var rgb2hex = function(rgb) { + var hex = [ + rgb.r.toString(16), + rgb.g.toString(16), + rgb.b.toString(16) + ]; + $.each(hex, function(nr, val) { + if (val.length === 1) hex[nr] = '0' + val; + }); + return hex.join(''); + }; + + var hex2rgb = function(hex) { + hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16); + + return { + r: hex >> 16, + g: (hex & 0x00FF00) >> 8, + b: (hex & 0x0000FF) + }; + }; + + var rgb2hsb = function(rgb) { + var hsb = { h: 0, s: 0, b: 0 }; + var min = Math.min(rgb.r, rgb.g, rgb.b); + var max = Math.max(rgb.r, rgb.g, rgb.b); + var delta = max - min; + hsb.b = max; + hsb.s = max !== 0 ? 255 * delta / max : 0; + if( hsb.s !== 0 ) { + if( rgb.r === max ) { + hsb.h = (rgb.g - rgb.b) / delta; + } else if( rgb.g === max ) { + hsb.h = 2 + (rgb.b - rgb.r) / delta; + } else { + hsb.h = 4 + (rgb.r - rgb.g) / delta; + } + } else { + hsb.h = -1; + } + hsb.h *= 60; + if( hsb.h < 0 ) { + hsb.h += 360; + } + hsb.s *= 100/255; + hsb.b *= 100/255; + return hsb; + }; + + var hex2hsb = function(hex) { + var hsb = rgb2hsb(hex2rgb(hex)); + // Zero out hue marker for black, white, and grays (saturation === 0) + if( hsb.s === 0 ) hsb.h = 360; + return hsb; + }; + + var hsb2hex = function(hsb) { + return rgb2hex(hsb2rgb(hsb)); + }; + + + // Handle calls to $([selector]).miniColors() + switch(o) { + + case 'readonly': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + $(this).prop('readonly', data); + }); + + return $(this); + + case 'disabled': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + if( data ) { + disable($(this)); + } else { + enable($(this)); + } + }); + + return $(this); + + case 'value': + + // Getter + if( data === undefined ) { + if( !$(this).hasClass('miniColors') ) return; + var input = $(this), + hex = expandHex(input.val()); + return hex ? '#' + convertCase(hex, input.data('letterCase')) : null; + } + + // Setter + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + $(this).val(data); + setColorFromInput($(this)); + }); + + return $(this); + + case 'opacity': + + // Getter + if( data === undefined ) { + if( !$(this).hasClass('miniColors') ) return; + if( $(this).data('opacity') ) { + return parseFloat($(this).attr('data-opacity')); + } else { + return null; + } + } + + // Setter + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + if( data < 0 ) data = 0; + if( data > 1 ) data = 1; + $(this).attr('data-opacity', data).data('alpha', data); + setColorFromInput($(this)); + }); + + return $(this); + + case 'destroy': + + $(this).each( function() { + if( !$(this).hasClass('miniColors') ) return; + destroy($(this)); + }); + + return $(this); + + default: + + if( !o ) o = {}; + + $(this).each( function() { + + // Must be called on an input element + if( $(this)[0].tagName.toLowerCase() !== 'input' ) return; + + // If a trigger is present, the control was already created + if( $(this).data('trigger') ) return; + + // Create the control + create($(this), o, data); + + }); + + return $(this); + + } + + } + + }); + +})(jQuery); \ No newline at end of file diff --git a/3rdparty/miniColors/js/jquery.miniColors.min.js b/3rdparty/miniColors/js/jquery.miniColors.min.js new file mode 100755 index 00000000000..1d3346455b0 --- /dev/null +++ b/3rdparty/miniColors/js/jquery.miniColors.min.js @@ -0,0 +1,9 @@ +/* + * jQuery miniColors: A small color selector + * + * Copyright 2012 Cory LaViska for A Beautiful Site, LLC. (http://www.abeautifulsite.net/) + * + * Dual licensed under the MIT or GPL Version 2 licenses + * +*/ +if(jQuery)(function($){$.extend($.fn,{miniColors:function(o,data){var create=function(input,o,data){var color=expandHex(input.val())||'ffffff',hsb=hex2hsb(color),rgb=hsb2rgb(hsb),alpha=parseFloat(input.attr('data-opacity')).toFixed(2);if(alpha>1)alpha=1;if(alpha<0)alpha=0;var trigger=$('');trigger.insertAfter(input);trigger.wrap('');if(o.opacity){trigger.css('backgroundColor','rgba('+rgb.r+', '+rgb.g+', '+rgb.b+', '+alpha+')')}input.addClass('miniColors').data('original-maxlength',input.attr('maxlength')||null).data('original-autocomplete',input.attr('autocomplete')||null).data('letterCase',o.letterCase==='uppercase'?'uppercase':'lowercase').data('opacity',o.opacity?true:false).data('alpha',alpha).data('trigger',trigger).data('hsb',hsb).data('change',o.change?o.change:null).data('close',o.close?o.close:null).data('open',o.open?o.open:null).attr('maxlength',7).attr('autocomplete','off').val('#'+convertCase(color,o.letterCase));if(o.readonly||input.prop('readonly'))input.prop('readonly',true);if(o.disabled||input.prop('disabled'))disable(input);trigger.on('click.miniColors',function(event){event.preventDefault();if(input.val()==='')input.val('#');show(input)});input.on('focus.miniColors',function(event){if(input.val()==='')input.val('#');show(input)});input.on('blur.miniColors',function(event){var hex=expandHex(hsb2hex(input.data('hsb')));input.val(hex?'#'+convertCase(hex,input.data('letterCase')):'')});input.on('keydown.miniColors',function(event){if(event.keyCode===9)hide(input)});input.on('keyup.miniColors',function(event){setColorFromInput(input)});input.on('paste.miniColors',function(event){setTimeout(function(){setColorFromInput(input)},5)})};var destroy=function(input){hide();input=$(input);input.data('trigger').parent().remove();input.attr('autocomplete',input.data('original-autocomplete')).attr('maxlength',input.data('original-maxlength')).removeData().removeClass('miniColors').off('.miniColors');$(document).off('.miniColors')};var enable=function(input){input.prop('disabled',false).data('trigger').parent().removeClass('disabled')};var disable=function(input){hide(input);input.prop('disabled',true).data('trigger').parent().addClass('disabled')};var show=function(input){if(input.prop('disabled'))return false;hide();var selector=$('
                ');selector.append('
                ').append('
                ').css('display','none').addClass(input.attr('class'));if(input.data('opacity')){selector.addClass('opacity').prepend('
                ')}var hsb=input.data('hsb');selector.find('.miniColors-colors').css('backgroundColor','#'+hsb2hex({h:hsb.h,s:100,b:100})).end().find('.miniColors-opacity').css('backgroundColor','#'+hsb2hex({h:hsb.h,s:hsb.s,b:hsb.b})).end();var colorPosition=input.data('colorPosition');if(!colorPosition)colorPosition=getColorPositionFromHSB(hsb);selector.find('.miniColors-colorPicker').css('top',colorPosition.y+'px').css('left',colorPosition.x+'px');var huePosition=input.data('huePosition');if(!huePosition)huePosition=getHuePositionFromHSB(hsb);selector.find('.miniColors-huePicker').css('top',huePosition+'px');var opacityPosition=input.data('opacityPosition');if(!opacityPosition)opacityPosition=getOpacityPositionFromAlpha(input.attr('data-opacity'));selector.find('.miniColors-opacityPicker').css('top',opacityPosition+'px');input.data('selector',selector).data('huePicker',selector.find('.miniColors-huePicker')).data('opacityPicker',selector.find('.miniColors-opacityPicker')).data('colorPicker',selector.find('.miniColors-colorPicker')).data('mousebutton',0);$('BODY').append(selector);var trigger=input.data('trigger'),hidden=!input.is(':visible'),top=hidden?trigger.offset().top+trigger.outerHeight():input.offset().top+input.outerHeight(),left=hidden?trigger.offset().left:input.offset().left,selectorWidth=selector.outerWidth(),selectorHeight=selector.outerHeight(),triggerWidth=trigger.outerWidth(),triggerHeight=trigger.outerHeight(),windowHeight=$(window).height(),windowWidth=$(window).width(),scrollTop=$(window).scrollTop(),scrollLeft=$(window).scrollLeft();if((top+selectorHeight)>windowHeight+scrollTop)top=top-selectorHeight-triggerHeight;if((left+selectorWidth)>windowWidth+scrollLeft)left=left-selectorWidth+triggerWidth;selector.css({top:top,left:left}).fadeIn(100);selector.on('selectstart',function(){return false});if(!$.browser.msie||($.browser.msie&&$.browser.version>=9)){$(window).on('resize.miniColors',function(event){hide(input)})}$(document).on('mousedown.miniColors touchstart.miniColors',function(event){input.data('mousebutton',1);var testSubject=$(event.target).parents().andSelf();if(testSubject.hasClass('miniColors-colors')){event.preventDefault();input.data('moving','colors');moveColor(input,event)}if(testSubject.hasClass('miniColors-hues')){event.preventDefault();input.data('moving','hues');moveHue(input,event)}if(testSubject.hasClass('miniColors-opacity')){event.preventDefault();input.data('moving','opacity');moveOpacity(input,event)}if(testSubject.hasClass('miniColors-selector')){event.preventDefault();return}if(testSubject.hasClass('miniColors'))return;hide(input)}).on('mouseup.miniColors touchend.miniColors',function(event){event.preventDefault();input.data('mousebutton',0).removeData('moving')}).on('mousemove.miniColors touchmove.miniColors',function(event){event.preventDefault();if(input.data('mousebutton')===1){if(input.data('moving')==='colors')moveColor(input,event);if(input.data('moving')==='hues')moveHue(input,event);if(input.data('moving')==='opacity')moveOpacity(input,event)}});if(input.data('open')){input.data('open').call(input.get(0),'#'+hsb2hex(hsb),$.extend(hsb2rgb(hsb),{a:parseFloat(input.attr('data-opacity'))}))}};var hide=function(input){if(!input)input=$('.miniColors');input.each(function(){var selector=$(this).data('selector');$(this).removeData('selector');$(selector).fadeOut(100,function(){if(input.data('close')){var hsb=input.data('hsb'),hex=hsb2hex(hsb);input.data('close').call(input.get(0),'#'+hex,$.extend(hsb2rgb(hsb),{a:parseFloat(input.attr('data-opacity'))}))}$(this).remove()})});$(document).off('.miniColors')};var moveColor=function(input,event){var colorPicker=input.data('colorPicker');colorPicker.hide();var position={x:event.pageX,y:event.pageY};if(event.originalEvent.changedTouches){position.x=event.originalEvent.changedTouches[0].pageX;position.y=event.originalEvent.changedTouches[0].pageY}position.x=position.x-input.data('selector').find('.miniColors-colors').offset().left-6;position.y=position.y-input.data('selector').find('.miniColors-colors').offset().top-6;if(position.x<=-5)position.x=-5;if(position.x>=144)position.x=144;if(position.y<=-5)position.y=-5;if(position.y>=144)position.y=144;input.data('colorPosition',position);colorPicker.css('left',position.x).css('top',position.y).show();var s=Math.round((position.x+5)*0.67);if(s<0)s=0;if(s>100)s=100;var b=100-Math.round((position.y+5)*0.67);if(b<0)b=0;if(b>100)b=100;var hsb=input.data('hsb');hsb.s=s;hsb.b=b;setColor(input,hsb,true)};var moveHue=function(input,event){var huePicker=input.data('huePicker');huePicker.hide();var position=event.pageY;if(event.originalEvent.changedTouches){position=event.originalEvent.changedTouches[0].pageY}position=position-input.data('selector').find('.miniColors-colors').offset().top-1;if(position<=-1)position=-1;if(position>=149)position=149;input.data('huePosition',position);huePicker.css('top',position).show();var h=Math.round((150-position-1)*2.4);if(h<0)h=0;if(h>360)h=360;var hsb=input.data('hsb');hsb.h=h;setColor(input,hsb,true)};var moveOpacity=function(input,event){var opacityPicker=input.data('opacityPicker');opacityPicker.hide();var position=event.pageY;if(event.originalEvent.changedTouches){position=event.originalEvent.changedTouches[0].pageY}position=position-input.data('selector').find('.miniColors-colors').offset().top-1;if(position<=-1)position=-1;if(position>=149)position=149;input.data('opacityPosition',position);opacityPicker.css('top',position).show();var alpha=parseFloat((150-position-1)/150).toFixed(2);if(alpha<0)alpha=0;if(alpha>1)alpha=1;input.data('alpha',alpha).attr('data-opacity',alpha);setColor(input,input.data('hsb'),true)};var setColor=function(input,hsb,updateInput){input.data('hsb',hsb);var hex=hsb2hex(hsb),selector=$(input.data('selector'));if(updateInput)input.val('#'+convertCase(hex,input.data('letterCase')));selector.find('.miniColors-colors').css('backgroundColor','#'+hsb2hex({h:hsb.h,s:100,b:100})).end().find('.miniColors-opacity').css('backgroundColor','#'+hex).end();var rgb=hsb2rgb(hsb);input.data('trigger').css('backgroundColor','#'+hex);if(input.data('opacity')){input.data('trigger').css('backgroundColor','rgba('+rgb.r+', '+rgb.g+', '+rgb.b+', '+input.attr('data-opacity')+')')}if(input.data('change')){if((hex+','+input.attr('data-opacity'))===input.data('lastChange'))return;input.data('change').call(input.get(0),'#'+hex,$.extend(hsb2rgb(hsb),{a:parseFloat(input.attr('data-opacity'))}));input.data('lastChange',hex+','+input.attr('data-opacity'))}};var setColorFromInput=function(input){input.val('#'+cleanHex(input.val()));var hex=expandHex(input.val());if(!hex)return false;var hsb=hex2hsb(hex);var colorPosition=getColorPositionFromHSB(hsb);var colorPicker=$(input.data('colorPicker'));colorPicker.css('top',colorPosition.y+'px').css('left',colorPosition.x+'px');input.data('colorPosition',colorPosition);var huePosition=getHuePositionFromHSB(hsb);var huePicker=$(input.data('huePicker'));huePicker.css('top',huePosition+'px');input.data('huePosition',huePosition);var opacityPosition=getOpacityPositionFromAlpha(input.attr('data-opacity'));var opacityPicker=$(input.data('opacityPicker'));opacityPicker.css('top',opacityPosition+'px');input.data('opacityPosition',opacityPosition);setColor(input,hsb);return true};var convertCase=function(string,letterCase){if(letterCase==='uppercase'){return string.toUpperCase()}else{return string.toLowerCase()}};var getColorPositionFromHSB=function(hsb){var x=Math.ceil(hsb.s/0.67);if(x<0)x=0;if(x>150)x=150;var y=150-Math.ceil(hsb.b/0.67);if(y<0)y=0;if(y>150)y=150;return{x:x-5,y:y-5}};var getHuePositionFromHSB=function(hsb){var y=150-(hsb.h/2.4);if(y<0)h=0;if(y>150)h=150;return y};var getOpacityPositionFromAlpha=function(alpha){var y=150*alpha;if(y<0)y=0;if(y>150)y=150;return 150-y};var cleanHex=function(hex){return hex.replace(/[^A-F0-9]/ig,'')};var expandHex=function(hex){hex=cleanHex(hex);if(!hex)return null;if(hex.length===3)hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];return hex.length===6?hex:null};var hsb2rgb=function(hsb){var rgb={};var h=Math.round(hsb.h);var s=Math.round(hsb.s*255/100);var v=Math.round(hsb.b*255/100);if(s===0){rgb.r=rgb.g=rgb.b=v}else{var t1=v;var t2=(255-s)*v/255;var t3=(t1-t2)*(h%60)/60;if(h===360)h=0;if(h<60){rgb.r=t1;rgb.b=t2;rgb.g=t2+t3}else if(h<120){rgb.g=t1;rgb.b=t2;rgb.r=t1-t3}else if(h<180){rgb.g=t1;rgb.r=t2;rgb.b=t2+t3}else if(h<240){rgb.b=t1;rgb.r=t2;rgb.g=t1-t3}else if(h<300){rgb.b=t1;rgb.g=t2;rgb.r=t2+t3}else if(h<360){rgb.r=t1;rgb.g=t2;rgb.b=t1-t3}else{rgb.r=0;rgb.g=0;rgb.b=0}}return{r:Math.round(rgb.r),g:Math.round(rgb.g),b:Math.round(rgb.b)}};var rgb2hex=function(rgb){var hex=[rgb.r.toString(16),rgb.g.toString(16),rgb.b.toString(16)];$.each(hex,function(nr,val){if(val.length===1)hex[nr]='0'+val});return hex.join('')};var hex2rgb=function(hex){hex=parseInt(((hex.indexOf('#')>-1)?hex.substring(1):hex),16);return{r:hex>>16,g:(hex&0x00FF00)>>8,b:(hex&0x0000FF)}};var rgb2hsb=function(rgb){var hsb={h:0,s:0,b:0};var min=Math.min(rgb.r,rgb.g,rgb.b);var max=Math.max(rgb.r,rgb.g,rgb.b);var delta=max-min;hsb.b=max;hsb.s=max!==0?255*delta/max:0;if(hsb.s!==0){if(rgb.r===max){hsb.h=(rgb.g-rgb.b)/delta}else if(rgb.g===max){hsb.h=2+(rgb.b-rgb.r)/delta}else{hsb.h=4+(rgb.r-rgb.g)/delta}}else{hsb.h=-1}hsb.h*=60;if(hsb.h<0){hsb.h+=360}hsb.s*=100/255;hsb.b*=100/255;return hsb};var hex2hsb=function(hex){var hsb=rgb2hsb(hex2rgb(hex));if(hsb.s===0)hsb.h=360;return hsb};var hsb2hex=function(hsb){return rgb2hex(hsb2rgb(hsb))};switch(o){case'readonly':$(this).each(function(){if(!$(this).hasClass('miniColors'))return;$(this).prop('readonly',data)});return $(this);case'disabled':$(this).each(function(){if(!$(this).hasClass('miniColors'))return;if(data){disable($(this))}else{enable($(this))}});return $(this);case'value':if(data===undefined){if(!$(this).hasClass('miniColors'))return;var input=$(this),hex=expandHex(input.val());return hex?'#'+convertCase(hex,input.data('letterCase')):null}$(this).each(function(){if(!$(this).hasClass('miniColors'))return;$(this).val(data);setColorFromInput($(this))});return $(this);case'opacity':if(data===undefined){if(!$(this).hasClass('miniColors'))return;if($(this).data('opacity')){return parseFloat($(this).attr('data-opacity'))}else{return null}}$(this).each(function(){if(!$(this).hasClass('miniColors'))return;if(data<0)data=0;if(data>1)data=1;$(this).attr('data-opacity',data).data('alpha',data);setColorFromInput($(this))});return $(this);case'destroy':$(this).each(function(){if(!$(this).hasClass('miniColors'))return;destroy($(this))});return $(this);default:if(!o)o={};$(this).each(function(){if($(this)[0].tagName.toLowerCase()!=='input')return;if($(this).data('trigger'))return;create($(this),o,data)});return $(this)}}})})(jQuery); \ No newline at end of file diff --git a/3rdparty/openid/class.openid.v3.php b/3rdparty/openid/class.openid.v3.php new file mode 100644 index 00000000000..eeb31986659 --- /dev/null +++ b/3rdparty/openid/class.openid.v3.php @@ -0,0 +1,326 @@ +SetIdentity($_POST['openid_url']); + :: SET RETURN URL :: + $openid->SetApprovedURL('http://www.yoursite.com/return.php'); // Script which handles a response from OpenID Server + :: SET TRUST ROOT :: + $openid->SetTrustRoot('http://www.yoursite.com/'); + :: FETCH SERVER URL FROM IDENTITY PAGE :: [Note: It is recomended to cache this (Session, Cookie, Database)] + $openid->GetOpenIDServer(); // Returns false if server is not found + :: REDIRECT USER TO OPEN ID SERVER FOR APPROVAL :: + + :: (OPTIONAL) SET OPENID SERVER :: + $openid->SetOpenIDServer($server_url); // If you have cached previously this, you don't have to call GetOpenIDServer and set value this directly + + STEP 2) + Once user gets returned we must validate signature + :: VALIDATE REQUEST :: + true|false = $openid->ValidateWithServer(); + + ERRORS: + array = $openid->GetError(); // Get latest Error code + + FIELDS: + OpenID allowes you to retreive a profile. To set what fields you'd like to get use (accepts either string or array): + $openid->SetRequiredFields(array('email','fullname','dob','gender','postcode','country','language','timezone')); + or + $openid->SetOptionalFields('postcode'); + +IMPORTANT TIPS: +OPENID as is now, is not trust system. It is a great single-sign on method. If you want to +store information about OpenID in your database for later use, make sure you handle url identities +properly. + For example: + https://steve.myopenid.com/ + https://steve.myopenid.com + http://steve.myopenid.com/ + http://steve.myopenid.com + ... are representing one single user. Some OpenIDs can be in format openidserver.com/users/user/ - keep this in mind when storing identities + + To help you store an OpenID in your DB, you can use function: + $openid_db_safe = $openid->OpenID_Standarize($upenid); + This may not be comatible with current specs, but it works in current enviroment. Use this function to get openid + in one format like steve.myopenid.com (without trailing slashes and http/https). + Use output to insert Identity to database. Don't use this for validation - it may fail. + +*/ + +class SimpleOpenID{ + var $openid_url_identity; + var $URLs = array(); + var $error = array(); + var $fields = array( + 'required' => array(), + 'optional' => array(), + ); + + function SimpleOpenID(){ + if (!function_exists('curl_exec')) { + die('Error: Class SimpleOpenID requires curl extension to work'); + } + } + function SetOpenIDServer($a){ + $this->URLs['openid_server'] = $a; + } + function SetTrustRoot($a){ + $this->URLs['trust_root'] = $a; + } + function SetCancelURL($a){ + $this->URLs['cancel'] = $a; + } + function SetApprovedURL($a){ + $this->URLs['approved'] = $a; + } + function SetRequiredFields($a){ + if (is_array($a)){ + $this->fields['required'] = $a; + }else{ + $this->fields['required'][] = $a; + } + } + function SetOptionalFields($a){ + if (is_array($a)){ + $this->fields['optional'] = $a; + }else{ + $this->fields['optional'][] = $a; + } + } + function SetIdentity($a){ // Set Identity URL + if ((stripos($a, 'http://') === false) + && (stripos($a, 'https://') === false)){ + $a = 'http://'.$a; + } +/* + $u = parse_url(trim($a)); + if (!isset($u['path'])){ + $u['path'] = '/'; + }else if(substr($u['path'],-1,1) == '/'){ + $u['path'] = substr($u['path'], 0, strlen($u['path'])-1); + } + if (isset($u['query'])){ // If there is a query string, then use identity as is + $identity = $a; + }else{ + $identity = $u['scheme'] . '://' . $u['host'] . $u['path']; + } +//*/ + $this->openid_url_identity = $a; + } + function GetIdentity(){ // Get Identity + return $this->openid_url_identity; + } + function GetError(){ + $e = $this->error; + return array('code'=>$e[0],'description'=>$e[1]); + } + + function ErrorStore($code, $desc = null){ + $errs['OPENID_NOSERVERSFOUND'] = 'Cannot find OpenID Server TAG on Identity page.'; + if ($desc == null){ + $desc = $errs[$code]; + } + $this->error = array($code,$desc); + } + + function IsError(){ + if (count($this->error) > 0){ + return true; + }else{ + return false; + } + } + + function splitResponse($response) { + $r = array(); + $response = explode("\n", $response); + foreach($response as $line) { + $line = trim($line); + if ($line != "") { + list($key, $value) = explode(":", $line, 2); + $r[trim($key)] = trim($value); + } + } + return $r; + } + + function OpenID_Standarize($openid_identity = null){ + if ($openid_identity === null) + $openid_identity = $this->openid_url_identity; + + $u = parse_url(strtolower(trim($openid_identity))); + + if (!isset($u['path']) || ($u['path'] == '/')) { + $u['path'] = ''; + } + if(substr($u['path'],-1,1) == '/'){ + $u['path'] = substr($u['path'], 0, strlen($u['path'])-1); + } + if (isset($u['query'])){ // If there is a query string, then use identity as is + return $u['host'] . $u['path'] . '?' . $u['query']; + }else{ + return $u['host'] . $u['path']; + } + } + + function array2url($arr){ // converts associated array to URL Query String + if (!is_array($arr)){ + return false; + } + $query = ''; + foreach($arr as $key => $value){ + $query .= $key . "=" . $value . "&"; + } + return $query; + } + function FSOCK_Request($url, $method="GET", $params = ""){ + $fp = fsockopen("ssl://www.myopenid.com", 443, $errno, $errstr, 3); // Connection timeout is 3 seconds + if (!$fp) { + $this->ErrorStore('OPENID_SOCKETERROR', $errstr); + return false; + } else { + $request = $method . " /server HTTP/1.0\r\n"; + $request .= "User-Agent: Simple OpenID PHP Class (http://www.phpclasses.org/simple_openid)\r\n"; + $request .= "Connection: close\r\n\r\n"; + fwrite($fp, $request); + stream_set_timeout($fp, 4); // Connection response timeout is 4 seconds + $res = fread($fp, 2000); + $info = stream_get_meta_data($fp); + fclose($fp); + + if ($info['timed_out']) { + $this->ErrorStore('OPENID_SOCKETTIMEOUT'); + } else { + return $res; + } + } + } + function CURL_Request($url, $method="GET", $params = "") { // Remember, SSL MUST BE SUPPORTED + if (is_array($params)) $params = $this->array2url($params); + $curl = curl_init($url . ($method == "GET" && $params != "" ? "?" . $params : "")); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($curl, CURLOPT_HEADER, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_HTTPGET, ($method == "GET")); + curl_setopt($curl, CURLOPT_POST, ($method == "POST")); + if ($method == "POST") curl_setopt($curl, CURLOPT_POSTFIELDS, $params); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + $response = curl_exec($curl); + + if (curl_errno($curl) == 0){ + $response; + }else{ + $this->ErrorStore('OPENID_CURL', curl_error($curl)); + } + return $response; + } + + function HTML2OpenIDServer($content) { + $get = array(); + + // Get details of their OpenID server and (optional) delegate + preg_match_all('/]*rel=[\'"](openid2.provider )?openid.server[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1); + preg_match_all('/]*href=\'"([^\'"]+)[\'"][^>]*rel=[\'"](openid2.provider )?openid.server[\'"][^>]*\/?>/i', $content, $matches2); + $servers = array_merge($matches1[2], $matches2[1]); + + preg_match_all('/]*rel=[\'"]openid.delegate[\'"][^>]*href=[\'"]([^\'"]+)[\'"][^>]*\/?>/i', $content, $matches1); + + preg_match_all('/]*href=[\'"]([^\'"]+)[\'"][^>]*rel=[\'"]openid.delegate[\'"][^>]*\/?>/i', $content, $matches2); + + $delegates = array_merge($matches1[1], $matches2[1]); + + $ret = array($servers, $delegates); + return $ret; + } + + function GetOpenIDServer(){ + $response = $this->CURL_Request($this->openid_url_identity); + list($servers, $delegates) = $this->HTML2OpenIDServer($response); + if (count($servers) == 0){ + $this->ErrorStore('OPENID_NOSERVERSFOUND'); + return false; + } + if (isset($delegates[0]) + && ($delegates[0] != "")){ + $this->SetIdentity($delegates[0]); + } + $this->SetOpenIDServer($servers[0]); + return $servers[0]; + } + + function GetRedirectURL(){ + $params = array(); + $params['openid.return_to'] = urlencode($this->URLs['approved']); + $params['openid.mode'] = 'checkid_setup'; + $params['openid.identity'] = urlencode($this->openid_url_identity); + $params['openid.trust_root'] = urlencode($this->URLs['trust_root']); + + if (isset($this->fields['required']) + && (count($this->fields['required']) > 0)) { + $params['openid.sreg.required'] = implode(',',$this->fields['required']); + } + if (isset($this->fields['optional']) + && (count($this->fields['optional']) > 0)) { + $params['openid.sreg.optional'] = implode(',',$this->fields['optional']); + } + return $this->URLs['openid_server'] . "?". $this->array2url($params); + } + + function Redirect(){ + $redirect_to = $this->GetRedirectURL(); + if (headers_sent()){ // Use JavaScript to redirect if content has been previously sent (not recommended, but safe) + echo ''; + }else{ // Default Header Redirect + header('Location: ' . $redirect_to); + } + } + + function ValidateWithServer(){ + $params = array( + 'openid.assoc_handle' => urlencode($_GET['openid_assoc_handle']), + 'openid.signed' => urlencode($_GET['openid_signed']), + 'openid.sig' => urlencode($_GET['openid_sig']) + ); + // Send only required parameters to confirm validity + $arr_signed = explode(",",str_replace('sreg.','sreg_',$_GET['openid_signed'])); + for ($i=0; $iGetOpenIDServer(); + if ($openid_server == false){ + return false; + } + $response = $this->CURL_Request($openid_server,'POST',$params); + $data = $this->splitResponse($response); + + if ($data['is_valid'] == "true") { + return true; + }else{ + return false; + } + } +} diff --git a/3rdparty/openid/phpmyid.php b/3rdparty/openid/phpmyid.php new file mode 100644 index 00000000000..13fd31c47ca --- /dev/null +++ b/3rdparty/openid/phpmyid.php @@ -0,0 +1,1707 @@ + + * @copyright 2006-2008 + * @license http://www.gnu.org/licenses/gpl.html GNU Public License + * @url http://siege.org/projects/phpMyID + * @version 0.9 + */ + +/** + * Set a constant to indicate that phpMyID is running + */ +define('PHPMYID_STARTED', true); + +/** + * List the known types and modes + * @name $known + * @global array $GLOBALS['known'] + */ +$GLOBALS['known'] = array( + 'assoc_types' => array('HMAC-SHA1'), + + 'openid_modes' => array('accept', + 'associate', + 'authorize', + 'cancel', + 'checkid_immediate', + 'checkid_setup', + 'check_authentication', + 'error', + 'id_res', + 'login', + 'logout', + 'test'), + + 'session_types' => array('', + 'DH-SHA1'), + + 'bigmath_types' => array('DH-SHA1'), +); + +/** + * Defined by OpenID spec + * @name $g + * @global integer $GLOBALS['g'] + */ +$GLOBALS['g'] = 2; + +/** + * Defined by OpenID spec + * @name $p + * @global integer $GLOBALS['p'] + */ +$GLOBALS['p'] = '155172898181473697471232257763715539915724801966915404479707' . +'7953140576293785419175806512274236981889937278161526466314385615958256881888' . +'8995127215884267541995034125870655654980358010487053768147672651325574704076' . +'5857479291291572334510643245094715007229621094194349783925984760375594985848' . +'253359305585439638443'; + + +// Runmode functions + +/** + * Allow the user to accept trust on a URL + * @global array $profile + */ +function accept_mode () { + global $profile; + + // this is a user session + user_session(); + + // the user needs refresh urls in their session to access this mode + if (! isset($_SESSION['post_accept_url']) || ! isset($_SESSION['cancel_accept_url']) || ! isset($_SESSION['unaccepted_url'])) + error_500('You may not access this mode directly.'); + + // has the user accepted the trust_root? + $accepted = @strlen($_REQUEST['accepted']) + ? $_REQUEST['accepted'] + : null; + + // if so, refresh back to post_accept_url + if ($accepted === 'yes') { + $_SESSION['accepted_url'] = $_SESSION['unaccepted_url']; + wrap_redirect($_SESSION['post_accept_url']); + + // if they rejected it, return to the client + } elseif ($accepted === 'no') { + wrap_redirect($_SESSION['cancel_accept_url']); + } + + // if neither, offer the trust request + $q = strpos($profile['req_url'], '?') ? '&' : '?'; + $yes = $profile['req_url'] . $q . 'accepted=yes'; + $no = $profile['req_url'] . $q . 'accepted=no'; + + wrap_html('The client site you are attempting to log into has requested that you trust the following URL:
                ' . $_SESSION['unaccepted_url'] . '

                Do you wish to continue?
                Yes | No'); +} + +/** * Perform an association with a consumer + * @global array $known + * @global array $profile + * @global integer $g + * @global integer $p + */ +function associate_mode () { + global $g, $known, $p, $profile; + + // Validate the request + if (! isset($_REQUEST['openid_mode']) || $_REQUEST['openid_mode'] != 'associate') + error_400(); + + // Get the request options, using defaults as necessary + $assoc_type = (@strlen($_REQUEST['openid_assoc_type']) + && in_array($_REQUEST['openid_assoc_type'], $known['assoc_types'])) + ? $_REQUEST['openid_assoc_type'] + : 'HMAC-SHA1'; + + $session_type = (@strlen($_REQUEST['openid_session_type']) + && in_array($_REQUEST['openid_session_type'], $known['session_types'])) + ? $_REQUEST['openid_session_type'] + : ''; + + $dh_modulus = (@strlen($_REQUEST['openid_dh_modulus'])) + ? long(base64_decode($_REQUEST['openid_dh_modulus'])) + : ($session_type == 'DH-SHA1' + ? $p + : null); + + $dh_gen = (@strlen($_REQUEST['openid_dh_gen'])) + ? long(base64_decode($_REQUEST['openid_dh_gen'])) + : ($session_type == 'DH-SHA1' + ? $g + : null); + + $dh_consumer_public = (@strlen($_REQUEST['openid_dh_consumer_public'])) + ? $_REQUEST['openid_dh_consumer_public'] + : ($session_type == 'DH-SHA1' + ? error_post('dh_consumer_public was not specified') + : null); + + $lifetime = time() + $profile['lifetime']; + + // Create standard keys + $keys = array( + 'assoc_type' => $assoc_type, + 'expires_in' => $profile['lifetime'] + ); + + // If I can't handle bigmath, default to plaintext sessions + if (in_array($session_type, $known['bigmath_types']) && $profile['use_bigmath'] === false) + $session_type = null; + + // Add response keys based on the session type + switch ($session_type) { + case 'DH-SHA1': + // Create the associate id and shared secret now + list ($assoc_handle, $shared_secret) = new_assoc($lifetime); + + // Compute the Diffie-Hellman stuff + $private_key = random($dh_modulus); + $public_key = bmpowmod($dh_gen, $private_key, $dh_modulus); + $remote_key = long(base64_decode($dh_consumer_public)); + $ss = bmpowmod($remote_key, $private_key, $dh_modulus); + + $keys['assoc_handle'] = $assoc_handle; + $keys['session_type'] = $session_type; + $keys['dh_server_public'] = base64_encode(bin($public_key)); + $keys['enc_mac_key'] = base64_encode(x_or(sha1_20(bin($ss)), $shared_secret)); + + break; + + default: + // Create the associate id and shared secret now + list ($assoc_handle, $shared_secret) = new_assoc($lifetime); + + $keys['assoc_handle'] = $assoc_handle; + $keys['mac_key'] = base64_encode($shared_secret); + } + + // Return the keys + wrap_kv($keys); +} + + +/** + * Perform a user authorization + * @global array $profile + */ +function authorize_mode () { + global $profile; + global $USERNAME; + global $IDENTITY; + + // this is a user session + + // the user needs refresh urls in their session to access this mode + if (! isset($_SESSION['post_auth_url']) || ! isset($_SESSION['cancel_auth_url'])) + error_500('You may not access this mode directly.'); + + $profile['idp_url']=$IDENTITY; + if (isset($_SERVER['PHP_AUTH_USER']) && $profile['authorized'] === false && $_SERVER['PHP_AUTH_USER']==$USERNAME) { + if (OCP\User::checkPassword($USERNAME, $_SERVER['PHP_AUTH_PW'])) {// successful login! + // return to the refresh url if they get in + $_SESSION['openid_auth']=true; + $_SESSION['openid_user']=$USERNAME; + wrap_redirect($_SESSION['post_auth_url']); + + // failed login + } else { + $_SESSION['failures']++; + debug('Login failed'); + debug('Fail count: ' . $_SESSION['failures']); + } + + } + + // if we get this far the user is not authorized, so send the headers + $uid = uniqid(mt_rand(1,9)); + $_SESSION['uniqid'] = $uid; + +// debug('Prompting user to log in. Stale? ' . $stale); + header('HTTP/1.0 401 Unauthorized'); +// header(sprintf('WWW-Authenticate: Digest qop="auth-int, auth", realm="%s", domain="%s", nonce="%s", opaque="%s", stale="%s", algorithm="MD5"', $profile['auth_realm'], $profile['auth_domain'], $uid, md5($profile['auth_realm']), $stale ? 'true' : 'false')); + header('WWW-Authenticate: Basic realm="ownCloud"'); + $q = strpos($_SESSION['cancel_auth_url'], '?') ? '&' : '?'; + wrap_refresh($_SESSION['cancel_auth_url'] . $q . 'openid.mode=cancel'); +// die('401 Unauthorized'); +} + + +/** + * Handle a consumer's request for cancellation. + */ +function cancel_mode () { + wrap_html('Request cancelled.'); +} + + +/** + * Handle a consumer's request to see if the user is authenticated + */ +function check_authentication_mode () { + // Validate the request + if (! isset($_REQUEST['openid_mode']) || $_REQUEST['openid_mode'] != 'check_authentication') + error_400(); + + $assoc_handle = @strlen($_REQUEST['openid_assoc_handle']) + ? $_REQUEST['openid_assoc_handle'] + : error_post('Missing assoc_handle'); + + $sig = @strlen($_REQUEST['openid_sig']) + ? $_REQUEST['openid_sig'] + : error_post('Missing sig'); + + $signed = @strlen($_REQUEST['openid_signed']) + ? $_REQUEST['openid_signed'] + : error_post('Missing signed'); + + // Prepare the return keys + $keys = array( + 'openid.mode' => 'id_res' + ); + + // Invalidate the assoc handle if we need to + if (@strlen($_REQUEST['openid_invalidate_handle'])) { + destroy_assoc_handle($_REQUEST['openid_invalidate_handle']); + + $keys['invalidate_handle'] = $_REQUEST['openid_invalidate_handle']; + } + + // Validate the sig by recreating the kv pair and signing + $_REQUEST['openid_mode'] = 'id_res'; + $tokens = ''; + foreach (explode(',', $signed) as $param) { + $post = preg_replace('/\./', '_', $param); + $tokens .= sprintf("%s:%s\n", $param, $_REQUEST['openid_' . $post]); + } + + // Add the sreg stuff, if we've got it + if (isset($sreg_required)) { + foreach (explode(',', $sreg_required) as $key) { + if (! isset($sreg[$key])) + continue; + $skey = 'sreg.' . $key; + + $tokens .= sprintf("%s:%s\n", $skey, $sreg[$key]); + $keys[$skey] = $sreg[$key]; + $fields[] = $skey; + } + } + + // Look up the consumer's shared_secret and timeout + list ($shared_secret, $expires) = secret($assoc_handle); + + // if I can't verify the assoc_handle, or if it's expired + if ($shared_secret == false || (is_numeric($expires) && $expires < time())) { + $keys['is_valid'] = 'false'; + + } else { + $ok = base64_encode(hmac($shared_secret, $tokens)); + $keys['is_valid'] = ($sig == $ok) ? 'true' : 'false'; + } + + // Return the keys + wrap_kv($keys); +} + + +/** + * Handle a consumer's request to see if the end user is logged in + * @global array $known + * @global array $profile + * @global array $sreg + */ +function checkid ( $wait ) { + global $known, $profile, $sreg; + global $USERNAME; + + // This is a user session + user_session(); + + // Get the options, use defaults as necessary + $return_to = isset($_REQUEST['openid_return_to']) + ? $_REQUEST['openid_return_to'] + : error_400('Missing return_to'); + + $identity = isset($_REQUEST['openid_identity']) + ? $_REQUEST['openid_identity'] + : error_get($return_to, 'Missing identity'); + + $assoc_handle = isset($_REQUEST['openid_assoc_handle']) + ? $_REQUEST['openid_assoc_handle'] + : null; + + $trust_root = isset($_REQUEST['openid_trust_root']) + ? $_REQUEST['openid_trust_root'] + : $return_to; + + $sreg_required = isset($_REQUEST['openid_sreg_required']) + ? $_REQUEST['openid_sreg.required'] + : ''; + + $sreg_optional = isset($_REQUEST['openid_sreg_optional']) + ? $_REQUEST['openid_sreg.optional'] + : ''; + + // determine the cancel url + $q = strpos($return_to, '?') ? '&' : '?'; + $cancel_url = $return_to . $q . 'openid.mode=cancel'; + + // required and optional make no difference to us + $sreg_required .= ',' . $sreg_optional; + // do the trust_root analysis + if ($trust_root != $return_to) { + // the urls are not the same, be sure return decends from trust + if (! url_descends($return_to, $trust_root)) + error_500('Invalid trust_root: "' . $trust_root . '"'); + + } + + // transfer the user to the url accept mode if they're paranoid + if ($wait == 1 && isset($profile['paranoid']) && $profile['paranoid'] === true && (! isset($_SESSION['accepted_url']) || $_SESSION['accepted_url'] != $trust_root)) { + $_SESSION['cancel_accept_url'] = $cancel_url; + $_SESSION['post_accept_url'] = $profile['req_url']; + $_SESSION['unaccepted_url'] = $trust_root; + + debug('Transferring to acceptance mode.'); + debug('Cancel URL: ' . $_SESSION['cancel_accept_url']); + debug('Post URL: ' . $_SESSION['post_accept_url']); + + $q = strpos($profile['idp_url'], '?') ? '&' : '?'; + wrap_redirect($profile['idp_url'] . $q . 'openid.mode=accept'); + } + + // make sure i am this identifier +// if ($identity != $profile['idp_url']) { +// debug("Invalid identity: $identity"); +// debug("IdP URL: " . $profile['idp_url']); +// error_get($return_to, "Invalid identity: '$identity'"); +// } + + // begin setting up return keys + $keys = array( + 'mode' => 'id_res' + ); + + // if the user is not logged in, transfer to the authorization mode + if ($USERNAME=='' || $_SESSION['openid_auth'] === false || $USERNAME != $_SESSION['openid_user']) { + // users can only be logged in to one url at a time + $_SESSION['openid_user'] = null; + $_SESSION['auth_url'] = null; + + if ($wait) { + unset($_SESSION['uniqid']); + + $_SESSION['cancel_auth_url'] = $cancel_url; + $_SESSION['post_auth_url'] = $profile['req_url']; + + debug('Transferring to authorization mode.'); + debug('Cancel URL: ' . $_SESSION['cancel_auth_url']); + debug('Post URL: ' . $_SESSION['post_auth_url']); + + $q = strpos($profile['idp_url'], '?') ? '&' : '?'; + wrap_redirect($profile['idp_url'] . $q . 'openid.mode=authorize'); + } else { + $keys['user_setup_url'] = $profile['idp_url']; + } + + // the user is logged in + } else { + // remove the refresh URLs if set + unset($_SESSION['cancel_auth_url']); + unset($_SESSION['post_auth_url']); + + // check the assoc handle + list($shared_secret, $expires) = secret($assoc_handle); + + // if I can't verify the assoc_handle, or if it's expired + if ($shared_secret == false || (is_numeric($expires) && $expires < time())) { + debug("Session expired or missing key: $expires < " . time()); + if ($assoc_handle != null) { + $keys['invalidate_handle'] = $assoc_handle; + destroy_assoc_handle($assoc_handle); + } + + $lifetime = time() + $profile['lifetime']; + list ($assoc_handle, $shared_secret) = new_assoc($lifetime); + } + + $keys['identity'] = $profile['idp_url']; + $keys['assoc_handle'] = $assoc_handle; + $keys['return_to'] = $return_to; + + $fields = array_keys($keys); + $tokens = ''; + foreach ($fields as $key) + $tokens .= sprintf("%s:%s\n", $key, $keys[$key]); + + // add sreg keys + foreach (explode(',', $sreg_required) as $key) { + if (! isset($sreg[$key])) + continue; + $skey = 'sreg.' . $key; + + $tokens .= sprintf("%s:%s\n", $skey, $sreg[$key]); + $keys[$skey] = $sreg[$key]; + $fields[] = $skey; + } + + $keys['signed'] = implode(',', $fields); + $keys['sig'] = base64_encode(hmac($shared_secret, $tokens)); + } + + wrap_keyed_redirect($return_to, $keys); +} + + +/** + * Handle a consumer's request to see if the user is already logged in + */ +function checkid_immediate_mode () { + if (! isset($_REQUEST['openid_mode']) || $_REQUEST['openid_mode'] != 'checkid_immediate') + error_500(); + + checkid(false); +} + + +/** + * Handle a consumer's request to see if the user is logged in, but be willing + * to wait for them to perform a login if they're not + */ +function checkid_setup_mode () { + if (! isset($_REQUEST['openid_mode']) || $_REQUEST['openid_mode'] != 'checkid_setup') + error_500(); + + checkid(true); +} + + +/** + * Handle errors + */ +function error_mode () { + isset($_REQUEST['openid_error']) + ? wrap_html($_REQUEST['openid_error']) + : error_500(); +} + + +/** + * Show a user if they are logged in or not + * @global array $profile + */ +function id_res_mode () { + global $profile; + + user_session(); + + if ($profile['authorized']) + wrap_html('You are logged in as ' . $_SESSION['auth_username']); + + wrap_html('You are not logged in'); +} + + +/** + * Allow a user to perform a static login + * @global array $profile + */ +function login_mode () { + global $profile; + + user_session(); + + if ($profile['authorized']) + id_res_mode(); + + $keys = array( + 'mode' => 'checkid_setup', + 'identity' => $profile['idp_url'], + 'return_to' => $profile['idp_url'] + ); + + wrap_keyed_redirect($profile['idp_url'], $keys); +} + + +/** + * Allow a user to perform a static logout + * @global array $profile + */ +function logout_mode () { + global $profile; + + user_session(); + + if (! $profile['authorized']) + wrap_html('You were not logged in'); + + $_SESSION = array(); + session_destroy(); + debug('User session destroyed.'); + + header('HTTP/1.0 401 Unauthorized'); + wrap_redirect($profile['idp_url']); +} + + +/** + * The default information screen + * @global array $profile + */ +function no_mode () { + global $USERNAME, $profile; + $tmpl = new OCP\Template( 'user_openid', 'nomode', 'guest' ); + if(substr($profile['req_url'],-1,1)!=='/'){//the identity should always end with a / + $profile['req_url'].='/'; + } + $tmpl->addHeader('link',array('rel'=>'openid.server', 'href'=>$profile['req_url'])); + $tmpl->addHeader('link',array('rel'=>'openid.delegate', 'href'=>$profile['idp_url'])); + $tmpl->assign('user',$USERNAME); + $tmpl->printPage(); +} + + +/** + * Testing for setup + * @global array $profile + */ +function test_mode () { + global $profile, $p, $g; + + if ($profile['allow_test'] != true) + error_403(); + + @ini_set('max_execution_time', 180); + + $test_expire = time() + 120; + $test_ss_enc = 'W7hvmld2yEYdDb0fHfSkKhQX+PM='; + $test_ss = base64_decode($test_ss_enc); + $test_token = "alpha:bravo\ncharlie:delta\necho:foxtrot"; + $test_server_private = '11263846781670293092494395517924811173145217135753406847875706165886322533899689335716152496005807017390233667003995430954419468996805220211293016296351031812246187748601293733816011832462964410766956326501185504714561648498549481477143603650090931135412673422192550825523386522507656442905243832471167330268'; + $test_client_public = base64_decode('AL63zqI5a5p8HdXZF5hFu8p+P9GOb816HcHuvNOhqrgkKdA3fO4XEzmldlb37nv3+xqMBgWj6gxT7vfuFerEZLBvuWyVvR7IOGZmx0BAByoq3fxYd3Fpe2Coxngs015vK37otmH8e83YyyGo5Qua/NAf13yz1PVuJ5Ctk7E+YdVc'); + + $res = array(); + + // bcmath + $res['bcmath'] = extension_loaded('bcmath') + ? 'pass' : 'warn - not loaded'; + + // gmp + if ($profile['allow_gmp']) { + $res['gmp'] = extension_loaded('gmp') + ? 'pass' : 'warn - not loaded'; + } else { + $res['gmp'] = 'pass - n/a'; + } + + // get_temp_dir + $res['logfile'] = is_writable($profile['logfile']) + ? 'pass' : "warn - log is not writable"; + + // session & new_assoc + user_session(); + list($test_assoc, $test_new_ss) = new_assoc($test_expire); + $res['session'] = ($test_assoc != session_id()) + ? 'pass' : 'fail'; + + // secret + @session_unregister('shared_secret'); + list($check, $check2) = secret($test_assoc); + $res['secret'] = ($check == $test_new_ss) + ? 'pass' : 'fail'; + + // expire + $res['expire'] = ($check2 <= $test_expire) + ? 'pass' : 'fail'; + + // base64 + $res['base64'] = (base64_encode($test_ss) == $test_ss_enc) + ? 'pass' : 'fail'; + + // hmac + $test_sig = base64_decode('/VXgHvZAOdoz/OTa5+XJXzSGhjs='); + $check = hmac($test_ss, $test_token); + $res['hmac'] = ($check == $test_sig) + ? 'pass' : sprintf("fail - '%s'", base64_encode($check)); + + if ($profile['use_bigmath']) { + // bigmath powmod + $test_server_public = '102773334773637418574009974502372885384288396853657336911033649141556441102566075470916498748591002884433213640712303846640842555822818660704173387461364443541327856226098159843042567251113889701110175072389560896826887426539315893475252988846151505416694218615764823146765717947374855806613410142231092856731'; + $check = bmpowmod($g, $test_server_private, $p); + $res['bmpowmod-1'] = ($check == $test_server_public) + ? 'pass' : sprintf("fail - '%s'", $check); + + // long + $test_client_long = '133926731803116519408547886573524294471756220428015419404483437186057383311250738749035616354107518232016420809434801736658109316293127101479053449990587221774635063166689561125137927607200322073086097478667514042144489248048756916881344442393090205172004842481037581607299263456852036730858519133859409417564'; + $res['long'] = (long($test_client_public) == $test_client_long) + ? 'pass' : 'fail'; + + // bigmath powmod 2 + $test_client_share = '19333275433742428703546496981182797556056709274486796259858099992516081822015362253491867310832140733686713353304595602619444380387600756677924791671971324290032515367930532292542300647858206600215875069588627551090223949962823532134061941805446571307168890255137575975911397744471376862555181588554632928402'; + $check = bmpowmod($test_client_long, $test_server_private, $p); + $res['bmpowmod-2'] = ($check == $test_client_share) + ? 'pass' : sprintf("fail - '%s'", $check); + + // bin + $test_client_mac_s1 = base64_decode('G4gQQkYM6QmAzhKbVKSBahFesPL0nL3F2MREVwEtnVRRYI0ifl9zmPklwTcvURt3QTiGBd+9Dn3ESLk5qka6IO5xnILcIoBT8nnGVPiOZvTygfuzKp4tQ2mXuIATJoa7oXRGmBWtlSdFapH5Zt6NJj4B83XF/jzZiRwdYuK4HJI='); + $check = bin($test_client_share); + $res['bin'] = ($check == $test_client_mac_s1) + ? 'pass' : sprintf("fail - '%s'", base64_encode($check)); + + } else { + $res['bigmath'] = 'fail - big math functions are not available.'; + } + + // sha1_20 + $test_client_mac_s1 = base64_decode('G4gQQkYM6QmAzhKbVKSBahFesPL0nL3F2MREVwEtnVRRYI0ifl9zmPklwTcvURt3QTiGBd+9Dn3ESLk5qka6IO5xnILcIoBT8nnGVPiOZvTygfuzKp4tQ2mXuIATJoa7oXRGmBWtlSdFapH5Zt6NJj4B83XF/jzZiRwdYuK4HJI='); + $test_client_mac_s2 = base64_decode('0Mb2t9d/HvAZyuhbARJPYdx3+v4='); + $check = sha1_20($test_client_mac_s1); + $res['sha1_20'] = ($check == $test_client_mac_s2) + ? 'pass' : sprintf("fail - '%s'", base64_encode($check)); + + // x_or + $test_client_mac_s3 = base64_decode('i36ZLYAJ1rYEx1VEHObrS8hgAg0='); + $check = x_or($test_client_mac_s2, $test_ss); + $res['x_or'] = ($check == $test_client_mac_s3) + ? 'pass' : sprintf("fail - '%s'", base64_encode($check)); + + $out = "\n"; + foreach ($res as $test => $stat) { + $code = substr($stat, 0, 4); + $color = ($code == 'pass') ? '#9f9' + : (($code == 'warn') ? '#ff9' : '#f99'); + $out .= sprintf("\n", $test, $color, $stat); + } + $out .= "
                %s%s
                "; + + wrap_html( $out ); +} + + +// Support functions + +/** + * Prefix the keys of an array with 'openid.' + * @param array $array + * @return array + */ +function append_openid ($array) { + $keys = array_keys($array); + $vals = array_values($array); + + $r = array(); + for ($i=0; $i $rl ) { + $r = str_repeat("0", $ll-$rl) . $r; + $o = $ll; + + } else { + $o = $ll; + } + + $v = ''; + $carry = 0; + + for ($i = $o-1; $i >= 0; $i--) { + $d = (int)$l[$i] + (int)$r[$i] + $carry; + if ($d <= 9) { + $carry = 0; + + } else { + $carry = 1; + $d -= 10; + } + $v = (string) $d . $v; + } + + if ($carry > 0) + $v = "1" . $v; + + return $v; +} + +/** + * Create a big math comparison function + * @param string $l + * @param string $r + * @return string + */ +function bmcomp($l, $r) { + if (function_exists('bccomp')) + return bccomp($l, $r); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_cmp($l, $r)); + + $l = strval($l); $r = strval($r); + $ll = strlen($l); $lr = strlen($r); + if ($ll != $lr) + return ($ll > $lr) ? 1 : -1; + + return strcmp($l, $r); +} + +/** + * Create a big math division function + * @param string $l + * @param string $r + * @param int $z + * @return string + * @url http://www.icosaedro.it/bigint Inspired by + */ +function bmdiv($l, $r, $z = 0) { + if (function_exists('bcdiv')) + return ($z == 0) ? bcdiv($l, $r) : bcmod($l, $r); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(($z == 0) ? gmp_div_q($l, $r) : gmp_mod($l, $r)); + + $l = strval($l); $r = strval($r); + $v = '0'; + + while (true) { + if( bmcomp($l, $r) < 0 ) + break; + + $delta = strlen($l) - strlen($r); + if ($delta >= 1) { + $zeroes = str_repeat("0", $delta); + $r2 = $r . $zeroes; + + if (strcmp($l, $r2) >= 0) { + $v = bmadd($v, "1" . $zeroes); + $l = bmsub($l, $r2); + + } else { + $zeroes = str_repeat("0", $delta - 1); + $v = bmadd($v, "1" . $zeroes); + $l = bmsub($l, $r . $zeroes); + } + + } else { + $l = bmsub($l, $r); + $v = bmadd($v, "1"); + } + } + + return ($z == 0) ? $v : $l; +} + +/** + * Create a big math multiplication function + * @param string $l + * @param string $r + * @return string + * @url http://www.icosaedro.it/bigint Inspired by + */ +function bmmul($l, $r) { + if (function_exists('bcmul')) + return bcmul($l, $r); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_mul($l, $r)); + + $l = strval($l); $r = strval($r); + + $v = '0'; + $z = ''; + + for( $i = strlen($r)-1; $i >= 0; $i-- ){ + $bd = (int) $r[$i]; + $carry = 0; + $p = ""; + for( $j = strlen($l)-1; $j >= 0; $j-- ){ + $ad = (int) $l[$j]; + $pd = $ad * $bd + $carry; + if( $pd <= 9 ){ + $carry = 0; + } else { + $carry = (int) ($pd / 10); + $pd = $pd % 10; + } + $p = (string) $pd . $p; + } + if( $carry > 0 ) + $p = (string) $carry . $p; + $p = $p . $z; + $z .= "0"; + $v = bmadd($v, $p); + } + + return $v; +} + +/** + * Create a big math modulus function + * @param string $value + * @param string $mod + * @return string + */ +function bmmod( $value, $mod ) { + if (function_exists('bcmod')) + return bcmod($value, $mod); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_mod($value, $mod)); + + $r = bmdiv($value, $mod, 1); + return $r; +} + +/** + * Create a big math power function + * @param string $value + * @param string $exponent + * @return string + */ +function bmpow ($value, $exponent) { + if (function_exists('bcpow')) + return bcpow($value, $exponent); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_pow($value, $exponent)); + + $r = '1'; + while ($exponent) { + $r = bmmul($r, $value, 100); + $exponent--; + } + return (string)rtrim($r, '0.'); +} + +/** + * Create a big math 'powmod' function + * @param string $value + * @param string $exponent + * @param string $mod + * @return string + * @url http://php.net/manual/en/function.bcpowmod.php#72704 Borrowed from + */ +function bmpowmod ($value, $exponent, $mod) { + if (function_exists('bcpowmod')) + return bcpowmod($value, $exponent, $mod); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_powm($value, $exponent, $mod)); + + $r = ''; + while ($exponent != '0') { + $t = bmmod($exponent, '4096'); + $r = substr("000000000000" . decbin(intval($t)), -12) . $r; + $exponent = bmdiv($exponent, '4096'); + } + + $r = preg_replace("!^0+!","",$r); + + if ($r == '') + $r = '0'; + $value = bmmod($value, $mod); + $erb = strrev($r); + $q = '1'; + $a[0] = $value; + + for ($i = 1; $i < strlen($erb); $i++) { + $a[$i] = bmmod( bmmul($a[$i-1], $a[$i-1]), $mod ); + } + + for ($i = 0; $i < strlen($erb); $i++) { + if ($erb[$i] == "1") { + $q = bmmod( bmmul($q, $a[$i]), $mod ); + } + } + + return($q); +} + +/** + * Create a big math subtraction function + * @param string $l + * @param string $r + * @return string + * @url http://www.icosaedro.it/bigint Inspired by + */ +function bmsub($l, $r) { + if (function_exists('bcsub')) + return bcsub($l, $r); + + global $profile; + if ($profile['use_gmp']) + return gmp_strval(gmp_sub($l, $r)); + + + $l = strval($l); $r = strval($r); + $ll = strlen($l); $rl = strlen($r); + + if ($ll < $rl) { + $l = str_repeat("0", $rl-$ll) . $l; + $o = $rl; + } elseif ( $ll > $rl ) { + $r = str_repeat("0", $ll-$rl) . (string)$r; + $o = $ll; + } else { + $o = $ll; + } + + if (strcmp($l, $r) >= 0) { + $sign = ''; + } else { + $x = $l; $l = $r; $r = $x; + $sign = '-'; + } + + $v = ''; + $carry = 0; + + for ($i = $o-1; $i >= 0; $i--) { + $d = ($l[$i] - $r[$i]) - $carry; + if ($d < 0) { + $carry = 1; + $d += 10; + } else { + $carry = 0; + } + $v = (string) $d . $v; + } + + return $sign . ltrim($v, '0'); +} + + +/** + * Get a binary value + * @param integer $n + * @return string + * @url http://openidenabled.com Borrowed from PHP-OpenID + */ +function bin ($n) { + $bytes = array(); + while (bmcomp($n, 0) > 0) { + array_unshift($bytes, bmmod($n, 256)); + $n = bmdiv($n, bmpow(2,8)); + } + + if ($bytes && ($bytes[0] > 127)) + array_unshift($bytes, 0); + + $b = ''; + foreach ($bytes as $byte) + $b .= pack('C', $byte); + + return $b; +} + + +/** + * Debug logging + * @param mixed $x + * @param string $m + */ +function debug ($x, $m = null) { + global $profile; + + if (! isset($profile['debug']) || $profile['debug'] === false) + return true; + + if (! is_writable(dirname($profile['logfile'])) &! is_writable($profile['logfile'])) + error_500('Cannot write to debug log: ' . $profile['logfile']); + + if (is_array($x)) { + ob_start(); + print_r($x); + $x = $m . ($m != null ? "\n" : '') . ob_get_clean(); + + } else { + $x .= "\n"; + } +} + + +/** + * Destroy a consumer's assoc handle + * @param string $id + */ +function destroy_assoc_handle ( $id ) { + debug("Destroying session: $id"); + + $sid = session_id(); + session_write_close(); + + session_id($id); + if (OCP\Config::getSystemValue( "forcessl", false )) { + ini_set("session.cookie_secure", "on"); + } + session_start(); + session_destroy(); + + session_id($sid); + session_start(); +} + + +/** + * Return an error message to the user + * @param string $message + */ +function error_400 ( $message = 'Bad Request' ) { + header("HTTP/1.1 400 Bad Request"); + wrap_html($message); +} + + +/** + * Return an error message to the user + * @param string $message + */ +function error_403 ( $message = 'Forbidden' ) { + header("HTTP/1.1 403 Forbidden"); + wrap_html($message); +} + + +/** + * Return an error message to the user + * @param string $message + */ +function error_500 ( $message = 'Internal Server Error' ) { + header("HTTP/1.1 500 Internal Server Error"); + wrap_html($message); +} + + +/** + * Return an error message to the consumer + * @param string $message + */ +function error_get ( $url, $message = 'Bad Request') { + wrap_keyed_redirect($url, array('mode' => 'error', 'error' => $message)); +} + + +/** + * Return an error message to the consumer + * @param string $message + */ +function error_post ( $message = 'Bad Request' ) { + header("HTTP/1.1 400 Bad Request"); + echo ('error:' . $message); + exit(0); +} + + +/** + * Do an HMAC + * @param string $key + * @param string $data + * @param string $hash + * @return string + * @url http://php.net/manual/en/function.sha1.php#39492 Borrowed from + */ +function hmac($key, $data, $hash = 'sha1_20') { + $blocksize=64; + + if (strlen($key) > $blocksize) + $key = $hash($key); + + $key = str_pad($key, $blocksize,chr(0x00)); + $ipad = str_repeat(chr(0x36),$blocksize); + $opad = str_repeat(chr(0x5c),$blocksize); + + $h1 = $hash(($key ^ $ipad) . $data); + $hmac = $hash(($key ^ $opad) . $h1); + return $hmac; +} + + +if (! function_exists('http_build_query')) { +/** + * Create function if missing + * @param array $array + * @return string + */ +function http_build_query ($array) { + $r = array(); + foreach ($array as $key => $val) + $r[] = sprintf('%s=%s', urlencode($key), urlencode($val)); + return implode('&', $r); +}} + + +/** + * Turn a binary back into a long + * @param string $b + * @return integer + * @url http://openidenabled.com Borrowed from PHP-OpenID + */ +function long($b) { + $bytes = array_merge(unpack('C*', $b)); + $n = 0; + foreach ($bytes as $byte) { + $n = bmmul($n, bmpow(2,8)); + $n = bmadd($n, $byte); + } + return $n; +} + + +/** + * Create a new consumer association + * @param integer $expiration + * @return array + */ +function new_assoc ( $expiration ) { + if (isset($_SESSION) && is_array($_SESSION)) { + $sid = session_id(); + $dat = session_encode(); + session_write_close(); + } + + if (OCP\Config::getSystemValue( "forcessl", false )) { + ini_set("session.cookie_secure", "on"); + } + session_start(); + session_regenerate_id('false'); + + $id = session_id(); + $shared_secret = new_secret(); + debug('Started new assoc session: ' . $id); + + $_SESSION = array(); + $_SESSION['expiration'] = $expiration; + $_SESSION['shared_secret'] = base64_encode($shared_secret); + + session_write_close(); + + if (isset($sid)) { + session_id($sid); + session_start(); + $_SESSION = array(); + session_decode($dat); + } + + return array($id, $shared_secret); +} + + +/** + * Create a new shared secret + * @return string + */ +function new_secret () { + $r = ''; + for($i=0; $i<20; $i++) + $r .= chr(mt_rand(0, 255)); + + debug("Generated new key: hash = '" . md5($r) . "', length = '" . strlen($r) . "'"); + return $r; +} + + +/** + * Random number generation + * @param integer max + * @return integer + */ +function random ( $max ) { + if (strlen($max) < 4) + return mt_rand(1, $max - 1); + + $r = ''; + for($i=1; $i= 0 && ($pr_host[$break] != '*' || substr_count(substr($pr_host, 0, $break), '.') < 2)) + return false; + + // now compare the paths + $break = str_diff_at($parts['child']['path'], $parts['parent']['path']); + if ($break >= 0 + && ($break < strlen($parts['parent']['path']) && $parts['parent']['path'][$break] != '*') + || ($break > strlen($parts['child']['path']))) + return false; + + return true; +} + + +/** + * Create a user session + * @global array $profile + * @global array $proto + */ +function user_session () { + global $proto, $profile; + + session_name('phpMyID_Server'); + if (OCP\Config::getSystemValue( "forcessl", false )) { + ini_set("session.cookie_secure", "on"); + } + @session_start(); + + $profile['authorized'] = (isset($_SESSION['auth_username']) + && $_SESSION['auth_username'] == $profile['auth_username']) + ? true + : false; + + debug('Started user session: ' . session_id() . ' Auth? ' . $profile['authorized']); +} + + +/** + * Return HTML + * @global string $charset + * @param string $message + */ +function wrap_html ( $message ) { + global $charset, $profile; + header('Content-Type: text/html; charset=' . $charset); + $html= ' + + +phpMyID + + +' . implode("\n", $profile['opt_headers']) . ' + + + + +

                ' . $message . '

                + + +'; + echo $html; + exit(0); +} + + +/** + * Return a key-value pair in plain text + * @global string $charset + * @param array $keys + */ +function wrap_kv ( $keys ) { + global $charset; + + debug($keys, 'Wrapped key/vals'); + header('Content-Type: text/plain; charset=' . $charset); + foreach ($keys as $key => $value) + printf("%s:%s\n", $key, $value); + + exit(0); +} + + +/** + * Redirect, with OpenID keys + * @param string $url + * @param array @keys + */ +function wrap_keyed_redirect ($url, $keys) { + $keys = append_openid($keys); + debug($keys, 'Location keys'); + + $q = strpos($url, '?') ? '&' : '?'; + wrap_redirect($url . $q . http_build_query($keys)); +} + + +/** + * Redirect the browser + * @global string $charset + * @param string $url + */ +function wrap_redirect ($url) { + header('HTTP/1.1 302 Found'); + header('Location: ' . $url); + debug('Location: ' . $url); + exit(0); +} + +/** + * Return an HTML refresh + * @global string $charset + * @param string $url + */ +function wrap_refresh ($url) { + global $charset; + + header('Content-Type: text/html; charset=' . $charset); + echo ' + + +phpMyID + + + +

                Redirecting to ' . $url . '

                + + +'; + + debug('Refresh: ' . $url); + exit(0); +} + + +/** + * Implement binary x_or + * @param string $a + * @param string $b + * @return string + */ +function x_or ($a, $b) { + $r = ""; + + for ($i = 0; $i < strlen($b); $i++) + $r .= $a[$i] ^ $b[$i]; + debug("Xor size: " . strlen($r)); + return $r; +} + + + +/* + * App Initialization + */ +// Determine the charset to use +$GLOBALS['charset'] = 'iso-8859-1'; + +// Set the internal encoding +if (function_exists('mb_internal_encoding')) + mb_internal_encoding($charset); + +// Avoid problems with non-default arg_separator.output settings +// Credit for this goes to user 'prelog' on the forums +ini_set('arg_separator.output', '&'); + +// Do a check to be sure everything is set up correctly +self_check(); + + +/** + * Determine the HTTP request port + * @name $port + * @global integer $GLOBALS['port'] + */ +$GLOBALS['port'] = ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on' && $_SERVER['SERVER_PORT'] == 443) + || $_SERVER['SERVER_PORT'] == 80) + ? '' + : ':' . $_SERVER['SERVER_PORT']; + + +/** + * Determine the HTTP request protocol + * @name $proto + * @global string $GLOBALS['proto'] + */ +$GLOBALS['proto'] = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') ? 'https' : 'http'; + +// Set the authorization state - DO NOT OVERRIDE +$profile['authorized'] = false; + +global $IDENTITY; +global $USERNAME; + +// Set a default IDP URL +if (! array_key_exists('idp_url', $profile)) + $profile['idp_url'] = $IDENTITY; + +//Determine the requested URL - DO NOT OVERRIDE +$profile['req_url'] = sprintf("%s://%s%s", + $proto, + OCP\Util::getServerHost(), +// $port,//host already includes the path + $_SERVER["REQUEST_URI"]); + + +// Set the default allowance for testing +if (! array_key_exists('allow_test', $profile)) + $profile['allow_test'] = false; + +// Set the default allowance for gmp +if (! array_key_exists('allow_gmp', $profile)) + $profile['allow_gmp'] = false; + +// Set the default force bigmath - BAD IDEA to override this +if (! array_key_exists('force_bigmath', $profile)) + $profile['force_bigmath'] = false; + +// Determine if GMP is usable +$profile['use_gmp'] = (extension_loaded('gmp') && $profile['allow_gmp']) ? true : false; + +// Determine if I can perform big math functions +$profile['use_bigmath'] = (extension_loaded('bcmath') || $profile['use_gmp'] || $profile['force_bigmath']) ? true : false; + +// Set a default authentication domain +if (! array_key_exists('auth_domain', $profile)) + $profile['auth_domain'] = $profile['req_url'] . ' ' . $profile['idp_url']; + +// Set a default authentication realm +if (! array_key_exists('auth_realm', $profile)) + $profile['auth_realm'] = 'ownCloud'; + +// Determine the realm for digest authentication - DO NOT OVERRIDE +$profile['php_realm'] = $profile['auth_realm'] . (ini_get('safe_mode') ? '-' . getmyuid() : ''); + +// Set a default lifetime - the lesser of GC and cache time +if (! array_key_exists('lifetime', $profile)) { + $sce = session_cache_expire() * 60; + $gcm = ini_get('session.gc_maxlifetime'); + $profile['lifetime'] = $sce < $gcm ? $sce : $gcm; +} + +// Set a default log file +if (! array_key_exists('logfile', $profile)) + $profile['logfile'] = get_temp_dir() . DIRECTORY_SEPARATOR . $profile['auth_realm'] . '.debug.log'; + + +/* + * Optional Initialization + */ +// Setup optional headers +$profile['opt_headers'] = array(); + +// Determine if I should add microid stuff +if (array_key_exists('microid', $profile)) { + $hash = sha1($profile['idp_url']); + $values = is_array($profile['microid']) ? $profile['microid'] : array($profile['microid']); + + foreach ($values as $microid) { + preg_match('/^([a-z]+)/i', $microid, $mtx); + $profile['opt_headers'][] = sprintf('', $mtx[1], $proto, sha1(sha1($microid) . $hash)); + } +} + +// Determine if I should add pavatar stuff +if (array_key_exists('pavatar', $profile)) + $profile['opt_headers'][] = sprintf('', $profile['pavatar']); + + +/* + * Do it + */ +// Decide which runmode, based on user request or default +$run_mode = (isset($_REQUEST['openid_mode']) + && in_array($_REQUEST['openid_mode'], $known['openid_modes'])) + ? $_REQUEST['openid_mode'] + : 'no'; + +// Run in the determined runmode +debug("Run mode: $run_mode at: " . time()); +debug($_REQUEST, 'Request params'); +call_user_func($run_mode . '_mode'); diff --git a/3rdparty/php-cloudfiles/cloudfiles.php b/3rdparty/php-cloudfiles/cloudfiles.php index 5f7e2100a99..7b1014265e5 100644 --- a/3rdparty/php-cloudfiles/cloudfiles.php +++ b/3rdparty/php-cloudfiles/cloudfiles.php @@ -2000,7 +2000,7 @@ class CF_Object // } //use OC's mimetype detection for files - if(is_file($handle)){ + if(@is_file($handle)){ $this->content_type=OC_Helper::getMimeType($handle); }else{ $this->content_type=OC_Helper::getStringMimeType($handle); @@ -2537,7 +2537,7 @@ class CF_Object } $md5 = hash_final($ctx, false); rewind($data); - } elseif ((string)is_file($data)) { + } elseif ((string)@is_file($data)) { $md5 = md5_file($data); } else { $md5 = md5($data); diff --git a/3rdparty/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE b/3rdparty/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE deleted file mode 100644 index a65e83e8762..00000000000 --- a/3rdparty/simpletest/HELP_MY_TESTS_DONT_WORK_ANYMORE +++ /dev/null @@ -1,399 +0,0 @@ -Simple Test interface changes -============================= -Because the SimpleTest tool set is still evolving it is likely that tests -written with earlier versions will fail with the newest ones. The most -dramatic changes are in the alpha releases. Here is a list of possible -problems and their fixes... - -assertText() no longer finds a string inside a ', 'js'); - $this->mapHandler('comment', 'ignore'); - $this->addEntryPattern('', 'comment'); - } - - /** - * Pattern matches to start and end a tag. - * @param string $tag Name of tag to scan for. - * @access private - */ - protected function addTag($tag) { - $this->addSpecialPattern("", 'text', 'acceptEndToken'); - $this->addEntryPattern("<$tag", 'text', 'tag'); - } - - /** - * Pattern matches to parse the inside of a tag - * including the attributes and their quoting. - * @access private - */ - protected function addInTagTokens() { - $this->mapHandler('tag', 'acceptStartToken'); - $this->addSpecialPattern('\s+', 'tag', 'ignore'); - $this->addAttributeTokens(); - $this->addExitPattern('/>', 'tag'); - $this->addExitPattern('>', 'tag'); - } - - /** - * Matches attributes that are either single quoted, - * double quoted or unquoted. - * @access private - */ - protected function addAttributeTokens() { - $this->mapHandler('dq_attribute', 'acceptAttributeToken'); - $this->addEntryPattern('=\s*"', 'tag', 'dq_attribute'); - $this->addPattern("\\\\\"", 'dq_attribute'); - $this->addExitPattern('"', 'dq_attribute'); - $this->mapHandler('sq_attribute', 'acceptAttributeToken'); - $this->addEntryPattern("=\s*'", 'tag', 'sq_attribute'); - $this->addPattern("\\\\'", 'sq_attribute'); - $this->addExitPattern("'", 'sq_attribute'); - $this->mapHandler('uq_attribute', 'acceptAttributeToken'); - $this->addSpecialPattern('=\s*[^>\s]*', 'tag', 'uq_attribute'); - } -} - -/** - * Converts HTML tokens into selected SAX events. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleHtmlSaxParser { - private $lexer; - private $listener; - private $tag; - private $attributes; - private $current_attribute; - - /** - * Sets the listener. - * @param SimplePhpPageBuilder $listener SAX event handler. - * @access public - */ - function __construct($listener) { - $this->listener = $listener; - $this->lexer = $this->createLexer($this); - $this->tag = ''; - $this->attributes = array(); - $this->current_attribute = ''; - } - - /** - * Runs the content through the lexer which - * should call back to the acceptors. - * @param string $raw Page text to parse. - * @return boolean False if parse error. - * @access public - */ - function parse($raw) { - return $this->lexer->parse($raw); - } - - /** - * Sets up the matching lexer. Starts in 'text' mode. - * @param SimpleSaxParser $parser Event generator, usually $self. - * @return SimpleLexer Lexer suitable for this parser. - * @access public - */ - static function createLexer(&$parser) { - return new SimpleHtmlLexer($parser); - } - - /** - * Accepts a token from the tag mode. If the - * starting element completes then the element - * is dispatched and the current attributes - * set back to empty. The element or attribute - * name is converted to lower case. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function acceptStartToken($token, $event) { - if ($event == LEXER_ENTER) { - $this->tag = strtolower(substr($token, 1)); - return true; - } - if ($event == LEXER_EXIT) { - $success = $this->listener->startElement( - $this->tag, - $this->attributes); - $this->tag = ''; - $this->attributes = array(); - return $success; - } - if ($token != '=') { - $this->current_attribute = strtolower(html_entity_decode($token, ENT_QUOTES)); - $this->attributes[$this->current_attribute] = ''; - } - return true; - } - - /** - * Accepts a token from the end tag mode. - * The element name is converted to lower case. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function acceptEndToken($token, $event) { - if (! preg_match('/<\/(.*)>/', $token, $matches)) { - return false; - } - return $this->listener->endElement(strtolower($matches[1])); - } - - /** - * Part of the tag data. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function acceptAttributeToken($token, $event) { - if ($this->current_attribute) { - if ($event == LEXER_UNMATCHED) { - $this->attributes[$this->current_attribute] .= - html_entity_decode($token, ENT_QUOTES); - } - if ($event == LEXER_SPECIAL) { - $this->attributes[$this->current_attribute] .= - preg_replace('/^=\s*/' , '', html_entity_decode($token, ENT_QUOTES)); - } - } - return true; - } - - /** - * A character entity. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function acceptEntityToken($token, $event) { - } - - /** - * Character data between tags regarded as - * important. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function acceptTextToken($token, $event) { - return $this->listener->addContent($token); - } - - /** - * Incoming data to be ignored. - * @param string $token Incoming characters. - * @param integer $event Lexer event type. - * @return boolean False if parse error. - * @access public - */ - function ignore($token, $event) { - return true; - } -} - -/** - * SAX event handler. Maintains a list of - * open tags and dispatches them as they close. - * @package SimpleTest - * @subpackage WebTester - */ -class SimplePhpPageBuilder { - private $tags; - private $page; - private $private_content_tag; - private $open_forms = array(); - private $complete_forms = array(); - private $frameset = false; - private $loading_frames = array(); - private $frameset_nesting_level = 0; - private $left_over_labels = array(); - - /** - * Frees up any references so as to allow the PHP garbage - * collection from unset() to work. - * @access public - */ - function free() { - unset($this->tags); - unset($this->page); - unset($this->private_content_tags); - $this->open_forms = array(); - $this->complete_forms = array(); - $this->frameset = false; - $this->loading_frames = array(); - $this->frameset_nesting_level = 0; - $this->left_over_labels = array(); - } - - /** - * This builder is always available. - * @return boolean Always true. - */ - function can() { - return true; - } - - /** - * Reads the raw content and send events - * into the page to be built. - * @param $response SimpleHttpResponse Fetched response. - * @return SimplePage Newly parsed page. - * @access public - */ - function parse($response) { - $this->tags = array(); - $this->page = $this->createPage($response); - $parser = $this->createParser($this); - $parser->parse($response->getContent()); - $this->acceptPageEnd(); - $page = $this->page; - $this->free(); - return $page; - } - - /** - * Creates an empty page. - * @return SimplePage New unparsed page. - * @access protected - */ - protected function createPage($response) { - return new SimplePage($response); - } - - /** - * Creates the parser used with the builder. - * @param SimplePhpPageBuilder $listener Target of parser. - * @return SimpleSaxParser Parser to generate - * events for the builder. - * @access protected - */ - protected function createParser(&$listener) { - return new SimpleHtmlSaxParser($listener); - } - - /** - * Start of element event. Opens a new tag. - * @param string $name Element name. - * @param hash $attributes Attributes without content - * are marked as true. - * @return boolean False on parse error. - * @access public - */ - function startElement($name, $attributes) { - $factory = new SimpleTagBuilder(); - $tag = $factory->createTag($name, $attributes); - if (! $tag) { - return true; - } - if ($tag->getTagName() == 'label') { - $this->acceptLabelStart($tag); - $this->openTag($tag); - return true; - } - if ($tag->getTagName() == 'form') { - $this->acceptFormStart($tag); - return true; - } - if ($tag->getTagName() == 'frameset') { - $this->acceptFramesetStart($tag); - return true; - } - if ($tag->getTagName() == 'frame') { - $this->acceptFrame($tag); - return true; - } - if ($tag->isPrivateContent() && ! isset($this->private_content_tag)) { - $this->private_content_tag = &$tag; - } - if ($tag->expectEndTag()) { - $this->openTag($tag); - return true; - } - $this->acceptTag($tag); - return true; - } - - /** - * End of element event. - * @param string $name Element name. - * @return boolean False on parse error. - * @access public - */ - function endElement($name) { - if ($name == 'label') { - $this->acceptLabelEnd(); - return true; - } - if ($name == 'form') { - $this->acceptFormEnd(); - return true; - } - if ($name == 'frameset') { - $this->acceptFramesetEnd(); - return true; - } - if ($this->hasNamedTagOnOpenTagStack($name)) { - $tag = array_pop($this->tags[$name]); - if ($tag->isPrivateContent() && $this->private_content_tag->getTagName() == $name) { - unset($this->private_content_tag); - } - $this->addContentTagToOpenTags($tag); - $this->acceptTag($tag); - return true; - } - return true; - } - - /** - * Test to see if there are any open tags awaiting - * closure that match the tag name. - * @param string $name Element name. - * @return boolean True if any are still open. - * @access private - */ - protected function hasNamedTagOnOpenTagStack($name) { - return isset($this->tags[$name]) && (count($this->tags[$name]) > 0); - } - - /** - * Unparsed, but relevant data. The data is added - * to every open tag. - * @param string $text May include unparsed tags. - * @return boolean False on parse error. - * @access public - */ - function addContent($text) { - if (isset($this->private_content_tag)) { - $this->private_content_tag->addContent($text); - } else { - $this->addContentToAllOpenTags($text); - } - return true; - } - - /** - * Any content fills all currently open tags unless it - * is part of an option tag. - * @param string $text May include unparsed tags. - * @access private - */ - protected function addContentToAllOpenTags($text) { - foreach (array_keys($this->tags) as $name) { - for ($i = 0, $count = count($this->tags[$name]); $i < $count; $i++) { - $this->tags[$name][$i]->addContent($text); - } - } - } - - /** - * Parsed data in tag form. The parsed tag is added - * to every open tag. Used for adding options to select - * fields only. - * @param SimpleTag $tag Option tags only. - * @access private - */ - protected function addContentTagToOpenTags(&$tag) { - if ($tag->getTagName() != 'option') { - return; - } - foreach (array_keys($this->tags) as $name) { - for ($i = 0, $count = count($this->tags[$name]); $i < $count; $i++) { - $this->tags[$name][$i]->addTag($tag); - } - } - } - - /** - * Opens a tag for receiving content. Multiple tags - * will be receiving input at the same time. - * @param SimpleTag $tag New content tag. - * @access private - */ - protected function openTag($tag) { - $name = $tag->getTagName(); - if (! in_array($name, array_keys($this->tags))) { - $this->tags[$name] = array(); - } - $this->tags[$name][] = $tag; - } - - /** - * Adds a tag to the page. - * @param SimpleTag $tag Tag to accept. - * @access public - */ - protected function acceptTag($tag) { - if ($tag->getTagName() == "a") { - $this->page->addLink($tag); - } elseif ($tag->getTagName() == "base") { - $this->page->setBase($tag->getAttribute('href')); - } elseif ($tag->getTagName() == "title") { - $this->page->setTitle($tag); - } elseif ($this->isFormElement($tag->getTagName())) { - for ($i = 0; $i < count($this->open_forms); $i++) { - $this->open_forms[$i]->addWidget($tag); - } - $this->last_widget = $tag; - } - } - - /** - * Opens a label for a described widget. - * @param SimpleFormTag $tag Tag to accept. - * @access public - */ - protected function acceptLabelStart($tag) { - $this->label = $tag; - unset($this->last_widget); - } - - /** - * Closes the most recently opened label. - * @access public - */ - protected function acceptLabelEnd() { - if (isset($this->label)) { - if (isset($this->last_widget)) { - $this->last_widget->setLabel($this->label->getText()); - unset($this->last_widget); - } else { - $this->left_over_labels[] = SimpleTestCompatibility::copy($this->label); - } - unset($this->label); - } - } - - /** - * Tests to see if a tag is a possible form - * element. - * @param string $name HTML element name. - * @return boolean True if form element. - * @access private - */ - protected function isFormElement($name) { - return in_array($name, array('input', 'button', 'textarea', 'select')); - } - - /** - * Opens a form. New widgets go here. - * @param SimpleFormTag $tag Tag to accept. - * @access public - */ - protected function acceptFormStart($tag) { - $this->open_forms[] = new SimpleForm($tag, $this->page); - } - - /** - * Closes the most recently opened form. - * @access public - */ - protected function acceptFormEnd() { - if (count($this->open_forms)) { - $this->complete_forms[] = array_pop($this->open_forms); - } - } - - /** - * Opens a frameset. A frameset may contain nested - * frameset tags. - * @param SimpleFramesetTag $tag Tag to accept. - * @access public - */ - protected function acceptFramesetStart($tag) { - if (! $this->isLoadingFrames()) { - $this->frameset = $tag; - } - $this->frameset_nesting_level++; - } - - /** - * Closes the most recently opened frameset. - * @access public - */ - protected function acceptFramesetEnd() { - if ($this->isLoadingFrames()) { - $this->frameset_nesting_level--; - } - } - - /** - * Takes a single frame tag and stashes it in - * the current frame set. - * @param SimpleFrameTag $tag Tag to accept. - * @access public - */ - protected function acceptFrame($tag) { - if ($this->isLoadingFrames()) { - if ($tag->getAttribute('src')) { - $this->loading_frames[] = $tag; - } - } - } - - /** - * Test to see if in the middle of reading - * a frameset. - * @return boolean True if inframeset. - * @access private - */ - protected function isLoadingFrames() { - return $this->frameset and $this->frameset_nesting_level > 0; - } - - /** - * Marker for end of complete page. Any work in - * progress can now be closed. - * @access public - */ - protected function acceptPageEnd() { - while (count($this->open_forms)) { - $this->complete_forms[] = array_pop($this->open_forms); - } - foreach ($this->left_over_labels as $label) { - for ($i = 0, $count = count($this->complete_forms); $i < $count; $i++) { - $this->complete_forms[$i]->attachLabelBySelector( - new SimpleById($label->getFor()), - $label->getText()); - } - } - $this->page->setForms($this->complete_forms); - $this->page->setFrames($this->loading_frames); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/recorder.php b/3rdparty/simpletest/recorder.php deleted file mode 100644 index b3d0d01c625..00000000000 --- a/3rdparty/simpletest/recorder.php +++ /dev/null @@ -1,101 +0,0 @@ -time, $this->breadcrumb, $this->message) = - array(time(), $breadcrumb, $message); - } -} - -/** - * A single pass captured for later. - * @package SimpleTest - * @subpackage Extensions - */ -class SimpleResultOfPass extends SimpleResult { } - -/** - * A single failure captured for later. - * @package SimpleTest - * @subpackage Extensions - */ -class SimpleResultOfFail extends SimpleResult { } - -/** - * A single exception captured for later. - * @package SimpleTest - * @subpackage Extensions - */ -class SimpleResultOfException extends SimpleResult { } - -/** - * Array-based test recorder. Returns an array - * with timestamp, status, test name and message for each pass and failure. - * @package SimpleTest - * @subpackage Extensions - */ -class Recorder extends SimpleReporterDecorator { - public $results = array(); - - /** - * Stashes the pass as a SimpleResultOfPass - * for later retrieval. - * @param string $message Pass message to be displayed - * eventually. - */ - function paintPass($message) { - parent::paintPass($message); - $this->results[] = new SimpleResultOfPass(parent::getTestList(), $message); - } - - /** - * Stashes the fail as a SimpleResultOfFail - * for later retrieval. - * @param string $message Failure message to be displayed - * eventually. - */ - function paintFail($message) { - parent::paintFail($message); - $this->results[] = new SimpleResultOfFail(parent::getTestList(), $message); - } - - /** - * Stashes the exception as a SimpleResultOfException - * for later retrieval. - * @param string $message Exception message to be displayed - * eventually. - */ - function paintException($message) { - parent::paintException($message); - $this->results[] = new SimpleResultOfException(parent::getTestList(), $message); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/reflection_php4.php b/3rdparty/simpletest/reflection_php4.php deleted file mode 100644 index 39801ea1bdb..00000000000 --- a/3rdparty/simpletest/reflection_php4.php +++ /dev/null @@ -1,136 +0,0 @@ -_interface = $interface; - } - - /** - * Checks that a class has been declared. - * @return boolean True if defined. - * @access public - */ - function classExists() { - return class_exists($this->_interface); - } - - /** - * Needed to kill the autoload feature in PHP5 - * for classes created dynamically. - * @return boolean True if defined. - * @access public - */ - function classExistsSansAutoload() { - return class_exists($this->_interface); - } - - /** - * Checks that a class or interface has been - * declared. - * @return boolean True if defined. - * @access public - */ - function classOrInterfaceExists() { - return class_exists($this->_interface); - } - - /** - * Needed to kill the autoload feature in PHP5 - * for classes created dynamically. - * @return boolean True if defined. - * @access public - */ - function classOrInterfaceExistsSansAutoload() { - return class_exists($this->_interface); - } - - /** - * Gets the list of methods on a class or - * interface. - * @returns array List of method names. - * @access public - */ - function getMethods() { - return get_class_methods($this->_interface); - } - - /** - * Gets the list of interfaces from a class. If the - * class name is actually an interface then just that - * interface is returned. - * @returns array List of interfaces. - * @access public - */ - function getInterfaces() { - return array(); - } - - /** - * Finds the parent class name. - * @returns string Parent class name. - * @access public - */ - function getParent() { - return strtolower(get_parent_class($this->_interface)); - } - - /** - * Determines if the class is abstract, which for PHP 4 - * will never be the case. - * @returns boolean True if abstract. - * @access public - */ - function isAbstract() { - return false; - } - - /** - * Determines if the the entity is an interface, which for PHP 4 - * will never be the case. - * @returns boolean True if interface. - * @access public - */ - function isInterface() { - return false; - } - - /** - * Scans for final methods, but as it's PHP 4 there - * aren't any. - * @returns boolean True if the class has a final method. - * @access public - */ - function hasFinal() { - return false; - } - - /** - * Gets the source code matching the declaration - * of a method. - * @param string $method Method name. - * @access public - */ - function getSignature($method) { - return "function &$method()"; - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/reflection_php5.php b/3rdparty/simpletest/reflection_php5.php deleted file mode 100644 index 43d8a7b287f..00000000000 --- a/3rdparty/simpletest/reflection_php5.php +++ /dev/null @@ -1,386 +0,0 @@ -interface = $interface; - } - - /** - * Checks that a class has been declared. Versions - * before PHP5.0.2 need a check that it's not really - * an interface. - * @return boolean True if defined. - * @access public - */ - function classExists() { - if (! class_exists($this->interface)) { - return false; - } - $reflection = new ReflectionClass($this->interface); - return ! $reflection->isInterface(); - } - - /** - * Needed to kill the autoload feature in PHP5 - * for classes created dynamically. - * @return boolean True if defined. - * @access public - */ - function classExistsSansAutoload() { - return class_exists($this->interface, false); - } - - /** - * Checks that a class or interface has been - * declared. - * @return boolean True if defined. - * @access public - */ - function classOrInterfaceExists() { - return $this->classOrInterfaceExistsWithAutoload($this->interface, true); - } - - /** - * Needed to kill the autoload feature in PHP5 - * for classes created dynamically. - * @return boolean True if defined. - * @access public - */ - function classOrInterfaceExistsSansAutoload() { - return $this->classOrInterfaceExistsWithAutoload($this->interface, false); - } - - /** - * Needed to select the autoload feature in PHP5 - * for classes created dynamically. - * @param string $interface Class or interface name. - * @param boolean $autoload True totriggerautoload. - * @return boolean True if interface defined. - * @access private - */ - protected function classOrInterfaceExistsWithAutoload($interface, $autoload) { - if (function_exists('interface_exists')) { - if (interface_exists($this->interface, $autoload)) { - return true; - } - } - return class_exists($this->interface, $autoload); - } - - /** - * Gets the list of methods on a class or - * interface. - * @returns array List of method names. - * @access public - */ - function getMethods() { - return array_unique(get_class_methods($this->interface)); - } - - /** - * Gets the list of interfaces from a class. If the - * class name is actually an interface then just that - * interface is returned. - * @returns array List of interfaces. - * @access public - */ - function getInterfaces() { - $reflection = new ReflectionClass($this->interface); - if ($reflection->isInterface()) { - return array($this->interface); - } - return $this->onlyParents($reflection->getInterfaces()); - } - - /** - * Gets the list of methods for the implemented - * interfaces only. - * @returns array List of enforced method signatures. - * @access public - */ - function getInterfaceMethods() { - $methods = array(); - foreach ($this->getInterfaces() as $interface) { - $methods = array_merge($methods, get_class_methods($interface)); - } - return array_unique($methods); - } - - /** - * Checks to see if the method signature has to be tightly - * specified. - * @param string $method Method name. - * @returns boolean True if enforced. - * @access private - */ - protected function isInterfaceMethod($method) { - return in_array($method, $this->getInterfaceMethods()); - } - - /** - * Finds the parent class name. - * @returns string Parent class name. - * @access public - */ - function getParent() { - $reflection = new ReflectionClass($this->interface); - $parent = $reflection->getParentClass(); - if ($parent) { - return $parent->getName(); - } - return false; - } - - /** - * Trivially determines if the class is abstract. - * @returns boolean True if abstract. - * @access public - */ - function isAbstract() { - $reflection = new ReflectionClass($this->interface); - return $reflection->isAbstract(); - } - - /** - * Trivially determines if the class is an interface. - * @returns boolean True if interface. - * @access public - */ - function isInterface() { - $reflection = new ReflectionClass($this->interface); - return $reflection->isInterface(); - } - - /** - * Scans for final methods, as they screw up inherited - * mocks by not allowing you to override them. - * @returns boolean True if the class has a final method. - * @access public - */ - function hasFinal() { - $reflection = new ReflectionClass($this->interface); - foreach ($reflection->getMethods() as $method) { - if ($method->isFinal()) { - return true; - } - } - return false; - } - - /** - * Whittles a list of interfaces down to only the - * necessary top level parents. - * @param array $interfaces Reflection API interfaces - * to reduce. - * @returns array List of parent interface names. - * @access private - */ - protected function onlyParents($interfaces) { - $parents = array(); - $blacklist = array(); - foreach ($interfaces as $interface) { - foreach($interfaces as $possible_parent) { - if ($interface->getName() == $possible_parent->getName()) { - continue; - } - if ($interface->isSubClassOf($possible_parent)) { - $blacklist[$possible_parent->getName()] = true; - } - } - if (!isset($blacklist[$interface->getName()])) { - $parents[] = $interface->getName(); - } - } - return $parents; - } - - /** - * Checks whether a method is abstract or not. - * @param string $name Method name. - * @return bool true if method is abstract, else false - * @access private - */ - protected function isAbstractMethod($name) { - $interface = new ReflectionClass($this->interface); - if (! $interface->hasMethod($name)) { - return false; - } - return $interface->getMethod($name)->isAbstract(); - } - - /** - * Checks whether a method is the constructor. - * @param string $name Method name. - * @return bool true if method is the constructor - * @access private - */ - protected function isConstructor($name) { - return ($name == '__construct') || ($name == $this->interface); - } - - /** - * Checks whether a method is abstract in all parents or not. - * @param string $name Method name. - * @return bool true if method is abstract in parent, else false - * @access private - */ - protected function isAbstractMethodInParents($name) { - $interface = new ReflectionClass($this->interface); - $parent = $interface->getParentClass(); - while($parent) { - if (! $parent->hasMethod($name)) { - return false; - } - if ($parent->getMethod($name)->isAbstract()) { - return true; - } - $parent = $parent->getParentClass(); - } - return false; - } - - /** - * Checks whether a method is static or not. - * @param string $name Method name - * @return bool true if method is static, else false - * @access private - */ - protected function isStaticMethod($name) { - $interface = new ReflectionClass($this->interface); - if (! $interface->hasMethod($name)) { - return false; - } - return $interface->getMethod($name)->isStatic(); - } - - /** - * Writes the source code matching the declaration - * of a method. - * @param string $name Method name. - * @return string Method signature up to last - * bracket. - * @access public - */ - function getSignature($name) { - if ($name == '__set') { - return 'function __set($key, $value)'; - } - if ($name == '__call') { - return 'function __call($method, $arguments)'; - } - if (version_compare(phpversion(), '5.1.0', '>=')) { - if (in_array($name, array('__get', '__isset', $name == '__unset'))) { - return "function {$name}(\$key)"; - } - } - if ($name == '__toString') { - return "function $name()"; - } - - // This wonky try-catch is a work around for a faulty method_exists() - // in early versions of PHP 5 which would return false for static - // methods. The Reflection classes work fine, but hasMethod() - // doesn't exist prior to PHP 5.1.0, so we need to use a more crude - // detection method. - try { - $interface = new ReflectionClass($this->interface); - $interface->getMethod($name); - } catch (ReflectionException $e) { - return "function $name()"; - } - return $this->getFullSignature($name); - } - - /** - * For a signature specified in an interface, full - * details must be replicated to be a valid implementation. - * @param string $name Method name. - * @return string Method signature up to last - * bracket. - * @access private - */ - protected function getFullSignature($name) { - $interface = new ReflectionClass($this->interface); - $method = $interface->getMethod($name); - $reference = $method->returnsReference() ? '&' : ''; - $static = $method->isStatic() ? 'static ' : ''; - return "{$static}function $reference$name(" . - implode(', ', $this->getParameterSignatures($method)) . - ")"; - } - - /** - * Gets the source code for each parameter. - * @param ReflectionMethod $method Method object from - * reflection API - * @return array List of strings, each - * a snippet of code. - * @access private - */ - protected function getParameterSignatures($method) { - $signatures = array(); - foreach ($method->getParameters() as $parameter) { - $signature = ''; - $type = $parameter->getClass(); - if (is_null($type) && version_compare(phpversion(), '5.1.0', '>=') && $parameter->isArray()) { - $signature .= 'array '; - } elseif (!is_null($type)) { - $signature .= $type->getName() . ' '; - } - if ($parameter->isPassedByReference()) { - $signature .= '&'; - } - $signature .= '$' . $this->suppressSpurious($parameter->getName()); - if ($this->isOptional($parameter)) { - $signature .= ' = null'; - } - $signatures[] = $signature; - } - return $signatures; - } - - /** - * The SPL library has problems with the - * Reflection library. In particular, you can - * get extra characters in parameter names :(. - * @param string $name Parameter name. - * @return string Cleaner name. - * @access private - */ - protected function suppressSpurious($name) { - return str_replace(array('[', ']', ' '), '', $name); - } - - /** - * Test of a reflection parameter being optional - * that works with early versions of PHP5. - * @param reflectionParameter $parameter Is this optional. - * @return boolean True if optional. - * @access private - */ - protected function isOptional($parameter) { - if (method_exists($parameter, 'isOptional')) { - return $parameter->isOptional(); - } - return false; - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/remote.php b/3rdparty/simpletest/remote.php deleted file mode 100644 index 4bb37b7c51b..00000000000 --- a/3rdparty/simpletest/remote.php +++ /dev/null @@ -1,115 +0,0 @@ -url = $url; - $this->dry_url = $dry_url ? $dry_url : $url; - $this->size = false; - } - - /** - * Accessor for the test name for subclasses. - * @return string Name of the test. - * @access public - */ - function getLabel() { - return $this->url; - } - - /** - * Runs the top level test for this class. Currently - * reads the data as a single chunk. I'll fix this - * once I have added iteration to the browser. - * @param SimpleReporter $reporter Target of test results. - * @returns boolean True if no failures. - * @access public - */ - function run($reporter) { - $browser = $this->createBrowser(); - $xml = $browser->get($this->url); - if (! $xml) { - trigger_error('Cannot read remote test URL [' . $this->url . ']'); - return false; - } - $parser = $this->createParser($reporter); - if (! $parser->parse($xml)) { - trigger_error('Cannot parse incoming XML from [' . $this->url . ']'); - return false; - } - return true; - } - - /** - * Creates a new web browser object for fetching - * the XML report. - * @return SimpleBrowser New browser. - * @access protected - */ - protected function createBrowser() { - return new SimpleBrowser(); - } - - /** - * Creates the XML parser. - * @param SimpleReporter $reporter Target of test results. - * @return SimpleTestXmlListener XML reader. - * @access protected - */ - protected function createParser($reporter) { - return new SimpleTestXmlParser($reporter); - } - - /** - * Accessor for the number of subtests. - * @return integer Number of test cases. - * @access public - */ - function getSize() { - if ($this->size === false) { - $browser = $this->createBrowser(); - $xml = $browser->get($this->dry_url); - if (! $xml) { - trigger_error('Cannot read remote test URL [' . $this->dry_url . ']'); - return false; - } - $reporter = new SimpleReporter(); - $parser = $this->createParser($reporter); - if (! $parser->parse($xml)) { - trigger_error('Cannot parse incoming XML from [' . $this->dry_url . ']'); - return false; - } - $this->size = $reporter->getTestCaseCount(); - } - return $this->size; - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/reporter.php b/3rdparty/simpletest/reporter.php deleted file mode 100644 index bd4f3fa41dd..00000000000 --- a/3rdparty/simpletest/reporter.php +++ /dev/null @@ -1,445 +0,0 @@ -character_set = $character_set; - } - - /** - * Paints the top of the web page setting the - * title to the name of the starting test. - * @param string $test_name Name class of test. - * @access public - */ - function paintHeader($test_name) { - $this->sendNoCacheHeaders(); - print ""; - print "\n\n$test_name\n"; - print "\n"; - print "\n"; - print "\n\n"; - print "

                $test_name

                \n"; - flush(); - } - - /** - * Send the headers necessary to ensure the page is - * reloaded on every request. Otherwise you could be - * scratching your head over out of date test data. - * @access public - */ - static function sendNoCacheHeaders() { - if (! headers_sent()) { - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate"); - header("Cache-Control: post-check=0, pre-check=0", false); - header("Pragma: no-cache"); - } - } - - /** - * Paints the CSS. Add additional styles here. - * @return string CSS code as text. - * @access protected - */ - protected function getCss() { - return ".fail { background-color: inherit; color: red; }" . - ".pass { background-color: inherit; color: green; }" . - " pre { background-color: lightgray; color: inherit; }"; - } - - /** - * Paints the end of the test with a summary of - * the passes and failures. - * @param string $test_name Name class of test. - * @access public - */ - function paintFooter($test_name) { - $colour = ($this->getFailCount() + $this->getExceptionCount() > 0 ? "red" : "green"); - print "
                "; - print $this->getTestCaseProgress() . "/" . $this->getTestCaseCount(); - print " test cases complete:\n"; - print "" . $this->getPassCount() . " passes, "; - print "" . $this->getFailCount() . " fails and "; - print "" . $this->getExceptionCount() . " exceptions."; - print "
                \n"; - print "\n\n"; - } - - /** - * Paints the test failure with a breadcrumbs - * trail of the nesting test suites below the - * top level test. - * @param string $message Failure message displayed in - * the context of the other tests. - */ - function paintFail($message) { - parent::paintFail($message); - print "Fail: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - print " -> " . $this->htmlEntities($message) . "
                \n"; - } - - /** - * Paints a PHP error. - * @param string $message Message is ignored. - * @access public - */ - function paintError($message) { - parent::paintError($message); - print "Exception: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - print " -> " . $this->htmlEntities($message) . "
                \n"; - } - - /** - * Paints a PHP exception. - * @param Exception $exception Exception to display. - * @access public - */ - function paintException($exception) { - parent::paintException($exception); - print "Exception: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - $message = 'Unexpected exception of type [' . get_class($exception) . - '] with message ['. $exception->getMessage() . - '] in ['. $exception->getFile() . - ' line ' . $exception->getLine() . ']'; - print " -> " . $this->htmlEntities($message) . "
                \n"; - } - - /** - * Prints the message for skipping tests. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { - parent::paintSkip($message); - print "Skipped: "; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print implode(" -> ", $breadcrumb); - print " -> " . $this->htmlEntities($message) . "
                \n"; - } - - /** - * Paints formatted text such as dumped privateiables. - * @param string $message Text to show. - * @access public - */ - function paintFormattedMessage($message) { - print '
                ' . $this->htmlEntities($message) . '
                '; - } - - /** - * Character set adjusted entity conversion. - * @param string $message Plain text or Unicode message. - * @return string Browser readable message. - * @access protected - */ - protected function htmlEntities($message) { - return htmlentities($message, ENT_COMPAT, $this->character_set); - } -} - -/** - * Sample minimal test displayer. Generates only - * failure messages and a pass count. For command - * line use. I've tried to make it look like JUnit, - * but I wanted to output the errors as they arrived - * which meant dropping the dots. - * @package SimpleTest - * @subpackage UnitTester - */ -class TextReporter extends SimpleReporter { - - /** - * Does nothing yet. The first output will - * be sent on the first test start. - */ - function __construct() { - parent::__construct(); - } - - /** - * Paints the title only. - * @param string $test_name Name class of test. - * @access public - */ - function paintHeader($test_name) { - if (! SimpleReporter::inCli()) { - header('Content-type: text/plain'); - } - print "$test_name\n"; - flush(); - } - - /** - * Paints the end of the test with a summary of - * the passes and failures. - * @param string $test_name Name class of test. - * @access public - */ - function paintFooter($test_name) { - if ($this->getFailCount() + $this->getExceptionCount() == 0) { - print "OK\n"; - } else { - print "FAILURES!!!\n"; - } - print "Test cases run: " . $this->getTestCaseProgress() . - "/" . $this->getTestCaseCount() . - ", Passes: " . $this->getPassCount() . - ", Failures: " . $this->getFailCount() . - ", Exceptions: " . $this->getExceptionCount() . "\n"; - } - - /** - * Paints the test failure as a stack trace. - * @param string $message Failure message displayed in - * the context of the other tests. - * @access public - */ - function paintFail($message) { - parent::paintFail($message); - print $this->getFailCount() . ") $message\n"; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); - print "\n"; - } - - /** - * Paints a PHP error or exception. - * @param string $message Message to be shown. - * @access public - * @abstract - */ - function paintError($message) { - parent::paintError($message); - print "Exception " . $this->getExceptionCount() . "!\n$message\n"; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); - print "\n"; - } - - /** - * Paints a PHP error or exception. - * @param Exception $exception Exception to describe. - * @access public - * @abstract - */ - function paintException($exception) { - parent::paintException($exception); - $message = 'Unexpected exception of type [' . get_class($exception) . - '] with message ['. $exception->getMessage() . - '] in ['. $exception->getFile() . - ' line ' . $exception->getLine() . ']'; - print "Exception " . $this->getExceptionCount() . "!\n$message\n"; - $breadcrumb = $this->getTestList(); - array_shift($breadcrumb); - print "\tin " . implode("\n\tin ", array_reverse($breadcrumb)); - print "\n"; - } - - /** - * Prints the message for skipping tests. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { - parent::paintSkip($message); - print "Skip: $message\n"; - } - - /** - * Paints formatted text such as dumped privateiables. - * @param string $message Text to show. - * @access public - */ - function paintFormattedMessage($message) { - print "$message\n"; - flush(); - } -} - -/** - * Runs just a single test group, a single case or - * even a single test within that case. - * @package SimpleTest - * @subpackage UnitTester - */ -class SelectiveReporter extends SimpleReporterDecorator { - private $just_this_case = false; - private $just_this_test = false; - private $on; - - /** - * Selects the test case or group to be run, - * and optionally a specific test. - * @param SimpleScorer $reporter Reporter to receive events. - * @param string $just_this_case Only this case or group will run. - * @param string $just_this_test Only this test method will run. - */ - function __construct($reporter, $just_this_case = false, $just_this_test = false) { - if (isset($just_this_case) && $just_this_case) { - $this->just_this_case = strtolower($just_this_case); - $this->off(); - } else { - $this->on(); - } - if (isset($just_this_test) && $just_this_test) { - $this->just_this_test = strtolower($just_this_test); - } - parent::__construct($reporter); - } - - /** - * Compares criteria to actual the case/group name. - * @param string $test_case The incoming test. - * @return boolean True if matched. - * @access protected - */ - protected function matchesTestCase($test_case) { - return $this->just_this_case == strtolower($test_case); - } - - /** - * Compares criteria to actual the test name. If no - * name was specified at the beginning, then all tests - * can run. - * @param string $method The incoming test method. - * @return boolean True if matched. - * @access protected - */ - protected function shouldRunTest($test_case, $method) { - if ($this->isOn() || $this->matchesTestCase($test_case)) { - if ($this->just_this_test) { - return $this->just_this_test == strtolower($method); - } else { - return true; - } - } - return false; - } - - /** - * Switch on testing for the group or subgroup. - * @access private - */ - protected function on() { - $this->on = true; - } - - /** - * Switch off testing for the group or subgroup. - * @access private - */ - protected function off() { - $this->on = false; - } - - /** - * Is this group actually being tested? - * @return boolean True if the current test group is active. - * @access private - */ - protected function isOn() { - return $this->on; - } - - /** - * Veto everything that doesn't match the method wanted. - * @param string $test_case Name of test case. - * @param string $method Name of test method. - * @return boolean True if test should be run. - * @access public - */ - function shouldInvoke($test_case, $method) { - if ($this->shouldRunTest($test_case, $method)) { - return $this->reporter->shouldInvoke($test_case, $method); - } - return false; - } - - /** - * Paints the start of a group test. - * @param string $test_case Name of test or other label. - * @param integer $size Number of test cases starting. - * @access public - */ - function paintGroupStart($test_case, $size) { - if ($this->just_this_case && $this->matchesTestCase($test_case)) { - $this->on(); - } - $this->reporter->paintGroupStart($test_case, $size); - } - - /** - * Paints the end of a group test. - * @param string $test_case Name of test or other label. - * @access public - */ - function paintGroupEnd($test_case) { - $this->reporter->paintGroupEnd($test_case); - if ($this->just_this_case && $this->matchesTestCase($test_case)) { - $this->off(); - } - } -} - -/** - * Suppresses skip messages. - * @package SimpleTest - * @subpackage UnitTester - */ -class NoSkipsReporter extends SimpleReporterDecorator { - - /** - * Does nothing. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/scorer.php b/3rdparty/simpletest/scorer.php deleted file mode 100644 index 27776f4b631..00000000000 --- a/3rdparty/simpletest/scorer.php +++ /dev/null @@ -1,875 +0,0 @@ -passes = 0; - $this->fails = 0; - $this->exceptions = 0; - $this->is_dry_run = false; - } - - /** - * Signals that the next evaluation will be a dry - * run. That is, the structure events will be - * recorded, but no tests will be run. - * @param boolean $is_dry Dry run if true. - * @access public - */ - function makeDry($is_dry = true) { - $this->is_dry_run = $is_dry; - } - - /** - * The reporter has a veto on what should be run. - * @param string $test_case_name name of test case. - * @param string $method Name of test method. - * @access public - */ - function shouldInvoke($test_case_name, $method) { - return ! $this->is_dry_run; - } - - /** - * Can wrap the invoker in preperation for running - * a test. - * @param SimpleInvoker $invoker Individual test runner. - * @return SimpleInvoker Wrapped test runner. - * @access public - */ - function createInvoker($invoker) { - return $invoker; - } - - /** - * Accessor for current status. Will be false - * if there have been any failures or exceptions. - * Used for command line tools. - * @return boolean True if no failures. - * @access public - */ - function getStatus() { - if ($this->exceptions + $this->fails > 0) { - return false; - } - return true; - } - - /** - * Paints the start of a group test. - * @param string $test_name Name of test or other label. - * @param integer $size Number of test cases starting. - * @access public - */ - function paintGroupStart($test_name, $size) { - } - - /** - * Paints the end of a group test. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintGroupEnd($test_name) { - } - - /** - * Paints the start of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseStart($test_name) { - } - - /** - * Paints the end of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseEnd($test_name) { - } - - /** - * Paints the start of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodStart($test_name) { - } - - /** - * Paints the end of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodEnd($test_name) { - } - - /** - * Increments the pass count. - * @param string $message Message is ignored. - * @access public - */ - function paintPass($message) { - $this->passes++; - } - - /** - * Increments the fail count. - * @param string $message Message is ignored. - * @access public - */ - function paintFail($message) { - $this->fails++; - } - - /** - * Deals with PHP 4 throwing an error. - * @param string $message Text of error formatted by - * the test case. - * @access public - */ - function paintError($message) { - $this->exceptions++; - } - - /** - * Deals with PHP 5 throwing an exception. - * @param Exception $exception The actual exception thrown. - * @access public - */ - function paintException($exception) { - $this->exceptions++; - } - - /** - * Prints the message for skipping tests. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { - } - - /** - * Accessor for the number of passes so far. - * @return integer Number of passes. - * @access public - */ - function getPassCount() { - return $this->passes; - } - - /** - * Accessor for the number of fails so far. - * @return integer Number of fails. - * @access public - */ - function getFailCount() { - return $this->fails; - } - - /** - * Accessor for the number of untrapped errors - * so far. - * @return integer Number of exceptions. - * @access public - */ - function getExceptionCount() { - return $this->exceptions; - } - - /** - * Paints a simple supplementary message. - * @param string $message Text to display. - * @access public - */ - function paintMessage($message) { - } - - /** - * Paints a formatted ASCII message such as a - * privateiable dump. - * @param string $message Text to display. - * @access public - */ - function paintFormattedMessage($message) { - } - - /** - * By default just ignores user generated events. - * @param string $type Event type as text. - * @param mixed $payload Message or object. - * @access public - */ - function paintSignal($type, $payload) { - } -} - -/** - * Recipient of generated test messages that can display - * page footers and headers. Also keeps track of the - * test nesting. This is the main base class on which - * to build the finished test (page based) displays. - * @package SimpleTest - * @subpackage UnitTester - */ -class SimpleReporter extends SimpleScorer { - private $test_stack; - private $size; - private $progress; - - /** - * Starts the display with no results in. - * @access public - */ - function __construct() { - parent::__construct(); - $this->test_stack = array(); - $this->size = null; - $this->progress = 0; - } - - /** - * Gets the formatter for small generic data items. - * @return SimpleDumper Formatter. - * @access public - */ - function getDumper() { - return new SimpleDumper(); - } - - /** - * Paints the start of a group test. Will also paint - * the page header and footer if this is the - * first test. Will stash the size if the first - * start. - * @param string $test_name Name of test that is starting. - * @param integer $size Number of test cases starting. - * @access public - */ - function paintGroupStart($test_name, $size) { - if (! isset($this->size)) { - $this->size = $size; - } - if (count($this->test_stack) == 0) { - $this->paintHeader($test_name); - } - $this->test_stack[] = $test_name; - } - - /** - * Paints the end of a group test. Will paint the page - * footer if the stack of tests has unwound. - * @param string $test_name Name of test that is ending. - * @param integer $progress Number of test cases ending. - * @access public - */ - function paintGroupEnd($test_name) { - array_pop($this->test_stack); - if (count($this->test_stack) == 0) { - $this->paintFooter($test_name); - } - } - - /** - * Paints the start of a test case. Will also paint - * the page header and footer if this is the - * first test. Will stash the size if the first - * start. - * @param string $test_name Name of test that is starting. - * @access public - */ - function paintCaseStart($test_name) { - if (! isset($this->size)) { - $this->size = 1; - } - if (count($this->test_stack) == 0) { - $this->paintHeader($test_name); - } - $this->test_stack[] = $test_name; - } - - /** - * Paints the end of a test case. Will paint the page - * footer if the stack of tests has unwound. - * @param string $test_name Name of test that is ending. - * @access public - */ - function paintCaseEnd($test_name) { - $this->progress++; - array_pop($this->test_stack); - if (count($this->test_stack) == 0) { - $this->paintFooter($test_name); - } - } - - /** - * Paints the start of a test method. - * @param string $test_name Name of test that is starting. - * @access public - */ - function paintMethodStart($test_name) { - $this->test_stack[] = $test_name; - } - - /** - * Paints the end of a test method. Will paint the page - * footer if the stack of tests has unwound. - * @param string $test_name Name of test that is ending. - * @access public - */ - function paintMethodEnd($test_name) { - array_pop($this->test_stack); - } - - /** - * Paints the test document header. - * @param string $test_name First test top level - * to start. - * @access public - * @abstract - */ - function paintHeader($test_name) { - } - - /** - * Paints the test document footer. - * @param string $test_name The top level test. - * @access public - * @abstract - */ - function paintFooter($test_name) { - } - - /** - * Accessor for internal test stack. For - * subclasses that need to see the whole test - * history for display purposes. - * @return array List of methods in nesting order. - * @access public - */ - function getTestList() { - return $this->test_stack; - } - - /** - * Accessor for total test size in number - * of test cases. Null until the first - * test is started. - * @return integer Total number of cases at start. - * @access public - */ - function getTestCaseCount() { - return $this->size; - } - - /** - * Accessor for the number of test cases - * completed so far. - * @return integer Number of ended cases. - * @access public - */ - function getTestCaseProgress() { - return $this->progress; - } - - /** - * Static check for running in the comand line. - * @return boolean True if CLI. - * @access public - */ - static function inCli() { - return php_sapi_name() == 'cli'; - } -} - -/** - * For modifying the behaviour of the visual reporters. - * @package SimpleTest - * @subpackage UnitTester - */ -class SimpleReporterDecorator { - protected $reporter; - - /** - * Mediates between the reporter and the test case. - * @param SimpleScorer $reporter Reporter to receive events. - */ - function __construct($reporter) { - $this->reporter = $reporter; - } - - /** - * Signals that the next evaluation will be a dry - * run. That is, the structure events will be - * recorded, but no tests will be run. - * @param boolean $is_dry Dry run if true. - * @access public - */ - function makeDry($is_dry = true) { - $this->reporter->makeDry($is_dry); - } - - /** - * Accessor for current status. Will be false - * if there have been any failures or exceptions. - * Used for command line tools. - * @return boolean True if no failures. - * @access public - */ - function getStatus() { - return $this->reporter->getStatus(); - } - - /** - * The nesting of the test cases so far. Not - * all reporters have this facility. - * @return array Test list if accessible. - * @access public - */ - function getTestList() { - if (method_exists($this->reporter, 'getTestList')) { - return $this->reporter->getTestList(); - } else { - return array(); - } - } - - /** - * The reporter has a veto on what should be run. - * @param string $test_case_name Name of test case. - * @param string $method Name of test method. - * @return boolean True if test should be run. - * @access public - */ - function shouldInvoke($test_case_name, $method) { - return $this->reporter->shouldInvoke($test_case_name, $method); - } - - /** - * Can wrap the invoker in preparation for running - * a test. - * @param SimpleInvoker $invoker Individual test runner. - * @return SimpleInvoker Wrapped test runner. - * @access public - */ - function createInvoker($invoker) { - return $this->reporter->createInvoker($invoker); - } - - /** - * Gets the formatter for privateiables and other small - * generic data items. - * @return SimpleDumper Formatter. - * @access public - */ - function getDumper() { - return $this->reporter->getDumper(); - } - - /** - * Paints the start of a group test. - * @param string $test_name Name of test or other label. - * @param integer $size Number of test cases starting. - * @access public - */ - function paintGroupStart($test_name, $size) { - $this->reporter->paintGroupStart($test_name, $size); - } - - /** - * Paints the end of a group test. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintGroupEnd($test_name) { - $this->reporter->paintGroupEnd($test_name); - } - - /** - * Paints the start of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseStart($test_name) { - $this->reporter->paintCaseStart($test_name); - } - - /** - * Paints the end of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseEnd($test_name) { - $this->reporter->paintCaseEnd($test_name); - } - - /** - * Paints the start of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodStart($test_name) { - $this->reporter->paintMethodStart($test_name); - } - - /** - * Paints the end of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodEnd($test_name) { - $this->reporter->paintMethodEnd($test_name); - } - - /** - * Chains to the wrapped reporter. - * @param string $message Message is ignored. - * @access public - */ - function paintPass($message) { - $this->reporter->paintPass($message); - } - - /** - * Chains to the wrapped reporter. - * @param string $message Message is ignored. - * @access public - */ - function paintFail($message) { - $this->reporter->paintFail($message); - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text of error formatted by - * the test case. - * @access public - */ - function paintError($message) { - $this->reporter->paintError($message); - } - - /** - * Chains to the wrapped reporter. - * @param Exception $exception Exception to show. - * @access public - */ - function paintException($exception) { - $this->reporter->paintException($exception); - } - - /** - * Prints the message for skipping tests. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { - $this->reporter->paintSkip($message); - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text to display. - * @access public - */ - function paintMessage($message) { - $this->reporter->paintMessage($message); - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text to display. - * @access public - */ - function paintFormattedMessage($message) { - $this->reporter->paintFormattedMessage($message); - } - - /** - * Chains to the wrapped reporter. - * @param string $type Event type as text. - * @param mixed $payload Message or object. - * @return boolean Should return false if this - * type of signal should fail the - * test suite. - * @access public - */ - function paintSignal($type, $payload) { - $this->reporter->paintSignal($type, $payload); - } -} - -/** - * For sending messages to multiple reporters at - * the same time. - * @package SimpleTest - * @subpackage UnitTester - */ -class MultipleReporter { - private $reporters = array(); - - /** - * Adds a reporter to the subscriber list. - * @param SimpleScorer $reporter Reporter to receive events. - * @access public - */ - function attachReporter($reporter) { - $this->reporters[] = $reporter; - } - - /** - * Signals that the next evaluation will be a dry - * run. That is, the structure events will be - * recorded, but no tests will be run. - * @param boolean $is_dry Dry run if true. - * @access public - */ - function makeDry($is_dry = true) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->makeDry($is_dry); - } - } - - /** - * Accessor for current status. Will be false - * if there have been any failures or exceptions. - * If any reporter reports a failure, the whole - * suite fails. - * @return boolean True if no failures. - * @access public - */ - function getStatus() { - for ($i = 0; $i < count($this->reporters); $i++) { - if (! $this->reporters[$i]->getStatus()) { - return false; - } - } - return true; - } - - /** - * The reporter has a veto on what should be run. - * It requires all reporters to want to run the method. - * @param string $test_case_name name of test case. - * @param string $method Name of test method. - * @access public - */ - function shouldInvoke($test_case_name, $method) { - for ($i = 0; $i < count($this->reporters); $i++) { - if (! $this->reporters[$i]->shouldInvoke($test_case_name, $method)) { - return false; - } - } - return true; - } - - /** - * Every reporter gets a chance to wrap the invoker. - * @param SimpleInvoker $invoker Individual test runner. - * @return SimpleInvoker Wrapped test runner. - * @access public - */ - function createInvoker($invoker) { - for ($i = 0; $i < count($this->reporters); $i++) { - $invoker = $this->reporters[$i]->createInvoker($invoker); - } - return $invoker; - } - - /** - * Gets the formatter for privateiables and other small - * generic data items. - * @return SimpleDumper Formatter. - * @access public - */ - function getDumper() { - return new SimpleDumper(); - } - - /** - * Paints the start of a group test. - * @param string $test_name Name of test or other label. - * @param integer $size Number of test cases starting. - * @access public - */ - function paintGroupStart($test_name, $size) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintGroupStart($test_name, $size); - } - } - - /** - * Paints the end of a group test. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintGroupEnd($test_name) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintGroupEnd($test_name); - } - } - - /** - * Paints the start of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseStart($test_name) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintCaseStart($test_name); - } - } - - /** - * Paints the end of a test case. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintCaseEnd($test_name) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintCaseEnd($test_name); - } - } - - /** - * Paints the start of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodStart($test_name) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintMethodStart($test_name); - } - } - - /** - * Paints the end of a test method. - * @param string $test_name Name of test or other label. - * @access public - */ - function paintMethodEnd($test_name) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintMethodEnd($test_name); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $message Message is ignored. - * @access public - */ - function paintPass($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintPass($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $message Message is ignored. - * @access public - */ - function paintFail($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintFail($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text of error formatted by - * the test case. - * @access public - */ - function paintError($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintError($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param Exception $exception Exception to display. - * @access public - */ - function paintException($exception) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintException($exception); - } - } - - /** - * Prints the message for skipping tests. - * @param string $message Text of skip condition. - * @access public - */ - function paintSkip($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintSkip($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text to display. - * @access public - */ - function paintMessage($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintMessage($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $message Text to display. - * @access public - */ - function paintFormattedMessage($message) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintFormattedMessage($message); - } - } - - /** - * Chains to the wrapped reporter. - * @param string $type Event type as text. - * @param mixed $payload Message or object. - * @return boolean Should return false if this - * type of signal should fail the - * test suite. - * @access public - */ - function paintSignal($type, $payload) { - for ($i = 0; $i < count($this->reporters); $i++) { - $this->reporters[$i]->paintSignal($type, $payload); - } - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/selector.php b/3rdparty/simpletest/selector.php deleted file mode 100644 index ba2fed312a8..00000000000 --- a/3rdparty/simpletest/selector.php +++ /dev/null @@ -1,141 +0,0 @@ -name = $name; - } - - /** - * Accessor for name. - * @returns string $name Name to match. - */ - function getName() { - return $this->name; - } - - /** - * Compares with name attribute of widget. - * @param SimpleWidget $widget Control to compare. - * @access public - */ - function isMatch($widget) { - return ($widget->getName() == $this->name); - } -} - -/** - * Used to extract form elements for testing against. - * Searches by visible label or alt text. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleByLabel { - private $label; - - /** - * Stashes the name for later comparison. - * @param string $label Visible text to match. - */ - function __construct($label) { - $this->label = $label; - } - - /** - * Comparison. Compares visible text of widget or - * related label. - * @param SimpleWidget $widget Control to compare. - * @access public - */ - function isMatch($widget) { - if (! method_exists($widget, 'isLabel')) { - return false; - } - return $widget->isLabel($this->label); - } -} - -/** - * Used to extract form elements for testing against. - * Searches dy id attribute. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleById { - private $id; - - /** - * Stashes the name for later comparison. - * @param string $id ID atribute to match. - */ - function __construct($id) { - $this->id = $id; - } - - /** - * Comparison. Compares id attribute of widget. - * @param SimpleWidget $widget Control to compare. - * @access public - */ - function isMatch($widget) { - return $widget->isId($this->id); - } -} - -/** - * Used to extract form elements for testing against. - * Searches by visible label, name or alt text. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleByLabelOrName { - private $label; - - /** - * Stashes the name/label for later comparison. - * @param string $label Visible text to match. - */ - function __construct($label) { - $this->label = $label; - } - - /** - * Comparison. Compares visible text of widget or - * related label or name. - * @param SimpleWidget $widget Control to compare. - * @access public - */ - function isMatch($widget) { - if (method_exists($widget, 'isLabel')) { - if ($widget->isLabel($this->label)) { - return true; - } - } - return ($widget->getName() == $this->label); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/shell_tester.php b/3rdparty/simpletest/shell_tester.php deleted file mode 100644 index 9a3bd389eeb..00000000000 --- a/3rdparty/simpletest/shell_tester.php +++ /dev/null @@ -1,330 +0,0 @@ -output = false; - } - - /** - * Actually runs the command. Does not trap the - * error stream output as this need PHP 4.3+. - * @param string $command The actual command line - * to run. - * @return integer Exit code. - * @access public - */ - function execute($command) { - $this->output = false; - exec($command, $this->output, $ret); - return $ret; - } - - /** - * Accessor for the last output. - * @return string Output as text. - * @access public - */ - function getOutput() { - return implode("\n", $this->output); - } - - /** - * Accessor for the last output. - * @return array Output as array of lines. - * @access public - */ - function getOutputAsList() { - return $this->output; - } -} - -/** - * Test case for testing of command line scripts and - * utilities. Usually scripts that are external to the - * PHP code, but support it in some way. - * @package SimpleTest - * @subpackage UnitTester - */ -class ShellTestCase extends SimpleTestCase { - private $current_shell; - private $last_status; - private $last_command; - - /** - * Creates an empty test case. Should be subclassed - * with test methods for a functional test case. - * @param string $label Name of test case. Will use - * the class name if none specified. - * @access public - */ - function __construct($label = false) { - parent::__construct($label); - $this->current_shell = $this->createShell(); - $this->last_status = false; - $this->last_command = ''; - } - - /** - * Executes a command and buffers the results. - * @param string $command Command to run. - * @return boolean True if zero exit code. - * @access public - */ - function execute($command) { - $shell = $this->getShell(); - $this->last_status = $shell->execute($command); - $this->last_command = $command; - return ($this->last_status === 0); - } - - /** - * Dumps the output of the last command. - * @access public - */ - function dumpOutput() { - $this->dump($this->getOutput()); - } - - /** - * Accessor for the last output. - * @return string Output as text. - * @access public - */ - function getOutput() { - $shell = $this->getShell(); - return $shell->getOutput(); - } - - /** - * Accessor for the last output. - * @return array Output as array of lines. - * @access public - */ - function getOutputAsList() { - $shell = $this->getShell(); - return $shell->getOutputAsList(); - } - - /** - * Called from within the test methods to register - * passes and failures. - * @param boolean $result Pass on true. - * @param string $message Message to display describing - * the test state. - * @return boolean True on pass - * @access public - */ - function assertTrue($result, $message = false) { - return $this->assert(new TrueExpectation(), $result, $message); - } - - /** - * Will be true on false and vice versa. False - * is the PHP definition of false, so that null, - * empty strings, zero and an empty array all count - * as false. - * @param boolean $result Pass on false. - * @param string $message Message to display. - * @return boolean True on pass - * @access public - */ - function assertFalse($result, $message = '%s') { - return $this->assert(new FalseExpectation(), $result, $message); - } - - /** - * Will trigger a pass if the two parameters have - * the same value only. Otherwise a fail. This - * is for testing hand extracted text, etc. - * @param mixed $first Value to compare. - * @param mixed $second Value to compare. - * @param string $message Message to display. - * @return boolean True on pass - * @access public - */ - function assertEqual($first, $second, $message = "%s") { - return $this->assert( - new EqualExpectation($first), - $second, - $message); - } - - /** - * Will trigger a pass if the two parameters have - * a different value. Otherwise a fail. This - * is for testing hand extracted text, etc. - * @param mixed $first Value to compare. - * @param mixed $second Value to compare. - * @param string $message Message to display. - * @return boolean True on pass - * @access public - */ - function assertNotEqual($first, $second, $message = "%s") { - return $this->assert( - new NotEqualExpectation($first), - $second, - $message); - } - - /** - * Tests the last status code from the shell. - * @param integer $status Expected status of last - * command. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertExitCode($status, $message = "%s") { - $message = sprintf($message, "Expected status code of [$status] from [" . - $this->last_command . "], but got [" . - $this->last_status . "]"); - return $this->assertTrue($status === $this->last_status, $message); - } - - /** - * Attempt to exactly match the combined STDERR and - * STDOUT output. - * @param string $expected Expected output. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertOutput($expected, $message = "%s") { - $shell = $this->getShell(); - return $this->assert( - new EqualExpectation($expected), - $shell->getOutput(), - $message); - } - - /** - * Scans the output for a Perl regex. If found - * anywhere it passes, else it fails. - * @param string $pattern Regex to search for. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertOutputPattern($pattern, $message = "%s") { - $shell = $this->getShell(); - return $this->assert( - new PatternExpectation($pattern), - $shell->getOutput(), - $message); - } - - /** - * If a Perl regex is found anywhere in the current - * output then a failure is generated, else a pass. - * @param string $pattern Regex to search for. - * @param $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertNoOutputPattern($pattern, $message = "%s") { - $shell = $this->getShell(); - return $this->assert( - new NoPatternExpectation($pattern), - $shell->getOutput(), - $message); - } - - /** - * File existence check. - * @param string $path Full filename and path. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertFileExists($path, $message = "%s") { - $message = sprintf($message, "File [$path] should exist"); - return $this->assertTrue(file_exists($path), $message); - } - - /** - * File non-existence check. - * @param string $path Full filename and path. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertFileNotExists($path, $message = "%s") { - $message = sprintf($message, "File [$path] should not exist"); - return $this->assertFalse(file_exists($path), $message); - } - - /** - * Scans a file for a Perl regex. If found - * anywhere it passes, else it fails. - * @param string $pattern Regex to search for. - * @param string $path Full filename and path. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertFilePattern($pattern, $path, $message = "%s") { - return $this->assert( - new PatternExpectation($pattern), - implode('', file($path)), - $message); - } - - /** - * If a Perl regex is found anywhere in the named - * file then a failure is generated, else a pass. - * @param string $pattern Regex to search for. - * @param string $path Full filename and path. - * @param string $message Message to display. - * @return boolean True if pass. - * @access public - */ - function assertNoFilePattern($pattern, $path, $message = "%s") { - return $this->assert( - new NoPatternExpectation($pattern), - implode('', file($path)), - $message); - } - - /** - * Accessor for current shell. Used for testing the - * the tester itself. - * @return Shell Current shell. - * @access protected - */ - protected function getShell() { - return $this->current_shell; - } - - /** - * Factory for the shell to run the command on. - * @return Shell New shell object. - * @access protected - */ - protected function createShell() { - return new SimpleShell(); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/simpletest.php b/3rdparty/simpletest/simpletest.php deleted file mode 100644 index 425c869a825..00000000000 --- a/3rdparty/simpletest/simpletest.php +++ /dev/null @@ -1,391 +0,0 @@ -getParent()) { - SimpleTest::ignore($parent); - } - } - } - } - - /** - * Puts the object to the global pool of 'preferred' objects - * which can be retrieved with SimpleTest :: preferred() method. - * Instances of the same class are overwritten. - * @param object $object Preferred object - * @see preferred() - */ - static function prefer($object) { - $registry = &SimpleTest::getRegistry(); - $registry['Preferred'][] = $object; - } - - /** - * Retrieves 'preferred' objects from global pool. Class filter - * can be applied in order to retrieve the object of the specific - * class - * @param array|string $classes Allowed classes or interfaces. - * @return array|object|null - * @see prefer() - */ - static function preferred($classes) { - if (! is_array($classes)) { - $classes = array($classes); - } - $registry = &SimpleTest::getRegistry(); - for ($i = count($registry['Preferred']) - 1; $i >= 0; $i--) { - foreach ($classes as $class) { - if (SimpleTestCompatibility::isA($registry['Preferred'][$i], $class)) { - return $registry['Preferred'][$i]; - } - } - } - return null; - } - - /** - * Test to see if a test case is in the ignore - * list. Quite obviously the ignore list should - * be a separate object and will be one day. - * This method is internal to SimpleTest. Don't - * use it. - * @param string $class Class name to test. - * @return boolean True if should not be run. - */ - static function isIgnored($class) { - $registry = &SimpleTest::getRegistry(); - return isset($registry['IgnoreList'][strtolower($class)]); - } - - /** - * Sets proxy to use on all requests for when - * testing from behind a firewall. Set host - * to false to disable. This will take effect - * if there are no other proxy settings. - * @param string $proxy Proxy host as URL. - * @param string $username Proxy username for authentication. - * @param string $password Proxy password for authentication. - */ - static function useProxy($proxy, $username = false, $password = false) { - $registry = &SimpleTest::getRegistry(); - $registry['DefaultProxy'] = $proxy; - $registry['DefaultProxyUsername'] = $username; - $registry['DefaultProxyPassword'] = $password; - } - - /** - * Accessor for default proxy host. - * @return string Proxy URL. - */ - static function getDefaultProxy() { - $registry = &SimpleTest::getRegistry(); - return $registry['DefaultProxy']; - } - - /** - * Accessor for default proxy username. - * @return string Proxy username for authentication. - */ - static function getDefaultProxyUsername() { - $registry = &SimpleTest::getRegistry(); - return $registry['DefaultProxyUsername']; - } - - /** - * Accessor for default proxy password. - * @return string Proxy password for authentication. - */ - static function getDefaultProxyPassword() { - $registry = &SimpleTest::getRegistry(); - return $registry['DefaultProxyPassword']; - } - - /** - * Accessor for default HTML parsers. - * @return array List of parsers to try in - * order until one responds true - * to can(). - */ - static function getParsers() { - $registry = &SimpleTest::getRegistry(); - return $registry['Parsers']; - } - - /** - * Set the list of HTML parsers to attempt to use by default. - * @param array $parsers List of parsers to try in - * order until one responds true - * to can(). - */ - static function setParsers($parsers) { - $registry = &SimpleTest::getRegistry(); - $registry['Parsers'] = $parsers; - } - - /** - * Accessor for global registry of options. - * @return hash All stored values. - */ - protected static function &getRegistry() { - static $registry = false; - if (! $registry) { - $registry = SimpleTest::getDefaults(); - } - return $registry; - } - - /** - * Accessor for the context of the current - * test run. - * @return SimpleTestContext Current test run. - */ - static function getContext() { - static $context = false; - if (! $context) { - $context = new SimpleTestContext(); - } - return $context; - } - - /** - * Constant default values. - * @return hash All registry defaults. - */ - protected static function getDefaults() { - return array( - 'Parsers' => false, - 'MockBaseClass' => 'SimpleMock', - 'IgnoreList' => array(), - 'DefaultProxy' => false, - 'DefaultProxyUsername' => false, - 'DefaultProxyPassword' => false, - 'Preferred' => array(new HtmlReporter(), new TextReporter(), new XmlReporter())); - } - - /** - * @deprecated - */ - static function setMockBaseClass($mock_base) { - $registry = &SimpleTest::getRegistry(); - $registry['MockBaseClass'] = $mock_base; - } - - /** - * @deprecated - */ - static function getMockBaseClass() { - $registry = &SimpleTest::getRegistry(); - return $registry['MockBaseClass']; - } -} - -/** - * Container for all components for a specific - * test run. Makes things like error queues - * available to PHP event handlers, and also - * gets around some nasty reference issues in - * the mocks. - * @package SimpleTest - */ -class SimpleTestContext { - private $test; - private $reporter; - private $resources; - - /** - * Clears down the current context. - * @access public - */ - function clear() { - $this->resources = array(); - } - - /** - * Sets the current test case instance. This - * global instance can be used by the mock objects - * to send message to the test cases. - * @param SimpleTestCase $test Test case to register. - */ - function setTest($test) { - $this->clear(); - $this->test = $test; - } - - /** - * Accessor for currently running test case. - * @return SimpleTestCase Current test. - */ - function getTest() { - return $this->test; - } - - /** - * Sets the current reporter. This - * global instance can be used by the mock objects - * to send messages. - * @param SimpleReporter $reporter Reporter to register. - */ - function setReporter($reporter) { - $this->clear(); - $this->reporter = $reporter; - } - - /** - * Accessor for current reporter. - * @return SimpleReporter Current reporter. - */ - function getReporter() { - return $this->reporter; - } - - /** - * Accessor for the Singleton resource. - * @return object Global resource. - */ - function get($resource) { - if (! isset($this->resources[$resource])) { - $this->resources[$resource] = new $resource(); - } - return $this->resources[$resource]; - } -} - -/** - * Interrogates the stack trace to recover the - * failure point. - * @package SimpleTest - * @subpackage UnitTester - */ -class SimpleStackTrace { - private $prefixes; - - /** - * Stashes the list of target prefixes. - * @param array $prefixes List of method prefixes - * to search for. - */ - function __construct($prefixes) { - $this->prefixes = $prefixes; - } - - /** - * Extracts the last method name that was not within - * Simpletest itself. Captures a stack trace if none given. - * @param array $stack List of stack frames. - * @return string Snippet of test report with line - * number and file. - */ - function traceMethod($stack = false) { - $stack = $stack ? $stack : $this->captureTrace(); - foreach ($stack as $frame) { - if ($this->frameLiesWithinSimpleTestFolder($frame)) { - continue; - } - if ($this->frameMatchesPrefix($frame)) { - return ' at [' . $frame['file'] . ' line ' . $frame['line'] . ']'; - } - } - return ''; - } - - /** - * Test to see if error is generated by SimpleTest itself. - * @param array $frame PHP stack frame. - * @return boolean True if a SimpleTest file. - */ - protected function frameLiesWithinSimpleTestFolder($frame) { - if (isset($frame['file'])) { - $path = substr(SIMPLE_TEST, 0, -1); - if (strpos($frame['file'], $path) === 0) { - if (dirname($frame['file']) == $path) { - return true; - } - } - } - return false; - } - - /** - * Tries to determine if the method call is an assert, etc. - * @param array $frame PHP stack frame. - * @return boolean True if matches a target. - */ - protected function frameMatchesPrefix($frame) { - foreach ($this->prefixes as $prefix) { - if (strncmp($frame['function'], $prefix, strlen($prefix)) == 0) { - return true; - } - } - return false; - } - - /** - * Grabs a current stack trace. - * @return array Fulle trace. - */ - protected function captureTrace() { - if (function_exists('debug_backtrace')) { - return array_reverse(debug_backtrace()); - } - return array(); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/socket.php b/3rdparty/simpletest/socket.php deleted file mode 100644 index 06e8ca62d00..00000000000 --- a/3rdparty/simpletest/socket.php +++ /dev/null @@ -1,312 +0,0 @@ -clearError(); - } - - /** - * Test for an outstanding error. - * @return boolean True if there is an error. - * @access public - */ - function isError() { - return ($this->error != ''); - } - - /** - * Accessor for an outstanding error. - * @return string Empty string if no error otherwise - * the error message. - * @access public - */ - function getError() { - return $this->error; - } - - /** - * Sets the internal error. - * @param string Error message to stash. - * @access protected - */ - function setError($error) { - $this->error = $error; - } - - /** - * Resets the error state to no error. - * @access protected - */ - function clearError() { - $this->setError(''); - } -} - -/** - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleFileSocket extends SimpleStickyError { - private $handle; - private $is_open = false; - private $sent = ''; - private $block_size; - - /** - * Opens a socket for reading and writing. - * @param SimpleUrl $file Target URI to fetch. - * @param integer $block_size Size of chunk to read. - * @access public - */ - function __construct($file, $block_size = 1024) { - parent::__construct(); - if (! ($this->handle = $this->openFile($file, $error))) { - $file_string = $file->asString(); - $this->setError("Cannot open [$file_string] with [$error]"); - return; - } - $this->is_open = true; - $this->block_size = $block_size; - } - - /** - * Writes some data to the socket and saves alocal copy. - * @param string $message String to send to socket. - * @return boolean True if successful. - * @access public - */ - function write($message) { - return true; - } - - /** - * Reads data from the socket. The error suppresion - * is a workaround for PHP4 always throwing a warning - * with a secure socket. - * @return integer/boolean Incoming bytes. False - * on error. - * @access public - */ - function read() { - $raw = @fread($this->handle, $this->block_size); - if ($raw === false) { - $this->setError('Cannot read from socket'); - $this->close(); - } - return $raw; - } - - /** - * Accessor for socket open state. - * @return boolean True if open. - * @access public - */ - function isOpen() { - return $this->is_open; - } - - /** - * Closes the socket preventing further reads. - * Cannot be reopened once closed. - * @return boolean True if successful. - * @access public - */ - function close() { - if (!$this->is_open) return false; - $this->is_open = false; - return fclose($this->handle); - } - - /** - * Accessor for content so far. - * @return string Bytes sent only. - * @access public - */ - function getSent() { - return $this->sent; - } - - /** - * Actually opens the low level socket. - * @param SimpleUrl $file SimpleUrl file target. - * @param string $error Recipient of error message. - * @param integer $timeout Maximum time to wait for connection. - * @access protected - */ - protected function openFile($file, &$error) { - return @fopen($file->asString(), 'r'); - } -} - -/** - * Wrapper for TCP/IP socket. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleSocket extends SimpleStickyError { - private $handle; - private $is_open = false; - private $sent = ''; - private $lock_size; - - /** - * Opens a socket for reading and writing. - * @param string $host Hostname to send request to. - * @param integer $port Port on remote machine to open. - * @param integer $timeout Connection timeout in seconds. - * @param integer $block_size Size of chunk to read. - * @access public - */ - function __construct($host, $port, $timeout, $block_size = 255) { - parent::__construct(); - if (! ($this->handle = $this->openSocket($host, $port, $error_number, $error, $timeout))) { - $this->setError("Cannot open [$host:$port] with [$error] within [$timeout] seconds"); - return; - } - $this->is_open = true; - $this->block_size = $block_size; - SimpleTestCompatibility::setTimeout($this->handle, $timeout); - } - - /** - * Writes some data to the socket and saves alocal copy. - * @param string $message String to send to socket. - * @return boolean True if successful. - * @access public - */ - function write($message) { - if ($this->isError() || ! $this->isOpen()) { - return false; - } - $count = fwrite($this->handle, $message); - if (! $count) { - if ($count === false) { - $this->setError('Cannot write to socket'); - $this->close(); - } - return false; - } - fflush($this->handle); - $this->sent .= $message; - return true; - } - - /** - * Reads data from the socket. The error suppresion - * is a workaround for PHP4 always throwing a warning - * with a secure socket. - * @return integer/boolean Incoming bytes. False - * on error. - * @access public - */ - function read() { - if ($this->isError() || ! $this->isOpen()) { - return false; - } - $raw = @fread($this->handle, $this->block_size); - if ($raw === false) { - $this->setError('Cannot read from socket'); - $this->close(); - } - return $raw; - } - - /** - * Accessor for socket open state. - * @return boolean True if open. - * @access public - */ - function isOpen() { - return $this->is_open; - } - - /** - * Closes the socket preventing further reads. - * Cannot be reopened once closed. - * @return boolean True if successful. - * @access public - */ - function close() { - $this->is_open = false; - return fclose($this->handle); - } - - /** - * Accessor for content so far. - * @return string Bytes sent only. - * @access public - */ - function getSent() { - return $this->sent; - } - - /** - * Actually opens the low level socket. - * @param string $host Host to connect to. - * @param integer $port Port on host. - * @param integer $error_number Recipient of error code. - * @param string $error Recipoent of error message. - * @param integer $timeout Maximum time to wait for connection. - * @access protected - */ - protected function openSocket($host, $port, &$error_number, &$error, $timeout) { - return @fsockopen($host, $port, $error_number, $error, $timeout); - } -} - -/** - * Wrapper for TCP/IP socket over TLS. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleSecureSocket extends SimpleSocket { - - /** - * Opens a secure socket for reading and writing. - * @param string $host Hostname to send request to. - * @param integer $port Port on remote machine to open. - * @param integer $timeout Connection timeout in seconds. - * @access public - */ - function __construct($host, $port, $timeout) { - parent::__construct($host, $port, $timeout); - } - - /** - * Actually opens the low level socket. - * @param string $host Host to connect to. - * @param integer $port Port on host. - * @param integer $error_number Recipient of error code. - * @param string $error Recipient of error message. - * @param integer $timeout Maximum time to wait for connection. - * @access protected - */ - function openSocket($host, $port, &$error_number, &$error, $timeout) { - return parent::openSocket("tls://$host", $port, $error_number, $error, $timeout); - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/tag.php b/3rdparty/simpletest/tag.php deleted file mode 100644 index afe649ec5dd..00000000000 --- a/3rdparty/simpletest/tag.php +++ /dev/null @@ -1,1527 +0,0 @@ - 'SimpleAnchorTag', - 'title' => 'SimpleTitleTag', - 'base' => 'SimpleBaseTag', - 'button' => 'SimpleButtonTag', - 'textarea' => 'SimpleTextAreaTag', - 'option' => 'SimpleOptionTag', - 'label' => 'SimpleLabelTag', - 'form' => 'SimpleFormTag', - 'frame' => 'SimpleFrameTag'); - $attributes = $this->keysToLowerCase($attributes); - if (array_key_exists($name, $map)) { - $tag_class = $map[$name]; - return new $tag_class($attributes); - } elseif ($name == 'select') { - return $this->createSelectionTag($attributes); - } elseif ($name == 'input') { - return $this->createInputTag($attributes); - } - return new SimpleTag($name, $attributes); - } - - /** - * Factory for selection fields. - * @param hash $attributes Element attributes. - * @return SimpleTag Tag object. - * @access protected - */ - protected function createSelectionTag($attributes) { - if (isset($attributes['multiple'])) { - return new MultipleSelectionTag($attributes); - } - return new SimpleSelectionTag($attributes); - } - - /** - * Factory for input tags. - * @param hash $attributes Element attributes. - * @return SimpleTag Tag object. - * @access protected - */ - protected function createInputTag($attributes) { - if (! isset($attributes['type'])) { - return new SimpleTextTag($attributes); - } - $type = strtolower(trim($attributes['type'])); - $map = array( - 'submit' => 'SimpleSubmitTag', - 'image' => 'SimpleImageSubmitTag', - 'checkbox' => 'SimpleCheckboxTag', - 'radio' => 'SimpleRadioButtonTag', - 'text' => 'SimpleTextTag', - 'hidden' => 'SimpleTextTag', - 'password' => 'SimpleTextTag', - 'file' => 'SimpleUploadTag'); - if (array_key_exists($type, $map)) { - $tag_class = $map[$type]; - return new $tag_class($attributes); - } - return false; - } - - /** - * Make the keys lower case for case insensitive look-ups. - * @param hash $map Hash to convert. - * @return hash Unchanged values, but keys lower case. - * @access private - */ - protected function keysToLowerCase($map) { - $lower = array(); - foreach ($map as $key => $value) { - $lower[strtolower($key)] = $value; - } - return $lower; - } -} - -/** - * HTML or XML tag. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleTag { - private $name; - private $attributes; - private $content; - - /** - * Starts with a named tag with attributes only. - * @param string $name Tag name. - * @param hash $attributes Attribute names and - * string values. Note that - * the keys must have been - * converted to lower case. - */ - function __construct($name, $attributes) { - $this->name = strtolower(trim($name)); - $this->attributes = $attributes; - $this->content = ''; - } - - /** - * Check to see if the tag can have both start and - * end tags with content in between. - * @return boolean True if content allowed. - * @access public - */ - function expectEndTag() { - return true; - } - - /** - * The current tag should not swallow all content for - * itself as it's searchable page content. Private - * content tags are usually widgets that contain default - * values. - * @return boolean False as content is available - * to other tags by default. - * @access public - */ - function isPrivateContent() { - return false; - } - - /** - * Appends string content to the current content. - * @param string $content Additional text. - * @access public - */ - function addContent($content) { - $this->content .= (string)$content; - return $this; - } - - /** - * Adds an enclosed tag to the content. - * @param SimpleTag $tag New tag. - * @access public - */ - function addTag($tag) { - } - - /** - * Adds multiple enclosed tags to the content. - * @param array List of SimpleTag objects to be added. - */ - function addTags($tags) { - foreach ($tags as $tag) { - $this->addTag($tag); - } - } - - /** - * Accessor for tag name. - * @return string Name of tag. - * @access public - */ - function getTagName() { - return $this->name; - } - - /** - * List of legal child elements. - * @return array List of element names. - * @access public - */ - function getChildElements() { - return array(); - } - - /** - * Accessor for an attribute. - * @param string $label Attribute name. - * @return string Attribute value. - * @access public - */ - function getAttribute($label) { - $label = strtolower($label); - if (! isset($this->attributes[$label])) { - return false; - } - return (string)$this->attributes[$label]; - } - - /** - * Sets an attribute. - * @param string $label Attribute name. - * @return string $value New attribute value. - * @access protected - */ - protected function setAttribute($label, $value) { - $this->attributes[strtolower($label)] = $value; - } - - /** - * Accessor for the whole content so far. - * @return string Content as big raw string. - * @access public - */ - function getContent() { - return $this->content; - } - - /** - * Accessor for content reduced to visible text. Acts - * like a text mode browser, normalising space and - * reducing images to their alt text. - * @return string Content as plain text. - * @access public - */ - function getText() { - return SimplePage::normalise($this->content); - } - - /** - * Test to see if id attribute matches. - * @param string $id ID to test against. - * @return boolean True on match. - * @access public - */ - function isId($id) { - return ($this->getAttribute('id') == $id); - } -} - -/** - * Base url. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleBaseTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('base', $attributes); - } - - /** - * Base tag is not a block tag. - * @return boolean false - * @access public - */ - function expectEndTag() { - return false; - } -} - -/** - * Page title. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleTitleTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('title', $attributes); - } -} - -/** - * Link. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleAnchorTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('a', $attributes); - } - - /** - * Accessor for URL as string. - * @return string Coerced as string. - * @access public - */ - function getHref() { - $url = $this->getAttribute('href'); - if (is_bool($url)) { - $url = ''; - } - return $url; - } -} - -/** - * Form element. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleWidget extends SimpleTag { - private $value; - private $label; - private $is_set; - - /** - * Starts with a named tag with attributes only. - * @param string $name Tag name. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($name, $attributes) { - parent::__construct($name, $attributes); - $this->value = false; - $this->label = false; - $this->is_set = false; - } - - /** - * Accessor for name submitted as the key in - * GET/POST privateiables hash. - * @return string Parsed value. - * @access public - */ - function getName() { - return $this->getAttribute('name'); - } - - /** - * Accessor for default value parsed with the tag. - * @return string Parsed value. - * @access public - */ - function getDefault() { - return $this->getAttribute('value'); - } - - /** - * Accessor for currently set value or default if - * none. - * @return string Value set by form or default - * if none. - * @access public - */ - function getValue() { - if (! $this->is_set) { - return $this->getDefault(); - } - return $this->value; - } - - /** - * Sets the current form element value. - * @param string $value New value. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - $this->value = $value; - $this->is_set = true; - return true; - } - - /** - * Resets the form element value back to the - * default. - * @access public - */ - function resetValue() { - $this->is_set = false; - } - - /** - * Allows setting of a label externally, say by a - * label tag. - * @param string $label Label to attach. - * @access public - */ - function setLabel($label) { - $this->label = trim($label); - return $this; - } - - /** - * Reads external or internal label. - * @param string $label Label to test. - * @return boolean True is match. - * @access public - */ - function isLabel($label) { - return $this->label == trim($label); - } - - /** - * Dispatches the value into the form encoded packet. - * @param SimpleEncoding $encoding Form packet. - * @access public - */ - function write($encoding) { - if ($this->getName()) { - $encoding->add($this->getName(), $this->getValue()); - } - } -} - -/** - * Text, password and hidden field. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleTextTag extends SimpleWidget { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - if ($this->getAttribute('value') === false) { - $this->setAttribute('value', ''); - } - } - - /** - * Tag contains no content. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * Sets the current form element value. Cannot - * change the value of a hidden field. - * @param string $value New value. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - if ($this->getAttribute('type') == 'hidden') { - return false; - } - return parent::setValue($value); - } -} - -/** - * Submit button as input tag. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleSubmitTag extends SimpleWidget { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - if ($this->getAttribute('value') === false) { - $this->setAttribute('value', 'Submit'); - } - } - - /** - * Tag contains no end element. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * Disables the setting of the button value. - * @param string $value Ignored. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - return false; - } - - /** - * Value of browser visible text. - * @return string Visible label. - * @access public - */ - function getLabel() { - return $this->getValue(); - } - - /** - * Test for a label match when searching. - * @param string $label Label to test. - * @return boolean True on match. - * @access public - */ - function isLabel($label) { - return trim($label) == trim($this->getLabel()); - } -} - -/** - * Image button as input tag. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleImageSubmitTag extends SimpleWidget { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - } - - /** - * Tag contains no end element. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * Disables the setting of the button value. - * @param string $value Ignored. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - return false; - } - - /** - * Value of browser visible text. - * @return string Visible label. - * @access public - */ - function getLabel() { - if ($this->getAttribute('title')) { - return $this->getAttribute('title'); - } - return $this->getAttribute('alt'); - } - - /** - * Test for a label match when searching. - * @param string $label Label to test. - * @return boolean True on match. - * @access public - */ - function isLabel($label) { - return trim($label) == trim($this->getLabel()); - } - - /** - * Dispatches the value into the form encoded packet. - * @param SimpleEncoding $encoding Form packet. - * @param integer $x X coordinate of click. - * @param integer $y Y coordinate of click. - * @access public - */ - function write($encoding, $x = 1, $y = 1) { - if ($this->getName()) { - $encoding->add($this->getName() . '.x', $x); - $encoding->add($this->getName() . '.y', $y); - } else { - $encoding->add('x', $x); - $encoding->add('y', $y); - } - } -} - -/** - * Submit button as button tag. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleButtonTag extends SimpleWidget { - - /** - * Starts with a named tag with attributes only. - * Defaults are very browser dependent. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('button', $attributes); - } - - /** - * Check to see if the tag can have both start and - * end tags with content in between. - * @return boolean True if content allowed. - * @access public - */ - function expectEndTag() { - return true; - } - - /** - * Disables the setting of the button value. - * @param string $value Ignored. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - return false; - } - - /** - * Value of browser visible text. - * @return string Visible label. - * @access public - */ - function getLabel() { - return $this->getContent(); - } - - /** - * Test for a label match when searching. - * @param string $label Label to test. - * @return boolean True on match. - * @access public - */ - function isLabel($label) { - return trim($label) == trim($this->getLabel()); - } -} - -/** - * Content tag for text area. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleTextAreaTag extends SimpleWidget { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('textarea', $attributes); - } - - /** - * Accessor for starting value. - * @return string Parsed value. - * @access public - */ - function getDefault() { - return $this->wrap(html_entity_decode($this->getContent(), ENT_QUOTES)); - } - - /** - * Applies word wrapping if needed. - * @param string $value New value. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - return parent::setValue($this->wrap($value)); - } - - /** - * Test to see if text should be wrapped. - * @return boolean True if wrapping on. - * @access private - */ - function wrapIsEnabled() { - if ($this->getAttribute('cols')) { - $wrap = $this->getAttribute('wrap'); - if (($wrap == 'physical') || ($wrap == 'hard')) { - return true; - } - } - return false; - } - - /** - * Performs the formatting that is peculiar to - * this tag. There is strange behaviour in this - * one, including stripping a leading new line. - * Go figure. I am using Firefox as a guide. - * @param string $text Text to wrap. - * @return string Text wrapped with carriage - * returns and line feeds - * @access private - */ - protected function wrap($text) { - $text = str_replace("\r\r\n", "\r\n", str_replace("\n", "\r\n", $text)); - $text = str_replace("\r\n\n", "\r\n", str_replace("\r", "\r\n", $text)); - if (strncmp($text, "\r\n", strlen("\r\n")) == 0) { - $text = substr($text, strlen("\r\n")); - } - if ($this->wrapIsEnabled()) { - return wordwrap( - $text, - (integer)$this->getAttribute('cols'), - "\r\n"); - } - return $text; - } - - /** - * The content of textarea is not part of the page. - * @return boolean True. - * @access public - */ - function isPrivateContent() { - return true; - } -} - -/** - * File upload widget. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleUploadTag extends SimpleWidget { - - /** - * Starts with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - } - - /** - * Tag contains no content. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * Dispatches the value into the form encoded packet. - * @param SimpleEncoding $encoding Form packet. - * @access public - */ - function write($encoding) { - if (! file_exists($this->getValue())) { - return; - } - $encoding->attach( - $this->getName(), - implode('', file($this->getValue())), - basename($this->getValue())); - } -} - -/** - * Drop down widget. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleSelectionTag extends SimpleWidget { - private $options; - private $choice; - - /** - * Starts with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('select', $attributes); - $this->options = array(); - $this->choice = false; - } - - /** - * Adds an option tag to a selection field. - * @param SimpleOptionTag $tag New option. - * @access public - */ - function addTag($tag) { - if ($tag->getTagName() == 'option') { - $this->options[] = $tag; - } - } - - /** - * Text within the selection element is ignored. - * @param string $content Ignored. - * @access public - */ - function addContent($content) { - return $this; - } - - /** - * Scans options for defaults. If none, then - * the first option is selected. - * @return string Selected field. - * @access public - */ - function getDefault() { - for ($i = 0, $count = count($this->options); $i < $count; $i++) { - if ($this->options[$i]->getAttribute('selected') !== false) { - return $this->options[$i]->getDefault(); - } - } - if ($count > 0) { - return $this->options[0]->getDefault(); - } - return ''; - } - - /** - * Can only set allowed values. - * @param string $value New choice. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - for ($i = 0, $count = count($this->options); $i < $count; $i++) { - if ($this->options[$i]->isValue($value)) { - $this->choice = $i; - return true; - } - } - return false; - } - - /** - * Accessor for current selection value. - * @return string Value attribute or - * content of opton. - * @access public - */ - function getValue() { - if ($this->choice === false) { - return $this->getDefault(); - } - return $this->options[$this->choice]->getValue(); - } -} - -/** - * Drop down widget. - * @package SimpleTest - * @subpackage WebTester - */ -class MultipleSelectionTag extends SimpleWidget { - private $options; - private $values; - - /** - * Starts with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('select', $attributes); - $this->options = array(); - $this->values = false; - } - - /** - * Adds an option tag to a selection field. - * @param SimpleOptionTag $tag New option. - * @access public - */ - function addTag($tag) { - if ($tag->getTagName() == 'option') { - $this->options[] = &$tag; - } - } - - /** - * Text within the selection element is ignored. - * @param string $content Ignored. - * @access public - */ - function addContent($content) { - return $this; - } - - /** - * Scans options for defaults to populate the - * value array(). - * @return array Selected fields. - * @access public - */ - function getDefault() { - $default = array(); - for ($i = 0, $count = count($this->options); $i < $count; $i++) { - if ($this->options[$i]->getAttribute('selected') !== false) { - $default[] = $this->options[$i]->getDefault(); - } - } - return $default; - } - - /** - * Can only set allowed values. Any illegal value - * will result in a failure, but all correct values - * will be set. - * @param array $desired New choices. - * @return boolean True if all allowed. - * @access public - */ - function setValue($desired) { - $achieved = array(); - foreach ($desired as $value) { - $success = false; - for ($i = 0, $count = count($this->options); $i < $count; $i++) { - if ($this->options[$i]->isValue($value)) { - $achieved[] = $this->options[$i]->getValue(); - $success = true; - break; - } - } - if (! $success) { - return false; - } - } - $this->values = $achieved; - return true; - } - - /** - * Accessor for current selection value. - * @return array List of currently set options. - * @access public - */ - function getValue() { - if ($this->values === false) { - return $this->getDefault(); - } - return $this->values; - } -} - -/** - * Option for selection field. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleOptionTag extends SimpleWidget { - - /** - * Stashes the attributes. - */ - function __construct($attributes) { - parent::__construct('option', $attributes); - } - - /** - * Does nothing. - * @param string $value Ignored. - * @return boolean Not allowed. - * @access public - */ - function setValue($value) { - return false; - } - - /** - * Test to see if a value matches the option. - * @param string $compare Value to compare with. - * @return boolean True if possible match. - * @access public - */ - function isValue($compare) { - $compare = trim($compare); - if (trim($this->getValue()) == $compare) { - return true; - } - return trim(strip_tags($this->getContent())) == $compare; - } - - /** - * Accessor for starting value. Will be set to - * the option label if no value exists. - * @return string Parsed value. - * @access public - */ - function getDefault() { - if ($this->getAttribute('value') === false) { - return strip_tags($this->getContent()); - } - return $this->getAttribute('value'); - } - - /** - * The content of options is not part of the page. - * @return boolean True. - * @access public - */ - function isPrivateContent() { - return true; - } -} - -/** - * Radio button. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleRadioButtonTag extends SimpleWidget { - - /** - * Stashes the attributes. - * @param array $attributes Hash of attributes. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - if ($this->getAttribute('value') === false) { - $this->setAttribute('value', 'on'); - } - } - - /** - * Tag contains no content. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * The only allowed value sn the one in the - * "value" attribute. - * @param string $value New value. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - if ($value === false) { - return parent::setValue($value); - } - if ($value != $this->getAttribute('value')) { - return false; - } - return parent::setValue($value); - } - - /** - * Accessor for starting value. - * @return string Parsed value. - * @access public - */ - function getDefault() { - if ($this->getAttribute('checked') !== false) { - return $this->getAttribute('value'); - } - return false; - } -} - -/** - * Checkbox widget. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleCheckboxTag extends SimpleWidget { - - /** - * Starts with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('input', $attributes); - if ($this->getAttribute('value') === false) { - $this->setAttribute('value', 'on'); - } - } - - /** - * Tag contains no content. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } - - /** - * The only allowed value in the one in the - * "value" attribute. The default for this - * attribute is "on". If this widget is set to - * true, then the usual value will be taken. - * @param string $value New value. - * @return boolean True if allowed. - * @access public - */ - function setValue($value) { - if ($value === false) { - return parent::setValue($value); - } - if ($value === true) { - return parent::setValue($this->getAttribute('value')); - } - if ($value != $this->getAttribute('value')) { - return false; - } - return parent::setValue($value); - } - - /** - * Accessor for starting value. The default - * value is "on". - * @return string Parsed value. - * @access public - */ - function getDefault() { - if ($this->getAttribute('checked') !== false) { - return $this->getAttribute('value'); - } - return false; - } -} - -/** - * A group of multiple widgets with some shared behaviour. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleTagGroup { - private $widgets = array(); - - /** - * Adds a tag to the group. - * @param SimpleWidget $widget - * @access public - */ - function addWidget($widget) { - $this->widgets[] = $widget; - } - - /** - * Accessor to widget set. - * @return array All widgets. - * @access protected - */ - protected function &getWidgets() { - return $this->widgets; - } - - /** - * Accessor for an attribute. - * @param string $label Attribute name. - * @return boolean Always false. - * @access public - */ - function getAttribute($label) { - return false; - } - - /** - * Fetches the name for the widget from the first - * member. - * @return string Name of widget. - * @access public - */ - function getName() { - if (count($this->widgets) > 0) { - return $this->widgets[0]->getName(); - } - } - - /** - * Scans the widgets for one with the appropriate - * ID field. - * @param string $id ID value to try. - * @return boolean True if matched. - * @access public - */ - function isId($id) { - for ($i = 0, $count = count($this->widgets); $i < $count; $i++) { - if ($this->widgets[$i]->isId($id)) { - return true; - } - } - return false; - } - - /** - * Scans the widgets for one with the appropriate - * attached label. - * @param string $label Attached label to try. - * @return boolean True if matched. - * @access public - */ - function isLabel($label) { - for ($i = 0, $count = count($this->widgets); $i < $count; $i++) { - if ($this->widgets[$i]->isLabel($label)) { - return true; - } - } - return false; - } - - /** - * Dispatches the value into the form encoded packet. - * @param SimpleEncoding $encoding Form packet. - * @access public - */ - function write($encoding) { - $encoding->add($this->getName(), $this->getValue()); - } -} - -/** - * A group of tags with the same name within a form. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleCheckboxGroup extends SimpleTagGroup { - - /** - * Accessor for current selected widget or false - * if none. - * @return string/array Widget values or false if none. - * @access public - */ - function getValue() { - $values = array(); - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if ($widgets[$i]->getValue() !== false) { - $values[] = $widgets[$i]->getValue(); - } - } - return $this->coerceValues($values); - } - - /** - * Accessor for starting value that is active. - * @return string/array Widget values or false if none. - * @access public - */ - function getDefault() { - $values = array(); - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if ($widgets[$i]->getDefault() !== false) { - $values[] = $widgets[$i]->getDefault(); - } - } - return $this->coerceValues($values); - } - - /** - * Accessor for current set values. - * @param string/array/boolean $values Either a single string, a - * hash or false for nothing set. - * @return boolean True if all values can be set. - * @access public - */ - function setValue($values) { - $values = $this->makeArray($values); - if (! $this->valuesArePossible($values)) { - return false; - } - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - $possible = $widgets[$i]->getAttribute('value'); - if (in_array($widgets[$i]->getAttribute('value'), $values)) { - $widgets[$i]->setValue($possible); - } else { - $widgets[$i]->setValue(false); - } - } - return true; - } - - /** - * Tests to see if a possible value set is legal. - * @param string/array/boolean $values Either a single string, a - * hash or false for nothing set. - * @return boolean False if trying to set a - * missing value. - * @access private - */ - protected function valuesArePossible($values) { - $matches = array(); - $widgets = &$this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - $possible = $widgets[$i]->getAttribute('value'); - if (in_array($possible, $values)) { - $matches[] = $possible; - } - } - return ($values == $matches); - } - - /** - * Converts the output to an appropriate format. This means - * that no values is false, a single value is just that - * value and only two or more are contained in an array. - * @param array $values List of values of widgets. - * @return string/array/boolean Expected format for a tag. - * @access private - */ - protected function coerceValues($values) { - if (count($values) == 0) { - return false; - } elseif (count($values) == 1) { - return $values[0]; - } else { - return $values; - } - } - - /** - * Converts false or string into array. The opposite of - * the coercian method. - * @param string/array/boolean $value A single item is converted - * to a one item list. False - * gives an empty list. - * @return array List of values, possibly empty. - * @access private - */ - protected function makeArray($value) { - if ($value === false) { - return array(); - } - if (is_string($value)) { - return array($value); - } - return $value; - } -} - -/** - * A group of tags with the same name within a form. - * Used for radio buttons. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleRadioGroup extends SimpleTagGroup { - - /** - * Each tag is tried in turn until one is - * successfully set. The others will be - * unchecked if successful. - * @param string $value New value. - * @return boolean True if any allowed. - * @access public - */ - function setValue($value) { - if (! $this->valueIsPossible($value)) { - return false; - } - $index = false; - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if (! $widgets[$i]->setValue($value)) { - $widgets[$i]->setValue(false); - } - } - return true; - } - - /** - * Tests to see if a value is allowed. - * @param string Attempted value. - * @return boolean True if a valid value. - * @access private - */ - protected function valueIsPossible($value) { - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if ($widgets[$i]->getAttribute('value') == $value) { - return true; - } - } - return false; - } - - /** - * Accessor for current selected widget or false - * if none. - * @return string/boolean Value attribute or - * content of opton. - * @access public - */ - function getValue() { - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if ($widgets[$i]->getValue() !== false) { - return $widgets[$i]->getValue(); - } - } - return false; - } - - /** - * Accessor for starting value that is active. - * @return string/boolean Value of first checked - * widget or false if none. - * @access public - */ - function getDefault() { - $widgets = $this->getWidgets(); - for ($i = 0, $count = count($widgets); $i < $count; $i++) { - if ($widgets[$i]->getDefault() !== false) { - return $widgets[$i]->getDefault(); - } - } - return false; - } -} - -/** - * Tag to keep track of labels. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleLabelTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('label', $attributes); - } - - /** - * Access for the ID to attach the label to. - * @return string For attribute. - * @access public - */ - function getFor() { - return $this->getAttribute('for'); - } -} - -/** - * Tag to aid parsing the form. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleFormTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('form', $attributes); - } -} - -/** - * Tag to aid parsing the frames in a page. - * @package SimpleTest - * @subpackage WebTester - */ -class SimpleFrameTag extends SimpleTag { - - /** - * Starts with a named tag with attributes only. - * @param hash $attributes Attribute names and - * string values. - */ - function __construct($attributes) { - parent::__construct('frame', $attributes); - } - - /** - * Tag contains no content. - * @return boolean False. - * @access public - */ - function expectEndTag() { - return false; - } -} -?> \ No newline at end of file diff --git a/3rdparty/simpletest/test_case.php b/3rdparty/simpletest/test_case.php deleted file mode 100644 index ba023c3b2ea..00000000000 --- a/3rdparty/simpletest/test_case.php +++ /dev/null @@ -1,658 +0,0 @@ -label = $label; - } - } - - /** - * Accessor for the test name for subclasses. - * @return string Name of the test. - * @access public - */ - function getLabel() { - return $this->label ? $this->label : get_class($this); - } - - /** - * This is a placeholder for skipping tests. In this - * method you place skipIf() and skipUnless() calls to - * set the skipping state. - * @access public - */ - function skip() { - } - - /** - * Will issue a message to the reporter and tell the test - * case to skip if the incoming flag is true. - * @param string $should_skip Condition causing the tests to be skipped. - * @param string $message Text of skip condition. - * @access public - */ - function skipIf($should_skip, $message = '%s') { - if ($should_skip && ! $this->should_skip) { - $this->should_skip = true; - $message = sprintf($message, 'Skipping [' . get_class($this) . ']'); - $this->reporter->paintSkip($message . $this->getAssertionLine()); - } - } - - /** - * Accessor for the private variable $_shoud_skip - * @access public - */ - function shouldSkip() { - return $this->should_skip; - } - - /** - * Will issue a message to the reporter and tell the test - * case to skip if the incoming flag is false. - * @param string $shouldnt_skip Condition causing the tests to be run. - * @param string $message Text of skip condition. - * @access public - */ - function skipUnless($shouldnt_skip, $message = false) { - $this->skipIf(! $shouldnt_skip, $message); - } - - /** - * Used to invoke the single tests. - * @return SimpleInvoker Individual test runner. - * @access public - */ - function createInvoker() { - return new SimpleErrorTrappingInvoker( - new SimpleExceptionTrappingInvoker(new SimpleInvoker($this))); - } - - /** - * Uses reflection to run every method within itself - * starting with the string "test" unless a method - * is specified. - * @param SimpleReporter $reporter Current test reporter. - * @return boolean True if all tests passed. - * @access public - */ - function run($reporter) { - $context = SimpleTest::getContext(); - $context->setTest($this); - $context->setReporter($reporter); - $this->reporter = $reporter; - $started = false; - foreach ($this->getTests() as $method) { - if ($reporter->shouldInvoke($this->getLabel(), $method)) { - $this->skip(); - if ($this->should_skip) { - break; - } - if (! $started) { - $reporter->paintCaseStart($this->getLabel()); - $started = true; - } - $invoker = $this->reporter->createInvoker($this->createInvoker()); - $invoker->before($method); - $invoker->invoke($method); - $invoker->after($method); - } - } - if ($started) { - $reporter->paintCaseEnd($this->getLabel()); - } - unset($this->reporter); - $context->setTest(null); - return $reporter->getStatus(); - } - - /** - * Gets a list of test names. Normally that will - * be all internal methods that start with the - * name "test". This method should be overridden - * if you want a different rule. - * @return array List of test names. - * @access public - */ - function getTests() { - $methods = array(); - foreach (get_class_methods(get_class($this)) as $method) { - if ($this->isTest($method)) { - $methods[] = $method; - } - } - return $methods; - } - - /** - * Tests to see if the method is a test that should - * be run. Currently any method that starts with 'test' - * is a candidate unless it is the constructor. - * @param string $method Method name to try. - * @return boolean True if test method. - * @access protected - */ - protected function isTest($method) { - if (strtolower(substr($method, 0, 4)) == 'test') { - return ! SimpleTestCompatibility::isA($this, strtolower($method)); - } - return false; - } - - /** - * Announces the start of the test. - * @param string $method Test method just started. - * @access public - */ - function before($method) { - $this->reporter->paintMethodStart($method); - $this->observers = array(); - } - - /** - * Sets up unit test wide variables at the start - * of each test method. To be overridden in - * actual user test cases. - * @access public - */ - function setUp() { - } - - /** - * Clears the data set in the setUp() method call. - * To be overridden by the user in actual user test cases. - * @access public - */ - function tearDown() { - } - - /** - * Announces the end of the test. Includes private clean up. - * @param string $method Test method just finished. - * @access public - */ - function after($method) { - for ($i = 0; $i < count($this->observers); $i++) { - $this->observers[$i]->atTestEnd($method, $this); - } - $this->reporter->paintMethodEnd($method); - } - - /** - * Sets up an observer for the test end. - * @param object $observer Must have atTestEnd() - * method. - * @access public - */ - function tell($observer) { - $this->observers[] = &$observer; - } - - /** - * @deprecated - */ - function pass($message = "Pass") { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintPass( - $message . $this->getAssertionLine()); - return true; - } - - /** - * Sends a fail event with a message. - * @param string $message Message to send. - * @access public - */ - function fail($message = "Fail") { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintFail( - $message . $this->getAssertionLine()); - return false; - } - - /** - * Formats a PHP error and dispatches it to the - * reporter. - * @param integer $severity PHP error code. - * @param string $message Text of error. - * @param string $file File error occoured in. - * @param integer $line Line number of error. - * @access public - */ - function error($severity, $message, $file, $line) { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintError( - "Unexpected PHP error [$message] severity [$severity] in [$file line $line]"); - } - - /** - * Formats an exception and dispatches it to the - * reporter. - * @param Exception $exception Object thrown. - * @access public - */ - function exception($exception) { - $this->reporter->paintException($exception); - } - - /** - * For user defined expansion of the available messages. - * @param string $type Tag for sorting the signals. - * @param mixed $payload Extra user specific information. - */ - function signal($type, $payload) { - if (! isset($this->reporter)) { - trigger_error('Can only make assertions within test methods'); - } - $this->reporter->paintSignal($type, $payload); - } - - /** - * Runs an expectation directly, for extending the - * tests with new expectation classes. - * @param SimpleExpectation $expectation Expectation subclass. - * @param mixed $compare Value to compare. - * @param string $message Message to display. - * @return boolean True on pass - * @access public - */ - function assert($expectation, $compare, $message = '%s') { - if ($expectation->test($compare)) { - return $this->pass(sprintf( - $message, - $expectation->overlayMessage($compare, $this->reporter->getDumper()))); - } else { - return $this->fail(sprintf( - $message, - $expectation->overlayMessage($compare, $this->reporter->getDumper()))); - } - } - - /** - * Uses a stack trace to find the line of an assertion. - * @return string Line number of first assert* - * method embedded in format string. - * @access public - */ - function getAssertionLine() { - $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip')); - return $trace->traceMethod(); - } - - /** - * Sends a formatted dump of a variable to the - * test suite for those emergency debugging - * situations. - * @param mixed $variable Variable to display. - * @param string $message Message to display. - * @return mixed The original variable. - * @access public - */ - function dump($variable, $message = false) { - $dumper = $this->reporter->getDumper(); - $formatted = $dumper->dump($variable); - if ($message) { - $formatted = $message . "\n" . $formatted; - } - $this->reporter->paintFormattedMessage($formatted); - return $variable; - } - - /** - * Accessor for the number of subtests including myelf. - * @return integer Number of test cases. - * @access public - */ - function getSize() { - return 1; - } -} - -/** - * Helps to extract test cases automatically from a file. - * @package SimpleTest - * @subpackage UnitTester - */ -class SimpleFileLoader { - - /** - * Builds a test suite from a library of test cases. - * The new suite is composed into this one. - * @param string $test_file File name of library with - * test case classes. - * @return TestSuite The new test suite. - * @access public - */ - function load($test_file) { - $existing_classes = get_declared_classes(); - $existing_globals = get_defined_vars(); - include_once($test_file); - $new_globals = get_defined_vars(); - $this->makeFileVariablesGlobal($existing_globals, $new_globals); - $new_classes = array_diff(get_declared_classes(), $existing_classes); - if (empty($new_classes)) { - $new_classes = $this->scrapeClassesFromFile($test_file); - } - $classes = $this->selectRunnableTests($new_classes); - return $this->createSuiteFromClasses($test_file, $classes); - } - - /** - * Imports new variables into the global namespace. - * @param hash $existing Variables before the file was loaded. - * @param hash $new Variables after the file was loaded. - * @access private - */ - protected function makeFileVariablesGlobal($existing, $new) { - $globals = array_diff(array_keys($new), array_keys($existing)); - foreach ($globals as $global) { - $GLOBALS[$global] = $new[$global]; - } - } - - /** - * Lookup classnames from file contents, in case the - * file may have been included before. - * Note: This is probably too clever by half. Figuring this - * out after a failed test case is going to be tricky for us, - * never mind the user. A test case should not be included - * twice anyway. - * @param string $test_file File name with classes. - * @access private - */ - protected function scrapeClassesFromFile($test_file) { - preg_match_all('~^\s*class\s+(\w+)(\s+(extends|implements)\s+\w+)*\s*\{~mi', - file_get_contents($test_file), - $matches ); - return $matches[1]; - } - - /** - * Calculates the incoming test cases. Skips abstract - * and ignored classes. - * @param array $candidates Candidate classes. - * @return array New classes which are test - * cases that shouldn't be ignored. - * @access public - */ - function selectRunnableTests($candidates) { - $classes = array(); - foreach ($candidates as $class) { - if (TestSuite::getBaseTestCase($class)) { - $reflection = new SimpleReflection($class); - if ($reflection->isAbstract()) { - SimpleTest::ignore($class); - } else { - $classes[] = $class; - } - } - } - return $classes; - } - - /** - * Builds a test suite from a class list. - * @param string $title Title of new group. - * @param array $classes Test classes. - * @return TestSuite Group loaded with the new - * test cases. - * @access public - */ - function createSuiteFromClasses($title, $classes) { - if (count($classes) == 0) { - $suite = new BadTestSuite($title, "No runnable test cases in [$title]"); - return $suite; - } - SimpleTest::ignoreParentsIfIgnored($classes); - $suite = new TestSuite($title); - foreach ($classes as $class) { - if (! SimpleTest::isIgnored($class)) { - $suite->add($class); - } - } - return $suite; - } -} - -/** - * This is a composite test class for combining - * test cases and other RunnableTest classes into - * a group test. - * @package SimpleTest - * @subpackage UnitTester - */ -class TestSuite { - private $label; - private $test_cases; - - /** - * Sets the name of the test suite. - * @param string $label Name sent at the start and end - * of the test. - * @access public - */ - function TestSuite($label = false) { - $this->label = $label; - $this->test_cases = array(); - } - - /** - * Accessor for the test name for subclasses. If the suite - * wraps a single test case the label defaults to the name of that test. - * @return string Name of the test. - * @access public - */ - function getLabel() { - if (! $this->label) { - return ($this->getSize() == 1) ? - get_class($this->test_cases[0]) : get_class($this); - } else { - return $this->label; - } - } - - /** - * Adds a test into the suite by instance or class. The class will - * be instantiated if it's a test suite. - * @param SimpleTestCase $test_case Suite or individual test - * case implementing the - * runnable test interface. - * @access public - */ - function add($test_case) { - if (! is_string($test_case)) { - $this->test_cases[] = $test_case; - } elseif (TestSuite::getBaseTestCase($test_case) == 'testsuite') { - $this->test_cases[] = new $test_case(); - } else { - $this->test_cases[] = $test_case; - } - } - - /** - * Builds a test suite from a library of test cases. - * The new suite is composed into this one. - * @param string $test_file File name of library with - * test case classes. - * @access public - */ - function addFile($test_file) { - $extractor = new SimpleFileLoader(); - $this->add($extractor->load($test_file)); - } - - /** - * Delegates to a visiting collector to add test - * files. - * @param string $path Path to scan from. - * @param SimpleCollector $collector Directory scanner. - * @access public - */ - function collect($path, $collector) { - $collector->collect($this, $path); - } - - /** - * Invokes run() on all of the held test cases, instantiating - * them if necessary. - * @param SimpleReporter $reporter Current test reporter. - * @access public - */ - function run($reporter) { - $reporter->paintGroupStart($this->getLabel(), $this->getSize()); - for ($i = 0, $count = count($this->test_cases); $i < $count; $i++) { - if (is_string($this->test_cases[$i])) { - $class = $this->test_cases[$i]; - $test = new $class(); - $test->run($reporter); - unset($test); - } else { - $this->test_cases[$i]->run($reporter); - } - } - $reporter->paintGroupEnd($this->getLabel()); - return $reporter->getStatus(); - } - - /** - * Number of contained test cases. - * @return integer Total count of cases in the group. - * @access public - */ - function getSize() { - $count = 0; - foreach ($this->test_cases as $case) { - if (is_string($case)) { - if (! SimpleTest::isIgnored($case)) { - $count++; - } - } else { - $count += $case->getSize(); - } - } - return $count; - } - - /** - * Test to see if a class is derived from the - * SimpleTestCase class. - * @param string $class Class name. - * @access public - */ - static function getBaseTestCase($class) { - while ($class = get_parent_class($class)) { - $class = strtolower($class); - if ($class == 'simpletestcase' || $class == 'testsuite') { - return $class; - } - } - return false; - } -} - -/** - * This is a failing group test for when a test suite hasn't - * loaded properly. - * @package SimpleTest - * @subpackage UnitTester - */ -class BadTestSuite { - private $label; - private $error; - - /** - * Sets the name of the test suite and error message. - * @param string $label Name sent at the start and end - * of the test. - * @access public - */ - function BadTestSuite($label, $error) { - $this->label = $label; - $this->error = $error; - } - - /** - * Accessor for the test name for subclasses. - * @return string Name of the test. - * @access public - */ - function getLabel() { - return $this->label; - } - - /** - * Sends a single error to the reporter. - * @param SimpleReporter $reporter Current test reporter. - * @access public - */ - function run($reporter) { - $reporter->paintGroupStart($this->getLabel(), $this->getSize()); - $reporter->paintFail('Bad TestSuite [' . $this->getLabel() . - '] with error [' . $this->error . ']'); - $reporter->paintGroupEnd($this->getLabel()); - return $reporter->getStatus(); - } - - /** - * Number of contained test cases. Always zero. - * @return integer Total count of cases in the group. - * @access public - */ - function getSize() { - return 0; - } -} -?> diff --git a/3rdparty/simpletest/tidy_parser.php b/3rdparty/simpletest/tidy_parser.php deleted file mode 100644 index 3d8b4b2ac7d..00000000000 --- a/3rdparty/simpletest/tidy_parser.php +++ /dev/null @@ -1,382 +0,0 @@ -free(); - } - - /** - * Frees up any references so as to allow the PHP garbage - * collection from unset() to work. - */ - private function free() { - unset($this->page); - $this->forms = array(); - $this->labels = array(); - } - - /** - * This builder is only available if the 'tidy' extension is loaded. - * @return boolean True if available. - */ - function can() { - return extension_loaded('tidy'); - } - - /** - * Reads the raw content the page using HTML Tidy. - * @param $response SimpleHttpResponse Fetched response. - * @return SimplePage Newly parsed page. - */ - function parse($response) { - $this->page = new SimplePage($response); - $tidied = tidy_parse_string($input = $this->insertGuards($response->getContent()), - array('output-xml' => false, 'wrap' => '0', 'indent' => 'no'), - 'latin1'); - $this->walkTree($tidied->html()); - $this->attachLabels($this->widgets_by_id, $this->labels); - $this->page->setForms($this->forms); - $page = $this->page; - $this->free(); - return $page; - } - - /** - * Stops HTMLTidy stripping content that we wish to preserve. - * @param string The raw html. - * @return string The html with guard tags inserted. - */ - private function insertGuards($html) { - return $this->insertEmptyTagGuards($this->insertTextareaSimpleWhitespaceGuards($html)); - } - - /** - * Removes the extra content added during the parse stage - * in order to preserve content we don't want stripped - * out by HTMLTidy. - * @param string The raw html. - * @return string The html with guard tags removed. - */ - private function stripGuards($html) { - return $this->stripTextareaWhitespaceGuards($this->stripEmptyTagGuards($html)); - } - - /** - * HTML tidy strips out empty tags such as