summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files/ajax/rawlist.php6
-rw-r--r--apps/files/appinfo/remote.php1
-rw-r--r--apps/files/js/files.js6
-rw-r--r--apps/files/l10n/ca.php5
-rw-r--r--apps/files/l10n/cs_CZ.php1
-rw-r--r--apps/files/l10n/el.php1
-rw-r--r--apps/files/l10n/en_GB.php7
-rw-r--r--apps/files/l10n/fr.php5
-rw-r--r--apps/files/l10n/gl.php5
-rw-r--r--apps/files/l10n/hu_HU.php13
-rw-r--r--apps/files/l10n/it.php6
-rw-r--r--apps/files/l10n/ja_JP.php5
-rw-r--r--apps/files/l10n/ko.php17
-rw-r--r--apps/files/l10n/lt_LT.php5
-rw-r--r--apps/files/l10n/nn_NO.php5
-rw-r--r--apps/files/l10n/pl.php5
-rw-r--r--apps/files/l10n/uk.php5
-rw-r--r--apps/files/lib/helper.php6
-rw-r--r--apps/files/templates/index.php2
-rw-r--r--apps/files_encryption/appinfo/info.xml1
-rw-r--r--apps/files_encryption/l10n/uk.php1
-rwxr-xr-xapps/files_encryption/lib/keymanager.php5
-rw-r--r--apps/files_encryption/lib/proxy.php7
-rw-r--r--apps/files_sharing/l10n/ko.php7
-rw-r--r--apps/files_sharing/lib/cache.php78
-rw-r--r--apps/files_sharing/public.php2
-rw-r--r--apps/files_trashbin/l10n/hu_HU.php4
-rw-r--r--apps/files_trashbin/l10n/ko.php14
-rw-r--r--apps/files_trashbin/lib/helper.php2
-rw-r--r--apps/files_versions/l10n/ko.php3
-rw-r--r--apps/user_ldap/l10n/hu_HU.php9
-rw-r--r--apps/user_webdavauth/l10n/hu_HU.php4
-rwxr-xr-xautotest.sh7
-rw-r--r--core/avatar/controller.php2
-rw-r--r--core/css/apps.css3
-rw-r--r--core/js/jquery.avatar.js6
-rw-r--r--core/js/placeholder.js15
-rw-r--r--core/js/share.js4
-rw-r--r--core/l10n/cs_CZ.php3
-rw-r--r--core/l10n/da.php2
-rw-r--r--core/l10n/en_GB.php9
-rw-r--r--core/l10n/fr.php11
-rw-r--r--core/l10n/gl.php9
-rw-r--r--core/l10n/hu_HU.php21
-rw-r--r--core/l10n/it.php10
-rw-r--r--core/l10n/ja_JP.php10
-rw-r--r--core/l10n/lt_LT.php9
-rw-r--r--core/l10n/nn_NO.php16
-rw-r--r--core/l10n/pl.php8
-rw-r--r--core/l10n/sv.php16
-rw-r--r--core/templates/login.php3
-rw-r--r--cron.php2
-rwxr-xr-xindex.php2
-rw-r--r--l10n/ca/files.po18
-rw-r--r--l10n/cs_CZ/core.po27
-rw-r--r--l10n/cs_CZ/files.po11
-rw-r--r--l10n/da/core.po22
-rw-r--r--l10n/da/lib.po18
-rw-r--r--l10n/da/settings.po36
-rw-r--r--l10n/el/files.po11
-rw-r--r--l10n/en_GB/core.po38
-rw-r--r--l10n/en_GB/files.po20
-rw-r--r--l10n/fr/core.po42
-rw-r--r--l10n/fr/files.po18
-rw-r--r--l10n/fr/settings.po30
-rw-r--r--l10n/gl/core.po38
-rw-r--r--l10n/gl/files.po18
-rw-r--r--l10n/hu_HU/core.po62
-rw-r--r--l10n/hu_HU/files.po34
-rw-r--r--l10n/hu_HU/files_trashbin.po30
-rw-r--r--l10n/hu_HU/lib.po52
-rw-r--r--l10n/hu_HU/settings.po68
-rw-r--r--l10n/hu_HU/user_ldap.po24
-rw-r--r--l10n/hu_HU/user_webdavauth.po10
-rw-r--r--l10n/it/core.po30
-rw-r--r--l10n/it/files.po12
-rw-r--r--l10n/it/settings.po30
-rw-r--r--l10n/ja_JP/core.po38
-rw-r--r--l10n/ja_JP/files.po18
-rw-r--r--l10n/ja_JP/settings.po48
-rw-r--r--l10n/ko/files.po37
-rw-r--r--l10n/ko/files_sharing.po21
-rw-r--r--l10n/ko/files_trashbin.po49
-rw-r--r--l10n/ko/files_versions.po15
-rw-r--r--l10n/ko/lib.po46
-rw-r--r--l10n/lt_LT/core.po40
-rw-r--r--l10n/lt_LT/files.po18
-rw-r--r--l10n/lt_LT/settings.po42
-rw-r--r--l10n/nn_NO/core.po52
-rw-r--r--l10n/nn_NO/files.po19
-rw-r--r--l10n/nn_NO/lib.po14
-rw-r--r--l10n/nn_NO/settings.po52
-rw-r--r--l10n/pl/core.po38
-rw-r--r--l10n/pl/files.po18
-rw-r--r--l10n/pl/lib.po44
-rw-r--r--l10n/pl/settings.po44
-rw-r--r--l10n/sv/core.po53
-rw-r--r--l10n/sv/settings.po57
-rw-r--r--l10n/templates/core.pot16
-rw-r--r--l10n/templates/files.pot2
-rw-r--r--l10n/templates/files_encryption.pot2
-rw-r--r--l10n/templates/files_external.pot2
-rw-r--r--l10n/templates/files_sharing.pot2
-rw-r--r--l10n/templates/files_trashbin.pot2
-rw-r--r--l10n/templates/files_versions.pot2
-rw-r--r--l10n/templates/lib.pot28
-rw-r--r--l10n/templates/settings.pot26
-rw-r--r--l10n/templates/user_ldap.pot2
-rw-r--r--l10n/templates/user_webdavauth.pot2
-rw-r--r--l10n/uk/files.po18
-rw-r--r--l10n/uk/files_encryption.po6
-rw-r--r--l10n/uk/settings.po35
-rw-r--r--lib/autoloader.php12
-rw-r--r--lib/base.php17
-rw-r--r--lib/cache/fileglobalgc.php8
-rw-r--r--lib/private/allconfig.php77
-rw-r--r--lib/private/api.php (renamed from lib/api.php)0
-rw-r--r--lib/private/app.php (renamed from lib/app.php)31
-rw-r--r--lib/private/appconfig.php (renamed from lib/appconfig.php)0
-rw-r--r--lib/private/appframework/app.php98
-rw-r--r--lib/private/appframework/controller/controller.php142
-rw-r--r--lib/private/appframework/core/api.php348
-rw-r--r--lib/private/appframework/dependencyinjection/dicontainer.php146
-rw-r--r--lib/private/appframework/http/dispatcher.php100
-rw-r--r--lib/private/appframework/http/downloadresponse.php50
-rw-r--r--lib/private/appframework/http/http.php148
-rw-r--r--lib/private/appframework/http/redirectresponse.php56
-rw-r--r--lib/private/appframework/http/request.php307
-rw-r--r--lib/private/appframework/middleware/middleware.php100
-rw-r--r--lib/private/appframework/middleware/middlewaredispatcher.php159
-rw-r--r--lib/private/appframework/middleware/security/securityexception.php41
-rw-r--r--lib/private/appframework/middleware/security/securitymiddleware.php136
-rw-r--r--lib/private/appframework/routing/routeactionhandler.php42
-rw-r--r--lib/private/appframework/routing/routeconfig.php186
-rw-r--r--lib/private/appframework/utility/methodannotationreader.php61
-rw-r--r--lib/private/appframework/utility/simplecontainer.php44
-rw-r--r--lib/private/appframework/utility/timefactory.php42
-rw-r--r--lib/private/archive.php (renamed from lib/archive.php)0
-rw-r--r--lib/private/archive/tar.php (renamed from lib/archive/tar.php)0
-rw-r--r--lib/private/archive/zip.php (renamed from lib/archive/zip.php)0
-rw-r--r--lib/private/arrayparser.php (renamed from lib/arrayparser.php)0
-rw-r--r--lib/private/avatar.php (renamed from lib/avatar.php)0
-rw-r--r--lib/private/backgroundjob.php (renamed from lib/backgroundjob.php)0
-rw-r--r--lib/private/backgroundjob/job.php (renamed from lib/backgroundjob/job.php)0
-rw-r--r--lib/private/backgroundjob/joblist.php (renamed from lib/backgroundjob/joblist.php)0
-rw-r--r--lib/private/backgroundjob/legacy/queuedjob.php (renamed from lib/backgroundjob/legacy/queuedjob.php)0
-rw-r--r--lib/private/backgroundjob/legacy/regularjob.php (renamed from lib/backgroundjob/legacy/regularjob.php)0
-rw-r--r--lib/private/backgroundjob/queuedjob.php (renamed from lib/backgroundjob/queuedjob.php)0
-rw-r--r--lib/private/backgroundjob/timedjob.php (renamed from lib/backgroundjob/timedjob.php)0
-rw-r--r--lib/private/cache.php (renamed from lib/cache.php)23
-rw-r--r--lib/private/cache/broker.php (renamed from lib/cache/broker.php)12
-rw-r--r--lib/private/cache/file.php (renamed from lib/cache/file.php)13
-rw-r--r--lib/private/cache/fileglobal.php (renamed from lib/cache/fileglobal.php)9
-rw-r--r--lib/private/cache/fileglobalgc.php9
-rw-r--r--lib/private/cache/usercache.php77
-rw-r--r--lib/private/config.php (renamed from lib/config.php)0
-rw-r--r--lib/private/connector/sabre/ServiceUnavailable.php (renamed from lib/connector/sabre/ServiceUnavailable.php)0
-rw-r--r--lib/private/connector/sabre/aborteduploaddetectionplugin.php101
-rw-r--r--lib/private/connector/sabre/auth.php (renamed from lib/connector/sabre/auth.php)0
-rw-r--r--lib/private/connector/sabre/directory.php (renamed from lib/connector/sabre/directory.php)21
-rw-r--r--lib/private/connector/sabre/file.php (renamed from lib/connector/sabre/file.php)9
-rw-r--r--lib/private/connector/sabre/locks.php (renamed from lib/connector/sabre/locks.php)0
-rw-r--r--lib/private/connector/sabre/maintenanceplugin.php (renamed from lib/connector/sabre/maintenanceplugin.php)0
-rw-r--r--lib/private/connector/sabre/node.php (renamed from lib/connector/sabre/node.php)11
-rw-r--r--lib/private/connector/sabre/objecttree.php (renamed from lib/connector/sabre/objecttree.php)44
-rw-r--r--lib/private/connector/sabre/principal.php (renamed from lib/connector/sabre/principal.php)0
-rw-r--r--lib/private/connector/sabre/quotaplugin.php (renamed from lib/connector/sabre/quotaplugin.php)0
-rw-r--r--lib/private/connector/sabre/request.php (renamed from lib/connector/sabre/request.php)0
-rw-r--r--lib/private/contactsmanager.php145
-rw-r--r--lib/private/db.php (renamed from lib/db.php)0
-rw-r--r--lib/private/db/adapter.php (renamed from lib/db/adapter.php)0
-rw-r--r--lib/private/db/adapteroci8.php (renamed from lib/db/adapteroci8.php)0
-rw-r--r--lib/private/db/adapterpgsql.php (renamed from lib/db/adapterpgsql.php)0
-rw-r--r--lib/private/db/adaptersqlite.php (renamed from lib/db/adaptersqlite.php)0
-rw-r--r--lib/private/db/adaptersqlsrv.php (renamed from lib/db/adaptersqlsrv.php)0
-rw-r--r--lib/private/db/connection.php (renamed from lib/db/connection.php)2
-rw-r--r--lib/private/db/mdb2schemamanager.php (renamed from lib/db/mdb2schemamanager.php)0
-rw-r--r--lib/private/db/mdb2schemareader.php (renamed from lib/db/mdb2schemareader.php)0
-rw-r--r--lib/private/db/mdb2schemawriter.php (renamed from lib/db/mdb2schemawriter.php)0
-rw-r--r--lib/private/db/oracleconnection.php (renamed from lib/db/oracleconnection.php)0
-rw-r--r--lib/private/db/statementwrapper.php (renamed from lib/db/statementwrapper.php)0
-rw-r--r--lib/private/defaults.php (renamed from lib/defaults.php)0
-rw-r--r--lib/private/eventsource.php (renamed from lib/eventsource.php)0
-rw-r--r--lib/private/filechunking.php (renamed from lib/filechunking.php)2
-rw-r--r--lib/private/fileproxy.php (renamed from lib/fileproxy.php)0
-rw-r--r--lib/private/fileproxy/fileoperations.php (renamed from lib/fileproxy/fileoperations.php)0
-rw-r--r--lib/private/files.php (renamed from lib/files.php)0
-rw-r--r--lib/private/files/cache/backgroundwatcher.php (renamed from lib/files/cache/backgroundwatcher.php)0
-rw-r--r--lib/private/files/cache/cache.php (renamed from lib/files/cache/cache.php)4
-rw-r--r--lib/private/files/cache/legacy.php (renamed from lib/files/cache/legacy.php)0
-rw-r--r--lib/private/files/cache/permissions.php (renamed from lib/files/cache/permissions.php)0
-rw-r--r--lib/private/files/cache/scanner.php (renamed from lib/files/cache/scanner.php)50
-rw-r--r--lib/private/files/cache/storage.php (renamed from lib/files/cache/storage.php)0
-rw-r--r--lib/private/files/cache/updater.php (renamed from lib/files/cache/updater.php)0
-rw-r--r--lib/private/files/cache/upgrade.php (renamed from lib/files/cache/upgrade.php)0
-rw-r--r--lib/private/files/cache/watcher.php (renamed from lib/files/cache/watcher.php)0
-rw-r--r--lib/private/files/filesystem.php (renamed from lib/files/filesystem.php)0
-rw-r--r--lib/private/files/mapper.php (renamed from lib/files/mapper.php)0
-rw-r--r--lib/private/files/mount/manager.php (renamed from lib/files/mount/manager.php)0
-rw-r--r--lib/private/files/mount/mount.php (renamed from lib/files/mount/mount.php)0
-rw-r--r--lib/private/files/node/file.php (renamed from lib/files/node/file.php)0
-rw-r--r--lib/private/files/node/folder.php (renamed from lib/files/node/folder.php)0
-rw-r--r--lib/private/files/node/node.php (renamed from lib/files/node/node.php)0
-rw-r--r--lib/private/files/node/nonexistingfile.php (renamed from lib/files/node/nonexistingfile.php)0
-rw-r--r--lib/private/files/node/nonexistingfolder.php (renamed from lib/files/node/nonexistingfolder.php)0
-rw-r--r--lib/private/files/node/root.php (renamed from lib/files/node/root.php)0
-rw-r--r--lib/private/files/storage/common.php (renamed from lib/files/storage/common.php)0
-rw-r--r--lib/private/files/storage/commontest.php (renamed from lib/files/storage/commontest.php)0
-rw-r--r--lib/private/files/storage/loader.php (renamed from lib/files/storage/loader.php)0
-rw-r--r--lib/private/files/storage/local.php (renamed from lib/files/storage/local.php)0
-rw-r--r--lib/private/files/storage/mappedlocal.php (renamed from lib/files/storage/mappedlocal.php)0
-rw-r--r--lib/private/files/storage/storage.php (renamed from lib/files/storage/storage.php)0
-rw-r--r--lib/private/files/storage/temporary.php (renamed from lib/files/storage/temporary.php)0
-rw-r--r--lib/private/files/storage/wrapper/quota.php (renamed from lib/files/storage/wrapper/quota.php)0
-rw-r--r--lib/private/files/storage/wrapper/wrapper.php (renamed from lib/files/storage/wrapper/wrapper.php)0
-rw-r--r--lib/private/files/stream/close.php (renamed from lib/files/stream/close.php)0
-rw-r--r--lib/private/files/stream/dir.php (renamed from lib/files/stream/dir.php)0
-rw-r--r--lib/private/files/stream/oc.php (renamed from lib/files/stream/oc.php)0
-rw-r--r--lib/private/files/stream/quota.php (renamed from lib/files/stream/quota.php)0
-rw-r--r--lib/private/files/stream/staticstream.php (renamed from lib/files/stream/staticstream.php)0
-rw-r--r--lib/private/files/type/detection.php (renamed from lib/files/type/detection.php)0
-rw-r--r--lib/private/files/type/templatemanager.php (renamed from lib/files/type/templatemanager.php)0
-rw-r--r--lib/private/files/utils/scanner.php (renamed from lib/files/utils/scanner.php)0
-rw-r--r--lib/private/files/view.php (renamed from lib/files/view.php)0
-rw-r--r--lib/private/geo.php (renamed from lib/geo.php)0
-rw-r--r--lib/private/group.php (renamed from lib/group.php)0
-rw-r--r--lib/private/group/backend.php (renamed from lib/group/backend.php)0
-rw-r--r--lib/private/group/database.php (renamed from lib/group/database.php)0
-rw-r--r--lib/private/group/dummy.php (renamed from lib/group/dummy.php)0
-rw-r--r--lib/private/group/example.php (renamed from lib/group/example.php)0
-rw-r--r--lib/private/group/group.php (renamed from lib/group/group.php)0
-rw-r--r--lib/private/group/interface.php (renamed from lib/group/interface.php)0
-rw-r--r--lib/private/group/manager.php (renamed from lib/group/manager.php)0
-rw-r--r--lib/private/helper.php (renamed from lib/helper.php)0
-rw-r--r--lib/private/hintexception.php (renamed from lib/hintexception.php)0
-rw-r--r--lib/private/hook.php (renamed from lib/hook.php)0
-rw-r--r--lib/private/hooks/basicemitter.php (renamed from lib/hooks/basicemitter.php)0
-rw-r--r--lib/private/hooks/emitter.php (renamed from lib/hooks/emitter.php)0
-rw-r--r--lib/private/hooks/forwardingemitter.php (renamed from lib/hooks/forwardingemitter.php)0
-rw-r--r--lib/private/hooks/legacyemitter.php (renamed from lib/hooks/legacyemitter.php)0
-rw-r--r--lib/private/hooks/publicemitter.php (renamed from lib/hooks/publicemitter.php)0
-rw-r--r--lib/private/image.php (renamed from lib/image.php)0
-rw-r--r--lib/private/installer.php (renamed from lib/installer.php)0
-rw-r--r--lib/private/json.php (renamed from lib/json.php)0
-rw-r--r--lib/private/l10n.php (renamed from lib/l10n.php)0
-rw-r--r--lib/private/l10n/ach.php (renamed from lib/l10n/ach.php)0
-rw-r--r--lib/private/l10n/af_ZA.php (renamed from lib/l10n/af_ZA.php)0
-rw-r--r--lib/private/l10n/ar.php (renamed from lib/l10n/ar.php)0
-rw-r--r--lib/private/l10n/be.php (renamed from lib/l10n/be.php)0
-rw-r--r--lib/private/l10n/bg_BG.php (renamed from lib/l10n/bg_BG.php)0
-rw-r--r--lib/private/l10n/bn_BD.php (renamed from lib/l10n/bn_BD.php)0
-rw-r--r--lib/private/l10n/bs.php (renamed from lib/l10n/bs.php)0
-rw-r--r--lib/private/l10n/ca.php (renamed from lib/l10n/ca.php)0
-rw-r--r--lib/private/l10n/cs_CZ.php (renamed from lib/l10n/cs_CZ.php)0
-rw-r--r--lib/private/l10n/cy_GB.php (renamed from lib/l10n/cy_GB.php)0
-rw-r--r--lib/private/l10n/da.php (renamed from lib/l10n/da.php)3
-rw-r--r--lib/private/l10n/de.php (renamed from lib/l10n/de.php)0
-rw-r--r--lib/private/l10n/de_AT.php (renamed from lib/l10n/de_AT.php)0
-rw-r--r--lib/private/l10n/de_CH.php (renamed from lib/l10n/de_CH.php)0
-rw-r--r--lib/private/l10n/de_DE.php (renamed from lib/l10n/de_DE.php)0
-rw-r--r--lib/private/l10n/el.php (renamed from lib/l10n/el.php)0
-rw-r--r--lib/private/l10n/en@pirate.php (renamed from lib/l10n/en@pirate.php)0
-rw-r--r--lib/private/l10n/en_GB.php (renamed from lib/l10n/en_GB.php)0
-rw-r--r--lib/private/l10n/eo.php (renamed from lib/l10n/eo.php)0
-rw-r--r--lib/private/l10n/es.php (renamed from lib/l10n/es.php)0
-rw-r--r--lib/private/l10n/es_AR.php (renamed from lib/l10n/es_AR.php)0
-rw-r--r--lib/private/l10n/es_MX.php (renamed from lib/l10n/es_MX.php)0
-rw-r--r--lib/private/l10n/et_EE.php (renamed from lib/l10n/et_EE.php)0
-rw-r--r--lib/private/l10n/eu.php (renamed from lib/l10n/eu.php)0
-rw-r--r--lib/private/l10n/fa.php (renamed from lib/l10n/fa.php)0
-rw-r--r--lib/private/l10n/fi.php (renamed from lib/l10n/fi.php)0
-rw-r--r--lib/private/l10n/fi_FI.php (renamed from lib/l10n/fi_FI.php)0
-rw-r--r--lib/private/l10n/fr.php (renamed from lib/l10n/fr.php)0
-rw-r--r--lib/private/l10n/gl.php (renamed from lib/l10n/gl.php)0
-rw-r--r--lib/private/l10n/he.php (renamed from lib/l10n/he.php)0
-rw-r--r--lib/private/l10n/hi.php (renamed from lib/l10n/hi.php)0
-rw-r--r--lib/private/l10n/hr.php (renamed from lib/l10n/hr.php)0
-rw-r--r--lib/private/l10n/hu_HU.php (renamed from lib/l10n/hu_HU.php)11
-rw-r--r--lib/private/l10n/hy.php (renamed from lib/l10n/hy.php)0
-rw-r--r--lib/private/l10n/ia.php (renamed from lib/l10n/ia.php)0
-rw-r--r--lib/private/l10n/id.php (renamed from lib/l10n/id.php)0
-rw-r--r--lib/private/l10n/is.php (renamed from lib/l10n/is.php)0
-rw-r--r--lib/private/l10n/it.php (renamed from lib/l10n/it.php)0
-rw-r--r--lib/private/l10n/ja_JP.php (renamed from lib/l10n/ja_JP.php)0
-rw-r--r--lib/private/l10n/ka.php (renamed from lib/l10n/ka.php)0
-rw-r--r--lib/private/l10n/ka_GE.php (renamed from lib/l10n/ka_GE.php)0
-rw-r--r--lib/private/l10n/km.php (renamed from lib/l10n/km.php)0
-rw-r--r--lib/private/l10n/kn.php (renamed from lib/l10n/kn.php)0
-rw-r--r--lib/private/l10n/ko.php (renamed from lib/l10n/ko.php)8
-rw-r--r--lib/private/l10n/ku_IQ.php (renamed from lib/l10n/ku_IQ.php)0
-rw-r--r--lib/private/l10n/lb.php (renamed from lib/l10n/lb.php)0
-rw-r--r--lib/private/l10n/lt_LT.php (renamed from lib/l10n/lt_LT.php)0
-rw-r--r--lib/private/l10n/lv.php (renamed from lib/l10n/lv.php)0
-rw-r--r--lib/private/l10n/mk.php (renamed from lib/l10n/mk.php)0
-rw-r--r--lib/private/l10n/ml_IN.php (renamed from lib/l10n/ml_IN.php)0
-rw-r--r--lib/private/l10n/ms_MY.php (renamed from lib/l10n/ms_MY.php)0
-rw-r--r--lib/private/l10n/my_MM.php (renamed from lib/l10n/my_MM.php)0
-rw-r--r--lib/private/l10n/nb_NO.php (renamed from lib/l10n/nb_NO.php)0
-rw-r--r--lib/private/l10n/ne.php (renamed from lib/l10n/ne.php)0
-rw-r--r--lib/private/l10n/nl.php (renamed from lib/l10n/nl.php)0
-rw-r--r--lib/private/l10n/nn_NO.php (renamed from lib/l10n/nn_NO.php)2
-rw-r--r--lib/private/l10n/nqo.php (renamed from lib/l10n/nqo.php)0
-rw-r--r--lib/private/l10n/oc.php (renamed from lib/l10n/oc.php)0
-rw-r--r--lib/private/l10n/pa.php (renamed from lib/l10n/pa.php)0
-rw-r--r--lib/private/l10n/pl.php (renamed from lib/l10n/pl.php)7
-rw-r--r--lib/private/l10n/pl_PL.php (renamed from lib/l10n/pl_PL.php)0
-rw-r--r--lib/private/l10n/pt_BR.php (renamed from lib/l10n/pt_BR.php)0
-rw-r--r--lib/private/l10n/pt_PT.php (renamed from lib/l10n/pt_PT.php)0
-rw-r--r--lib/private/l10n/ro.php (renamed from lib/l10n/ro.php)0
-rw-r--r--lib/private/l10n/ru.php (renamed from lib/l10n/ru.php)0
-rw-r--r--lib/private/l10n/si_LK.php (renamed from lib/l10n/si_LK.php)0
-rw-r--r--lib/private/l10n/sk.php (renamed from lib/l10n/sk.php)0
-rw-r--r--lib/private/l10n/sk_SK.php (renamed from lib/l10n/sk_SK.php)0
-rw-r--r--lib/private/l10n/sl.php (renamed from lib/l10n/sl.php)0
-rw-r--r--lib/private/l10n/sq.php (renamed from lib/l10n/sq.php)0
-rw-r--r--lib/private/l10n/sr.php (renamed from lib/l10n/sr.php)0
-rw-r--r--lib/private/l10n/sr@latin.php (renamed from lib/l10n/sr@latin.php)0
-rw-r--r--lib/private/l10n/string.php (renamed from lib/l10n/string.php)0
-rw-r--r--lib/private/l10n/sv.php (renamed from lib/l10n/sv.php)0
-rw-r--r--lib/private/l10n/sw_KE.php (renamed from lib/l10n/sw_KE.php)0
-rw-r--r--lib/private/l10n/ta_LK.php (renamed from lib/l10n/ta_LK.php)0
-rw-r--r--lib/private/l10n/te.php (renamed from lib/l10n/te.php)0
-rw-r--r--lib/private/l10n/th_TH.php (renamed from lib/l10n/th_TH.php)0
-rw-r--r--lib/private/l10n/tr.php (renamed from lib/l10n/tr.php)0
-rw-r--r--lib/private/l10n/ug.php (renamed from lib/l10n/ug.php)0
-rw-r--r--lib/private/l10n/uk.php (renamed from lib/l10n/uk.php)0
-rw-r--r--lib/private/l10n/ur_PK.php (renamed from lib/l10n/ur_PK.php)0
-rw-r--r--lib/private/l10n/vi.php (renamed from lib/l10n/vi.php)0
-rw-r--r--lib/private/l10n/zh_CN.php (renamed from lib/l10n/zh_CN.php)0
-rw-r--r--lib/private/l10n/zh_HK.php (renamed from lib/l10n/zh_HK.php)0
-rw-r--r--lib/private/l10n/zh_TW.php (renamed from lib/l10n/zh_TW.php)0
-rw-r--r--lib/private/legacy/cache.php10
-rw-r--r--lib/private/legacy/config.php (renamed from lib/legacy/config.php)0
-rw-r--r--lib/private/legacy/filesystem.php (renamed from lib/legacy/filesystem.php)0
-rw-r--r--lib/private/legacy/filesystemview.php (renamed from lib/legacy/filesystemview.php)0
-rw-r--r--lib/private/legacy/log.php (renamed from lib/legacy/log.php)0
-rw-r--r--lib/private/legacy/preferences.php (renamed from lib/legacy/preferences.php)0
-rw-r--r--lib/private/legacy/updater.php (renamed from lib/legacy/updater.php)0
-rw-r--r--lib/private/log.php (renamed from lib/log.php)0
-rw-r--r--lib/private/log/errorhandler.php (renamed from lib/log/errorhandler.php)0
-rw-r--r--lib/private/log/owncloud.php (renamed from lib/log/owncloud.php)0
-rw-r--r--lib/private/log/rotate.php (renamed from lib/log/rotate.php)0
-rw-r--r--lib/private/log/syslog.php (renamed from lib/log/syslog.php)0
-rw-r--r--lib/private/mail.php (renamed from lib/mail.php)0
-rw-r--r--lib/private/memcache/apc.php (renamed from lib/memcache/apc.php)0
-rw-r--r--lib/private/memcache/apcu.php (renamed from lib/memcache/apcu.php)0
-rw-r--r--lib/private/memcache/cache.php (renamed from lib/memcache/cache.php)0
-rw-r--r--lib/private/memcache/factory.php (renamed from lib/memcache/factory.php)0
-rw-r--r--lib/private/memcache/memcached.php (renamed from lib/memcache/memcached.php)0
-rw-r--r--lib/private/memcache/xcache.php (renamed from lib/memcache/xcache.php)0
-rw-r--r--lib/private/migrate.php (renamed from lib/migrate.php)0
-rw-r--r--lib/private/migration/content.php (renamed from lib/migration/content.php)0
-rw-r--r--lib/private/migration/provider.php (renamed from lib/migration/provider.php)0
-rw-r--r--lib/private/mimetypes.list.php (renamed from lib/mimetypes.list.php)0
-rw-r--r--lib/private/minimizer.php (renamed from lib/minimizer.php)0
-rw-r--r--lib/private/minimizer/css.php (renamed from lib/minimizer/css.php)0
-rw-r--r--lib/private/minimizer/js.php (renamed from lib/minimizer/js.php)0
-rw-r--r--lib/private/navigationmanager.php64
-rw-r--r--lib/private/notsquareexception.php (renamed from lib/notsquareexception.php)0
-rw-r--r--lib/private/ocs.php (renamed from lib/ocs.php)0
-rw-r--r--lib/private/ocs/cloud.php (renamed from lib/ocs/cloud.php)0
-rw-r--r--lib/private/ocs/config.php (renamed from lib/ocs/config.php)0
-rw-r--r--lib/private/ocs/person.php (renamed from lib/ocs/person.php)0
-rw-r--r--lib/private/ocs/privatedata.php (renamed from lib/ocs/privatedata.php)0
-rw-r--r--lib/private/ocs/result.php (renamed from lib/ocs/result.php)0
-rw-r--r--lib/private/ocsclient.php (renamed from lib/ocsclient.php)7
-rw-r--r--lib/private/preferences.php (renamed from lib/preferences.php)0
-rwxr-xr-xlib/private/preview.php (renamed from lib/preview.php)5
-rw-r--r--lib/private/preview/image.php (renamed from lib/preview/image.php)0
-rw-r--r--lib/private/preview/movies.php (renamed from lib/preview/movies.php)0
-rw-r--r--lib/private/preview/mp3.php (renamed from lib/preview/mp3.php)0
-rw-r--r--lib/private/preview/office-cl.php (renamed from lib/preview/office-cl.php)0
-rw-r--r--lib/private/preview/office-fallback.php (renamed from lib/preview/office-fallback.php)0
-rw-r--r--lib/private/preview/office.php (renamed from lib/preview/office.php)0
-rw-r--r--lib/private/preview/pdf.php (renamed from lib/preview/pdf.php)0
-rw-r--r--lib/private/preview/provider.php (renamed from lib/preview/provider.php)0
-rw-r--r--lib/private/preview/svg.php (renamed from lib/preview/svg.php)0
-rw-r--r--lib/private/preview/txt.php (renamed from lib/preview/txt.php)10
-rw-r--r--lib/private/preview/unknown.php (renamed from lib/preview/unknown.php)0
-rwxr-xr-xlib/private/previewmanager.php38
-rwxr-xr-xlib/private/request.php (renamed from lib/request.php)0
-rw-r--r--lib/private/response.php (renamed from lib/response.php)0
-rw-r--r--lib/private/route.php (renamed from lib/route.php)0
-rw-r--r--lib/private/router.php (renamed from lib/router.php)0
-rw-r--r--lib/private/search.php (renamed from lib/search.php)0
-rw-r--r--lib/private/search/provider.php (renamed from lib/search/provider.php)0
-rw-r--r--lib/private/search/provider/file.php (renamed from lib/search/provider/file.php)0
-rw-r--r--lib/private/search/result.php (renamed from lib/search/result.php)0
-rw-r--r--lib/private/server.php255
-rw-r--r--lib/private/session/internal.php (renamed from lib/session/internal.php)0
-rw-r--r--lib/private/session/memory.php (renamed from lib/session/memory.php)0
-rw-r--r--lib/private/session/session.php (renamed from lib/session/session.php)2
-rw-r--r--lib/private/setup.php (renamed from lib/setup.php)0
-rw-r--r--lib/private/setup/abstractdatabase.php (renamed from lib/setup/abstractdatabase.php)0
-rw-r--r--lib/private/setup/mssql.php (renamed from lib/setup/mssql.php)0
-rw-r--r--lib/private/setup/mysql.php (renamed from lib/setup/mysql.php)0
-rw-r--r--lib/private/setup/oci.php (renamed from lib/setup/oci.php)0
-rw-r--r--lib/private/setup/postgresql.php (renamed from lib/setup/postgresql.php)0
-rw-r--r--lib/private/setup/sqlite.php (renamed from lib/setup/sqlite.php)0
-rw-r--r--lib/private/subadmin.php (renamed from lib/subadmin.php)0
-rw-r--r--lib/private/tagmanager.php68
-rw-r--r--lib/private/tags.php642
-rw-r--r--lib/private/template.php (renamed from lib/template.php)0
-rw-r--r--lib/private/template/base.php (renamed from lib/template/base.php)0
-rw-r--r--lib/private/template/cssresourcelocator.php (renamed from lib/template/cssresourcelocator.php)0
-rw-r--r--lib/private/template/functions.php (renamed from lib/template/functions.php)0
-rw-r--r--lib/private/template/jsresourcelocator.php (renamed from lib/template/jsresourcelocator.php)0
-rw-r--r--lib/private/template/resourcelocator.php (renamed from lib/template/resourcelocator.php)0
-rw-r--r--lib/private/template/templatefilelocator.php (renamed from lib/template/templatefilelocator.php)0
-rw-r--r--lib/private/templatelayout.php (renamed from lib/templatelayout.php)0
-rw-r--r--lib/private/updater.php (renamed from lib/updater.php)2
-rw-r--r--lib/private/user.php (renamed from lib/user.php)60
-rw-r--r--lib/private/user/backend.php (renamed from lib/user/backend.php)0
-rw-r--r--lib/private/user/database.php (renamed from lib/user/database.php)0
-rw-r--r--lib/private/user/dummy.php (renamed from lib/user/dummy.php)0
-rw-r--r--lib/private/user/example.php (renamed from lib/user/example.php)0
-rw-r--r--lib/private/user/http.php (renamed from lib/user/http.php)6
-rw-r--r--lib/private/user/interface.php (renamed from lib/user/interface.php)0
-rw-r--r--lib/private/user/manager.php (renamed from lib/user/manager.php)19
-rw-r--r--lib/private/user/session.php (renamed from lib/user/session.php)21
-rw-r--r--lib/private/user/user.php (renamed from lib/user/user.php)18
-rwxr-xr-xlib/private/util.php (renamed from lib/util.php)90
-rw-r--r--lib/private/vobject.php (renamed from lib/vobject.php)0
-rw-r--r--lib/private/vobject/compoundproperty.php (renamed from lib/vobject/compoundproperty.php)0
-rw-r--r--lib/private/vobject/stringproperty.php (renamed from lib/vobject/stringproperty.php)0
-rw-r--r--lib/public/app.php16
-rw-r--r--lib/public/appframework/app.php81
-rw-r--r--lib/public/appframework/http/http.php89
-rw-r--r--lib/public/appframework/http/jsonresponse.php74
-rw-r--r--lib/public/appframework/http/response.php169
-rw-r--r--lib/public/appframework/http/templateresponse.php126
-rw-r--r--lib/public/appframework/iapi.php151
-rw-r--r--lib/public/appframework/iappcontainer.php57
-rw-r--r--lib/public/appframework/imiddleware.php88
-rw-r--r--lib/public/contacts.php55
-rw-r--r--lib/public/contacts/imanager.php150
-rw-r--r--lib/public/icache.php55
-rw-r--r--lib/public/iconfig.php65
-rw-r--r--lib/public/icontainer.php64
-rw-r--r--lib/public/idbconnection.php74
-rw-r--r--lib/public/inavigationmanager.php27
-rw-r--r--lib/public/ipreview.php35
-rw-r--r--lib/public/irequest.php96
-rw-r--r--lib/public/iservercontainer.php125
-rw-r--r--lib/public/isession.php56
-rw-r--r--lib/public/itagmanager.php48
-rw-r--r--lib/public/itags.php164
-rw-r--r--lib/public/iusersession.php30
-rw-r--r--lib/public/preview.php34
-rw-r--r--lib/public/share.php19
-rw-r--r--lib/public/user.php2
-rw-r--r--lib/vcategories.php821
-rw-r--r--settings/js/apps.js4
-rw-r--r--settings/js/personal.js1
-rw-r--r--settings/l10n/da.php6
-rw-r--r--settings/l10n/fr.php3
-rw-r--r--settings/l10n/hu_HU.php19
-rw-r--r--settings/l10n/ja_JP.php9
-rw-r--r--settings/l10n/lt_LT.php6
-rw-r--r--settings/l10n/nn_NO.php14
-rw-r--r--settings/l10n/pl.php7
-rw-r--r--settings/l10n/sv.php13
-rw-r--r--settings/l10n/uk.php4
-rw-r--r--tests/bootstrap.php2
-rw-r--r--tests/data/testcal.ics13
-rw-r--r--tests/data/testcontact.vcf6
-rw-r--r--tests/lib/appframework/AppTest.php99
-rw-r--r--tests/lib/appframework/controller/ControllerTest.php155
-rw-r--r--tests/lib/appframework/dependencyinjection/DIContainerTest.php98
-rw-r--r--tests/lib/appframework/http/DispatcherTest.php218
-rw-r--r--tests/lib/appframework/http/DownloadResponseTest.php51
-rw-r--r--tests/lib/appframework/http/HttpTest.php87
-rw-r--r--tests/lib/appframework/http/JSONResponseTest.php98
-rw-r--r--tests/lib/appframework/http/RedirectResponseTest.php55
-rw-r--r--tests/lib/appframework/http/RequestTest.php76
-rw-r--r--tests/lib/appframework/http/ResponseTest.php120
-rw-r--r--tests/lib/appframework/http/TemplateResponseTest.php161
-rw-r--r--tests/lib/appframework/middleware/MiddlewareDispatcherTest.php285
-rw-r--r--tests/lib/appframework/middleware/MiddlewareTest.php83
-rw-r--r--tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php296
-rw-r--r--tests/lib/appframework/routing/RoutingTest.php213
-rw-r--r--tests/lib/appframework/utility/MethodAnnotationReaderTest.php55
-rw-r--r--tests/lib/autoloader.php10
-rw-r--r--tests/lib/cache.php2
-rw-r--r--tests/lib/cache/file.php30
-rw-r--r--tests/lib/cache/usercache.php68
-rw-r--r--tests/lib/connector/sabre/aborteduploaddetectionplugin.php97
-rw-r--r--tests/lib/connector/sabre/objecttree.php87
-rw-r--r--tests/lib/files/cache/permissions.php17
-rw-r--r--tests/lib/files/cache/scanner.php49
-rw-r--r--tests/lib/preview.php43
-rw-r--r--tests/lib/share/share.php48
-rw-r--r--tests/lib/tags.php166
-rw-r--r--tests/lib/user.php43
-rw-r--r--tests/lib/user/manager.php45
-rw-r--r--tests/lib/user/session.php32
-rw-r--r--tests/lib/user/user.php40
-rw-r--r--tests/lib/vcategories.php128
-rw-r--r--tests/phpunit.xml.dist14
-rw-r--r--version.php17
500 files changed, 10018 insertions, 2195 deletions
diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php
index 5ca0d5e8117..531481a84c0 100644
--- a/apps/files/ajax/rawlist.php
+++ b/apps/files/ajax/rawlist.php
@@ -26,7 +26,7 @@ $files = array();
if($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, 'httpd/unix-directory' ) as $file ) {
$file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;
@@ -37,7 +37,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
foreach ($mimetypes as $mimetype) {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) {
$file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;
@@ -46,7 +46,7 @@ if (is_array($mimetypes) && count($mimetypes)) {
} else {
foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) {
$file['directory'] = $dir;
- $file['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($file['mimetype']);
+ $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']);
$file["date"] = OCP\Util::formatDate($file["mtime"]);
$file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file);
$files[] = $file;
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index 9b114ca2e37..0c1f2e6580c 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -48,6 +48,7 @@ $defaults = new OC_Defaults();
$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+$server->addPlugin(new OC_Connector_Sabre_AbortedUploadDetectionPlugin());
$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin());
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
diff --git a/apps/files/js/files.js b/apps/files/js/files.js
index 8ccb448abfb..ec688eaf63e 100644
--- a/apps/files/js/files.js
+++ b/apps/files/js/files.js
@@ -644,7 +644,11 @@ function lazyLoadPreview(path, mime, ready, width, height) {
if ( ! height ) {
height = $('#filestable').data('preview-y');
}
- var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:width, y:height});
+ if( $('#publicUploadButtonMock').length ) {
+ var previewURL = OC.Router.generate('core_ajax_public_preview', {file: encodeURIComponent(path), x:width, y:height, t:$('#dirToken').val()});
+ } else {
+ var previewURL = OC.Router.generate('core_ajax_preview', {file: encodeURIComponent(path), x:width, y:height});
+ }
$.get(previewURL, function() {
previewURL = previewURL.replace('(', '%28');
previewURL = previewURL.replace(')', '%29');
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index 8fd72ac0a68..5c2cade8d63 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta un fitxer temporal",
"Failed to write to disk" => "Ha fallat en escriure al disc",
"Not enough storage available" => "No hi ha prou espai disponible",
+"Upload failed. Could not get file info." => "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.",
+"Upload failed. Could not find uploaded file" => "La pujada ha fallat. El fitxer pujat no s'ha trobat.",
"Invalid directory." => "Directori no vàlid.",
"Files" => "Fitxers",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "No es pot pujar {filename} perquè és una carpeta o té 0 bytes",
"Not enough space available" => "No hi ha prou espai disponible",
"Upload cancelled." => "La pujada s'ha cancel·lat.",
+"Could not get result from server." => "No hi ha resposta del servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.",
"URL cannot be empty." => "La URL no pot ser buida",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de carpeta no vàlid. L'ús de 'Shared' està reservat per Owncloud",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "El vostre espai d'emmagatzemament és gairebé ple ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "L'encriptació s'ha desactivat però els vostres fitxers segueixen encriptats. Aneu a la vostra configuració personal per desencriptar els vostres fitxers.",
"Your download is being prepared. This might take some time if the files are big." => "S'està preparant la baixada. Pot trigar una estona si els fitxers són grans.",
+"Error moving file" => "Error en moure el fitxer",
"Name" => "Nom",
"Size" => "Mida",
"Modified" => "Modificat",
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index f67283ec6e8..f1e54ee5fc3 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -42,6 +42,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Vaše úložiště je téměř plné ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.",
"Your download is being prepared. This might take some time if the files are big." => "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to chvíli trvat.",
+"Error moving file" => "Chyba při přesunu souboru",
"Name" => "Název",
"Size" => "Velikost",
"Modified" => "Upraveno",
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 37a61c6b956..de524f4dd90 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -41,6 +41,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Ο αποθηκευτικός χώρος είναι σχεδόν γεμάτος ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Η κρυπτογράφηση απενεργοποιήθηκε, αλλά τα αρχεία σας είναι ακόμα κρυπτογραφημένα. Παρακαλούμε απενεργοποιήσετε την κρυπτογράφηση αρχείων από τις προσωπικές σας ρυθμίσεις",
"Your download is being prepared. This might take some time if the files are big." => "Η λήψη προετοιμάζεται. Αυτό μπορεί να πάρει ώρα εάν τα αρχεία έχουν μεγάλο μέγεθος.",
+"Error moving file" => "Σφάλμα κατά τη μετακίνηση του αρχείου",
"Name" => "Όνομα",
"Size" => "Μέγεθος",
"Modified" => "Τροποποιήθηκε",
diff --git a/apps/files/l10n/en_GB.php b/apps/files/l10n/en_GB.php
index e67719efba9..c747555e40b 100644
--- a/apps/files/l10n/en_GB.php
+++ b/apps/files/l10n/en_GB.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Missing a temporary folder",
"Failed to write to disk" => "Failed to write to disk",
"Not enough storage available" => "Not enough storage available",
+"Upload failed. Could not get file info." => "Upload failed. Could not get file info.",
+"Upload failed. Could not find uploaded file" => "Upload failed. Could not find uploaded file",
"Invalid directory." => "Invalid directory.",
"Files" => "Files",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Unable to upload {filename} as it is a directory or has 0 bytes",
"Not enough space available" => "Not enough space available",
"Upload cancelled." => "Upload cancelled.",
+"Could not get result from server." => "Could not get result from server.",
"File upload is in progress. Leaving the page now will cancel the upload." => "File upload is in progress. Leaving the page now will cancel the upload.",
"URL cannot be empty." => "URL cannot be empty.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Invalid folder name. Usage of 'Shared' is reserved by ownCloud",
@@ -37,11 +41,12 @@ $TRANSLATIONS = array(
"_Uploading %n file_::_Uploading %n files_" => array("Uploading %n file","Uploading %n files"),
"'.' is an invalid file name." => "'.' is an invalid file name.",
"File name cannot be empty." => "File name cannot be empty.",
-"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.",
+"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.",
"Your storage is full, files can not be updated or synced anymore!" => "Your storage is full, files can not be updated or synced anymore!",
"Your storage is almost full ({usedSpacePercent}%)" => "Your storage is almost full ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.",
"Your download is being prepared. This might take some time if the files are big." => "Your download is being prepared. This might take some time if the files are big.",
+"Error moving file" => "Error moving file",
"Name" => "Name",
"Size" => "Size",
"Modified" => "Modified",
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index d6470458083..03505a2a269 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Absence de dossier temporaire.",
"Failed to write to disk" => "Erreur d'écriture sur le disque",
"Not enough storage available" => "Plus assez d'espace de stockage disponible",
+"Upload failed. Could not get file info." => "L'envoi a échoué. Impossible d'obtenir les informations du fichier.",
+"Upload failed. Could not find uploaded file" => "L'envoi a échoué. Impossible de trouver le fichier envoyé.",
"Invalid directory." => "Dossier invalide.",
"Files" => "Fichiers",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Not enough space available" => "Espace disponible insuffisant",
"Upload cancelled." => "Envoi annulé.",
+"Could not get result from server." => "Ne peut recevoir les résultats du serveur.",
"File upload is in progress. Leaving the page now will cancel the upload." => "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
"URL cannot be empty." => "L'URL ne peut-être vide",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nom de dossier invalide. L'utilisation du mot 'Shared' est réservée à Owncloud",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Votre espace de stockage est presque plein ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Le chiffrement était désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos Paramètres personnels pour déchiffrer vos fichiers.",
"Your download is being prepared. This might take some time if the files are big." => "Votre téléchargement est cours de préparation. Ceci peut nécessiter un certain temps si les fichiers sont volumineux.",
+"Error moving file" => "Erreur lors du déplacement du fichier",
"Name" => "Nom",
"Size" => "Taille",
"Modified" => "Modifié",
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 0eba94f7d60..2766478650a 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Falta o cartafol temporal",
"Failed to write to disk" => "Produciuse un erro ao escribir no disco",
"Not enough storage available" => "Non hai espazo de almacenamento abondo",
+"Upload failed. Could not get file info." => "O envío fracasou. Non foi posíbel obter información do ficheiro.",
+"Upload failed. Could not find uploaded file" => "O envío fracasou. Non foi posíbel atopar o ficheiro enviado",
"Invalid directory." => "O directorio é incorrecto.",
"Files" => "Ficheiros",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes",
"Not enough space available" => "O espazo dispoñíbel é insuficiente",
"Upload cancelled." => "Envío cancelado.",
+"Could not get result from server." => "Non foi posíbel obter o resultado do servidor.",
"File upload is in progress. Leaving the page now will cancel the upload." => "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.",
"URL cannot be empty." => "O URL non pode quedar baleiro.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nome de cartafol incorrecto. O uso de «Compartido» e «Shared» está reservado para o ownClod",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "O seu espazo de almacenamento está case cheo ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "O cifrado foi desactivado, mais os ficheiros están cifrados. Vaia á configuración persoal para descifrar os ficheiros.",
"Your download is being prepared. This might take some time if the files are big." => "Está a prepararse a súa descarga. Isto pode levar bastante tempo se os ficheiros son grandes.",
+"Error moving file" => "Produciuse un erro ao mover o ficheiro",
"Name" => "Nome",
"Size" => "Tamaño",
"Modified" => "Modificado",
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index 5d313ff2488..4dd6a13d320 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Hiányzik egy ideiglenes mappa",
"Failed to write to disk" => "Nem sikerült a lemezre történő írás",
"Not enough storage available" => "Nincs elég szabad hely.",
+"Upload failed. Could not get file info." => "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.",
+"Upload failed. Could not find uploaded file" => "A feltöltés nem sikerült. Nem található a feltöltendő állomány.",
"Invalid directory." => "Érvénytelen mappa.",
"Files" => "Fájlok",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.",
"Not enough space available" => "Nincs elég szabad hely",
"Upload cancelled." => "A feltöltést megszakítottuk.",
+"Could not get result from server." => "A kiszolgálótól nem kapható meg az eredmény.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.",
"URL cannot be empty." => "Az URL nem lehet semmi.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Érvénytelen mappanév. A 'Shared' az ownCloud számára fenntartott elnevezés",
@@ -31,15 +35,18 @@ $TRANSLATIONS = array(
"cancel" => "mégse",
"replaced {new_name} with {old_name}" => "{new_name} fájlt kicseréltük ezzel: {old_name}",
"undo" => "visszavonás",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
-"_Uploading %n file_::_Uploading %n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("%n mappa","%n mappa"),
+"_%n file_::_%n files_" => array("%n állomány","%n állomány"),
+"{dirs} and {files}" => "{dirs} és {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("%n állomány feltöltése","%n állomány feltöltése"),
"'.' is an invalid file name." => "'.' fájlnév érvénytelen.",
"File name cannot be empty." => "A fájlnév nem lehet semmi.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Érvénytelen elnevezés. Ezek a karakterek nem használhatók: '\\', '/', '<', '>', ':', '\"', '|', '?' és '*'",
"Your storage is full, files can not be updated or synced anymore!" => "A tároló tele van, a fájlok nem frissíthetőek vagy szinkronizálhatóak a jövőben.",
"Your storage is almost full ({usedSpacePercent}%)" => "A tároló majdnem tele van ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "A titkosítási funkciót kikapcsolták, de az Ön állományai még mindig titkosított állapotban vannak. A személyes beállításoknál tudja a titkosítást feloldani.",
"Your download is being prepared. This might take some time if the files are big." => "Készül a letöltendő állomány. Ez eltarthat egy ideig, ha nagyok a fájlok.",
+"Error moving file" => "Az állomány áthelyezése nem sikerült.",
"Name" => "Név",
"Size" => "Méret",
"Modified" => "Módosítva",
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index c24d30ae368..44b4e341956 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -13,11 +13,11 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manca una cartella temporanea",
"Failed to write to disk" => "Scrittura su disco non riuscita",
"Not enough storage available" => "Spazio di archiviazione insufficiente",
-"Upload failed. Could not get file info." => "Upload fallito. Impossibile ottenere informazioni sul file",
-"Upload failed. Could not find uploaded file" => "Upload fallit. Impossibile trovare file caricato",
+"Upload failed. Could not get file info." => "Caricamento non riuscito. Impossibile ottenere informazioni sul file.",
+"Upload failed. Could not find uploaded file" => "Caricamento non riuscito. Impossibile trovare il file caricato.",
"Invalid directory." => "Cartella non valida.",
"Files" => "File",
-"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.",
"Not enough space available" => "Spazio disponibile insufficiente",
"Upload cancelled." => "Invio annullato",
"Could not get result from server." => "Impossibile ottenere il risultato dal server.",
diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php
index 5944b47434d..07ee96f1eb6 100644
--- a/apps/files/l10n/ja_JP.php
+++ b/apps/files/l10n/ja_JP.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "一時保存フォルダが見つかりません",
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
"Not enough storage available" => "ストレージに十分な空き容量がありません",
+"Upload failed. Could not get file info." => "アップロードに失敗。ファイル情報を取得できませんでした。",
+"Upload failed. Could not find uploaded file" => "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。",
"Invalid directory." => "無効なディレクトリです。",
"Files" => "ファイル",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "ディレクトリもしくは0バイトのため {filename} をアップロードできません",
"Not enough space available" => "利用可能なスペースが十分にありません",
"Upload cancelled." => "アップロードはキャンセルされました。",
+"Could not get result from server." => "サーバから結果を取得できませんでした。",
"File upload is in progress. Leaving the page now will cancel the upload." => "ファイル転送を実行中です。今このページから移動するとアップロードが中止されます。",
"URL cannot be empty." => "URLは空にできません。",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "無効なフォルダ名です。'Shared' の利用はownCloudで予約済みです",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "あなたのストレージはほぼ一杯です({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。",
"Your download is being prepared. This might take some time if the files are big." => "ダウンロードの準備中です。ファイルサイズが大きい場合は少し時間がかかるかもしれません。",
+"Error moving file" => "ファイルの移動エラー",
"Name" => "名前",
"Size" => "サイズ",
"Modified" => "変更",
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index 502acefcf3a..0174f8d0d21 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -2,6 +2,8 @@
$TRANSLATIONS = array(
"Could not move %s - File with this name already exists" => "%s 항목을 이동시키지 못하였음 - 파일 이름이 이미 존재함",
"Could not move %s" => "%s 항목을 이딩시키지 못하였음",
+"Unable to set upload directory." => "업로드 디렉터리를 정할수 없습니다",
+"Invalid Token" => "잘못된 토큰",
"No file was uploaded. Unknown error" => "파일이 업로드되지 않았습니다. 알 수 없는 오류입니다",
"There is no error, the file uploaded with success" => "파일 업로드에 성공하였습니다.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " => "업로드한 파일이 php.ini의 upload_max_filesize보다 큽니다:",
@@ -11,12 +13,17 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "임시 폴더가 없음",
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
"Not enough storage available" => "저장소가 용량이 충분하지 않습니다.",
+"Upload failed. Could not get file info." => "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다.",
+"Upload failed. Could not find uploaded file" => "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다",
"Invalid directory." => "올바르지 않은 디렉터리입니다.",
"Files" => "파일",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다.",
"Not enough space available" => "여유 공간이 부족합니다",
"Upload cancelled." => "업로드가 취소되었습니다.",
+"Could not get result from server." => "서버에서 결과를 가져올수 없습니다.",
"File upload is in progress. Leaving the page now will cancel the upload." => "파일 업로드가 진행 중입니다. 이 페이지를 벗어나면 업로드가 취소됩니다.",
"URL cannot be empty." => "URL을 입력해야 합니다.",
+"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다.",
"Error" => "오류",
"Share" => "공유",
"Delete permanently" => "영원히 삭제",
@@ -28,18 +35,22 @@ $TRANSLATIONS = array(
"cancel" => "취소",
"replaced {new_name} with {old_name}" => "{old_name}이(가) {new_name}(으)로 대체됨",
"undo" => "되돌리기",
-"_%n folder_::_%n folders_" => array(""),
-"_%n file_::_%n files_" => array(""),
-"_Uploading %n file_::_Uploading %n files_" => array(""),
+"_%n folder_::_%n folders_" => array("폴더 %n"),
+"_%n file_::_%n files_" => array("파일 %n 개"),
+"{dirs} and {files}" => "{dirs} 그리고 {files}",
+"_Uploading %n file_::_Uploading %n files_" => array("%n 개의 파일을 업로드중"),
"'.' is an invalid file name." => "'.' 는 올바르지 않은 파일 이름 입니다.",
"File name cannot be empty." => "파일 이름이 비어 있을 수 없습니다.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "폴더 이름이 올바르지 않습니다. 이름에 문자 '\\', '/', '<', '>', ':', '\"', '|', '? ', '*'는 사용할 수 없습니다.",
"Your storage is full, files can not be updated or synced anymore!" => "저장 공간이 가득 찼습니다. 파일을 업데이트하거나 동기화할 수 없습니다!",
"Your storage is almost full ({usedSpacePercent}%)" => "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)",
+"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오",
"Your download is being prepared. This might take some time if the files are big." => "다운로드가 준비 중입니다. 파일 크기가 크다면 시간이 오래 걸릴 수도 있습니다.",
+"Error moving file" => "파일 이동 오류",
"Name" => "이름",
"Size" => "크기",
"Modified" => "수정됨",
+"%s could not be renamed" => "%s 의 이름을 변경할수 없습니다",
"Upload" => "업로드",
"File handling" => "파일 처리",
"Maximum upload size" => "최대 업로드 크기",
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index 2b32a129d55..d064b0c6523 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską",
"Not enough storage available" => "Nepakanka vietos serveryje",
+"Upload failed. Could not get file info." => "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.",
+"Upload failed. Could not find uploaded file" => "Įkėlimas nepavyko. Nepavyko rasti įkelto failo",
"Invalid directory." => "Neteisingas aplankas",
"Files" => "Failai",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio",
"Not enough space available" => "Nepakanka vietos",
"Upload cancelled." => "Įkėlimas atšauktas.",
+"Could not get result from server." => "Nepavyko gauti rezultato iš serverio.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.",
"URL cannot be empty." => "URL negali būti tuščias.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Negalimas aplanko pavadinimas. 'Shared' pavadinimas yra rezervuotas ownCloud",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.",
"Your download is being prepared. This might take some time if the files are big." => "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunčiamas didelis failas.",
+"Error moving file" => "Klaida perkeliant failą",
"Name" => "Pavadinimas",
"Size" => "Dydis",
"Modified" => "Pakeista",
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index 04c47c31fbb..e29b1d3ad36 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Manglar ei mellombels mappe",
"Failed to write to disk" => "Klarte ikkje skriva til disk",
"Not enough storage available" => "Ikkje nok lagringsplass tilgjengeleg",
+"Upload failed. Could not get file info." => "Feil ved opplasting. Klarte ikkje å henta filinfo.",
+"Upload failed. Could not find uploaded file" => "Feil ved opplasting. Klarte ikkje å finna opplasta fil.",
"Invalid directory." => "Ugyldig mappe.",
"Files" => "Filer",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.",
"Not enough space available" => "Ikkje nok lagringsplass tilgjengeleg",
"Upload cancelled." => "Opplasting avbroten.",
+"Could not get result from server." => "Klarte ikkje å henta resultat frå tenaren.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.",
"URL cannot be empty." => "Nettadressa kan ikkje vera tom.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldig mappenamn. Mappa «Shared» er reservert av ownCloud",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Lagringa di er nesten full ({usedSpacePercent} %)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.",
"Your download is being prepared. This might take some time if the files are big." => "Gjer klar nedlastinga di. Dette kan ta ei stund viss filene er store.",
+"Error moving file" => "Feil ved flytting av fil",
"Name" => "Namn",
"Size" => "Storleik",
"Modified" => "Endra",
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index 3ad80975810..50a247d2e0f 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -13,10 +13,14 @@ $TRANSLATIONS = array(
"Missing a temporary folder" => "Brak folderu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk",
"Not enough storage available" => "Za mało dostępnego miejsca",
+"Upload failed. Could not get file info." => "Nieudane przesłanie. Nie można pobrać informacji o pliku.",
+"Upload failed. Could not find uploaded file" => "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku",
"Invalid directory." => "Zła ścieżka.",
"Files" => "Pliki",
+"Unable to upload {filename} as it is a directory or has 0 bytes" => "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów",
"Not enough space available" => "Za mało miejsca",
"Upload cancelled." => "Wczytywanie anulowane.",
+"Could not get result from server." => "Nie można uzyskać wyniku z serwera.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.",
"URL cannot be empty." => "URL nie może być pusty.",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Nieprawidłowa nazwa folderu. Wykorzystanie 'Shared' jest zarezerwowane przez ownCloud",
@@ -42,6 +46,7 @@ $TRANSLATIONS = array(
"Your storage is almost full ({usedSpacePercent}%)" => "Twój magazyn jest prawie pełny ({usedSpacePercent}%)",
"Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." => "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.",
"Your download is being prepared. This might take some time if the files are big." => "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pliki są duże.",
+"Error moving file" => "Błąd prz przenoszeniu pliku",
"Name" => "Nazwa",
"Size" => "Rozmiar",
"Modified" => "Modyfikacja",
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index fac7cea529a..4aaeca25542 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -18,6 +18,7 @@ $TRANSLATIONS = array(
"Upload cancelled." => "Завантаження перервано.",
"File upload is in progress. Leaving the page now will cancel the upload." => "Виконується завантаження файлу. Закриття цієї сторінки приведе до відміни завантаження.",
"URL cannot be empty." => "URL не може бути пустим.",
+"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Неправильне ім'я теки. Використання 'Shared' зарезервовано ownCloud",
"Error" => "Помилка",
"Share" => "Поділитися",
"Delete permanently" => "Видалити назавжди",
@@ -29,7 +30,7 @@ $TRANSLATIONS = array(
"cancel" => "відміна",
"replaced {new_name} with {old_name}" => "замінено {new_name} на {old_name}",
"undo" => "відмінити",
-"_%n folder_::_%n folders_" => array("","",""),
+"_%n folder_::_%n folders_" => array("%n тека","%n тека","%n теки"),
"_%n file_::_%n files_" => array("","",""),
"_Uploading %n file_::_Uploading %n files_" => array("","",""),
"'.' is an invalid file name." => "'.' це невірне ім'я файлу.",
@@ -53,7 +54,7 @@ $TRANSLATIONS = array(
"Save" => "Зберегти",
"New" => "Створити",
"Text file" => "Текстовий файл",
-"Folder" => "Папка",
+"Folder" => "Тека",
"From link" => "З посилання",
"Deleted files" => "Видалено файлів",
"Cancel upload" => "Перервати завантаження",
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index 08c807d7f7b..709d78a4d45 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -39,8 +39,8 @@ class Helper
}
if($file['isPreviewAvailable']) {
- $relativePath = substr($file['path'], 6);
- return \OC_Helper::previewIcon($relativePath);
+ $pathForPreview = $file['directory'] . '/' . $file['name'];
+ return \OC_Helper::previewIcon($pathForPreview);
}
return \OC_Helper::mimetypeIcon($file['mimetype']);
}
@@ -84,7 +84,7 @@ class Helper
}
}
$i['directory'] = $dir;
- $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
+ $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i;
}
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php
index 09bd96be526..35077e7dc1a 100644
--- a/apps/files/templates/index.php
+++ b/apps/files/templates/index.php
@@ -47,7 +47,7 @@
<input type="hidden" name="permissions" value="<?php p($_['permissions']); ?>" id="permissions">
</div>
-<div id="emptycontent" <?php if (!isset($_['files']) or !$_['isCreatable'] or count($_['files']) > 0 or !$_['ajaxLoad']):?>class="hidden"<?php endif; ?>><?php p($l->t('Nothing in here. Upload something!'))?></div>
+<div id="emptycontent" <?php if (!isset($_['files']) or !$_['isCreatable'] or count($_['files']) > 0 or $_['ajaxLoad']):?>class="hidden"<?php endif; ?>><?php p($l->t('Nothing in here. Upload something!'))?></div>
<input type="hidden" id="disableSharing" data-status="<?php p($_['disableSharing']); ?>"></input>
diff --git a/apps/files_encryption/appinfo/info.xml b/apps/files_encryption/appinfo/info.xml
index 46f1375c987..9d495916d26 100644
--- a/apps/files_encryption/appinfo/info.xml
+++ b/apps/files_encryption/appinfo/info.xml
@@ -7,6 +7,7 @@
<author>Sam Tuke, Bjoern Schiessle, Florin Peter</author>
<require>4</require>
<shipped>true</shipped>
+ <rememberlogin>false</rememberlogin>
<types>
<filesystem/>
</types>
diff --git a/apps/files_encryption/l10n/uk.php b/apps/files_encryption/l10n/uk.php
index e4fb053a71a..5260dd3f2f7 100644
--- a/apps/files_encryption/l10n/uk.php
+++ b/apps/files_encryption/l10n/uk.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"Saving..." => "Зберігаю...",
+"personal settings" => "особисті налаштування",
"Encryption" => "Шифрування",
"Change Password" => "Змінити Пароль"
);
diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php
index 9be3dda7ce3..7143fcff0f6 100755
--- a/apps/files_encryption/lib/keymanager.php
+++ b/apps/files_encryption/lib/keymanager.php
@@ -40,11 +40,14 @@ class Keymanager {
public static function getPrivateKey(\OC_FilesystemView $view, $user) {
$path = '/' . $user . '/' . 'files_encryption' . '/' . $user . '.private.key';
+ $key = false;
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
- $key = $view->file_get_contents($path);
+ if ($view->file_exists($path)) {
+ $key = $view->file_get_contents($path);
+ }
\OC_FileProxy::$enabled = $proxyStatus;
diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php
index eb7ba60cb9d..4ec810a5199 100644
--- a/apps/files_encryption/lib/proxy.php
+++ b/apps/files_encryption/lib/proxy.php
@@ -50,9 +50,8 @@ class Proxy extends \OC_FileProxy {
private static function shouldEncrypt($path) {
if (is_null(self::$enableEncryption)) {
-
if (
- \OCP\Config::getAppValue('files_encryption', 'enable_encryption', 'true') === 'true'
+ \OCP\App::isEnabled('files_encryption') === true
&& Crypt::mode() === 'server'
) {
@@ -200,7 +199,7 @@ class Proxy extends \OC_FileProxy {
*/
public function preUnlink($path) {
- // let the trashbin handle this
+ // let the trashbin handle this
if (\OCP\App::isEnabled('files_trashbin')) {
return true;
}
@@ -291,7 +290,7 @@ class Proxy extends \OC_FileProxy {
// Close the original encrypted file
fclose($result);
- // Open the file using the crypto stream wrapper
+ // Open the file using the crypto stream wrapper
// protocol and let it do the decryption work instead
$result = fopen('crypt://' . $path, $meta['mode']);
diff --git a/apps/files_sharing/l10n/ko.php b/apps/files_sharing/l10n/ko.php
index f3a94a70979..f7eab1ac550 100644
--- a/apps/files_sharing/l10n/ko.php
+++ b/apps/files_sharing/l10n/ko.php
@@ -1,7 +1,14 @@
<?php
$TRANSLATIONS = array(
+"The password is wrong. Try again." => "비밀번호가 틀립니다. 다시 입력해주세요.",
"Password" => "암호",
"Submit" => "제출",
+"Sorry, this link doesn’t seem to work anymore." => "죄송합니다만 이 링크는 더이상 작동되지 않습니다.",
+"Reasons might be:" => "이유는 다음과 같을 수 있습니다:",
+"the item was removed" => "이 항목은 삭제되었습니다",
+"the link expired" => "링크가 만료되었습니다",
+"sharing is disabled" => "공유가 비활성되었습니다",
+"For more info, please ask the person who sent this link." => "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오",
"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
"Download" => "다운로드",
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 33cd1428899..123268e240a 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -20,6 +20,7 @@
*/
namespace OC\Files\Cache;
+use OCP\Share_Backend_Collection;
/**
* Metadata cache for shared files
@@ -226,7 +227,36 @@ class Shared_Cache extends Cache {
* @return array of file data
*/
public function search($pattern) {
- // TODO
+
+ // normalize pattern
+ $pattern = $this->normalize($pattern);
+
+ $ids = $this->getAll();
+
+ $files = array();
+
+ // divide into 1k chunks
+ $chunks = array_chunk($ids, 1000);
+
+ foreach ($chunks as $chunk) {
+ $placeholders = join(',', array_fill(0, count($chunk), '?'));
+
+ $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
+ `encrypted`, `unencrypted_size`, `etag`
+ FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `fileid` IN (' . $placeholders . ')';
+
+ $result = \OC_DB::executeAudited($sql, array_merge(array($pattern), $chunk));
+
+ while ($row = $result->fetchRow()) {
+ if (substr($row['path'], 0, 6)==='files/') {
+ $row['path'] = substr($row['path'],6); // remove 'files/' from path as it's relative to '/Shared'
+ }
+ $row['mimetype'] = $this->getMimetype($row['mimetype']);
+ $row['mimepart'] = $this->getMimetype($row['mimepart']);
+ $files[] = $row;
+ }
+ }
+ return $files;
}
/**
@@ -244,13 +274,30 @@ class Shared_Cache extends Cache {
}
$mimetype = $this->getMimetypeId($mimetype);
$ids = $this->getAll();
- $placeholders = join(',', array_fill(0, count($ids), '?'));
- $query = \OC_DB::prepare('
- SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`
- FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')'
- );
- $result = $query->execute(array_merge(array($mimetype), $ids));
- return $result->fetchAll();
+
+ $files = array();
+
+ // divide into 1k chunks
+ $chunks = array_chunk($ids, 1000);
+
+ foreach ($chunks as $chunk) {
+ $placeholders = join(',', array_fill(0, count($ids), '?'));
+ $sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
+ `encrypted`, `unencrypted_size`, `etag`
+ FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `fileid` IN (' . $placeholders . ')';
+
+ $result = \OC_DB::executeAudited($sql, array_merge(array($mimetype), $chunk));
+
+ while ($row = $result->fetchRow()) {
+ if (substr($row['path'], 0, 6)==='files/') {
+ $row['path'] = substr($row['path'],6); // remove 'files/' from path as it's relative to '/Shared'
+ }
+ $row['mimetype'] = $this->getMimetype($row['mimetype']);
+ $row['mimepart'] = $this->getMimetype($row['mimepart']);
+ $files[] = $row;
+ }
+ }
+ return $files;
}
/**
@@ -272,7 +319,20 @@ class Shared_Cache extends Cache {
* @return int[]
*/
public function getAll() {
- return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
+ $ids = \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_GET_ALL);
+ $folderBackend = \OCP\Share::getBackend('folder');
+ if ($folderBackend instanceof Share_Backend_Collection) {
+ foreach ($ids as $file) {
+ /** @var $folderBackend Share_Backend_Collection */
+ $children = $folderBackend->getChildren($file);
+ foreach ($children as $child) {
+ $ids[] = (int)$child['source'];
+ }
+
+ }
+ }
+
+ return $ids;
}
/**
diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php
index 136767aeb45..eff38dcc0fd 100644
--- a/apps/files_sharing/public.php
+++ b/apps/files_sharing/public.php
@@ -188,7 +188,7 @@ if (isset($path)) {
} else {
$i['extension'] = '';
}
- $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($i['mimetype']);
+ $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($i['mimetype']);
}
$i['directory'] = $getPath;
$i['permissions'] = OCP\PERMISSION_READ;
diff --git a/apps/files_trashbin/l10n/hu_HU.php b/apps/files_trashbin/l10n/hu_HU.php
index aac6cf78000..766ddcbce4d 100644
--- a/apps/files_trashbin/l10n/hu_HU.php
+++ b/apps/files_trashbin/l10n/hu_HU.php
@@ -8,8 +8,8 @@ $TRANSLATIONS = array(
"Delete permanently" => "Végleges törlés",
"Name" => "Név",
"Deleted" => "Törölve",
-"_%n folder_::_%n folders_" => array("",""),
-"_%n file_::_%n files_" => array("",""),
+"_%n folder_::_%n folders_" => array("","%n mappa"),
+"_%n file_::_%n files_" => array("","%n állomány"),
"restored" => "visszaállítva",
"Nothing in here. Your trash bin is empty!" => "Itt nincs semmi. Az Ön szemetes mappája üres!",
"Restore" => "Visszaállítás",
diff --git a/apps/files_trashbin/l10n/ko.php b/apps/files_trashbin/l10n/ko.php
index f2e604d7591..9ac5f9802c6 100644
--- a/apps/files_trashbin/l10n/ko.php
+++ b/apps/files_trashbin/l10n/ko.php
@@ -1,11 +1,19 @@
<?php
$TRANSLATIONS = array(
+"Couldn't delete %s permanently" => "%s를 영구적으로 삭제할수 없습니다",
+"Couldn't restore %s" => "%s를 복원할수 없습니다",
+"perform restore operation" => "복원 작업중",
"Error" => "오류",
+"delete file permanently" => "영구적으로 파일 삭제하기",
"Delete permanently" => "영원히 삭제",
"Name" => "이름",
-"_%n folder_::_%n folders_" => array(""),
-"_%n file_::_%n files_" => array(""),
+"Deleted" => "삭제됨",
+"_%n folder_::_%n folders_" => array("폴더 %n개"),
+"_%n file_::_%n files_" => array("파일 %n개 "),
+"restored" => "복원됨",
+"Nothing in here. Your trash bin is empty!" => "현재 휴지통은 비어있습니다!",
"Restore" => "복원",
-"Delete" => "삭제"
+"Delete" => "삭제",
+"Deleted Files" => "삭제된 파일들"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php
index 99f534565f9..4f442ee9304 100644
--- a/apps/files_trashbin/lib/helper.php
+++ b/apps/files_trashbin/lib/helper.php
@@ -61,7 +61,7 @@ class Helper
$i['directory'] = '';
}
$i['permissions'] = \OCP\PERMISSION_READ;
- $i['isPreviewAvailable'] = \OCP\Preview::isMimeSupported($r['mime']);
+ $i['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($r['mime']);
$i['icon'] = \OCA\Files\Helper::determineIcon($i);
$files[] = $i;
}
diff --git a/apps/files_versions/l10n/ko.php b/apps/files_versions/l10n/ko.php
index 365adc25115..ba951c4107a 100644
--- a/apps/files_versions/l10n/ko.php
+++ b/apps/files_versions/l10n/ko.php
@@ -2,6 +2,9 @@
$TRANSLATIONS = array(
"Could not revert: %s" => "되돌릴 수 없습니다: %s",
"Versions" => "버전",
+"Failed to revert {file} to revision {timestamp}." => "{timestamp} 판의 {file}로 돌리는데 실패했습니다.",
+"More versions..." => "더 많은 버전들...",
+"No other versions available" => "다른 버전을 사용할수 없습니다",
"Restore" => "복원"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_ldap/l10n/hu_HU.php b/apps/user_ldap/l10n/hu_HU.php
index 6961869f3e0..b43dcbc2c87 100644
--- a/apps/user_ldap/l10n/hu_HU.php
+++ b/apps/user_ldap/l10n/hu_HU.php
@@ -16,6 +16,7 @@ $TRANSLATIONS = array(
"Connection test failed" => "A kapcsolatellenőrzés eredménye: nem sikerült",
"Do you really want to delete the current Server Configuration?" => "Tényleg törölni szeretné a kiszolgáló beállításait?",
"Confirm Deletion" => "A törlés megerősítése",
+"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." => "<b>Figyelem:</b> a user_ldap és user_webdavauth alkalmazások nem kompatibilisek. Együttes használatuk váratlan eredményekhez vezethet. Kérje meg a rendszergazdát, hogy a kettő közül kapcsolja ki az egyiket.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Figyelmeztetés:</b> Az LDAP PHP modul nincs telepítve, ezért ez az alrendszer nem fog működni. Kérje meg a rendszergazdát, hogy telepítse!",
"Server configuration" => "A kiszolgálók beállításai",
"Add Server Configuration" => "Új kiszolgáló beállításának hozzáadása",
@@ -29,8 +30,11 @@ $TRANSLATIONS = array(
"Password" => "Jelszó",
"For anonymous access, leave DN and Password empty." => "Bejelentkezés nélküli eléréshez ne töltse ki a DN és Jelszó mezőket!",
"User Login Filter" => "Szűrő a bejelentkezéshez",
+"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "Ez a szűrő érvényes a bejelentkezés megkísérlésekor. Ekkor az %%uid változó helyére a bejelentkezési név kerül. Például: \"uid=%%uid\"",
"User List Filter" => "A felhasználók szűrője",
+"Defines the filter to apply, when retrieving users (no placeholders). Example: \"objectClass=person\"" => "Ez a szűrő érvényes a felhasználók listázásakor (nincs helyettesíthető változó). Például: \"objectClass=person\"",
"Group Filter" => "A csoportok szűrője",
+"Defines the filter to apply, when retrieving groups (no placeholders). Example: \"objectClass=posixGroup\"" => "Ez a szűrő érvényes a csoportok listázásakor (nincs helyettesíthető változó). Például: \"objectClass=posixGroup\"",
"Connection Settings" => "Kapcsolati beállítások",
"Configuration Active" => "A beállítás aktív",
"When unchecked, this configuration will be skipped." => "Ha nincs kipipálva, ez a beállítás kihagyódik.",
@@ -39,19 +43,23 @@ $TRANSLATIONS = array(
"Give an optional backup host. It must be a replica of the main LDAP/AD server." => "Adjon meg egy opcionális másodkiszolgálót. Ez a fő LDAP/AD kiszolgáló szinkron másolata (replikája) kell legyen.",
"Backup (Replica) Port" => "A másodkiszolgáló (replika) portszáma",
"Disable Main Server" => "A fő szerver kihagyása",
+"Only connect to the replica server." => "Csak a másodlagos (másolati) kiszolgálóhoz kapcsolódjunk.",
"Use TLS" => "Használjunk TLS-t",
"Do not use it additionally for LDAPS connections, it will fail." => "LDAPS kapcsolatok esetén ne kapcsoljuk be, mert nem fog működni.",
"Case insensitve LDAP server (Windows)" => "Az LDAP-kiszolgáló nem tesz különbséget a kis- és nagybetűk között (Windows)",
"Turn off SSL certificate validation." => "Ne ellenőrizzük az SSL-tanúsítvány érvényességét",
+"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "Használata nem javasolt (kivéve tesztelési céllal). Ha a kapcsolat csak ezzel a beállítással működik, akkor importálja az LDAP-kiszolgáló SSL tanúsítványát a(z) %s kiszolgálóra!",
"Cache Time-To-Live" => "A gyorsítótár tárolási időtartama",
"in seconds. A change empties the cache." => "másodpercben. A változtatás törli a cache tartalmát.",
"Directory Settings" => "Címtár beállítások",
"User Display Name Field" => "A felhasználónév mezője",
+"The LDAP attribute to use to generate the user's display name." => "Ebből az LDAP attribútumból képződik a felhasználó megjelenítendő neve.",
"Base User Tree" => "A felhasználói fa gyökere",
"One User Base DN per line" => "Soronként egy felhasználói fa gyökerét adhatjuk meg",
"User Search Attributes" => "A felhasználók lekérdezett attribútumai",
"Optional; one attribute per line" => "Nem kötelező megadni, soronként egy attribútum",
"Group Display Name Field" => "A csoport nevének mezője",
+"The LDAP attribute to use to generate the groups's display name." => "Ebből az LDAP attribútumból képződik a csoport megjelenítendő neve.",
"Base Group Tree" => "A csoportfa gyökere",
"One Group Base DN per line" => "Soronként egy csoportfa gyökerét adhatjuk meg",
"Group Search Attributes" => "A csoportok lekérdezett attribútumai",
@@ -64,6 +72,7 @@ $TRANSLATIONS = array(
"User Home Folder Naming Rule" => "A home könyvtár elérési útvonala",
"Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." => "Hagyja üresen, ha a felhasználónevet kívánja használni. Ellenkező esetben adjon meg egy LDAP/AD attribútumot!",
"Internal Username" => "Belső felhasználónév",
+"By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." => "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve...............................",
"Internal Username Attribute:" => "A belső felhasználónév attribútuma:",
"Override UUID detection" => "Az UUID-felismerés felülbírálása",
"UUID Attribute:" => "UUID attribútum:",
diff --git a/apps/user_webdavauth/l10n/hu_HU.php b/apps/user_webdavauth/l10n/hu_HU.php
index 63fc084ff4c..0b946e25e70 100644
--- a/apps/user_webdavauth/l10n/hu_HU.php
+++ b/apps/user_webdavauth/l10n/hu_HU.php
@@ -1,5 +1,7 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV hitelesítés"
+"WebDAV Authentication" => "WebDAV hitelesítés",
+"Address: " => "Címek:",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/autotest.sh b/autotest.sh
index a343f6a25ab..83f184fa9c0 100755
--- a/autotest.sh
+++ b/autotest.sh
@@ -142,12 +142,7 @@ EOF
rm -rf coverage-html-$1
mkdir coverage-html-$1
php -f enable_all.php
- if [ "$1" == "sqlite" ] ; then
- # coverage only with sqlite - causes segfault on ci.tmit.eu - reason unknown
- phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 $2 $3
- else
- phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml $2 $3
- fi
+ phpunit --configuration phpunit-autotest.xml --log-junit autotest-results-$1.xml --coverage-clover autotest-clover-$1.xml --coverage-html coverage-html-$1 $2 $3
}
#
diff --git a/core/avatar/controller.php b/core/avatar/controller.php
index 9f7c0517c4a..22693824461 100644
--- a/core/avatar/controller.php
+++ b/core/avatar/controller.php
@@ -33,7 +33,7 @@ class Controller {
$image->show();
} else {
// Signalizes $.avatar() to display a defaultavatar
- \OC_JSON::success();
+ \OC_JSON::success(array("data"=> array("displayname"=> \OC_User::getDisplayName($user)) ));
}
}
diff --git a/core/css/apps.css b/core/css/apps.css
index de63495e50e..f6c20e6cc6a 100644
--- a/core/css/apps.css
+++ b/core/css/apps.css
@@ -16,6 +16,7 @@
-moz-box-sizing: border-box; box-sizing: border-box;
background-color: #f8f8f8;
border-right: 1px solid #ccc;
+ padding-bottom: 44px;
}
#app-navigation > ul {
height: 100%;
@@ -192,7 +193,7 @@
.settings-button {
display: block;
- height: 32px;
+ height: 44px;
width: 100%;
padding: 0;
margin: 0;
diff --git a/core/js/jquery.avatar.js b/core/js/jquery.avatar.js
index f1382fd7d2d..88a4c25d1ee 100644
--- a/core/js/jquery.avatar.js
+++ b/core/js/jquery.avatar.js
@@ -69,7 +69,11 @@
var url = OC.Router.generate('core_avatar_get', {user: user, size: size})+'?requesttoken='+oc_requesttoken;
$.get(url, function(result) {
if (typeof(result) === 'object') {
- $div.placeholder(user);
+ if (result.data && result.data.displayname) {
+ $div.placeholder(user, result.data.displayname);
+ } else {
+ $div.placeholder(user);
+ }
} else {
if (ie8fix === true) {
$div.html('<img src="'+url+'#'+Math.floor(Math.random()*1000)+'">');
diff --git a/core/js/placeholder.js b/core/js/placeholder.js
index d63730547d7..ee2a8ce84c4 100644
--- a/core/js/placeholder.js
+++ b/core/js/placeholder.js
@@ -36,10 +36,21 @@
*
* <div id="albumart" style="background-color: hsl(123, 90%, 65%); ... ">T</div>
*
+ * You may also call it like this, to have a different background, than the seed:
+ *
+ * $('#albumart').placeholder('The Album Title', 'Album Title');
+ *
+ * Resulting in:
+ *
+ * <div id="albumart" style="background-color: hsl(123, 90%, 65%); ... ">A</div>
+ *
*/
(function ($) {
- $.fn.placeholder = function(seed) {
+ $.fn.placeholder = function(seed, text) {
+ // set optional argument "text" to value of "seed" if undefined
+ text = text || seed;
+
var hash = md5(seed),
maxRange = parseInt('ffffffffffffffffffffffffffffffff', 16),
hue = parseInt(hash, 16) / maxRange * 256,
@@ -56,7 +67,7 @@
this.css('font-size', (height * 0.55) + 'px');
if(seed !== null && seed.length) {
- this.html(seed[0].toUpperCase());
+ this.html(text[0].toUpperCase());
}
};
}(jQuery));
diff --git a/core/js/share.js b/core/js/share.js
index b366665ed3f..8d14520cd74 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -175,10 +175,10 @@ OC.Share={
var allowPublicUploadStatus = false;
$.each(data.shares, function(key, value) {
- if (allowPublicUploadStatus) {
+ if (value.share_type === OC.Share.SHARE_TYPE_LINK) {
+ allowPublicUploadStatus = (value.permissions & OC.PERMISSION_CREATE) ? true : false;
return true;
}
- allowPublicUploadStatus = (value.permissions & OC.PERMISSION_CREATE) ? true : false;
});
html += '<input id="shareWith" type="text" placeholder="'+t('core', 'Share with')+'" />';
diff --git a/core/l10n/cs_CZ.php b/core/l10n/cs_CZ.php
index 449a49f5686..8b63079c87a 100644
--- a/core/l10n/cs_CZ.php
+++ b/core/l10n/cs_CZ.php
@@ -59,7 +59,10 @@ $TRANSLATIONS = array(
"Ok" => "Ok",
"Error loading message template: {error}" => "Chyba při nahrávání šablony zprávy: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
+"One file conflict" => "Jeden konflikt souboru",
+"Which files do you want to keep?" => "Které soubory chcete ponechat?",
"Cancel" => "Zrušit",
+"Continue" => "Pokračovat",
"The object type is not specified." => "Není určen typ objektu.",
"Error" => "Chyba",
"The app name is not specified." => "Není určen název aplikace.",
diff --git a/core/l10n/da.php b/core/l10n/da.php
index e2399fdc5cc..8938f2107fa 100644
--- a/core/l10n/da.php
+++ b/core/l10n/da.php
@@ -16,6 +16,8 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Fejl ved tilføjelse af %s til favoritter.",
"No categories selected for deletion." => "Ingen kategorier valgt",
"Error removing %s from favorites." => "Fejl ved fjernelse af %s fra favoritter.",
+"Unknown filetype" => "Ukendt filtype",
+"Invalid image" => "Ugyldigt billede",
"Sunday" => "Søndag",
"Monday" => "Mandag",
"Tuesday" => "Tirsdag",
diff --git a/core/l10n/en_GB.php b/core/l10n/en_GB.php
index feeacd481a8..bb26f1469dd 100644
--- a/core/l10n/en_GB.php
+++ b/core/l10n/en_GB.php
@@ -58,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "No",
"Ok" => "OK",
"Error loading message template: {error}" => "Error loading message template: {error}",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} file conflict","{count} file conflicts"),
+"One file conflict" => "One file conflict",
+"Which files do you want to keep?" => "Which files do you wish to keep?",
+"If you select both versions, the copied file will have a number added to its name." => "If you select both versions, the copied file will have a number added to its name.",
"Cancel" => "Cancel",
+"Continue" => "Continue",
+"(all selected)" => "(all selected)",
+"({count} selected)" => "({count} selected)",
+"Error loading file exists template" => "Error loading file exists template",
"The object type is not specified." => "The object type is not specified.",
"Error" => "Error",
"The app name is not specified." => "The app name is not specified.",
diff --git a/core/l10n/fr.php b/core/l10n/fr.php
index d3229ddf994..e7cb75e53f0 100644
--- a/core/l10n/fr.php
+++ b/core/l10n/fr.php
@@ -19,6 +19,8 @@ $TRANSLATIONS = array(
"No image or file provided" => "Aucune image ou fichier fourni",
"Unknown filetype" => "Type de fichier inconnu",
"Invalid image" => "Image invalide",
+"No temporary profile picture available, try again" => "Aucune image temporaire disponible pour le profil. Essayez à nouveau.",
+"No crop data provided" => "Aucune donnée de culture fournie",
"Sunday" => "Dimanche",
"Monday" => "Lundi",
"Tuesday" => "Mardi",
@@ -56,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "Non",
"Ok" => "Ok",
"Error loading message template: {error}" => "Erreur de chargement du modèle de message : {error}",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} fichier en conflit","{count} fichiers en conflit"),
+"One file conflict" => "Un conflit de fichier",
+"Which files do you want to keep?" => "Quels fichiers désirez-vous garder ?",
+"If you select both versions, the copied file will have a number added to its name." => "Si vous sélectionnez les deux versions, un nombre sera ajouté au nom du fichier copié.",
"Cancel" => "Annuler",
+"Continue" => "Poursuivre",
+"(all selected)" => "(tous sélectionnés)",
+"({count} selected)" => "({count} sélectionnés)",
+"Error loading file exists template" => "Erreur de chargement du modèle de fichier existant",
"The object type is not specified." => "Le type d'objet n'est pas spécifié.",
"Error" => "Erreur",
"The app name is not specified." => "Le nom de l'application n'est pas spécifié.",
diff --git a/core/l10n/gl.php b/core/l10n/gl.php
index 9ba5ab645aa..e3be94537e5 100644
--- a/core/l10n/gl.php
+++ b/core/l10n/gl.php
@@ -58,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "Non",
"Ok" => "Aceptar",
"Error loading message template: {error}" => "Produciuse un erro ao cargar o modelo da mensaxe: {error}",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} conflito de ficheiro","{count} conflitos de ficheiros"),
+"One file conflict" => "Un conflito de ficheiro",
+"Which files do you want to keep?" => "Que ficheiros quere conservar?",
+"If you select both versions, the copied file will have a number added to its name." => "Se selecciona ambas versións, o ficheiro copiado terá un número engadido ao nome.",
"Cancel" => "Cancelar",
+"Continue" => "Continuar",
+"(all selected)" => "(todo o seleccionado)",
+"({count} selected)" => "({count} seleccionados)",
+"Error loading file exists template" => "Produciuse un erro ao cargar o modelo de ficheiro existente",
"The object type is not specified." => "Non se especificou o tipo de obxecto.",
"Error" => "Erro",
"The app name is not specified." => "Non se especificou o nome do aplicativo.",
diff --git a/core/l10n/hu_HU.php b/core/l10n/hu_HU.php
index d893269ee81..107a5f04c05 100644
--- a/core/l10n/hu_HU.php
+++ b/core/l10n/hu_HU.php
@@ -2,6 +2,12 @@
$TRANSLATIONS = array(
"%s shared »%s« with you" => "%s megosztotta Önnel ezt: »%s«",
"group" => "csoport",
+"Turned on maintenance mode" => "A karbantartási mód bekapcsolva",
+"Turned off maintenance mode" => "A karbantartási mód kikapcsolva",
+"Updated database" => "Frissítet adatbázis",
+"Updating filecache, this may take really long..." => "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat...",
+"Updated filecache" => "Filecache frissítve",
+"... %d%% done ..." => "... %d%% kész ...",
"Category type not provided." => "Nincs megadva a kategória típusa.",
"No category to add?" => "Nincs hozzáadandó kategória?",
"This category already exists: %s" => "Ez a kategória már létezik: %s",
@@ -10,6 +16,11 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Nem sikerült a kedvencekhez adni ezt: %s",
"No categories selected for deletion." => "Nincs törlésre jelölt kategória",
"Error removing %s from favorites." => "Nem sikerült a kedvencekből törölni ezt: %s",
+"No image or file provided" => "Nincs kép vagy file megadva",
+"Unknown filetype" => "Ismeretlen file tipús",
+"Invalid image" => "Hibás kép",
+"No temporary profile picture available, try again" => "Az átmeneti profil kép nem elérhető, próbáld újra",
+"No crop data provided" => "Vágáshoz nincs adat megadva",
"Sunday" => "vasárnap",
"Monday" => "hétfő",
"Tuesday" => "kedd",
@@ -42,11 +53,20 @@ $TRANSLATIONS = array(
"last year" => "tavaly",
"years ago" => "több éve",
"Choose" => "Válasszon",
+"Error loading file picker template: {error}" => "Nem sikerült betölteni a fájlkiválasztó sablont: {error}",
"Yes" => "Igen",
"No" => "Nem",
"Ok" => "Ok",
+"Error loading message template: {error}" => "Nem sikerült betölteni az üzenet sablont: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"One file conflict" => "Egy file ütközik",
+"Which files do you want to keep?" => "Melyik file-okat akarod megtartani?",
+"If you select both versions, the copied file will have a number added to its name." => "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz.",
"Cancel" => "Mégsem",
+"Continue" => "Folytatás",
+"(all selected)" => "(all selected)",
+"({count} selected)" => "({count} kiválasztva)",
+"Error loading file exists template" => "Hiba a létező sablon betöltésekor",
"The object type is not specified." => "Az objektum típusa nincs megadva.",
"Error" => "Hiba",
"The app name is not specified." => "Az alkalmazás neve nincs megadva.",
@@ -85,6 +105,7 @@ $TRANSLATIONS = array(
"Email sent" => "Az emailt elküldtük",
"The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud community</a>." => "A frissítés nem sikerült. Kérem értesítse erről a problémáról az <a href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud közösséget</a>.",
"The update was successful. Redirecting you to ownCloud now." => "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatáshoz.",
+"%s password reset" => "%s jelszó visszaállítás",
"Use the following link to reset your password: {link}" => "Használja ezt a linket a jelszó ismételt beállításához: {link}",
"The link to reset your password has been sent to your email.<br>If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator ." => "Emailben fog kapni egy linket, amivel új jelszót tud majd beállítani magának. <br>Ha a levél nem jött meg, holott úgy érzi, hogy már meg kellett volna érkeznie, akkor ellenőrizze a spam/levélszemét mappáját. <br>Ha ott sincsen, akkor érdeklődjön a rendszergazdánál.",
"Request failed!<br>Did you make sure your email/username was right?" => "A kérést nem sikerült teljesíteni! <br>Biztos, hogy jó emailcímet/felhasználónevet adott meg?",
diff --git a/core/l10n/it.php b/core/l10n/it.php
index 94395b02261..bd2fad79c87 100644
--- a/core/l10n/it.php
+++ b/core/l10n/it.php
@@ -53,18 +53,18 @@ $TRANSLATIONS = array(
"last year" => "anno scorso",
"years ago" => "anni fa",
"Choose" => "Scegli",
-"Error loading file picker template: {error}" => "Errore nel caricamento del modello del selettore file: {error}",
+"Error loading file picker template: {error}" => "Errore durante il caricamento del modello del selettore file: {error}",
"Yes" => "Sì",
"No" => "No",
"Ok" => "Ok",
-"Error loading message template: {error}" => "Errore nel caricamento del modello di messaggio: {error}",
+"Error loading message template: {error}" => "Errore durante il caricamento del modello di messaggio: {error}",
"_{count} file conflict_::_{count} file conflicts_" => array("{count} file in conflitto","{count} file in conflitto"),
-"One file conflict" => "Un conflitto tra file",
+"One file conflict" => "Un file in conflitto",
"Which files do you want to keep?" => "Quali file vuoi mantenere?",
-"If you select both versions, the copied file will have a number added to its name." => "Se selezioni entrambe le versioni, verrà aggiunto un numero al nome del file copiato.",
+"If you select both versions, the copied file will have a number added to its name." => "Se selezioni entrambe le versioni, sarà aggiunto un numero al nome del file copiato.",
"Cancel" => "Annulla",
"Continue" => "Continua",
-"(all selected)" => "(tutti selezionati)",
+"(all selected)" => "(tutti i selezionati)",
"({count} selected)" => "({count} selezionati)",
"Error loading file exists template" => "Errore durante il caricamento del modello del file esistente",
"The object type is not specified." => "Il tipo di oggetto non è specificato.",
diff --git a/core/l10n/ja_JP.php b/core/l10n/ja_JP.php
index 0baab441f95..110e5b21201 100644
--- a/core/l10n/ja_JP.php
+++ b/core/l10n/ja_JP.php
@@ -20,6 +20,7 @@ $TRANSLATIONS = array(
"Unknown filetype" => "不明なファイルタイプ",
"Invalid image" => "無効な画像",
"No temporary profile picture available, try again" => "一時的なプロファイル用画像が利用できません。もう一度試して下さい",
+"No crop data provided" => "クロップデータは提供されません",
"Sunday" => "日",
"Monday" => "月",
"Tuesday" => "火",
@@ -57,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "いいえ",
"Ok" => "OK",
"Error loading message template: {error}" => "メッセージテンプレートの読み込みエラー: {error}",
-"_{count} file conflict_::_{count} file conflicts_" => array(""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} ファイルが競合"),
+"One file conflict" => "1ファイルが競合",
+"Which files do you want to keep?" => "どちらのファイルを保持したいですか?",
+"If you select both versions, the copied file will have a number added to its name." => "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。",
"Cancel" => "キャンセル",
+"Continue" => "続ける",
+"(all selected)" => "(全て選択)",
+"({count} selected)" => "({count} 選択)",
+"Error loading file exists template" => "既存ファイルのテンプレートの読み込みエラー",
"The object type is not specified." => "オブジェクタイプが指定されていません。",
"Error" => "エラー",
"The app name is not specified." => "アプリ名がしていされていません。",
diff --git a/core/l10n/lt_LT.php b/core/l10n/lt_LT.php
index 492aee12c1d..610e7aeadeb 100644
--- a/core/l10n/lt_LT.php
+++ b/core/l10n/lt_LT.php
@@ -58,8 +58,15 @@ $TRANSLATIONS = array(
"No" => "Ne",
"Ok" => "Gerai",
"Error loading message template: {error}" => "Klaida įkeliant žinutės ruošinį: {error}",
-"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} failas konfliktuoja","{count} failai konfliktuoja","{count} failų konfliktų"),
+"One file conflict" => "Vienas failo konfliktas",
+"Which files do you want to keep?" => "Kuriuos failus norite laikyti?",
+"If you select both versions, the copied file will have a number added to its name." => "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime.",
"Cancel" => "Atšaukti",
+"Continue" => "Tęsti",
+"(all selected)" => "(visi pažymėti)",
+"({count} selected)" => "({count} pažymėtų)",
+"Error loading file exists template" => "Klaida įkeliant esančių failų ruošinį",
"The object type is not specified." => "Objekto tipas nenurodytas.",
"Error" => "Klaida",
"The app name is not specified." => "Nenurodytas programos pavadinimas.",
diff --git a/core/l10n/nn_NO.php b/core/l10n/nn_NO.php
index 8ec3892a8ac..d596605dbcd 100644
--- a/core/l10n/nn_NO.php
+++ b/core/l10n/nn_NO.php
@@ -16,6 +16,11 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Klarte ikkje leggja til %s i favorittar.",
"No categories selected for deletion." => "Ingen kategoriar valt for sletting.",
"Error removing %s from favorites." => "Klarte ikkje fjerna %s frå favorittar.",
+"No image or file provided" => "Inga bilete eller fil gitt",
+"Unknown filetype" => "Ukjend filtype",
+"Invalid image" => "Ugyldig bilete",
+"No temporary profile picture available, try again" => "Inga midlertidig profilbilete tilgjengeleg, prøv igjen",
+"No crop data provided" => "Ingen beskjeringsdata gitt",
"Sunday" => "Søndag",
"Monday" => "Måndag",
"Tuesday" => "Tysdag",
@@ -48,11 +53,20 @@ $TRANSLATIONS = array(
"last year" => "i fjor",
"years ago" => "år sidan",
"Choose" => "Vel",
+"Error loading file picker template: {error}" => "Klarte ikkje å lasta filplukkarmal: {error}",
"Yes" => "Ja",
"No" => "Nei",
"Ok" => "Greitt",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"Error loading message template: {error}" => "Klarte ikkje å lasta meldingsmal: {error}",
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} filkonflikt","{count} filkonfliktar"),
+"One file conflict" => "Éin filkonflikt",
+"Which files do you want to keep?" => "Kva filer vil du spara?",
+"If you select both versions, the copied file will have a number added to its name." => "Viss du vel begge utgåvene, vil den kopierte fila få eit tal lagt til namnet.",
"Cancel" => "Avbryt",
+"Continue" => "Gå vidare",
+"(all selected)" => "(alle valte)",
+"({count} selected)" => "({count} valte)",
+"Error loading file exists template" => "Klarte ikkje å lasta fil-finst-mal",
"The object type is not specified." => "Objekttypen er ikkje spesifisert.",
"Error" => "Feil",
"The app name is not specified." => "Programnamnet er ikkje spesifisert.",
diff --git a/core/l10n/pl.php b/core/l10n/pl.php
index 621038f79f7..ad467fe100e 100644
--- a/core/l10n/pl.php
+++ b/core/l10n/pl.php
@@ -16,6 +16,8 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Błąd podczas dodawania %s do ulubionych.",
"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia.",
"Error removing %s from favorites." => "Błąd podczas usuwania %s z ulubionych.",
+"Unknown filetype" => "Nieznany typ pliku",
+"Invalid image" => "Nieprawidłowe zdjęcie",
"Sunday" => "Niedziela",
"Monday" => "Poniedziałek",
"Tuesday" => "Wtorek",
@@ -51,8 +53,12 @@ $TRANSLATIONS = array(
"Yes" => "Tak",
"No" => "Nie",
"Ok" => "OK",
-"_{count} file conflict_::_{count} file conflicts_" => array("","",""),
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} konfliktów plików","{count} konfliktów plików","{count} konfliktów plików"),
+"One file conflict" => "Konflikt pliku",
"Cancel" => "Anuluj",
+"Continue" => "Kontynuuj ",
+"(all selected)" => "(wszystkie zaznaczone)",
+"({count} selected)" => "({count} zaznaczonych)",
"The object type is not specified." => "Nie określono typu obiektu.",
"Error" => "Błąd",
"The app name is not specified." => "Nie określono nazwy aplikacji.",
diff --git a/core/l10n/sv.php b/core/l10n/sv.php
index 660cab0a620..0ea3259df68 100644
--- a/core/l10n/sv.php
+++ b/core/l10n/sv.php
@@ -16,6 +16,11 @@ $TRANSLATIONS = array(
"Error adding %s to favorites." => "Fel vid tillägg av %s till favoriter.",
"No categories selected for deletion." => "Inga kategorier valda för radering.",
"Error removing %s from favorites." => "Fel vid borttagning av %s från favoriter.",
+"No image or file provided" => "Ingen bild eller fil har tillhandahållits",
+"Unknown filetype" => "Okänd filtyp",
+"Invalid image" => "Ogiltig bild",
+"No temporary profile picture available, try again" => "Ingen temporär profilbild finns tillgänglig, försök igen",
+"No crop data provided" => "Ingen beskärdata har angivits",
"Sunday" => "Söndag",
"Monday" => "Måndag",
"Tuesday" => "Tisdag",
@@ -48,11 +53,20 @@ $TRANSLATIONS = array(
"last year" => "förra året",
"years ago" => "år sedan",
"Choose" => "Välj",
+"Error loading file picker template: {error}" => "Fel uppstod för filväljarmall: {error}",
"Yes" => "Ja",
"No" => "Nej",
"Ok" => "Ok",
-"_{count} file conflict_::_{count} file conflicts_" => array("",""),
+"Error loading message template: {error}" => "Fel uppstod under inläsningen av meddelandemallen: {error}",
+"_{count} file conflict_::_{count} file conflicts_" => array("{count} filkonflikt","{count} filkonflikter"),
+"One file conflict" => "En filkonflikt",
+"Which files do you want to keep?" => "Vilken fil vill du behålla?",
+"If you select both versions, the copied file will have a number added to its name." => "Om du väljer båda versionerna kommer de kopierade filerna ha nummer tillagda i filnamnet.",
"Cancel" => "Avbryt",
+"Continue" => "Fortsätt",
+"(all selected)" => "(Alla valda)",
+"({count} selected)" => "({count} valda)",
+"Error loading file exists template" => "Fel uppstod filmall existerar",
"The object type is not specified." => "Objekttypen är inte specificerad.",
"Error" => "Fel",
"The app name is not specified." => " Namnet på appen är inte specificerad.",
diff --git a/core/templates/login.php b/core/templates/login.php
index ee761f0aa52..06f64d41e39 100644
--- a/core/templates/login.php
+++ b/core/templates/login.php
@@ -32,9 +32,10 @@
<?php p($l->t('Lost your password?')); ?>
</a>
<?php endif; ?>
-
+ <?php if ($_['rememberLoginAllowed'] === true) : ?>
<input type="checkbox" name="remember_login" value="1" id="remember_login" checked />
<label for="remember_login"><?php p($l->t('remember')); ?></label>
+ <?php endif; ?>
<input type="hidden" name="timezone-offset" id="timezone-offset"/>
<input type="submit" id="submit" class="login primary" value="<?php p($l->t('Log in')); ?>"/>
</fieldset>
diff --git a/cron.php b/cron.php
index d39800c8849..8e1a3376d53 100644
--- a/cron.php
+++ b/cron.php
@@ -79,7 +79,7 @@ try {
// We call ownCloud from the CLI (aka cron)
if ($appmode != 'cron') {
- // Use cron in feature!
+ // Use cron in future!
OC_BackgroundJob::setExecutionType('cron');
}
diff --git a/index.php b/index.php
index 90fd3efcc96..40063fa6e05 100755
--- a/index.php
+++ b/index.php
@@ -31,7 +31,7 @@ try {
} catch (Exception $ex) {
//show the user a detailed error page
- OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
\OCP\Util::writeLog('index', $ex->getMessage(), \OCP\Util::FATAL);
+ OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR);
OC_Template::printExceptionErrorPage($ex);
}
diff --git a/l10n/ca/files.po b/l10n/ca/files.po
index 173aeb30aca..82091cf75b3 100644
--- a/l10n/ca/files.po
+++ b/l10n/ca/files.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 15:10+0000\n"
+"Last-Translator: rogerc\n"
"Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,23 +78,23 @@ msgstr "No hi ha prou espai disponible"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "La pujada ha fallat. El fitxer pujat no s'ha trobat."
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Directori no vàlid."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Fitxers"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "No es pot pujar {filename} perquè és una carpeta o té 0 bytes"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -106,7 +106,7 @@ msgstr "La pujada s'ha cancel·lat."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "No hi ha resposta del servidor."
#: js/file-upload.js:446
msgid ""
@@ -223,7 +223,7 @@ msgstr "S'està preparant la baixada. Pot trigar una estona si els fitxers són
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Error en moure el fitxer"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/cs_CZ/core.po b/l10n/cs_CZ/core.po
index 61a7e861b2a..914c6bcc207 100644
--- a/l10n/cs_CZ/core.po
+++ b/l10n/cs_CZ/core.po
@@ -4,6 +4,7 @@
#
# Translators:
# janinko <janinko.g@gmail.com>, 2013
+# dibalaj <dibalaj@dibalaj.cz>, 2013
# Honza K. <honza889@gmail.com>, 2013
# Martin <fireball@atlas.cz>, 2013
# pstast <petr@stastny.eu>, 2013
@@ -12,9 +13,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 16:57+0000\n"
+"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -284,11 +285,11 @@ msgstr[2] ""
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Jeden konflikt souboru"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Které soubory chcete ponechat?"
#: js/oc-dialogs.js:368
msgid ""
@@ -302,7 +303,7 @@ msgstr "Zrušit"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Pokračovat"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
@@ -325,7 +326,7 @@ msgstr "Není určen typ objektu."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Chyba"
@@ -345,7 +346,7 @@ msgstr "Sdílené"
msgid "Share"
msgstr "Sdílet"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Chyba při sdílení"
@@ -445,23 +446,23 @@ msgstr "smazat"
msgid "share"
msgstr "sdílet"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Chráněno heslem"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Chyba při odstraňování data vypršení platnosti"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Chyba při nastavení data vypršení platnosti"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Odesílám ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "E-mail odeslán"
diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po
index 7ce4b330521..5cff84e574f 100644
--- a/l10n/cs_CZ/files.po
+++ b/l10n/cs_CZ/files.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# dibalaj <dibalaj@dibalaj.cz>, 2013
# Honza K. <honza889@gmail.com>, 2013
# cvanca <mrs.jenkins.oh.yeah@gmail.com>, 2013
# pstast <petr@stastny.eu>, 2013
@@ -11,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-29 16:54+0000\n"
+"Last-Translator: dibalaj <dibalaj@dibalaj.cz>\n"
"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -90,7 +91,7 @@ msgstr ""
msgid "Invalid directory."
msgstr "Neplatný adresář"
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Soubory"
@@ -228,7 +229,7 @@ msgstr "Vaše soubory ke stažení se připravují. Pokud jsou velké, může to
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Chyba při přesunu souboru"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/da/core.po b/l10n/da/core.po
index 690bb46c211..89530e07456 100644
--- a/l10n/da/core.po
+++ b/l10n/da/core.po
@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-24 17:20+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n"
"MIME-Version: 1.0\n"
@@ -100,11 +100,11 @@ msgstr ""
#: avatar/controller.php:81
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ukendt filtype"
#: avatar/controller.php:85
msgid "Invalid image"
-msgstr ""
+msgstr "Ugyldigt billede"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
@@ -319,7 +319,7 @@ msgstr "Objekttypen er ikke angivet."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Fejl"
@@ -339,7 +339,7 @@ msgstr "Delt"
msgid "Share"
msgstr "Del"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Fejl under deling"
@@ -439,23 +439,23 @@ msgstr "slet"
msgid "share"
msgstr "del"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Beskyttet med adgangskode"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Fejl ved fjernelse af udløbsdato"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Fejl under sætning af udløbsdato"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Sender ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "E-mail afsendt"
diff --git a/l10n/da/lib.po b/l10n/da/lib.po
index 0bacfcf5e8a..7d01d7a9691 100644
--- a/l10n/da/lib.po
+++ b/l10n/da/lib.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-16 11:33-0400\n"
-"PO-Revision-Date: 2013-09-16 15:34+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-24 17:20+0000\n"
+"Last-Translator: Sappe\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -58,15 +58,15 @@ msgstr "Upgradering af \"%s\" fejlede"
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
-msgstr ""
+msgstr "Personligt profilbillede virker endnu ikke sammen med kryptering"
#: avatar.php:64
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ukendt filtype"
#: avatar.php:69
msgid "Invalid image"
-msgstr ""
+msgstr "Ugyldigt billede"
#: defaults.php:35
msgid "web services under your control"
@@ -167,15 +167,15 @@ msgstr "Adgangsfejl"
msgid "Token expired. Please reload page."
msgstr "Adgang er udløbet. Genindlæs siden."
-#: search/provider/file.php:17 search/provider/file.php:35
+#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "Filer"
-#: search/provider/file.php:26 search/provider/file.php:33
+#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "SMS"
-#: search/provider/file.php:29
+#: search/provider/file.php:30
msgid "Images"
msgstr "Billeder"
diff --git a/l10n/da/settings.po b/l10n/da/settings.po
index accacfac32a..e5f2b57e882 100644
--- a/l10n/da/settings.po
+++ b/l10n/da/settings.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-24 17:00+0000\n"
+"Last-Translator: Sappe\n"
"Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -89,42 +89,42 @@ msgstr "Kunne ikke opdatere app'en."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Forkert kodeord"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "Intet brugernavn givet"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Angiv venligst en admininstrator gendannelseskode, ellers vil alt brugerdata gå tabt"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Forkert admin gendannelseskode. Se venligst koden efter og prøv igen."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "Serveren understøtter ikke kodeordsskifte, men brugernes krypteringsnøgle blev opdateret."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Kunne ikke ændre kodeord"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Opdatér til {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Deaktiver"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Aktiver"
@@ -132,31 +132,31 @@ msgstr "Aktiver"
msgid "Please wait...."
msgstr "Vent venligst..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Kunne ikke deaktivere app"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Kunne ikke aktivere app"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Opdaterer...."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Der opstod en fejl under app opgraderingen"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Fejl"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Opdater"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Opdateret"
diff --git a/l10n/el/files.po b/l10n/el/files.po
index f6b7bcf82a4..87c112acc67 100644
--- a/l10n/el/files.po
+++ b/l10n/el/files.po
@@ -5,14 +5,15 @@
# Translators:
# Efstathios Iosifidis <iefstathios@gmail.com>, 2013
# Efstathios Iosifidis <iosifidis@opensuse.org>, 2013
+# gtsamis <gtsamis@yahoo.com>, 2013
# frerisp <petrosfreris@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-25 12:10+0000\n"
+"Last-Translator: gtsamis <gtsamis@yahoo.com>\n"
"Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -89,7 +90,7 @@ msgstr ""
msgid "Invalid directory."
msgstr "Μη έγκυρος φάκελος."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Αρχεία"
@@ -224,7 +225,7 @@ msgstr "Η λήψη προετοιμάζεται. Αυτό μπορεί να π
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Σφάλμα κατά τη μετακίνηση του αρχείου"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/en_GB/core.po b/l10n/en_GB/core.po
index 5ac5d34f566..f9b0f0d24fa 100644
--- a/l10n/en_GB/core.po
+++ b/l10n/en_GB/core.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-23 16:10+0000\n"
+"Last-Translator: mnestis <transifex@mnestis.net>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/owncloud/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -270,22 +270,22 @@ msgstr "Error loading message template: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{count} file conflict"
+msgstr[1] "{count} file conflicts"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "One file conflict"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Which files do you wish to keep?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "If you select both versions, the copied file will have a number added to its name."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -293,19 +293,19 @@ msgstr "Cancel"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Continue"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(all selected)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} selected)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Error loading file exists template"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -316,7 +316,7 @@ msgstr "The object type is not specified."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Error"
@@ -336,7 +336,7 @@ msgstr "Shared"
msgid "Share"
msgstr "Share"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Error whilst sharing"
@@ -436,23 +436,23 @@ msgstr "delete"
msgid "share"
msgstr "share"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Password protected"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Error unsetting expiration date"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Error setting expiration date"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Sending ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Email sent"
diff --git a/l10n/en_GB/files.po b/l10n/en_GB/files.po
index fe7922ffe9a..bf8e9374348 100644
--- a/l10n/en_GB/files.po
+++ b/l10n/en_GB/files.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 16:00+0000\n"
+"Last-Translator: mnestis <transifex@mnestis.net>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/projects/p/owncloud/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -77,23 +77,23 @@ msgstr "Not enough storage available"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "Upload failed. Could not get file info."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "Upload failed. Could not find uploaded file"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Invalid directory."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Files"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Unable to upload {filename} as it is a directory or has 0 bytes"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -105,7 +105,7 @@ msgstr "Upload cancelled."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Could not get result from server."
#: js/file-upload.js:446
msgid ""
@@ -198,7 +198,7 @@ msgstr "File name cannot be empty."
msgid ""
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not "
"allowed."
-msgstr "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."
+msgstr "Invalid name: '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed."
#: js/files.js:51
msgid "Your storage is full, files can not be updated or synced anymore!"
@@ -222,7 +222,7 @@ msgstr "Your download is being prepared. This might take some time if the files
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Error moving file"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/fr/core.po b/l10n/fr/core.po
index 76dc658c71d..bce932689a0 100644
--- a/l10n/fr/core.po
+++ b/l10n/fr/core.po
@@ -13,9 +13,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-26 15:10+0000\n"
+"Last-Translator: Christophe Lherieau <skimpax@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -110,11 +110,11 @@ msgstr "Image invalide"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
-msgstr ""
+msgstr "Aucune image temporaire disponible pour le profil. Essayez à nouveau."
#: avatar/controller.php:135
msgid "No crop data provided"
-msgstr ""
+msgstr "Aucune donnée de culture fournie"
#: js/config.php:32
msgid "Sunday"
@@ -275,22 +275,22 @@ msgstr "Erreur de chargement du modèle de message : {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{count} fichier en conflit"
+msgstr[1] "{count} fichiers en conflit"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Un conflit de fichier"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Quels fichiers désirez-vous garder ?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Si vous sélectionnez les deux versions, un nombre sera ajouté au nom du fichier copié."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -298,19 +298,19 @@ msgstr "Annuler"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Poursuivre"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(tous sélectionnés)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} sélectionnés)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Erreur de chargement du modèle de fichier existant"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -321,7 +321,7 @@ msgstr "Le type d'objet n'est pas spécifié."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Erreur"
@@ -341,7 +341,7 @@ msgstr "Partagé"
msgid "Share"
msgstr "Partager"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Erreur lors de la mise en partage"
@@ -441,23 +441,23 @@ msgstr "supprimer"
msgid "share"
msgstr "partager"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Protégé par un mot de passe"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Une erreur est survenue pendant la suppression de la date d'expiration"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Erreur lors de la spécification de la date d'expiration"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "En cours d'envoi ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Email envoyé"
diff --git a/l10n/fr/files.po b/l10n/fr/files.po
index fcbbbad254e..72963e3573f 100644
--- a/l10n/fr/files.po
+++ b/l10n/fr/files.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-23 19:30+0000\n"
+"Last-Translator: ogre_sympathique <ogre.sympathique@speed.1s.fr>\n"
"Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -80,23 +80,23 @@ msgstr "Plus assez d'espace de stockage disponible"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "L'envoi a échoué. Impossible d'obtenir les informations du fichier."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "L'envoi a échoué. Impossible de trouver le fichier envoyé."
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Dossier invalide."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Fichiers"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -108,7 +108,7 @@ msgstr "Envoi annulé."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Ne peut recevoir les résultats du serveur."
#: js/file-upload.js:446
msgid ""
@@ -225,7 +225,7 @@ msgstr "Votre téléchargement est cours de préparation. Ceci peut nécessiter
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Erreur lors du déplacement du fichier"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po
index 529e2e8c356..21918cf68da 100644
--- a/l10n/fr/settings.po
+++ b/l10n/fr/settings.po
@@ -13,9 +13,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-26 15:00+0000\n"
+"Last-Translator: Christophe Lherieau <skimpax@gmail.com>\n"
"Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -102,18 +102,18 @@ msgstr "Aucun utilisateur fourni"
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Veuillez fournir un mot de passe administrateur de récupération de données, sinon toutes les données de l'utilisateur seront perdues"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Mot de passe administrateur de récupération de données invalide. Veuillez vérifier le mot de passe et essayer à nouveau."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "L'infrastructure d'arrière-plan ne supporte pas la modification de mot de passe, mais la clef de chiffrement des utilisateurs a été mise à jour avec succès."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
@@ -123,11 +123,11 @@ msgstr "Impossible de modifier le mot de passe"
msgid "Update to {appversion}"
msgstr "Mettre à jour vers {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Désactiver"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Activer"
@@ -135,31 +135,31 @@ msgstr "Activer"
msgid "Please wait...."
msgstr "Veuillez patienter…"
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Erreur lors de la désactivation de l'application"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Erreur lors de l'activation de l'application"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Mise à jour..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Erreur lors de la mise à jour de l'application"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Erreur"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Mettre à jour"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Mise à jour effectuée avec succès"
diff --git a/l10n/gl/core.po b/l10n/gl/core.po
index 72986b81c8a..b8bcfd4eea8 100644
--- a/l10n/gl/core.po
+++ b/l10n/gl/core.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-23 10:30+0000\n"
+"Last-Translator: mbouzada <mbouzada@gmail.com>\n"
"Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -270,22 +270,22 @@ msgstr "Produciuse un erro ao cargar o modelo da mensaxe: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{count} conflito de ficheiro"
+msgstr[1] "{count} conflitos de ficheiros"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Un conflito de ficheiro"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Que ficheiros quere conservar?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Se selecciona ambas versións, o ficheiro copiado terá un número engadido ao nome."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -293,19 +293,19 @@ msgstr "Cancelar"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Continuar"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(todo o seleccionado)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} seleccionados)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Produciuse un erro ao cargar o modelo de ficheiro existente"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -316,7 +316,7 @@ msgstr "Non se especificou o tipo de obxecto."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Erro"
@@ -336,7 +336,7 @@ msgstr "Compartir"
msgid "Share"
msgstr "Compartir"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Produciuse un erro ao compartir"
@@ -436,23 +436,23 @@ msgstr "eliminar"
msgid "share"
msgstr "compartir"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Protexido con contrasinal"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Produciuse un erro ao retirar a data de caducidade"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Produciuse un erro ao definir a data de caducidade"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Enviando..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Correo enviado"
diff --git a/l10n/gl/files.po b/l10n/gl/files.po
index 45a9129ab2d..33e76e84873 100644
--- a/l10n/gl/files.po
+++ b/l10n/gl/files.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-23 10:30+0000\n"
+"Last-Translator: mbouzada <mbouzada@gmail.com>\n"
"Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -77,23 +77,23 @@ msgstr "Non hai espazo de almacenamento abondo"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "O envío fracasou. Non foi posíbel obter información do ficheiro."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "O envío fracasou. Non foi posíbel atopar o ficheiro enviado"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "O directorio é incorrecto."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Ficheiros"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -105,7 +105,7 @@ msgstr "Envío cancelado."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Non foi posíbel obter o resultado do servidor."
#: js/file-upload.js:446
msgid ""
@@ -222,7 +222,7 @@ msgstr "Está a prepararse a súa descarga. Isto pode levar bastante tempo se os
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Produciuse un erro ao mover o ficheiro"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/hu_HU/core.po b/l10n/hu_HU/core.po
index 7b484995d4b..9a7a4428b56 100644
--- a/l10n/hu_HU/core.po
+++ b/l10n/hu_HU/core.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 00:42+0000\n"
+"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -30,28 +30,28 @@ msgstr "csoport"
#: ajax/update.php:11
msgid "Turned on maintenance mode"
-msgstr ""
+msgstr "A karbantartási mód bekapcsolva"
#: ajax/update.php:14
msgid "Turned off maintenance mode"
-msgstr ""
+msgstr "A karbantartási mód kikapcsolva"
#: ajax/update.php:17
msgid "Updated database"
-msgstr ""
+msgstr "Frissítet adatbázis"
#: ajax/update.php:20
msgid "Updating filecache, this may take really long..."
-msgstr ""
+msgstr "A filecache frissítése folyamatban, ez a folyamat hosszabb ideig is eltarthat..."
#: ajax/update.php:23
msgid "Updated filecache"
-msgstr ""
+msgstr "Filecache frissítve"
#: ajax/update.php:26
#, php-format
msgid "... %d%% done ..."
-msgstr ""
+msgstr "... %d%% kész ..."
#: ajax/vcategories/add.php:26 ajax/vcategories/edit.php:25
msgid "Category type not provided."
@@ -94,23 +94,23 @@ msgstr "Nem sikerült a kedvencekből törölni ezt: %s"
#: avatar/controller.php:62
msgid "No image or file provided"
-msgstr ""
+msgstr "Nincs kép vagy file megadva"
#: avatar/controller.php:81
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ismeretlen file tipús"
#: avatar/controller.php:85
msgid "Invalid image"
-msgstr ""
+msgstr "Hibás kép"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
-msgstr ""
+msgstr "Az átmeneti profil kép nem elérhető, próbáld újra"
#: avatar/controller.php:135
msgid "No crop data provided"
-msgstr ""
+msgstr "Vágáshoz nincs adat megadva"
#: js/config.php:32
msgid "Sunday"
@@ -250,7 +250,7 @@ msgstr "Válasszon"
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
-msgstr ""
+msgstr "Nem sikerült betölteni a fájlkiválasztó sablont: {error}"
#: js/oc-dialogs.js:172
msgid "Yes"
@@ -266,7 +266,7 @@ msgstr "Ok"
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
-msgstr ""
+msgstr "Nem sikerült betölteni az üzenet sablont: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
@@ -276,17 +276,17 @@ msgstr[1] ""
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Egy file ütközik"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Melyik file-okat akarod megtartani?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Ha kiválasztod mindazokaz a verziókat, a másolt fileok neve sorszámozva lesz."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -294,19 +294,19 @@ msgstr "Mégsem"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Folytatás"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(all selected)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} kiválasztva)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Hiba a létező sablon betöltésekor"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -317,7 +317,7 @@ msgstr "Az objektum típusa nincs megadva."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Hiba"
@@ -337,7 +337,7 @@ msgstr "Megosztott"
msgid "Share"
msgstr "Megosztás"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Nem sikerült létrehozni a megosztást"
@@ -437,23 +437,23 @@ msgstr "töröl"
msgid "share"
msgstr "megoszt"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Jelszóval van védve"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Nem sikerült a lejárati időt törölni"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Nem sikerült a lejárati időt beállítani"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Küldés ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Az emailt elküldtük"
@@ -471,7 +471,7 @@ msgstr "A frissítés sikeres volt. Visszairányítjuk az ownCloud szolgáltatá
#: lostpassword/controller.php:62
#, php-format
msgid "%s password reset"
-msgstr ""
+msgstr "%s jelszó visszaállítás"
#: lostpassword/templates/email.php:2
msgid "Use the following link to reset your password: {link}"
diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po
index 51bd0806da3..e61d77e5cb2 100644
--- a/l10n/hu_HU/files.po
+++ b/l10n/hu_HU/files.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-24 18:40+0000\n"
+"Last-Translator: Laszlo Tornoci <torlasz@gmail.com>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -77,23 +77,23 @@ msgstr "Nincs elég szabad hely."
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "A feltöltés nem sikerült. Nem található a feltöltendő állomány."
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Érvénytelen mappa."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Fájlok"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll."
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -105,7 +105,7 @@ msgstr "A feltöltést megszakítottuk."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "A kiszolgálótól nem kapható meg az eredmény."
#: js/file-upload.js:446
msgid ""
@@ -167,24 +167,24 @@ msgstr "visszavonás"
#: js/filelist.js:533 js/filelist.js:599 js/files.js:576
msgid "%n folder"
msgid_plural "%n folders"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%n mappa"
+msgstr[1] "%n mappa"
#: js/filelist.js:534 js/filelist.js:600 js/files.js:582
msgid "%n file"
msgid_plural "%n files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%n állomány"
+msgstr[1] "%n állomány"
#: js/filelist.js:541
msgid "{dirs} and {files}"
-msgstr ""
+msgstr "{dirs} és {files}"
#: js/filelist.js:731 js/filelist.js:769
msgid "Uploading %n file"
msgid_plural "Uploading %n files"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%n állomány feltöltése"
+msgstr[1] "%n állomány feltöltése"
#: js/files.js:25
msgid "'.' is an invalid file name."
@@ -212,7 +212,7 @@ msgstr "A tároló majdnem tele van ({usedSpacePercent}%)"
msgid ""
"Encryption was disabled but your files are still encrypted. Please go to "
"your personal settings to decrypt your files."
-msgstr ""
+msgstr "A titkosítási funkciót kikapcsolták, de az Ön állományai még mindig titkosított állapotban vannak. A személyes beállításoknál tudja a titkosítást feloldani."
#: js/files.js:296
msgid ""
@@ -222,7 +222,7 @@ msgstr "Készül a letöltendő állomány. Ez eltarthat egy ideig, ha nagyok a
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Az állomány áthelyezése nem sikerült."
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/hu_HU/files_trashbin.po b/l10n/hu_HU/files_trashbin.po
index 4e5d7207c9f..d0d6f3bc51a 100644
--- a/l10n/hu_HU/files_trashbin.po
+++ b/l10n/hu_HU/files_trashbin.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-08-15 04:47-0400\n"
-"PO-Revision-Date: 2013-08-15 08:48+0000\n"
+"POT-Creation-Date: 2013-09-27 00:01-0400\n"
+"PO-Revision-Date: 2013-09-24 18:40+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
@@ -28,43 +28,43 @@ msgstr "Nem sikerült %s végleges törlése"
msgid "Couldn't restore %s"
msgstr "Nem sikerült %s visszaállítása"
-#: js/trash.js:7 js/trash.js:100
+#: js/trash.js:7 js/trash.js:102
msgid "perform restore operation"
msgstr "a visszaállítás végrehajtása"
-#: js/trash.js:20 js/trash.js:48 js/trash.js:118 js/trash.js:146
+#: js/trash.js:20 js/trash.js:49 js/trash.js:120 js/trash.js:148
msgid "Error"
msgstr "Hiba"
-#: js/trash.js:36
+#: js/trash.js:37
msgid "delete file permanently"
msgstr "az állomány végleges törlése"
-#: js/trash.js:127
+#: js/trash.js:129
msgid "Delete permanently"
msgstr "Végleges törlés"
-#: js/trash.js:182 templates/index.php:17
+#: js/trash.js:190 templates/index.php:21
msgid "Name"
msgstr "Név"
-#: js/trash.js:183 templates/index.php:27
+#: js/trash.js:191 templates/index.php:31
msgid "Deleted"
msgstr "Törölve"
-#: js/trash.js:191
+#: js/trash.js:199
msgid "%n folder"
msgid_plural "%n folders"
msgstr[0] ""
-msgstr[1] ""
+msgstr[1] "%n mappa"
-#: js/trash.js:197
+#: js/trash.js:205
msgid "%n file"
msgid_plural "%n files"
msgstr[0] ""
-msgstr[1] ""
+msgstr[1] "%n állomány"
-#: lib/trash.php:819 lib/trash.php:821
+#: lib/trashbin.php:814 lib/trashbin.php:816
msgid "restored"
msgstr "visszaállítva"
@@ -72,11 +72,11 @@ msgstr "visszaállítva"
msgid "Nothing in here. Your trash bin is empty!"
msgstr "Itt nincs semmi. Az Ön szemetes mappája üres!"
-#: templates/index.php:20 templates/index.php:22
+#: templates/index.php:24 templates/index.php:26
msgid "Restore"
msgstr "Visszaállítás"
-#: templates/index.php:30 templates/index.php:31
+#: templates/index.php:34 templates/index.php:35
msgid "Delete"
msgstr "Törlés"
diff --git a/l10n/hu_HU/lib.po b/l10n/hu_HU/lib.po
index 6cd771a9024..57212087ee5 100644
--- a/l10n/hu_HU/lib.po
+++ b/l10n/hu_HU/lib.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-16 11:33-0400\n"
-"PO-Revision-Date: 2013-09-16 15:34+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 00:50+0000\n"
+"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,38 +19,38 @@ msgstr ""
"Language: hu_HU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: app.php:239
+#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr ""
-#: app.php:250
+#: app.php:248
msgid "No app name specified"
-msgstr ""
+msgstr "Nincs az alkalmazás név megadva."
-#: app.php:361
+#: app.php:352
msgid "Help"
msgstr "Súgó"
-#: app.php:374
+#: app.php:365
msgid "Personal"
msgstr "Személyes"
-#: app.php:385
+#: app.php:376
msgid "Settings"
msgstr "Beállítások"
-#: app.php:397
+#: app.php:388
msgid "Users"
msgstr "Felhasználók"
-#: app.php:410
+#: app.php:401
msgid "Admin"
msgstr "Adminsztráció"
-#: app.php:839
+#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "Sikertelen Frissítés \"%s\"."
@@ -61,11 +61,11 @@ msgstr ""
#: avatar.php:64
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ismeretlen file tipús"
#: avatar.php:69
msgid "Invalid image"
-msgstr ""
+msgstr "Hibás kép"
#: defaults.php:35
msgid "web services under your control"
@@ -121,7 +121,7 @@ msgstr ""
#: installer.php:125
msgid "App does not provide an info.xml file"
-msgstr ""
+msgstr "Az alkalmazás nem szolgáltatott info.xml file-t"
#: installer.php:131
msgid "App can't be installed because of not allowed code in the App"
@@ -131,7 +131,7 @@ msgstr ""
msgid ""
"App can't be installed because it is not compatible with this version of "
"ownCloud"
-msgstr ""
+msgstr "Az alalmazás nem telepíthető, mert nem kompatibilis az ownClod ezzel a verziójával."
#: installer.php:146
msgid ""
@@ -147,12 +147,12 @@ msgstr ""
#: installer.php:162
msgid "App directory already exists"
-msgstr ""
+msgstr "Az alkalmazás mappája már létezik"
#: installer.php:175
#, php-format
msgid "Can't create app folder. Please fix permissions. %s"
-msgstr ""
+msgstr "Nem lehetett létrehozni az alkalmzás mappáját. Kérlek ellenőrizd a jogosultásgokat. %s"
#: json.php:28
msgid "Application is not enabled"
@@ -166,15 +166,15 @@ msgstr "Azonosítási hiba"
msgid "Token expired. Please reload page."
msgstr "A token lejárt. Frissítse az oldalt."
-#: search/provider/file.php:17 search/provider/file.php:35
+#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "Fájlok"
-#: search/provider/file.php:26 search/provider/file.php:33
+#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "Szöveg"
-#: search/provider/file.php:29
+#: search/provider/file.php:30
msgid "Images"
msgstr "Képek"
@@ -278,6 +278,11 @@ msgstr "Az Ön webkiszolgálója nincs megfelelően beállítva az állományok
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "Kérjük tüzetesen tanulmányozza át a <a href='%s'>telepítési útmutatót</a>."
+#: tags.php:194
+#, php-format
+msgid "Could not find category \"%s\""
+msgstr "Ez a kategória nem található: \"%s\""
+
#: template/functions.php:96
msgid "seconds ago"
msgstr "pár másodperce"
@@ -329,8 +334,3 @@ msgstr "több éve"
#: template.php:297
msgid "Caused by:"
msgstr "Okozta:"
-
-#: vcategories.php:188 vcategories.php:249
-#, php-format
-msgid "Could not find category \"%s\""
-msgstr "Ez a kategória nem található: \"%s\""
diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po
index 7ef4a07d1ae..f1bb5c03cfe 100644
--- a/l10n/hu_HU/settings.po
+++ b/l10n/hu_HU/settings.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
+"PO-Revision-Date: 2013-09-30 00:21+0000\n"
+"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -89,42 +89,42 @@ msgstr "A program frissítése nem sikerült."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Hibás jelszó"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "Nincs felhasználó által mellékelve"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Add meg az admin helyreállító jelszót, máskülönben az összes felhasználói adat elveszik."
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Hibás admin helyreállítási jelszó. Ellenörizd a jelszót és próbáld újra."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "A back-end nem támogatja a jelszó módosítást, de felhasználó titkosítási kulcsa sikeresen frissítve lett."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Nem sikerült megváltoztatni a jelszót"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Frissítés erre a verzióra: {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Letiltás"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "engedélyezve"
@@ -132,43 +132,43 @@ msgstr "engedélyezve"
msgid "Please wait...."
msgstr "Kérem várjon..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
-msgstr ""
+msgstr "Hiba az alkalmazás kikapcsolása közben"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
-msgstr ""
+msgstr "Hiba az alalmazás engedélyezése közben"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Frissítés folyamatban..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Hiba történt a programfrissítés közben"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Hiba"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Frissítés"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Frissítve"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
-msgstr ""
+msgstr "Válassz profil képet"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
-msgstr ""
+msgstr "File-ok kititkosítása folyamatban... Kérlek várj, ez hosszabb ideig is eltarthat ..."
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Mentés..."
@@ -496,27 +496,27 @@ msgstr "Profilkép"
#: templates/personal.php:90
msgid "Upload new"
-msgstr ""
+msgstr "Új feltöltése"
#: templates/personal.php:92
msgid "Select new from Files"
-msgstr ""
+msgstr "Új kiválasztása Fileokból"
#: templates/personal.php:93
msgid "Remove image"
-msgstr ""
+msgstr "Kép eltávolítása"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
-msgstr ""
+msgstr "Egyaránt png vagy jpg. Az ideális ha négyzet alaku, de késöbb még átszabható"
#: templates/personal.php:97
msgid "Abort"
-msgstr ""
+msgstr "Megszakítás"
#: templates/personal.php:98
msgid "Choose as profile image"
-msgstr ""
+msgstr "Válassz profil képet"
#: templates/personal.php:106 templates/personal.php:107
msgid "Language"
@@ -543,15 +543,15 @@ msgstr "Titkosítás"
#: templates/personal.php:140
msgid "The encryption app is no longer enabled, decrypt all your file"
-msgstr ""
+msgstr "A titkosító alkalmzás a továbbiakban nincs engedélyezve, kititkosítja az összes fileodat"
#: templates/personal.php:146
msgid "Log-in password"
-msgstr ""
+msgstr "Bejelentkezési jelszó"
#: templates/personal.php:151
msgid "Decrypt all Files"
-msgstr ""
+msgstr "Kititkosítja az összes file-t"
#: templates/users.php:21
msgid "Login Name"
diff --git a/l10n/hu_HU/user_ldap.po b/l10n/hu_HU/user_ldap.po
index 5b24b22ffd6..b1d5e5391c8 100644
--- a/l10n/hu_HU/user_ldap.po
+++ b/l10n/hu_HU/user_ldap.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-07 04:40-0400\n"
-"PO-Revision-Date: 2013-09-05 11:51+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 00:22+0000\n"
+"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -92,7 +92,7 @@ msgid ""
"<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may"
" experience unexpected behavior. Please ask your system administrator to "
"disable one of them."
-msgstr ""
+msgstr "<b>Figyelem:</b> a user_ldap és user_webdavauth alkalmazások nem kompatibilisek. Együttes használatuk váratlan eredményekhez vezethet. Kérje meg a rendszergazdát, hogy a kettő közül kapcsolja ki az egyiket."
#: templates/settings.php:12
msgid ""
@@ -157,7 +157,7 @@ msgstr "Szűrő a bejelentkezéshez"
msgid ""
"Defines the filter to apply, when login is attempted. %%uid replaces the "
"username in the login action. Example: \"uid=%%uid\""
-msgstr ""
+msgstr "Ez a szűrő érvényes a bejelentkezés megkísérlésekor. Ekkor az %%uid változó helyére a bejelentkezési név kerül. Például: \"uid=%%uid\""
#: templates/settings.php:55
msgid "User List Filter"
@@ -167,7 +167,7 @@ msgstr "A felhasználók szűrője"
msgid ""
"Defines the filter to apply, when retrieving users (no placeholders). "
"Example: \"objectClass=person\""
-msgstr ""
+msgstr "Ez a szűrő érvényes a felhasználók listázásakor (nincs helyettesíthető változó). Például: \"objectClass=person\""
#: templates/settings.php:59
msgid "Group Filter"
@@ -177,7 +177,7 @@ msgstr "A csoportok szűrője"
msgid ""
"Defines the filter to apply, when retrieving groups (no placeholders). "
"Example: \"objectClass=posixGroup\""
-msgstr ""
+msgstr "Ez a szűrő érvényes a csoportok listázásakor (nincs helyettesíthető változó). Például: \"objectClass=posixGroup\""
#: templates/settings.php:66
msgid "Connection Settings"
@@ -215,7 +215,7 @@ msgstr "A fő szerver kihagyása"
#: templates/settings.php:72
msgid "Only connect to the replica server."
-msgstr ""
+msgstr "Csak a másodlagos (másolati) kiszolgálóhoz kapcsolódjunk."
#: templates/settings.php:73
msgid "Use TLS"
@@ -238,7 +238,7 @@ msgstr "Ne ellenőrizzük az SSL-tanúsítvány érvényességét"
msgid ""
"Not recommended, use it for testing only! If connection only works with this"
" option, import the LDAP server's SSL certificate in your %s server."
-msgstr ""
+msgstr "Használata nem javasolt (kivéve tesztelési céllal). Ha a kapcsolat csak ezzel a beállítással működik, akkor importálja az LDAP-kiszolgáló SSL tanúsítványát a(z) %s kiszolgálóra!"
#: templates/settings.php:76
msgid "Cache Time-To-Live"
@@ -258,7 +258,7 @@ msgstr "A felhasználónév mezője"
#: templates/settings.php:80
msgid "The LDAP attribute to use to generate the user's display name."
-msgstr ""
+msgstr "Ebből az LDAP attribútumból képződik a felhasználó megjelenítendő neve."
#: templates/settings.php:81
msgid "Base User Tree"
@@ -282,7 +282,7 @@ msgstr "A csoport nevének mezője"
#: templates/settings.php:83
msgid "The LDAP attribute to use to generate the groups's display name."
-msgstr ""
+msgstr "Ebből az LDAP attribútumból képződik a csoport megjelenítendő neve."
#: templates/settings.php:84
msgid "Base Group Tree"
@@ -348,7 +348,7 @@ msgid ""
"behavior as before ownCloud 5 enter the user display name attribute in the "
"following field. Leave it empty for default behavior. Changes will have "
"effect only on newly mapped (added) LDAP users."
-msgstr ""
+msgstr "Alapértelmezetten a belső felhasználónév az UUID tulajdonságból jön létre. Ez biztosítja a felhasználónév egyediségét és hogy a nem kell konvertálni a karaktereket benne. A belső felhasználónévnél a megkötés az, hogy csak a következő karakterek engdélyezettek benne: [ a-zA-Z0-9_.@- ]. Ezeken a karaktereken kivül minden karakter le lesz cserélve az adott karakter ASCII kódtáblában használható párjára vagy ha ilyen nincs akkor egyszerűen ki lesz hagyva. Ha így mégis ütköznének a nevek akkor hozzá lesz füzve egy folyamatosan növekvő számláló rész. A belső felhasználónevet lehet használni a felhasználó azonosítására a programon belül. Illetve ez lesz az alapáértelmezett neve a felhasználó kezdő könyvtárának az ownCloud-ban. Illetve..............................."
#: templates/settings.php:100
msgid "Internal Username Attribute:"
diff --git a/l10n/hu_HU/user_webdavauth.po b/l10n/hu_HU/user_webdavauth.po
index fd49829f9c5..35d7f6c9136 100644
--- a/l10n/hu_HU/user_webdavauth.po
+++ b/l10n/hu_HU/user_webdavauth.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-07-27 01:56-0400\n"
-"PO-Revision-Date: 2013-07-27 05:57+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 00:32+0000\n"
+"Last-Translator: ebela <bela@dandre.hu>\n"
"Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -25,11 +25,11 @@ msgstr "WebDAV hitelesítés"
#: templates/settings.php:4
msgid "Address: "
-msgstr ""
+msgstr "Címek:"
#: templates/settings.php:7
msgid ""
"The user credentials will be sent to this address. This plugin checks the "
"response and will interpret the HTTP statuscodes 401 and 403 as invalid "
"credentials, and all other responses as valid credentials."
-msgstr ""
+msgstr "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
diff --git a/l10n/it/core.po b/l10n/it/core.po
index d587e959539..a5586707e43 100644
--- a/l10n/it/core.po
+++ b/l10n/it/core.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-22 13:40+0000\n"
-"Last-Translator: nappo <leone@inventati.org>\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-27 18:30+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -252,7 +252,7 @@ msgstr "Scegli"
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
-msgstr "Errore nel caricamento del modello del selettore file: {error}"
+msgstr "Errore durante il caricamento del modello del selettore file: {error}"
#: js/oc-dialogs.js:172
msgid "Yes"
@@ -268,7 +268,7 @@ msgstr "Ok"
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
-msgstr "Errore nel caricamento del modello di messaggio: {error}"
+msgstr "Errore durante il caricamento del modello di messaggio: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
@@ -278,7 +278,7 @@ msgstr[1] "{count} file in conflitto"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr "Un conflitto tra file"
+msgstr "Un file in conflitto"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
@@ -288,7 +288,7 @@ msgstr "Quali file vuoi mantenere?"
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr "Se selezioni entrambe le versioni, verrà aggiunto un numero al nome del file copiato."
+msgstr "Se selezioni entrambe le versioni, sarà aggiunto un numero al nome del file copiato."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -300,7 +300,7 @@ msgstr "Continua"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr "(tutti selezionati)"
+msgstr "(tutti i selezionati)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
@@ -319,7 +319,7 @@ msgstr "Il tipo di oggetto non è specificato."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Errore"
@@ -339,7 +339,7 @@ msgstr "Condivisi"
msgid "Share"
msgstr "Condividi"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Errore durante la condivisione"
@@ -439,23 +439,23 @@ msgstr "elimina"
msgid "share"
msgstr "condividi"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Protetta da password"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Errore durante la rimozione della data di scadenza"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Errore durante l'impostazione della data di scadenza"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Invio in corso..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Messaggio inviato"
diff --git a/l10n/it/files.po b/l10n/it/files.po
index 4711aa723a8..3b8b0f65394 100644
--- a/l10n/it/files.po
+++ b/l10n/it/files.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:51-0400\n"
-"PO-Revision-Date: 2013-09-21 17:50+0000\n"
-"Last-Translator: polxmod <paolo.velati@gmail.com>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-30 12:15+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,11 +78,11 @@ msgstr "Spazio di archiviazione insufficiente"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr "Upload fallito. Impossibile ottenere informazioni sul file"
+msgstr "Caricamento non riuscito. Impossibile ottenere informazioni sul file."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr "Upload fallit. Impossibile trovare file caricato"
+msgstr "Caricamento non riuscito. Impossibile trovare il file caricato."
#: ajax/upload.php:160
msgid "Invalid directory."
@@ -94,7 +94,7 @@ msgstr "File"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr "Impossibile caricare {filename} poiché è una cartella oppure è di 0 byte"
+msgstr "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte."
#: js/file-upload.js:255
msgid "Not enough space available"
diff --git a/l10n/it/settings.po b/l10n/it/settings.po
index 0e5f28a4d15..8248b45ef24 100644
--- a/l10n/it/settings.po
+++ b/l10n/it/settings.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
+"PO-Revision-Date: 2013-09-30 12:15+0000\n"
+"Last-Translator: Vincenzo Reale <vinx.reale@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -121,11 +121,11 @@ msgstr "Impossibile cambiare la password"
msgid "Update to {appversion}"
msgstr "Aggiorna a {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Disabilita"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Abilita"
@@ -133,43 +133,43 @@ msgstr "Abilita"
msgid "Please wait...."
msgstr "Attendere..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Errore durante la disattivazione"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Errore durante l'attivazione"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Aggiornamento in corso..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Errore durante l'aggiornamento"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Errore"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Aggiorna"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Aggiornato"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
msgstr "Seleziona un'immagine del profilo"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Decifratura dei file in corso... Attendi, potrebbe richiedere del tempo."
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Salvataggio in corso..."
diff --git a/l10n/ja_JP/core.po b/l10n/ja_JP/core.po
index 0e8b19b17e3..73ad535aee2 100644
--- a/l10n/ja_JP/core.po
+++ b/l10n/ja_JP/core.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 06:25+0000\n"
+"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -112,7 +112,7 @@ msgstr "一時的なプロファイル用画像が利用できません。もう
#: avatar/controller.php:135
msgid "No crop data provided"
-msgstr ""
+msgstr "クロップデータは提供されません"
#: js/config.php:32
msgid "Sunday"
@@ -269,21 +269,21 @@ msgstr "メッセージテンプレートの読み込みエラー: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
+msgstr[0] "{count} ファイルが競合"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "1ファイルが競合"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "どちらのファイルを保持したいですか?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "両方のバージョンを選択した場合は、ファイル名の後ろに数字を追加したファイルのコピーを作成します。"
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -291,19 +291,19 @@ msgstr "キャンセル"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "続ける"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(全て選択)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} 選択)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "既存ファイルのテンプレートの読み込みエラー"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -314,7 +314,7 @@ msgstr "オブジェクタイプが指定されていません。"
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "エラー"
@@ -334,7 +334,7 @@ msgstr "共有中"
msgid "Share"
msgstr "共有"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "共有でエラー発生"
@@ -434,23 +434,23 @@ msgstr "削除"
msgid "share"
msgstr "共有"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "パスワード保護"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "有効期限の未設定エラー"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "有効期限の設定でエラー発生"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "送信中..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "メールを送信しました"
diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po
index b712c8b95a9..23062b05965 100644
--- a/l10n/ja_JP/files.po
+++ b/l10n/ja_JP/files.po
@@ -12,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-30 06:27+0000\n"
+"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -81,23 +81,23 @@ msgstr "ストレージに十分な空き容量がありません"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "アップロードに失敗。ファイル情報を取得できませんでした。"
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "アップロードに失敗。アップロード済みのファイルを見つけることができませんでした。"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "無効なディレクトリです。"
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "ファイル"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "ディレクトリもしくは0バイトのため {filename} をアップロードできません"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -109,7 +109,7 @@ msgstr "アップロードはキャンセルされました。"
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "サーバから結果を取得できませんでした。"
#: js/file-upload.js:446
msgid ""
@@ -223,7 +223,7 @@ msgstr "ダウンロードの準備中です。ファイルサイズが大きい
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "ファイルの移動エラー"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po
index c9851b54dea..9414aa1720c 100644
--- a/l10n/ja_JP/settings.po
+++ b/l10n/ja_JP/settings.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
+"PO-Revision-Date: 2013-09-30 06:33+0000\n"
+"Last-Translator: Daisuke Deguchi <ddeguchi@nagoya-u.jp>\n"
"Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -89,42 +89,42 @@ msgstr "アプリを更新出来ませんでした。"
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "無効なパスワード"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "ユーザが指定されていません"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "復元用の管理者パスワードを入力してください。そうでない場合は、全ユーザのデータが失われます。"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "無効な復元用の管理者パスワード。パスワードを確認して再度実行してください。"
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "バックエンドはパスワード変更をサポートしていませんが、ユーザの暗号化キーは正常に更新されました。"
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "パスワードを変更できません"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "{appversion} に更新"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "無効"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "有効化"
@@ -132,43 +132,43 @@ msgstr "有効化"
msgid "Please wait...."
msgstr "しばらくお待ちください。"
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "アプリ無効化中にエラーが発生"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "アプリ有効化中にエラーが発生"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "更新中...."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "アプリの更新中にエラーが発生"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "エラー"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "更新"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "更新済み"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
msgstr "プロファイル画像を選択"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "ファイルを複合中... しばらくお待ちください、この処理には少し時間がかかるかもしれません。"
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "保存中..."
@@ -496,11 +496,11 @@ msgstr "プロフィール写真"
#: templates/personal.php:90
msgid "Upload new"
-msgstr ""
+msgstr "新規にアップロード"
#: templates/personal.php:92
msgid "Select new from Files"
-msgstr ""
+msgstr "ファイルから新規に選択"
#: templates/personal.php:93
msgid "Remove image"
@@ -508,7 +508,7 @@ msgstr "画像を削除"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
-msgstr ""
+msgstr "png と jpg のいずれか。正方形が理想ですが、切り取って加工することも可能です。"
#: templates/personal.php:97
msgid "Abort"
diff --git a/l10n/ko/files.po b/l10n/ko/files.po
index b2497ad3499..d3f72518cc7 100644
--- a/l10n/ko/files.po
+++ b/l10n/ko/files.po
@@ -5,13 +5,14 @@
# Translators:
# ujuc Gang <potopro@gmail.com>, 2013
# ujuc Gang <potopro@gmail.com>, 2013
+# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-29 10:06+0000\n"
+"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -31,11 +32,11 @@ msgstr "%s 항목을 이딩시키지 못하였음"
#: ajax/upload.php:16 ajax/upload.php:45
msgid "Unable to set upload directory."
-msgstr ""
+msgstr "업로드 디렉터리를 정할수 없습니다"
#: ajax/upload.php:22
msgid "Invalid Token"
-msgstr ""
+msgstr "잘못된 토큰"
#: ajax/upload.php:59
msgid "No file was uploaded. Unknown error"
@@ -78,23 +79,23 @@ msgstr "저장소가 용량이 충분하지 않습니다."
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "업로드에 실패했습니다. 파일 정보를 가져올수 없습니다."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "업로드에 실패했습니다. 업로드할 파일을 찾을수 없습니다"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "올바르지 않은 디렉터리입니다."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "파일"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "{filename}을 업로드 할수 없습니다. 폴더이거나 0 바이트 파일입니다."
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -106,7 +107,7 @@ msgstr "업로드가 취소되었습니다."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "서버에서 결과를 가져올수 없습니다."
#: js/file-upload.js:446
msgid ""
@@ -119,7 +120,7 @@ msgstr "URL을 입력해야 합니다."
#: js/file-upload.js:525 lib/app.php:53
msgid "Invalid folder name. Usage of 'Shared' is reserved by ownCloud"
-msgstr ""
+msgstr "유효하지 않은 폴더명입니다. \"Shared\" 이름의 사용은 OwnCloud 가 이미 예약하고 있습니다."
#: js/file-upload.js:557 js/file-upload.js:573 js/files.js:507 js/files.js:545
msgid "Error"
@@ -168,21 +169,21 @@ msgstr "되돌리기"
#: js/filelist.js:533 js/filelist.js:599 js/files.js:576
msgid "%n folder"
msgid_plural "%n folders"
-msgstr[0] ""
+msgstr[0] "폴더 %n"
#: js/filelist.js:534 js/filelist.js:600 js/files.js:582
msgid "%n file"
msgid_plural "%n files"
-msgstr[0] ""
+msgstr[0] "파일 %n 개"
#: js/filelist.js:541
msgid "{dirs} and {files}"
-msgstr ""
+msgstr "{dirs} 그리고 {files}"
#: js/filelist.js:731 js/filelist.js:769
msgid "Uploading %n file"
msgid_plural "Uploading %n files"
-msgstr[0] ""
+msgstr[0] "%n 개의 파일을 업로드중"
#: js/files.js:25
msgid "'.' is an invalid file name."
@@ -210,7 +211,7 @@ msgstr "저장 공간이 거의 가득 찼습니다 ({usedSpacePercent}%)"
msgid ""
"Encryption was disabled but your files are still encrypted. Please go to "
"your personal settings to decrypt your files."
-msgstr ""
+msgstr "암호화는 해제되어 있지만, 파일은 아직 암호화 되어 있습니다. 개인 설저에 가셔서 암호를 해제하십시오"
#: js/files.js:296
msgid ""
@@ -220,7 +221,7 @@ msgstr "다운로드가 준비 중입니다. 파일 크기가 크다면 시간
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "파일 이동 오류"
#: js/files.js:558 templates/index.php:61
msgid "Name"
@@ -237,7 +238,7 @@ msgstr "수정됨"
#: lib/app.php:73
#, php-format
msgid "%s could not be renamed"
-msgstr ""
+msgstr "%s 의 이름을 변경할수 없습니다"
#: lib/helper.php:11 templates/index.php:17
msgid "Upload"
diff --git a/l10n/ko/files_sharing.po b/l10n/ko/files_sharing.po
index 434e19ca27a..da94ad32110 100644
--- a/l10n/ko/files_sharing.po
+++ b/l10n/ko/files_sharing.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-13 21:46-0400\n"
-"PO-Revision-Date: 2013-09-14 00:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 10:14+0000\n"
+"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,7 +20,7 @@ msgstr ""
#: templates/authenticate.php:4
msgid "The password is wrong. Try again."
-msgstr ""
+msgstr "비밀번호가 틀립니다. 다시 입력해주세요."
#: templates/authenticate.php:7
msgid "Password"
@@ -31,27 +32,27 @@ msgstr "제출"
#: templates/part.404.php:3
msgid "Sorry, this link doesn’t seem to work anymore."
-msgstr ""
+msgstr "죄송합니다만 이 링크는 더이상 작동되지 않습니다."
#: templates/part.404.php:4
msgid "Reasons might be:"
-msgstr ""
+msgstr "이유는 다음과 같을 수 있습니다:"
#: templates/part.404.php:6
msgid "the item was removed"
-msgstr ""
+msgstr "이 항목은 삭제되었습니다"
#: templates/part.404.php:7
msgid "the link expired"
-msgstr ""
+msgstr "링크가 만료되었습니다"
#: templates/part.404.php:8
msgid "sharing is disabled"
-msgstr ""
+msgstr "공유가 비활성되었습니다"
#: templates/part.404.php:10
msgid "For more info, please ask the person who sent this link."
-msgstr ""
+msgstr "더 자세한 설명은 링크를 보내신 분에게 여쭤보십시오"
#: templates/public.php:15
#, php-format
diff --git a/l10n/ko/files_trashbin.po b/l10n/ko/files_trashbin.po
index 3e48f534a18..4d39e2d9acd 100644
--- a/l10n/ko/files_trashbin.po
+++ b/l10n/ko/files_trashbin.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-08-15 04:47-0400\n"
-"PO-Revision-Date: 2013-08-15 08:48+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 07:38+0000\n"
+"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -20,63 +21,63 @@ msgstr ""
#: ajax/delete.php:42
#, php-format
msgid "Couldn't delete %s permanently"
-msgstr ""
+msgstr "%s를 영구적으로 삭제할수 없습니다"
#: ajax/undelete.php:42
#, php-format
msgid "Couldn't restore %s"
-msgstr ""
+msgstr "%s를 복원할수 없습니다"
-#: js/trash.js:7 js/trash.js:100
+#: js/trash.js:7 js/trash.js:102
msgid "perform restore operation"
-msgstr ""
+msgstr "복원 작업중"
-#: js/trash.js:20 js/trash.js:48 js/trash.js:118 js/trash.js:146
+#: js/trash.js:20 js/trash.js:49 js/trash.js:120 js/trash.js:148
msgid "Error"
msgstr "오류"
-#: js/trash.js:36
+#: js/trash.js:37
msgid "delete file permanently"
-msgstr ""
+msgstr "영구적으로 파일 삭제하기"
-#: js/trash.js:127
+#: js/trash.js:129
msgid "Delete permanently"
msgstr "영원히 삭제"
-#: js/trash.js:182 templates/index.php:17
+#: js/trash.js:190 templates/index.php:21
msgid "Name"
msgstr "이름"
-#: js/trash.js:183 templates/index.php:27
+#: js/trash.js:191 templates/index.php:31
msgid "Deleted"
-msgstr ""
+msgstr "삭제됨"
-#: js/trash.js:191
+#: js/trash.js:199
msgid "%n folder"
msgid_plural "%n folders"
-msgstr[0] ""
+msgstr[0] "폴더 %n개"
-#: js/trash.js:197
+#: js/trash.js:205
msgid "%n file"
msgid_plural "%n files"
-msgstr[0] ""
+msgstr[0] "파일 %n개 "
-#: lib/trash.php:819 lib/trash.php:821
+#: lib/trashbin.php:814 lib/trashbin.php:816
msgid "restored"
-msgstr ""
+msgstr "복원됨"
#: templates/index.php:9
msgid "Nothing in here. Your trash bin is empty!"
-msgstr ""
+msgstr "현재 휴지통은 비어있습니다!"
-#: templates/index.php:20 templates/index.php:22
+#: templates/index.php:24 templates/index.php:26
msgid "Restore"
msgstr "복원"
-#: templates/index.php:30 templates/index.php:31
+#: templates/index.php:34 templates/index.php:35
msgid "Delete"
msgstr "삭제"
#: templates/part.breadcrumb.php:9
msgid "Deleted Files"
-msgstr ""
+msgstr "삭제된 파일들"
diff --git a/l10n/ko/files_versions.po b/l10n/ko/files_versions.po
index 19ec188ee6c..1a9375ae400 100644
--- a/l10n/ko/files_versions.po
+++ b/l10n/ko/files_versions.po
@@ -4,13 +4,14 @@
#
# Translators:
# Shinjo Park <kde@peremen.name>, 2013
+# smallsnail <bjh13579@gmail.com>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-07-28 01:56-0400\n"
-"PO-Revision-Date: 2013-07-27 06:10+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 10:18+0000\n"
+"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -29,16 +30,16 @@ msgstr "버전"
#: js/versions.js:53
msgid "Failed to revert {file} to revision {timestamp}."
-msgstr ""
+msgstr "{timestamp} 판의 {file}로 돌리는데 실패했습니다."
#: js/versions.js:79
msgid "More versions..."
-msgstr ""
+msgstr "더 많은 버전들..."
#: js/versions.js:116
msgid "No other versions available"
-msgstr ""
+msgstr "다른 버전을 사용할수 없습니다"
-#: js/versions.js:149
+#: js/versions.js:145
msgid "Restore"
msgstr "복원"
diff --git a/l10n/ko/lib.po b/l10n/ko/lib.po
index 06627a79781..ca05c5e1330 100644
--- a/l10n/ko/lib.po
+++ b/l10n/ko/lib.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-16 11:33-0400\n"
-"PO-Revision-Date: 2013-09-16 15:34+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 07:46+0000\n"
+"Last-Translator: smallsnail <bjh13579@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,53 +19,53 @@ msgstr ""
"Language: ko\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: app.php:239
+#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr "현재 ownCloud 버전과 호환되지 않기 때문에 \"%s\" 앱을 설치할 수 없습니다."
-#: app.php:250
+#: app.php:248
msgid "No app name specified"
msgstr "앱 이름이 지정되지 않았습니다."
-#: app.php:361
+#: app.php:352
msgid "Help"
msgstr "도움말"
-#: app.php:374
+#: app.php:365
msgid "Personal"
msgstr "개인"
-#: app.php:385
+#: app.php:376
msgid "Settings"
msgstr "설정"
-#: app.php:397
+#: app.php:388
msgid "Users"
msgstr "사용자"
-#: app.php:410
+#: app.php:401
msgid "Admin"
msgstr "관리자"
-#: app.php:839
+#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "\"%s\" 업그레이드에 실패했습니다."
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
-msgstr ""
+msgstr "개개인의 프로필 사진은 아직은 암호화 되지 않습니다"
#: avatar.php:64
msgid "Unknown filetype"
-msgstr ""
+msgstr "알수없는 파일형식"
#: avatar.php:69
msgid "Invalid image"
-msgstr ""
+msgstr "잘못된 그림"
#: defaults.php:35
msgid "web services under your control"
@@ -96,7 +96,7 @@ msgstr "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다."
msgid ""
"Download the files in smaller chunks, seperately or kindly ask your "
"administrator."
-msgstr ""
+msgstr "작은 조각들 안에 들어있는 파일들을 받고자 하신다면, 나누어서 받으시거나 혹은 시스템 관리자에게 정중하게 물어보십시오"
#: installer.php:63
msgid "No source specified when installing app"
@@ -166,15 +166,15 @@ msgstr "인증 오류"
msgid "Token expired. Please reload page."
msgstr "토큰이 만료되었습니다. 페이지를 새로 고치십시오."
-#: search/provider/file.php:17 search/provider/file.php:35
+#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "파일"
-#: search/provider/file.php:26 search/provider/file.php:33
+#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "텍스트"
-#: search/provider/file.php:29
+#: search/provider/file.php:30
msgid "Images"
msgstr "그림"
@@ -278,6 +278,11 @@ msgstr "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오."
+#: tags.php:194
+#, php-format
+msgid "Could not find category \"%s\""
+msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
+
#: template/functions.php:96
msgid "seconds ago"
msgstr "초 전"
@@ -325,8 +330,3 @@ msgstr "년 전"
#: template.php:297
msgid "Caused by:"
msgstr "원인: "
-
-#: vcategories.php:188 vcategories.php:249
-#, php-format
-msgid "Could not find category \"%s\""
-msgstr "분류 \"%s\"을(를) 찾을 수 없습니다."
diff --git a/l10n/lt_LT/core.po b/l10n/lt_LT/core.po
index f340c7a46db..4a22a7c9482 100644
--- a/l10n/lt_LT/core.po
+++ b/l10n/lt_LT/core.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-29 07:58+0000\n"
+"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -277,23 +277,23 @@ msgstr "Klaida įkeliant žinutės ruošinį: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "{count} failas konfliktuoja"
+msgstr[1] "{count} failai konfliktuoja"
+msgstr[2] "{count} failų konfliktų"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Vienas failo konfliktas"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Kuriuos failus norite laikyti?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Jei pasirenkate abi versijas, nukopijuotas failas turės pridėtą numerį pavadinime."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -301,19 +301,19 @@ msgstr "Atšaukti"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Tęsti"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(visi pažymėti)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} pažymėtų)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Klaida įkeliant esančių failų ruošinį"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -324,7 +324,7 @@ msgstr "Objekto tipas nenurodytas."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Klaida"
@@ -344,7 +344,7 @@ msgstr "Dalinamasi"
msgid "Share"
msgstr "Dalintis"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Klaida, dalijimosi metu"
@@ -444,23 +444,23 @@ msgstr "ištrinti"
msgid "share"
msgstr "dalintis"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Apsaugota slaptažodžiu"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Klaida nuimant galiojimo laiką"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Klaida nustatant galiojimo laiką"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Siunčiama..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "Laiškas išsiųstas"
diff --git a/l10n/lt_LT/files.po b/l10n/lt_LT/files.po
index da69b0a419b..829d61188a3 100644
--- a/l10n/lt_LT/files.po
+++ b/l10n/lt_LT/files.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-29 08:46+0000\n"
+"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,23 +78,23 @@ msgstr "Nepakanka vietos serveryje"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "Įkėlimas nepavyko. Nepavyko gauti failo informacijos."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "Įkėlimas nepavyko. Nepavyko rasti įkelto failo"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Neteisingas aplankas"
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Failai"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -106,7 +106,7 @@ msgstr "Įkėlimas atšauktas."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Nepavyko gauti rezultato iš serverio."
#: js/file-upload.js:446
msgid ""
@@ -226,7 +226,7 @@ msgstr "Jūsų atsisiuntimas yra paruošiamas. tai gali užtrukti jei atsisiunč
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Klaida perkeliant failą"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/lt_LT/settings.po b/l10n/lt_LT/settings.po
index 14592409dd9..ff719fb19fe 100644
--- a/l10n/lt_LT/settings.po
+++ b/l10n/lt_LT/settings.po
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
+"PO-Revision-Date: 2013-09-29 08:49+0000\n"
+"Last-Translator: Liudas Ališauskas <liudas.alisauskas@gmail.com>\n"
"Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -90,42 +90,42 @@ msgstr "Nepavyko atnaujinti programos."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Neteisingas slaptažodis"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "Nepateiktas naudotojas"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Prašome įvesti administratoriaus atkūrimo slaptažodį, kitaip visi naudotojo suomenys bus prarasti"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "Sistema nepalaiko slaptažodžio keitimo, bet naudotojo šifravimo raktas buvo sėkmingai atnaujintas."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Nepavyksta pakeisti slaptažodžio"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Atnaujinti iki {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Išjungti"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Įjungti"
@@ -133,43 +133,43 @@ msgstr "Įjungti"
msgid "Please wait...."
msgstr "Prašome palaukti..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Klaida išjungiant programą"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Klaida įjungiant programą"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Atnaujinama..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Įvyko klaida atnaujinant programą"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Klaida"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Atnaujinti"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Atnaujinta"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
msgstr "Pažymėkite profilio paveikslėlį"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Iššifruojami failai... Prašome palaukti, tai gali užtrukti."
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Saugoma..."
diff --git a/l10n/nn_NO/core.po b/l10n/nn_NO/core.po
index 40a6de51ba5..e16776a0986 100644
--- a/l10n/nn_NO/core.po
+++ b/l10n/nn_NO/core.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 08:30+0000\n"
+"Last-Translator: unhammer <unhammer+dill@mm.st>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -95,23 +95,23 @@ msgstr "Klarte ikkje fjerna %s frå favorittar."
#: avatar/controller.php:62
msgid "No image or file provided"
-msgstr ""
+msgstr "Inga bilete eller fil gitt"
#: avatar/controller.php:81
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ukjend filtype"
#: avatar/controller.php:85
msgid "Invalid image"
-msgstr ""
+msgstr "Ugyldig bilete"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
-msgstr ""
+msgstr "Inga midlertidig profilbilete tilgjengeleg, prøv igjen"
#: avatar/controller.php:135
msgid "No crop data provided"
-msgstr ""
+msgstr "Ingen beskjeringsdata gitt"
#: js/config.php:32
msgid "Sunday"
@@ -251,7 +251,7 @@ msgstr "Vel"
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
-msgstr ""
+msgstr "Klarte ikkje å lasta filplukkarmal: {error}"
#: js/oc-dialogs.js:172
msgid "Yes"
@@ -267,27 +267,27 @@ msgstr "Greitt"
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
-msgstr ""
+msgstr "Klarte ikkje å lasta meldingsmal: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{count} filkonflikt"
+msgstr[1] "{count} filkonfliktar"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Éin filkonflikt"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Kva filer vil du spara?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Viss du vel begge utgåvene, vil den kopierte fila få eit tal lagt til namnet."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -295,19 +295,19 @@ msgstr "Avbryt"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Gå vidare"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(alle valte)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} valte)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Klarte ikkje å lasta fil-finst-mal"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -318,7 +318,7 @@ msgstr "Objekttypen er ikkje spesifisert."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Feil"
@@ -338,7 +338,7 @@ msgstr "Delt"
msgid "Share"
msgstr "Del"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Feil ved deling"
@@ -438,23 +438,23 @@ msgstr "slett"
msgid "share"
msgstr "del"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Passordverna"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Klarte ikkje fjerna utløpsdato"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Klarte ikkje setja utløpsdato"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Sender …"
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "E-post sendt"
diff --git a/l10n/nn_NO/files.po b/l10n/nn_NO/files.po
index 0573ecf2951..dc82bdca1b7 100644
--- a/l10n/nn_NO/files.po
+++ b/l10n/nn_NO/files.po
@@ -5,13 +5,14 @@
# Translators:
# unhammer <unhammer+dill@mm.st>, 2013
# unhammer <unhammer+dill@mm.st>, 2013
+# unhammer <unhammer+dill@mm.st>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 08:20+0000\n"
+"Last-Translator: unhammer <unhammer+dill@mm.st>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -78,23 +79,23 @@ msgstr "Ikkje nok lagringsplass tilgjengeleg"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "Feil ved opplasting. Klarte ikkje å henta filinfo."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "Feil ved opplasting. Klarte ikkje å finna opplasta fil."
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Ugyldig mappe."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Filer"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte."
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -106,7 +107,7 @@ msgstr "Opplasting avbroten."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Klarte ikkje å henta resultat frå tenaren."
#: js/file-upload.js:446
msgid ""
@@ -223,7 +224,7 @@ msgstr "Gjer klar nedlastinga di. Dette kan ta ei stund viss filene er store."
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Feil ved flytting av fil"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/nn_NO/lib.po b/l10n/nn_NO/lib.po
index dd499893e3c..9e73f6fe6aa 100644
--- a/l10n/nn_NO/lib.po
+++ b/l10n/nn_NO/lib.po
@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-16 11:33-0400\n"
-"PO-Revision-Date: 2013-09-16 15:34+0000\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 08:30+0000\n"
"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
@@ -61,11 +61,11 @@ msgstr ""
#: avatar.php:64
msgid "Unknown filetype"
-msgstr ""
+msgstr "Ukjend filtype"
#: avatar.php:69
msgid "Invalid image"
-msgstr ""
+msgstr "Ugyldig bilete"
#: defaults.php:35
msgid "web services under your control"
@@ -166,15 +166,15 @@ msgstr "Feil i autentisering"
msgid "Token expired. Please reload page."
msgstr ""
-#: search/provider/file.php:17 search/provider/file.php:35
+#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "Filer"
-#: search/provider/file.php:26 search/provider/file.php:33
+#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "Tekst"
-#: search/provider/file.php:29
+#: search/provider/file.php:30
msgid "Images"
msgstr ""
diff --git a/l10n/nn_NO/settings.po b/l10n/nn_NO/settings.po
index 6100216bbda..761b9f46275 100644
--- a/l10n/nn_NO/settings.po
+++ b/l10n/nn_NO/settings.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-24 12:58-0400\n"
+"PO-Revision-Date: 2013-09-24 08:30+0000\n"
+"Last-Translator: unhammer <unhammer+dill@mm.st>\n"
"Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -89,42 +89,42 @@ msgstr "Klarte ikkje oppdatera programmet."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Feil passord"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "Ingen brukar gitt"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Ver venleg og gi eit admingjenopprettingspassord, elles vil all brukardata gå tapt."
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Feil admingjenopprettingspassord. Ver venleg og sjekk passordet og prøv igjen."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "Bakstykket støttar ikkje passordendring, men krypteringsnøkkelen til brukaren blei oppdatert."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Klarte ikkje å endra passordet"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Oppdater til {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Slå av"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Slå på"
@@ -132,37 +132,37 @@ msgstr "Slå på"
msgid "Please wait...."
msgstr "Ver venleg og vent …"
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Klarte ikkje å skru av programmet"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Klarte ikkje å skru på programmet"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Oppdaterer …"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Feil ved oppdatering av app"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Feil"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Oppdater"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Oppdatert"
#: js/personal.js:220
msgid "Select a profile picture"
-msgstr ""
+msgstr "Vel eit profilbilete"
#: js/personal.js:265
msgid "Decrypting files... Please wait, this can take some time."
@@ -492,31 +492,31 @@ msgstr "Fyll inn e-postadressa di for å gjera passordgjenoppretting mogleg"
#: templates/personal.php:86
msgid "Profile picture"
-msgstr ""
+msgstr "Profilbilete"
#: templates/personal.php:90
msgid "Upload new"
-msgstr ""
+msgstr "Last opp ny"
#: templates/personal.php:92
msgid "Select new from Files"
-msgstr ""
+msgstr "Vel ny frå Filer"
#: templates/personal.php:93
msgid "Remove image"
-msgstr ""
+msgstr "Fjern bilete"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
-msgstr ""
+msgstr "Anten PNG eller JPG. Helst kvadratisk, men du får moglegheita til å beskjera det."
#: templates/personal.php:97
msgid "Abort"
-msgstr ""
+msgstr "Avbryt"
#: templates/personal.php:98
msgid "Choose as profile image"
-msgstr ""
+msgstr "Vel som profilbilete"
#: templates/personal.php:106 templates/personal.php:107
msgid "Language"
diff --git a/l10n/pl/core.po b/l10n/pl/core.po
index 3d7aae83bae..d3f781b0e4d 100644
--- a/l10n/pl/core.po
+++ b/l10n/pl/core.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 12:27+0000\n"
+"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -98,11 +98,11 @@ msgstr ""
#: avatar/controller.php:81
msgid "Unknown filetype"
-msgstr ""
+msgstr "Nieznany typ pliku"
#: avatar/controller.php:85
msgid "Invalid image"
-msgstr ""
+msgstr "Nieprawidłowe zdjęcie"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
@@ -275,13 +275,13 @@ msgstr ""
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "{count} konfliktów plików"
+msgstr[1] "{count} konfliktów plików"
+msgstr[2] "{count} konfliktów plików"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "Konflikt pliku"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
@@ -299,15 +299,15 @@ msgstr "Anuluj"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Kontynuuj "
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(wszystkie zaznaczone)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} zaznaczonych)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
@@ -322,7 +322,7 @@ msgstr "Nie określono typu obiektu."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Błąd"
@@ -342,7 +342,7 @@ msgstr "Udostępniono"
msgid "Share"
msgstr "Udostępnij"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Błąd podczas współdzielenia"
@@ -442,23 +442,23 @@ msgstr "usuń"
msgid "share"
msgstr "współdziel"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Zabezpieczone hasłem"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Błąd podczas usuwania daty wygaśnięcia"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Błąd podczas ustawiania daty wygaśnięcia"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Wysyłanie..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "E-mail wysłany"
diff --git a/l10n/pl/files.po b/l10n/pl/files.po
index b94335006bb..a88ee97ad7e 100644
--- a/l10n/pl/files.po
+++ b/l10n/pl/files.po
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
+"PO-Revision-Date: 2013-09-30 12:24+0000\n"
+"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -79,23 +79,23 @@ msgstr "Za mało dostępnego miejsca"
#: ajax/upload.php:120 ajax/upload.php:143
msgid "Upload failed. Could not get file info."
-msgstr ""
+msgstr "Nieudane przesłanie. Nie można pobrać informacji o pliku."
#: ajax/upload.php:136
msgid "Upload failed. Could not find uploaded file"
-msgstr ""
+msgstr "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku"
#: ajax/upload.php:160
msgid "Invalid directory."
msgstr "Zła ścieżka."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Pliki"
#: js/file-upload.js:244
msgid "Unable to upload {filename} as it is a directory or has 0 bytes"
-msgstr ""
+msgstr "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów"
#: js/file-upload.js:255
msgid "Not enough space available"
@@ -107,7 +107,7 @@ msgstr "Wczytywanie anulowane."
#: js/file-upload.js:356
msgid "Could not get result from server."
-msgstr ""
+msgstr "Nie można uzyskać wyniku z serwera."
#: js/file-upload.js:446
msgid ""
@@ -227,7 +227,7 @@ msgstr "Pobieranie jest przygotowywane. Może to zająć trochę czasu jeśli pl
#: js/files.js:507 js/files.js:545
msgid "Error moving file"
-msgstr ""
+msgstr "Błąd prz przenoszeniu pliku"
#: js/files.js:558 templates/index.php:61
msgid "Name"
diff --git a/l10n/pl/lib.po b/l10n/pl/lib.po
index beae34e5803..9e29c51c5a9 100644
--- a/l10n/pl/lib.po
+++ b/l10n/pl/lib.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-16 11:33-0400\n"
-"PO-Revision-Date: 2013-09-16 15:34+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
+"PO-Revision-Date: 2013-09-30 12:26+0000\n"
+"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,53 +18,53 @@ msgstr ""
"Language: pl\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: app.php:239
+#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version"
" of ownCloud."
msgstr "Aplikacja \"%s\" nie może zostać zainstalowana, ponieważ nie jest zgodna z tą wersją ownCloud."
-#: app.php:250
+#: app.php:248
msgid "No app name specified"
msgstr "Nie określono nazwy aplikacji"
-#: app.php:361
+#: app.php:352
msgid "Help"
msgstr "Pomoc"
-#: app.php:374
+#: app.php:365
msgid "Personal"
msgstr "Osobiste"
-#: app.php:385
+#: app.php:376
msgid "Settings"
msgstr "Ustawienia"
-#: app.php:397
+#: app.php:388
msgid "Users"
msgstr "Użytkownicy"
-#: app.php:410
+#: app.php:401
msgid "Admin"
msgstr "Administrator"
-#: app.php:839
+#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr "Błąd przy aktualizacji \"%s\"."
#: avatar.php:56
msgid "Custom profile pictures don't work with encryption yet"
-msgstr ""
+msgstr "Domyślny profil zdjęć nie działa z szyfrowaniem jeszcze"
#: avatar.php:64
msgid "Unknown filetype"
-msgstr ""
+msgstr "Nieznany typ pliku"
#: avatar.php:69
msgid "Invalid image"
-msgstr ""
+msgstr "Błędne zdjęcie"
#: defaults.php:35
msgid "web services under your control"
@@ -165,15 +165,15 @@ msgstr "Błąd uwierzytelniania"
msgid "Token expired. Please reload page."
msgstr "Token wygasł. Proszę ponownie załadować stronę."
-#: search/provider/file.php:17 search/provider/file.php:35
+#: search/provider/file.php:18 search/provider/file.php:36
msgid "Files"
msgstr "Pliki"
-#: search/provider/file.php:26 search/provider/file.php:33
+#: search/provider/file.php:27 search/provider/file.php:34
msgid "Text"
msgstr "Połączenie tekstowe"
-#: search/provider/file.php:29
+#: search/provider/file.php:30
msgid "Images"
msgstr "Obrazy"
@@ -277,6 +277,11 @@ msgstr "Serwer internetowy nie jest jeszcze poprawnie skonfigurowany, aby umożl
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr "Sprawdź ponownie <a href='%s'>przewodniki instalacji</a>."
+#: tags.php:194
+#, php-format
+msgid "Could not find category \"%s\""
+msgstr "Nie można odnaleźć kategorii \"%s\""
+
#: template/functions.php:96
msgid "seconds ago"
msgstr "sekund temu"
@@ -332,8 +337,3 @@ msgstr "lat temu"
#: template.php:297
msgid "Caused by:"
msgstr "Spowodowane przez:"
-
-#: vcategories.php:188 vcategories.php:249
-#, php-format
-msgid "Could not find category \"%s\""
-msgstr "Nie można odnaleźć kategorii \"%s\""
diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po
index 5b5e435ef1c..830b2045a3f 100644
--- a/l10n/pl/settings.po
+++ b/l10n/pl/settings.po
@@ -9,9 +9,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
+"PO-Revision-Date: 2013-09-30 12:15+0000\n"
+"Last-Translator: Cyryl Sochacki <cyrylsochacki@gmail.com>\n"
"Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -88,7 +88,7 @@ msgstr "Nie można uaktualnić aplikacji."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Złe hasło"
#: changepassword/controller.php:42
msgid "No user supplied"
@@ -113,17 +113,17 @@ msgstr ""
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Nie można zmienić hasła"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Aktualizacja do {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Wyłącz"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Włącz"
@@ -131,43 +131,43 @@ msgstr "Włącz"
msgid "Please wait...."
msgstr "Proszę czekać..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Błąd podczas wyłączania aplikacji"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Błąd podczas włączania aplikacji"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Aktualizacja w toku..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Błąd podczas aktualizacji aplikacji"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Błąd"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Aktualizuj"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Zaktualizowano"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
-msgstr ""
+msgstr "Wybierz zdjęcie profilu"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Odszyfrowuje pliki... Proszę czekać, to może zająć jakiś czas."
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Zapisywanie..."
@@ -495,15 +495,15 @@ msgstr "Zdjęcie profilu"
#: templates/personal.php:90
msgid "Upload new"
-msgstr ""
+msgstr "Wczytaj nowe"
#: templates/personal.php:92
msgid "Select new from Files"
-msgstr ""
+msgstr "Wybierz nowe z plików"
#: templates/personal.php:93
msgid "Remove image"
-msgstr ""
+msgstr "Usuń zdjęcie"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
@@ -515,7 +515,7 @@ msgstr "Anuluj"
#: templates/personal.php:98
msgid "Choose as profile image"
-msgstr ""
+msgstr "Wybierz zdjęcie profilu"
#: templates/personal.php:106 templates/personal.php:107
msgid "Language"
diff --git a/l10n/sv/core.po b/l10n/sv/core.po
index 64959498162..3d94872f70d 100644
--- a/l10n/sv/core.po
+++ b/l10n/sv/core.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Daniel Sandman <revoltism@gmail.com>, 2013
# Gunnar Norin <blittan@xbmc.org>, 2013
# medialabs, 2013
# Magnus Höglund <magnus@linux.com>, 2013
@@ -11,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
-"PO-Revision-Date: 2013-09-20 15:01+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-28 02:02+0000\n"
+"Last-Translator: Daniel Sandman <revoltism@gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -96,23 +97,23 @@ msgstr "Fel vid borttagning av %s från favoriter."
#: avatar/controller.php:62
msgid "No image or file provided"
-msgstr ""
+msgstr "Ingen bild eller fil har tillhandahållits"
#: avatar/controller.php:81
msgid "Unknown filetype"
-msgstr ""
+msgstr "Okänd filtyp"
#: avatar/controller.php:85
msgid "Invalid image"
-msgstr ""
+msgstr "Ogiltig bild"
#: avatar/controller.php:115 avatar/controller.php:142
msgid "No temporary profile picture available, try again"
-msgstr ""
+msgstr "Ingen temporär profilbild finns tillgänglig, försök igen"
#: avatar/controller.php:135
msgid "No crop data provided"
-msgstr ""
+msgstr "Ingen beskärdata har angivits"
#: js/config.php:32
msgid "Sunday"
@@ -252,7 +253,7 @@ msgstr "Välj"
#: js/oc-dialogs.js:146
msgid "Error loading file picker template: {error}"
-msgstr ""
+msgstr "Fel uppstod för filväljarmall: {error}"
#: js/oc-dialogs.js:172
msgid "Yes"
@@ -268,27 +269,27 @@ msgstr "Ok"
#: js/oc-dialogs.js:219
msgid "Error loading message template: {error}"
-msgstr ""
+msgstr "Fel uppstod under inläsningen av meddelandemallen: {error}"
#: js/oc-dialogs.js:347
msgid "{count} file conflict"
msgid_plural "{count} file conflicts"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "{count} filkonflikt"
+msgstr[1] "{count} filkonflikter"
#: js/oc-dialogs.js:361
msgid "One file conflict"
-msgstr ""
+msgstr "En filkonflikt"
#: js/oc-dialogs.js:367
msgid "Which files do you want to keep?"
-msgstr ""
+msgstr "Vilken fil vill du behålla?"
#: js/oc-dialogs.js:368
msgid ""
"If you select both versions, the copied file will have a number added to its"
" name."
-msgstr ""
+msgstr "Om du väljer båda versionerna kommer de kopierade filerna ha nummer tillagda i filnamnet."
#: js/oc-dialogs.js:376
msgid "Cancel"
@@ -296,19 +297,19 @@ msgstr "Avbryt"
#: js/oc-dialogs.js:386
msgid "Continue"
-msgstr ""
+msgstr "Fortsätt"
#: js/oc-dialogs.js:433 js/oc-dialogs.js:446
msgid "(all selected)"
-msgstr ""
+msgstr "(Alla valda)"
#: js/oc-dialogs.js:436 js/oc-dialogs.js:449
msgid "({count} selected)"
-msgstr ""
+msgstr "({count} valda)"
#: js/oc-dialogs.js:457
msgid "Error loading file exists template"
-msgstr ""
+msgstr "Fel uppstod filmall existerar"
#: js/oc-vcategories.js:5 js/oc-vcategories.js:85 js/oc-vcategories.js:102
#: js/oc-vcategories.js:117 js/oc-vcategories.js:132 js/oc-vcategories.js:162
@@ -319,7 +320,7 @@ msgstr "Objekttypen är inte specificerad."
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr "Fel"
@@ -339,7 +340,7 @@ msgstr "Delad"
msgid "Share"
msgstr "Dela"
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr "Fel vid delning"
@@ -439,23 +440,23 @@ msgstr "radera"
msgid "share"
msgstr "dela"
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr "Lösenordsskyddad"
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr "Fel vid borttagning av utgångsdatum"
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr "Fel vid sättning av utgångsdatum"
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr "Skickar ..."
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr "E-post skickat"
diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po
index 284b1287a87..a0a193043a0 100644
--- a/l10n/sv/settings.po
+++ b/l10n/sv/settings.po
@@ -3,6 +3,7 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# Daniel Sandman <revoltism@gmail.com>, 2013
# Gunnar Norin <blittan@xbmc.org>, 2013
# Jan Busk, 2013
# Jan Busk, 2013
@@ -13,9 +14,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-28 01:44+0000\n"
+"Last-Translator: Daniel Sandman <revoltism@gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -92,42 +93,42 @@ msgstr "Kunde inte uppdatera appen."
#: changepassword/controller.php:20
msgid "Wrong password"
-msgstr ""
+msgstr "Fel lösenord"
#: changepassword/controller.php:42
msgid "No user supplied"
-msgstr ""
+msgstr "Ingen användare angiven"
#: changepassword/controller.php:74
msgid ""
"Please provide an admin recovery password, otherwise all user data will be "
"lost"
-msgstr ""
+msgstr "Ange ett återställningslösenord för administratören. Annars kommer all användardata förloras"
#: changepassword/controller.php:79
msgid ""
"Wrong admin recovery password. Please check the password and try again."
-msgstr ""
+msgstr "Felaktigt återställningslösenord för administratör. Kolla lösenordet och prova igen."
#: changepassword/controller.php:87
msgid ""
"Back-end doesn't support password change, but the users encryption key was "
"successfully updated."
-msgstr ""
+msgstr "Gränssnittet stödjer inte byte av lösenord, men användarnas krypteringsnyckel blev uppdaterad."
#: changepassword/controller.php:92 changepassword/controller.php:103
msgid "Unable to change password"
-msgstr ""
+msgstr "Kunde inte ändra lösenord"
#: js/apps.js:43
msgid "Update to {appversion}"
msgstr "Uppdatera till {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Deaktivera"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Aktivera"
@@ -135,43 +136,43 @@ msgstr "Aktivera"
msgid "Please wait...."
msgstr "Var god vänta..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr "Fel vid inaktivering av app"
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr "Fel vid aktivering av app"
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Uppdaterar..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Fel uppstod vid uppdatering av appen"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Fel"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Uppdatera"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Uppdaterad"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
-msgstr ""
+msgstr "Välj en profilbild"
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr "Dekrypterar filer... Vänligen vänta, detta kan ta en stund."
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Sparar..."
@@ -499,27 +500,27 @@ msgstr "Profilbild"
#: templates/personal.php:90
msgid "Upload new"
-msgstr ""
+msgstr "Ladda upp ny"
#: templates/personal.php:92
msgid "Select new from Files"
-msgstr ""
+msgstr "Välj ny från filer"
#: templates/personal.php:93
msgid "Remove image"
-msgstr ""
+msgstr "Radera bild"
#: templates/personal.php:94
msgid "Either png or jpg. Ideally square but you will be able to crop it."
-msgstr ""
+msgstr "Antingen png eller jpg. Helst fyrkantig, men du kommer att kunna beskära den."
#: templates/personal.php:97
msgid "Abort"
-msgstr ""
+msgstr "Avbryt"
#: templates/personal.php:98
msgid "Choose as profile image"
-msgstr ""
+msgstr "Välj som profilbild"
#: templates/personal.php:106 templates/personal.php:107
msgid "Language"
diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot
index e3ee79caef9..687b168209c 100644
--- a/l10n/templates/core.pot
+++ b/l10n/templates/core.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:55-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -316,7 +316,7 @@ msgstr ""
#: js/oc-vcategories.js:110 js/oc-vcategories.js:125 js/oc-vcategories.js:136
#: js/oc-vcategories.js:172 js/oc-vcategories.js:189 js/oc-vcategories.js:195
#: js/oc-vcategories.js:199 js/share.js:129 js/share.js:142 js/share.js:149
-#: js/share.js:645 js/share.js:657
+#: js/share.js:656 js/share.js:668
msgid "Error"
msgstr ""
@@ -336,7 +336,7 @@ msgstr ""
msgid "Share"
msgstr ""
-#: js/share.js:131 js/share.js:685
+#: js/share.js:131 js/share.js:696
msgid "Error while sharing"
msgstr ""
@@ -436,23 +436,23 @@ msgstr ""
msgid "share"
msgstr ""
-#: js/share.js:400 js/share.js:632
+#: js/share.js:400 js/share.js:643
msgid "Password protected"
msgstr ""
-#: js/share.js:645
+#: js/share.js:656
msgid "Error unsetting expiration date"
msgstr ""
-#: js/share.js:657
+#: js/share.js:668
msgid "Error setting expiration date"
msgstr ""
-#: js/share.js:672
+#: js/share.js:683
msgid "Sending ..."
msgstr ""
-#: js/share.js:683
+#: js/share.js:694
msgid "Email sent"
msgstr ""
diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot
index 6dd2e8281c0..5a5cf056beb 100644
--- a/l10n/templates/files.pot
+++ b/l10n/templates/files.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:51-0400\n"
+"POT-Creation-Date: 2013-09-30 10:14-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot
index 17a33f87927..312f7f29bb0 100644
--- a/l10n/templates/files_encryption.pot
+++ b/l10n/templates/files_encryption.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:51-0400\n"
+"POT-Creation-Date: 2013-09-30 10:15-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot
index 5d1b69c53a1..0ec2c070912 100644
--- a/l10n/templates/files_external.pot
+++ b/l10n/templates/files_external.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot
index bc0fb489f73..77c296c9a7c 100644
--- a/l10n/templates/files_sharing.pot
+++ b/l10n/templates/files_sharing.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/files_trashbin.pot b/l10n/templates/files_trashbin.pot
index c0b82eeb690..b379edf9e93 100644
--- a/l10n/templates/files_trashbin.pot
+++ b/l10n/templates/files_trashbin.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot
index 42221b00287..4d7bff6e8b6 100644
--- a/l10n/templates/files_versions.pot
+++ b/l10n/templates/files_versions.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot
index 15b4f1c6d06..cdaf465ab30 100644
--- a/l10n/templates/lib.pot
+++ b/l10n/templates/lib.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:56-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,38 +18,38 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: app.php:239
+#: app.php:237
#, php-format
msgid ""
"App \"%s\" can't be installed because it is not compatible with this version "
"of ownCloud."
msgstr ""
-#: app.php:250
+#: app.php:248
msgid "No app name specified"
msgstr ""
-#: app.php:361
+#: app.php:352
msgid "Help"
msgstr ""
-#: app.php:374
+#: app.php:365
msgid "Personal"
msgstr ""
-#: app.php:385
+#: app.php:376
msgid "Settings"
msgstr ""
-#: app.php:397
+#: app.php:388
msgid "Users"
msgstr ""
-#: app.php:410
+#: app.php:401
msgid "Admin"
msgstr ""
-#: app.php:839
+#: app.php:832
#, php-format
msgid "Failed to upgrade \"%s\"."
msgstr ""
@@ -277,6 +277,11 @@ msgstr ""
msgid "Please double check the <a href='%s'>installation guides</a>."
msgstr ""
+#: tags.php:194
+#, php-format
+msgid "Could not find category \"%s\""
+msgstr ""
+
#: template/functions.php:96
msgid "seconds ago"
msgstr ""
@@ -328,8 +333,3 @@ msgstr ""
#: template.php:297
msgid "Caused by:"
msgstr ""
-
-#: vcategories.php:188 vcategories.php:249
-#, php-format
-msgid "Could not find category \"%s\""
-msgstr ""
diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot
index 4602bc52d64..af2b7236802 100644
--- a/l10n/templates/settings.pot
+++ b/l10n/templates/settings.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:56-0400\n"
+"POT-Creation-Date: 2013-09-30 10:17-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -116,11 +116,11 @@ msgstr ""
msgid "Update to {appversion}"
msgstr ""
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr ""
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr ""
@@ -128,43 +128,43 @@ msgstr ""
msgid "Please wait...."
msgstr ""
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr ""
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr ""
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr ""
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr ""
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr ""
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr ""
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr ""
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
msgstr ""
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr ""
diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot
index c27848c3666..ca738710f5c 100644
--- a/l10n/templates/user_ldap.pot
+++ b/l10n/templates/user_ldap.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/templates/user_webdavauth.pot b/l10n/templates/user_webdavauth.pot
index e23c0a1dc54..d3a899a1fe5 100644
--- a/l10n/templates/user_webdavauth.pot
+++ b/l10n/templates/user_webdavauth.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud Core 5.0.0\n"
"Report-Msgid-Bugs-To: translations@owncloud.org\n"
-"POT-Creation-Date: 2013-09-22 12:54-0400\n"
+"POT-Creation-Date: 2013-09-30 10:16-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
diff --git a/l10n/uk/files.po b/l10n/uk/files.po
index 23349e0800d..d269f620d94 100644
--- a/l10n/uk/files.po
+++ b/l10n/uk/files.po
@@ -8,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:44-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-27 19:42+0000\n"
+"Last-Translator: zubr139 <zubr139@ukr.net>\n"
"Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -87,7 +87,7 @@ msgstr ""
msgid "Invalid directory."
msgstr "Невірний каталог."
-#: appinfo/app.php:12
+#: appinfo/app.php:11
msgid "Files"
msgstr "Файли"
@@ -118,7 +118,7 @@ msgstr "URL не може бути пустим."
#: js/file-upload.js:525 lib/app.php:53
msgid "Invalid folder name. Usage of 'Shared' is reserved by ownCloud"
-msgstr ""
+msgstr "Неправильне ім'я теки. Використання 'Shared' зарезервовано ownCloud"
#: js/file-upload.js:557 js/file-upload.js:573 js/files.js:507 js/files.js:545
msgid "Error"
@@ -167,9 +167,9 @@ msgstr "відмінити"
#: js/filelist.js:533 js/filelist.js:599 js/files.js:576
msgid "%n folder"
msgid_plural "%n folders"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%n тека"
+msgstr[1] "%n тека"
+msgstr[2] "%n теки"
#: js/filelist.js:534 js/filelist.js:600 js/files.js:582
msgid "%n file"
@@ -290,7 +290,7 @@ msgstr "Текстовий файл"
#: templates/index.php:11
msgid "Folder"
-msgstr "Папка"
+msgstr "Тека"
#: templates/index.php:13
msgid "From link"
diff --git a/l10n/uk/files_encryption.po b/l10n/uk/files_encryption.po
index 46c45f13fea..6957679f93f 100644
--- a/l10n/uk/files_encryption.po
+++ b/l10n/uk/files_encryption.po
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-18 11:46-0400\n"
-"PO-Revision-Date: 2013-09-17 13:05+0000\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-27 19:12+0000\n"
"Last-Translator: zubr139 <zubr139@ukr.net>\n"
"Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n"
"MIME-Version: 1.0\n"
@@ -93,7 +93,7 @@ msgstr ""
#: templates/invalid_private_key.php:7
msgid "personal settings"
-msgstr ""
+msgstr "особисті налаштування"
#: templates/settings-admin.php:5 templates/settings-personal.php:4
msgid "Encryption"
diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po
index a96bef5878c..912467cac90 100644
--- a/l10n/uk/settings.po
+++ b/l10n/uk/settings.po
@@ -3,13 +3,14 @@
# This file is distributed under the same license as the PACKAGE package.
#
# Translators:
+# zubr139 <zubr139@ukr.net>, 2013
msgid ""
msgstr ""
"Project-Id-Version: ownCloud\n"
"Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n"
-"POT-Creation-Date: 2013-09-20 10:45-0400\n"
-"PO-Revision-Date: 2013-09-20 14:45+0000\n"
-"Last-Translator: I Robot <owncloud-bot@tmit.eu>\n"
+"POT-Creation-Date: 2013-09-29 00:02-0400\n"
+"PO-Revision-Date: 2013-09-27 19:43+0000\n"
+"Last-Translator: zubr139 <zubr139@ukr.net>\n"
"Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -32,7 +33,7 @@ msgstr ""
#: ajax/changedisplayname.php:34
msgid "Unable to change display name"
-msgstr "Не вдалося змінити зображене ім'я"
+msgstr "Не вдалося змінити ім'я"
#: ajax/creategroup.php:10
msgid "Group already exists"
@@ -117,11 +118,11 @@ msgstr ""
msgid "Update to {appversion}"
msgstr "Оновити до {appversion}"
-#: js/apps.js:49 js/apps.js:82 js/apps.js:108
+#: js/apps.js:49 js/apps.js:82 js/apps.js:110
msgid "Disable"
msgstr "Вимкнути"
-#: js/apps.js:49 js/apps.js:89 js/apps.js:102 js/apps.js:117
+#: js/apps.js:49 js/apps.js:90 js/apps.js:103 js/apps.js:119
msgid "Enable"
msgstr "Включити"
@@ -129,43 +130,43 @@ msgstr "Включити"
msgid "Please wait...."
msgstr "Зачекайте, будь ласка..."
-#: js/apps.js:79 js/apps.js:80 js/apps.js:100
+#: js/apps.js:79 js/apps.js:80 js/apps.js:101
msgid "Error while disabling app"
msgstr ""
-#: js/apps.js:99 js/apps.js:112 js/apps.js:113
+#: js/apps.js:100 js/apps.js:114 js/apps.js:115
msgid "Error while enabling app"
msgstr ""
-#: js/apps.js:123
+#: js/apps.js:125
msgid "Updating...."
msgstr "Оновлюється..."
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error while updating app"
msgstr "Помилка при оновленні програми"
-#: js/apps.js:126
+#: js/apps.js:128
msgid "Error"
msgstr "Помилка"
-#: js/apps.js:127 templates/apps.php:43
+#: js/apps.js:129 templates/apps.php:43
msgid "Update"
msgstr "Оновити"
-#: js/apps.js:130
+#: js/apps.js:132
msgid "Updated"
msgstr "Оновлено"
-#: js/personal.js:220
+#: js/personal.js:221
msgid "Select a profile picture"
msgstr ""
-#: js/personal.js:265
+#: js/personal.js:266
msgid "Decrypting files... Please wait, this can take some time."
msgstr ""
-#: js/personal.js:287
+#: js/personal.js:288
msgid "Saving..."
msgstr "Зберігаю..."
@@ -590,7 +591,7 @@ msgstr "Сховище"
#: templates/users.php:108
msgid "change display name"
-msgstr "змінити зображене ім'я"
+msgstr "змінити ім'я"
#: templates/users.php:112
msgid "set new password"
diff --git a/lib/autoloader.php b/lib/autoloader.php
index 01841f831be..8b12e6bc4b7 100644
--- a/lib/autoloader.php
+++ b/lib/autoloader.php
@@ -73,10 +73,10 @@ class Autoloader {
}
} elseif (strpos($class, 'OC_') === 0) {
// first check for legacy classes if underscores are used
- $paths[] = 'legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
- $paths[] = strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
+ $paths[] = 'private/legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
+ $paths[] = 'private/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
} elseif (strpos($class, 'OC\\') === 0) {
- $paths[] = strtolower(str_replace('\\', '/', substr($class, 3)) . '.php');
+ $paths[] = 'private/' . strtolower(str_replace('\\', '/', substr($class, 3)) . '.php');
} elseif (strpos($class, 'OCP\\') === 0) {
$paths[] = 'public/' . strtolower(str_replace('\\', '/', substr($class, 4)) . '.php');
} elseif (strpos($class, 'OCA\\') === 0) {
@@ -117,7 +117,11 @@ class Autoloader {
// Does this PHP have an in-memory cache? We cache the paths there
if ($this->constructingMemoryCache && !$this->memoryCache) {
$this->constructingMemoryCache = false;
- $this->memoryCache = \OC\Memcache\Factory::createLowLatency('Autoloader');
+ try {
+ $this->memoryCache = \OC\Memcache\Factory::createLowLatency('Autoloader');
+ } catch(\Exception $ex) {
+ // no caching then - fine with me
+ }
}
if ($this->memoryCache) {
$pathsToRequire = $this->memoryCache->get($class);
diff --git a/lib/base.php b/lib/base.php
index 395d8486a5e..42182c21fb0 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -84,6 +84,11 @@ class OC {
*/
public static $loader = null;
+ /**
+ * @var \OC\Server
+ */
+ public static $server = null;
+
public static function initPaths() {
// calculate the root directories
OC::$SERVERROOT = str_replace("\\", '/', substr(__DIR__, 0, -4));
@@ -159,7 +164,7 @@ class OC {
// set the right include path
set_include_path(
- OC::$SERVERROOT . '/lib' . PATH_SEPARATOR .
+ OC::$SERVERROOT . '/lib/private' . PATH_SEPARATOR .
OC::$SERVERROOT . '/config' . PATH_SEPARATOR .
OC::$THIRDPARTYROOT . '/3rdparty' . PATH_SEPARATOR .
implode($paths, PATH_SEPARATOR) . PATH_SEPARATOR .
@@ -451,6 +456,9 @@ class OC {
stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
stream_wrapper_register('oc', 'OC\Files\Stream\OC');
+ // setup the basic server
+ self::$server = new \OC\Server();
+
self::initTemplateEngine();
if (!self::$CLI) {
self::initSession();
@@ -557,11 +565,13 @@ class OC {
if (OC_Config::getValue('installed', false)) { //don't try to do this before we are properly setup
// register cache cleanup jobs
try { //if this is executed before the upgrade to the new backgroundjob system is completed it will throw an exception
- \OCP\BackgroundJob::registerJob('OC_Cache_FileGlobalGC');
+ \OCP\BackgroundJob::registerJob('OC\Cache\FileGlobalGC');
} catch (Exception $e) {
}
- OC_Hook::connect('OC_User', 'post_login', 'OC_Cache_File', 'loginListener');
+ // NOTE: This will be replaced to use OCP
+ $userSession = \OC_User::getUserSession();
+ $userSession->listen('postLogin', '\OC\Cache\File', 'loginListener');
}
}
@@ -760,6 +770,7 @@ class OC {
|| !isset($_COOKIE["oc_token"])
|| !isset($_COOKIE["oc_username"])
|| !$_COOKIE["oc_remember_login"]
+ || !OC_Util::rememberLoginAllowed()
) {
return false;
}
diff --git a/lib/cache/fileglobalgc.php b/lib/cache/fileglobalgc.php
deleted file mode 100644
index a29c31f9063..00000000000
--- a/lib/cache/fileglobalgc.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-
-class OC_Cache_FileGlobalGC extends \OC\BackgroundJob\Job{
- public function run($argument){
- OC_Cache_FileGlobal::gc();
- }
-}
diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php
new file mode 100644
index 00000000000..72aabf60793
--- /dev/null
+++ b/lib/private/allconfig.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OC;
+
+/**
+ * Class to combine all the configuration options ownCloud offers
+ */
+class AllConfig implements \OCP\IConfig {
+ /**
+ * Sets a new system wide value
+ * @param string $key the key of the value, under which will be saved
+ * @param string $value the value that should be stored
+ * @todo need a use case for this
+ */
+// public function setSystemValue($key, $value) {
+// \OCP\Config::setSystemValue($key, $value);
+// }
+
+ /**
+ * Looks up a system wide defined value
+ * @param string $key the key of the value, under which it was saved
+ * @return string the saved value
+ */
+ public function getSystemValue($key) {
+ return \OCP\Config::getSystemValue($key, '');
+ }
+
+
+ /**
+ * Writes a new app wide value
+ * @param string $appName the appName that we want to store the value under
+ * @param string $key the key of the value, under which will be saved
+ * @param string $value the value that should be stored
+ */
+ public function setAppValue($appName, $key, $value) {
+ \OCP\Config::setAppValue($appName, $key, $value);
+ }
+
+ /**
+ * Looks up an app wide defined value
+ * @param string $appName the appName that we stored the value under
+ * @param string $key the key of the value, under which it was saved
+ * @return string the saved value
+ */
+ public function getAppValue($appName, $key) {
+ return \OCP\Config::getAppValue($appName, $key, '');
+ }
+
+
+ /**
+ * Set a user defined value
+ * @param string $userId the userId of the user that we want to store the value under
+ * @param string $appName the appName that we want to store the value under
+ * @param string $key the key under which the value is being stored
+ * @param string $value the value that you want to store
+ */
+ public function setUserValue($userId, $appName, $key, $value) {
+ \OCP\Config::setUserValue($userId, $appName, $key, $value);
+ }
+
+ /**
+ * Shortcut for getting a user defined value
+ * @param string $userId the userId of the user that we want to store the value under
+ * @param string $appName the appName that we stored the value under
+ * @param string $key the key under which the value is being stored
+ */
+ public function getUserValue($userId, $appName, $key){
+ return \OCP\Config::getUserValue($userId, $appName, $key);
+ }
+}
diff --git a/lib/api.php b/lib/private/api.php
index 31f3f968d9b..31f3f968d9b 100644
--- a/lib/api.php
+++ b/lib/private/api.php
diff --git a/lib/app.php b/lib/private/app.php
index d98af2dc296..0ab1ee57f63 100644
--- a/lib/app.php
+++ b/lib/private/app.php
@@ -27,8 +27,6 @@
* upgrading and removing apps.
*/
class OC_App{
- static private $activeapp = '';
- static private $navigation = array();
static private $settingsForms = array();
static private $adminForms = array();
static private $personalForms = array();
@@ -271,7 +269,7 @@ class OC_App{
/**
* @brief adds an entry to the navigation
- * @param string $data array containing the data
+ * @param array $data array containing the data
* @return bool
*
* This function adds a new entry to the navigation visible to users. $data
@@ -287,11 +285,7 @@ class OC_App{
* the navigation. Lower values come first.
*/
public static function addNavigationEntry( $data ) {
- $data['active']=false;
- if(!isset($data['icon'])) {
- $data['icon']='';
- }
- OC_App::$navigation[] = $data;
+ OC::$server->getNavigationManager()->add($data);
return true;
}
@@ -305,9 +299,7 @@ class OC_App{
* highlighting the current position of the user.
*/
public static function setActiveNavigationEntry( $id ) {
- // load all the apps, to make sure we have all the navigation entries
- self::loadApps();
- self::$activeapp = $id;
+ OC::$server->getNavigationManager()->setActiveEntry($id);
return true;
}
@@ -315,15 +307,14 @@ class OC_App{
* @brief Get the navigation entries for the $app
* @param string $app app
* @return array of the $data added with addNavigationEntry
+ *
+ * Warning: destroys the existing entries
*/
public static function getAppNavigationEntries($app) {
if(is_file(self::getAppPath($app).'/appinfo/app.php')) {
- $save = self::$navigation;
- self::$navigation = array();
+ OC::$server->getNavigationManager()->clear();
require $app.'/appinfo/app.php';
- $app_entries = self::$navigation;
- self::$navigation = $save;
- return $app_entries;
+ return OC::$server->getNavigationManager()->getAll();
}
return array();
}
@@ -336,7 +327,7 @@ class OC_App{
* setActiveNavigationEntry
*/
public static function getActiveNavigationEntry() {
- return self::$activeapp;
+ return OC::$server->getNavigationManager()->getActiveEntry();
}
/**
@@ -419,8 +410,9 @@ class OC_App{
// This is private as well. It simply works, so don't ask for more details
private static function proceedNavigation( $list ) {
+ $activeapp = OC::$server->getNavigationManager()->getActiveEntry();
foreach( $list as &$naventry ) {
- if( $naventry['id'] == self::$activeapp ) {
+ if( $naventry['id'] == $activeapp ) {
$naventry['active'] = true;
}
else{
@@ -572,7 +564,8 @@ class OC_App{
* - active: boolean, signals if the user is on this navigation entry
*/
public static function getNavigation() {
- $navigation = self::proceedNavigation( self::$navigation );
+ $entries = OC::$server->getNavigationManager()->getAll();
+ $navigation = self::proceedNavigation( $entries );
return $navigation;
}
diff --git a/lib/appconfig.php b/lib/private/appconfig.php
index e615d838173..e615d838173 100644
--- a/lib/appconfig.php
+++ b/lib/private/appconfig.php
diff --git a/lib/private/appframework/app.php b/lib/private/appframework/app.php
new file mode 100644
index 00000000000..7ff55bb809d
--- /dev/null
+++ b/lib/private/appframework/app.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+use OCP\AppFramework\IAppContainer;
+
+
+/**
+ * Entry point for every request in your app. You can consider this as your
+ * public static void main() method
+ *
+ * Handles all the dependency injection, controllers and output flow
+ */
+class App {
+
+
+ /**
+ * Shortcut for calling a controller method and printing the result
+ * @param string $controllerName the name of the controller under which it is
+ * stored in the DI container
+ * @param string $methodName the method that you want to call
+ * @param array $urlParams an array with variables extracted from the routes
+ * @param DIContainer $container an instance of a pimple container.
+ */
+ public static function main($controllerName, $methodName, array $urlParams,
+ IAppContainer $container) {
+ $container['urlParams'] = $urlParams;
+ $controller = $container[$controllerName];
+
+ // initialize the dispatcher and run all the middleware before the controller
+ $dispatcher = $container['Dispatcher'];
+
+ list($httpHeaders, $responseHeaders, $output) =
+ $dispatcher->dispatch($controller, $methodName);
+
+ if(!is_null($httpHeaders)) {
+ header($httpHeaders);
+ }
+
+ foreach($responseHeaders as $name => $value) {
+ header($name . ': ' . $value);
+ }
+
+ if(!is_null($output)) {
+ header('Content-Length: ' . strlen($output));
+ print($output);
+ }
+
+ }
+
+ /**
+ * Shortcut for calling a controller method and printing the result.
+ * Similar to App:main except that no headers will be sent.
+ * This should be used for example when registering sections via
+ * \OC\AppFramework\Core\API::registerAdmin()
+ *
+ * @param string $controllerName the name of the controller under which it is
+ * stored in the DI container
+ * @param string $methodName the method that you want to call
+ * @param array $urlParams an array with variables extracted from the routes
+ * @param DIContainer $container an instance of a pimple container.
+ */
+ public static function part($controllerName, $methodName, array $urlParams,
+ DIContainer $container){
+
+ $container['urlParams'] = $urlParams;
+ $controller = $container[$controllerName];
+
+ $dispatcher = $container['Dispatcher'];
+
+ list(, , $output) = $dispatcher->dispatch($controller, $methodName);
+ return $output;
+ }
+
+}
diff --git a/lib/private/appframework/controller/controller.php b/lib/private/appframework/controller/controller.php
new file mode 100644
index 00000000000..0ea0a38cc09
--- /dev/null
+++ b/lib/private/appframework/controller/controller.php
@@ -0,0 +1,142 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Controller;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Core\API;
+use OCP\AppFramework\Http\TemplateResponse;
+
+
+/**
+ * Base class to inherit your controllers from
+ */
+abstract class Controller {
+
+ /**
+ * @var API instance of the api layer
+ */
+ protected $api;
+
+ protected $request;
+
+ /**
+ * @param API $api an api wrapper instance
+ * @param Request $request an instance of the request
+ */
+ public function __construct(API $api, Request $request){
+ $this->api = $api;
+ $this->request = $request;
+ }
+
+
+ /**
+ * Lets you access post and get parameters by the index
+ * @param string $key the key which you want to access in the URL Parameter
+ * placeholder, $_POST or $_GET array.
+ * The priority how they're returned is the following:
+ * 1. URL parameters
+ * 2. POST parameters
+ * 3. GET parameters
+ * @param mixed $default If the key is not found, this value will be returned
+ * @return mixed the content of the array
+ */
+ public function params($key, $default=null){
+ return $this->request->getParam($key, $default);
+ }
+
+
+ /**
+ * Returns all params that were received, be it from the request
+ * (as GET or POST) or throuh the URL by the route
+ * @return array the array with all parameters
+ */
+ public function getParams() {
+ return $this->request->getParams();
+ }
+
+
+ /**
+ * Returns the method of the request
+ * @return string the method of the request (POST, GET, etc)
+ */
+ public function method() {
+ return $this->request->getMethod();
+ }
+
+
+ /**
+ * Shortcut for accessing an uploaded file through the $_FILES array
+ * @param string $key the key that will be taken from the $_FILES array
+ * @return array the file in the $_FILES element
+ */
+ public function getUploadedFile($key) {
+ return $this->request->getUploadedFile($key);
+ }
+
+
+ /**
+ * Shortcut for getting env variables
+ * @param string $key the key that will be taken from the $_ENV array
+ * @return array the value in the $_ENV element
+ */
+ public function env($key) {
+ return $this->request->getEnv($key);
+ }
+
+
+ /**
+ * Shortcut for getting cookie variables
+ * @param string $key the key that will be taken from the $_COOKIE array
+ * @return array the value in the $_COOKIE element
+ */
+ public function cookie($key) {
+ return $this->request->getCookie($key);
+ }
+
+
+ /**
+ * Shortcut for rendering a template
+ * @param string $templateName the name of the template
+ * @param array $params the template parameters in key => value structure
+ * @param string $renderAs user renders a full page, blank only your template
+ * admin an entry in the admin settings
+ * @param array $headers set additional headers in name/value pairs
+ * @return \OCP\AppFramework\Http\TemplateResponse containing the page
+ */
+ public function render($templateName, array $params=array(),
+ $renderAs='user', array $headers=array()){
+ $response = new TemplateResponse($this->api, $templateName);
+ $response->setParams($params);
+ $response->renderAs($renderAs);
+
+ foreach($headers as $name => $value){
+ $response->addHeader($name, $value);
+ }
+
+ return $response;
+ }
+
+
+}
diff --git a/lib/private/appframework/core/api.php b/lib/private/appframework/core/api.php
new file mode 100644
index 00000000000..39522ee3dd5
--- /dev/null
+++ b/lib/private/appframework/core/api.php
@@ -0,0 +1,348 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Core;
+use OCP\AppFramework\IApi;
+
+
+/**
+ * This is used to wrap the owncloud static api calls into an object to make the
+ * code better abstractable for use in the dependency injection container
+ *
+ * Should you find yourself in need for more methods, simply inherit from this
+ * class and add your methods
+ */
+class API implements IApi{
+
+ private $appName;
+
+ /**
+ * constructor
+ * @param string $appName the name of your application
+ */
+ public function __construct($appName){
+ $this->appName = $appName;
+ }
+
+
+ /**
+ * Gets the userid of the current user
+ * @return string the user id of the current user
+ */
+ public function getUserId(){
+ return \OCP\User::getUser();
+ }
+
+
+ /**
+ * Adds a new javascript file
+ * @param string $scriptName the name of the javascript in js/ without the suffix
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ public function addScript($scriptName, $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+ \OCP\Util::addScript($appName, $scriptName);
+ }
+
+
+ /**
+ * Adds a new css file
+ * @param string $styleName the name of the css file in css/without the suffix
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ public function addStyle($styleName, $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+ \OCP\Util::addStyle($appName, $styleName);
+ }
+
+
+ /**
+ * shorthand for addScript for files in the 3rdparty directory
+ * @param string $name the name of the file without the suffix
+ */
+ public function add3rdPartyScript($name){
+ \OCP\Util::addScript($this->appName . '/3rdparty', $name);
+ }
+
+
+ /**
+ * shorthand for addStyle for files in the 3rdparty directory
+ * @param string $name the name of the file without the suffix
+ */
+ public function add3rdPartyStyle($name){
+ \OCP\Util::addStyle($this->appName . '/3rdparty', $name);
+ }
+
+
+ /**
+ * Returns the translation object
+ * @return \OC_L10N the translation object
+ */
+ public function getTrans(){
+ # TODO: use public api
+ return \OC_L10N::get($this->appName);
+ }
+
+
+ /**
+ * Returns the URL for a route
+ * @param string $routeName the name of the route
+ * @param array $arguments an array with arguments which will be filled into the url
+ * @return string the url
+ */
+ public function linkToRoute($routeName, $arguments=array()){
+ return \OCP\Util::linkToRoute($routeName, $arguments);
+ }
+
+
+ /**
+ * Returns an URL for an image or file
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ public function linkTo($file, $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+ return \OCP\Util::linkTo($appName, $file);
+ }
+
+
+ /**
+ * Returns the link to an image, like link to but only with prepending img/
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ public function imagePath($file, $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+ return \OCP\Util::imagePath($appName, $file);
+ }
+
+
+ /**
+ * Makes an URL absolute
+ * @param string $url the url
+ * @return string the absolute url
+ */
+ public function getAbsoluteURL($url){
+ # TODO: use public api
+ return \OC_Helper::makeURLAbsolute($url);
+ }
+
+
+ /**
+ * links to a file
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ * @deprecated replaced with linkToRoute()
+ * @return string the url
+ */
+ public function linkToAbsolute($file, $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+ return \OCP\Util::linkToAbsolute($appName, $file);
+ }
+
+
+ /**
+ * Checks if the CSRF check was correct
+ * @return bool true if CSRF check passed
+ */
+ public function passesCSRFCheck(){
+ # TODO: use public api
+ return \OC_Util::isCallRegistered();
+ }
+
+
+ /**
+ * Checks if an app is enabled
+ * @param string $appName the name of an app
+ * @return bool true if app is enabled
+ */
+ public function isAppEnabled($appName){
+ return \OCP\App::isEnabled($appName);
+ }
+
+
+ /**
+ * Writes a function into the error log
+ * @param string $msg the error message to be logged
+ * @param int $level the error level
+ */
+ public function log($msg, $level=null){
+ switch($level){
+ case 'debug':
+ $level = \OCP\Util::DEBUG;
+ break;
+ case 'info':
+ $level = \OCP\Util::INFO;
+ break;
+ case 'warn':
+ $level = \OCP\Util::WARN;
+ break;
+ case 'fatal':
+ $level = \OCP\Util::FATAL;
+ break;
+ default:
+ $level = \OCP\Util::ERROR;
+ break;
+ }
+ \OCP\Util::writeLog($this->appName, $msg, $level);
+ }
+
+
+ /**
+ * turns an owncloud path into a path on the filesystem
+ * @param string path the path to the file on the oc filesystem
+ * @return string the filepath in the filesystem
+ */
+ public function getLocalFilePath($path){
+ # TODO: use public api
+ return \OC_Filesystem::getLocalFile($path);
+ }
+
+
+ /**
+ * used to return and open a new eventsource
+ * @return \OC_EventSource a new open EventSource class
+ */
+ public function openEventSource(){
+ # TODO: use public api
+ return new \OC_EventSource();
+ }
+
+ /**
+ * @brief connects a function to a hook
+ * @param string $signalClass class name of emitter
+ * @param string $signalName name of signal
+ * @param string $slotClass class name of slot
+ * @param string $slotName name of slot, in another word, this is the
+ * name of the method that will be called when registered
+ * signal is emitted.
+ * @return bool, always true
+ */
+ public function connectHook($signalClass, $signalName, $slotClass, $slotName) {
+ return \OCP\Util::connectHook($signalClass, $signalName, $slotClass, $slotName);
+ }
+
+ /**
+ * @brief Emits a signal. To get data from the slot use references!
+ * @param string $signalClass class name of emitter
+ * @param string $signalName name of signal
+ * @param array $params defautl: array() array with additional data
+ * @return bool, true if slots exists or false if not
+ */
+ public function emitHook($signalClass, $signalName, $params = array()) {
+ return \OCP\Util::emitHook($signalClass, $signalName, $params);
+ }
+
+ /**
+ * @brief clear hooks
+ * @param string $signalClass
+ * @param string $signalName
+ */
+ public function clearHook($signalClass=false, $signalName=false) {
+ if ($signalClass) {
+ \OC_Hook::clear($signalClass, $signalName);
+ }
+ }
+
+ /**
+ * Gets the content of an URL by using CURL or a fallback if it is not
+ * installed
+ * @param string $url the url that should be fetched
+ * @return string the content of the webpage
+ */
+ public function getUrlContent($url) {
+ return \OC_Util::getUrlContent($url);
+ }
+
+ /**
+ * Register a backgroundjob task
+ * @param string $className full namespace and class name of the class
+ * @param string $methodName the name of the static method that should be
+ * called
+ */
+ public function addRegularTask($className, $methodName) {
+ \OCP\Backgroundjob::addRegularTask($className, $methodName);
+ }
+
+ /**
+ * Returns a template
+ * @param string $templateName the name of the template
+ * @param string $renderAs how it should be rendered
+ * @param string $appName the name of the app
+ * @return \OCP\Template a new template
+ */
+ public function getTemplate($templateName, $renderAs='user', $appName=null){
+ if($appName === null){
+ $appName = $this->appName;
+ }
+
+ if($renderAs === 'blank'){
+ return new \OCP\Template($appName, $templateName);
+ } else {
+ return new \OCP\Template($appName, $templateName, $renderAs);
+ }
+ }
+
+
+ /**
+ * Tells ownCloud to include a template in the admin overview
+ * @param string $mainPath the path to the main php file without the php
+ * suffix, relative to your apps directory! not the template directory
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ public function registerAdmin($mainPath, $appName=null) {
+ if($appName === null){
+ $appName = $this->appName;
+ }
+
+ \OCP\App::registerAdmin($appName, $mainPath);
+ }
+
+
+ /**
+ * get the filesystem info
+ *
+ * @param string $path
+ * @return array with the following keys:
+ * - size
+ * - mtime
+ * - mimetype
+ * - encrypted
+ * - versioned
+ */
+ public function getFileInfo($path) {
+ return \OC\Files\Filesystem::getFileInfo($path);
+ }
+
+}
diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php
new file mode 100644
index 00000000000..3755d45fa09
--- /dev/null
+++ b/lib/private/appframework/dependencyinjection/dicontainer.php
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\DependencyInjection;
+
+use OC\AppFramework\Http\Http;
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\Dispatcher;
+use OC\AppFramework\Core\API;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+use OC\AppFramework\Middleware\Security\SecurityMiddleware;
+use OC\AppFramework\Utility\SimpleContainer;
+use OC\AppFramework\Utility\TimeFactory;
+use OCP\AppFramework\IApi;
+use OCP\AppFramework\IAppContainer;
+use OCP\AppFramework\IMiddleWare;
+use OCP\IServerContainer;
+
+
+class DIContainer extends SimpleContainer implements IAppContainer{
+
+ /**
+ * @var array
+ */
+ private $middleWares = array();
+
+ /**
+ * Put your class dependencies in here
+ * @param string $appName the name of the app
+ */
+ public function __construct($appName){
+
+ $this['AppName'] = $appName;
+
+ $this->registerParameter('ServerContainer', \OC::$server);
+
+ $this['API'] = $this->share(function($c){
+ return new API($c['AppName']);
+ });
+
+ /**
+ * Http
+ */
+ $this['Request'] = $this->share(function($c) {
+ /** @var $c SimpleContainer */
+ /** @var $server IServerContainer */
+ $server = $c->query('ServerContainer');
+ return $server->getRequest();
+ });
+
+ $this['Protocol'] = $this->share(function($c){
+ if(isset($_SERVER['SERVER_PROTOCOL'])) {
+ return new Http($_SERVER, $_SERVER['SERVER_PROTOCOL']);
+ } else {
+ return new Http($_SERVER);
+ }
+ });
+
+ $this['Dispatcher'] = $this->share(function($c) {
+ return new Dispatcher($c['Protocol'], $c['MiddlewareDispatcher']);
+ });
+
+
+ /**
+ * Middleware
+ */
+ $this['SecurityMiddleware'] = $this->share(function($c){
+ return new SecurityMiddleware($c['API'], $c['Request']);
+ });
+
+ $this['MiddlewareDispatcher'] = $this->share(function($c){
+ $dispatcher = new MiddlewareDispatcher();
+ $dispatcher->registerMiddleware($c['SecurityMiddleware']);
+
+ foreach($this->middleWares as $middleWare) {
+ $dispatcher->registerMiddleware($middleWare);
+ }
+
+ return $dispatcher;
+ });
+
+
+ /**
+ * Utilities
+ */
+ $this['TimeFactory'] = $this->share(function($c){
+ return new TimeFactory();
+ });
+
+
+ }
+
+
+ /**
+ * @return IApi
+ */
+ function getCoreApi()
+ {
+ return $this->query('API');
+ }
+
+ /**
+ * @return \OCP\IServerContainer
+ */
+ function getServer()
+ {
+ return $this->query('ServerContainer');
+ }
+
+ /**
+ * @param IMiddleWare $middleWare
+ * @return boolean
+ */
+ function registerMiddleWare(IMiddleWare $middleWare) {
+ array_push($this->middleWares, $middleWare);
+ }
+
+ /**
+ * used to return the appname of the set application
+ * @return string the name of your application
+ */
+ function getAppName() {
+ return $this->query('AppName');
+ }
+}
diff --git a/lib/private/appframework/http/dispatcher.php b/lib/private/appframework/http/dispatcher.php
new file mode 100644
index 00000000000..ea57a6860cc
--- /dev/null
+++ b/lib/private/appframework/http/dispatcher.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use \OC\AppFramework\Controller\Controller;
+use \OC\AppFramework\Middleware\MiddlewareDispatcher;
+
+
+/**
+ * Class to dispatch the request to the middleware dispatcher
+ */
+class Dispatcher {
+
+ private $middlewareDispatcher;
+ private $protocol;
+
+
+ /**
+ * @param Http $protocol the http protocol with contains all status headers
+ * @param MiddlewareDispatcher $middlewareDispatcher the dispatcher which
+ * runs the middleware
+ */
+ public function __construct(Http $protocol,
+ MiddlewareDispatcher $middlewareDispatcher) {
+ $this->protocol = $protocol;
+ $this->middlewareDispatcher = $middlewareDispatcher;
+ }
+
+
+ /**
+ * Handles a request and calls the dispatcher on the controller
+ * @param Controller $controller the controller which will be called
+ * @param string $methodName the method name which will be called on
+ * the controller
+ * @return array $array[0] contains a string with the http main header,
+ * $array[1] contains headers in the form: $key => value, $array[2] contains
+ * the response output
+ */
+ public function dispatch(Controller $controller, $methodName) {
+ $out = array(null, array(), null);
+
+ try {
+
+ $this->middlewareDispatcher->beforeController($controller,
+ $methodName);
+ $response = $controller->$methodName();
+
+ // if an exception appears, the middleware checks if it can handle the
+ // exception and creates a response. If no response is created, it is
+ // assumed that theres no middleware who can handle it and the error is
+ // thrown again
+ } catch(\Exception $exception){
+ $response = $this->middlewareDispatcher->afterException(
+ $controller, $methodName, $exception);
+ if (is_null($response)) {
+ throw $exception;
+ }
+ }
+
+ $response = $this->middlewareDispatcher->afterController(
+ $controller, $methodName, $response);
+
+ // get the output which should be printed and run the after output
+ // middleware to modify the response
+ $output = $response->render();
+ $out[2] = $this->middlewareDispatcher->beforeOutput(
+ $controller, $methodName, $output);
+
+ // depending on the cache object the headers need to be changed
+ $out[0] = $this->protocol->getStatusHeader($response->getStatus(),
+ $response->getLastModified(), $response->getETag());
+ $out[1] = $response->getHeaders();
+
+ return $out;
+ }
+
+
+}
diff --git a/lib/private/appframework/http/downloadresponse.php b/lib/private/appframework/http/downloadresponse.php
new file mode 100644
index 00000000000..67b9542dba6
--- /dev/null
+++ b/lib/private/appframework/http/downloadresponse.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+/**
+ * Prompts the user to download the a file
+ */
+class DownloadResponse extends \OCP\AppFramework\Http\Response {
+
+ private $filename;
+ private $contentType;
+
+ /**
+ * Creates a response that prompts the user to download the file
+ * @param string $filename the name that the downloaded file should have
+ * @param string $contentType the mimetype that the downloaded file should have
+ */
+ public function __construct($filename, $contentType) {
+ $this->filename = $filename;
+ $this->contentType = $contentType;
+
+ $this->addHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
+ $this->addHeader('Content-Type', $contentType);
+ }
+
+
+}
diff --git a/lib/private/appframework/http/http.php b/lib/private/appframework/http/http.php
new file mode 100644
index 00000000000..e00dc9cdc4a
--- /dev/null
+++ b/lib/private/appframework/http/http.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+class Http extends \OCP\AppFramework\Http\Http{
+
+ private $server;
+ private $protocolVersion;
+ protected $headers;
+
+ /**
+ * @param $_SERVER $server
+ * @param string $protocolVersion the http version to use defaults to HTTP/1.1
+ */
+ public function __construct($server, $protocolVersion='HTTP/1.1') {
+ $this->server = $server;
+ $this->protocolVersion = $protocolVersion;
+
+ $this->headers = array(
+ self::STATUS_CONTINUE => 'Continue',
+ self::STATUS_SWITCHING_PROTOCOLS => 'Switching Protocols',
+ self::STATUS_PROCESSING => 'Processing',
+ self::STATUS_OK => 'OK',
+ self::STATUS_CREATED => 'Created',
+ self::STATUS_ACCEPTED => 'Accepted',
+ self::STATUS_NON_AUTHORATIVE_INFORMATION => 'Non-Authorative Information',
+ self::STATUS_NO_CONTENT => 'No Content',
+ self::STATUS_RESET_CONTENT => 'Reset Content',
+ self::STATUS_PARTIAL_CONTENT => 'Partial Content',
+ self::STATUS_MULTI_STATUS => 'Multi-Status', // RFC 4918
+ self::STATUS_ALREADY_REPORTED => 'Already Reported', // RFC 5842
+ self::STATUS_IM_USED => 'IM Used', // RFC 3229
+ self::STATUS_MULTIPLE_CHOICES => 'Multiple Choices',
+ self::STATUS_MOVED_PERMANENTLY => 'Moved Permanently',
+ self::STATUS_FOUND => 'Found',
+ self::STATUS_SEE_OTHER => 'See Other',
+ self::STATUS_NOT_MODIFIED => 'Not Modified',
+ self::STATUS_USE_PROXY => 'Use Proxy',
+ self::STATUS_RESERVED => 'Reserved',
+ self::STATUS_TEMPORARY_REDIRECT => 'Temporary Redirect',
+ self::STATUS_BAD_REQUEST => 'Bad request',
+ self::STATUS_UNAUTHORIZED => 'Unauthorized',
+ self::STATUS_PAYMENT_REQUIRED => 'Payment Required',
+ self::STATUS_FORBIDDEN => 'Forbidden',
+ self::STATUS_NOT_FOUND => 'Not Found',
+ self::STATUS_METHOD_NOT_ALLOWED => 'Method Not Allowed',
+ self::STATUS_NOT_ACCEPTABLE => 'Not Acceptable',
+ self::STATUS_PROXY_AUTHENTICATION_REQUIRED => 'Proxy Authentication Required',
+ self::STATUS_REQUEST_TIMEOUT => 'Request Timeout',
+ self::STATUS_CONFLICT => 'Conflict',
+ self::STATUS_GONE => 'Gone',
+ self::STATUS_LENGTH_REQUIRED => 'Length Required',
+ self::STATUS_PRECONDITION_FAILED => 'Precondition failed',
+ self::STATUS_REQUEST_ENTITY_TOO_LARGE => 'Request Entity Too Large',
+ self::STATUS_REQUEST_URI_TOO_LONG => 'Request-URI Too Long',
+ self::STATUS_UNSUPPORTED_MEDIA_TYPE => 'Unsupported Media Type',
+ self::STATUS_REQUEST_RANGE_NOT_SATISFIABLE => 'Requested Range Not Satisfiable',
+ self::STATUS_EXPECTATION_FAILED => 'Expectation Failed',
+ self::STATUS_IM_A_TEAPOT => 'I\'m a teapot', // RFC 2324
+ self::STATUS_UNPROCESSABLE_ENTITY => 'Unprocessable Entity', // RFC 4918
+ self::STATUS_LOCKED => 'Locked', // RFC 4918
+ self::STATUS_FAILED_DEPENDENCY => 'Failed Dependency', // RFC 4918
+ self::STATUS_UPGRADE_REQUIRED => 'Upgrade required',
+ self::STATUS_PRECONDITION_REQUIRED => 'Precondition required', // draft-nottingham-http-new-status
+ self::STATUS_TOO_MANY_REQUESTS => 'Too Many Requests', // draft-nottingham-http-new-status
+ self::STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE => 'Request Header Fields Too Large', // draft-nottingham-http-new-status
+ self::STATUS_INTERNAL_SERVER_ERROR => 'Internal Server Error',
+ self::STATUS_NOT_IMPLEMENTED => 'Not Implemented',
+ self::STATUS_BAD_GATEWAY => 'Bad Gateway',
+ self::STATUS_SERVICE_UNAVAILABLE => 'Service Unavailable',
+ self::STATUS_GATEWAY_TIMEOUT => 'Gateway Timeout',
+ self::STATUS_HTTP_VERSION_NOT_SUPPORTED => 'HTTP Version not supported',
+ self::STATUS_VARIANT_ALSO_NEGOTIATES => 'Variant Also Negotiates',
+ self::STATUS_INSUFFICIENT_STORAGE => 'Insufficient Storage', // RFC 4918
+ self::STATUS_LOOP_DETECTED => 'Loop Detected', // RFC 5842
+ self::STATUS_BANDWIDTH_LIMIT_EXCEEDED => 'Bandwidth Limit Exceeded', // non-standard
+ self::STATUS_NOT_EXTENDED => 'Not extended',
+ self::STATUS_NETWORK_AUTHENTICATION_REQUIRED => 'Network Authentication Required', // draft-nottingham-http-new-status
+ );
+ }
+
+
+ /**
+ * Gets the correct header
+ * @param Http::CONSTANT $status the constant from the Http class
+ * @param \DateTime $lastModified formatted last modified date
+ * @param string $Etag the etag
+ */
+ public function getStatusHeader($status, \DateTime $lastModified=null,
+ $ETag=null) {
+
+ if(!is_null($lastModified)) {
+ $lastModified = $lastModified->format(\DateTime::RFC2822);
+ }
+
+ // if etag or lastmodified have not changed, return a not modified
+ if ((isset($this->server['HTTP_IF_NONE_MATCH'])
+ && trim($this->server['HTTP_IF_NONE_MATCH']) === $ETag)
+
+ ||
+
+ (isset($this->server['HTTP_IF_MODIFIED_SINCE'])
+ && trim($this->server['HTTP_IF_MODIFIED_SINCE']) ===
+ $lastModified)) {
+
+ $status = self::STATUS_NOT_MODIFIED;
+ }
+
+ // we have one change currently for the http 1.0 header that differs
+ // from 1.1: STATUS_TEMPORARY_REDIRECT should be STATUS_FOUND
+ // if this differs any more, we want to create childclasses for this
+ if($status === self::STATUS_TEMPORARY_REDIRECT
+ && $this->protocolVersion === 'HTTP/1.0') {
+
+ $status = self::STATUS_FOUND;
+ }
+
+ return $this->protocolVersion . ' ' . $status . ' ' .
+ $this->headers[$status];
+ }
+
+
+}
+
+
diff --git a/lib/private/appframework/http/redirectresponse.php b/lib/private/appframework/http/redirectresponse.php
new file mode 100644
index 00000000000..688447f1618
--- /dev/null
+++ b/lib/private/appframework/http/redirectresponse.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use OCP\AppFramework\Http\Response;
+
+
+/**
+ * Redirects to a different URL
+ */
+class RedirectResponse extends Response {
+
+ private $redirectURL;
+
+ /**
+ * Creates a response that redirects to a url
+ * @param string $redirectURL the url to redirect to
+ */
+ public function __construct($redirectURL) {
+ $this->redirectURL = $redirectURL;
+ $this->setStatus(Http::STATUS_TEMPORARY_REDIRECT);
+ $this->addHeader('Location', $redirectURL);
+ }
+
+
+ /**
+ * @return string the url to redirect
+ */
+ public function getRedirectURL() {
+ return $this->redirectURL;
+ }
+
+
+}
diff --git a/lib/private/appframework/http/request.php b/lib/private/appframework/http/request.php
new file mode 100644
index 00000000000..34605acdfea
--- /dev/null
+++ b/lib/private/appframework/http/request.php
@@ -0,0 +1,307 @@
+<?php
+/**
+ * ownCloud - Request
+ *
+ * @author Thomas Tanghus
+ * @copyright 2013 Thomas Tanghus (thomas@tanghus.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\AppFramework\Http;
+
+use OCP\IRequest;
+
+/**
+ * Class for accessing variables in the request.
+ * This class provides an immutable object with request variables.
+ */
+
+class Request implements \ArrayAccess, \Countable, IRequest {
+
+ protected $items = array();
+ protected $allowedKeys = array(
+ 'get',
+ 'post',
+ 'files',
+ 'server',
+ 'env',
+ 'cookies',
+ 'urlParams',
+ 'params',
+ 'parameters',
+ 'method'
+ );
+
+ /**
+ * @param array $vars An associative array with the following optional values:
+ * @param array 'params' the parsed json array
+ * @param array 'urlParams' the parameters which were matched from the URL
+ * @param array 'get' the $_GET array
+ * @param array 'post' the $_POST array
+ * @param array 'files' the $_FILES array
+ * @param array 'server' the $_SERVER array
+ * @param array 'env' the $_ENV array
+ * @param array 'session' the $_SESSION array
+ * @param array 'cookies' the $_COOKIE array
+ * @param string 'method' the request method (GET, POST etc)
+ * @see http://www.php.net/manual/en/reserved.variables.php
+ */
+ public function __construct(array $vars=array()) {
+
+ foreach($this->allowedKeys as $name) {
+ $this->items[$name] = isset($vars[$name])
+ ? $vars[$name]
+ : array();
+ }
+
+ $this->items['parameters'] = array_merge(
+ $this->items['params'],
+ $this->items['get'],
+ $this->items['post'],
+ $this->items['urlParams']
+ );
+
+ }
+
+ // Countable method.
+ public function count() {
+ return count(array_keys($this->items['parameters']));
+ }
+
+ /**
+ * ArrayAccess methods
+ *
+ * Gives access to the combined GET, POST and urlParams arrays
+ *
+ * Examples:
+ *
+ * $var = $request['myvar'];
+ *
+ * or
+ *
+ * if(!isset($request['myvar']) {
+ * // Do something
+ * }
+ *
+ * $request['myvar'] = 'something'; // This throws an exception.
+ *
+ * @param string $offset The key to lookup
+ * @return string|null
+ */
+ public function offsetExists($offset) {
+ return isset($this->items['parameters'][$offset]);
+ }
+
+ /**
+ * @see offsetExists
+ */
+ public function offsetGet($offset) {
+ return isset($this->items['parameters'][$offset])
+ ? $this->items['parameters'][$offset]
+ : null;
+ }
+
+ /**
+ * @see offsetExists
+ */
+ public function offsetSet($offset, $value) {
+ throw new \RuntimeException('You cannot change the contents of the request object');
+ }
+
+ /**
+ * @see offsetExists
+ */
+ public function offsetUnset($offset) {
+ throw new \RuntimeException('You cannot change the contents of the request object');
+ }
+
+ // Magic property accessors
+ public function __set($name, $value) {
+ throw new \RuntimeException('You cannot change the contents of the request object');
+ }
+
+ /**
+ * Access request variables by method and name.
+ * Examples:
+ *
+ * $request->post['myvar']; // Only look for POST variables
+ * $request->myvar; or $request->{'myvar'}; or $request->{$myvar}
+ * Looks in the combined GET, POST and urlParams array.
+ *
+ * if($request->method !== 'POST') {
+ * throw new Exception('This function can only be invoked using POST');
+ * }
+ *
+ * @param string $name The key to look for.
+ * @return mixed|null
+ */
+ public function __get($name) {
+ switch($name) {
+ case 'get':
+ case 'post':
+ case 'files':
+ case 'server':
+ case 'env':
+ case 'cookies':
+ case 'parameters':
+ case 'params':
+ case 'urlParams':
+ return isset($this->items[$name])
+ ? $this->items[$name]
+ : null;
+ break;
+ case 'method':
+ return $this->items['method'];
+ break;
+ default;
+ return isset($this[$name])
+ ? $this[$name]
+ : null;
+ break;
+ }
+ }
+
+
+ public function __isset($name) {
+ return isset($this->items['parameters'][$name]);
+ }
+
+
+ public function __unset($id) {
+ throw new \RunTimeException('You cannot change the contents of the request object');
+ }
+
+ /**
+ * Returns the value for a specific http header.
+ *
+ * This method returns null if the header did not exist.
+ *
+ * @param string $name
+ * @return string
+ */
+ public function getHeader($name) {
+
+ $name = strtoupper(str_replace(array('-'),array('_'),$name));
+ if (isset($this->server['HTTP_' . $name])) {
+ return $this->server['HTTP_' . $name];
+ }
+
+ // There's a few headers that seem to end up in the top-level
+ // server array.
+ switch($name) {
+ case 'CONTENT_TYPE' :
+ case 'CONTENT_LENGTH' :
+ if (isset($this->server[$name])) {
+ return $this->server[$name];
+ }
+ break;
+
+ }
+
+ return null;
+ }
+
+ /**
+ * Lets you access post and get parameters by the index
+ * In case of json requests the encoded json body is accessed
+ *
+ * @param string $key the key which you want to access in the URL Parameter
+ * placeholder, $_POST or $_GET array.
+ * The priority how they're returned is the following:
+ * 1. URL parameters
+ * 2. POST parameters
+ * 3. GET parameters
+ * @param mixed $default If the key is not found, this value will be returned
+ * @return mixed the content of the array
+ */
+ public function getParam($key, $default = null) {
+ return isset($this->parameters[$key])
+ ? $this->parameters[$key]
+ : $default;
+ }
+
+ /**
+ * Returns all params that were received, be it from the request
+ * (as GET or POST) or throuh the URL by the route
+ * @return array the array with all parameters
+ */
+ public function getParams() {
+ return $this->parameters;
+ }
+
+ /**
+ * Returns the method of the request
+ * @return string the method of the request (POST, GET, etc)
+ */
+ public function getMethod() {
+ return $this->method;
+ }
+
+ /**
+ * Shortcut for accessing an uploaded file through the $_FILES array
+ * @param string $key the key that will be taken from the $_FILES array
+ * @return array the file in the $_FILES element
+ */
+ public function getUploadedFile($key) {
+ return isset($this->files[$key]) ? $this->files[$key] : null;
+ }
+
+ /**
+ * Shortcut for getting env variables
+ * @param string $key the key that will be taken from the $_ENV array
+ * @return array the value in the $_ENV element
+ */
+ public function getEnv($key) {
+ return isset($this->env[$key]) ? $this->env[$key] : null;
+ }
+
+ /**
+ * Shortcut for getting cookie variables
+ * @param string $key the key that will be taken from the $_COOKIE array
+ * @return array the value in the $_COOKIE element
+ */
+ function getCookie($key) {
+ return isset($this->cookies[$key]) ? $this->cookies[$key] : null;
+ }
+
+ /**
+ * Returns the request body content.
+ *
+ * @param Boolean $asResource If true, a resource will be returned
+ *
+ * @return string|resource The request body content or a resource to read the body stream.
+ *
+ * @throws \LogicException
+ */
+ function getContent($asResource = false) {
+ return null;
+// if (false === $this->content || (true === $asResource && null !== $this->content)) {
+// throw new \LogicException('getContent() can only be called once when using the resource return type.');
+// }
+//
+// if (true === $asResource) {
+// $this->content = false;
+//
+// return fopen('php://input', 'rb');
+// }
+//
+// if (null === $this->content) {
+// $this->content = file_get_contents('php://input');
+// }
+//
+// return $this->content;
+ }
+}
diff --git a/lib/private/appframework/middleware/middleware.php b/lib/private/appframework/middleware/middleware.php
new file mode 100644
index 00000000000..b12c03c3eb8
--- /dev/null
+++ b/lib/private/appframework/middleware/middleware.php
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware;
+
+use OCP\AppFramework\Http\Response;
+
+
+/**
+ * Middleware is used to provide hooks before or after controller methods and
+ * deal with possible exceptions raised in the controller methods.
+ * They're modeled after Django's middleware system:
+ * https://docs.djangoproject.com/en/dev/topics/http/middleware/
+ */
+abstract class Middleware {
+
+
+ /**
+ * This is being run in normal order before the controller is being
+ * called which allows several modifications and checks
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ */
+ public function beforeController($controller, $methodName){
+
+ }
+
+
+ /**
+ * This is being run when either the beforeController method or the
+ * controller method itself is throwing an exception. The middleware is
+ * asked in reverse order to handle the exception and to return a response.
+ * If the response is null, it is assumed that the exception could not be
+ * handled and the error will be thrown again
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param \Exception $exception the thrown exception
+ * @throws \Exception the passed in exception if it cant handle it
+ * @return Response a Response object in case that the exception was handled
+ */
+ public function afterException($controller, $methodName, \Exception $exception){
+ throw $exception;
+ }
+
+
+ /**
+ * This is being run after a successful controllermethod call and allows
+ * the manipulation of a Response object. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param Response $response the generated response from the controller
+ * @return Response a Response object
+ */
+ public function afterController($controller, $methodName, Response $response){
+ return $response;
+ }
+
+
+ /**
+ * This is being run after the response object has been rendered and
+ * allows the manipulation of the output. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param string $output the generated output from a response
+ * @return string the output that should be printed
+ */
+ public function beforeOutput($controller, $methodName, $output){
+ return $output;
+ }
+
+}
diff --git a/lib/private/appframework/middleware/middlewaredispatcher.php b/lib/private/appframework/middleware/middlewaredispatcher.php
new file mode 100644
index 00000000000..70ab108e6b8
--- /dev/null
+++ b/lib/private/appframework/middleware/middlewaredispatcher.php
@@ -0,0 +1,159 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware;
+
+use OC\AppFramework\Controller\Controller;
+use OCP\AppFramework\Http\Response;
+
+
+/**
+ * This class is used to store and run all the middleware in correct order
+ */
+class MiddlewareDispatcher {
+
+ /**
+ * @var array array containing all the middlewares
+ */
+ private $middlewares;
+
+ /**
+ * @var int counter which tells us what middlware was executed once an
+ * exception occurs
+ */
+ private $middlewareCounter;
+
+
+ /**
+ * Constructor
+ */
+ public function __construct(){
+ $this->middlewares = array();
+ $this->middlewareCounter = 0;
+ }
+
+
+ /**
+ * Adds a new middleware
+ * @param Middleware $middleware the middleware which will be added
+ */
+ public function registerMiddleware(Middleware $middleWare){
+ array_push($this->middlewares, $middleWare);
+ }
+
+
+ /**
+ * returns an array with all middleware elements
+ * @return array the middlewares
+ */
+ public function getMiddlewares(){
+ return $this->middlewares;
+ }
+
+
+ /**
+ * This is being run in normal order before the controller is being
+ * called which allows several modifications and checks
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ */
+ public function beforeController(Controller $controller, $methodName){
+ // we need to count so that we know which middlewares we have to ask in
+ // case theres an exception
+ for($i=0; $i<count($this->middlewares); $i++){
+ $this->middlewareCounter++;
+ $middleware = $this->middlewares[$i];
+ $middleware->beforeController($controller, $methodName);
+ }
+ }
+
+
+ /**
+ * This is being run when either the beforeController method or the
+ * controller method itself is throwing an exception. The middleware is asked
+ * in reverse order to handle the exception and to return a response.
+ * If the response is null, it is assumed that the exception could not be
+ * handled and the error will be thrown again
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param \Exception $exception the thrown exception
+ * @return Response a Response object if the middleware can handle the
+ * exception
+ * @throws \Exception the passed in exception if it cant handle it
+ */
+ public function afterException(Controller $controller, $methodName, \Exception $exception){
+ for($i=$this->middlewareCounter-1; $i>=0; $i--){
+ $middleware = $this->middlewares[$i];
+ try {
+ return $middleware->afterException($controller, $methodName, $exception);
+ } catch(\Exception $exception){
+ continue;
+ }
+ }
+ throw $exception;
+ }
+
+
+ /**
+ * This is being run after a successful controllermethod call and allows
+ * the manipulation of a Response object. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param Response $response the generated response from the controller
+ * @return Response a Response object
+ */
+ public function afterController(Controller $controller, $methodName, Response $response){
+ for($i=count($this->middlewares)-1; $i>=0; $i--){
+ $middleware = $this->middlewares[$i];
+ $response = $middleware->afterController($controller, $methodName, $response);
+ }
+ return $response;
+ }
+
+
+ /**
+ * This is being run after the response object has been rendered and
+ * allows the manipulation of the output. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param string $output the generated output from a response
+ * @return string the output that should be printed
+ */
+ public function beforeOutput(Controller $controller, $methodName, $output){
+ for($i=count($this->middlewares)-1; $i>=0; $i--){
+ $middleware = $this->middlewares[$i];
+ $output = $middleware->beforeOutput($controller, $methodName, $output);
+ }
+ return $output;
+ }
+
+}
diff --git a/lib/private/appframework/middleware/security/securityexception.php b/lib/private/appframework/middleware/security/securityexception.php
new file mode 100644
index 00000000000..b32a2769ff5
--- /dev/null
+++ b/lib/private/appframework/middleware/security/securityexception.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware\Security;
+
+
+/**
+ * Thrown when the security middleware encounters a security problem
+ */
+class SecurityException extends \Exception {
+
+ /**
+ * @param string $msg the security error message
+ * @param bool $ajax true if it resulted because of an ajax request
+ */
+ public function __construct($msg, $code = 0) {
+ parent::__construct($msg, $code);
+ }
+
+}
diff --git a/lib/private/appframework/middleware/security/securitymiddleware.php b/lib/private/appframework/middleware/security/securitymiddleware.php
new file mode 100644
index 00000000000..4f1447e1afb
--- /dev/null
+++ b/lib/private/appframework/middleware/security/securitymiddleware.php
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware\Security;
+
+use OC\AppFramework\Controller\Controller;
+use OC\AppFramework\Http\Http;
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\RedirectResponse;
+use OC\AppFramework\Utility\MethodAnnotationReader;
+use OC\AppFramework\Middleware\Middleware;
+use OC\AppFramework\Core\API;
+use OCP\AppFramework\Http\Response;
+use OCP\AppFramework\Http\JSONResponse;
+
+
+/**
+ * Used to do all the authentication and checking stuff for a controller method
+ * It reads out the annotations of a controller method and checks which if
+ * security things should be checked and also handles errors in case a security
+ * check fails
+ */
+class SecurityMiddleware extends Middleware {
+
+ private $api;
+
+ /**
+ * @var \OC\AppFramework\Http\Request
+ */
+ private $request;
+
+ /**
+ * @param API $api an instance of the api
+ */
+ public function __construct(API $api, Request $request){
+ $this->api = $api;
+ $this->request = $request;
+ }
+
+
+ /**
+ * This runs all the security checks before a method call. The
+ * security checks are determined by inspecting the controller method
+ * annotations
+ * @param string/Controller $controller the controllername or string
+ * @param string $methodName the name of the method
+ * @throws SecurityException when a security check fails
+ */
+ public function beforeController($controller, $methodName){
+
+ // get annotations from comments
+ $annotationReader = new MethodAnnotationReader($controller, $methodName);
+
+ // this will set the current navigation entry of the app, use this only
+ // for normal HTML requests and not for AJAX requests
+ $this->api->activateNavigationEntry();
+
+ // security checks
+ $isPublicPage = $annotationReader->hasAnnotation('PublicPage');
+ if(!$isPublicPage) {
+ if(!$this->api->isLoggedIn()) {
+ throw new SecurityException('Current user is not logged in', Http::STATUS_UNAUTHORIZED);
+ }
+
+ if(!$annotationReader->hasAnnotation('NoAdminRequired')) {
+ if(!$this->api->isAdminUser($this->api->getUserId())) {
+ throw new SecurityException('Logged in user must be an admin', Http::STATUS_FORBIDDEN);
+ }
+ }
+ }
+
+ if(!$annotationReader->hasAnnotation('NoCSRFRequired')) {
+ if(!$this->api->passesCSRFCheck()) {
+ throw new SecurityException('CSRF check failed', Http::STATUS_PRECONDITION_FAILED);
+ }
+ }
+
+ }
+
+
+ /**
+ * If an SecurityException is being caught, ajax requests return a JSON error
+ * response and non ajax requests redirect to the index
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param \Exception $exception the thrown exception
+ * @throws \Exception the passed in exception if it cant handle it
+ * @return Response a Response object or null in case that the exception could not be handled
+ */
+ public function afterException($controller, $methodName, \Exception $exception){
+ if($exception instanceof SecurityException){
+
+ if (stripos($this->request->getHeader('Accept'),'html')===false) {
+
+ $response = new JSONResponse(
+ array('message' => $exception->getMessage()),
+ $exception->getCode()
+ );
+ $this->api->log($exception->getMessage(), 'debug');
+ } else {
+
+ $url = $this->api->linkToAbsolute('index.php', ''); // TODO: replace with link to route
+ $response = new RedirectResponse($url);
+ $this->api->log($exception->getMessage(), 'debug');
+ }
+
+ return $response;
+
+ }
+
+ throw $exception;
+ }
+
+}
diff --git a/lib/private/appframework/routing/routeactionhandler.php b/lib/private/appframework/routing/routeactionhandler.php
new file mode 100644
index 00000000000..7fb56f14eab
--- /dev/null
+++ b/lib/private/appframework/routing/routeactionhandler.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * ownCloud - App Framework
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\AppFramework\routing;
+
+use \OC\AppFramework\App;
+use \OC\AppFramework\DependencyInjection\DIContainer;
+
+class RouteActionHandler {
+ private $controllerName;
+ private $actionName;
+ private $container;
+
+ public function __construct(DIContainer $container, $controllerName, $actionName) {
+ $this->controllerName = $controllerName;
+ $this->actionName = $actionName;
+ $this->container = $container;
+ }
+
+ public function __invoke($params) {
+ App::main($this->controllerName, $this->actionName, $params, $this->container);
+ }
+}
diff --git a/lib/private/appframework/routing/routeconfig.php b/lib/private/appframework/routing/routeconfig.php
new file mode 100644
index 00000000000..53ab11bf2f5
--- /dev/null
+++ b/lib/private/appframework/routing/routeconfig.php
@@ -0,0 +1,186 @@
+<?php
+/**
+ * ownCloud - App Framework
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\AppFramework\routing;
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+
+/**
+ * Class RouteConfig
+ * @package OC\AppFramework\routing
+ */
+class RouteConfig {
+ private $container;
+ private $router;
+ private $routes;
+ private $appName;
+
+ /**
+ * @param \OC\AppFramework\DependencyInjection\DIContainer $container
+ * @param \OC_Router $router
+ * @param string $pathToYml
+ * @internal param $appName
+ */
+ public function __construct(DIContainer $container, \OC_Router $router, $routes) {
+ $this->routes = $routes;
+ $this->container = $container;
+ $this->router = $router;
+ $this->appName = $container['AppName'];
+ }
+
+ /**
+ * The routes and resource will be registered to the \OC_Router
+ */
+ public function register() {
+
+ // parse simple
+ $this->processSimpleRoutes($this->routes);
+
+ // parse resources
+ $this->processResources($this->routes);
+ }
+
+ /**
+ * Creates one route base on the give configuration
+ * @param $routes
+ * @throws \UnexpectedValueException
+ */
+ private function processSimpleRoutes($routes)
+ {
+ $simpleRoutes = isset($routes['routes']) ? $routes['routes'] : array();
+ foreach ($simpleRoutes as $simpleRoute) {
+ $name = $simpleRoute['name'];
+ $url = $simpleRoute['url'];
+ $verb = isset($simpleRoute['verb']) ? strtoupper($simpleRoute['verb']) : 'GET';
+
+ $split = explode('#', $name, 2);
+ if (count($split) != 2) {
+ throw new \UnexpectedValueException('Invalid route name');
+ }
+ $controller = $split[0];
+ $action = $split[1];
+
+ $controllerName = $this->buildControllerName($controller);
+ $actionName = $this->buildActionName($action);
+
+ // register the route
+ $handler = new RouteActionHandler($this->container, $controllerName, $actionName);
+ $this->router->create($this->appName.'.'.$controller.'.'.$action, $url)->method($verb)->action($handler);
+ }
+ }
+
+ /**
+ * For a given name and url restful routes are created:
+ * - index
+ * - show
+ * - new
+ * - create
+ * - update
+ * - destroy
+ *
+ * @param $routes
+ */
+ private function processResources($routes)
+ {
+ // declaration of all restful actions
+ $actions = array(
+ array('name' => 'index', 'verb' => 'GET', 'on-collection' => true),
+ array('name' => 'show', 'verb' => 'GET'),
+ array('name' => 'create', 'verb' => 'POST', 'on-collection' => true),
+ array('name' => 'update', 'verb' => 'PUT'),
+ array('name' => 'destroy', 'verb' => 'DELETE'),
+ );
+
+ $resources = isset($routes['resources']) ? $routes['resources'] : array();
+ foreach ($resources as $resource => $config) {
+
+ // the url parameter used as id to the resource
+ $resourceId = $this->buildResourceId($resource);
+ foreach($actions as $action) {
+ $url = $config['url'];
+ $method = $action['name'];
+ $verb = isset($action['verb']) ? strtoupper($action['verb']) : 'GET';
+ $collectionAction = isset($action['on-collection']) ? $action['on-collection'] : false;
+ if (!$collectionAction) {
+ $url = $url . '/' . $resourceId;
+ }
+ if (isset($action['url-postfix'])) {
+ $url = $url . '/' . $action['url-postfix'];
+ }
+
+ $controller = $resource;
+
+ $controllerName = $this->buildControllerName($controller);
+ $actionName = $this->buildActionName($method);
+
+ $routeName = $this->appName . '.' . strtolower($resource) . '.' . strtolower($method);
+
+ $this->router->create($routeName, $url)->method($verb)->action(
+ new RouteActionHandler($this->container, $controllerName, $actionName)
+ );
+ }
+ }
+ }
+
+ /**
+ * Based on a given route name the controller name is generated
+ * @param $controller
+ * @return string
+ */
+ private function buildControllerName($controller)
+ {
+ return $this->underScoreToCamelCase(ucfirst($controller)) . 'Controller';
+ }
+
+ /**
+ * Based on the action part of the route name the controller method name is generated
+ * @param $action
+ * @return string
+ */
+ private function buildActionName($action) {
+ return $this->underScoreToCamelCase($action);
+ }
+
+ /**
+ * Generates the id used in the url part o the route url
+ * @param $resource
+ * @return string
+ */
+ private function buildResourceId($resource) {
+ return '{'.$this->underScoreToCamelCase(rtrim($resource, 's')).'Id}';
+ }
+
+ /**
+ * Underscored strings are converted to camel case strings
+ * @param $str string
+ * @return string
+ */
+ private function underScoreToCamelCase($str) {
+ $pattern = "/_[a-z]?/";
+ return preg_replace_callback(
+ $pattern,
+ function ($matches) {
+ return strtoupper(ltrim($matches[0], "_"));
+ },
+ $str);
+ }
+}
diff --git a/lib/private/appframework/utility/methodannotationreader.php b/lib/private/appframework/utility/methodannotationreader.php
new file mode 100644
index 00000000000..42060a08529
--- /dev/null
+++ b/lib/private/appframework/utility/methodannotationreader.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Utility;
+
+
+/**
+ * Reads and parses annotations from doc comments
+ */
+class MethodAnnotationReader {
+
+ private $annotations;
+
+ /**
+ * @param object $object an object or classname
+ * @param string $method the method which we want to inspect for annotations
+ */
+ public function __construct($object, $method){
+ $this->annotations = array();
+
+ $reflection = new \ReflectionMethod($object, $method);
+ $docs = $reflection->getDocComment();
+
+ // extract everything prefixed by @ and first letter uppercase
+ preg_match_all('/@([A-Z]\w+)/', $docs, $matches);
+ $this->annotations = $matches[1];
+ }
+
+
+ /**
+ * Check if a method contains an annotation
+ * @param string $name the name of the annotation
+ * @return bool true if the annotation is found
+ */
+ public function hasAnnotation($name){
+ return in_array($name, $this->annotations);
+ }
+
+
+}
diff --git a/lib/private/appframework/utility/simplecontainer.php b/lib/private/appframework/utility/simplecontainer.php
new file mode 100644
index 00000000000..7e4db63bde5
--- /dev/null
+++ b/lib/private/appframework/utility/simplecontainer.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace OC\AppFramework\Utility;
+
+// register 3rdparty autoloaders
+require_once __DIR__ . '/../../../../3rdparty/Pimple/Pimple.php';
+
+/**
+ * Class SimpleContainer
+ *
+ * SimpleContainer is a simple implementation of IContainer on basis of \Pimple
+ */
+class SimpleContainer extends \Pimple implements \OCP\IContainer {
+
+ /**
+ * @param string $name name of the service to query for
+ * @return object registered service for the given $name
+ */
+ public function query($name) {
+ return $this->offsetGet($name);
+ }
+
+ function registerParameter($name, $value)
+ {
+ $this[$name] = $value;
+ }
+
+ /**
+ * The given closure is call the first time the given service is queried.
+ * The closure has to return the instance for the given service.
+ * Created instance will be cached in case $shared is true.
+ *
+ * @param string $name name of the service to register another backend for
+ * @param callable $closure the closure to be called on service creation
+ */
+ function registerService($name, \Closure $closure, $shared = true)
+ {
+ if ($shared) {
+ $this[$name] = \Pimple::share($closure);
+ } else {
+ $this[$name] = $closure;
+ }
+ }
+}
diff --git a/lib/private/appframework/utility/timefactory.php b/lib/private/appframework/utility/timefactory.php
new file mode 100644
index 00000000000..2c3dd6cf5e3
--- /dev/null
+++ b/lib/private/appframework/utility/timefactory.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Utility;
+
+
+/**
+ * Needed to mock calls to time()
+ */
+class TimeFactory {
+
+
+ /**
+ * @return int the result of a call to time()
+ */
+ public function getTime() {
+ return time();
+ }
+
+
+}
diff --git a/lib/archive.php b/lib/private/archive.php
index 85bfae57295..85bfae57295 100644
--- a/lib/archive.php
+++ b/lib/private/archive.php
diff --git a/lib/archive/tar.php b/lib/private/archive/tar.php
index a1c0535b1c3..a1c0535b1c3 100644
--- a/lib/archive/tar.php
+++ b/lib/private/archive/tar.php
diff --git a/lib/archive/zip.php b/lib/private/archive/zip.php
index 8a866716a79..8a866716a79 100644
--- a/lib/archive/zip.php
+++ b/lib/private/archive/zip.php
diff --git a/lib/arrayparser.php b/lib/private/arrayparser.php
index 3bb394a5163..3bb394a5163 100644
--- a/lib/arrayparser.php
+++ b/lib/private/arrayparser.php
diff --git a/lib/avatar.php b/lib/private/avatar.php
index f20980c364b..f20980c364b 100644
--- a/lib/avatar.php
+++ b/lib/private/avatar.php
diff --git a/lib/backgroundjob.php b/lib/private/backgroundjob.php
index 9619dcb732c..9619dcb732c 100644
--- a/lib/backgroundjob.php
+++ b/lib/private/backgroundjob.php
diff --git a/lib/backgroundjob/job.php b/lib/private/backgroundjob/job.php
index 49fbffbd684..49fbffbd684 100644
--- a/lib/backgroundjob/job.php
+++ b/lib/private/backgroundjob/job.php
diff --git a/lib/backgroundjob/joblist.php b/lib/private/backgroundjob/joblist.php
index cc803dd9b5f..cc803dd9b5f 100644
--- a/lib/backgroundjob/joblist.php
+++ b/lib/private/backgroundjob/joblist.php
diff --git a/lib/backgroundjob/legacy/queuedjob.php b/lib/private/backgroundjob/legacy/queuedjob.php
index 2bc001103b8..2bc001103b8 100644
--- a/lib/backgroundjob/legacy/queuedjob.php
+++ b/lib/private/backgroundjob/legacy/queuedjob.php
diff --git a/lib/backgroundjob/legacy/regularjob.php b/lib/private/backgroundjob/legacy/regularjob.php
index d4cfa348cea..d4cfa348cea 100644
--- a/lib/backgroundjob/legacy/regularjob.php
+++ b/lib/private/backgroundjob/legacy/regularjob.php
diff --git a/lib/backgroundjob/queuedjob.php b/lib/private/backgroundjob/queuedjob.php
index 1714182820d..1714182820d 100644
--- a/lib/backgroundjob/queuedjob.php
+++ b/lib/private/backgroundjob/queuedjob.php
diff --git a/lib/backgroundjob/timedjob.php b/lib/private/backgroundjob/timedjob.php
index ae9f33505ab..ae9f33505ab 100644
--- a/lib/backgroundjob/timedjob.php
+++ b/lib/private/backgroundjob/timedjob.php
diff --git a/lib/cache.php b/lib/private/cache.php
index 48b9964ba9d..a311f10a00f 100644
--- a/lib/cache.php
+++ b/lib/private/cache.php
@@ -6,34 +6,36 @@
* See the COPYING-README file.
*/
-class OC_Cache {
+namespace OC;
+
+class Cache {
/**
- * @var OC_Cache $user_cache
+ * @var Cache $user_cache
*/
static protected $user_cache;
/**
- * @var OC_Cache $global_cache
+ * @var Cache $global_cache
*/
static protected $global_cache;
/**
* get the global cache
- * @return OC_Cache
+ * @return Cache
*/
static public function getGlobalCache() {
if (!self::$global_cache) {
- self::$global_cache = new OC_Cache_FileGlobal();
+ self::$global_cache = new Cache\FileGlobal();
}
return self::$global_cache;
}
/**
* get the user cache
- * @return OC_Cache
+ * @return Cache
*/
static public function getUserCache() {
if (!self::$user_cache) {
- self::$user_cache = new OC_Cache_File();
+ self::$user_cache = new Cache\File();
}
return self::$user_cache;
}
@@ -85,7 +87,7 @@ class OC_Cache {
/**
* clear the user cache of all entries starting with a prefix
- * @param string prefix (optional)
+ * @param string $prefix (optional)
* @return bool
*/
static public function clear($prefix='') {
@@ -93,6 +95,11 @@ class OC_Cache {
return $user_cache->clear($prefix);
}
+ /**
+ * creates cache key based on the files given
+ * @param $files
+ * @return string
+ */
static public function generateCacheKeyFromFiles($files) {
$key = '';
sort($files);
diff --git a/lib/cache/broker.php b/lib/private/cache/broker.php
index a161dbfa3bb..9b7e837e1bc 100644
--- a/lib/cache/broker.php
+++ b/lib/private/cache/broker.php
@@ -6,8 +6,18 @@
* See the COPYING-README file.
*/
-class OC_Cache_Broker {
+namespace OC\Cache;
+
+class Broker {
+
+ /**
+ * @var \OC\Cache
+ */
protected $fast_cache;
+
+ /**
+ * @var \OC\Cache
+ */
protected $slow_cache;
public function __construct($fast_cache, $slow_cache) {
diff --git a/lib/cache/file.php b/lib/private/cache/file.php
index 361138e4736..2ab914d17b8 100644
--- a/lib/cache/file.php
+++ b/lib/private/cache/file.php
@@ -6,24 +6,25 @@
* See the COPYING-README file.
*/
+namespace OC\Cache;
-class OC_Cache_File{
+class File {
protected $storage;
protected function getStorage() {
if (isset($this->storage)) {
return $this->storage;
}
- if(OC_User::isLoggedIn()) {
- \OC\Files\Filesystem::initMountPoints(OC_User::getUser());
+ if(\OC_User::isLoggedIn()) {
+ \OC\Files\Filesystem::initMountPoints(\OC_User::getUser());
$subdir = 'cache';
- $view = new \OC\Files\View('/'.OC_User::getUser());
+ $view = new \OC\Files\View('/' . \OC_User::getUser());
if(!$view->file_exists($subdir)) {
$view->mkdir($subdir);
}
- $this->storage = new \OC\Files\View('/'.OC_User::getUser().'/'.$subdir);
+ $this->storage = new \OC\Files\View('/' . \OC_User::getUser().'/'.$subdir);
return $this->storage;
}else{
- OC_Log::write('core', 'Can\'t get cache storage, user not logged in', OC_Log::ERROR);
+ \OC_Log::write('core', 'Can\'t get cache storage, user not logged in', \OC_Log::ERROR);
return false;
}
}
diff --git a/lib/cache/fileglobal.php b/lib/private/cache/fileglobal.php
index c0bd8e45f39..bd049bba4d0 100644
--- a/lib/cache/fileglobal.php
+++ b/lib/private/cache/fileglobal.php
@@ -6,10 +6,11 @@
* See the COPYING-README file.
*/
+namespace OC\Cache;
-class OC_Cache_FileGlobal{
+class FileGlobal {
static protected function getCacheDir() {
- $cache_dir = get_temp_dir().'/owncloud-'.OC_Util::getInstanceId().'/';
+ $cache_dir = get_temp_dir().'/owncloud-' . \OC_Util::getInstanceId().'/';
if (!is_dir($cache_dir)) {
mkdir($cache_dir);
}
@@ -80,13 +81,13 @@ class OC_Cache_FileGlobal{
}
static public function gc() {
- $last_run = OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
+ $last_run = \OC_AppConfig::getValue('core', 'global_cache_gc_lastrun', 0);
$now = time();
if (($now - $last_run) < 300) {
// only do cleanup every 5 minutes
return;
}
- OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
+ \OC_AppConfig::setValue('core', 'global_cache_gc_lastrun', $now);
$cache_dir = self::getCacheDir();
if($cache_dir and is_dir($cache_dir)) {
$dh=opendir($cache_dir);
diff --git a/lib/private/cache/fileglobalgc.php b/lib/private/cache/fileglobalgc.php
new file mode 100644
index 00000000000..399dd5e6f94
--- /dev/null
+++ b/lib/private/cache/fileglobalgc.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace OC\Cache;
+
+class FileGlobalGC extends \OC\BackgroundJob\Job{
+ public function run($argument){
+ FileGlobal::gc();
+ }
+}
diff --git a/lib/private/cache/usercache.php b/lib/private/cache/usercache.php
new file mode 100644
index 00000000000..baa8820700b
--- /dev/null
+++ b/lib/private/cache/usercache.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+namespace OC\Cache;
+
+/**
+ * This interface defines method for accessing the file based user cache.
+ */
+class UserCache implements \OCP\ICache {
+
+ /**
+ * @var \OC\Cache\File $userCache
+ */
+ protected $userCache;
+
+ public function __construct() {
+ $this->userCache = new File();
+ }
+
+ /**
+ * Get a value from the user cache
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function get($key) {
+ return $this->userCache->get($key);
+ }
+
+ /**
+ * Set a value in the user cache
+ *
+ * @param string $key
+ * @param mixed $value
+ * @param int $ttl Time To Live in seconds. Defaults to 60*60*24
+ * @return bool
+ */
+ public function set($key, $value, $ttl = 0) {
+ if (empty($key)) {
+ return false;
+ }
+ return $this->userCache->set($key, $value, $ttl);
+ }
+
+ /**
+ * Check if a value is set in the user cache
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function hasKey($key) {
+ return $this->userCache->hasKey($key);
+ }
+
+ /**
+ * Remove an item from the user cache
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function remove($key) {
+ return $this->userCache->remove($key);
+ }
+
+ /**
+ * clear the user cache of all entries starting with a prefix
+ * @param string $prefix (optional)
+ * @return bool
+ */
+ public function clear($prefix = '') {
+ return $this->userCache->clear($prefix);
+ }
+}
diff --git a/lib/config.php b/lib/private/config.php
index e773e6e2eb0..e773e6e2eb0 100644
--- a/lib/config.php
+++ b/lib/private/config.php
diff --git a/lib/connector/sabre/ServiceUnavailable.php b/lib/private/connector/sabre/ServiceUnavailable.php
index c1cc815c989..c1cc815c989 100644
--- a/lib/connector/sabre/ServiceUnavailable.php
+++ b/lib/private/connector/sabre/ServiceUnavailable.php
diff --git a/lib/private/connector/sabre/aborteduploaddetectionplugin.php b/lib/private/connector/sabre/aborteduploaddetectionplugin.php
new file mode 100644
index 00000000000..15dca3a6809
--- /dev/null
+++ b/lib/private/connector/sabre/aborteduploaddetectionplugin.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+/**
+ * Class OC_Connector_Sabre_AbortedUploadDetectionPlugin
+ *
+ * This plugin will verify if the uploaded data has been stored completely.
+ * This is done by comparing the content length of the request with the file size on storage.
+ */
+class OC_Connector_Sabre_AbortedUploadDetectionPlugin extends Sabre_DAV_ServerPlugin {
+
+ /**
+ * Reference to main server object
+ *
+ * @var Sabre_DAV_Server
+ */
+ private $server;
+
+ /**
+ * is kept public to allow overwrite for unit testing
+ *
+ * @var \OC\Files\View
+ */
+ public $fileView;
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre_DAV_Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the requires event subscriptions.
+ *
+ * @param Sabre_DAV_Server $server
+ */
+ public function initialize(Sabre_DAV_Server $server) {
+
+ $this->server = $server;
+
+ $server->subscribeEvent('afterCreateFile', array($this, 'verifyContentLength'), 10);
+ $server->subscribeEvent('afterWriteContent', array($this, 'verifyContentLength'), 10);
+ }
+
+ /**
+ * @param $filePath
+ * @param Sabre_DAV_INode $node
+ * @throws Sabre_DAV_Exception_BadRequest
+ */
+ public function verifyContentLength($filePath, Sabre_DAV_INode $node = null) {
+
+ // ownCloud chunked upload will be handled in its own plugin
+ $chunkHeader = $this->server->httpRequest->getHeader('OC-Chunked');
+ if ($chunkHeader) {
+ return;
+ }
+
+ // compare expected and actual size
+ $expected = $this->getLength();
+ if (!$expected) {
+ return;
+ }
+ $actual = $this->getFileView()->filesize($filePath);
+ if ($actual != $expected) {
+ $this->getFileView()->unlink($filePath);
+ throw new Sabre_DAV_Exception_BadRequest('expected filesize ' . $expected . ' got ' . $actual);
+ }
+
+ }
+
+ /**
+ * @return string
+ */
+ public function getLength()
+ {
+ $req = $this->server->httpRequest;
+ $length = $req->getHeader('X-Expected-Entity-Length');
+ if (!$length) {
+ $length = $req->getHeader('Content-Length');
+ }
+
+ return $length;
+ }
+
+ /**
+ * @return \OC\Files\View
+ */
+ public function getFileView()
+ {
+ if (is_null($this->fileView)) {
+ // initialize fileView
+ $this->fileView = \OC\Files\Filesystem::getView();
+ }
+
+ return $this->fileView;
+ }
+}
diff --git a/lib/connector/sabre/auth.php b/lib/private/connector/sabre/auth.php
index bf3a49593cb..bf3a49593cb 100644
--- a/lib/connector/sabre/auth.php
+++ b/lib/private/connector/sabre/auth.php
diff --git a/lib/connector/sabre/directory.php b/lib/private/connector/sabre/directory.php
index 3181a4b310f..382bdf06df1 100644
--- a/lib/connector/sabre/directory.php
+++ b/lib/private/connector/sabre/directory.php
@@ -74,21 +74,14 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa
\OC\Files\Filesystem::file_put_contents($partpath, $data);
- //detect aborted upload
- if (isset ($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'PUT' ) {
- if (isset($_SERVER['CONTENT_LENGTH'])) {
- $expected = $_SERVER['CONTENT_LENGTH'];
- $actual = \OC\Files\Filesystem::filesize($partpath);
- if ($actual != $expected) {
- \OC\Files\Filesystem::unlink($partpath);
- throw new Sabre_DAV_Exception_BadRequest(
- 'expected filesize ' . $expected . ' got ' . $actual);
- }
- }
- }
-
// rename to correct path
- \OC\Files\Filesystem::rename($partpath, $newPath);
+ $renameOkay = \OC\Files\Filesystem::rename($partpath, $newPath);
+ $fileExists = \OC\Files\Filesystem::file_exists($newPath);
+ if ($renameOkay === false || $fileExists === false) {
+ \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
+ \OC\Files\Filesystem::unlink($partpath);
+ throw new Sabre_DAV_Exception();
+ }
// allow sync clients to send the mtime along in a header
$mtime = OC_Request::hasModificationTime();
diff --git a/lib/connector/sabre/file.php b/lib/private/connector/sabre/file.php
index 61bdcd5e0ae..433b1148552 100644
--- a/lib/connector/sabre/file.php
+++ b/lib/private/connector/sabre/file.php
@@ -74,7 +74,14 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D
}
// rename to correct path
- \OC\Files\Filesystem::rename($partpath, $this->path);
+ $renameOkay = \OC\Files\Filesystem::rename($partpath, $this->path);
+ $fileExists = \OC\Files\Filesystem::file_exists($this->path);
+ if ($renameOkay === false || $fileExists === false) {
+ \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR);
+ \OC\Files\Filesystem::unlink($partpath);
+ throw new Sabre_DAV_Exception();
+ }
+
//allow sync clients to send the mtime along in a header
$mtime = OC_Request::hasModificationTime();
diff --git a/lib/connector/sabre/locks.php b/lib/private/connector/sabre/locks.php
index 69496c15ada..69496c15ada 100644
--- a/lib/connector/sabre/locks.php
+++ b/lib/private/connector/sabre/locks.php
diff --git a/lib/connector/sabre/maintenanceplugin.php b/lib/private/connector/sabre/maintenanceplugin.php
index 2eda269afc2..2eda269afc2 100644
--- a/lib/connector/sabre/maintenanceplugin.php
+++ b/lib/private/connector/sabre/maintenanceplugin.php
diff --git a/lib/connector/sabre/node.php b/lib/private/connector/sabre/node.php
index 0bffa58af78..29b7f9e53a5 100644
--- a/lib/connector/sabre/node.php
+++ b/lib/private/connector/sabre/node.php
@@ -78,6 +78,11 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
*/
public function setName($name) {
+ // rename is only allowed if the update privilege is granted
+ if (!\OC\Files\Filesystem::isUpdatable($this->path)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+
list($parentPath, ) = Sabre_DAV_URLUtil::splitPath($this->path);
list(, $newName) = Sabre_DAV_URLUtil::splitPath($name);
@@ -135,6 +140,12 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr
* Even if the modification time is set to a custom value the access time is set to now.
*/
public function touch($mtime) {
+
+ // touch is only allowed if the update privilege is granted
+ if (!\OC\Files\Filesystem::isUpdatable($this->path)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+
\OC\Files\Filesystem::touch($this->path, $mtime);
}
diff --git a/lib/connector/sabre/objecttree.php b/lib/private/connector/sabre/objecttree.php
index acff45ed5e2..80c3840b99d 100644
--- a/lib/connector/sabre/objecttree.php
+++ b/lib/private/connector/sabre/objecttree.php
@@ -11,6 +11,14 @@ namespace OC\Connector\Sabre;
use OC\Files\Filesystem;
class ObjectTree extends \Sabre_DAV_ObjectTree {
+
+ /**
+ * keep this public to allow mock injection during unit test
+ *
+ * @var \OC\Files\View
+ */
+ public $fileView;
+
/**
* Returns the INode object for the requested path
*
@@ -21,14 +29,16 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
public function getNodeForPath($path) {
$path = trim($path, '/');
- if (isset($this->cache[$path])) return $this->cache[$path];
+ if (isset($this->cache[$path])) {
+ return $this->cache[$path];
+ }
// Is it the root node?
if (!strlen($path)) {
return $this->rootNode;
}
- $info = Filesystem::getFileInfo($path);
+ $info = $this->getFileView()->getFileInfo($path);
if (!$info) {
throw new \Sabre_DAV_Exception_NotFound('File with name ' . $path . ' could not be located');
@@ -64,7 +74,25 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
list($sourceDir,) = \Sabre_DAV_URLUtil::splitPath($sourcePath);
list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destinationPath);
- Filesystem::rename($sourcePath, $destinationPath);
+ // check update privileges
+ $fs = $this->getFileView();
+ if (!$fs->isUpdatable($sourcePath)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ if ($sourceDir !== $destinationDir) {
+ // for a full move we need update privileges on sourcePath and sourceDir as well as destinationDir
+ if (!$fs->isUpdatable($sourceDir)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ if (!$fs->isUpdatable($destinationDir)) {
+ throw new \Sabre_DAV_Exception_Forbidden();
+ }
+ }
+
+ $renameOkay = $fs->rename($sourcePath, $destinationPath);
+ if (!$renameOkay) {
+ throw new \Sabre_DAV_Exception_Forbidden('');
+ }
$this->markDirty($sourceDir);
$this->markDirty($destinationDir);
@@ -101,4 +129,14 @@ class ObjectTree extends \Sabre_DAV_ObjectTree {
list($destinationDir,) = \Sabre_DAV_URLUtil::splitPath($destination);
$this->markDirty($destinationDir);
}
+
+ /**
+ * @return \OC\Files\View
+ */
+ public function getFileView() {
+ if (is_null($this->fileView)) {
+ $this->fileView = \OC\Files\Filesystem::getView();
+ }
+ return $this->fileView;
+ }
}
diff --git a/lib/connector/sabre/principal.php b/lib/private/connector/sabre/principal.php
index 59a96797c16..59a96797c16 100644
--- a/lib/connector/sabre/principal.php
+++ b/lib/private/connector/sabre/principal.php
diff --git a/lib/connector/sabre/quotaplugin.php b/lib/private/connector/sabre/quotaplugin.php
index ea2cb81d1f7..ea2cb81d1f7 100644
--- a/lib/connector/sabre/quotaplugin.php
+++ b/lib/private/connector/sabre/quotaplugin.php
diff --git a/lib/connector/sabre/request.php b/lib/private/connector/sabre/request.php
index d70c25c4e70..d70c25c4e70 100644
--- a/lib/connector/sabre/request.php
+++ b/lib/private/connector/sabre/request.php
diff --git a/lib/private/contactsmanager.php b/lib/private/contactsmanager.php
new file mode 100644
index 00000000000..fc6745b4505
--- /dev/null
+++ b/lib/private/contactsmanager.php
@@ -0,0 +1,145 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC {
+
+ class ContactsManager implements \OCP\Contacts\IManager {
+
+ /**
+ * This function is used to search and find contacts within the users address books.
+ * In case $pattern is empty all contacts will be returned.
+ *
+ * @param string $pattern which should match within the $searchProperties
+ * @param array $searchProperties defines the properties within the query pattern should match
+ * @param array $options - for future use. One should always have options!
+ * @return array of contacts which are arrays of key-value-pairs
+ */
+ public function search($pattern, $searchProperties = array(), $options = array()) {
+ $result = array();
+ foreach($this->address_books as $address_book) {
+ $r = $address_book->search($pattern, $searchProperties, $options);
+ $result = array_merge($result, $r);
+ }
+
+ return $result;
+ }
+
+ /**
+ * This function can be used to delete the contact identified by the given id
+ *
+ * @param object $id the unique identifier to a contact
+ * @param $address_book_key
+ * @return bool successful or not
+ */
+ public function delete($id, $address_book_key) {
+ if (!array_key_exists($address_book_key, $this->address_books))
+ return null;
+
+ $address_book = $this->address_books[$address_book_key];
+ if ($address_book->getPermissions() & \OCP\PERMISSION_DELETE)
+ return null;
+
+ return $address_book->delete($id);
+ }
+
+ /**
+ * This function is used to create a new contact if 'id' is not given or not present.
+ * Otherwise the contact will be updated by replacing the entire data set.
+ *
+ * @param array $properties this array if key-value-pairs defines a contact
+ * @param $address_book_key string to identify the address book in which the contact shall be created or updated
+ * @return array representing the contact just created or updated
+ */
+ public function createOrUpdate($properties, $address_book_key) {
+
+ if (!array_key_exists($address_book_key, $this->address_books))
+ return null;
+
+ $address_book = $this->address_books[$address_book_key];
+ if ($address_book->getPermissions() & \OCP\PERMISSION_CREATE)
+ return null;
+
+ return $address_book->createOrUpdate($properties);
+ }
+
+ /**
+ * Check if contacts are available (e.g. contacts app enabled)
+ *
+ * @return bool true if enabled, false if not
+ */
+ public function isEnabled() {
+ return !empty($this->address_books);
+ }
+
+ /**
+ * @param \OCP\IAddressBook $address_book
+ */
+ public function registerAddressBook(\OCP\IAddressBook $address_book) {
+ $this->address_books[$address_book->getKey()] = $address_book;
+ }
+
+ /**
+ * @param \OCP\IAddressBook $address_book
+ */
+ public function unregisterAddressBook(\OCP\IAddressBook $address_book) {
+ unset($this->address_books[$address_book->getKey()]);
+ }
+
+ /**
+ * @return array
+ */
+ public function getAddressBooks() {
+ $result = array();
+ foreach($this->address_books as $address_book) {
+ $result[$address_book->getKey()] = $address_book->getDisplayName();
+ }
+
+ return $result;
+ }
+
+ /**
+ * removes all registered address book instances
+ */
+ public function clear() {
+ $this->address_books = array();
+ }
+
+ /**
+ * @var \OCP\IAddressBook[] which holds all registered address books
+ */
+ private $address_books = array();
+
+ /**
+ * In order to improve lazy loading a closure can be registered which will be called in case
+ * address books are actually requested
+ *
+ * @param string $key
+ * @param \Closure $callable
+ */
+ function register($key, \Closure $callable)
+ {
+ //
+ //TODO: implement me
+ //
+ }
+ }
+}
diff --git a/lib/db.php b/lib/private/db.php
index 1e5d12649df..1e5d12649df 100644
--- a/lib/db.php
+++ b/lib/private/db.php
diff --git a/lib/db/adapter.php b/lib/private/db/adapter.php
index 6b31f37dd98..6b31f37dd98 100644
--- a/lib/db/adapter.php
+++ b/lib/private/db/adapter.php
diff --git a/lib/db/adapteroci8.php b/lib/private/db/adapteroci8.php
index bc226e979ec..bc226e979ec 100644
--- a/lib/db/adapteroci8.php
+++ b/lib/private/db/adapteroci8.php
diff --git a/lib/db/adapterpgsql.php b/lib/private/db/adapterpgsql.php
index 990d71c9f29..990d71c9f29 100644
--- a/lib/db/adapterpgsql.php
+++ b/lib/private/db/adapterpgsql.php
diff --git a/lib/db/adaptersqlite.php b/lib/private/db/adaptersqlite.php
index fa6d308ae32..fa6d308ae32 100644
--- a/lib/db/adaptersqlite.php
+++ b/lib/private/db/adaptersqlite.php
diff --git a/lib/db/adaptersqlsrv.php b/lib/private/db/adaptersqlsrv.php
index d0a67af28a7..d0a67af28a7 100644
--- a/lib/db/adaptersqlsrv.php
+++ b/lib/private/db/adaptersqlsrv.php
diff --git a/lib/db/connection.php b/lib/private/db/connection.php
index 2581969dbd0..2d3193a148a 100644
--- a/lib/db/connection.php
+++ b/lib/private/db/connection.php
@@ -12,7 +12,7 @@ use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Cache\QueryCacheProfile;
use Doctrine\Common\EventManager;
-class Connection extends \Doctrine\DBAL\Connection {
+class Connection extends \Doctrine\DBAL\Connection implements \OCP\IDBConnection {
/**
* @var string $tablePrefix
*/
diff --git a/lib/db/mdb2schemamanager.php b/lib/private/db/mdb2schemamanager.php
index 8e76f46c78f..8e76f46c78f 100644
--- a/lib/db/mdb2schemamanager.php
+++ b/lib/private/db/mdb2schemamanager.php
diff --git a/lib/db/mdb2schemareader.php b/lib/private/db/mdb2schemareader.php
index b7128a2f176..b7128a2f176 100644
--- a/lib/db/mdb2schemareader.php
+++ b/lib/private/db/mdb2schemareader.php
diff --git a/lib/db/mdb2schemawriter.php b/lib/private/db/mdb2schemawriter.php
index 21b43cbfe80..21b43cbfe80 100644
--- a/lib/db/mdb2schemawriter.php
+++ b/lib/private/db/mdb2schemawriter.php
diff --git a/lib/db/oracleconnection.php b/lib/private/db/oracleconnection.php
index e2fc4644f47..e2fc4644f47 100644
--- a/lib/db/oracleconnection.php
+++ b/lib/private/db/oracleconnection.php
diff --git a/lib/db/statementwrapper.php b/lib/private/db/statementwrapper.php
index b8da1afc0e5..b8da1afc0e5 100644
--- a/lib/db/statementwrapper.php
+++ b/lib/private/db/statementwrapper.php
diff --git a/lib/defaults.php b/lib/private/defaults.php
index 4951c6f50ae..4951c6f50ae 100644
--- a/lib/defaults.php
+++ b/lib/private/defaults.php
diff --git a/lib/eventsource.php b/lib/private/eventsource.php
index a83084d9251..a83084d9251 100644
--- a/lib/eventsource.php
+++ b/lib/private/eventsource.php
diff --git a/lib/filechunking.php b/lib/private/filechunking.php
index e6d69273a44..313a6ee87d2 100644
--- a/lib/filechunking.php
+++ b/lib/private/filechunking.php
@@ -29,7 +29,7 @@ class OC_FileChunking {
protected function getCache() {
if (!isset($this->cache)) {
- $this->cache = new OC_Cache_File();
+ $this->cache = new \OC\Cache\File();
}
return $this->cache;
}
diff --git a/lib/fileproxy.php b/lib/private/fileproxy.php
index 52ec79b4bdb..52ec79b4bdb 100644
--- a/lib/fileproxy.php
+++ b/lib/private/fileproxy.php
diff --git a/lib/fileproxy/fileoperations.php b/lib/private/fileproxy/fileoperations.php
index b2ff2e7e5e9..b2ff2e7e5e9 100644
--- a/lib/fileproxy/fileoperations.php
+++ b/lib/private/fileproxy/fileoperations.php
diff --git a/lib/files.php b/lib/private/files.php
index c705d2adb1a..c705d2adb1a 100644
--- a/lib/files.php
+++ b/lib/private/files.php
diff --git a/lib/files/cache/backgroundwatcher.php b/lib/private/files/cache/backgroundwatcher.php
index 923804f48d0..923804f48d0 100644
--- a/lib/files/cache/backgroundwatcher.php
+++ b/lib/private/files/cache/backgroundwatcher.php
diff --git a/lib/files/cache/cache.php b/lib/private/files/cache/cache.php
index 39e36684b7b..e69733727af 100644
--- a/lib/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -201,7 +201,6 @@ class Cache {
$data['path'] = $file;
$data['parent'] = $this->getParentId($file);
$data['name'] = \OC_Util::basename($file);
- $data['encrypted'] = isset($data['encrypted']) ? ((int)$data['encrypted']) : 0;
list($queryParts, $params) = $this->buildParts($data);
$queryParts[] = '`storage`';
@@ -265,6 +264,9 @@ class Cache {
$params[] = $value;
$queryParts[] = '`mtime`';
}
+ } elseif ($name === 'encrypted') {
+ // Boolean to integer conversion
+ $value = $value ? 1 : 0;
}
$params[] = $value;
$queryParts[] = '`' . $name . '`';
diff --git a/lib/files/cache/legacy.php b/lib/private/files/cache/legacy.php
index 8eed1f67a5d..8eed1f67a5d 100644
--- a/lib/files/cache/legacy.php
+++ b/lib/private/files/cache/legacy.php
diff --git a/lib/files/cache/permissions.php b/lib/private/files/cache/permissions.php
index 2e2bdb20b78..2e2bdb20b78 100644
--- a/lib/files/cache/permissions.php
+++ b/lib/private/files/cache/permissions.php
diff --git a/lib/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index dcc5d8c5581..96f84609cf2 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -36,6 +36,11 @@ class Scanner extends BasicEmitter {
*/
private $cache;
+ /**
+ * @var \OC\Files\Cache\Permissions $permissionsCache
+ */
+ private $permissionsCache;
+
const SCAN_RECURSIVE = true;
const SCAN_SHALLOW = false;
@@ -46,6 +51,7 @@ class Scanner extends BasicEmitter {
$this->storage = $storage;
$this->storageId = $this->storage->getId();
$this->cache = $storage->getCache();
+ $this->permissionsCache = $storage->getPermissionsCache();
}
/**
@@ -96,18 +102,42 @@ class Scanner extends BasicEmitter {
}
}
$newData = $data;
- if ($reuseExisting and $cacheData = $this->cache->get($file)) {
- // only reuse data if the file hasn't explicitly changed
- if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
- if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
- $data['size'] = $cacheData['size'];
+ $cacheData = $this->cache->get($file);
+ if ($cacheData) {
+ $this->permissionsCache->remove($cacheData['fileid']);
+ if ($reuseExisting) {
+ // prevent empty etag
+ $etag = $cacheData['etag'];
+ $propagateETagChange = false;
+ if (empty($etag)) {
+ $etag = $data['etag'];
+ $propagateETagChange = true;
}
- if ($reuseExisting & self::REUSE_ETAG) {
- $data['etag'] = $cacheData['etag'];
+ // only reuse data if the file hasn't explicitly changed
+ if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
+ if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
+ $data['size'] = $cacheData['size'];
+ }
+ if ($reuseExisting & self::REUSE_ETAG) {
+ $data['etag'] = $etag;
+ if ($propagateETagChange) {
+ $parent = $file;
+ while ($parent !== '') {
+ $parent = dirname($parent);
+ if ($parent === '.') {
+ $parent = '';
+ }
+ $parentCacheData = $this->cache->get($parent);
+ $this->cache->update($parentCacheData['fileid'], array(
+ 'etag' => $this->storage->getETag($parent),
+ ));
+ }
+ }
+ }
}
+ // Only update metadata that has changed
+ $newData = array_diff($data, $cacheData);
}
- // Only update metadata that has changed
- $newData = array_diff($data, $cacheData);
}
if (!empty($newData)) {
$this->cache->put($file, $newData);
@@ -161,7 +191,7 @@ class Scanner extends BasicEmitter {
$newChildren = array();
if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) {
\OC_DB::beginTransaction();
- if(is_resource($dh)) {
+ if (is_resource($dh)) {
while (($file = readdir($dh)) !== false) {
$child = ($path) ? $path . '/' . $file : $file;
if (!Filesystem::isIgnoredDir($file)) {
diff --git a/lib/files/cache/storage.php b/lib/private/files/cache/storage.php
index 8a9e47ca36d..8a9e47ca36d 100644
--- a/lib/files/cache/storage.php
+++ b/lib/private/files/cache/storage.php
diff --git a/lib/files/cache/updater.php b/lib/private/files/cache/updater.php
index 1f30173a8f8..1f30173a8f8 100644
--- a/lib/files/cache/updater.php
+++ b/lib/private/files/cache/updater.php
diff --git a/lib/files/cache/upgrade.php b/lib/private/files/cache/upgrade.php
index cfb9a117311..cfb9a117311 100644
--- a/lib/files/cache/upgrade.php
+++ b/lib/private/files/cache/upgrade.php
diff --git a/lib/files/cache/watcher.php b/lib/private/files/cache/watcher.php
index 8bfd4602f3a..8bfd4602f3a 100644
--- a/lib/files/cache/watcher.php
+++ b/lib/private/files/cache/watcher.php
diff --git a/lib/files/filesystem.php b/lib/private/files/filesystem.php
index 10ec5c41d11..10ec5c41d11 100644
--- a/lib/files/filesystem.php
+++ b/lib/private/files/filesystem.php
diff --git a/lib/files/mapper.php b/lib/private/files/mapper.php
index 47abd4e52fe..47abd4e52fe 100644
--- a/lib/files/mapper.php
+++ b/lib/private/files/mapper.php
diff --git a/lib/files/mount/manager.php b/lib/private/files/mount/manager.php
index 4c432dcf724..4c432dcf724 100644
--- a/lib/files/mount/manager.php
+++ b/lib/private/files/mount/manager.php
diff --git a/lib/files/mount/mount.php b/lib/private/files/mount/mount.php
index 0ce2f5975c7..0ce2f5975c7 100644
--- a/lib/files/mount/mount.php
+++ b/lib/private/files/mount/mount.php
diff --git a/lib/files/node/file.php b/lib/private/files/node/file.php
index 75d5e0166b6..75d5e0166b6 100644
--- a/lib/files/node/file.php
+++ b/lib/private/files/node/file.php
diff --git a/lib/files/node/folder.php b/lib/private/files/node/folder.php
index 923f53821b2..923f53821b2 100644
--- a/lib/files/node/folder.php
+++ b/lib/private/files/node/folder.php
diff --git a/lib/files/node/node.php b/lib/private/files/node/node.php
index 063e2424a64..063e2424a64 100644
--- a/lib/files/node/node.php
+++ b/lib/private/files/node/node.php
diff --git a/lib/files/node/nonexistingfile.php b/lib/private/files/node/nonexistingfile.php
index d45076f7fee..d45076f7fee 100644
--- a/lib/files/node/nonexistingfile.php
+++ b/lib/private/files/node/nonexistingfile.php
diff --git a/lib/files/node/nonexistingfolder.php b/lib/private/files/node/nonexistingfolder.php
index 0346cbf1e21..0346cbf1e21 100644
--- a/lib/files/node/nonexistingfolder.php
+++ b/lib/private/files/node/nonexistingfolder.php
diff --git a/lib/files/node/root.php b/lib/private/files/node/root.php
index e3d58476e9c..e3d58476e9c 100644
--- a/lib/files/node/root.php
+++ b/lib/private/files/node/root.php
diff --git a/lib/files/storage/common.php b/lib/private/files/storage/common.php
index a5b79f0e967..a5b79f0e967 100644
--- a/lib/files/storage/common.php
+++ b/lib/private/files/storage/common.php
diff --git a/lib/files/storage/commontest.php b/lib/private/files/storage/commontest.php
index c3f1eb31955..c3f1eb31955 100644
--- a/lib/files/storage/commontest.php
+++ b/lib/private/files/storage/commontest.php
diff --git a/lib/files/storage/loader.php b/lib/private/files/storage/loader.php
index 2572ef443bc..2572ef443bc 100644
--- a/lib/files/storage/loader.php
+++ b/lib/private/files/storage/loader.php
diff --git a/lib/files/storage/local.php b/lib/private/files/storage/local.php
index 5209fabc30a..5209fabc30a 100644
--- a/lib/files/storage/local.php
+++ b/lib/private/files/storage/local.php
diff --git a/lib/files/storage/mappedlocal.php b/lib/private/files/storage/mappedlocal.php
index ba5ac4191c5..ba5ac4191c5 100644
--- a/lib/files/storage/mappedlocal.php
+++ b/lib/private/files/storage/mappedlocal.php
diff --git a/lib/files/storage/storage.php b/lib/private/files/storage/storage.php
index b673bb9a32d..b673bb9a32d 100644
--- a/lib/files/storage/storage.php
+++ b/lib/private/files/storage/storage.php
diff --git a/lib/files/storage/temporary.php b/lib/private/files/storage/temporary.php
index d84dbda2e39..d84dbda2e39 100644
--- a/lib/files/storage/temporary.php
+++ b/lib/private/files/storage/temporary.php
diff --git a/lib/files/storage/wrapper/quota.php b/lib/private/files/storage/wrapper/quota.php
index e2da8cf2e05..e2da8cf2e05 100644
--- a/lib/files/storage/wrapper/quota.php
+++ b/lib/private/files/storage/wrapper/quota.php
diff --git a/lib/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index 0336c27efa1..0336c27efa1 100644
--- a/lib/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
diff --git a/lib/files/stream/close.php b/lib/private/files/stream/close.php
index 80de3497c36..80de3497c36 100644
--- a/lib/files/stream/close.php
+++ b/lib/private/files/stream/close.php
diff --git a/lib/files/stream/dir.php b/lib/private/files/stream/dir.php
index 6ca884fc994..6ca884fc994 100644
--- a/lib/files/stream/dir.php
+++ b/lib/private/files/stream/dir.php
diff --git a/lib/files/stream/oc.php b/lib/private/files/stream/oc.php
index 88e7e062df9..88e7e062df9 100644
--- a/lib/files/stream/oc.php
+++ b/lib/private/files/stream/oc.php
diff --git a/lib/files/stream/quota.php b/lib/private/files/stream/quota.php
index 53d8a03d30f..53d8a03d30f 100644
--- a/lib/files/stream/quota.php
+++ b/lib/private/files/stream/quota.php
diff --git a/lib/files/stream/staticstream.php b/lib/private/files/stream/staticstream.php
index 45b1a7a81f8..45b1a7a81f8 100644
--- a/lib/files/stream/staticstream.php
+++ b/lib/private/files/stream/staticstream.php
diff --git a/lib/files/type/detection.php b/lib/private/files/type/detection.php
index 242a81cb5a4..242a81cb5a4 100644
--- a/lib/files/type/detection.php
+++ b/lib/private/files/type/detection.php
diff --git a/lib/files/type/templatemanager.php b/lib/private/files/type/templatemanager.php
index cd1536d2732..cd1536d2732 100644
--- a/lib/files/type/templatemanager.php
+++ b/lib/private/files/type/templatemanager.php
diff --git a/lib/files/utils/scanner.php b/lib/private/files/utils/scanner.php
index 2cad7dd77bd..2cad7dd77bd 100644
--- a/lib/files/utils/scanner.php
+++ b/lib/private/files/utils/scanner.php
diff --git a/lib/files/view.php b/lib/private/files/view.php
index aa08a5f7cc9..aa08a5f7cc9 100644
--- a/lib/files/view.php
+++ b/lib/private/files/view.php
diff --git a/lib/geo.php b/lib/private/geo.php
index ed01ad0b616..ed01ad0b616 100644
--- a/lib/geo.php
+++ b/lib/private/geo.php
diff --git a/lib/group.php b/lib/private/group.php
index ba93dc129a1..ba93dc129a1 100644
--- a/lib/group.php
+++ b/lib/private/group.php
diff --git a/lib/group/backend.php b/lib/private/group/backend.php
index 2e17b5d0b7f..2e17b5d0b7f 100644
--- a/lib/group/backend.php
+++ b/lib/private/group/backend.php
diff --git a/lib/group/database.php b/lib/private/group/database.php
index d0974685ff6..d0974685ff6 100644
--- a/lib/group/database.php
+++ b/lib/private/group/database.php
diff --git a/lib/group/dummy.php b/lib/private/group/dummy.php
index 9516fd52ff8..9516fd52ff8 100644
--- a/lib/group/dummy.php
+++ b/lib/private/group/dummy.php
diff --git a/lib/group/example.php b/lib/private/group/example.php
index 3519b9ed92f..3519b9ed92f 100644
--- a/lib/group/example.php
+++ b/lib/private/group/example.php
diff --git a/lib/group/group.php b/lib/private/group/group.php
index bcd2419b309..bcd2419b309 100644
--- a/lib/group/group.php
+++ b/lib/private/group/group.php
diff --git a/lib/group/interface.php b/lib/private/group/interface.php
index 4ef3663837f..4ef3663837f 100644
--- a/lib/group/interface.php
+++ b/lib/private/group/interface.php
diff --git a/lib/group/manager.php b/lib/private/group/manager.php
index bf469d51d12..bf469d51d12 100644
--- a/lib/group/manager.php
+++ b/lib/private/group/manager.php
diff --git a/lib/helper.php b/lib/private/helper.php
index 66e7acb407a..66e7acb407a 100644
--- a/lib/helper.php
+++ b/lib/private/helper.php
diff --git a/lib/hintexception.php b/lib/private/hintexception.php
index 3934ae2a4c2..3934ae2a4c2 100644
--- a/lib/hintexception.php
+++ b/lib/private/hintexception.php
diff --git a/lib/hook.php b/lib/private/hook.php
index 8516cf0dcff..8516cf0dcff 100644
--- a/lib/hook.php
+++ b/lib/private/hook.php
diff --git a/lib/hooks/basicemitter.php b/lib/private/hooks/basicemitter.php
index 9ffe1af2314..9ffe1af2314 100644
--- a/lib/hooks/basicemitter.php
+++ b/lib/private/hooks/basicemitter.php
diff --git a/lib/hooks/emitter.php b/lib/private/hooks/emitter.php
index 8e9074bad67..8e9074bad67 100644
--- a/lib/hooks/emitter.php
+++ b/lib/private/hooks/emitter.php
diff --git a/lib/hooks/forwardingemitter.php b/lib/private/hooks/forwardingemitter.php
index 1aacc4012e0..1aacc4012e0 100644
--- a/lib/hooks/forwardingemitter.php
+++ b/lib/private/hooks/forwardingemitter.php
diff --git a/lib/hooks/legacyemitter.php b/lib/private/hooks/legacyemitter.php
index a2d16ace9a7..a2d16ace9a7 100644
--- a/lib/hooks/legacyemitter.php
+++ b/lib/private/hooks/legacyemitter.php
diff --git a/lib/hooks/publicemitter.php b/lib/private/hooks/publicemitter.php
index e2371713ac3..e2371713ac3 100644
--- a/lib/hooks/publicemitter.php
+++ b/lib/private/hooks/publicemitter.php
diff --git a/lib/image.php b/lib/private/image.php
index 7761a3c7737..7761a3c7737 100644
--- a/lib/image.php
+++ b/lib/private/image.php
diff --git a/lib/installer.php b/lib/private/installer.php
index e082c7eeee9..e082c7eeee9 100644
--- a/lib/installer.php
+++ b/lib/private/installer.php
diff --git a/lib/json.php b/lib/private/json.php
index 6ba0b13806b..6ba0b13806b 100644
--- a/lib/json.php
+++ b/lib/private/json.php
diff --git a/lib/l10n.php b/lib/private/l10n.php
index f93443b886a..f93443b886a 100644
--- a/lib/l10n.php
+++ b/lib/private/l10n.php
diff --git a/lib/l10n/ach.php b/lib/private/l10n/ach.php
index 406ff5f5a26..406ff5f5a26 100644
--- a/lib/l10n/ach.php
+++ b/lib/private/l10n/ach.php
diff --git a/lib/l10n/af_ZA.php b/lib/private/l10n/af_ZA.php
index d6bf5771e8d..d6bf5771e8d 100644
--- a/lib/l10n/af_ZA.php
+++ b/lib/private/l10n/af_ZA.php
diff --git a/lib/l10n/ar.php b/lib/private/l10n/ar.php
index f626dcdfda6..f626dcdfda6 100644
--- a/lib/l10n/ar.php
+++ b/lib/private/l10n/ar.php
diff --git a/lib/l10n/be.php b/lib/private/l10n/be.php
index 1570411eb86..1570411eb86 100644
--- a/lib/l10n/be.php
+++ b/lib/private/l10n/be.php
diff --git a/lib/l10n/bg_BG.php b/lib/private/l10n/bg_BG.php
index b6cc949eb8a..b6cc949eb8a 100644
--- a/lib/l10n/bg_BG.php
+++ b/lib/private/l10n/bg_BG.php
diff --git a/lib/l10n/bn_BD.php b/lib/private/l10n/bn_BD.php
index a42435a2a47..a42435a2a47 100644
--- a/lib/l10n/bn_BD.php
+++ b/lib/private/l10n/bn_BD.php
diff --git a/lib/l10n/bs.php b/lib/private/l10n/bs.php
index 3cb98906e62..3cb98906e62 100644
--- a/lib/l10n/bs.php
+++ b/lib/private/l10n/bs.php
diff --git a/lib/l10n/ca.php b/lib/private/l10n/ca.php
index a8769224705..a8769224705 100644
--- a/lib/l10n/ca.php
+++ b/lib/private/l10n/ca.php
diff --git a/lib/l10n/cs_CZ.php b/lib/private/l10n/cs_CZ.php
index ed31ae79529..ed31ae79529 100644
--- a/lib/l10n/cs_CZ.php
+++ b/lib/private/l10n/cs_CZ.php
diff --git a/lib/l10n/cy_GB.php b/lib/private/l10n/cy_GB.php
index 6973b51878f..6973b51878f 100644
--- a/lib/l10n/cy_GB.php
+++ b/lib/private/l10n/cy_GB.php
diff --git a/lib/l10n/da.php b/lib/private/l10n/da.php
index 26903142763..05a43f42ed9 100644
--- a/lib/l10n/da.php
+++ b/lib/private/l10n/da.php
@@ -8,6 +8,9 @@ $TRANSLATIONS = array(
"Users" => "Brugere",
"Admin" => "Admin",
"Failed to upgrade \"%s\"." => "Upgradering af \"%s\" fejlede",
+"Custom profile pictures don't work with encryption yet" => "Personligt profilbillede virker endnu ikke sammen med kryptering",
+"Unknown filetype" => "Ukendt filtype",
+"Invalid image" => "Ugyldigt billede",
"web services under your control" => "Webtjenester under din kontrol",
"cannot open \"%s\"" => "Kan ikke åbne \"%s\"",
"ZIP download is turned off." => "ZIP-download er slået fra.",
diff --git a/lib/l10n/de.php b/lib/private/l10n/de.php
index 87e7a67b47b..87e7a67b47b 100644
--- a/lib/l10n/de.php
+++ b/lib/private/l10n/de.php
diff --git a/lib/l10n/de_AT.php b/lib/private/l10n/de_AT.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/de_AT.php
+++ b/lib/private/l10n/de_AT.php
diff --git a/lib/l10n/de_CH.php b/lib/private/l10n/de_CH.php
index 33f3446a693..33f3446a693 100644
--- a/lib/l10n/de_CH.php
+++ b/lib/private/l10n/de_CH.php
diff --git a/lib/l10n/de_DE.php b/lib/private/l10n/de_DE.php
index 09be0eea22d..09be0eea22d 100644
--- a/lib/l10n/de_DE.php
+++ b/lib/private/l10n/de_DE.php
diff --git a/lib/l10n/el.php b/lib/private/l10n/el.php
index dcbf82d4a4b..dcbf82d4a4b 100644
--- a/lib/l10n/el.php
+++ b/lib/private/l10n/el.php
diff --git a/lib/l10n/en@pirate.php b/lib/private/l10n/en@pirate.php
index a8175b1400f..a8175b1400f 100644
--- a/lib/l10n/en@pirate.php
+++ b/lib/private/l10n/en@pirate.php
diff --git a/lib/l10n/en_GB.php b/lib/private/l10n/en_GB.php
index d02f553eda8..d02f553eda8 100644
--- a/lib/l10n/en_GB.php
+++ b/lib/private/l10n/en_GB.php
diff --git a/lib/l10n/eo.php b/lib/private/l10n/eo.php
index 5311dd6eb15..5311dd6eb15 100644
--- a/lib/l10n/eo.php
+++ b/lib/private/l10n/eo.php
diff --git a/lib/l10n/es.php b/lib/private/l10n/es.php
index 047d5d955bb..047d5d955bb 100644
--- a/lib/l10n/es.php
+++ b/lib/private/l10n/es.php
diff --git a/lib/l10n/es_AR.php b/lib/private/l10n/es_AR.php
index f637eb403ed..f637eb403ed 100644
--- a/lib/l10n/es_AR.php
+++ b/lib/private/l10n/es_AR.php
diff --git a/lib/l10n/es_MX.php b/lib/private/l10n/es_MX.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/es_MX.php
+++ b/lib/private/l10n/es_MX.php
diff --git a/lib/l10n/et_EE.php b/lib/private/l10n/et_EE.php
index 85dfaeb52d5..85dfaeb52d5 100644
--- a/lib/l10n/et_EE.php
+++ b/lib/private/l10n/et_EE.php
diff --git a/lib/l10n/eu.php b/lib/private/l10n/eu.php
index 413819f4f94..413819f4f94 100644
--- a/lib/l10n/eu.php
+++ b/lib/private/l10n/eu.php
diff --git a/lib/l10n/fa.php b/lib/private/l10n/fa.php
index e9cb695bade..e9cb695bade 100644
--- a/lib/l10n/fa.php
+++ b/lib/private/l10n/fa.php
diff --git a/lib/l10n/fi.php b/lib/private/l10n/fi.php
index ac1f80a8f73..ac1f80a8f73 100644
--- a/lib/l10n/fi.php
+++ b/lib/private/l10n/fi.php
diff --git a/lib/l10n/fi_FI.php b/lib/private/l10n/fi_FI.php
index 1d2bdab749c..1d2bdab749c 100644
--- a/lib/l10n/fi_FI.php
+++ b/lib/private/l10n/fi_FI.php
diff --git a/lib/l10n/fr.php b/lib/private/l10n/fr.php
index ab3d618849e..ab3d618849e 100644
--- a/lib/l10n/fr.php
+++ b/lib/private/l10n/fr.php
diff --git a/lib/l10n/gl.php b/lib/private/l10n/gl.php
index 406272d690f..406272d690f 100644
--- a/lib/l10n/gl.php
+++ b/lib/private/l10n/gl.php
diff --git a/lib/l10n/he.php b/lib/private/l10n/he.php
index ced6244ee91..ced6244ee91 100644
--- a/lib/l10n/he.php
+++ b/lib/private/l10n/he.php
diff --git a/lib/l10n/hi.php b/lib/private/l10n/hi.php
index 039dfa4465d..039dfa4465d 100644
--- a/lib/l10n/hi.php
+++ b/lib/private/l10n/hi.php
diff --git a/lib/l10n/hr.php b/lib/private/l10n/hr.php
index d217f924099..d217f924099 100644
--- a/lib/l10n/hr.php
+++ b/lib/private/l10n/hr.php
diff --git a/lib/l10n/hu_HU.php b/lib/private/l10n/hu_HU.php
index 7ec7621a655..e944291caee 100644
--- a/lib/l10n/hu_HU.php
+++ b/lib/private/l10n/hu_HU.php
@@ -1,11 +1,14 @@
<?php
$TRANSLATIONS = array(
+"No app name specified" => "Nincs az alkalmazás név megadva.",
"Help" => "Súgó",
"Personal" => "Személyes",
"Settings" => "Beállítások",
"Users" => "Felhasználók",
"Admin" => "Adminsztráció",
"Failed to upgrade \"%s\"." => "Sikertelen Frissítés \"%s\".",
+"Unknown filetype" => "Ismeretlen file tipús",
+"Invalid image" => "Hibás kép",
"web services under your control" => "webszolgáltatások saját kézben",
"cannot open \"%s\"" => "nem sikerült megnyitni \"%s\"",
"ZIP download is turned off." => "A ZIP-letöltés nincs engedélyezve.",
@@ -13,6 +16,10 @@ $TRANSLATIONS = array(
"Back to Files" => "Vissza a Fájlokhoz",
"Selected files too large to generate zip file." => "A kiválasztott fájlok túl nagyok a zip tömörítéshez.",
"Download the files in smaller chunks, seperately or kindly ask your administrator." => "Tölts le a fileokat kisebb chunkokban, kölün vagy kérj segitséget a rendszergazdádtól.",
+"App does not provide an info.xml file" => "Az alkalmazás nem szolgáltatott info.xml file-t",
+"App can't be installed because it is not compatible with this version of ownCloud" => "Az alalmazás nem telepíthető, mert nem kompatibilis az ownClod ezzel a verziójával.",
+"App directory already exists" => "Az alkalmazás mappája már létezik",
+"Can't create app folder. Please fix permissions. %s" => "Nem lehetett létrehozni az alkalmzás mappáját. Kérlek ellenőrizd a jogosultásgokat. %s",
"Application is not enabled" => "Az alkalmazás nincs engedélyezve",
"Authentication error" => "Azonosítási hiba",
"Token expired. Please reload page." => "A token lejárt. Frissítse az oldalt.",
@@ -39,6 +46,7 @@ $TRANSLATIONS = array(
"Set an admin password." => "Állítson be egy jelszót az adminisztrációhoz.",
"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Az Ön webkiszolgálója nincs megfelelően beállítva az állományok szinkronizálásához, mert a WebDAV-elérés úgy tűnik, nem működik.",
"Please double check the <a href='%s'>installation guides</a>." => "Kérjük tüzetesen tanulmányozza át a <a href='%s'>telepítési útmutatót</a>.",
+"Could not find category \"%s\"" => "Ez a kategória nem található: \"%s\"",
"seconds ago" => "pár másodperce",
"_%n minute ago_::_%n minutes ago_" => array("",""),
"_%n hour ago_::_%n hours ago_" => array("",""),
@@ -49,7 +57,6 @@ $TRANSLATIONS = array(
"_%n month ago_::_%n months ago_" => array("",""),
"last year" => "tavaly",
"years ago" => "több éve",
-"Caused by:" => "Okozta:",
-"Could not find category \"%s\"" => "Ez a kategória nem található: \"%s\""
+"Caused by:" => "Okozta:"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/lib/l10n/hy.php b/lib/private/l10n/hy.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/hy.php
+++ b/lib/private/l10n/hy.php
diff --git a/lib/l10n/ia.php b/lib/private/l10n/ia.php
index 34f43bc424a..34f43bc424a 100644
--- a/lib/l10n/ia.php
+++ b/lib/private/l10n/ia.php
diff --git a/lib/l10n/id.php b/lib/private/l10n/id.php
index 080faddb321..080faddb321 100644
--- a/lib/l10n/id.php
+++ b/lib/private/l10n/id.php
diff --git a/lib/l10n/is.php b/lib/private/l10n/is.php
index 7512d278fb8..7512d278fb8 100644
--- a/lib/l10n/is.php
+++ b/lib/private/l10n/is.php
diff --git a/lib/l10n/it.php b/lib/private/l10n/it.php
index b00789bc86f..b00789bc86f 100644
--- a/lib/l10n/it.php
+++ b/lib/private/l10n/it.php
diff --git a/lib/l10n/ja_JP.php b/lib/private/l10n/ja_JP.php
index b9e6a0e6924..b9e6a0e6924 100644
--- a/lib/l10n/ja_JP.php
+++ b/lib/private/l10n/ja_JP.php
diff --git a/lib/l10n/ka.php b/lib/private/l10n/ka.php
index 04fefe8bdf1..04fefe8bdf1 100644
--- a/lib/l10n/ka.php
+++ b/lib/private/l10n/ka.php
diff --git a/lib/l10n/ka_GE.php b/lib/private/l10n/ka_GE.php
index 8fbe34e6786..8fbe34e6786 100644
--- a/lib/l10n/ka_GE.php
+++ b/lib/private/l10n/ka_GE.php
diff --git a/lib/l10n/km.php b/lib/private/l10n/km.php
index e7b09649a24..e7b09649a24 100644
--- a/lib/l10n/km.php
+++ b/lib/private/l10n/km.php
diff --git a/lib/l10n/kn.php b/lib/private/l10n/kn.php
index e7b09649a24..e7b09649a24 100644
--- a/lib/l10n/kn.php
+++ b/lib/private/l10n/kn.php
diff --git a/lib/l10n/ko.php b/lib/private/l10n/ko.php
index eec5be65abd..3ef39fefa60 100644
--- a/lib/l10n/ko.php
+++ b/lib/private/l10n/ko.php
@@ -8,12 +8,16 @@ $TRANSLATIONS = array(
"Users" => "사용자",
"Admin" => "관리자",
"Failed to upgrade \"%s\"." => "\"%s\" 업그레이드에 실패했습니다.",
+"Custom profile pictures don't work with encryption yet" => "개개인의 프로필 사진은 아직은 암호화 되지 않습니다",
+"Unknown filetype" => "알수없는 파일형식",
+"Invalid image" => "잘못된 그림",
"web services under your control" => "내가 관리하는 웹 서비스",
"cannot open \"%s\"" => "\"%s\"을(를) 열 수 없습니다.",
"ZIP download is turned off." => "ZIP 다운로드가 비활성화되었습니다.",
"Files need to be downloaded one by one." => "파일을 개별적으로 다운로드해야 합니다.",
"Back to Files" => "파일로 돌아가기",
"Selected files too large to generate zip file." => "선택한 파일들은 ZIP 파일을 생성하기에 너무 큽니다.",
+"Download the files in smaller chunks, seperately or kindly ask your administrator." => "작은 조각들 안에 들어있는 파일들을 받고자 하신다면, 나누어서 받으시거나 혹은 시스템 관리자에게 정중하게 물어보십시오",
"No source specified when installing app" => "앱을 설치할 때 소스가 지정되지 않았습니다.",
"No href specified when installing app from http" => "http에서 앱을 설치할 대 href가 지정되지 않았습니다.",
"No path specified when installing app from local file" => "로컬 파일에서 앱을 설치할 때 경로가 지정되지 않았습니다.",
@@ -52,6 +56,7 @@ $TRANSLATIONS = array(
"Set an admin password." => "관리자 비밀번호 설정",
"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "WebDAV 인터페이스가 제대로 작동하지 않습니다. 웹 서버에서 파일 동기화를 사용할 수 있도록 설정이 제대로 되지 않은 것 같습니다.",
"Please double check the <a href='%s'>installation guides</a>." => "<a href='%s'>설치 가이드</a>를 다시 한 번 확인하십시오.",
+"Could not find category \"%s\"" => "분류 \"%s\"을(를) 찾을 수 없습니다.",
"seconds ago" => "초 전",
"_%n minute ago_::_%n minutes ago_" => array("%n분 전 "),
"_%n hour ago_::_%n hours ago_" => array("%n시간 전 "),
@@ -62,7 +67,6 @@ $TRANSLATIONS = array(
"_%n month ago_::_%n months ago_" => array("%n달 전 "),
"last year" => "작년",
"years ago" => "년 전",
-"Caused by:" => "원인: ",
-"Could not find category \"%s\"" => "분류 \"%s\"을(를) 찾을 수 없습니다."
+"Caused by:" => "원인: "
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/lib/l10n/ku_IQ.php b/lib/private/l10n/ku_IQ.php
index c99f9dd2a12..c99f9dd2a12 100644
--- a/lib/l10n/ku_IQ.php
+++ b/lib/private/l10n/ku_IQ.php
diff --git a/lib/l10n/lb.php b/lib/private/l10n/lb.php
index c25f5b55bd5..c25f5b55bd5 100644
--- a/lib/l10n/lb.php
+++ b/lib/private/l10n/lb.php
diff --git a/lib/l10n/lt_LT.php b/lib/private/l10n/lt_LT.php
index db8d96c1018..db8d96c1018 100644
--- a/lib/l10n/lt_LT.php
+++ b/lib/private/l10n/lt_LT.php
diff --git a/lib/l10n/lv.php b/lib/private/l10n/lv.php
index 4090a36edcc..4090a36edcc 100644
--- a/lib/l10n/lv.php
+++ b/lib/private/l10n/lv.php
diff --git a/lib/l10n/mk.php b/lib/private/l10n/mk.php
index 69d4a1cb694..69d4a1cb694 100644
--- a/lib/l10n/mk.php
+++ b/lib/private/l10n/mk.php
diff --git a/lib/l10n/ml_IN.php b/lib/private/l10n/ml_IN.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/ml_IN.php
+++ b/lib/private/l10n/ml_IN.php
diff --git a/lib/l10n/ms_MY.php b/lib/private/l10n/ms_MY.php
index 17ef07f83dd..17ef07f83dd 100644
--- a/lib/l10n/ms_MY.php
+++ b/lib/private/l10n/ms_MY.php
diff --git a/lib/l10n/my_MM.php b/lib/private/l10n/my_MM.php
index 5f4b6ddc820..5f4b6ddc820 100644
--- a/lib/l10n/my_MM.php
+++ b/lib/private/l10n/my_MM.php
diff --git a/lib/l10n/nb_NO.php b/lib/private/l10n/nb_NO.php
index 8e7d095d369..8e7d095d369 100644
--- a/lib/l10n/nb_NO.php
+++ b/lib/private/l10n/nb_NO.php
diff --git a/lib/l10n/ne.php b/lib/private/l10n/ne.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/ne.php
+++ b/lib/private/l10n/ne.php
diff --git a/lib/l10n/nl.php b/lib/private/l10n/nl.php
index 20374f1f0f8..20374f1f0f8 100644
--- a/lib/l10n/nl.php
+++ b/lib/private/l10n/nl.php
diff --git a/lib/l10n/nn_NO.php b/lib/private/l10n/nn_NO.php
index d5da8c64415..e8bf8dfdef4 100644
--- a/lib/l10n/nn_NO.php
+++ b/lib/private/l10n/nn_NO.php
@@ -5,6 +5,8 @@ $TRANSLATIONS = array(
"Settings" => "Innstillingar",
"Users" => "Brukarar",
"Admin" => "Administrer",
+"Unknown filetype" => "Ukjend filtype",
+"Invalid image" => "Ugyldig bilete",
"web services under your control" => "Vev tjenester under din kontroll",
"Authentication error" => "Feil i autentisering",
"Files" => "Filer",
diff --git a/lib/l10n/nqo.php b/lib/private/l10n/nqo.php
index e7b09649a24..e7b09649a24 100644
--- a/lib/l10n/nqo.php
+++ b/lib/private/l10n/nqo.php
diff --git a/lib/l10n/oc.php b/lib/private/l10n/oc.php
index 40a527cc76c..40a527cc76c 100644
--- a/lib/l10n/oc.php
+++ b/lib/private/l10n/oc.php
diff --git a/lib/l10n/pa.php b/lib/private/l10n/pa.php
index 069fea6e710..069fea6e710 100644
--- a/lib/l10n/pa.php
+++ b/lib/private/l10n/pa.php
diff --git a/lib/l10n/pl.php b/lib/private/l10n/pl.php
index 4acd735d692..270559b4e50 100644
--- a/lib/l10n/pl.php
+++ b/lib/private/l10n/pl.php
@@ -8,6 +8,9 @@ $TRANSLATIONS = array(
"Users" => "Użytkownicy",
"Admin" => "Administrator",
"Failed to upgrade \"%s\"." => "Błąd przy aktualizacji \"%s\".",
+"Custom profile pictures don't work with encryption yet" => "Domyślny profil zdjęć nie działa z szyfrowaniem jeszcze",
+"Unknown filetype" => "Nieznany typ pliku",
+"Invalid image" => "Błędne zdjęcie",
"web services under your control" => "Kontrolowane serwisy",
"cannot open \"%s\"" => "Nie można otworzyć \"%s\"",
"ZIP download is turned off." => "Pobieranie ZIP jest wyłączone.",
@@ -53,6 +56,7 @@ $TRANSLATIONS = array(
"Set an admin password." => "Ustaw hasło administratora.",
"Your web server is not yet properly setup to allow files synchronization because the WebDAV interface seems to be broken." => "Serwer internetowy nie jest jeszcze poprawnie skonfigurowany, aby umożliwić synchronizację plików, ponieważ interfejs WebDAV wydaje się być uszkodzony.",
"Please double check the <a href='%s'>installation guides</a>." => "Sprawdź ponownie <a href='%s'>przewodniki instalacji</a>.",
+"Could not find category \"%s\"" => "Nie można odnaleźć kategorii \"%s\"",
"seconds ago" => "sekund temu",
"_%n minute ago_::_%n minutes ago_" => array("%n minute temu","%n minut temu","%n minut temu"),
"_%n hour ago_::_%n hours ago_" => array("%n godzinę temu","%n godzin temu","%n godzin temu"),
@@ -63,7 +67,6 @@ $TRANSLATIONS = array(
"_%n month ago_::_%n months ago_" => array("%n miesiąc temu","%n miesięcy temu","%n miesięcy temu"),
"last year" => "w zeszłym roku",
"years ago" => "lat temu",
-"Caused by:" => "Spowodowane przez:",
-"Could not find category \"%s\"" => "Nie można odnaleźć kategorii \"%s\""
+"Caused by:" => "Spowodowane przez:"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/lib/l10n/pl_PL.php b/lib/private/l10n/pl_PL.php
index 5494e3dab25..5494e3dab25 100644
--- a/lib/l10n/pl_PL.php
+++ b/lib/private/l10n/pl_PL.php
diff --git a/lib/l10n/pt_BR.php b/lib/private/l10n/pt_BR.php
index 7a580799701..7a580799701 100644
--- a/lib/l10n/pt_BR.php
+++ b/lib/private/l10n/pt_BR.php
diff --git a/lib/l10n/pt_PT.php b/lib/private/l10n/pt_PT.php
index 6e2bcba7b10..6e2bcba7b10 100644
--- a/lib/l10n/pt_PT.php
+++ b/lib/private/l10n/pt_PT.php
diff --git a/lib/l10n/ro.php b/lib/private/l10n/ro.php
index 76dafcd03e0..76dafcd03e0 100644
--- a/lib/l10n/ro.php
+++ b/lib/private/l10n/ro.php
diff --git a/lib/l10n/ru.php b/lib/private/l10n/ru.php
index 501065f8b5f..501065f8b5f 100644
--- a/lib/l10n/ru.php
+++ b/lib/private/l10n/ru.php
diff --git a/lib/l10n/si_LK.php b/lib/private/l10n/si_LK.php
index d10804cae69..d10804cae69 100644
--- a/lib/l10n/si_LK.php
+++ b/lib/private/l10n/si_LK.php
diff --git a/lib/l10n/sk.php b/lib/private/l10n/sk.php
index 54812b15a6f..54812b15a6f 100644
--- a/lib/l10n/sk.php
+++ b/lib/private/l10n/sk.php
diff --git a/lib/l10n/sk_SK.php b/lib/private/l10n/sk_SK.php
index 13487b039d6..13487b039d6 100644
--- a/lib/l10n/sk_SK.php
+++ b/lib/private/l10n/sk_SK.php
diff --git a/lib/l10n/sl.php b/lib/private/l10n/sl.php
index 5722191aedf..5722191aedf 100644
--- a/lib/l10n/sl.php
+++ b/lib/private/l10n/sl.php
diff --git a/lib/l10n/sq.php b/lib/private/l10n/sq.php
index edaa1df2b86..edaa1df2b86 100644
--- a/lib/l10n/sq.php
+++ b/lib/private/l10n/sq.php
diff --git a/lib/l10n/sr.php b/lib/private/l10n/sr.php
index 9441d0578fc..9441d0578fc 100644
--- a/lib/l10n/sr.php
+++ b/lib/private/l10n/sr.php
diff --git a/lib/l10n/sr@latin.php b/lib/private/l10n/sr@latin.php
index d8fa9289221..d8fa9289221 100644
--- a/lib/l10n/sr@latin.php
+++ b/lib/private/l10n/sr@latin.php
diff --git a/lib/l10n/string.php b/lib/private/l10n/string.php
index 88c85b32e70..88c85b32e70 100644
--- a/lib/l10n/string.php
+++ b/lib/private/l10n/string.php
diff --git a/lib/l10n/sv.php b/lib/private/l10n/sv.php
index e7c3420a85b..e7c3420a85b 100644
--- a/lib/l10n/sv.php
+++ b/lib/private/l10n/sv.php
diff --git a/lib/l10n/sw_KE.php b/lib/private/l10n/sw_KE.php
index 15f78e0bce6..15f78e0bce6 100644
--- a/lib/l10n/sw_KE.php
+++ b/lib/private/l10n/sw_KE.php
diff --git a/lib/l10n/ta_LK.php b/lib/private/l10n/ta_LK.php
index e70e65845be..e70e65845be 100644
--- a/lib/l10n/ta_LK.php
+++ b/lib/private/l10n/ta_LK.php
diff --git a/lib/l10n/te.php b/lib/private/l10n/te.php
index 524ea0c6024..524ea0c6024 100644
--- a/lib/l10n/te.php
+++ b/lib/private/l10n/te.php
diff --git a/lib/l10n/th_TH.php b/lib/private/l10n/th_TH.php
index 3344d0bb18e..3344d0bb18e 100644
--- a/lib/l10n/th_TH.php
+++ b/lib/private/l10n/th_TH.php
diff --git a/lib/l10n/tr.php b/lib/private/l10n/tr.php
index b63c37c7240..b63c37c7240 100644
--- a/lib/l10n/tr.php
+++ b/lib/private/l10n/tr.php
diff --git a/lib/l10n/ug.php b/lib/private/l10n/ug.php
index e2cf38ecc8c..e2cf38ecc8c 100644
--- a/lib/l10n/ug.php
+++ b/lib/private/l10n/ug.php
diff --git a/lib/l10n/uk.php b/lib/private/l10n/uk.php
index c1513c5bb79..c1513c5bb79 100644
--- a/lib/l10n/uk.php
+++ b/lib/private/l10n/uk.php
diff --git a/lib/l10n/ur_PK.php b/lib/private/l10n/ur_PK.php
index 7dc967ccd93..7dc967ccd93 100644
--- a/lib/l10n/ur_PK.php
+++ b/lib/private/l10n/ur_PK.php
diff --git a/lib/l10n/vi.php b/lib/private/l10n/vi.php
index dc0045c35ca..dc0045c35ca 100644
--- a/lib/l10n/vi.php
+++ b/lib/private/l10n/vi.php
diff --git a/lib/l10n/zh_CN.php b/lib/private/l10n/zh_CN.php
index 2c34356ea10..2c34356ea10 100644
--- a/lib/l10n/zh_CN.php
+++ b/lib/private/l10n/zh_CN.php
diff --git a/lib/l10n/zh_HK.php b/lib/private/l10n/zh_HK.php
index ca3e6d504e7..ca3e6d504e7 100644
--- a/lib/l10n/zh_HK.php
+++ b/lib/private/l10n/zh_HK.php
diff --git a/lib/l10n/zh_TW.php b/lib/private/l10n/zh_TW.php
index 210c766aa59..210c766aa59 100644
--- a/lib/l10n/zh_TW.php
+++ b/lib/private/l10n/zh_TW.php
diff --git a/lib/private/legacy/cache.php b/lib/private/legacy/cache.php
new file mode 100644
index 00000000000..f915eb516b1
--- /dev/null
+++ b/lib/private/legacy/cache.php
@@ -0,0 +1,10 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class OC_Cache extends \OC\Cache {
+} \ No newline at end of file
diff --git a/lib/legacy/config.php b/lib/private/legacy/config.php
index 7e498013737..7e498013737 100644
--- a/lib/legacy/config.php
+++ b/lib/private/legacy/config.php
diff --git a/lib/legacy/filesystem.php b/lib/private/legacy/filesystem.php
index 34f92b357ca..34f92b357ca 100644
--- a/lib/legacy/filesystem.php
+++ b/lib/private/legacy/filesystem.php
diff --git a/lib/legacy/filesystemview.php b/lib/private/legacy/filesystemview.php
index d6bca62e06a..d6bca62e06a 100644
--- a/lib/legacy/filesystemview.php
+++ b/lib/private/legacy/filesystemview.php
diff --git a/lib/legacy/log.php b/lib/private/legacy/log.php
index 027cb89e97c..027cb89e97c 100644
--- a/lib/legacy/log.php
+++ b/lib/private/legacy/log.php
diff --git a/lib/legacy/preferences.php b/lib/private/legacy/preferences.php
index a663db7598b..a663db7598b 100644
--- a/lib/legacy/preferences.php
+++ b/lib/private/legacy/preferences.php
diff --git a/lib/legacy/updater.php b/lib/private/legacy/updater.php
index eea7bb129cf..eea7bb129cf 100644
--- a/lib/legacy/updater.php
+++ b/lib/private/legacy/updater.php
diff --git a/lib/log.php b/lib/private/log.php
index e0b9fe3c696..e0b9fe3c696 100644
--- a/lib/log.php
+++ b/lib/private/log.php
diff --git a/lib/log/errorhandler.php b/lib/private/log/errorhandler.php
index 69cb960de91..69cb960de91 100644
--- a/lib/log/errorhandler.php
+++ b/lib/private/log/errorhandler.php
diff --git a/lib/log/owncloud.php b/lib/private/log/owncloud.php
index d16b9537a16..d16b9537a16 100644
--- a/lib/log/owncloud.php
+++ b/lib/private/log/owncloud.php
diff --git a/lib/log/rotate.php b/lib/private/log/rotate.php
index bf23ad588b3..bf23ad588b3 100644
--- a/lib/log/rotate.php
+++ b/lib/private/log/rotate.php
diff --git a/lib/log/syslog.php b/lib/private/log/syslog.php
index c98deab7109..c98deab7109 100644
--- a/lib/log/syslog.php
+++ b/lib/private/log/syslog.php
diff --git a/lib/mail.php b/lib/private/mail.php
index b339b33e962..b339b33e962 100644
--- a/lib/mail.php
+++ b/lib/private/mail.php
diff --git a/lib/memcache/apc.php b/lib/private/memcache/apc.php
index 575ee4427db..575ee4427db 100644
--- a/lib/memcache/apc.php
+++ b/lib/private/memcache/apc.php
diff --git a/lib/memcache/apcu.php b/lib/private/memcache/apcu.php
index ccc1aa6e562..ccc1aa6e562 100644
--- a/lib/memcache/apcu.php
+++ b/lib/private/memcache/apcu.php
diff --git a/lib/memcache/cache.php b/lib/private/memcache/cache.php
index 0ad1cc7ec03..0ad1cc7ec03 100644
--- a/lib/memcache/cache.php
+++ b/lib/private/memcache/cache.php
diff --git a/lib/memcache/factory.php b/lib/private/memcache/factory.php
index fde7d947567..fde7d947567 100644
--- a/lib/memcache/factory.php
+++ b/lib/private/memcache/factory.php
diff --git a/lib/memcache/memcached.php b/lib/private/memcache/memcached.php
index 978e6c2eff1..978e6c2eff1 100644
--- a/lib/memcache/memcached.php
+++ b/lib/private/memcache/memcached.php
diff --git a/lib/memcache/xcache.php b/lib/private/memcache/xcache.php
index 33de30562f9..33de30562f9 100644
--- a/lib/memcache/xcache.php
+++ b/lib/private/memcache/xcache.php
diff --git a/lib/migrate.php b/lib/private/migrate.php
index 0b319177400..0b319177400 100644
--- a/lib/migrate.php
+++ b/lib/private/migrate.php
diff --git a/lib/migration/content.php b/lib/private/migration/content.php
index 4413d722731..4413d722731 100644
--- a/lib/migration/content.php
+++ b/lib/private/migration/content.php
diff --git a/lib/migration/provider.php b/lib/private/migration/provider.php
index 234ab3351f3..234ab3351f3 100644
--- a/lib/migration/provider.php
+++ b/lib/private/migration/provider.php
diff --git a/lib/mimetypes.list.php b/lib/private/mimetypes.list.php
index 8ab8ac81bd8..8ab8ac81bd8 100644
--- a/lib/mimetypes.list.php
+++ b/lib/private/mimetypes.list.php
diff --git a/lib/minimizer.php b/lib/private/minimizer.php
index db522de74dc..db522de74dc 100644
--- a/lib/minimizer.php
+++ b/lib/private/minimizer.php
diff --git a/lib/minimizer/css.php b/lib/private/minimizer/css.php
index 8d130572e2b..8d130572e2b 100644
--- a/lib/minimizer/css.php
+++ b/lib/private/minimizer/css.php
diff --git a/lib/minimizer/js.php b/lib/private/minimizer/js.php
index bd2d836deb0..bd2d836deb0 100644
--- a/lib/minimizer/js.php
+++ b/lib/private/minimizer/js.php
diff --git a/lib/private/navigationmanager.php b/lib/private/navigationmanager.php
new file mode 100644
index 00000000000..1f657b9ad80
--- /dev/null
+++ b/lib/private/navigationmanager.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OC;
+
+/**
+ * Manages the ownCloud navigation
+ */
+class NavigationManager implements \OCP\INavigationManager {
+ protected $entries = array();
+ protected $activeEntry;
+
+ /**
+ * Creates a new navigation entry
+ * @param array $entry containing: id, name, order, icon and href key
+ */
+ public function add(array $entry) {
+ $entry['active'] = false;
+ if(!isset($entry['icon'])) {
+ $entry['icon'] = '';
+ }
+ $this->entries[] = $entry;
+ }
+
+ /**
+ * @brief returns all the added Menu entries
+ * @return array of the added entries
+ */
+ public function getAll() {
+ return $this->entries;
+ }
+
+ /**
+ * @brief removes all the entries
+ */
+ public function clear() {
+ $this->entries = array();
+ }
+
+ /**
+ * Sets the current navigation entry of the currently running app
+ * @param string $id of the app entry to activate (from added $entry)
+ */
+ public function setActiveEntry($id) {
+ $this->activeEntry = $id;
+ }
+
+ /**
+ * @brief gets the active Menu entry
+ * @return string id or empty string
+ *
+ * This function returns the id of the active navigation entry (set by
+ * setActiveEntry
+ */
+ public function getActiveEntry() {
+ return $this->activeEntry;
+ }
+}
diff --git a/lib/notsquareexception.php b/lib/private/notsquareexception.php
index 03dba8fb25f..03dba8fb25f 100644
--- a/lib/notsquareexception.php
+++ b/lib/private/notsquareexception.php
diff --git a/lib/ocs.php b/lib/private/ocs.php
index 93e8931ce2e..93e8931ce2e 100644
--- a/lib/ocs.php
+++ b/lib/private/ocs.php
diff --git a/lib/ocs/cloud.php b/lib/private/ocs/cloud.php
index 2dd99319057..2dd99319057 100644
--- a/lib/ocs/cloud.php
+++ b/lib/private/ocs/cloud.php
diff --git a/lib/ocs/config.php b/lib/private/ocs/config.php
index f19121f4b2b..f19121f4b2b 100644
--- a/lib/ocs/config.php
+++ b/lib/private/ocs/config.php
diff --git a/lib/ocs/person.php b/lib/private/ocs/person.php
index 1c8210d0825..1c8210d0825 100644
--- a/lib/ocs/person.php
+++ b/lib/private/ocs/person.php
diff --git a/lib/ocs/privatedata.php b/lib/private/ocs/privatedata.php
index 4dfd0a6e66e..4dfd0a6e66e 100644
--- a/lib/ocs/privatedata.php
+++ b/lib/private/ocs/privatedata.php
diff --git a/lib/ocs/result.php b/lib/private/ocs/result.php
index 84f06fa01c7..84f06fa01c7 100644
--- a/lib/ocs/result.php
+++ b/lib/private/ocs/result.php
diff --git a/lib/ocsclient.php b/lib/private/ocsclient.php
index 58636f806be..e35556d92b8 100644
--- a/lib/ocsclient.php
+++ b/lib/private/ocsclient.php
@@ -36,7 +36,12 @@ class OC_OCSClient{
* to set it in the config file or it will fallback to the default
*/
private static function getAppStoreURL() {
- $url = OC_Config::getValue('appstoreurl', 'http://api.apps.owncloud.com/v1');
+ if(OC_Util::getEditionString()===''){
+ $default='http://api.apps.owncloud.com/v1';
+ }else{
+ $default='';
+ }
+ $url = OC_Config::getValue('appstoreurl', $default);
return($url);
}
diff --git a/lib/preferences.php b/lib/private/preferences.php
index 359d9a83589..359d9a83589 100644
--- a/lib/preferences.php
+++ b/lib/private/preferences.php
diff --git a/lib/preview.php b/lib/private/preview.php
index b40ba191fba..266f7795f12 100755
--- a/lib/preview.php
+++ b/lib/private/preview.php
@@ -42,6 +42,9 @@ class Preview {
private $scalingup;
//preview images object
+ /**
+ * @var \OC_Image
+ */
private $preview;
//preview providers
@@ -624,4 +627,4 @@ class Preview {
}
return false;
}
-} \ No newline at end of file
+}
diff --git a/lib/preview/image.php b/lib/private/preview/image.php
index 9aec967282d..9aec967282d 100644
--- a/lib/preview/image.php
+++ b/lib/private/preview/image.php
diff --git a/lib/preview/movies.php b/lib/private/preview/movies.php
index c318137ff0e..c318137ff0e 100644
--- a/lib/preview/movies.php
+++ b/lib/private/preview/movies.php
diff --git a/lib/preview/mp3.php b/lib/private/preview/mp3.php
index 1eed566315c..1eed566315c 100644
--- a/lib/preview/mp3.php
+++ b/lib/private/preview/mp3.php
diff --git a/lib/preview/office-cl.php b/lib/private/preview/office-cl.php
index 112909d6523..112909d6523 100644
--- a/lib/preview/office-cl.php
+++ b/lib/private/preview/office-cl.php
diff --git a/lib/preview/office-fallback.php b/lib/private/preview/office-fallback.php
index e69ab0ab8cb..e69ab0ab8cb 100644
--- a/lib/preview/office-fallback.php
+++ b/lib/private/preview/office-fallback.php
diff --git a/lib/preview/office.php b/lib/private/preview/office.php
index 5287bbd6ac1..5287bbd6ac1 100644
--- a/lib/preview/office.php
+++ b/lib/private/preview/office.php
diff --git a/lib/preview/pdf.php b/lib/private/preview/pdf.php
index cc974b68818..cc974b68818 100644
--- a/lib/preview/pdf.php
+++ b/lib/private/preview/pdf.php
diff --git a/lib/preview/provider.php b/lib/private/preview/provider.php
index e4a730bafc8..e4a730bafc8 100644
--- a/lib/preview/provider.php
+++ b/lib/private/preview/provider.php
diff --git a/lib/preview/svg.php b/lib/private/preview/svg.php
index b49e51720fa..b49e51720fa 100644
--- a/lib/preview/svg.php
+++ b/lib/private/preview/svg.php
diff --git a/lib/preview/txt.php b/lib/private/preview/txt.php
index a487330691e..77e728eb364 100644
--- a/lib/preview/txt.php
+++ b/lib/private/preview/txt.php
@@ -9,11 +9,21 @@ namespace OC\Preview;
class TXT extends Provider {
+ private static $blacklist = array(
+ 'text/calendar',
+ 'text/vcard',
+ );
+
public function getMimeType() {
return '/text\/.*/';
}
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
+ $mimetype = $fileview->getMimeType($path);
+ if(in_array($mimetype, self::$blacklist)) {
+ return false;
+ }
+
$content = $fileview->fopen($path, 'r');
$content = stream_get_contents($content);
diff --git a/lib/preview/unknown.php b/lib/private/preview/unknown.php
index 9e6cd68d401..9e6cd68d401 100644
--- a/lib/preview/unknown.php
+++ b/lib/private/preview/unknown.php
diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php
new file mode 100755
index 00000000000..ac9a866a75b
--- /dev/null
+++ b/lib/private/previewmanager.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller thomas.mueller@tmit.eu
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+namespace OC;
+
+use OCP\image;
+use OCP\IPreview;
+
+class PreviewManager implements IPreview {
+ /**
+ * @brief return a preview of a file
+ * @param string $file The path to the file where you want a thumbnail from
+ * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
+ * @return \OCP\Image
+ */
+ function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false)
+ {
+ $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp);
+ return $preview->getPreview();
+ }
+
+ /**
+ * @brief returns true if the passed mime type is supported
+ * @param string $mimeType
+ * @return boolean
+ */
+ function isMimeSupported($mimeType = '*')
+ {
+ return \OC\Preview::isMimeSupported($mimeType);
+ }
+}
diff --git a/lib/request.php b/lib/private/request.php
index df33217f95d..df33217f95d 100755
--- a/lib/request.php
+++ b/lib/private/request.php
diff --git a/lib/response.php b/lib/private/response.php
index 674176d078b..674176d078b 100644
--- a/lib/response.php
+++ b/lib/private/response.php
diff --git a/lib/route.php b/lib/private/route.php
index 5901717c094..5901717c094 100644
--- a/lib/route.php
+++ b/lib/private/route.php
diff --git a/lib/router.php b/lib/private/router.php
index dbaca9e0d5d..dbaca9e0d5d 100644
--- a/lib/router.php
+++ b/lib/private/router.php
diff --git a/lib/search.php b/lib/private/search.php
index b9c75dfc333..b9c75dfc333 100644
--- a/lib/search.php
+++ b/lib/private/search.php
diff --git a/lib/search/provider.php b/lib/private/search/provider.php
index b617b9c5d94..b617b9c5d94 100644
--- a/lib/search/provider.php
+++ b/lib/private/search/provider.php
diff --git a/lib/search/provider/file.php b/lib/private/search/provider/file.php
index 9bd50931517..9bd50931517 100644
--- a/lib/search/provider/file.php
+++ b/lib/private/search/provider/file.php
diff --git a/lib/search/result.php b/lib/private/search/result.php
index 42275c2df11..42275c2df11 100644
--- a/lib/search/result.php
+++ b/lib/private/search/result.php
diff --git a/lib/private/server.php b/lib/private/server.php
new file mode 100644
index 00000000000..cabb15324ec
--- /dev/null
+++ b/lib/private/server.php
@@ -0,0 +1,255 @@
+<?php
+
+namespace OC;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Utility\SimpleContainer;
+use OC\Cache\UserCache;
+use OC\Files\Node\Root;
+use OC\Files\View;
+use OCP\IServerContainer;
+
+/**
+ * Class Server
+ * @package OC
+ *
+ * TODO: hookup all manager classes
+ */
+class Server extends SimpleContainer implements IServerContainer {
+
+ function __construct() {
+ $this->registerService('ContactsManager', function($c) {
+ return new ContactsManager();
+ });
+ $this->registerService('Request', function($c) {
+ $params = array();
+
+ // we json decode the body only in case of content type json
+ if (isset($_SERVER['CONTENT_TYPE']) && stripos($_SERVER['CONTENT_TYPE'],'json') !== false ) {
+ $params = json_decode(file_get_contents('php://input'), true);
+ $params = is_array($params) ? $params: array();
+ }
+
+ return new Request(
+ array(
+ 'get' => $_GET,
+ 'post' => $_POST,
+ 'files' => $_FILES,
+ 'server' => $_SERVER,
+ 'env' => $_ENV,
+ 'cookies' => $_COOKIE,
+ 'method' => (isset($_SERVER) && isset($_SERVER['REQUEST_METHOD']))
+ ? $_SERVER['REQUEST_METHOD']
+ : null,
+ 'params' => $params,
+ 'urlParams' => $c['urlParams']
+ )
+ );
+ });
+ $this->registerService('PreviewManager', function($c) {
+ return new PreviewManager();
+ });
+ $this->registerService('TagManager', function($c) {
+ $user = \OC_User::getUser();
+ return new TagManager($user);
+ });
+ $this->registerService('RootFolder', function($c) {
+ // TODO: get user and user manager from container as well
+ $user = \OC_User::getUser();
+ /** @var $c SimpleContainer */
+ $userManager = $c->query('UserManager');
+ $user = $userManager->get($user);
+ $manager = \OC\Files\Filesystem::getMountManager();
+ $view = new View();
+ return new Root($manager, $view, $user);
+ });
+ $this->registerService('UserManager', function($c) {
+ return new \OC\User\Manager();
+ });
+ $this->registerService('UserSession', function($c) {
+ /** @var $c SimpleContainer */
+ $manager = $c->query('UserManager');
+ $userSession = new \OC\User\Session($manager, \OC::$session);
+ $userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
+ \OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
+ });
+ $userSession->listen('\OC\User', 'postCreateUser', function ($user, $password) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'post_createUser', array('uid' => $user->getUID(), 'password' => $password));
+ });
+ $userSession->listen('\OC\User', 'preDelete', function ($user) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'pre_deleteUser', array('run' => true, 'uid' => $user->getUID()));
+ });
+ $userSession->listen('\OC\User', 'postDelete', function ($user) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'post_deleteUser', array('uid' => $user->getUID()));
+ });
+ $userSession->listen('\OC\User', 'preSetPassword', function ($user, $password, $recoveryPassword) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'pre_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
+ });
+ $userSession->listen('\OC\User', 'postSetPassword', function ($user, $password, $recoveryPassword) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'post_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
+ });
+ $userSession->listen('\OC\User', 'preLogin', function ($uid, $password) {
+ \OC_Hook::emit('OC_User', 'pre_login', array('run' => true, 'uid' => $uid, 'password' => $password));
+ });
+ $userSession->listen('\OC\User', 'postLogin', function ($user, $password) {
+ /** @var $user \OC\User\User */
+ \OC_Hook::emit('OC_User', 'post_login', array('run' => true, 'uid' => $user->getUID(), 'password' => $password));
+ });
+ $userSession->listen('\OC\User', 'logout', function () {
+ \OC_Hook::emit('OC_User', 'logout', array());
+ });
+ return $userSession;
+ });
+ $this->registerService('NavigationManager', function($c) {
+ return new \OC\NavigationManager();
+ });
+ $this->registerService('AllConfig', function($c) {
+ return new \OC\AllConfig();
+ });
+ $this->registerService('UserCache', function($c) {
+ return new UserCache();
+ });
+ }
+
+ /**
+ * @return \OCP\Contacts\IManager
+ */
+ function getContactsManager() {
+ return $this->query('ContactsManager');
+ }
+
+ /**
+ * The current request object holding all information about the request
+ * currently being processed is returned from this method.
+ * In case the current execution was not initiated by a web request null is returned
+ *
+ * @return \OCP\IRequest|null
+ */
+ function getRequest() {
+ return $this->query('Request');
+ }
+
+ /**
+ * Returns the preview manager which can create preview images for a given file
+ *
+ * @return \OCP\IPreview
+ */
+ function getPreviewManager() {
+ return $this->query('PreviewManager');
+ }
+
+ /**
+ * Returns the tag manager which can get and set tags for different object types
+ *
+ * @see \OCP\ITagManager::load()
+ * @return \OCP\ITagManager
+ */
+ function getTagManager() {
+ return $this->query('TagManager');
+ }
+
+ /**
+ * Returns the root folder of ownCloud's data directory
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getRootFolder() {
+ return $this->query('RootFolder');
+ }
+
+ /**
+ * Returns a view to ownCloud's files folder
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getUserFolder() {
+
+ $dir = '/files';
+ $root = $this->getRootFolder();
+ $folder = null;
+ if(!$root->nodeExists($dir)) {
+ $folder = $root->newFolder($dir);
+ } else {
+ $folder = $root->get($dir);
+ }
+ return $folder;
+ }
+
+ /**
+ * Returns an app-specific view in ownClouds data directory
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getAppFolder() {
+
+ $dir = '/' . \OC_App::getCurrentApp();
+ $root = $this->getRootFolder();
+ $folder = null;
+ if(!$root->nodeExists($dir)) {
+ $folder = $root->newFolder($dir);
+ } else {
+ $folder = $root->get($dir);
+ }
+ return $folder;
+ }
+
+ /**
+ * @return \OC\User\Manager
+ */
+ function getUserManager() {
+ return $this->query('UserManager');
+ }
+
+ /**
+ * @return \OC\User\Session
+ */
+ function getUserSession() {
+ return $this->query('UserSession');
+ }
+
+ /**
+ * @return \OC\NavigationManager
+ */
+ function getNavigationManager() {
+ return $this->query('NavigationManager');
+ }
+
+ /**
+ * @return \OC\Config
+ */
+ function getConfig() {
+ return $this->query('AllConfig');
+ }
+
+ /**
+ * Returns an ICache instance
+ *
+ * @return \OCP\ICache
+ */
+ function getCache() {
+ return $this->query('UserCache');
+ }
+
+ /**
+ * Returns the current session
+ *
+ * @return \OCP\ISession
+ */
+ function getSession() {
+ return \OC::$session;
+ }
+
+ /**
+ * Returns the current session
+ *
+ * @return \OCP\IDBConnection
+ */
+ function getDatabaseConnection() {
+ return \OC_DB::getConnection();
+ }
+}
diff --git a/lib/session/internal.php b/lib/private/session/internal.php
index 60aecccc8aa..60aecccc8aa 100644
--- a/lib/session/internal.php
+++ b/lib/private/session/internal.php
diff --git a/lib/session/memory.php b/lib/private/session/memory.php
index c148ff4b9b9..c148ff4b9b9 100644
--- a/lib/session/memory.php
+++ b/lib/private/session/memory.php
diff --git a/lib/session/session.php b/lib/private/session/session.php
index 55515f57a87..c55001eccac 100644
--- a/lib/session/session.php
+++ b/lib/private/session/session.php
@@ -8,7 +8,7 @@
namespace OC\Session;
-abstract class Session implements \ArrayAccess {
+abstract class Session implements \ArrayAccess, \OCP\ISession {
/**
* $name serves as a namespace for the session keys
*
diff --git a/lib/setup.php b/lib/private/setup.php
index 6bf3c88370f..6bf3c88370f 100644
--- a/lib/setup.php
+++ b/lib/private/setup.php
diff --git a/lib/setup/abstractdatabase.php b/lib/private/setup/abstractdatabase.php
index 0beada7bd29..0beada7bd29 100644
--- a/lib/setup/abstractdatabase.php
+++ b/lib/private/setup/abstractdatabase.php
diff --git a/lib/setup/mssql.php b/lib/private/setup/mssql.php
index b8329f99079..b8329f99079 100644
--- a/lib/setup/mssql.php
+++ b/lib/private/setup/mssql.php
diff --git a/lib/setup/mysql.php b/lib/private/setup/mysql.php
index d97b6d2602f..d97b6d2602f 100644
--- a/lib/setup/mysql.php
+++ b/lib/private/setup/mysql.php
diff --git a/lib/setup/oci.php b/lib/private/setup/oci.php
index 326d7a00531..326d7a00531 100644
--- a/lib/setup/oci.php
+++ b/lib/private/setup/oci.php
diff --git a/lib/setup/postgresql.php b/lib/private/setup/postgresql.php
index 89d328ada19..89d328ada19 100644
--- a/lib/setup/postgresql.php
+++ b/lib/private/setup/postgresql.php
diff --git a/lib/setup/sqlite.php b/lib/private/setup/sqlite.php
index fd4df792d62..fd4df792d62 100644
--- a/lib/setup/sqlite.php
+++ b/lib/private/setup/sqlite.php
diff --git a/lib/subadmin.php b/lib/private/subadmin.php
index 8cda7240ac9..8cda7240ac9 100644
--- a/lib/subadmin.php
+++ b/lib/private/subadmin.php
diff --git a/lib/private/tagmanager.php b/lib/private/tagmanager.php
new file mode 100644
index 00000000000..9a371a11253
--- /dev/null
+++ b/lib/private/tagmanager.php
@@ -0,0 +1,68 @@
+<?php
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * Factory class creating instances of \OCP\ITags
+ *
+ * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
+ * anything else that is either parsed from a vobject or that the user chooses
+ * to add.
+ * Tag names are not case-sensitive, but will be saved with the case they
+ * are entered in. If a user already has a tag 'family' for a type, and
+ * tries to add a tag named 'Family' it will be silently ignored.
+ */
+
+namespace OC;
+
+class TagManager implements \OCP\ITagManager {
+
+ /**
+ * User
+ *
+ * @var string
+ */
+ private $user = null;
+
+ /**
+ * Constructor.
+ *
+ * @param string $user The user whos data the object will operate on.
+ */
+ public function __construct($user) {
+
+ $this->user = $user;
+
+ }
+
+ /**
+ * Create a new \OCP\ITags instance and load tags from db.
+ *
+ * @see \OCP\ITags
+ * @param string $type The type identifier e.g. 'contact' or 'event'.
+ * @param array $defaultTags An array of default tags to be used if none are stored.
+ * @return \OCP\ITags
+ */
+ public function load($type, $defaultTags=array()) {
+ return new Tags($this->user, $type, $defaultTags);
+ }
+
+} \ No newline at end of file
diff --git a/lib/private/tags.php b/lib/private/tags.php
new file mode 100644
index 00000000000..9fdb35a7d6e
--- /dev/null
+++ b/lib/private/tags.php
@@ -0,0 +1,642 @@
+<?php
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2012-2013 Thomas Tanghus <thomas@tanghus.net>
+* @copyright 2012 Bart Visscher bartv@thisnet.nl
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * Class for easily tagging objects by their id
+ *
+ * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
+ * anything else that is either parsed from a vobject or that the user chooses
+ * to add.
+ * Tag names are not case-sensitive, but will be saved with the case they
+ * are entered in. If a user already has a tag 'family' for a type, and
+ * tries to add a tag named 'Family' it will be silently ignored.
+ */
+
+namespace OC;
+
+class Tags implements \OCP\ITags {
+
+ /**
+ * Tags
+ *
+ * @var array
+ */
+ private $tags = array();
+
+ /**
+ * Used for storing objectid/categoryname pairs while rescanning.
+ *
+ * @var array
+ */
+ private static $relations = array();
+
+ /**
+ * Type
+ *
+ * @var string
+ */
+ private $type = null;
+
+ /**
+ * User
+ *
+ * @var string
+ */
+ private $user = null;
+
+ const TAG_TABLE = '*PREFIX*vcategory';
+ const RELATION_TABLE = '*PREFIX*vcategory_to_object';
+
+ const TAG_FAVORITE = '_$!<Favorite>!$_';
+
+ /**
+ * Constructor.
+ *
+ * @param string $user The user whos data the object will operate on.
+ */
+ public function __construct($user, $type, $defaultTags = array()) {
+ $this->user = $user;
+ $this->type = $type;
+ $this->loadTags($defaultTags);
+ }
+
+ /**
+ * Load tags from db.
+ *
+ * @param string $type The type identifier e.g. 'contact' or 'event'.
+ * @param array $defaultTags An array of default tags to be used if none are stored.
+ */
+ protected function loadTags($defaultTags=array()) {
+ $this->tags = array();
+ $result = null;
+ $sql = 'SELECT `id`, `category` FROM `' . self::TAG_TABLE . '` '
+ . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`';
+ try {
+ $stmt = \OCP\DB::prepare($sql);
+ $result = $stmt->execute(array($this->user, $this->type));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+
+ if(!is_null($result)) {
+ while( $row = $result->fetchRow()) {
+ $this->tags[$row['id']] = $row['category'];
+ }
+ }
+
+ if(count($defaultTags) > 0 && count($this->tags) === 0) {
+ $this->addMultiple($defaultTags, true);
+ }
+ \OCP\Util::writeLog('core', __METHOD__.', tags: ' . print_r($this->tags, true),
+ \OCP\Util::DEBUG);
+
+ }
+
+ /**
+ * Check if any tags are saved for this type and user.
+ *
+ * @return boolean.
+ */
+ public function isEmpty() {
+ $sql = 'SELECT COUNT(*) FROM `' . self::TAG_TABLE . '` '
+ . 'WHERE `uid` = ? AND `type` = ?';
+ try {
+ $stmt = \OCP\DB::prepare($sql);
+ $result = $stmt->execute(array($this->user, $this->type));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ return false;
+ }
+ return ((int)$result->fetchOne() === 0);
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ }
+
+ /**
+ * Get the tags for a specific user.
+ *
+ * This returns an array with id/name maps:
+ * [
+ * ['id' => 0, 'name' = 'First tag'],
+ * ['id' => 1, 'name' = 'Second tag'],
+ * ]
+ *
+ * @return array
+ */
+ public function getTags() {
+ if(!count($this->tags)) {
+ return array();
+ }
+
+ $tags = array_values($this->tags);
+ uasort($tags, 'strnatcasecmp');
+ $tagMap = array();
+
+ foreach($tags as $tag) {
+ if($tag !== self::TAG_FAVORITE) {
+ $tagMap[] = array(
+ 'id' => $this->array_searchi($tag, $this->tags),
+ 'name' => $tag
+ );
+ }
+ }
+ return $tagMap;
+
+ }
+
+ /**
+ * Get the a list if items tagged with $tag.
+ *
+ * Throws an exception if the tag could not be found.
+ *
+ * @param string|integer $tag Tag id or name.
+ * @return array An array of object ids or false on error.
+ */
+ public function getIdsForTag($tag) {
+ $result = null;
+ if(is_numeric($tag)) {
+ $tagId = $tag;
+ } elseif(is_string($tag)) {
+ $tag = trim($tag);
+ $tagId = $this->array_searchi($tag, $this->tags);
+ }
+
+ if($tagId === false) {
+ $l10n = \OC_L10N::get('core');
+ throw new \Exception(
+ $l10n->t('Could not find category "%s"', $tag)
+ );
+ }
+
+ $ids = array();
+ $sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE
+ . '` WHERE `categoryid` = ?';
+
+ try {
+ $stmt = \OCP\DB::prepare($sql);
+ $result = $stmt->execute(array($tagId));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ return false;
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+
+ if(!is_null($result)) {
+ while( $row = $result->fetchRow()) {
+ $ids[] = (int)$row['objid'];
+ }
+ }
+
+ return $ids;
+ }
+
+ /**
+ * Checks whether a tag is already saved.
+ *
+ * @param string $name The name to check for.
+ * @return bool
+ */
+ public function hasTag($name) {
+ return $this->in_arrayi($name, $this->tags);
+ }
+
+ /**
+ * Add a new tag.
+ *
+ * @param string $name A string with a name of the tag
+ * @return int the id of the added tag or false if it already exists.
+ */
+ public function add($name) {
+ $name = trim($name);
+
+ if($this->hasTag($name)) {
+ \OCP\Util::writeLog('core', __METHOD__.', name: ' . $name. ' exists already', \OCP\Util::DEBUG);
+ return false;
+ }
+ try {
+ $result = \OCP\DB::insertIfNotExist(
+ self::TAG_TABLE,
+ array(
+ 'uid' => $this->user,
+ 'type' => $this->type,
+ 'category' => $name,
+ )
+ );
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ return false;
+ } elseif((int)$result === 0) {
+ \OCP\Util::writeLog('core', __METHOD__.', Tag already exists: ' . $name, \OCP\Util::DEBUG);
+ return false;
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ $id = \OCP\DB::insertid(self::TAG_TABLE);
+ \OCP\Util::writeLog('core', __METHOD__.', id: ' . $id, \OCP\Util::DEBUG);
+ $this->tags[$id] = $name;
+ return $id;
+ }
+
+ /**
+ * Rename tag.
+ *
+ * @param string $from The name of the existing tag
+ * @param string $to The new name of the tag.
+ * @return bool
+ */
+ public function rename($from, $to) {
+ $from = trim($from);
+ $to = trim($to);
+ $id = $this->array_searchi($from, $this->tags);
+ if($id === false) {
+ \OCP\Util::writeLog('core', __METHOD__.', tag: ' . $from. ' does not exist', \OCP\Util::DEBUG);
+ return false;
+ }
+
+ $sql = 'UPDATE `' . self::TAG_TABLE . '` SET `category` = ? '
+ . 'WHERE `uid` = ? AND `type` = ? AND `id` = ?';
+ try {
+ $stmt = \OCP\DB::prepare($sql);
+ $result = $stmt->execute(array($to, $this->user, $this->type, $id));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ return false;
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ $this->tags[$id] = $to;
+ return true;
+ }
+
+ /**
+ * Add a list of new tags.
+ *
+ * @param string[] $names A string with a name or an array of strings containing
+ * the name(s) of the to add.
+ * @param bool $sync When true, save the tags
+ * @param int|null $id int Optional object id to add to this|these tag(s)
+ * @return bool Returns false on error.
+ */
+ public function addMultiple($names, $sync=false, $id = null) {
+ if(!is_array($names)) {
+ $names = array($names);
+ }
+ $names = array_map('trim', $names);
+ $newones = array();
+ foreach($names as $name) {
+ if(($this->in_arrayi(
+ $name, $this->tags) == false) && $name !== '') {
+ $newones[] = $name;
+ }
+ if(!is_null($id) ) {
+ // Insert $objectid, $categoryid pairs if not exist.
+ self::$relations[] = array('objid' => $id, 'tag' => $name);
+ }
+ }
+ $this->tags = array_merge($this->tags, $newones);
+ if($sync === true) {
+ $this->save();
+ }
+
+ return true;
+ }
+
+ /**
+ * Save the list of tags and their object relations
+ */
+ protected function save() {
+ if(is_array($this->tags)) {
+ foreach($this->tags as $tag) {
+ try {
+ \OCP\DB::insertIfNotExist(self::TAG_TABLE,
+ array(
+ 'uid' => $this->user,
+ 'type' => $this->type,
+ 'category' => $tag,
+ ));
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+ }
+ // reload tags to get the proper ids.
+ $this->loadTags();
+ // Loop through temporarily cached objectid/tagname pairs
+ // and save relations.
+ $tags = $this->tags;
+ // For some reason this is needed or array_search(i) will return 0..?
+ ksort($tags);
+ foreach(self::$relations as $relation) {
+ $tagId = $this->array_searchi($relation['tag'], $tags);
+ \OCP\Util::writeLog('core', __METHOD__ . 'catid, ' . $relation['tag'] . ' ' . $tagId, \OCP\Util::DEBUG);
+ if($tagId) {
+ try {
+ \OCP\DB::insertIfNotExist(self::RELATION_TABLE,
+ array(
+ 'objid' => $relation['objid'],
+ 'categoryid' => $tagId,
+ 'type' => $this->type,
+ ));
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+ }
+ }
+ self::$relations = array(); // reset
+ } else {
+ \OCP\Util::writeLog('core', __METHOD__.', $this->tags is not an array! '
+ . print_r($this->tags, true), \OCP\Util::ERROR);
+ }
+ }
+
+ /**
+ * Delete tags and tag/object relations for a user.
+ *
+ * For hooking up on post_deleteUser
+ *
+ * @param array
+ */
+ public static function post_deleteUser($arguments) {
+ // Find all objectid/tagId pairs.
+ $result = null;
+ try {
+ $stmt = \OCP\DB::prepare('SELECT `id` FROM `' . self::TAG_TABLE . '` '
+ . 'WHERE `uid` = ?');
+ $result = $stmt->execute(array($arguments['uid']));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+
+ if(!is_null($result)) {
+ try {
+ $stmt = \OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
+ . 'WHERE `categoryid` = ?');
+ while( $row = $result->fetchRow()) {
+ try {
+ $stmt->execute(array($row['id']));
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ }
+ }
+ try {
+ $stmt = \OCP\DB::prepare('DELETE FROM `' . self::TAG_TABLE . '` '
+ . 'WHERE `uid` = ?');
+ $result = $stmt->execute(array($arguments['uid']));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. ', DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__ . ', exception: '
+ . $e->getMessage(), \OCP\Util::ERROR);
+ }
+ }
+
+ /**
+ * Delete tag/object relations from the db
+ *
+ * @param array $ids The ids of the objects
+ * @return boolean Returns false on error.
+ */
+ public function purgeObjects(array $ids) {
+ if(count($ids) === 0) {
+ // job done ;)
+ return true;
+ }
+ $updates = $ids;
+ try {
+ $query = 'DELETE FROM `' . self::RELATION_TABLE . '` ';
+ $query .= 'WHERE `objid` IN (' . str_repeat('?,', count($ids)-1) . '?) ';
+ $query .= 'AND `type`= ?';
+ $updates[] = $this->type;
+ $stmt = \OCP\DB::prepare($query);
+ $result = $stmt->execute($updates);
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ return false;
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Get favorites for an object type
+ *
+ * @return array An array of object ids.
+ */
+ public function getFavorites() {
+ try {
+ return $this->getIdsForTag(self::TAG_FAVORITE);
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
+ \OCP\Util::ERROR);
+ return array();
+ }
+ }
+
+ /**
+ * Add an object to favorites
+ *
+ * @param int $objid The id of the object
+ * @return boolean
+ */
+ public function addToFavorites($objid) {
+ if(!$this->hasTag(self::TAG_FAVORITE)) {
+ $this->add(self::TAG_FAVORITE, true);
+ }
+ return $this->tagAs($objid, self::TAG_FAVORITE, $this->type);
+ }
+
+ /**
+ * Remove an object from favorites
+ *
+ * @param int $objid The id of the object
+ * @return boolean
+ */
+ public function removeFromFavorites($objid) {
+ return $this->unTag($objid, self::TAG_FAVORITE, $this->type);
+ }
+
+ /**
+ * Creates a tag/object relation.
+ *
+ * @param int $objid The id of the object
+ * @param int|string $tag The id or name of the tag
+ * @return boolean Returns false on database error.
+ */
+ public function tagAs($objid, $tag) {
+ if(is_string($tag) && !is_numeric($tag)) {
+ $tag = trim($tag);
+ if(!$this->hasTag($tag)) {
+ $this->add($tag, true);
+ }
+ $tagId = $this->array_searchi($tag, $this->tags);
+ } else {
+ $tagId = $tag;
+ }
+ try {
+ \OCP\DB::insertIfNotExist(self::RELATION_TABLE,
+ array(
+ 'objid' => $objid,
+ 'categoryid' => $tagId,
+ 'type' => $this->type,
+ ));
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Delete single tag/object relation from the db
+ *
+ * @param int $objid The id of the object
+ * @param int|string $tag The id or name of the tag
+ * @return boolean
+ */
+ public function unTag($objid, $tag) {
+ if(is_string($tag) && !is_numeric($tag)) {
+ $tag = trim($tag);
+ $tagId = $this->array_searchi($tag, $this->tags);
+ } else {
+ $tagId = $tag;
+ }
+
+ try {
+ $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
+ . 'WHERE `objid` = ? AND `categoryid` = ? AND `type` = ?';
+ $stmt = \OCP\DB::prepare($sql);
+ $stmt->execute(array($objid, $tagId, $this->type));
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Delete tags from the
+ *
+ * @param string[] $names An array of tags to delete
+ * @return bool Returns false on error
+ */
+ public function delete($names) {
+ if(!is_array($names)) {
+ $names = array($names);
+ }
+
+ $names = array_map('trim', $names);
+
+ \OCP\Util::writeLog('core', __METHOD__ . ', before: '
+ . print_r($this->tags, true), \OCP\Util::DEBUG);
+ foreach($names as $name) {
+ $id = null;
+
+ if($this->hasTag($name)) {
+ $id = $this->array_searchi($name, $this->tags);
+ unset($this->tags[$id]);
+ }
+ try {
+ $stmt = \OCP\DB::prepare('DELETE FROM `' . self::TAG_TABLE . '` WHERE '
+ . '`uid` = ? AND `type` = ? AND `category` = ?');
+ $result = $stmt->execute(array($this->user, $this->type, $name));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core', __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result), \OCP\Util::ERROR);
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__ . ', exception: '
+ . $e->getMessage(), \OCP\Util::ERROR);
+ return false;
+ }
+ if(!is_null($id) && $id !== false) {
+ try {
+ $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
+ . 'WHERE `categoryid` = ?';
+ $stmt = \OCP\DB::prepare($sql);
+ $result = $stmt->execute(array($id));
+ if (\OCP\DB::isError($result)) {
+ \OCP\Util::writeLog('core',
+ __METHOD__. 'DB error: ' . \OCP\DB::getErrorMessage($result),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ } catch(\Exception $e) {
+ \OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
+ \OCP\Util::ERROR);
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ // case-insensitive in_array
+ private function in_arrayi($needle, $haystack) {
+ if(!is_array($haystack)) {
+ return false;
+ }
+ return in_array(strtolower($needle), array_map('strtolower', $haystack));
+ }
+
+ // case-insensitive array_search
+ private function array_searchi($needle, $haystack) {
+ if(!is_array($haystack)) {
+ return false;
+ }
+ return array_search(strtolower($needle), array_map('strtolower', $haystack));
+ }
+}
diff --git a/lib/template.php b/lib/private/template.php
index 9b2c1211e61..9b2c1211e61 100644
--- a/lib/template.php
+++ b/lib/private/template.php
diff --git a/lib/template/base.php b/lib/private/template/base.php
index 88941bc7132..88941bc7132 100644
--- a/lib/template/base.php
+++ b/lib/private/template/base.php
diff --git a/lib/template/cssresourcelocator.php b/lib/private/template/cssresourcelocator.php
index 8e7831ca549..8e7831ca549 100644
--- a/lib/template/cssresourcelocator.php
+++ b/lib/private/template/cssresourcelocator.php
diff --git a/lib/template/functions.php b/lib/private/template/functions.php
index 501f8081bff..501f8081bff 100644
--- a/lib/template/functions.php
+++ b/lib/private/template/functions.php
diff --git a/lib/template/jsresourcelocator.php b/lib/private/template/jsresourcelocator.php
index f8fe3817ce6..f8fe3817ce6 100644
--- a/lib/template/jsresourcelocator.php
+++ b/lib/private/template/jsresourcelocator.php
diff --git a/lib/template/resourcelocator.php b/lib/private/template/resourcelocator.php
index 9f83673664d..9f83673664d 100644
--- a/lib/template/resourcelocator.php
+++ b/lib/private/template/resourcelocator.php
diff --git a/lib/template/templatefilelocator.php b/lib/private/template/templatefilelocator.php
index d5a484b1a14..d5a484b1a14 100644
--- a/lib/template/templatefilelocator.php
+++ b/lib/private/template/templatefilelocator.php
diff --git a/lib/templatelayout.php b/lib/private/templatelayout.php
index 625f3424a04..625f3424a04 100644
--- a/lib/templatelayout.php
+++ b/lib/private/templatelayout.php
diff --git a/lib/updater.php b/lib/private/updater.php
index df7332a96a9..9827d8a8c12 100644
--- a/lib/updater.php
+++ b/lib/private/updater.php
@@ -56,7 +56,7 @@ class Updater extends BasicEmitter {
$version = \OC_Util::getVersion();
$version['installed'] = \OC_Appconfig::getValue('core', 'installedat');
$version['updated'] = \OC_Appconfig::getValue('core', 'lastupdatedat');
- $version['updatechannel'] = 'stable';
+ $version['updatechannel'] = \OC_Util::getChannel();
$version['edition'] = \OC_Util::getEditionString();
$versionString = implode('x', $version);
diff --git a/lib/user.php b/lib/private/user.php
index 0f6f40aec9a..15e807088b4 100644
--- a/lib/user.php
+++ b/lib/private/user.php
@@ -37,54 +37,15 @@
* logout()
*/
class OC_User {
- public static $userSession = null;
-
public static function getUserSession() {
- if (!self::$userSession) {
- $manager = new \OC\User\Manager();
- self::$userSession = new \OC\User\Session($manager, \OC::$session);
- self::$userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
- \OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
- });
- self::$userSession->listen('\OC\User', 'postCreateUser', function ($user, $password) {
- /** @var $user \OC\User\User */
- \OC_Hook::emit('OC_User', 'post_createUser', array('uid' => $user->getUID(), 'password' => $password));
- });
- self::$userSession->listen('\OC\User', 'preDelete', function ($user) {
- /** @var $user \OC\User\User */
- \OC_Hook::emit('OC_User', 'pre_deleteUser', array('run' => true, 'uid' => $user->getUID()));
- });
- self::$userSession->listen('\OC\User', 'postDelete', function ($user) {
- /** @var $user \OC\User\User */
- \OC_Hook::emit('OC_User', 'post_deleteUser', array('uid' => $user->getUID()));
- });
- self::$userSession->listen('\OC\User', 'preSetPassword', function ($user, $password, $recoveryPassword) {
- /** @var $user \OC\User\User */
- OC_Hook::emit('OC_User', 'pre_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
- });
- self::$userSession->listen('\OC\User', 'postSetPassword', function ($user, $password, $recoveryPassword) {
- /** @var $user \OC\User\User */
- OC_Hook::emit('OC_User', 'post_setPassword', array('run' => true, 'uid' => $user->getUID(), 'password' => $password, 'recoveryPassword' => $recoveryPassword));
- });
- self::$userSession->listen('\OC\User', 'preLogin', function ($uid, $password) {
- \OC_Hook::emit('OC_User', 'pre_login', array('run' => true, 'uid' => $uid, 'password' => $password));
- });
- self::$userSession->listen('\OC\User', 'postLogin', function ($user, $password) {
- /** @var $user \OC\User\User */
- \OC_Hook::emit('OC_User', 'post_login', array('run' => true, 'uid' => $user->getUID(), 'password' => $password));
- });
- self::$userSession->listen('\OC\User', 'logout', function () {
- \OC_Hook::emit('OC_User', 'logout', array());
- });
- }
- return self::$userSession;
+ return OC::$server->getUserSession();
}
/**
* @return \OC\User\Manager
*/
public static function getManager() {
- return self::getUserSession()->getManager();
+ return OC::$server->getUserManager();
}
private static $_backends = array();
@@ -177,6 +138,7 @@ class OC_User {
* setup the configured backends in config.php
*/
public static function setupBackends() {
+ OC_App::loadApps(array('prelogin'));
$backends = OC_Config::getValue('user_backends', array());
foreach ($backends as $i => $config) {
$class = $config['class'];
@@ -410,22 +372,18 @@ class OC_User {
* @brief Check if the password is correct
* @param string $uid The username
* @param string $password The password
- * @return bool
+ * @return mixed user id a string on success, false otherwise
*
* Check if the password is correct without logging in the user
* returns the user id or false
*/
public static function checkPassword($uid, $password) {
- $user = self::getManager()->get($uid);
- if ($user) {
- if ($user->checkPassword($password)) {
- return $user->getUID();
- } else {
- return false;
- }
- } else {
- return false;
+ $manager = self::getManager();
+ $username = $manager->checkPassword($uid, $password);
+ if ($username !== false) {
+ return $username->getUID();
}
+ return false;
}
/**
diff --git a/lib/user/backend.php b/lib/private/user/backend.php
index e9be08e429c..e9be08e429c 100644
--- a/lib/user/backend.php
+++ b/lib/private/user/backend.php
diff --git a/lib/user/database.php b/lib/private/user/database.php
index 9f00a022d9f..9f00a022d9f 100644
--- a/lib/user/database.php
+++ b/lib/private/user/database.php
diff --git a/lib/user/dummy.php b/lib/private/user/dummy.php
index b5b7a6c3c7a..b5b7a6c3c7a 100644
--- a/lib/user/dummy.php
+++ b/lib/private/user/dummy.php
diff --git a/lib/user/example.php b/lib/private/user/example.php
index b2d0dc25410..b2d0dc25410 100644
--- a/lib/user/example.php
+++ b/lib/private/user/example.php
diff --git a/lib/user/http.php b/lib/private/user/http.php
index 1e044ed4188..e99afe59ba7 100644
--- a/lib/user/http.php
+++ b/lib/private/user/http.php
@@ -79,7 +79,11 @@ class OC_User_HTTP extends OC_User_Backend {
curl_close($ch);
- return $status==200;
+ if($status === 200) {
+ return $uid;
+ }
+
+ return false;
}
/**
diff --git a/lib/user/interface.php b/lib/private/user/interface.php
index c72bdfaf3fd..c72bdfaf3fd 100644
--- a/lib/user/interface.php
+++ b/lib/private/user/interface.php
diff --git a/lib/user/manager.php b/lib/private/user/manager.php
index 8dc9bfe2729..13286bc28a4 100644
--- a/lib/user/manager.php
+++ b/lib/private/user/manager.php
@@ -119,6 +119,25 @@ class Manager extends PublicEmitter {
}
/**
+ * Check if the password is valid for the user
+ *
+ * @param $loginname
+ * @param $password
+ * @return mixed the User object on success, false otherwise
+ */
+ public function checkPassword($loginname, $password) {
+ foreach ($this->backends as $backend) {
+ if($backend->implementsActions(\OC_USER_BACKEND_CHECK_PASSWORD)) {
+ $uid = $backend->checkPassword($loginname, $password);
+ if ($uid !== false) {
+ return $this->getUserObject($uid, $backend);
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
* search by user id
*
* @param string $pattern
diff --git a/lib/user/session.php b/lib/private/user/session.php
index 9a6c669e935..525c65ab8a1 100644
--- a/lib/user/session.php
+++ b/lib/private/user/session.php
@@ -27,7 +27,7 @@ use OC\Hooks\Emitter;
*
* @package OC\User
*/
-class Session implements Emitter {
+class Session implements Emitter, \OCP\IUserSession {
/**
* @var \OC\User\Manager $manager
*/
@@ -121,15 +121,16 @@ class Session implements Emitter {
*/
public function login($uid, $password) {
$this->manager->emit('\OC\User', 'preLogin', array($uid, $password));
- $user = $this->manager->get($uid);
- if ($user) {
- $result = $user->checkPassword($password);
- if ($result and $user->isEnabled()) {
- $this->setUser($user);
- $this->manager->emit('\OC\User', 'postLogin', array($user, $password));
- return true;
- } else {
- return false;
+ $user = $this->manager->checkPassword($uid, $password);
+ if($user !== false) {
+ if (!is_null($user)) {
+ if ($user->isEnabled()) {
+ $this->setUser($user);
+ $this->manager->emit('\OC\User', 'postLogin', array($user, $password));
+ return true;
+ } else {
+ return false;
+ }
}
} else {
return false;
diff --git a/lib/user/user.php b/lib/private/user/user.php
index 8115c43198c..e5f842944f1 100644
--- a/lib/user/user.php
+++ b/lib/private/user/user.php
@@ -106,24 +106,6 @@ class User {
}
/**
- * Check if the password is valid for the user
- *
- * @param $password
- * @return bool
- */
- public function checkPassword($password) {
- if ($this->backend->implementsActions(\OC_USER_BACKEND_CHECK_PASSWORD)) {
- $result = $this->backend->checkPassword($this->uid, $password);
- if ($result !== false) {
- $this->uid = $result;
- }
- return !($result === false);
- } else {
- return false;
- }
- }
-
- /**
* Set the password of the user
*
* @param string $password
diff --git a/lib/util.php b/lib/private/util.php
index 997b98f64b1..97dd2fac53c 100755
--- a/lib/util.php
+++ b/lib/private/util.php
@@ -106,9 +106,8 @@ class OC_Util {
* @return array
*/
public static function getVersion() {
- // hint: We only can count up. Reset minor/patchlevel when
- // updating major/minor version number.
- return array(5, 80, 08);
+ OC_Util::loadVersion();
+ return \OC::$server->getSession()->get('OC_Version');
}
/**
@@ -116,7 +115,8 @@ class OC_Util {
* @return string
*/
public static function getVersionString() {
- return '6.0 pre alpha';
+ OC_Util::loadVersion();
+ return \OC::$server->getSession()->get('OC_VersionString');
}
/**
@@ -126,7 +126,46 @@ class OC_Util {
* @return string
*/
public static function getEditionString() {
- return '';
+ OC_Util::loadVersion();
+ return \OC::$server->getSession()->get('OC_Edition');
+ }
+
+ /**
+ * @description get the update channel of the current installed of ownCloud.
+ * @return string
+ */
+ public static function getChannel() {
+ OC_Util::loadVersion();
+ return \OC::$server->getSession()->get('OC_Channel');
+ }
+
+ /**
+ * @description get the build number of the current installed of ownCloud.
+ * @return string
+ */
+ public static function getBuild() {
+ OC_Util::loadVersion();
+ return \OC::$server->getSession()->get('OC_Build');
+ }
+
+ /**
+ * @description load the version.php into the session as cache
+ */
+ private static function loadVersion() {
+ if(!\OC::$server->getSession()->exists('OC_Version')) {
+ require 'version.php';
+ $session = \OC::$server->getSession();
+ /** @var $OC_Version string */
+ $session->set('OC_Version', $OC_Version);
+ /** @var $OC_VersionString string */
+ $session->set('OC_VersionString', $OC_VersionString);
+ /** @var $OC_Edition string */
+ $session->set('OC_Edition', $OC_Edition);
+ /** @var $OC_Channel string */
+ $session->set('OC_Channel', $OC_Channel);
+ /** @var $OC_Build string */
+ $session->set('OC_Build', $OC_Build);
+ }
}
/**
@@ -410,8 +449,12 @@ class OC_Util {
$encryptedFiles = false;
if (OC_App::isEnabled('files_encryption') === false) {
$view = new OC\Files\View('/' . OCP\User::getUser());
- if ($view->file_exists('/files_encryption/keyfiles')) {
- $encryptedFiles = true;
+ $keyfilePath = '/files_encryption/keyfiles';
+ if ($view->is_dir($keyfilePath)) {
+ $dircontent = $view->getDirectoryContent($keyfilePath);
+ if (!empty($dircontent)) {
+ $encryptedFiles = true;
+ }
}
}
@@ -467,6 +510,7 @@ class OC_Util {
}
$parameters['alt_login'] = OC_App::getAlternativeLogIns();
+ $parameters['rememberLoginAllowed'] = self::rememberLoginAllowed();
OC_Template::printGuestPage("", "login", $parameters);
}
@@ -509,6 +553,27 @@ class OC_Util {
}
/**
+ * Check if it is allowed to remember login.
+ *
+ * @note Every app can set 'rememberlogin' to 'false' to disable the remember login feature
+ *
+ * @return bool
+ */
+ public static function rememberLoginAllowed() {
+
+ $apps = OC_App::getEnabledApps();
+
+ foreach ($apps as $app) {
+ $appInfo = OC_App::getAppInfo($app);
+ if (isset($appInfo['rememberlogin']) && $appInfo['rememberlogin'] === 'false') {
+ return false;
+ }
+
+ }
+ return true;
+ }
+
+ /**
* @brief Check if the user is a subadmin, redirects to home if not
* @return array $groups where the current user is subadmin
*/
@@ -552,7 +617,7 @@ class OC_Util {
if(is_null($id)) {
// We need to guarantee at least one letter in instanceid so it can be used as the session_name
$id = 'oc' . self::generateRandomBytes(10);
- OC_Config::setValue('instanceid', $id);
+ OC_Config::$object->setValue('instanceid', $id);
}
return $id;
}
@@ -730,12 +795,6 @@ class OC_Util {
'baseUri' => OC_Helper::linkToRemote('webdav'),
);
- // save the old timeout so that we can restore it later
- $oldTimeout = ini_get("default_socket_timeout");
-
- // use a 5 sec timeout for the check. Should be enough for local requests.
- ini_set("default_socket_timeout", 5);
-
$client = new \Sabre_DAV_Client($settings);
// for this self test we don't care if the ssl certificate is self signed and the peer cannot be verified.
@@ -752,9 +811,6 @@ class OC_Util {
$return = false;
}
- // restore the original timeout
- ini_set("default_socket_timeout", $oldTimeout);
-
return $return;
}
diff --git a/lib/vobject.php b/lib/private/vobject.php
index 267176ebc07..267176ebc07 100644
--- a/lib/vobject.php
+++ b/lib/private/vobject.php
diff --git a/lib/vobject/compoundproperty.php b/lib/private/vobject/compoundproperty.php
index 7fe42574bed..7fe42574bed 100644
--- a/lib/vobject/compoundproperty.php
+++ b/lib/private/vobject/compoundproperty.php
diff --git a/lib/vobject/stringproperty.php b/lib/private/vobject/stringproperty.php
index a9d63a0a789..a9d63a0a789 100644
--- a/lib/vobject/stringproperty.php
+++ b/lib/private/vobject/stringproperty.php
diff --git a/lib/public/app.php b/lib/public/app.php
index a1ecf524cc8..0a5721b334e 100644
--- a/lib/public/app.php
+++ b/lib/public/app.php
@@ -35,10 +35,10 @@ namespace OCP;
*/
class App {
/**
- * @brief Makes owncloud aware of this app
+ * @brief Makes ownCloud aware of this app
* @brief This call is deprecated and not necessary to use.
* @param $data array with all information
- * @returns true/false
+ * @returns boolean
*
* @deprecated this method is deprecated
* Do not call it anymore
@@ -52,7 +52,7 @@ class App {
/**
* @brief adds an entry to the navigation
* @param $data array containing the data
- * @returns true/false
+ * @returns boolean
*
* This function adds a new entry to the navigation visible to users. $data
* is an associative array.
@@ -72,8 +72,8 @@ class App {
/**
* @brief marks a navigation entry as active
- * @param $id id of the entry
- * @returns true/false
+ * @param $id string id of the entry
+ * @returns boolean
*
* This function sets a navigation entry as active and removes the 'active'
* property from all other entries. The templates can use this for
@@ -104,7 +104,7 @@ class App {
/**
* @brief Read app metadata from the info.xml file
* @param string $app id of the app or the path of the info.xml file
- * @param boolean path (optional)
+ * @param boolean $path (optional)
* @returns array
*/
public static function getAppInfo( $app, $path=false ) {
@@ -114,7 +114,7 @@ class App {
/**
* @brief checks whether or not an app is enabled
* @param $app app
- * @returns true/false
+ * @returns boolean
*
* This function checks whether or not an app is enabled.
*/
@@ -133,7 +133,7 @@ class App {
/**
* @brief Get the last version of the app, either from appinfo/version or from appinfo/info.xml
* @param $app app
- * @returns true/false
+ * @returns boolean
*/
public static function getAppVersion( $app ) {
return \OC_App::getAppVersion( $app );
diff --git a/lib/public/appframework/app.php b/lib/public/appframework/app.php
new file mode 100644
index 00000000000..d97c5c81848
--- /dev/null
+++ b/lib/public/appframework/app.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\AppFramework;
+
+
+/**
+ * Class App
+ * @package OCP\AppFramework
+ *
+ * Any application must inherit this call - all controller instances to be used are
+ * to be registered using IContainer::registerService
+ */
+class App {
+ public function __construct($appName) {
+ $this->container = new \OC\AppFramework\DependencyInjection\DIContainer($appName);
+ }
+
+ private $container;
+
+ /**
+ * @return IAppContainer
+ */
+ public function getContainer() {
+ return $this->container;
+ }
+
+ /**
+ * This function is called by the routing component to fire up the frameworks dispatch mechanism.
+ *
+ * Example code in routes.php of the task app:
+ * $this->create('tasks_index', '/')->get()->action(
+ * function($params){
+ * $app = new TaskApp();
+ * $app->dispatch('PageController', 'index', $params);
+ * }
+ * );
+ *
+ *
+ * Example for for TaskApp implementation:
+ * class TaskApp extends \OCP\AppFramework\App {
+ *
+ * public function __construct(){
+ * parent::__construct('tasks');
+ *
+ * $this->getContainer()->registerService('PageController', function(IAppContainer $c){
+ * $a = $c->query('API');
+ * $r = $c->query('Request');
+ * return new PageController($a, $r);
+ * });
+ * }
+ * }
+ *
+ * @param string $controllerName the name of the controller under which it is
+ * stored in the DI container
+ * @param string $methodName the method that you want to call
+ * @param array $urlParams an array with variables extracted from the routes
+ */
+ public function dispatch($controllerName, $methodName, array $urlParams) {
+ \OC\AppFramework\App::main($controllerName, $methodName, $urlParams, $this->container);
+ }
+}
diff --git a/lib/public/appframework/http/http.php b/lib/public/appframework/http/http.php
new file mode 100644
index 00000000000..9eafe782726
--- /dev/null
+++ b/lib/public/appframework/http/http.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework\Http;
+
+
+class Http {
+
+ const STATUS_CONTINUE = 100;
+ const STATUS_SWITCHING_PROTOCOLS = 101;
+ const STATUS_PROCESSING = 102;
+ const STATUS_OK = 200;
+ const STATUS_CREATED = 201;
+ const STATUS_ACCEPTED = 202;
+ const STATUS_NON_AUTHORATIVE_INFORMATION = 203;
+ const STATUS_NO_CONTENT = 204;
+ const STATUS_RESET_CONTENT = 205;
+ const STATUS_PARTIAL_CONTENT = 206;
+ const STATUS_MULTI_STATUS = 207;
+ const STATUS_ALREADY_REPORTED = 208;
+ const STATUS_IM_USED = 226;
+ const STATUS_MULTIPLE_CHOICES = 300;
+ const STATUS_MOVED_PERMANENTLY = 301;
+ const STATUS_FOUND = 302;
+ const STATUS_SEE_OTHER = 303;
+ const STATUS_NOT_MODIFIED = 304;
+ const STATUS_USE_PROXY = 305;
+ const STATUS_RESERVED = 306;
+ const STATUS_TEMPORARY_REDIRECT = 307;
+ const STATUS_BAD_REQUEST = 400;
+ const STATUS_UNAUTHORIZED = 401;
+ const STATUS_PAYMENT_REQUIRED = 402;
+ const STATUS_FORBIDDEN = 403;
+ const STATUS_NOT_FOUND = 404;
+ const STATUS_METHOD_NOT_ALLOWED = 405;
+ const STATUS_NOT_ACCEPTABLE = 406;
+ const STATUS_PROXY_AUTHENTICATION_REQUIRED = 407;
+ const STATUS_REQUEST_TIMEOUT = 408;
+ const STATUS_CONFLICT = 409;
+ const STATUS_GONE = 410;
+ const STATUS_LENGTH_REQUIRED = 411;
+ const STATUS_PRECONDITION_FAILED = 412;
+ const STATUS_REQUEST_ENTITY_TOO_LARGE = 413;
+ const STATUS_REQUEST_URI_TOO_LONG = 414;
+ const STATUS_UNSUPPORTED_MEDIA_TYPE = 415;
+ const STATUS_REQUEST_RANGE_NOT_SATISFIABLE = 416;
+ const STATUS_EXPECTATION_FAILED = 417;
+ const STATUS_IM_A_TEAPOT = 418;
+ const STATUS_UNPROCESSABLE_ENTITY = 422;
+ const STATUS_LOCKED = 423;
+ const STATUS_FAILED_DEPENDENCY = 424;
+ const STATUS_UPGRADE_REQUIRED = 426;
+ const STATUS_PRECONDITION_REQUIRED = 428;
+ const STATUS_TOO_MANY_REQUESTS = 429;
+ const STATUS_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
+ const STATUS_INTERNAL_SERVER_ERROR = 500;
+ const STATUS_NOT_IMPLEMENTED = 501;
+ const STATUS_BAD_GATEWAY = 502;
+ const STATUS_SERVICE_UNAVAILABLE = 503;
+ const STATUS_GATEWAY_TIMEOUT = 504;
+ const STATUS_HTTP_VERSION_NOT_SUPPORTED = 505;
+ const STATUS_VARIANT_ALSO_NEGOTIATES = 506;
+ const STATUS_INSUFFICIENT_STORAGE = 507;
+ const STATUS_LOOP_DETECTED = 508;
+ const STATUS_BANDWIDTH_LIMIT_EXCEEDED = 509;
+ const STATUS_NOT_EXTENDED = 510;
+ const STATUS_NETWORK_AUTHENTICATION_REQUIRED = 511;
+}
diff --git a/lib/public/appframework/http/jsonresponse.php b/lib/public/appframework/http/jsonresponse.php
new file mode 100644
index 00000000000..085fdbed2f9
--- /dev/null
+++ b/lib/public/appframework/http/jsonresponse.php
@@ -0,0 +1,74 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework\Http;
+
+
+/**
+ * A renderer for JSON calls
+ */
+class JSONResponse extends Response {
+
+ protected $data;
+
+
+ /**
+ * @param array|object $data the object or array that should be transformed
+ * @param int $statusCode the Http status code, defaults to 200
+ */
+ public function __construct($data=array(), $statusCode=Http::STATUS_OK) {
+ $this->data = $data;
+ $this->setStatus($statusCode);
+ $this->addHeader('X-Content-Type-Options', 'nosniff');
+ $this->addHeader('Content-type', 'application/json; charset=utf-8');
+ }
+
+
+ /**
+ * Returns the rendered json
+ * @return string the rendered json
+ */
+ public function render(){
+ return json_encode($this->data);
+ }
+
+ /**
+ * Sets values in the data json array
+ * @param array|object $params an array or object which will be transformed
+ * to JSON
+ */
+ public function setData($data){
+ $this->data = $data;
+ }
+
+
+ /**
+ * Used to get the set parameters
+ * @return array the data
+ */
+ public function getData(){
+ return $this->data;
+ }
+
+}
diff --git a/lib/public/appframework/http/response.php b/lib/public/appframework/http/response.php
new file mode 100644
index 00000000000..64477258948
--- /dev/null
+++ b/lib/public/appframework/http/response.php
@@ -0,0 +1,169 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt, Thomas Tanghus, Bart Visscher
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework\Http;
+
+
+/**
+ * Base class for responses. Also used to just send headers
+ */
+class Response {
+
+ /**
+ * @var array default headers
+ */
+ private $headers = array(
+ 'Cache-Control' => 'no-cache, must-revalidate'
+ );
+
+
+ /**
+ * @var string
+ */
+ private $status = Http::STATUS_OK;
+
+
+ /**
+ * @var \DateTime
+ */
+ private $lastModified;
+
+
+ /**
+ * @var string
+ */
+ private $ETag;
+
+
+ /**
+ * Caches the response
+ * @param int $cacheSeconds the amount of seconds that should be cached
+ * if 0 then caching will be disabled
+ */
+ public function cacheFor($cacheSeconds) {
+
+ if($cacheSeconds > 0) {
+ $this->addHeader('Cache-Control', 'max-age=' . $cacheSeconds .
+ ', must-revalidate');
+ } else {
+ $this->addHeader('Cache-Control', 'no-cache, must-revalidate');
+ }
+
+ }
+
+
+ /**
+ * Adds a new header to the response that will be called before the render
+ * function
+ * @param string $name The name of the HTTP header
+ * @param string $value The value, null will delete it
+ */
+ public function addHeader($name, $value) {
+ if(is_null($value)) {
+ unset($this->headers[$name]);
+ } else {
+ $this->headers[$name] = $value;
+ }
+ }
+
+
+ /**
+ * Returns the set headers
+ * @return array the headers
+ */
+ public function getHeaders() {
+ $mergeWith = array();
+
+ if($this->lastModified) {
+ $mergeWith['Last-Modified'] =
+ $this->lastModified->format(\DateTime::RFC2822);
+ }
+
+ if($this->ETag) {
+ $mergeWith['ETag'] = '"' . $this->ETag . '"';
+ }
+
+ return array_merge($mergeWith, $this->headers);
+ }
+
+
+ /**
+ * By default renders no output
+ * @return null
+ */
+ public function render() {
+ return null;
+ }
+
+
+ /**
+ * Set response status
+ * @param int $status a HTTP status code, see also the STATUS constants
+ */
+ public function setStatus($status) {
+ $this->status = $status;
+ }
+
+
+ /**
+ * Get response status
+ */
+ public function getStatus() {
+ return $this->status;
+ }
+
+
+ /**
+ * @return string the etag
+ */
+ public function getETag() {
+ return $this->ETag;
+ }
+
+
+ /**
+ * @return string RFC2822 formatted last modified date
+ */
+ public function getLastModified() {
+ return $this->lastModified;
+ }
+
+
+ /**
+ * @param string $ETag
+ */
+ public function setETag($ETag) {
+ $this->ETag = $ETag;
+ }
+
+
+ /**
+ * @param \DateTime $lastModified
+ */
+ public function setLastModified($lastModified) {
+ $this->lastModified = $lastModified;
+ }
+
+
+}
diff --git a/lib/public/appframework/http/templateresponse.php b/lib/public/appframework/http/templateresponse.php
new file mode 100644
index 00000000000..97678c96cba
--- /dev/null
+++ b/lib/public/appframework/http/templateresponse.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework\Http;
+
+use OC\AppFramework\Core\API;
+
+
+/**
+ * Response for a normal template
+ */
+class TemplateResponse extends Response {
+
+ protected $templateName;
+ protected $params;
+ protected $api;
+ protected $renderAs;
+ protected $appName;
+
+ /**
+ * @param API $api an API instance
+ * @param string $templateName the name of the template
+ * @param string $appName optional if you want to include a template from
+ * a different app
+ */
+ public function __construct(API $api, $templateName, $appName=null) {
+ $this->templateName = $templateName;
+ $this->appName = $appName;
+ $this->api = $api;
+ $this->params = array();
+ $this->renderAs = 'user';
+ }
+
+
+ /**
+ * Sets template parameters
+ * @param array $params an array with key => value structure which sets template
+ * variables
+ */
+ public function setParams(array $params){
+ $this->params = $params;
+ }
+
+
+ /**
+ * Used for accessing the set parameters
+ * @return array the params
+ */
+ public function getParams(){
+ return $this->params;
+ }
+
+
+ /**
+ * Used for accessing the name of the set template
+ * @return string the name of the used template
+ */
+ public function getTemplateName(){
+ return $this->templateName;
+ }
+
+
+ /**
+ * Sets the template page
+ * @param string $renderAs admin, user or blank. Admin also prints the admin
+ * settings header and footer, user renders the normal
+ * normal page including footer and header and blank
+ * just renders the plain template
+ */
+ public function renderAs($renderAs){
+ $this->renderAs = $renderAs;
+ }
+
+
+ /**
+ * Returns the set renderAs
+ * @return string the renderAs value
+ */
+ public function getRenderAs(){
+ return $this->renderAs;
+ }
+
+
+ /**
+ * Returns the rendered html
+ * @return string the rendered html
+ */
+ public function render(){
+
+ if($this->appName !== null){
+ $appName = $this->appName;
+ } else {
+ $appName = $this->api->getAppName();
+ }
+
+ $template = $this->api->getTemplate($this->templateName, $this->renderAs, $appName);
+
+ foreach($this->params as $key => $value){
+ $template->assign($key, $value);
+ }
+
+ return $template->fetchPage();
+ }
+
+}
diff --git a/lib/public/appframework/iapi.php b/lib/public/appframework/iapi.php
new file mode 100644
index 00000000000..fa6af5f5965
--- /dev/null
+++ b/lib/public/appframework/iapi.php
@@ -0,0 +1,151 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework;
+
+
+/**
+ * A few very basic and frequently used API functions are combined in here
+ */
+interface IApi {
+
+
+ /**
+ * Gets the userid of the current user
+ * @return string the user id of the current user
+ */
+ function getUserId();
+
+
+ /**
+ * Adds a new javascript file
+ * @param string $scriptName the name of the javascript in js/ without the suffix
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ function addScript($scriptName, $appName = null);
+
+
+ /**
+ * Adds a new css file
+ * @param string $styleName the name of the css file in css/without the suffix
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ function addStyle($styleName, $appName = null);
+
+
+ /**
+ * shorthand for addScript for files in the 3rdparty directory
+ * @param string $name the name of the file without the suffix
+ */
+ function add3rdPartyScript($name);
+
+
+ /**
+ * shorthand for addStyle for files in the 3rdparty directory
+ * @param string $name the name of the file without the suffix
+ */
+ function add3rdPartyStyle($name);
+
+ /**
+ * Returns the translation object
+ * @return \OC_L10N the translation object
+ *
+ * FIXME: returns private object / should be retrieved from teh ServerContainer
+ */
+ function getTrans();
+
+
+ /**
+ * Returns the URL for a route
+ * @param string $routeName the name of the route
+ * @param array $arguments an array with arguments which will be filled into the url
+ * @return string the url
+ */
+ function linkToRoute($routeName, $arguments=array());
+
+
+ /**
+ * Returns an URL for an image or file
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ function linkTo($file, $appName=null);
+
+
+ /**
+ * Returns the link to an image, like link to but only with prepending img/
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ */
+ function imagePath($file, $appName = null);
+
+
+ /**
+ * Makes an URL absolute
+ * @param string $url the url
+ * @return string the absolute url
+ *
+ * FIXME: function should live in Request / Response
+ */
+ function getAbsoluteURL($url);
+
+
+ /**
+ * links to a file
+ * @param string $file the name of the file
+ * @param string $appName the name of the app, defaults to the current one
+ * @deprecated replaced with linkToRoute()
+ * @return string the url
+ */
+ function linkToAbsolute($file, $appName = null);
+
+
+ /**
+ * Checks if an app is enabled
+ * @param string $appName the name of an app
+ * @return bool true if app is enabled
+ */
+ public function isAppEnabled($appName);
+
+
+ /**
+ * Writes a function into the error log
+ * @param string $msg the error message to be logged
+ * @param int $level the error level
+ *
+ * FIXME: add logger instance to ServerContainer
+ */
+ function log($msg, $level = null);
+
+
+ /**
+ * Returns a template
+ * @param string $templateName the name of the template
+ * @param string $renderAs how it should be rendered
+ * @param string $appName the name of the app
+ * @return \OCP\Template a new template
+ */
+ function getTemplate($templateName, $renderAs='user', $appName=null);
+
+}
diff --git a/lib/public/appframework/iappcontainer.php b/lib/public/appframework/iappcontainer.php
new file mode 100644
index 00000000000..7d3b4b3bac7
--- /dev/null
+++ b/lib/public/appframework/iappcontainer.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\AppFramework;
+
+use OCP\AppFramework\IApi;
+use OCP\IContainer;
+
+/**
+ * Class IAppContainer
+ * @package OCP\AppFramework
+ *
+ * This container interface provides short cuts for app developers to access predefined app service.
+ */
+interface IAppContainer extends IContainer{
+
+ /**
+ * used to return the appname of the set application
+ * @return string the name of your application
+ */
+ function getAppName();
+
+ /**
+ * @return IApi
+ */
+ function getCoreApi();
+
+ /**
+ * @return \OCP\IServerContainer
+ */
+ function getServer();
+
+ /**
+ * @param IMiddleWare $middleWare
+ * @return boolean
+ */
+ function registerMiddleWare(IMiddleWare $middleWare);
+}
diff --git a/lib/public/appframework/imiddleware.php b/lib/public/appframework/imiddleware.php
new file mode 100644
index 00000000000..1e76d3bbe49
--- /dev/null
+++ b/lib/public/appframework/imiddleware.php
@@ -0,0 +1,88 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OCP\AppFramework;
+use OCP\AppFramework\Http\Response;
+
+
+/**
+ * Middleware is used to provide hooks before or after controller methods and
+ * deal with possible exceptions raised in the controller methods.
+ * They're modeled after Django's middleware system:
+ * https://docs.djangoproject.com/en/dev/topics/http/middleware/
+ */
+interface IMiddleWare {
+
+
+ /**
+ * This is being run in normal order before the controller is being
+ * called which allows several modifications and checks
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ */
+ function beforeController($controller, $methodName);
+
+
+ /**
+ * This is being run when either the beforeController method or the
+ * controller method itself is throwing an exception. The middleware is
+ * asked in reverse order to handle the exception and to return a response.
+ * If the response is null, it is assumed that the exception could not be
+ * handled and the error will be thrown again
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param \Exception $exception the thrown exception
+ * @throws \Exception the passed in exception if it cant handle it
+ * @return Response a Response object in case that the exception was handled
+ */
+ function afterException($controller, $methodName, \Exception $exception);
+
+ /**
+ * This is being run after a successful controller method call and allows
+ * the manipulation of a Response object. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param Response $response the generated response from the controller
+ * @return Response a Response object
+ */
+ function afterController($controller, $methodName, Response $response);
+
+ /**
+ * This is being run after the response object has been rendered and
+ * allows the manipulation of the output. The middleware is run in reverse order
+ *
+ * @param Controller $controller the controller that is being called
+ * @param string $methodName the name of the method that will be called on
+ * the controller
+ * @param string $output the generated output from a response
+ * @return string the output that should be printed
+ */
+ function beforeOutput($controller, $methodName, $output);
+}
diff --git a/lib/public/contacts.php b/lib/public/contacts.php
index 88d812e735a..1b61d7aa4ff 100644
--- a/lib/public/contacts.php
+++ b/lib/public/contacts.php
@@ -90,13 +90,8 @@ namespace OCP {
* @return array of contacts which are arrays of key-value-pairs
*/
public static function search($pattern, $searchProperties = array(), $options = array()) {
- $result = array();
- foreach(self::$address_books as $address_book) {
- $r = $address_book->search($pattern, $searchProperties, $options);
- $result = array_merge($result, $r);
- }
-
- return $result;
+ $cm = \OC::$server->getContactsManager();
+ return $cm->search($pattern, $searchProperties, $options);
}
/**
@@ -107,14 +102,8 @@ namespace OCP {
* @return bool successful or not
*/
public static function delete($id, $address_book_key) {
- if (!array_key_exists($address_book_key, self::$address_books))
- return null;
-
- $address_book = self::$address_books[$address_book_key];
- if ($address_book->getPermissions() & \OCP\PERMISSION_DELETE)
- return null;
-
- return $address_book->delete($id);
+ $cm = \OC::$server->getContactsManager();
+ return $cm->delete($id, $address_book_key);
}
/**
@@ -126,15 +115,8 @@ namespace OCP {
* @return array representing the contact just created or updated
*/
public static function createOrUpdate($properties, $address_book_key) {
-
- if (!array_key_exists($address_book_key, self::$address_books))
- return null;
-
- $address_book = self::$address_books[$address_book_key];
- if ($address_book->getPermissions() & \OCP\PERMISSION_CREATE)
- return null;
-
- return $address_book->createOrUpdate($properties);
+ $cm = \OC::$server->getContactsManager();
+ return $cm->search($properties, $address_book_key);
}
/**
@@ -143,45 +125,40 @@ namespace OCP {
* @return bool true if enabled, false if not
*/
public static function isEnabled() {
- return !empty(self::$address_books);
+ $cm = \OC::$server->getContactsManager();
+ return $cm->isEnabled();
}
/**
* @param \OCP\IAddressBook $address_book
*/
public static function registerAddressBook(\OCP\IAddressBook $address_book) {
- self::$address_books[$address_book->getKey()] = $address_book;
+ $cm = \OC::$server->getContactsManager();
+ return $cm->registerAddressBook($address_book);
}
/**
* @param \OCP\IAddressBook $address_book
*/
public static function unregisterAddressBook(\OCP\IAddressBook $address_book) {
- unset(self::$address_books[$address_book->getKey()]);
+ $cm = \OC::$server->getContactsManager();
+ return $cm->unregisterAddressBook($address_book);
}
/**
* @return array
*/
public static function getAddressBooks() {
- $result = array();
- foreach(self::$address_books as $address_book) {
- $result[$address_book->getKey()] = $address_book->getDisplayName();
- }
-
- return $result;
+ $cm = \OC::$server->getContactsManager();
+ return $cm->getAddressBooks();
}
/**
* removes all registered address book instances
*/
public static function clear() {
- self::$address_books = array();
+ $cm = \OC::$server->getContactsManager();
+ $cm->clear();
}
-
- /**
- * @var \OCP\IAddressBook[] which holds all registered address books
- */
- private static $address_books = array();
}
}
diff --git a/lib/public/contacts/imanager.php b/lib/public/contacts/imanager.php
new file mode 100644
index 00000000000..3bfbca7be50
--- /dev/null
+++ b/lib/public/contacts/imanager.php
@@ -0,0 +1,150 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller thomas.mueller@tmit.eu
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * Public interface of ownCloud for apps to use.
+ * Contacts Class
+ *
+ */
+
+// use OCP namespace for all classes that are considered public.
+// This means that they should be used by apps instead of the internal ownCloud classes
+namespace OCP\Contacts {
+
+ /**
+ * This class provides access to the contacts app. Use this class exclusively if you want to access contacts.
+ *
+ * Contacts in general will be expressed as an array of key-value-pairs.
+ * The keys will match the property names defined in https://tools.ietf.org/html/rfc2426#section-1
+ *
+ * Proposed workflow for working with contacts:
+ * - search for the contacts
+ * - manipulate the results array
+ * - createOrUpdate will save the given contacts overwriting the existing data
+ *
+ * For updating it is mandatory to keep the id.
+ * Without an id a new contact will be created.
+ *
+ */
+ interface IManager {
+
+ /**
+ * This function is used to search and find contacts within the users address books.
+ * In case $pattern is empty all contacts will be returned.
+ *
+ * Example:
+ * Following function shows how to search for contacts for the name and the email address.
+ *
+ * public static function getMatchingRecipient($term) {
+ * $cm = \OC::$server->getContactsManager();
+ * // The API is not active -> nothing to do
+ * if (!$cm->isEnabled()) {
+ * return array();
+ * }
+ *
+ * $result = $cm->search($term, array('FN', 'EMAIL'));
+ * $receivers = array();
+ * foreach ($result as $r) {
+ * $id = $r['id'];
+ * $fn = $r['FN'];
+ * $email = $r['EMAIL'];
+ * if (!is_array($email)) {
+ * $email = array($email);
+ * }
+ *
+ * // loop through all email addresses of this contact
+ * foreach ($email as $e) {
+ * $displayName = $fn . " <$e>";
+ * $receivers[] = array(
+ * 'id' => $id,
+ * 'label' => $displayName,
+ * 'value' => $displayName);
+ * }
+ * }
+ *
+ * return $receivers;
+ * }
+ *
+ *
+ * @param string $pattern which should match within the $searchProperties
+ * @param array $searchProperties defines the properties within the query pattern should match
+ * @param array $options - for future use. One should always have options!
+ * @return array of contacts which are arrays of key-value-pairs
+ */
+ function search($pattern, $searchProperties = array(), $options = array());
+
+ /**
+ * This function can be used to delete the contact identified by the given id
+ *
+ * @param object $id the unique identifier to a contact
+ * @param $address_book_key
+ * @return bool successful or not
+ */
+ function delete($id, $address_book_key);
+
+ /**
+ * This function is used to create a new contact if 'id' is not given or not present.
+ * Otherwise the contact will be updated by replacing the entire data set.
+ *
+ * @param array $properties this array if key-value-pairs defines a contact
+ * @param $address_book_key string to identify the address book in which the contact shall be created or updated
+ * @return array representing the contact just created or updated
+ */
+ function createOrUpdate($properties, $address_book_key);
+
+ /**
+ * Check if contacts are available (e.g. contacts app enabled)
+ *
+ * @return bool true if enabled, false if not
+ */
+ function isEnabled();
+
+ /**
+ * @param \OCP\IAddressBook $address_book
+ */
+ function registerAddressBook(\OCP\IAddressBook $address_book);
+
+ /**
+ * @param \OCP\IAddressBook $address_book
+ */
+ function unregisterAddressBook(\OCP\IAddressBook $address_book);
+
+ /**
+ * In order to improve lazy loading a closure can be registered which will be called in case
+ * address books are actually requested
+ *
+ * @param string $key
+ * @param \Closure $callable
+ */
+ function register($key, \Closure $callable);
+
+ /**
+ * @return array
+ */
+ function getAddressBooks();
+
+ /**
+ * removes all registered address book instances
+ */
+ function clear();
+ }
+}
diff --git a/lib/public/icache.php b/lib/public/icache.php
new file mode 100644
index 00000000000..436ee71b2b9
--- /dev/null
+++ b/lib/public/icache.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+namespace OCP;
+
+/**
+ * This interface defines method for accessing the file based user cache.
+ */
+interface ICache {
+
+ /**
+ * Get a value from the user cache
+ *
+ * @param string $key
+ * @return mixed
+ */
+ public function get($key);
+
+ /**
+ * Set a value in the user cache
+ *
+ * @param string $key
+ * @param mixed $value
+ * @param int $ttl Time To Live in seconds. Defaults to 60*60*24
+ * @return bool
+ */
+ public function set($key, $value, $ttl = 0);
+
+ /**
+ * Check if a value is set in the user cache
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function hasKey($key);
+
+ /**
+ * Remove an item from the user cache
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function remove($key);
+
+ /**
+ * clear the user cache of all entries starting with a prefix
+ * @param string $prefix (optional)
+ * @return bool
+ */
+ public function clear($prefix = '');
+}
diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php
new file mode 100644
index 00000000000..850bddf6935
--- /dev/null
+++ b/lib/public/iconfig.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OCP;
+
+/**
+ * Access to all the configuration options ownCloud offers
+ */
+interface IConfig {
+ /**
+ * Sets a new system wide value
+ * @param string $key the key of the value, under which will be saved
+ * @param string $value the value that should be stored
+ * @todo need a use case for this
+ */
+// public function setSystemValue($key, $value);
+
+ /**
+ * Looks up a system wide defined value
+ * @param string $key the key of the value, under which it was saved
+ * @return string the saved value
+ */
+ public function getSystemValue($key);
+
+
+ /**
+ * Writes a new app wide value
+ * @param string $appName the appName that we want to store the value under
+ * @param string $key the key of the value, under which will be saved
+ * @param string $value the value that should be stored
+ */
+ public function setAppValue($appName, $key, $value);
+
+ /**
+ * Looks up an app wide defined value
+ * @param string $appName the appName that we stored the value under
+ * @param string $key the key of the value, under which it was saved
+ * @return string the saved value
+ */
+ public function getAppValue($appName, $key);
+
+
+ /**
+ * Set a user defined value
+ * @param string $userId the userId of the user that we want to store the value under
+ * @param string $appName the appName that we want to store the value under
+ * @param string $key the key under which the value is being stored
+ * @param string $value the value that you want to store
+ */
+ public function setUserValue($userId, $appName, $key, $value);
+
+ /**
+ * Shortcut for getting a user defined value
+ * @param string $userId the userId of the user that we want to store the value under
+ * @param string $appName the appName that we stored the value under
+ * @param string $key the key under which the value is being stored
+ */
+ public function getUserValue($userId, $appName, $key);
+}
diff --git a/lib/public/icontainer.php b/lib/public/icontainer.php
new file mode 100644
index 00000000000..d43c1c90f11
--- /dev/null
+++ b/lib/public/icontainer.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP;
+
+/**
+ * Class IContainer
+ *
+ * IContainer is the basic interface to be used for any internal dependency injection mechanism
+ *
+ * @package OCP
+ */
+interface IContainer {
+
+ /**
+ * Look up a service for a given name in the container.
+ *
+ * @param string $name
+ * @return mixed
+ */
+ function query($name);
+
+ /**
+ * A value is stored in the container with it's corresponding name
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return void
+ */
+ function registerParameter($name, $value);
+
+ /**
+ * A service is registered in the container where a closure is passed in which will actually
+ * create the service on demand.
+ * In case the parameter $shared is set to true (the default usage) the once created service will remain in
+ * memory and be reused on subsequent calls.
+ * In case the parameter is false the service will be recreated on every call.
+ *
+ * @param string $name
+ * @param callable $closure
+ * @param bool $shared
+ * @return void
+ */
+ function registerService($name, \Closure $closure, $shared = true);
+}
diff --git a/lib/public/idbconnection.php b/lib/public/idbconnection.php
new file mode 100644
index 00000000000..c741a0f061a
--- /dev/null
+++ b/lib/public/idbconnection.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OCP;
+
+/**
+ * TODO: Description
+ */
+interface IDBConnection {
+ /**
+ * Used to abstract the owncloud database access away
+ * @param string $sql the sql query with ? placeholder for params
+ * @param int $limit the maximum number of rows
+ * @param int $offset from which row we want to start
+ * @return \Doctrine\DBAL\Driver\Statement The prepared statement.
+ */
+ public function prepare($sql, $limit=null, $offset=null);
+
+ /**
+ * Used to get the id of the just inserted element
+ * @param string $tableName the name of the table where we inserted the item
+ * @return int the id of the inserted element
+ */
+ public function lastInsertId($table = null);
+
+ /**
+ * @brief Insert a row if a matching row doesn't exists.
+ * @param $table string The table name (will replace *PREFIX*) to perform the replace on.
+ * @param $input array
+ *
+ * The input array if in the form:
+ *
+ * array ( 'id' => array ( 'value' => 6,
+ * 'key' => true
+ * ),
+ * 'name' => array ('value' => 'Stoyan'),
+ * 'family' => array ('value' => 'Stefanov'),
+ * 'birth_date' => array ('value' => '1975-06-20')
+ * );
+ * @return bool
+ *
+ */
+ public function insertIfNotExist($table, $input);
+
+ /**
+ * @brief Start a transaction
+ * @return bool TRUE on success or FALSE on failure
+ */
+ public function beginTransaction();
+
+ /**
+ * @brief Commit the database changes done during a transaction that is in progress
+ * @return bool TRUE on success or FALSE on failure
+ */
+ public function commit();
+
+ /**
+ * @brief Rollback the database changes done during a transaction that is in progress
+ * @return bool TRUE on success or FALSE on failure
+ */
+ public function rollBack();
+
+ /**
+ * returns the error code and message as a string for logging
+ * @return string
+ */
+ public function getError();
+}
diff --git a/lib/public/inavigationmanager.php b/lib/public/inavigationmanager.php
new file mode 100644
index 00000000000..f89e790c1d0
--- /dev/null
+++ b/lib/public/inavigationmanager.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OCP;
+
+/**
+ * Manages the ownCloud navigation
+ */
+interface INavigationManager {
+ /**
+ * Creates a new navigation entry
+ * @param array $entry containing: id, name, order, icon and href key
+ */
+ public function add(array $entry);
+
+ /**
+ * Sets the current navigation entry of the currently running app
+ * @param string $appId id of the app entry to activate (from added $entry)
+ */
+ public function setActiveEntry($appId);
+}
diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php
new file mode 100644
index 00000000000..b01e7f5b539
--- /dev/null
+++ b/lib/public/ipreview.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
+ * Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+namespace OCP;
+
+/**
+ * This class provides functions to render and show thumbnails and previews of files
+ */
+interface IPreview
+{
+
+ /**
+ * @brief return a preview of a file
+ * @param string $file The path to the file where you want a thumbnail from
+ * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
+ * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
+ * @return \OCP\Image
+ */
+ function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
+
+
+ /**
+ * @brief returns true if the passed mime type is supported
+ * @param string $mimeType
+ * @return boolean
+ */
+ function isMimeSupported($mimeType = '*');
+
+}
diff --git a/lib/public/irequest.php b/lib/public/irequest.php
new file mode 100644
index 00000000000..9f335b06f2a
--- /dev/null
+++ b/lib/public/irequest.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP;
+
+
+interface IRequest {
+
+ function getHeader($name);
+
+ /**
+ * Lets you access post and get parameters by the index
+ * In case of json requests the encoded json body is accessed
+ *
+ * @param string $key the key which you want to access in the URL Parameter
+ * placeholder, $_POST or $_GET array.
+ * The priority how they're returned is the following:
+ * 1. URL parameters
+ * 2. POST parameters
+ * 3. GET parameters
+ * @param mixed $default If the key is not found, this value will be returned
+ * @return mixed the content of the array
+ */
+ public function getParam($key, $default = null);
+
+
+ /**
+ * Returns all params that were received, be it from the request
+ *
+ * (as GET or POST) or through the URL by the route
+ * @return array the array with all parameters
+ */
+ public function getParams();
+
+ /**
+ * Returns the method of the request
+ *
+ * @return string the method of the request (POST, GET, etc)
+ */
+ public function getMethod();
+
+ /**
+ * Shortcut for accessing an uploaded file through the $_FILES array
+ *
+ * @param string $key the key that will be taken from the $_FILES array
+ * @return array the file in the $_FILES element
+ */
+ public function getUploadedFile($key);
+
+
+ /**
+ * Shortcut for getting env variables
+ *
+ * @param string $key the key that will be taken from the $_ENV array
+ * @return array the value in the $_ENV element
+ */
+ public function getEnv($key);
+
+
+ /**
+ * Shortcut for getting cookie variables
+ *
+ * @param string $key the key that will be taken from the $_COOKIE array
+ * @return array the value in the $_COOKIE element
+ */
+ function getCookie($key);
+
+
+ /**
+ * Returns the request body content.
+ *
+ * @param Boolean $asResource If true, a resource will be returned
+ * @return string|resource The request body content or a resource to read the body stream.
+ * @throws \LogicException
+ */
+ function getContent($asResource = false);
+}
diff --git a/lib/public/iservercontainer.php b/lib/public/iservercontainer.php
new file mode 100644
index 00000000000..f4045faefef
--- /dev/null
+++ b/lib/public/iservercontainer.php
@@ -0,0 +1,125 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Thomas Müller
+ * @copyright 2013 Thomas Müller deepdiver@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP;
+
+
+/**
+ * Class IServerContainer
+ * @package OCP
+ *
+ * This container holds all ownCloud services
+ */
+interface IServerContainer {
+
+ /**
+ * The contacts manager will act as a broker between consumers for contacts information and
+ * providers which actual deliver the contact information.
+ *
+ * @return \OCP\Contacts\IManager
+ */
+ function getContactsManager();
+
+ /**
+ * The current request object holding all information about the request currently being processed
+ * is returned from this method.
+ * In case the current execution was not initiated by a web request null is returned
+ *
+ * @return \OCP\IRequest|null
+ */
+ function getRequest();
+
+ /**
+ * Returns the preview manager which can create preview images for a given file
+ *
+ * @return \OCP\IPreview
+ */
+ function getPreviewManager();
+
+ /**
+ * Returns the tag manager which can get and set tags for different object types
+ *
+ * @see \OCP\ITagManager::load()
+ * @return \OCP\ITagManager
+ */
+ function getTagManager();
+
+ /**
+ * Returns the root folder of ownCloud's data directory
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getRootFolder();
+
+ /**
+ * Returns a view to ownCloud's files folder
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getUserFolder();
+
+ /**
+ * Returns an app-specific view in ownClouds data directory
+ *
+ * @return \OCP\Files\Folder
+ */
+ function getAppFolder();
+
+ /**
+ * Returns the user session
+ *
+ * @return \OCP\IUserSession
+ */
+ function getUserSession();
+
+ /**
+ * @return \OCP\INavigationManager
+ */
+ function getNavigationManager();
+
+ /**
+ * @return \OCP\IConfig
+ */
+ function getConfig();
+
+ /**
+ * Returns an ICache instance
+ *
+ * @return \OCP\ICache
+ */
+ function getCache();
+
+ /**
+ * Returns the current session
+ *
+ * @return \OCP\ISession
+ */
+ function getSession();
+
+ /**
+ * Returns the current session
+ *
+ * @return \OCP\IDBConnection
+ */
+ function getDatabaseConnection();
+
+}
diff --git a/lib/public/isession.php b/lib/public/isession.php
new file mode 100644
index 00000000000..0a77b0c823b
--- /dev/null
+++ b/lib/public/isession.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * @author Thomas Tanghus
+ * @author Robin Appelman
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OCP;
+
+/**
+ * Interface ISession
+ *
+ * wrap PHP's internal session handling into the ISession interface
+ */
+interface ISession {
+
+ /**
+ * Set a value in the session
+ *
+ * @param string $key
+ * @param mixed $value
+ */
+ public function set($key, $value);
+
+ /**
+ * Get a value from the session
+ *
+ * @param string $key
+ * @return mixed should return null if $key does not exist
+ */
+ public function get($key);
+
+ /**
+ * Check if a named key exists in the session
+ *
+ * @param string $key
+ * @return bool
+ */
+ public function exists($key);
+
+ /**
+ * Remove a $key/$value pair from the session
+ *
+ * @param string $key
+ */
+ public function remove($key);
+
+ /**
+ * Reset and recreate the session
+ */
+ public function clear();
+
+}
diff --git a/lib/public/itagmanager.php b/lib/public/itagmanager.php
new file mode 100644
index 00000000000..07e1d12fc0f
--- /dev/null
+++ b/lib/public/itagmanager.php
@@ -0,0 +1,48 @@
+<?php
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+/**
+ * Factory class creating instances of \OCP\ITags
+ *
+ * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
+ * anything else that is either parsed from a vobject or that the user chooses
+ * to add.
+ * Tag names are not case-sensitive, but will be saved with the case they
+ * are entered in. If a user already has a tag 'family' for a type, and
+ * tries to add a tag named 'Family' it will be silently ignored.
+ */
+
+namespace OCP;
+
+interface ITagManager {
+
+ /**
+ * Create a new \OCP\ITags instance and load tags from db.
+ *
+ * @see \OCP\ITags
+ * @param string $type The type identifier e.g. 'contact' or 'event'.
+ * @param array $defaultTags An array of default tags to be used if none are stored.
+ * @return \OCP\ITags
+ */
+ public function load($type, $defaultTags=array());
+
+} \ No newline at end of file
diff --git a/lib/public/itags.php b/lib/public/itags.php
new file mode 100644
index 00000000000..5b1ebd189da
--- /dev/null
+++ b/lib/public/itags.php
@@ -0,0 +1,164 @@
+<?php
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2013 Thomas Tanghus <thomas@tanghus.net>
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+namespace OCP;
+
+// FIXME: Where should I put this? Or should it be implemented as a Listener?
+\OC_Hook::connect('OC_User', 'post_deleteUser', 'OC\Tags', 'post_deleteUser');
+
+/**
+ * Class for easily tagging objects by their id
+ *
+ * A tag can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
+ * anything else that is either parsed from a vobject or that the user chooses
+ * to add.
+ * Tag names are not case-sensitive, but will be saved with the case they
+ * are entered in. If a user already has a tag 'family' for a type, and
+ * tries to add a tag named 'Family' it will be silently ignored.
+ */
+
+interface ITags {
+
+ /**
+ * Check if any tags are saved for this type and user.
+ *
+ * @return boolean.
+ */
+ public function isEmpty();
+
+ /**
+ * Get the tags for a specific user.
+ *
+ * This returns an array with id/name maps:
+ * [
+ * ['id' => 0, 'name' = 'First tag'],
+ * ['id' => 1, 'name' = 'Second tag'],
+ * ]
+ *
+ * @returns array
+ */
+ public function getTags();
+
+ /**
+ * Get the a list if items tagged with $tag.
+ *
+ * Throws an exception if the tag could not be found.
+ *
+ * @param string|integer $tag Tag id or name.
+ * @return array An array of object ids or false on error.
+ */
+ public function getIdsForTag($tag);
+
+ /**
+ * Checks whether a tag is already saved.
+ *
+ * @param string $name The name to check for.
+ * @return bool
+ */
+ public function hasTag($name);
+
+ /**
+ * Add a new tag.
+ *
+ * @param string $name A string with a name of the tag
+ * @return int the id of the added tag or false if it already exists.
+ */
+ public function add($name);
+
+ /**
+ * Rename tag.
+ *
+ * @param string $from The name of the existing tag
+ * @param string $to The new name of the tag.
+ * @return bool
+ */
+ public function rename($from, $to);
+
+ /**
+ * Add a list of new tags.
+ *
+ * @param string[] $names A string with a name or an array of strings containing
+ * the name(s) of the to add.
+ * @param bool $sync When true, save the tags
+ * @param int|null $id int Optional object id to add to this|these tag(s)
+ * @return bool Returns false on error.
+ */
+ public function addMultiple($names, $sync=false, $id = null);
+
+ /**
+ * Delete tag/object relations from the db
+ *
+ * @param array $ids The ids of the objects
+ * @return boolean Returns false on error.
+ */
+ public function purgeObjects(array $ids);
+
+ /**
+ * Get favorites for an object type
+ *
+ * @return array An array of object ids.
+ */
+ public function getFavorites();
+
+ /**
+ * Add an object to favorites
+ *
+ * @param int $objid The id of the object
+ * @return boolean
+ */
+ public function addToFavorites($objid);
+
+ /**
+ * Remove an object from favorites
+ *
+ * @param int $objid The id of the object
+ * @return boolean
+ */
+ public function removeFromFavorites($objid);
+
+ /**
+ * Creates a tag/object relation.
+ *
+ * @param int $objid The id of the object
+ * @param int|string $tag The id or name of the tag
+ * @return boolean Returns false on database error.
+ */
+ public function tagAs($objid, $tag);
+
+ /**
+ * Delete single tag/object relation from the db
+ *
+ * @param int $objid The id of the object
+ * @param int|string $tag The id or name of the tag
+ * @return boolean
+ */
+ public function unTag($objid, $tag);
+
+ /**
+ * Delete tags from the
+ *
+ * @param string[] $names An array of tags to delete
+ * @return bool Returns false on error
+ */
+ public function delete($names);
+
+} \ No newline at end of file
diff --git a/lib/public/iusersession.php b/lib/public/iusersession.php
new file mode 100644
index 00000000000..5dc1ecf71e6
--- /dev/null
+++ b/lib/public/iusersession.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Copyright (c) 2013 Bart Visscher <bartv@thisnet.nl>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ *
+ */
+
+namespace OCP;
+
+/**
+ * User session
+ */
+interface IUserSession {
+ /**
+ * Do a user login
+ * @param string $user the username
+ * @param string $password the password
+ * @return bool true if successful
+ */
+ public function login($user, $password);
+
+ /**
+ * @brief Logs the user out including all the session data
+ * Logout, destroys session
+ */
+ public function logout();
+
+}
diff --git a/lib/public/preview.php b/lib/public/preview.php
deleted file mode 100644
index 7588347eccb..00000000000
--- a/lib/public/preview.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
- * Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-namespace OCP;
-
-/**
- * This class provides functions to render and show thumbnails and previews of files
- */
-class Preview {
-
- /**
- * @brief return a preview of a file
- * @param $file The path to the file where you want a thumbnail from
- * @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image
- * @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
- * @param $scaleup Scale smaller images up to the thumbnail size or not. Might look ugly
- * @return image
- */
- public static function show($file,$maxX=100,$maxY=75,$scaleup=false) {
- return(\OC\Preview::show($file,$maxX,$maxY,$scaleup));
- }
-
-
-
- public static function isMimeSupported($mimetype='*') {
- return \OC\Preview::isMimeSupported($mimetype);
- }
-
-}
diff --git a/lib/public/share.php b/lib/public/share.php
index be61d046f0b..e6a74117aa2 100644
--- a/lib/public/share.php
+++ b/lib/public/share.php
@@ -342,7 +342,18 @@ class Share {
if (\OC_DB::isError($result)) {
\OC_Log::write('OCP\Share', \OC_DB::getErrorMessage($result) . ', token=' . $token, \OC_Log::ERROR);
}
- return $result->fetchRow();
+ $row = $result->fetchRow();
+
+ if (!empty($row['expiration'])) {
+ $now = new \DateTime();
+ $expirationDate = new \DateTime($row['expiration'], new \DateTimeZone('UTC'));
+ if ($now > $expirationDate) {
+ self::delete($row['id']);
+ return false;
+ }
+ }
+
+ return $row;
}
/**
@@ -821,10 +832,10 @@ class Share {
/**
* @brief Get the backend class for the specified item type
- * @param string Item type
- * @return Sharing backend object
+ * @param string $itemType
+ * @return Share_Backend
*/
- private static function getBackend($itemType) {
+ public static function getBackend($itemType) {
if (isset(self::$backends[$itemType])) {
return self::$backends[$itemType];
} else if (isset(self::$backendTypes[$itemType]['class'])) {
diff --git a/lib/public/user.php b/lib/public/user.php
index 23ff991642d..576a64d7048 100644
--- a/lib/public/user.php
+++ b/lib/public/user.php
@@ -102,7 +102,7 @@ class User {
* @brief Check if the password is correct
* @param $uid The username
* @param $password The password
- * @returns true/false
+ * @returns mixed username on success, false otherwise
*
* Check if the password is correct without logging in the user
*/
diff --git a/lib/vcategories.php b/lib/vcategories.php
deleted file mode 100644
index 84036958359..00000000000
--- a/lib/vcategories.php
+++ /dev/null
@@ -1,821 +0,0 @@
-<?php
-/**
-* ownCloud
-*
-* @author Thomas Tanghus
-* @copyright 2012 Thomas Tanghus <thomas@tanghus.net>
-* @copyright 2012 Bart Visscher bartv@thisnet.nl
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_VCategories', 'post_deleteUser');
-
-/**
- * Class for easy access to categories in VCARD, VEVENT, VTODO and VJOURNAL.
- * A Category can be e.g. 'Family', 'Work', 'Chore', 'Special Occation' or
- * anything else that is either parsed from a vobject or that the user chooses
- * to add.
- * Category names are not case-sensitive, but will be saved with the case they
- * are entered in. If a user already has a category 'family' for a type, and
- * tries to add a category named 'Family' it will be silently ignored.
- */
-class OC_VCategories {
-
- /**
- * Categories
- */
- private $categories = array();
-
- /**
- * Used for storing objectid/categoryname pairs while rescanning.
- */
- private static $relations = array();
-
- private $type = null;
- private $user = null;
-
- const CATEGORY_TABLE = '*PREFIX*vcategory';
- const RELATION_TABLE = '*PREFIX*vcategory_to_object';
-
- const CATEGORY_FAVORITE = '_$!<Favorite>!$_';
-
- const FORMAT_LIST = 0;
- const FORMAT_MAP = 1;
-
- /**
- * @brief Constructor.
- * @param $type The type identifier e.g. 'contact' or 'event'.
- * @param $user The user whos data the object will operate on. This
- * parameter should normally be omitted but to make an app able to
- * update categories for all users it is made possible to provide it.
- * @param $defcategories An array of default categories to be used if none is stored.
- */
- public function __construct($type, $user=null, $defcategories=array()) {
- $this->type = $type;
- $this->user = is_null($user) ? OC_User::getUser() : $user;
-
- $this->loadCategories();
- OCP\Util::writeLog('core', __METHOD__ . ', categories: '
- . print_r($this->categories, true),
- OCP\Util::DEBUG
- );
-
- if($defcategories && count($this->categories) === 0) {
- $this->addMulti($defcategories, true);
- }
- }
-
- /**
- * @brief Load categories from db.
- */
- private function loadCategories() {
- $this->categories = array();
- $result = null;
- $sql = 'SELECT `id`, `category` FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ? AND `type` = ? ORDER BY `category`';
- try {
- $stmt = OCP\DB::prepare($sql);
- $result = $stmt->execute(array($this->user, $this->type));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
-
- if(!is_null($result)) {
- while( $row = $result->fetchRow()) {
- // The keys are prefixed because array_search wouldn't work otherwise :-/
- $this->categories[$row['id']] = $row['category'];
- }
- }
- OCP\Util::writeLog('core', __METHOD__.', categories: ' . print_r($this->categories, true),
- OCP\Util::DEBUG);
- }
-
-
- /**
- * @brief Check if any categories are saved for this type and user.
- * @returns boolean.
- * @param $type The type identifier e.g. 'contact' or 'event'.
- * @param $user The user whos categories will be checked. If not set current user will be used.
- */
- public static function isEmpty($type, $user = null) {
- $user = is_null($user) ? OC_User::getUser() : $user;
- $sql = 'SELECT COUNT(*) FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ? AND `type` = ?';
- try {
- $stmt = OCP\DB::prepare($sql);
- $result = $stmt->execute(array($user, $type));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- return ($result->numRows() === 0);
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- }
-
- /**
- * @brief Get the categories for a specific user.
- * @param
- * @returns array containing the categories as strings.
- */
- public function categories($format = null) {
- if(!$this->categories) {
- return array();
- }
- $categories = array_values($this->categories);
- uasort($categories, 'strnatcasecmp');
- if($format == self::FORMAT_MAP) {
- $catmap = array();
- foreach($categories as $category) {
- if($category !== self::CATEGORY_FAVORITE) {
- $catmap[] = array(
- 'id' => $this->array_searchi($category, $this->categories),
- 'name' => $category
- );
- }
- }
- return $catmap;
- }
-
- // Don't add favorites to normal categories.
- $favpos = array_search(self::CATEGORY_FAVORITE, $categories);
- if($favpos !== false) {
- return array_splice($categories, $favpos);
- } else {
- return $categories;
- }
- }
-
- /**
- * Get the a list if items belonging to $category.
- *
- * Throws an exception if the category could not be found.
- *
- * @param string|integer $category Category id or name.
- * @returns array An array of object ids or false on error.
- */
- public function idsForCategory($category) {
- $result = null;
- if(is_numeric($category)) {
- $catid = $category;
- } elseif(is_string($category)) {
- $catid = $this->array_searchi($category, $this->categories);
- }
- OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG);
- if($catid === false) {
- $l10n = OC_L10N::get('core');
- throw new Exception(
- $l10n->t('Could not find category "%s"', $category)
- );
- }
-
- $ids = array();
- $sql = 'SELECT `objid` FROM `' . self::RELATION_TABLE
- . '` WHERE `categoryid` = ?';
-
- try {
- $stmt = OCP\DB::prepare($sql);
- $result = $stmt->execute(array($catid));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
-
- if(!is_null($result)) {
- while( $row = $result->fetchRow()) {
- $ids[] = (int)$row['objid'];
- }
- }
-
- return $ids;
- }
-
- /**
- * Get the a list if items belonging to $category.
- *
- * Throws an exception if the category could not be found.
- *
- * @param string|integer $category Category id or name.
- * @param array $tableinfo Array in the form {'tablename' => table, 'fields' => ['field1', 'field2']}
- * @param int $limit
- * @param int $offset
- *
- * This generic method queries a table assuming that the id
- * field is called 'id' and the table name provided is in
- * the form '*PREFIX*table_name'.
- *
- * If the category name cannot be resolved an exception is thrown.
- *
- * TODO: Maybe add the getting permissions for objects?
- *
- * @returns array containing the resulting items or false on error.
- */
- public function itemsForCategory($category, $tableinfo, $limit = null, $offset = null) {
- $result = null;
- if(is_numeric($category)) {
- $catid = $category;
- } elseif(is_string($category)) {
- $catid = $this->array_searchi($category, $this->categories);
- }
- OCP\Util::writeLog('core', __METHOD__.', category: '.$catid.' '.$category, OCP\Util::DEBUG);
- if($catid === false) {
- $l10n = OC_L10N::get('core');
- throw new Exception(
- $l10n->t('Could not find category "%s"', $category)
- );
- }
- $fields = '';
- foreach($tableinfo['fields'] as $field) {
- $fields .= '`' . $tableinfo['tablename'] . '`.`' . $field . '`,';
- }
- $fields = substr($fields, 0, -1);
-
- $items = array();
- $sql = 'SELECT `' . self::RELATION_TABLE . '`.`categoryid`, ' . $fields
- . ' FROM `' . $tableinfo['tablename'] . '` JOIN `'
- . self::RELATION_TABLE . '` ON `' . $tableinfo['tablename']
- . '`.`id` = `' . self::RELATION_TABLE . '`.`objid` WHERE `'
- . self::RELATION_TABLE . '`.`categoryid` = ?';
-
- try {
- $stmt = OCP\DB::prepare($sql, $limit, $offset);
- $result = $stmt->execute(array($catid));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
-
- if(!is_null($result)) {
- while( $row = $result->fetchRow()) {
- $items[] = $row;
- }
- }
- //OCP\Util::writeLog('core', __METHOD__.', count: ' . count($items), OCP\Util::DEBUG);
- //OCP\Util::writeLog('core', __METHOD__.', sql: ' . $sql, OCP\Util::DEBUG);
-
- return $items;
- }
-
- /**
- * @brief Checks whether a category is already saved.
- * @param $name The name to check for.
- * @returns bool
- */
- public function hasCategory($name) {
- return $this->in_arrayi($name, $this->categories);
- }
-
- /**
- * @brief Add a new category.
- * @param $name A string with a name of the category
- * @returns int the id of the added category or false if it already exists.
- */
- public function add($name) {
- OCP\Util::writeLog('core', __METHOD__.', name: ' . $name, OCP\Util::DEBUG);
- if($this->hasCategory($name)) {
- OCP\Util::writeLog('core', __METHOD__.', name: ' . $name. ' exists already', OCP\Util::DEBUG);
- return false;
- }
- try {
- OCP\DB::insertIfNotExist(self::CATEGORY_TABLE,
- array(
- 'uid' => $this->user,
- 'type' => $this->type,
- 'category' => $name,
- ));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- $id = OCP\DB::insertid(self::CATEGORY_TABLE);
- OCP\Util::writeLog('core', __METHOD__.', id: ' . $id, OCP\Util::DEBUG);
- $this->categories[$id] = $name;
- return $id;
- }
-
- /**
- * @brief Rename category.
- * @param string $from The name of the existing category
- * @param string $to The new name of the category.
- * @returns bool
- */
- public function rename($from, $to) {
- $id = $this->array_searchi($from, $this->categories);
- if($id === false) {
- OCP\Util::writeLog('core', __METHOD__.', category: ' . $from. ' does not exist', OCP\Util::DEBUG);
- return false;
- }
-
- $sql = 'UPDATE `' . self::CATEGORY_TABLE . '` SET `category` = ? '
- . 'WHERE `uid` = ? AND `type` = ? AND `id` = ?';
- try {
- $stmt = OCP\DB::prepare($sql);
- $result = $stmt->execute(array($to, $this->user, $this->type, $id));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- $this->categories[$id] = $to;
- return true;
- }
-
- /**
- * @brief Add a new category.
- * @param $names A string with a name or an array of strings containing
- * the name(s) of the categor(y|ies) to add.
- * @param $sync bool When true, save the categories
- * @param $id int Optional object id to add to this|these categor(y|ies)
- * @returns bool Returns false on error.
- */
- public function addMulti($names, $sync=false, $id = null) {
- if(!is_array($names)) {
- $names = array($names);
- }
- $names = array_map('trim', $names);
- $newones = array();
- foreach($names as $name) {
- if(($this->in_arrayi(
- $name, $this->categories) == false) && $name != '') {
- $newones[] = $name;
- }
- if(!is_null($id) ) {
- // Insert $objectid, $categoryid pairs if not exist.
- self::$relations[] = array('objid' => $id, 'category' => $name);
- }
- }
- $this->categories = array_merge($this->categories, $newones);
- if($sync === true) {
- $this->save();
- }
-
- return true;
- }
-
- /**
- * @brief Extracts categories from a vobject and add the ones not already present.
- * @param $vobject The instance of OC_VObject to load the categories from.
- */
- public function loadFromVObject($id, $vobject, $sync=false) {
- $this->addMulti($vobject->getAsArray('CATEGORIES'), $sync, $id);
- }
-
- /**
- * @brief Reset saved categories and rescan supplied vobjects for categories.
- * @param $objects An array of vobjects (as text).
- * To get the object array, do something like:
- * // For Addressbook:
- * $categories = new OC_VCategories('contacts');
- * $stmt = OC_DB::prepare( 'SELECT `carddata` FROM `*PREFIX*contacts_cards`' );
- * $result = $stmt->execute();
- * $objects = array();
- * if(!is_null($result)) {
- * while( $row = $result->fetchRow()){
- * $objects[] = array($row['id'], $row['carddata']);
- * }
- * }
- * $categories->rescan($objects);
- */
- public function rescan($objects, $sync=true, $reset=true) {
-
- if($reset === true) {
- $result = null;
- // Find all objectid/categoryid pairs.
- try {
- $stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ? AND `type` = ?');
- $result = $stmt->execute(array($this->user, $this->type));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
-
- // And delete them.
- if(!is_null($result)) {
- $stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
- . 'WHERE `categoryid` = ? AND `type`= ?');
- while( $row = $result->fetchRow()) {
- $stmt->execute(array($row['id'], $this->type));
- }
- }
- try {
- $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ? AND `type` = ?');
- $result = $stmt->execute(array($this->user, $this->type));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__ . ', exception: '
- . $e->getMessage(), OCP\Util::ERROR);
- return;
- }
- $this->categories = array();
- }
- // Parse all the VObjects
- foreach($objects as $object) {
- $vobject = OC_VObject::parse($object[1]);
- if(!is_null($vobject)) {
- // Load the categories
- $this->loadFromVObject($object[0], $vobject, $sync);
- } else {
- OC_Log::write('core', __METHOD__ . ', unable to parse. ID: ' . ', '
- . substr($object, 0, 100) . '(...)', OC_Log::DEBUG);
- }
- }
- $this->save();
- }
-
- /**
- * @brief Save the list with categories
- */
- private function save() {
- if(is_array($this->categories)) {
- foreach($this->categories as $category) {
- try {
- OCP\DB::insertIfNotExist(self::CATEGORY_TABLE,
- array(
- 'uid' => $this->user,
- 'type' => $this->type,
- 'category' => $category,
- ));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
- }
- // reload categories to get the proper ids.
- $this->loadCategories();
- // Loop through temporarily cached objectid/categoryname pairs
- // and save relations.
- $categories = $this->categories;
- // For some reason this is needed or array_search(i) will return 0..?
- ksort($categories);
- foreach(self::$relations as $relation) {
- $catid = $this->array_searchi($relation['category'], $categories);
- OC_Log::write('core', __METHOD__ . 'catid, ' . $relation['category'] . ' ' . $catid, OC_Log::DEBUG);
- if($catid) {
- try {
- OCP\DB::insertIfNotExist(self::RELATION_TABLE,
- array(
- 'objid' => $relation['objid'],
- 'categoryid' => $catid,
- 'type' => $this->type,
- ));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
- }
- }
- self::$relations = array(); // reset
- } else {
- OC_Log::write('core', __METHOD__.', $this->categories is not an array! '
- . print_r($this->categories, true), OC_Log::ERROR);
- }
- }
-
- /**
- * @brief Delete categories and category/object relations for a user.
- * For hooking up on post_deleteUser
- * @param string $uid The user id for which entries should be purged.
- */
- public static function post_deleteUser($arguments) {
- // Find all objectid/categoryid pairs.
- $result = null;
- try {
- $stmt = OCP\DB::prepare('SELECT `id` FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ?');
- $result = $stmt->execute(array($arguments['uid']));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
-
- if(!is_null($result)) {
- try {
- $stmt = OCP\DB::prepare('DELETE FROM `' . self::RELATION_TABLE . '` '
- . 'WHERE `categoryid` = ?');
- while( $row = $result->fetchRow()) {
- try {
- $stmt->execute(array($row['id']));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- }
- }
- try {
- $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` '
- . 'WHERE `uid` = ?');
- $result = $stmt->execute(array($arguments['uid']));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__ . ', exception: '
- . $e->getMessage(), OCP\Util::ERROR);
- }
- }
-
- /**
- * @brief Delete category/object relations from the db
- * @param array $ids The ids of the objects
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns boolean Returns false on error.
- */
- public function purgeObjects(array $ids, $type = null) {
- $type = is_null($type) ? $this->type : $type;
- if(count($ids) === 0) {
- // job done ;)
- return true;
- }
- $updates = $ids;
- try {
- $query = 'DELETE FROM `' . self::RELATION_TABLE . '` ';
- $query .= 'WHERE `objid` IN (' . str_repeat('?,', count($ids)-1) . '?) ';
- $query .= 'AND `type`= ?';
- $updates[] = $type;
- $stmt = OCP\DB::prepare($query);
- $result = $stmt->execute($updates);
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- return false;
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- return true;
- }
-
- /**
- * Get favorites for an object type
- *
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns array An array of object ids.
- */
- public function getFavorites($type = null) {
- $type = is_null($type) ? $this->type : $type;
-
- try {
- return $this->idsForCategory(self::CATEGORY_FAVORITE);
- } catch(Exception $e) {
- // No favorites
- return array();
- }
- }
-
- /**
- * Add an object to favorites
- *
- * @param int $objid The id of the object
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns boolean
- */
- public function addToFavorites($objid, $type = null) {
- $type = is_null($type) ? $this->type : $type;
- if(!$this->hasCategory(self::CATEGORY_FAVORITE)) {
- $this->add(self::CATEGORY_FAVORITE, true);
- }
- return $this->addToCategory($objid, self::CATEGORY_FAVORITE, $type);
- }
-
- /**
- * Remove an object from favorites
- *
- * @param int $objid The id of the object
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns boolean
- */
- public function removeFromFavorites($objid, $type = null) {
- $type = is_null($type) ? $this->type : $type;
- return $this->removeFromCategory($objid, self::CATEGORY_FAVORITE, $type);
- }
-
- /**
- * @brief Creates a category/object relation.
- * @param int $objid The id of the object
- * @param int|string $category The id or name of the category
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns boolean Returns false on database error.
- */
- public function addToCategory($objid, $category, $type = null) {
- $type = is_null($type) ? $this->type : $type;
- if(is_string($category) && !is_numeric($category)) {
- if(!$this->hasCategory($category)) {
- $this->add($category, true);
- }
- $categoryid = $this->array_searchi($category, $this->categories);
- } else {
- $categoryid = $category;
- }
- try {
- OCP\DB::insertIfNotExist(self::RELATION_TABLE,
- array(
- 'objid' => $objid,
- 'categoryid' => $categoryid,
- 'type' => $type,
- ));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- return true;
- }
-
- /**
- * @brief Delete single category/object relation from the db
- * @param int $objid The id of the object
- * @param int|string $category The id or name of the category
- * @param string $type The type of object (event/contact/task/journal).
- * Defaults to the type set in the instance
- * @returns boolean
- */
- public function removeFromCategory($objid, $category, $type = null) {
- $type = is_null($type) ? $this->type : $type;
- $categoryid = (is_string($category) && !is_numeric($category))
- ? $this->array_searchi($category, $this->categories)
- : $category;
- try {
- $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
- . 'WHERE `objid` = ? AND `categoryid` = ? AND `type` = ?';
- OCP\Util::writeLog('core', __METHOD__.', sql: ' . $objid . ' ' . $categoryid . ' ' . $type,
- OCP\Util::DEBUG);
- $stmt = OCP\DB::prepare($sql);
- $stmt->execute(array($objid, $categoryid, $type));
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- return true;
- }
-
- /**
- * @brief Delete categories from the db and from all the vobject supplied
- * @param $names An array of categories to delete
- * @param $objects An array of arrays with [id,vobject] (as text) pairs suitable for updating the apps object table.
- */
- public function delete($names, array &$objects=null) {
- if(!is_array($names)) {
- $names = array($names);
- }
-
- OC_Log::write('core', __METHOD__ . ', before: '
- . print_r($this->categories, true), OC_Log::DEBUG);
- foreach($names as $name) {
- $id = null;
- OC_Log::write('core', __METHOD__.', '.$name, OC_Log::DEBUG);
- if($this->hasCategory($name)) {
- $id = $this->array_searchi($name, $this->categories);
- unset($this->categories[$id]);
- }
- try {
- $stmt = OCP\DB::prepare('DELETE FROM `' . self::CATEGORY_TABLE . '` WHERE '
- . '`uid` = ? AND `type` = ? AND `category` = ?');
- $result = $stmt->execute(array($this->user, $this->type, $name));
- if (OC_DB::isError($result)) {
- OC_Log::write('core', __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result), OC_Log::ERROR);
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__ . ', exception: '
- . $e->getMessage(), OCP\Util::ERROR);
- }
- if(!is_null($id) && $id !== false) {
- try {
- $sql = 'DELETE FROM `' . self::RELATION_TABLE . '` '
- . 'WHERE `categoryid` = ?';
- $stmt = OCP\DB::prepare($sql);
- $result = $stmt->execute(array($id));
- if (OC_DB::isError($result)) {
- OC_Log::write('core',
- __METHOD__. 'DB error: ' . OC_DB::getErrorMessage($result),
- OC_Log::ERROR);
- }
- } catch(Exception $e) {
- OCP\Util::writeLog('core', __METHOD__.', exception: '.$e->getMessage(),
- OCP\Util::ERROR);
- return false;
- }
- }
- }
- OC_Log::write('core', __METHOD__.', after: '
- . print_r($this->categories, true), OC_Log::DEBUG);
- if(!is_null($objects)) {
- foreach($objects as $key=>&$value) {
- $vobject = OC_VObject::parse($value[1]);
- if(!is_null($vobject)) {
- $object = null;
- $componentname = '';
- if (isset($vobject->VEVENT)) {
- $object = $vobject->VEVENT;
- $componentname = 'VEVENT';
- } else
- if (isset($vobject->VTODO)) {
- $object = $vobject->VTODO;
- $componentname = 'VTODO';
- } else
- if (isset($vobject->VJOURNAL)) {
- $object = $vobject->VJOURNAL;
- $componentname = 'VJOURNAL';
- } else {
- $object = $vobject;
- }
- $categories = $object->getAsArray('CATEGORIES');
- foreach($names as $name) {
- $idx = $this->array_searchi($name, $categories);
- if($idx !== false) {
- OC_Log::write('core', __METHOD__
- .', unsetting: '
- . $categories[$this->array_searchi($name, $categories)],
- OC_Log::DEBUG);
- unset($categories[$this->array_searchi($name, $categories)]);
- }
- }
-
- $object->setString('CATEGORIES', implode(',', $categories));
- if($vobject !== $object) {
- $vobject[$componentname] = $object;
- }
- $value[1] = $vobject->serialize();
- $objects[$key] = $value;
- } else {
- OC_Log::write('core', __METHOD__
- .', unable to parse. ID: ' . $value[0] . ', '
- . substr($value[1], 0, 50) . '(...)', OC_Log::DEBUG);
- }
- }
- }
- }
-
- // case-insensitive in_array
- private function in_arrayi($needle, $haystack) {
- if(!is_array($haystack)) {
- return false;
- }
- return in_array(strtolower($needle), array_map('strtolower', $haystack));
- }
-
- // case-insensitive array_search
- private function array_searchi($needle, $haystack) {
- if(!is_array($haystack)) {
- return false;
- }
- return array_search(strtolower($needle), array_map('strtolower', $haystack));
- }
-}
diff --git a/settings/js/apps.js b/settings/js/apps.js
index 54810776d2b..a55c55e24cf 100644
--- a/settings/js/apps.js
+++ b/settings/js/apps.js
@@ -84,6 +84,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
}
else {
appitem.data('active',false);
+ element.data('active',false);
OC.Settings.Apps.removeNavigation(appid);
appitem.removeClass('active');
element.val(t('settings','Enable'));
@@ -104,6 +105,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
} else {
OC.Settings.Apps.addNavigation(appid);
appitem.data('active',true);
+ element.data('active',true);
appitem.addClass('active');
element.val(t('settings','Disable'));
}
@@ -158,7 +160,7 @@ OC.Settings.Apps = OC.Settings.Apps || {
if(response.status === 'success'){
var navIds=response.nav_ids;
for(var i=0; i< navIds.length; i++){
- $('#apps').children('li[data-id="'+navIds[i]+'"]').remove();
+ $('#apps .wrapper').children('li[data-id="'+navIds[i]+'"]').remove();
}
}
});
diff --git a/settings/js/personal.js b/settings/js/personal.js
index eaaca32f5d8..a923b475731 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -34,6 +34,7 @@ function changeDisplayName(){
$('#oldDisplayName').text($('#displayName').val());
// update displayName on the top right expand button
$('#expandDisplayName').text($('#displayName').val());
+ updateAvatar();
}
else{
$('#newdisplayname').val(data.data.displayName);
diff --git a/settings/l10n/da.php b/settings/l10n/da.php
index 9872d3f5e07..f86559d6752 100644
--- a/settings/l10n/da.php
+++ b/settings/l10n/da.php
@@ -16,6 +16,12 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "Brugeren kan ikke tilføjes til gruppen %s",
"Unable to remove user from group %s" => "Brugeren kan ikke fjernes fra gruppen %s",
"Couldn't update app." => "Kunne ikke opdatere app'en.",
+"Wrong password" => "Forkert kodeord",
+"No user supplied" => "Intet brugernavn givet",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Angiv venligst en admininstrator gendannelseskode, ellers vil alt brugerdata gå tabt",
+"Wrong admin recovery password. Please check the password and try again." => "Forkert admin gendannelseskode. Se venligst koden efter og prøv igen.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "Serveren understøtter ikke kodeordsskifte, men brugernes krypteringsnøgle blev opdateret.",
+"Unable to change password" => "Kunne ikke ændre kodeord",
"Update to {appversion}" => "Opdatér til {appversion}",
"Disable" => "Deaktiver",
"Enable" => "Aktiver",
diff --git a/settings/l10n/fr.php b/settings/l10n/fr.php
index 55c0e7fe9a8..10a7d764bc8 100644
--- a/settings/l10n/fr.php
+++ b/settings/l10n/fr.php
@@ -18,6 +18,9 @@ $TRANSLATIONS = array(
"Couldn't update app." => "Impossible de mettre à jour l'application",
"Wrong password" => "Mot de passe incorrect",
"No user supplied" => "Aucun utilisateur fourni",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Veuillez fournir un mot de passe administrateur de récupération de données, sinon toutes les données de l'utilisateur seront perdues",
+"Wrong admin recovery password. Please check the password and try again." => "Mot de passe administrateur de récupération de données invalide. Veuillez vérifier le mot de passe et essayer à nouveau.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "L'infrastructure d'arrière-plan ne supporte pas la modification de mot de passe, mais la clef de chiffrement des utilisateurs a été mise à jour avec succès.",
"Unable to change password" => "Impossible de modifier le mot de passe",
"Update to {appversion}" => "Mettre à jour vers {appversion}",
"Disable" => "Désactiver",
diff --git a/settings/l10n/hu_HU.php b/settings/l10n/hu_HU.php
index f31826c149f..cba844e7818 100644
--- a/settings/l10n/hu_HU.php
+++ b/settings/l10n/hu_HU.php
@@ -16,15 +16,25 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "A felhasználó nem adható hozzá ehhez a csoporthoz: %s",
"Unable to remove user from group %s" => "A felhasználó nem távolítható el ebből a csoportból: %s",
"Couldn't update app." => "A program frissítése nem sikerült.",
+"Wrong password" => "Hibás jelszó",
+"No user supplied" => "Nincs felhasználó által mellékelve",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Add meg az admin helyreállító jelszót, máskülönben az összes felhasználói adat elveszik.",
+"Wrong admin recovery password. Please check the password and try again." => "Hibás admin helyreállítási jelszó. Ellenörizd a jelszót és próbáld újra.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "A back-end nem támogatja a jelszó módosítást, de felhasználó titkosítási kulcsa sikeresen frissítve lett.",
+"Unable to change password" => "Nem sikerült megváltoztatni a jelszót",
"Update to {appversion}" => "Frissítés erre a verzióra: {appversion}",
"Disable" => "Letiltás",
"Enable" => "engedélyezve",
"Please wait...." => "Kérem várjon...",
+"Error while disabling app" => "Hiba az alkalmazás kikapcsolása közben",
+"Error while enabling app" => "Hiba az alalmazás engedélyezése közben",
"Updating...." => "Frissítés folyamatban...",
"Error while updating app" => "Hiba történt a programfrissítés közben",
"Error" => "Hiba",
"Update" => "Frissítés",
"Updated" => "Frissítve",
+"Select a profile picture" => "Válassz profil képet",
+"Decrypting files... Please wait, this can take some time." => "File-ok kititkosítása folyamatban... Kérlek várj, ez hosszabb ideig is eltarthat ...",
"Saving..." => "Mentés...",
"deleted" => "törölve",
"undo" => "visszavonás",
@@ -98,11 +108,20 @@ $TRANSLATIONS = array(
"Your email address" => "Az Ön email címe",
"Fill in an email address to enable password recovery" => "Adja meg az email címét, hogy jelszó-emlékeztetőt kérhessen, ha elfelejtette a jelszavát!",
"Profile picture" => "Profilkép",
+"Upload new" => "Új feltöltése",
+"Select new from Files" => "Új kiválasztása Fileokból",
+"Remove image" => "Kép eltávolítása",
+"Either png or jpg. Ideally square but you will be able to crop it." => "Egyaránt png vagy jpg. Az ideális ha négyzet alaku, de késöbb még átszabható",
+"Abort" => "Megszakítás",
+"Choose as profile image" => "Válassz profil képet",
"Language" => "Nyelv",
"Help translate" => "Segítsen a fordításban!",
"WebDAV" => "WebDAV",
"Use this address to <a href=\"%s/server/5.0/user_manual/files/files.html\" target=\"_blank\">access your Files via WebDAV</a>" => "Ezt a címet használja, ha <a href=\"%s/server/5.0/user_manual/files/files.html\" target=\"_blank\">WebDAV-on keresztül szeretné elérni az állományait</a>",
"Encryption" => "Titkosítás",
+"The encryption app is no longer enabled, decrypt all your file" => "A titkosító alkalmzás a továbbiakban nincs engedélyezve, kititkosítja az összes fileodat",
+"Log-in password" => "Bejelentkezési jelszó",
+"Decrypt all Files" => "Kititkosítja az összes file-t",
"Login Name" => "Bejelentkezési név",
"Create" => "Létrehozás",
"Admin Recovery Password" => "A jelszóvisszaállítás adminisztrációja",
diff --git a/settings/l10n/ja_JP.php b/settings/l10n/ja_JP.php
index 12784e3f537..bfaa9827b21 100644
--- a/settings/l10n/ja_JP.php
+++ b/settings/l10n/ja_JP.php
@@ -16,6 +16,12 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "ユーザをグループ %s に追加できません",
"Unable to remove user from group %s" => "ユーザをグループ %s から削除できません",
"Couldn't update app." => "アプリを更新出来ませんでした。",
+"Wrong password" => "無効なパスワード",
+"No user supplied" => "ユーザが指定されていません",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "復元用の管理者パスワードを入力してください。そうでない場合は、全ユーザのデータが失われます。",
+"Wrong admin recovery password. Please check the password and try again." => "無効な復元用の管理者パスワード。パスワードを確認して再度実行してください。",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "バックエンドはパスワード変更をサポートしていませんが、ユーザの暗号化キーは正常に更新されました。",
+"Unable to change password" => "パスワードを変更できません",
"Update to {appversion}" => "{appversion} に更新",
"Disable" => "無効",
"Enable" => "有効化",
@@ -102,7 +108,10 @@ $TRANSLATIONS = array(
"Your email address" => "あなたのメールアドレス",
"Fill in an email address to enable password recovery" => "※パスワード回復を有効にするにはメールアドレスの入力が必要です",
"Profile picture" => "プロフィール写真",
+"Upload new" => "新規にアップロード",
+"Select new from Files" => "ファイルから新規に選択",
"Remove image" => "画像を削除",
+"Either png or jpg. Ideally square but you will be able to crop it." => "png と jpg のいずれか。正方形が理想ですが、切り取って加工することも可能です。",
"Abort" => "中止",
"Choose as profile image" => "プロファイル画像として選択",
"Language" => "言語",
diff --git a/settings/l10n/lt_LT.php b/settings/l10n/lt_LT.php
index a23d21ed7f7..df0247fc27e 100644
--- a/settings/l10n/lt_LT.php
+++ b/settings/l10n/lt_LT.php
@@ -16,6 +16,12 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "Nepavyko pridėti vartotojo prie grupės %s",
"Unable to remove user from group %s" => "Nepavyko ištrinti vartotojo iš grupės %s",
"Couldn't update app." => "Nepavyko atnaujinti programos.",
+"Wrong password" => "Neteisingas slaptažodis",
+"No user supplied" => "Nepateiktas naudotojas",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Prašome įvesti administratoriaus atkūrimo slaptažodį, kitaip visi naudotojo suomenys bus prarasti",
+"Wrong admin recovery password. Please check the password and try again." => "Netinkamas administratoriau atkūrimo slaptažodis. Prašome pasitikrinti ir bandyti vėl.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "Sistema nepalaiko slaptažodžio keitimo, bet naudotojo šifravimo raktas buvo sėkmingai atnaujintas.",
+"Unable to change password" => "Nepavyksta pakeisti slaptažodžio",
"Update to {appversion}" => "Atnaujinti iki {appversion}",
"Disable" => "Išjungti",
"Enable" => "Įjungti",
diff --git a/settings/l10n/nn_NO.php b/settings/l10n/nn_NO.php
index 822a17e7831..9eb31a887bd 100644
--- a/settings/l10n/nn_NO.php
+++ b/settings/l10n/nn_NO.php
@@ -16,6 +16,12 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "Klarte ikkje leggja til brukaren til gruppa %s",
"Unable to remove user from group %s" => "Klarte ikkje fjerna brukaren frå gruppa %s",
"Couldn't update app." => "Klarte ikkje oppdatera programmet.",
+"Wrong password" => "Feil passord",
+"No user supplied" => "Ingen brukar gitt",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Ver venleg og gi eit admingjenopprettingspassord, elles vil all brukardata gå tapt.",
+"Wrong admin recovery password. Please check the password and try again." => "Feil admingjenopprettingspassord. Ver venleg og sjekk passordet og prøv igjen.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "Bakstykket støttar ikkje passordendring, men krypteringsnøkkelen til brukaren blei oppdatert.",
+"Unable to change password" => "Klarte ikkje å endra passordet",
"Update to {appversion}" => "Oppdater til {appversion}",
"Disable" => "Slå av",
"Enable" => "Slå på",
@@ -27,6 +33,7 @@ $TRANSLATIONS = array(
"Error" => "Feil",
"Update" => "Oppdater",
"Updated" => "Oppdatert",
+"Select a profile picture" => "Vel eit profilbilete",
"Decrypting files... Please wait, this can take some time." => "Dekrypterer filer … Ver venleg og vent, dette kan ta ei stund.",
"Saving..." => "Lagrar …",
"deleted" => "sletta",
@@ -100,6 +107,13 @@ $TRANSLATIONS = array(
"Email" => "E-post",
"Your email address" => "Di epost-adresse",
"Fill in an email address to enable password recovery" => "Fyll inn e-postadressa di for å gjera passordgjenoppretting mogleg",
+"Profile picture" => "Profilbilete",
+"Upload new" => "Last opp ny",
+"Select new from Files" => "Vel ny frå Filer",
+"Remove image" => "Fjern bilete",
+"Either png or jpg. Ideally square but you will be able to crop it." => "Anten PNG eller JPG. Helst kvadratisk, men du får moglegheita til å beskjera det.",
+"Abort" => "Avbryt",
+"Choose as profile image" => "Vel som profilbilete",
"Language" => "Språk",
"Help translate" => "Hjelp oss å omsetja",
"WebDAV" => "WebDAV",
diff --git a/settings/l10n/pl.php b/settings/l10n/pl.php
index d07d1f7a4d2..6cce72df4b6 100644
--- a/settings/l10n/pl.php
+++ b/settings/l10n/pl.php
@@ -16,6 +16,8 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "Nie można dodać użytkownika do grupy %s",
"Unable to remove user from group %s" => "Nie można usunąć użytkownika z grupy %s",
"Couldn't update app." => "Nie można uaktualnić aplikacji.",
+"Wrong password" => "Złe hasło",
+"Unable to change password" => "Nie można zmienić hasła",
"Update to {appversion}" => "Aktualizacja do {appversion}",
"Disable" => "Wyłącz",
"Enable" => "Włącz",
@@ -27,6 +29,7 @@ $TRANSLATIONS = array(
"Error" => "Błąd",
"Update" => "Aktualizuj",
"Updated" => "Zaktualizowano",
+"Select a profile picture" => "Wybierz zdjęcie profilu",
"Decrypting files... Please wait, this can take some time." => "Odszyfrowuje pliki... Proszę czekać, to może zająć jakiś czas.",
"Saving..." => "Zapisywanie...",
"deleted" => "usunięto",
@@ -101,7 +104,11 @@ $TRANSLATIONS = array(
"Your email address" => "Twój adres e-mail",
"Fill in an email address to enable password recovery" => "Podaj adres e-mail, aby uzyskać możliwość odzyskania hasła",
"Profile picture" => "Zdjęcie profilu",
+"Upload new" => "Wczytaj nowe",
+"Select new from Files" => "Wybierz nowe z plików",
+"Remove image" => "Usuń zdjęcie",
"Abort" => "Anuluj",
+"Choose as profile image" => "Wybierz zdjęcie profilu",
"Language" => "Język",
"Help translate" => "Pomóż w tłumaczeniu",
"WebDAV" => "WebDAV",
diff --git a/settings/l10n/sv.php b/settings/l10n/sv.php
index 5f6313f1829..4f8ad376db7 100644
--- a/settings/l10n/sv.php
+++ b/settings/l10n/sv.php
@@ -16,6 +16,12 @@ $TRANSLATIONS = array(
"Unable to add user to group %s" => "Kan inte lägga till användare i gruppen %s",
"Unable to remove user from group %s" => "Kan inte radera användare från gruppen %s",
"Couldn't update app." => "Kunde inte uppdatera appen.",
+"Wrong password" => "Fel lösenord",
+"No user supplied" => "Ingen användare angiven",
+"Please provide an admin recovery password, otherwise all user data will be lost" => "Ange ett återställningslösenord för administratören. Annars kommer all användardata förloras",
+"Wrong admin recovery password. Please check the password and try again." => "Felaktigt återställningslösenord för administratör. Kolla lösenordet och prova igen.",
+"Back-end doesn't support password change, but the users encryption key was successfully updated." => "Gränssnittet stödjer inte byte av lösenord, men användarnas krypteringsnyckel blev uppdaterad.",
+"Unable to change password" => "Kunde inte ändra lösenord",
"Update to {appversion}" => "Uppdatera till {appversion}",
"Disable" => "Deaktivera",
"Enable" => "Aktivera",
@@ -27,6 +33,7 @@ $TRANSLATIONS = array(
"Error" => "Fel",
"Update" => "Uppdatera",
"Updated" => "Uppdaterad",
+"Select a profile picture" => "Välj en profilbild",
"Decrypting files... Please wait, this can take some time." => "Dekrypterar filer... Vänligen vänta, detta kan ta en stund.",
"Saving..." => "Sparar...",
"deleted" => "raderad",
@@ -101,6 +108,12 @@ $TRANSLATIONS = array(
"Your email address" => "Din e-postadress",
"Fill in an email address to enable password recovery" => "Fyll i en e-postadress för att aktivera återställning av lösenord",
"Profile picture" => "Profilbild",
+"Upload new" => "Ladda upp ny",
+"Select new from Files" => "Välj ny från filer",
+"Remove image" => "Radera bild",
+"Either png or jpg. Ideally square but you will be able to crop it." => "Antingen png eller jpg. Helst fyrkantig, men du kommer att kunna beskära den.",
+"Abort" => "Avbryt",
+"Choose as profile image" => "Välj som profilbild",
"Language" => "Språk",
"Help translate" => "Hjälp att översätta",
"WebDAV" => "WebDAV",
diff --git a/settings/l10n/uk.php b/settings/l10n/uk.php
index 314b7de6574..adb46e3ee84 100644
--- a/settings/l10n/uk.php
+++ b/settings/l10n/uk.php
@@ -2,7 +2,7 @@
$TRANSLATIONS = array(
"Unable to load list from App Store" => "Не вдалося завантажити список з App Store",
"Authentication error" => "Помилка автентифікації",
-"Unable to change display name" => "Не вдалося змінити зображене ім'я",
+"Unable to change display name" => "Не вдалося змінити ім'я",
"Group already exists" => "Група вже існує",
"Unable to add group" => "Не вдалося додати групу",
"Email saved" => "Адресу збережено",
@@ -97,7 +97,7 @@ $TRANSLATIONS = array(
"Other" => "Інше",
"Username" => "Ім'я користувача",
"Storage" => "Сховище",
-"change display name" => "змінити зображене ім'я",
+"change display name" => "змінити ім'я",
"set new password" => "встановити новий пароль",
"Default" => "За замовчуванням"
);
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index fb667263e45..581cfcff9f3 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,7 +1,5 @@
<?php
-global $RUNTIME_NOAPPS;
-$RUNTIME_NOAPPS = true;
define('PHPUNIT_RUN', 1);
diff --git a/tests/data/testcal.ics b/tests/data/testcal.ics
new file mode 100644
index 00000000000..e05f01ba1c2
--- /dev/null
+++ b/tests/data/testcal.ics
@@ -0,0 +1,13 @@
+BEGIN:VCALENDAR
+PRODID:-//some random cal software//EN
+VERSION:2.0
+BEGIN:VEVENT
+CREATED:20130102T120000Z
+LAST-MODIFIED:20130102T120000Z
+DTSTAMP:20130102T120000Z
+UID:f106ecdf-c716-43ef-9d94-4e6f19f2fcfb
+SUMMARY:a test cal file
+DTSTART;VALUE=DATE:20130101
+DTEND;VALUE=DATE:20130102
+END:VEVENT
+END:VCALENDAR \ No newline at end of file
diff --git a/tests/data/testcontact.vcf b/tests/data/testcontact.vcf
new file mode 100644
index 00000000000..2af963d6916
--- /dev/null
+++ b/tests/data/testcontact.vcf
@@ -0,0 +1,6 @@
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//some random contact software//EN
+N:def;abc;;;
+FN:abc def
+END:VCARD \ No newline at end of file
diff --git a/tests/lib/appframework/AppTest.php b/tests/lib/appframework/AppTest.php
new file mode 100644
index 00000000000..80abaefc43b
--- /dev/null
+++ b/tests/lib/appframework/AppTest.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+
+class AppTest extends \PHPUnit_Framework_TestCase {
+
+ private $container;
+ private $api;
+ private $controller;
+ private $dispatcher;
+ private $params;
+ private $headers;
+ private $output;
+ private $controllerName;
+ private $controllerMethod;
+
+ protected function setUp() {
+ $this->container = new \OC\AppFramework\DependencyInjection\DIContainer('test');
+ $this->controller = $this->getMockBuilder(
+ 'OC\AppFramework\Controller\Controller')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->dispatcher = $this->getMockBuilder(
+ 'OC\AppFramework\Http\Dispatcher')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+
+ $this->headers = array('key' => 'value');
+ $this->output = 'hi';
+ $this->controllerName = 'Controller';
+ $this->controllerMethod = 'method';
+
+ $this->container[$this->controllerName] = $this->controller;
+ $this->container['Dispatcher'] = $this->dispatcher;
+ }
+
+
+ public function testControllerNameAndMethodAreBeingPassed(){
+ $return = array(null, array(), null);
+ $this->dispatcher->expects($this->once())
+ ->method('dispatch')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->returnValue($return));
+
+ $this->expectOutputString('');
+
+ App::main($this->controllerName, $this->controllerMethod, array(),
+ $this->container);
+ }
+
+
+ /*
+ FIXME: this complains about shit headers which are already sent because
+ of the content length. Would be cool if someone could fix this
+
+ public function testOutputIsPrinted(){
+ $return = array(null, array(), $this->output);
+ $this->dispatcher->expects($this->once())
+ ->method('dispatch')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->returnValue($return));
+
+ $this->expectOutputString($this->output);
+
+ App::main($this->controllerName, $this->controllerMethod, array(),
+ $this->container);
+ }
+ */
+
+ // FIXME: if someone manages to test the headers output, I'd be grateful
+
+
+}
diff --git a/tests/lib/appframework/controller/ControllerTest.php b/tests/lib/appframework/controller/ControllerTest.php
new file mode 100644
index 00000000000..4441bddfca9
--- /dev/null
+++ b/tests/lib/appframework/controller/ControllerTest.php
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace Test\AppFramework\Controller;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Controller\Controller;
+use OCP\AppFramework\Http\TemplateResponse;
+
+
+//require_once __DIR__ . "/../classloader.php";
+
+
+class ChildController extends Controller {};
+
+class ControllerTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Controller
+ */
+ private $controller;
+ private $api;
+
+ protected function setUp(){
+ $request = new Request(
+ array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
+ 'urlParams' => array('name' => 'Johnny Weissmüller'),
+ 'files' => array('file' => 'filevalue'),
+ 'env' => array('PATH' => 'daheim'),
+ 'session' => array('sezession' => 'kein'),
+ 'method' => 'hi',
+ )
+ );
+
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('test'));
+ $this->api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('apptemplate_advanced'));
+
+ $this->controller = new ChildController($this->api, $request);
+ }
+
+
+ public function testParamsGet(){
+ $this->assertEquals('Johnny Weissmüller', $this->controller->params('name', 'Tarzan'));
+ }
+
+
+ public function testParamsGetDefault(){
+ $this->assertEquals('Tarzan', $this->controller->params('Ape Man', 'Tarzan'));
+ }
+
+
+ public function testParamsFile(){
+ $this->assertEquals('filevalue', $this->controller->params('file', 'filevalue'));
+ }
+
+
+ public function testGetUploadedFile(){
+ $this->assertEquals('filevalue', $this->controller->getUploadedFile('file'));
+ }
+
+
+
+ public function testGetUploadedFileDefault(){
+ $this->assertEquals('default', $this->controller->params('files', 'default'));
+ }
+
+
+ public function testGetParams(){
+ $params = array(
+ 'name' => 'Johnny Weissmüller',
+ 'nickname' => 'Janey',
+ );
+
+ $this->assertEquals($params, $this->controller->getParams());
+ }
+
+
+ public function testRender(){
+ $this->assertTrue($this->controller->render('') instanceof TemplateResponse);
+ }
+
+
+ public function testSetParams(){
+ $params = array('john' => 'foo');
+ $response = $this->controller->render('home', $params);
+
+ $this->assertEquals($params, $response->getParams());
+ }
+
+
+ public function testRenderRenderAs(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $this->controller = new ChildController($api, new Request());
+ $this->controller->render('home', array(), 'admin')->render();
+ }
+
+
+ public function testRenderHeaders(){
+ $headers = array('one', 'two');
+ $response = $this->controller->render('', array(), '', $headers);
+
+ $this->assertTrue(in_array($headers[0], $response->getHeaders()));
+ $this->assertTrue(in_array($headers[1], $response->getHeaders()));
+ }
+
+
+ public function testGetRequestMethod(){
+ $this->assertEquals('hi', $this->controller->method());
+ }
+
+
+ public function testGetEnvVariable(){
+ $this->assertEquals('daheim', $this->controller->env('PATH'));
+ }
+
+}
diff --git a/tests/lib/appframework/dependencyinjection/DIContainerTest.php b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
new file mode 100644
index 00000000000..25fdd202839
--- /dev/null
+++ b/tests/lib/appframework/dependencyinjection/DIContainerTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @author Morris Jobke
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ * @copyright 2013 Morris Jobke morris.jobke@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\DependencyInjection;
+
+use \OC\AppFramework\Http\Request;
+
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+class DIContainerTest extends \PHPUnit_Framework_TestCase {
+
+ private $container;
+
+ protected function setUp(){
+ $this->container = new DIContainer('name');
+ $this->api = $this->getMock('OC\AppFramework\Core\API', array('getTrans'), array('hi'));
+ }
+
+ private function exchangeAPI(){
+ $this->api->expects($this->any())
+ ->method('getTrans')
+ ->will($this->returnValue('yo'));
+ $this->container['API'] = $this->api;
+ }
+
+ public function testProvidesAPI(){
+ $this->assertTrue(isset($this->container['API']));
+ }
+
+
+ public function testProvidesRequest(){
+ $this->assertTrue(isset($this->container['Request']));
+ }
+
+
+ public function testProvidesSecurityMiddleware(){
+ $this->assertTrue(isset($this->container['SecurityMiddleware']));
+ }
+
+
+ public function testProvidesMiddlewareDispatcher(){
+ $this->assertTrue(isset($this->container['MiddlewareDispatcher']));
+ }
+
+
+ public function testProvidesAppName(){
+ $this->assertTrue(isset($this->container['AppName']));
+ }
+
+
+ public function testAppNameIsSetCorrectly(){
+ $this->assertEquals('name', $this->container['AppName']);
+ }
+
+
+ public function testMiddlewareDispatcherIncludesSecurityMiddleware(){
+ $this->container['Request'] = new Request();
+ $security = $this->container['SecurityMiddleware'];
+ $dispatcher = $this->container['MiddlewareDispatcher'];
+
+ $this->assertContains($security, $dispatcher->getMiddlewares());
+ }
+
+
+ public function testMiddlewareDispatcherDoesNotIncludeTwigWhenTplDirectoryNotSet(){
+ $this->container['Request'] = new Request();
+ $this->exchangeAPI();
+ $dispatcher = $this->container['MiddlewareDispatcher'];
+
+ $this->assertEquals(1, count($dispatcher->getMiddlewares()));
+ }
+
+}
diff --git a/tests/lib/appframework/http/DispatcherTest.php b/tests/lib/appframework/http/DispatcherTest.php
new file mode 100644
index 00000000000..849b0ca97a6
--- /dev/null
+++ b/tests/lib/appframework/http/DispatcherTest.php
@@ -0,0 +1,218 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use OC\AppFramework\Core\API;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+class DispatcherTest extends \PHPUnit_Framework_TestCase {
+
+
+ private $middlewareDispatcher;
+ private $dispatcher;
+ private $controllerMethod;
+ private $response;
+ private $lastModified;
+ private $etag;
+ private $http;
+
+ protected function setUp() {
+ $this->controllerMethod = 'test';
+
+ $api = $this->getMockBuilder(
+ '\OC\AppFramework\Core\API')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $request = $this->getMockBuilder(
+ '\OC\AppFramework\Http\Request')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->http = $this->getMockBuilder(
+ '\OC\AppFramework\Http\Http')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->middlewareDispatcher = $this->getMockBuilder(
+ '\OC\AppFramework\Middleware\MiddlewareDispatcher')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->controller = $this->getMock(
+ '\OC\AppFramework\Controller\Controller',
+ array($this->controllerMethod), array($api, $request));
+
+ $this->dispatcher = new Dispatcher(
+ $this->http, $this->middlewareDispatcher);
+
+ $this->response = $this->getMockBuilder(
+ '\OCP\AppFramework\Http\Response')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $this->etag = 'hi';
+ }
+
+
+ private function setMiddlewareExpections($out=null,
+ $httpHeaders=null, $responseHeaders=array(),
+ $ex=false, $catchEx=true) {
+
+ if($ex) {
+ $exception = new \Exception();
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod))
+ ->will($this->throwException($exception));
+ if($catchEx) {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterException')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($exception))
+ ->will($this->returnValue($this->response));
+ } else {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterException')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($exception))
+ ->will($this->returnValue(null));
+ return;
+ }
+ } else {
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod));
+ $this->controller->expects($this->once())
+ ->method($this->controllerMethod)
+ ->will($this->returnValue($this->response));
+ }
+
+ $this->response->expects($this->once())
+ ->method('render')
+ ->will($this->returnValue($out));
+ $this->response->expects($this->once())
+ ->method('getStatus')
+ ->will($this->returnValue(Http::STATUS_OK));
+ $this->response->expects($this->once())
+ ->method('getLastModified')
+ ->will($this->returnValue($this->lastModified));
+ $this->response->expects($this->once())
+ ->method('getETag')
+ ->will($this->returnValue($this->etag));
+ $this->response->expects($this->once())
+ ->method('getHeaders')
+ ->will($this->returnValue($responseHeaders));
+ $this->http->expects($this->once())
+ ->method('getStatusHeader')
+ ->with($this->equalTo(Http::STATUS_OK),
+ $this->equalTo($this->lastModified),
+ $this->equalTo($this->etag))
+ ->will($this->returnValue($httpHeaders));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($this->response))
+ ->will($this->returnValue($this->response));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('afterController')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($this->response))
+ ->will($this->returnValue($this->response));
+
+ $this->middlewareDispatcher->expects($this->once())
+ ->method('beforeOutput')
+ ->with($this->equalTo($this->controller),
+ $this->equalTo($this->controllerMethod),
+ $this->equalTo($out))
+ ->will($this->returnValue($out));
+
+
+ }
+
+
+ public function testDispatcherReturnsArrayWith2Entries() {
+ $this->setMiddlewareExpections();
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+ $this->assertNull($response[0]);
+ $this->assertEquals(array(), $response[1]);
+ $this->assertNull($response[2]);
+ }
+
+
+ public function testHeadersAndOutputAreReturned(){
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders);
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ $this->assertEquals($httpHeaders, $response[0]);
+ $this->assertEquals($responseHeaders, $response[1]);
+ $this->assertEquals($out, $response[2]);
+ }
+
+
+ public function testExceptionCallsAfterException() {
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true);
+
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ $this->assertEquals($httpHeaders, $response[0]);
+ $this->assertEquals($responseHeaders, $response[1]);
+ $this->assertEquals($out, $response[2]);
+ }
+
+
+ public function testExceptionThrowsIfCanNotBeHandledByAfterException() {
+ $out = 'yo';
+ $httpHeaders = 'Http';
+ $responseHeaders = array('hell' => 'yeah');
+ $this->setMiddlewareExpections($out, $httpHeaders, $responseHeaders, true, false);
+
+ $this->setExpectedException('\Exception');
+ $response = $this->dispatcher->dispatch($this->controller,
+ $this->controllerMethod);
+
+ }
+
+}
diff --git a/tests/lib/appframework/http/DownloadResponseTest.php b/tests/lib/appframework/http/DownloadResponseTest.php
new file mode 100644
index 00000000000..64fe7992b6a
--- /dev/null
+++ b/tests/lib/appframework/http/DownloadResponseTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+class ChildDownloadResponse extends DownloadResponse {};
+
+
+class DownloadResponseTest extends \PHPUnit_Framework_TestCase {
+
+ protected $response;
+
+ protected function setUp(){
+ $this->response = new ChildDownloadResponse('file', 'content');
+ }
+
+
+ public function testHeaders() {
+ $headers = $this->response->getHeaders();
+
+ $this->assertContains('attachment; filename="file"', $headers['Content-Disposition']);
+ $this->assertContains('content', $headers['Content-Type']);
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/HttpTest.php b/tests/lib/appframework/http/HttpTest.php
new file mode 100644
index 00000000000..382d511b116
--- /dev/null
+++ b/tests/lib/appframework/http/HttpTest.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+
+class HttpTest extends \PHPUnit_Framework_TestCase {
+
+ private $server;
+ private $http;
+
+ protected function setUp(){
+ $this->server = array();
+ $this->http = new Http($this->server);
+ }
+
+
+ public function testProtocol() {
+ $header = $this->http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
+ $this->assertEquals('HTTP/1.1 307 Temporary Redirect', $header);
+ }
+
+
+ public function testProtocol10() {
+ $this->http = new Http($this->server, 'HTTP/1.0');
+ $header = $this->http->getStatusHeader(Http::STATUS_OK);
+ $this->assertEquals('HTTP/1.0 200 OK', $header);
+ }
+
+
+ public function testEtagMatchReturnsNotModified() {
+ $http = new Http(array('HTTP_IF_NONE_MATCH' => 'hi'));
+
+ $header = $http->getStatusHeader(Http::STATUS_OK, null, 'hi');
+ $this->assertEquals('HTTP/1.1 304 Not Modified', $header);
+ }
+
+
+ public function testLastModifiedMatchReturnsNotModified() {
+ $dateTime = new \DateTime(null, new \DateTimeZone('GMT'));
+ $dateTime->setTimestamp('12');
+
+ $http = new Http(
+ array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Thu, 01 Jan 1970 00:00:12 +0000')
+ );
+
+ $header = $http->getStatusHeader(Http::STATUS_OK, $dateTime);
+ $this->assertEquals('HTTP/1.1 304 Not Modified', $header);
+ }
+
+
+
+ public function testTempRedirectBecomesFoundInHttp10() {
+ $http = new Http(array(), 'HTTP/1.0');
+
+ $header = $http->getStatusHeader(Http::STATUS_TEMPORARY_REDIRECT);
+ $this->assertEquals('HTTP/1.0 302 Found', $header);
+ }
+ // TODO: write unittests for http codes
+
+}
diff --git a/tests/lib/appframework/http/JSONResponseTest.php b/tests/lib/appframework/http/JSONResponseTest.php
new file mode 100644
index 00000000000..534c54cbcee
--- /dev/null
+++ b/tests/lib/appframework/http/JSONResponseTest.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @author Morris Jobke
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ * @copyright 2013 Morris Jobke morris.jobke@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+use OCP\AppFramework\Http\JSONResponse;
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+
+class JSONResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var JSONResponse
+ */
+ private $json;
+
+ protected function setUp() {
+ $this->json = new JSONResponse();
+ }
+
+
+ public function testHeader() {
+ $headers = $this->json->getHeaders();
+ $this->assertEquals('application/json; charset=utf-8', $headers['Content-type']);
+ }
+
+
+ public function testSetData() {
+ $params = array('hi', 'yo');
+ $this->json->setData($params);
+
+ $this->assertEquals(array('hi', 'yo'), $this->json->getData());
+ }
+
+
+ public function testSetRender() {
+ $params = array('test' => 'hi');
+ $this->json->setData($params);
+
+ $expected = '{"test":"hi"}';
+
+ $this->assertEquals($expected, $this->json->render());
+ }
+
+
+ public function testRender() {
+ $params = array('test' => 'hi');
+ $this->json->setData($params);
+
+ $expected = '{"test":"hi"}';
+
+ $this->assertEquals($expected, $this->json->render());
+ }
+
+
+ public function testShouldHaveXContentHeaderByDefault() {
+ $headers = $this->json->getHeaders();
+ $this->assertEquals('nosniff', $headers['X-Content-Type-Options']);
+ }
+
+
+ public function testConstructorAllowsToSetData() {
+ $data = array('hi');
+ $code = 300;
+ $response = new JSONResponse($data, $code);
+
+ $expected = '["hi"]';
+ $this->assertEquals($expected, $response->render());
+ $this->assertEquals($code, $response->getStatus());
+ }
+
+}
diff --git a/tests/lib/appframework/http/RedirectResponseTest.php b/tests/lib/appframework/http/RedirectResponseTest.php
new file mode 100644
index 00000000000..1946655b0fa
--- /dev/null
+++ b/tests/lib/appframework/http/RedirectResponseTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+//require_once(__DIR__ . "/../classloader.php");
+
+
+
+class RedirectResponseTest extends \PHPUnit_Framework_TestCase {
+
+
+ protected $response;
+
+ protected function setUp(){
+ $this->response = new RedirectResponse('/url');
+ }
+
+
+ public function testHeaders() {
+ $headers = $this->response->getHeaders();
+ $this->assertEquals('/url', $headers['Location']);
+ $this->assertEquals(Http::STATUS_TEMPORARY_REDIRECT,
+ $this->response->getStatus());
+ }
+
+
+ public function testGetRedirectUrl(){
+ $this->assertEquals('/url', $this->response->getRedirectUrl());
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/RequestTest.php b/tests/lib/appframework/http/RequestTest.php
new file mode 100644
index 00000000000..0371c870cf2
--- /dev/null
+++ b/tests/lib/appframework/http/RequestTest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Tanghus (thomas@tanghus.net)
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace OC\AppFramework\Http;
+
+
+class RequestTest extends \PHPUnit_Framework_TestCase {
+
+ public function testRequestAccessors() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+
+ // Countable
+ $this->assertEquals(2, count($request));
+ // Array access
+ $this->assertEquals('Joey', $request['nickname']);
+ // "Magic" accessors
+ $this->assertEquals('Joey', $request->{'nickname'});
+ $this->assertTrue(isset($request['nickname']));
+ $this->assertTrue(isset($request->{'nickname'}));
+ $this->assertEquals(false, isset($request->{'flickname'}));
+ // Only testing 'get', but same approach for post, files etc.
+ $this->assertEquals('Joey', $request->get['nickname']);
+ // Always returns null if variable not set.
+ $this->assertEquals(null, $request->{'flickname'});
+ }
+
+ // urlParams has precedence over POST which has precedence over GET
+ public function testPrecedence() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ 'post' => array('name' => 'Jane Doe', 'nickname' => 'Janey'),
+ 'urlParams' => array('user' => 'jw', 'name' => 'Johnny Weissmüller'),
+ );
+
+ $request = new Request($vars);
+
+ $this->assertEquals(3, count($request));
+ $this->assertEquals('Janey', $request->{'nickname'});
+ $this->assertEquals('Johnny Weissmüller', $request->{'name'});
+ }
+
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testImmutableArrayAccess() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+ $request['nickname'] = 'Janey';
+ }
+
+ /**
+ * @expectedException RuntimeException
+ */
+ public function testImmutableMagicAccess() {
+ $vars = array(
+ 'get' => array('name' => 'John Q. Public', 'nickname' => 'Joey'),
+ );
+
+ $request = new Request($vars);
+ $request->{'nickname'} = 'Janey';
+ }
+
+}
diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php
new file mode 100644
index 00000000000..7e09086f801
--- /dev/null
+++ b/tests/lib/appframework/http/ResponseTest.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+
+use OCP\AppFramework\Http\Response;
+
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var \OCP\AppFramework\Http\Response
+ */
+ private $childResponse;
+
+ protected function setUp(){
+ $this->childResponse = new Response();
+ }
+
+
+ public function testAddHeader(){
+ $this->childResponse->addHeader('hello', 'world');
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('world', $headers['hello']);
+ }
+
+
+ public function testAddHeaderValueNullDeletesIt(){
+ $this->childResponse->addHeader('hello', 'world');
+ $this->childResponse->addHeader('hello', null);
+ $this->assertEquals(1, count($this->childResponse->getHeaders()));
+ }
+
+
+ public function testCacheHeadersAreDisabledByDefault(){
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
+ }
+
+
+ public function testRenderReturnNullByDefault(){
+ $this->assertEquals(null, $this->childResponse->render());
+ }
+
+
+ public function testGetStatus() {
+ $default = $this->childResponse->getStatus();
+
+ $this->childResponse->setStatus(Http::STATUS_NOT_FOUND);
+
+ $this->assertEquals(Http::STATUS_OK, $default);
+ $this->assertEquals(Http::STATUS_NOT_FOUND, $this->childResponse->getStatus());
+ }
+
+
+ public function testGetEtag() {
+ $this->childResponse->setEtag('hi');
+ $this->assertEquals('hi', $this->childResponse->getEtag());
+ }
+
+
+ public function testGetLastModified() {
+ $lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $lastModified->setTimestamp(1);
+ $this->childResponse->setLastModified($lastModified);
+ $this->assertEquals($lastModified, $this->childResponse->getLastModified());
+ }
+
+
+
+ public function testCacheSecondsZero() {
+ $this->childResponse->cacheFor(0);
+
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('no-cache, must-revalidate', $headers['Cache-Control']);
+ }
+
+
+ public function testCacheSeconds() {
+ $this->childResponse->cacheFor(33);
+
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('max-age=33, must-revalidate',
+ $headers['Cache-Control']);
+ }
+
+
+
+ public function testEtagLastModifiedHeaders() {
+ $lastModified = new \DateTime(null, new \DateTimeZone('GMT'));
+ $lastModified->setTimestamp(1);
+ $this->childResponse->setLastModified($lastModified);
+ $headers = $this->childResponse->getHeaders();
+ $this->assertEquals('Thu, 01 Jan 1970 00:00:01 +0000', $headers['Last-Modified']);
+ }
+
+
+}
diff --git a/tests/lib/appframework/http/TemplateResponseTest.php b/tests/lib/appframework/http/TemplateResponseTest.php
new file mode 100644
index 00000000000..3c6d29cd339
--- /dev/null
+++ b/tests/lib/appframework/http/TemplateResponseTest.php
@@ -0,0 +1,161 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Http;
+
+use OCP\AppFramework\Http\TemplateResponse;
+
+
+class TemplateResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var \OCP\AppFramework\Http\TemplateResponse
+ */
+ private $tpl;
+
+ /**
+ * @var \OCP\AppFramework\IApi
+ */
+ private $api;
+
+ protected function setUp() {
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('test'));
+ $this->api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+
+ $this->tpl = new TemplateResponse($this->api, 'home');
+ }
+
+
+ public function testSetParams(){
+ $params = array('hi' => 'yo');
+ $this->tpl->setParams($params);
+
+ $this->assertEquals(array('hi' => 'yo'), $this->tpl->getParams());
+ }
+
+
+ public function testGetTemplateName(){
+ $this->assertEquals('home', $this->tpl->getTemplateName());
+ }
+
+
+ public function testRender(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+
+ $tpl->render();
+ }
+
+
+ public function testRenderAssignsParams(){
+ $params = array('john' => 'doe');
+
+ $ocTpl = $this->getMock('Template', array('assign', 'fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('assign')
+ ->with($this->equalTo('john'), $this->equalTo('doe'));
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+ $tpl->setParams($params);
+
+ $tpl->render();
+ }
+
+
+ public function testRenderDifferentApp(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('user'), $this->equalTo('app2'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home', 'app2');
+
+ $tpl->render();
+ }
+
+
+ public function testRenderDifferentRenderAs(){
+ $ocTpl = $this->getMock('Template', array('fetchPage'));
+ $ocTpl->expects($this->once())
+ ->method('fetchPage');
+
+ $api = $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName', 'getTemplate'), array('app'));
+ $api->expects($this->any())
+ ->method('getAppName')
+ ->will($this->returnValue('app'));
+ $api->expects($this->once())
+ ->method('getTemplate')
+ ->with($this->equalTo('home'), $this->equalTo('admin'), $this->equalTo('app'))
+ ->will($this->returnValue($ocTpl));
+
+ $tpl = new TemplateResponse($api, 'home');
+ $tpl->renderAs('admin');
+
+ $tpl->render();
+ }
+
+
+ public function testGetRenderAs(){
+ $render = 'myrender';
+ $this->tpl->renderAs($render);
+ $this->assertEquals($render, $this->tpl->getRenderAs());
+ }
+
+}
diff --git a/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
new file mode 100644
index 00000000000..43727846dcf
--- /dev/null
+++ b/tests/lib/appframework/middleware/MiddlewareDispatcherTest.php
@@ -0,0 +1,285 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Middleware\Middleware;
+use OC\AppFramework\Middleware\MiddlewareDispatcher;
+use OCP\AppFramework\Http\Response;
+
+
+// needed to test ordering
+class TestMiddleware extends Middleware {
+ public static $beforeControllerCalled = 0;
+ public static $afterControllerCalled = 0;
+ public static $afterExceptionCalled = 0;
+ public static $beforeOutputCalled = 0;
+
+ public $beforeControllerOrder = 0;
+ public $afterControllerOrder = 0;
+ public $afterExceptionOrder = 0;
+ public $beforeOutputOrder = 0;
+
+ public $controller;
+ public $methodName;
+ public $exception;
+ public $response;
+ public $output;
+
+ private $beforeControllerThrowsEx;
+
+ public function __construct($beforeControllerThrowsEx) {
+ self::$beforeControllerCalled = 0;
+ self::$afterControllerCalled = 0;
+ self::$afterExceptionCalled = 0;
+ self::$beforeOutputCalled = 0;
+ $this->beforeControllerThrowsEx = $beforeControllerThrowsEx;
+ }
+
+ public function beforeController($controller, $methodName){
+ self::$beforeControllerCalled++;
+ $this->beforeControllerOrder = self::$beforeControllerCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ if($this->beforeControllerThrowsEx){
+ throw new \Exception();
+ }
+ }
+
+ public function afterException($controller, $methodName, \Exception $exception){
+ self::$afterExceptionCalled++;
+ $this->afterExceptionOrder = self::$afterExceptionCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->exception = $exception;
+ parent::afterException($controller, $methodName, $exception);
+ }
+
+ public function afterController($controller, $methodName, Response $response){
+ self::$afterControllerCalled++;
+ $this->afterControllerOrder = self::$afterControllerCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->response = $response;
+ return parent::afterController($controller, $methodName, $response);
+ }
+
+ public function beforeOutput($controller, $methodName, $output){
+ self::$beforeOutputCalled++;
+ $this->beforeOutputOrder = self::$beforeOutputCalled;
+ $this->controller = $controller;
+ $this->methodName = $methodName;
+ $this->output = $output;
+ return parent::beforeOutput($controller, $methodName, $output);
+ }
+}
+
+
+class MiddlewareDispatcherTest extends \PHPUnit_Framework_TestCase {
+
+ public $exception;
+ public $response;
+ private $out;
+ private $method;
+ private $controller;
+
+ /**
+ * @var MiddlewareDispatcher
+ */
+ private $dispatcher;
+
+
+ public function setUp() {
+ $this->dispatcher = new MiddlewareDispatcher();
+ $this->controller = $this->getControllerMock();
+ $this->method = 'method';
+ $this->response = new Response();
+ $this->out = 'hi';
+ $this->exception = new \Exception();
+ }
+
+
+ private function getAPIMock(){
+ return $this->getMock('OC\AppFramework\Core\API',
+ array('getAppName'), array('app'));
+ }
+
+
+ private function getControllerMock(){
+ return $this->getMock('OC\AppFramework\Controller\Controller', array('method'),
+ array($this->getAPIMock(), new Request()));
+ }
+
+
+ private function getMiddleware($beforeControllerThrowsEx=false){
+ $m1 = new TestMiddleware($beforeControllerThrowsEx);
+ $this->dispatcher->registerMiddleware($m1);
+ return $m1;
+ }
+
+
+ public function testAfterExceptionShouldReturnResponseOfMiddleware(){
+ $response = new Response();
+ $m1 = $this->getMock('\OC\AppFramework\Middleware\Middleware',
+ array('afterException', 'beforeController'));
+ $m1->expects($this->never())
+ ->method('afterException');
+
+ $m2 = $this->getMock('OC\AppFramework\Middleware\Middleware',
+ array('afterException', 'beforeController'));
+ $m2->expects($this->once())
+ ->method('afterException')
+ ->will($this->returnValue($response));
+
+ $this->dispatcher->registerMiddleware($m1);
+ $this->dispatcher->registerMiddleware($m2);
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->assertEquals($response, $this->dispatcher->afterException($this->controller, $this->method, $this->exception));
+ }
+
+
+ public function testAfterExceptionShouldThrowAgainWhenNotHandled(){
+ $m1 = new TestMiddleware(false);
+ $m2 = new TestMiddleware(true);
+
+ $this->dispatcher->registerMiddleware($m1);
+ $this->dispatcher->registerMiddleware($m2);
+
+ $this->setExpectedException('\Exception');
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+ }
+
+
+ public function testBeforeControllerCorrectArguments(){
+ $m1 = $this->getMiddleware();
+ $this->dispatcher->beforeController($this->controller, $this->method);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ }
+
+
+ public function testAfterControllerCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->dispatcher->afterController($this->controller, $this->method, $this->response);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->response, $m1->response);
+ }
+
+
+ public function testAfterExceptionCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->setExpectedException('\Exception');
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->exception, $m1->exception);
+ }
+
+
+ public function testBeforeOutputCorrectArguments(){
+ $m1 = $this->getMiddleware();
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
+
+ $this->assertEquals($this->controller, $m1->controller);
+ $this->assertEquals($this->method, $m1->methodName);
+ $this->assertEquals($this->out, $m1->output);
+ }
+
+
+ public function testBeforeControllerOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->beforeController($this->controller, $this->method);
+
+ $this->assertEquals(1, $m1->beforeControllerOrder);
+ $this->assertEquals(2, $m2->beforeControllerOrder);
+ }
+
+ public function testAfterControllerOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->afterController($this->controller, $this->method, $this->response);
+
+ $this->assertEquals(2, $m1->afterControllerOrder);
+ $this->assertEquals(1, $m2->afterControllerOrder);
+ }
+
+
+ public function testAfterExceptionOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->setExpectedException('\Exception');
+ $this->dispatcher->beforeController($this->controller, $this->method);
+ $this->dispatcher->afterException($this->controller, $this->method, $this->exception);
+
+ $this->assertEquals(1, $m1->afterExceptionOrder);
+ $this->assertEquals(1, $m2->afterExceptionOrder);
+ }
+
+
+ public function testBeforeOutputOrder(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware();
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
+
+ $this->assertEquals(2, $m1->beforeOutputOrder);
+ $this->assertEquals(1, $m2->beforeOutputOrder);
+ }
+
+
+ public function testExceptionShouldRunAfterExceptionOfOnlyPreviouslyExecutedMiddlewares(){
+ $m1 = $this->getMiddleware();
+ $m2 = $this->getMiddleware(true);
+ $m3 = $this->getMock('\OC\AppFramework\Middleware\Middleware');
+ $m3->expects($this->never())
+ ->method('afterException');
+ $m3->expects($this->never())
+ ->method('beforeController');
+ $m3->expects($this->never())
+ ->method('afterController');
+
+ $this->dispatcher->registerMiddleware($m3);
+
+ $this->dispatcher->beforeOutput($this->controller, $this->method, $this->out);
+
+ $this->assertEquals(2, $m1->beforeOutputOrder);
+ $this->assertEquals(1, $m2->beforeOutputOrder);
+ }
+}
diff --git a/tests/lib/appframework/middleware/MiddlewareTest.php b/tests/lib/appframework/middleware/MiddlewareTest.php
new file mode 100644
index 00000000000..5e2930ac6a3
--- /dev/null
+++ b/tests/lib/appframework/middleware/MiddlewareTest.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework;
+
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Middleware\Middleware;
+
+
+class ChildMiddleware extends Middleware {};
+
+
+class MiddlewareTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Middleware
+ */
+ private $middleware;
+ private $controller;
+ private $exception;
+ private $api;
+
+ protected function setUp(){
+ $this->middleware = new ChildMiddleware();
+
+ $this->api = $this->getMock('OC\AppFramework\Core\API',
+ array(), array('test'));
+
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($this->api, new Request()));
+ $this->exception = new \Exception();
+ $this->response = $this->getMock('OCP\AppFramework\Http\Response');
+ }
+
+
+ public function testBeforeController() {
+ $this->middleware->beforeController($this->controller, null);
+ $this->assertNull(null);
+ }
+
+
+ public function testAfterExceptionRaiseAgainWhenUnhandled() {
+ $this->setExpectedException('Exception');
+ $afterEx = $this->middleware->afterException($this->controller, null, $this->exception);
+ }
+
+
+ public function testAfterControllerReturnResponseWhenUnhandled() {
+ $response = $this->middleware->afterController($this->controller, null, $this->response);
+
+ $this->assertEquals($this->response, $response);
+ }
+
+
+ public function testBeforeOutputReturnOutputhenUnhandled() {
+ $output = $this->middleware->beforeOutput($this->controller, null, 'test');
+
+ $this->assertEquals('test', $output);
+ }
+
+
+}
diff --git a/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
new file mode 100644
index 00000000000..3ed44282a7b
--- /dev/null
+++ b/tests/lib/appframework/middleware/security/SecurityMiddlewareTest.php
@@ -0,0 +1,296 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Middleware\Security;
+
+use OC\AppFramework\Http\Http;
+use OC\AppFramework\Http\Request;
+use OC\AppFramework\Http\RedirectResponse;
+use OCP\AppFramework\Http\JSONResponse;
+
+
+class SecurityMiddlewareTest extends \PHPUnit_Framework_TestCase {
+
+ private $middleware;
+ private $controller;
+ private $secException;
+ private $secAjaxException;
+ private $request;
+
+ public function setUp() {
+ $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($api, new Request()));
+
+ $this->request = new Request();
+ $this->middleware = new SecurityMiddleware($api, $this->request);
+ $this->secException = new SecurityException('hey', false);
+ $this->secAjaxException = new SecurityException('hey', true);
+ }
+
+
+ private function getAPI(){
+ return $this->getMock('OC\AppFramework\Core\API',
+ array('isLoggedIn', 'passesCSRFCheck', 'isAdminUser',
+ 'isSubAdminUser', 'activateNavigationEntry',
+ 'getUserId'),
+ array('app'));
+ }
+
+
+ private function checkNavEntry($method, $shouldBeActivated=false){
+ $api = $this->getAPI();
+
+ if($shouldBeActivated){
+ $api->expects($this->once())
+ ->method('activateNavigationEntry');
+ } else {
+ $api->expects($this->never())
+ ->method('activateNavigationEntry');
+ }
+
+ $sec = new SecurityMiddleware($api, $this->request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
+ }
+
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ */
+ public function testSetNavigationEntry(){
+ $this->checkNavEntry('testSetNavigationEntry', true);
+ }
+
+
+ private function ajaxExceptionStatus($method, $test, $status) {
+ $api = $this->getAPI();
+ $api->expects($this->any())
+ ->method($test)
+ ->will($this->returnValue(false));
+
+ // isAdminUser requires isLoggedIn call to return true
+ if ($test === 'isAdminUser') {
+ $api->expects($this->any())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+ }
+
+ $sec = new SecurityMiddleware($api, $this->request);
+
+ try {
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
+ $method);
+ } catch (SecurityException $ex){
+ $this->assertEquals($status, $ex->getCode());
+ }
+ }
+
+ public function testAjaxStatusLoggedInCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusLoggedInCheck',
+ 'isLoggedIn',
+ Http::STATUS_UNAUTHORIZED
+ );
+ }
+
+ /**
+ * @NoCSRFRequired
+ * @NoAdminRequired
+ */
+ public function testAjaxNotAdminCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxNotAdminCheck',
+ 'isAdminUser',
+ Http::STATUS_FORBIDDEN
+ );
+ }
+
+ /**
+ * @PublicPage
+ */
+ public function testAjaxStatusCSRFCheck() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusCSRFCheck',
+ 'passesCSRFCheck',
+ Http::STATUS_PRECONDITION_FAILED
+ );
+ }
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ */
+ public function testAjaxStatusAllGood() {
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isLoggedIn',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isAdminUser',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'isSubAdminUser',
+ 0
+ );
+ $this->ajaxExceptionStatus(
+ 'testAjaxStatusAllGood',
+ 'passesCSRFCheck',
+ 0
+ );
+ }
+
+
+ /**
+ * @PublicPage
+ * @NoCSRFRequired
+ */
+ public function testNoChecks(){
+ $api = $this->getAPI();
+ $api->expects($this->never())
+ ->method('passesCSRFCheck')
+ ->will($this->returnValue(true));
+ $api->expects($this->never())
+ ->method('isAdminUser')
+ ->will($this->returnValue(true));
+ $api->expects($this->never())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+
+ $sec = new SecurityMiddleware($api, $this->request);
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest',
+ 'testNoChecks');
+ }
+
+
+ private function securityCheck($method, $expects, $shouldFail=false){
+ $api = $this->getAPI();
+ $api->expects($this->once())
+ ->method($expects)
+ ->will($this->returnValue(!$shouldFail));
+
+ // admin check requires login
+ if ($expects === 'isAdminUser') {
+ $api->expects($this->once())
+ ->method('isLoggedIn')
+ ->will($this->returnValue(true));
+ }
+
+ $sec = new SecurityMiddleware($api, $this->request);
+
+ if($shouldFail){
+ $this->setExpectedException('\OC\AppFramework\Middleware\Security\SecurityException');
+ } else {
+ $this->setExpectedException(null);
+ }
+
+ $sec->beforeController('\OC\AppFramework\Middleware\Security\SecurityMiddlewareTest', $method);
+ }
+
+
+ /**
+ * @PublicPage
+ */
+ public function testCsrfCheck(){
+ $this->securityCheck('testCsrfCheck', 'passesCSRFCheck');
+ }
+
+
+ /**
+ * @PublicPage
+ */
+ public function testFailCsrfCheck(){
+ $this->securityCheck('testFailCsrfCheck', 'passesCSRFCheck', true);
+ }
+
+
+ /**
+ * @NoCSRFRequired
+ * @NoAdminRequired
+ */
+ public function testLoggedInCheck(){
+ $this->securityCheck('testLoggedInCheck', 'isLoggedIn');
+ }
+
+
+ /**
+ * @NoCSRFRequired
+ * @NoAdminRequired
+ */
+ public function testFailLoggedInCheck(){
+ $this->securityCheck('testFailLoggedInCheck', 'isLoggedIn', true);
+ }
+
+
+ /**
+ * @NoCSRFRequired
+ */
+ public function testIsAdminCheck(){
+ $this->securityCheck('testIsAdminCheck', 'isAdminUser');
+ }
+
+
+ /**
+ * @NoCSRFRequired
+ */
+ public function testFailIsAdminCheck(){
+ $this->securityCheck('testFailIsAdminCheck', 'isAdminUser', true);
+ }
+
+
+ public function testAfterExceptionNotCaughtThrowsItAgain(){
+ $ex = new \Exception();
+ $this->setExpectedException('\Exception');
+ $this->middleware->afterException($this->controller, 'test', $ex);
+ }
+
+
+ public function testAfterExceptionReturnsRedirect(){
+ $api = $this->getMock('OC\AppFramework\Core\API', array(), array('test'));
+ $this->controller = $this->getMock('OC\AppFramework\Controller\Controller',
+ array(), array($api, new Request()));
+
+ $this->request = new Request(
+ array('server' => array('HTTP_ACCEPT' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')));
+ $this->middleware = new SecurityMiddleware($api, $this->request);
+ $response = $this->middleware->afterException($this->controller, 'test',
+ $this->secException);
+
+ $this->assertTrue($response instanceof RedirectResponse);
+ }
+
+
+ public function testAfterAjaxExceptionReturnsJSONError(){
+ $response = $this->middleware->afterException($this->controller, 'test',
+ $this->secAjaxException);
+
+ $this->assertTrue($response instanceof JSONResponse);
+ }
+
+
+}
diff --git a/tests/lib/appframework/routing/RoutingTest.php b/tests/lib/appframework/routing/RoutingTest.php
new file mode 100644
index 00000000000..a7aa922db12
--- /dev/null
+++ b/tests/lib/appframework/routing/RoutingTest.php
@@ -0,0 +1,213 @@
+<?php
+
+namespace OC\AppFramework\Routing;
+
+use OC\AppFramework\DependencyInjection\DIContainer;
+use OC\AppFramework\routing\RouteConfig;
+
+
+class RouteConfigTest extends \PHPUnit_Framework_TestCase
+{
+
+ public function testSimpleRoute()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'GET')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ public function testSimpleRouteWithMissingVerb()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'GET', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ public function testSimpleRouteWithLowercaseVerb()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders#open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ $this->assertSimpleRoute($routes, 'folders.open', 'DELETE', '/folders/{folderId}/open', 'FoldersController', 'open');
+ }
+
+ /**
+ * @expectedException \UnexpectedValueException
+ */
+ public function testSimpleRouteWithBrokenName()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'folders_open', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $routes);
+
+ $config->register();
+ }
+
+ public function testSimpleRouteWithUnderScoreNames()
+ {
+ $routes = array('routes' => array(
+ array('name' => 'admin_folders#open_current', 'url' => '/folders/{folderId}/open', 'verb' => 'delete')
+ ));
+
+ $this->assertSimpleRoute($routes, 'admin_folders.open_current', 'DELETE', '/folders/{folderId}/open', 'AdminFoldersController', 'openCurrent');
+ }
+
+ public function testResource()
+ {
+ $routes = array('resources' => array('accounts' => array('url' => '/accounts')));
+
+ $this->assertResource($routes, 'accounts', '/accounts', 'AccountsController', 'accountId');
+ }
+
+ public function testResourceWithUnderScoreName()
+ {
+ $routes = array('resources' => array('admin_accounts' => array('url' => '/admin/accounts')));
+
+ $this->assertResource($routes, 'admin_accounts', '/admin/accounts', 'AdminAccountsController', 'adminAccountId');
+ }
+
+ private function assertSimpleRoute($routes, $name, $verb, $url, $controllerName, $actionName)
+ {
+ // route mocks
+ $route = $this->mockRoute($verb, $controllerName, $actionName);
+
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // we expect create to be called once:
+ $router
+ ->expects($this->once())
+ ->method('create')
+ ->with($this->equalTo('app1.' . $name), $this->equalTo($url))
+ ->will($this->returnValue($route));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $routes);
+
+ $config->register();
+ }
+
+ private function assertResource($yaml, $resourceName, $url, $controllerName, $paramName)
+ {
+ // router mock
+ $router = $this->getMock("\OC_Router", array('create'));
+
+ // route mocks
+ $indexRoute = $this->mockRoute('GET', $controllerName, 'index');
+ $showRoute = $this->mockRoute('GET', $controllerName, 'show');
+ $createRoute = $this->mockRoute('POST', $controllerName, 'create');
+ $updateRoute = $this->mockRoute('PUT', $controllerName, 'update');
+ $destroyRoute = $this->mockRoute('DELETE', $controllerName, 'destroy');
+
+ $urlWithParam = $url . '/{' . $paramName . '}';
+
+ // we expect create to be called once:
+ $router
+ ->expects($this->at(0))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.index'), $this->equalTo($url))
+ ->will($this->returnValue($indexRoute));
+
+ $router
+ ->expects($this->at(1))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.show'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($showRoute));
+
+ $router
+ ->expects($this->at(2))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.create'), $this->equalTo($url))
+ ->will($this->returnValue($createRoute));
+
+ $router
+ ->expects($this->at(3))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.update'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($updateRoute));
+
+ $router
+ ->expects($this->at(4))
+ ->method('create')
+ ->with($this->equalTo('app1.' . $resourceName . '.destroy'), $this->equalTo($urlWithParam))
+ ->will($this->returnValue($destroyRoute));
+
+ // load route configuration
+ $container = new DIContainer('app1');
+ $config = new RouteConfig($container, $router, $yaml);
+
+ $config->register();
+ }
+
+ /**
+ * @param $verb
+ * @param $controllerName
+ * @param $actionName
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ private function mockRoute($verb, $controllerName, $actionName)
+ {
+ $container = new DIContainer('app1');
+ $route = $this->getMock("\OC_Route", array('method', 'action'), array(), '', false);
+ $route
+ ->expects($this->exactly(1))
+ ->method('method')
+ ->with($this->equalTo($verb))
+ ->will($this->returnValue($route));
+
+ $route
+ ->expects($this->exactly(1))
+ ->method('action')
+ ->with($this->equalTo(new RouteActionHandler($container, $controllerName, $actionName)))
+ ->will($this->returnValue($route));
+ return $route;
+ }
+
+}
+
+/*
+#
+# sample routes.yaml for ownCloud
+#
+# the section simple describes one route
+
+routes:
+ - name: folders#open
+ url: /folders/{folderId}/open
+ verb: GET
+ # controller: name.split()[0]
+ # action: name.split()[1]
+
+# for a resource following actions will be generated:
+# - index
+# - create
+# - show
+# - update
+# - destroy
+# - new
+resources:
+ accounts:
+ url: /accounts
+
+ folders:
+ url: /accounts/{accountId}/folders
+ # actions can be used to define additional actions on the resource
+ actions:
+ - name: validate
+ verb: GET
+ on-collection: false
+
+ * */
diff --git a/tests/lib/appframework/utility/MethodAnnotationReaderTest.php b/tests/lib/appframework/utility/MethodAnnotationReaderTest.php
new file mode 100644
index 00000000000..c68812aa5c7
--- /dev/null
+++ b/tests/lib/appframework/utility/MethodAnnotationReaderTest.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Bernhard Posselt
+ * @copyright 2012 Bernhard Posselt nukeawhale@gmail.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+
+namespace OC\AppFramework\Utility;
+
+
+class MethodAnnotationReaderTest extends \PHPUnit_Framework_TestCase {
+
+
+ /**
+ * @Annotation
+ */
+ public function testReadAnnotation(){
+ $reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
+ 'testReadAnnotation');
+
+ $this->assertTrue($reader->hasAnnotation('Annotation'));
+ }
+
+
+ /**
+ * @Annotation
+ * @param test
+ */
+ public function testReadAnnotationNoLowercase(){
+ $reader = new MethodAnnotationReader('\OC\AppFramework\Utility\MethodAnnotationReaderTest',
+ 'testReadAnnotationNoLowercase');
+
+ $this->assertTrue($reader->hasAnnotation('Annotation'));
+ $this->assertFalse($reader->hasAnnotation('param'));
+ }
+
+
+}
diff --git a/tests/lib/autoloader.php b/tests/lib/autoloader.php
index 0e7d606ccf6..b182dc87477 100644
--- a/tests/lib/autoloader.php
+++ b/tests/lib/autoloader.php
@@ -19,15 +19,15 @@ class AutoLoader extends \PHPUnit_Framework_TestCase {
}
public function testLeadingSlashOnClassName() {
- $this->assertEquals(array('files/storage/local.php'), $this->loader->findClass('\OC\Files\Storage\Local'));
+ $this->assertEquals(array('private/files/storage/local.php'), $this->loader->findClass('\OC\Files\Storage\Local'));
}
public function testNoLeadingSlashOnClassName() {
- $this->assertEquals(array('files/storage/local.php'), $this->loader->findClass('OC\Files\Storage\Local'));
+ $this->assertEquals(array('private/files/storage/local.php'), $this->loader->findClass('OC\Files\Storage\Local'));
}
public function testLegacyPath() {
- $this->assertEquals(array('legacy/files.php', 'files.php'), $this->loader->findClass('OC_Files'));
+ $this->assertEquals(array('private/legacy/files.php', 'private/files.php'), $this->loader->findClass('OC_Files'));
}
public function testClassPath() {
@@ -54,11 +54,11 @@ class AutoLoader extends \PHPUnit_Framework_TestCase {
}
public function testLoadCoreNamespace() {
- $this->assertEquals(array('foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
+ $this->assertEquals(array('private/foo/bar.php'), $this->loader->findClass('OC\Foo\Bar'));
}
public function testLoadCore() {
- $this->assertEquals(array('legacy/foo/bar.php', 'foo/bar.php'), $this->loader->findClass('OC_Foo_Bar'));
+ $this->assertEquals(array('private/legacy/foo/bar.php', 'private/foo/bar.php'), $this->loader->findClass('OC_Foo_Bar'));
}
public function testLoadPublicNamespace() {
diff --git a/tests/lib/cache.php b/tests/lib/cache.php
index 3dcf39f7d60..8fefa25f65d 100644
--- a/tests/lib/cache.php
+++ b/tests/lib/cache.php
@@ -8,7 +8,7 @@
abstract class Test_Cache extends PHPUnit_Framework_TestCase {
/**
- * @var OC_Cache cache;
+ * @var \OC\Cache cache;
*/
protected $instance;
diff --git a/tests/lib/cache/file.php b/tests/lib/cache/file.php
index 038cb21b257..3767c83fcb1 100644
--- a/tests/lib/cache/file.php
+++ b/tests/lib/cache/file.php
@@ -20,7 +20,9 @@
*
*/
-class Test_Cache_File extends Test_Cache {
+namespace Test\Cache;
+
+class FileCache extends \Test_Cache {
private $user;
private $datadir;
@@ -30,8 +32,8 @@ class Test_Cache_File extends Test_Cache {
public function setUp() {
//clear all proxies and hooks so we can do clean testing
- OC_FileProxy::clearProxies();
- OC_Hook::clear('OC_Filesystem');
+ \OC_FileProxy::clearProxies();
+ \OC_Hook::clear('OC_Filesystem');
//disabled atm
//enable only the encryption hook if needed
@@ -44,27 +46,27 @@ class Test_Cache_File extends Test_Cache {
$storage = new \OC\Files\Storage\Temporary(array());
\OC\Files\Filesystem::mount($storage,array(),'/');
$datadir = str_replace('local::', '', $storage->getId());
- $this->datadir = OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data');
- OC_Config::setValue('datadirectory', $datadir);
+ $this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
+ \OC_Config::setValue('datadirectory', $datadir);
- OC_User::clearBackends();
- OC_User::useBackend(new OC_User_Dummy());
+ \OC_User::clearBackends();
+ \OC_User::useBackend(new \OC_User_Dummy());
//login
- OC_User::createUser('test', 'test');
+ \OC_User::createUser('test', 'test');
- $this->user=OC_User::getUser();
- OC_User::setUserId('test');
+ $this->user = \OC_User::getUser();
+ \OC_User::setUserId('test');
//set up the users dir
- $rootView=new \OC\Files\View('');
+ $rootView = new \OC\Files\View('');
$rootView->mkdir('/test');
- $this->instance=new OC_Cache_File();
+ $this->instance=new \OC\Cache\File();
}
public function tearDown() {
- OC_User::setUserId($this->user);
- OC_Config::setValue('datadirectory', $this->datadir);
+ \OC_User::setUserId($this->user);
+ \OC_Config::setValue('datadirectory', $this->datadir);
}
}
diff --git a/tests/lib/cache/usercache.php b/tests/lib/cache/usercache.php
new file mode 100644
index 00000000000..21b7f848ab6
--- /dev/null
+++ b/tests/lib/cache/usercache.php
@@ -0,0 +1,68 @@
+<?php
+/**
+* ownCloud
+*
+* @author Robin Appelman
+* @copyright 2012 Robin Appelman icewind@owncloud.com
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+namespace Test\Cache;
+
+class UserCache extends \Test_Cache {
+ private $user;
+ private $datadir;
+
+ public function setUp() {
+ //clear all proxies and hooks so we can do clean testing
+ \OC_FileProxy::clearProxies();
+ \OC_Hook::clear('OC_Filesystem');
+
+ //disabled atm
+ //enable only the encryption hook if needed
+ //if(OC_App::isEnabled('files_encryption')) {
+ // OC_FileProxy::register(new OC_FileProxy_Encryption());
+ //}
+
+ //set up temporary storage
+ \OC\Files\Filesystem::clearMounts();
+ $storage = new \OC\Files\Storage\Temporary(array());
+ \OC\Files\Filesystem::mount($storage,array(),'/');
+ $datadir = str_replace('local::', '', $storage->getId());
+ $this->datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT.'/data');
+ \OC_Config::setValue('datadirectory', $datadir);
+
+ \OC_User::clearBackends();
+ \OC_User::useBackend(new \OC_User_Dummy());
+
+ //login
+ \OC_User::createUser('test', 'test');
+
+ $this->user = \OC_User::getUser();
+ \OC_User::setUserId('test');
+
+ //set up the users dir
+ $rootView=new \OC\Files\View('');
+ $rootView->mkdir('/test');
+
+ $this->instance=new \OC\Cache\UserCache();
+ }
+
+ public function tearDown() {
+ \OC_User::setUserId($this->user);
+ \OC_Config::setValue('datadirectory', $this->datadir);
+ }
+}
diff --git a/tests/lib/connector/sabre/aborteduploaddetectionplugin.php b/tests/lib/connector/sabre/aborteduploaddetectionplugin.php
new file mode 100644
index 00000000000..bef0e4c4d7d
--- /dev/null
+++ b/tests/lib/connector/sabre/aborteduploaddetectionplugin.php
@@ -0,0 +1,97 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+class Test_OC_Connector_Sabre_AbortedUploadDetectionPlugin extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre_DAV_Server
+ */
+ private $server;
+
+ /**
+ * @var OC_Connector_Sabre_AbortedUploadDetectionPlugin
+ */
+ private $plugin;
+
+ public function setUp() {
+ $this->server = new Sabre_DAV_Server();
+ $this->plugin = new OC_Connector_Sabre_AbortedUploadDetectionPlugin();
+ $this->plugin->initialize($this->server);
+ }
+
+ /**
+ * @dataProvider lengthProvider
+ */
+ public function testLength($expected, $headers)
+ {
+ $this->server->httpRequest = new Sabre_HTTP_Request($headers);
+ $length = $this->plugin->getLength();
+ $this->assertEquals($expected, $length);
+ }
+
+ /**
+ * @dataProvider verifyContentLengthProvider
+ */
+ public function testVerifyContentLength($fileSize, $headers)
+ {
+ $this->plugin->fileView = $this->buildFileViewMock($fileSize);
+
+ $this->server->httpRequest = new Sabre_HTTP_Request($headers);
+ $this->plugin->verifyContentLength('foo.txt');
+ $this->assertTrue(true);
+ }
+
+ /**
+ * @dataProvider verifyContentLengthFailedProvider
+ * @expectedException Sabre_DAV_Exception_BadRequest
+ */
+ public function testVerifyContentLengthFailed($fileSize, $headers)
+ {
+ $this->plugin->fileView = $this->buildFileViewMock($fileSize);
+
+ // we expect unlink to be called
+ $this->plugin->fileView->expects($this->once())->method('unlink');
+
+
+ $this->server->httpRequest = new Sabre_HTTP_Request($headers);
+ $this->plugin->verifyContentLength('foo.txt');
+ }
+
+ public function verifyContentLengthProvider() {
+ return array(
+ array(1024, array()),
+ array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array(512, array('HTTP_CONTENT_LENGTH' => '512')),
+ );
+ }
+
+ public function verifyContentLengthFailedProvider() {
+ return array(
+ array(1025, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array(525, array('HTTP_CONTENT_LENGTH' => '512')),
+ );
+ }
+
+ public function lengthProvider() {
+ return array(
+ array(null, array()),
+ array(1024, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '1024')),
+ array(512, array('HTTP_CONTENT_LENGTH' => '512')),
+ array(2048, array('HTTP_X_EXPECTED_ENTITY_LENGTH' => '2048', 'HTTP_CONTENT_LENGTH' => '1024')),
+ );
+ }
+
+ private function buildFileViewMock($fileSize) {
+ // mock filesysten
+ $view = $this->getMock('\OC\Files\View', array('filesize', 'unlink'), array(), '', FALSE);
+ $view->expects($this->any())->method('filesize')->withAnyParameters()->will($this->returnValue($fileSize));
+
+ return $view;
+ }
+
+}
diff --git a/tests/lib/connector/sabre/objecttree.php b/tests/lib/connector/sabre/objecttree.php
new file mode 100644
index 00000000000..1d76bb59676
--- /dev/null
+++ b/tests/lib/connector/sabre/objecttree.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Copyright (c) 2013 Thomas Müller <thomas.mueller@tmit.eu>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test\OC\Connector\Sabre;
+
+
+use OC_Connector_Sabre_Directory;
+use PHPUnit_Framework_TestCase;
+use Sabre_DAV_Exception_Forbidden;
+
+class TestDoubleFileView extends \OC\Files\View{
+
+ public function __construct($updatables, $canRename = true) {
+ $this->updatables = $updatables;
+ $this->canRename = $canRename;
+ }
+
+ public function isUpdatable($path) {
+ return $this->updatables[$path];
+ }
+
+ public function rename($path1, $path2) {
+ return $this->canRename;
+ }
+}
+
+class ObjectTree extends PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider moveFailedProvider
+ * @expectedException Sabre_DAV_Exception_Forbidden
+ */
+ public function testMoveFailed($source, $dest, $updatables) {
+ $this->moveTest($source, $dest, $updatables);
+ }
+
+ /**
+ * @dataProvider moveSuccessProvider
+ */
+ public function testMoveSuccess($source, $dest, $updatables) {
+ $this->moveTest($source, $dest, $updatables);
+ $this->assertTrue(true);
+ }
+
+ function moveFailedProvider() {
+ return array(
+ array('a/b', 'a/c', array('a' => false, 'a/b' => false, 'a/c' => false)),
+ array('a/b', 'b/b', array('a' => false, 'a/b' => false, 'b' => false, 'b/b' => false)),
+ array('a/b', 'b/b', array('a' => false, 'a/b' => true, 'b' => false, 'b/b' => false)),
+ array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => false, 'b/b' => false)),
+ );
+ }
+
+ function moveSuccessProvider() {
+ return array(
+ array('a/b', 'a/c', array('a' => false, 'a/b' => true, 'a/c' => false)),
+ array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false)),
+ );
+ }
+
+ /**
+ * @param $source
+ * @param $dest
+ * @param $updatables
+ */
+ private function moveTest($source, $dest, $updatables) {
+ $rootDir = new OC_Connector_Sabre_Directory('');
+ $objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree',
+ array('nodeExists', 'getNodeForPath'),
+ array($rootDir));
+
+ $objectTree->expects($this->once())
+ ->method('getNodeForPath')
+ ->with($this->identicalTo($source))
+ ->will($this->returnValue(false));
+
+ /** @var $objectTree \OC\Connector\Sabre\ObjectTree */
+ $objectTree->fileView = new TestDoubleFileView($updatables);
+ $objectTree->move($source, $dest);
+ }
+
+}
diff --git a/tests/lib/files/cache/permissions.php b/tests/lib/files/cache/permissions.php
index 7e6e11e2eb2..4b284c2c8e2 100644
--- a/tests/lib/files/cache/permissions.php
+++ b/tests/lib/files/cache/permissions.php
@@ -8,6 +8,8 @@
namespace Test\Files\Cache;
+use OC\Files\Storage\Temporary;
+
class Permissions extends \PHPUnit_Framework_TestCase {
/***
* @var \OC\Files\Cache\Permissions $permissionsCache
@@ -55,4 +57,19 @@ class Permissions extends \PHPUnit_Framework_TestCase {
$this->permissionsCache->removeMultiple($ids, $user);
}
+
+ public function testUpdatePermissionsOnRescan() {
+ $storage = new Temporary(array());
+ $scanner = $storage->getScanner();
+ $cache = $storage->getCache();
+ $permissionsCache = $storage->getPermissionsCache();
+
+ $storage->file_put_contents('foo.txt', 'bar');
+ $scanner->scan('');
+ $id = $cache->getId('foo.txt');
+ $permissionsCache->set($id, 'test', 1);
+
+ $scanner->scan('');
+ $this->assertEquals(-1, $permissionsCache->get($id, 'test'));
+ }
}
diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php
index 4c90119814a..3f3a045377a 100644
--- a/tests/lib/files/cache/scanner.php
+++ b/tests/lib/files/cache/scanner.php
@@ -24,6 +24,21 @@ class Scanner extends \PHPUnit_Framework_TestCase {
*/
private $cache;
+ function setUp() {
+ $this->storage = new \OC\Files\Storage\Temporary(array());
+ $this->scanner = new \OC\Files\Cache\Scanner($this->storage);
+ $this->cache = new \OC\Files\Cache\Cache($this->storage);
+ }
+
+ function tearDown() {
+ if ($this->cache) {
+ $ids = $this->cache->getAll();
+ $permissionsCache = $this->storage->getPermissionsCache();
+ $permissionsCache->removeMultiple($ids, \OC_User::getUser());
+ $this->cache->clear();
+ }
+ }
+
function testFile() {
$data = "dummy file data\n";
$this->storage->file_put_contents('foo.txt', $data);
@@ -194,18 +209,28 @@ class Scanner extends \PHPUnit_Framework_TestCase {
$this->assertFalse($this->cache->inCache('folder/bar.txt'));
}
- function setUp() {
- $this->storage = new \OC\Files\Storage\Temporary(array());
- $this->scanner = new \OC\Files\Cache\Scanner($this->storage);
- $this->cache = new \OC\Files\Cache\Cache($this->storage);
- }
+ public function testETagRecreation() {
+ $this->fillTestFolders();
- function tearDown() {
- if ($this->cache) {
- $ids = $this->cache->getAll();
- $permissionsCache = $this->storage->getPermissionsCache();
- $permissionsCache->removeMultiple($ids, \OC_User::getUser());
- $this->cache->clear();
- }
+ $this->scanner->scan('folder/bar.txt');
+
+ // manipulate etag to simulate an empty etag
+ $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+ $data0 = $this->cache->get('folder/bar.txt');
+ $data1 = $this->cache->get('folder');
+ $data2 = $this->cache->get('');
+ $data0['etag'] = '';
+ $this->cache->put('folder/bar.txt', $data0);
+
+ // rescan
+ $this->scanner->scan('folder/bar.txt', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG);
+
+ // verify cache content
+ $newData0 = $this->cache->get('folder/bar.txt');
+ $newData1 = $this->cache->get('folder');
+ $newData2 = $this->cache->get('');
+ $this->assertNotEmpty($newData0['etag']);
+ $this->assertNotEquals($data1['etag'], $newData1['etag']);
+ $this->assertNotEquals($data2['etag'], $newData2['etag']);
}
}
diff --git a/tests/lib/preview.php b/tests/lib/preview.php
index bebdc12b500..d0cdd2c44fb 100644
--- a/tests/lib/preview.php
+++ b/tests/lib/preview.php
@@ -92,6 +92,47 @@ class Preview extends \PHPUnit_Framework_TestCase {
$this->assertEquals($image->height(), $maxY);
}
+ public function txtBlacklist() {
+ $txt = 'random text file';
+ $ics = file_get_contents(__DIR__ . '/../data/testcal.ics');
+ $vcf = file_get_contents(__DIR__ . '/../data/testcontact.vcf');
+
+ return array(
+ array('txt', $txt, false),
+ array('ics', $ics, true),
+ array('vcf', $vcf, true),
+ );
+ }
+
+ /**
+ * @dataProvider txtBlacklist
+ */
+ public function testIsTransparent($extension, $data, $expectedResult) {
+ $user = $this->initFS();
+
+ $rootView = new \OC\Files\View('');
+ $rootView->mkdir('/'.$user);
+ $rootView->mkdir('/'.$user.'/files');
+
+ $x = 32;
+ $y = 32;
+
+ $sample = '/'.$user.'/files/test.'.$extension;
+ $rootView->file_put_contents($sample, $data);
+ $preview = new \OC\Preview($user, 'files/', 'test.'.$extension, $x, $y);
+ $image = $preview->getPreview();
+ $resource = $image->resource();
+
+ //http://stackoverflow.com/questions/5702953/imagecolorat-and-transparency
+ $colorIndex = imagecolorat($resource, 1, 1);
+ $colorInfo = imagecolorsforindex($resource, $colorIndex);
+ $this->assertEquals(
+ $expectedResult,
+ $colorInfo['alpha'] === 127,
+ 'Failed asserting that only previews for text files are transparent.'
+ );
+ }
+
private function initFS() {
if(\OC\Files\Filesystem::getView()){
$user = \OC_User::getUser();
@@ -105,4 +146,4 @@ class Preview extends \PHPUnit_Framework_TestCase {
return $user;
}
-} \ No newline at end of file
+}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index e02b0e4354d..8e9eef65d32 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -535,4 +535,52 @@ class Test_Share extends PHPUnit_Framework_TestCase {
'Failed asserting that user 3 still has access to test.txt after expiration date has been set.'
);
}
+
+ protected function getShareByValidToken($token) {
+ $row = OCP\Share::getShareByToken($token);
+ $this->assertInternalType(
+ 'array',
+ $row,
+ "Failed asserting that a share for token $token exists."
+ );
+ return $row;
+ }
+
+ public function testShareItemWithLink() {
+ OC_User::setUserId($this->user1);
+ $token = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, OCP\PERMISSION_READ);
+ $this->assertInternalType(
+ 'string',
+ $token,
+ 'Failed asserting that user 1 successfully shared text.txt as link with token.'
+ );
+
+ // testGetShareByTokenNoExpiration
+ $row = $this->getShareByValidToken($token);
+ $this->assertEmpty(
+ $row['expiration'],
+ 'Failed asserting that the returned row does not have an expiration date.'
+ );
+
+ // testGetShareByTokenExpirationValid
+ $this->assertTrue(
+ OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture),
+ 'Failed asserting that user 1 successfully set a future expiration date for the test.txt share.'
+ );
+ $row = $this->getShareByValidToken($token);
+ $this->assertNotEmpty(
+ $row['expiration'],
+ 'Failed asserting that the returned row has an expiration date.'
+ );
+
+ // testGetShareByTokenExpirationExpired
+ $this->assertTrue(
+ OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInPast),
+ 'Failed asserting that user 1 successfully set a past expiration date for the test.txt share.'
+ );
+ $this->assertFalse(
+ OCP\Share::getShareByToken($token),
+ 'Failed asserting that an expired share could not be found.'
+ );
+ }
}
diff --git a/tests/lib/tags.php b/tests/lib/tags.php
new file mode 100644
index 00000000000..97e3734cfda
--- /dev/null
+++ b/tests/lib/tags.php
@@ -0,0 +1,166 @@
+<?php
+/**
+* ownCloud
+*
+* @author Thomas Tanghus
+* @copyright 2012-13 Thomas Tanghus (thomas@tanghus.net)
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+* License as published by the Free Software Foundation; either
+* version 3 of the License, or any later version.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+*
+* You should have received a copy of the GNU Affero General Public
+* License along with this library. If not, see <http://www.gnu.org/licenses/>.
+*
+*/
+
+class Test_Tags extends PHPUnit_Framework_TestCase {
+
+ protected $objectType;
+ protected $user;
+ protected $backupGlobals = FALSE;
+
+ public function setUp() {
+
+ OC_User::clearBackends();
+ OC_User::useBackend('dummy');
+ $this->user = uniqid('user_');
+ $this->objectType = uniqid('type_');
+ OC_User::createUser($this->user, 'pass');
+ OC_User::setUserId($this->user);
+ $this->tagMgr = new OC\TagManager($this->user);
+
+ }
+
+ public function tearDown() {
+ //$query = OC_DB::prepare('DELETE FROM `*PREFIX*vcategories` WHERE `item_type` = ?');
+ //$query->execute(array('test'));
+ }
+
+ public function testInstantiateWithDefaults() {
+ $defaultTags = array('Friends', 'Family', 'Work', 'Other');
+
+ $tagger = $this->tagMgr->load($this->objectType, $defaultTags);
+
+ $this->assertEquals(4, count($tagger->getTags()));
+ }
+
+ public function testAddTags() {
+ $tags = array('Friends', 'Family', 'Work', 'Other');
+
+ $tagger = $this->tagMgr->load($this->objectType);
+
+ foreach($tags as $tag) {
+ $result = $tagger->add($tag);
+ $this->assertGreaterThan(0, $result, 'add() returned an ID <= 0');
+ $this->assertTrue((bool)$result);
+ }
+
+ $this->assertFalse($tagger->add('Family'));
+ $this->assertFalse($tagger->add('fAMILY'));
+
+ $this->assertCount(4, $tagger->getTags(), 'Wrong number of added tags');
+ }
+
+ public function testAddMultiple() {
+ $tags = array('Friends', 'Family', 'Work', 'Other');
+
+ $tagger = $this->tagMgr->load($this->objectType);
+
+ foreach($tags as $tag) {
+ $this->assertFalse($tagger->hasTag($tag));
+ }
+
+ $result = $tagger->addMultiple($tags);
+ $this->assertTrue((bool)$result);
+
+ foreach($tags as $tag) {
+ $this->assertTrue($tagger->hasTag($tag));
+ }
+
+ $this->assertCount(4, $tagger->getTags(), 'Not all tags added');
+ }
+
+ public function testIsEmpty() {
+ $tagger = $this->tagMgr->load($this->objectType);
+
+ $this->assertEquals(0, count($tagger->getTags()));
+ $this->assertTrue($tagger->isEmpty());
+
+ $result = $tagger->add('Tag');
+ $this->assertGreaterThan(0, $result, 'add() returned an ID <= 0');
+ $this->assertNotEquals(false, $result, 'add() returned false');
+ $this->assertFalse($tagger->isEmpty());
+ }
+
+ public function testdeleteTags() {
+ $defaultTags = array('Friends', 'Family', 'Work', 'Other');
+ $tagger = $this->tagMgr->load($this->objectType, $defaultTags);
+
+ $this->assertEquals(4, count($tagger->getTags()));
+
+ $tagger->delete('family');
+ $this->assertEquals(3, count($tagger->getTags()));
+
+ $tagger->delete(array('Friends', 'Work', 'Other'));
+ $this->assertEquals(0, count($tagger->getTags()));
+
+ }
+
+ public function testRenameTag() {
+ $defaultTags = array('Friends', 'Family', 'Wrok', 'Other');
+ $tagger = $this->tagMgr->load($this->objectType, $defaultTags);
+
+ $this->assertTrue($tagger->rename('Wrok', 'Work'));
+ $this->assertTrue($tagger->hasTag('Work'));
+ $this->assertFalse($tagger->hastag('Wrok'));
+ $this->assertFalse($tagger->rename('Wrok', 'Work'));
+
+ }
+
+ public function testTagAs() {
+ $objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+ $tagger = $this->tagMgr->load($this->objectType);
+
+ foreach($objids as $id) {
+ $tagger->tagAs($id, 'Family');
+ }
+
+ $this->assertEquals(1, count($tagger->getTags()));
+ $this->assertEquals(9, count($tagger->getIdsForTag('Family')));
+ }
+
+ /**
+ * @depends testTagAs
+ */
+ public function testUnTag() {
+ $objIds = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
+
+ // Is this "legal"?
+ $this->testTagAs();
+ $tagger = $this->tagMgr->load($this->objectType);
+
+ foreach($objIds as $id) {
+ $this->assertTrue(in_array($id, $tagger->getIdsForTag('Family')));
+ $tagger->unTag($id, 'Family');
+ $this->assertFalse(in_array($id, $tagger->getIdsForTag('Family')));
+ }
+
+ $this->assertEquals(1, count($tagger->getTags()));
+ $this->assertEquals(0, count($tagger->getIdsForTag('Family')));
+ }
+
+ public function testFavorite() {
+ $tagger = $this->tagMgr->load($this->objectType);
+ $this->assertTrue($tagger->addToFavorites(1));
+ $this->assertTrue($tagger->removeFromFavorites(1));
+ }
+
+}
diff --git a/tests/lib/user.php b/tests/lib/user.php
new file mode 100644
index 00000000000..66c7f3f0d74
--- /dev/null
+++ b/tests/lib/user.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+namespace Test;
+
+use OC\Hooks\PublicEmitter;
+
+class User extends \PHPUnit_Framework_TestCase {
+
+ public function testCheckPassword() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ $backend = $this->getMock('\OC_User_Dummy');
+ $backend->expects($this->once())
+ ->method('checkPassword')
+ ->with($this->equalTo('foo'), $this->equalTo('bar'))
+ ->will($this->returnValue('foo'));
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ if ($actions === \OC_USER_BACKEND_CHECK_PASSWORD) {
+ return true;
+ } else {
+ return false;
+ }
+ }));
+
+ $manager = \OC_User::getManager();
+ $manager->registerBackend($backend);
+
+ $uid = \OC_User::checkPassword('foo', 'bar');
+ $this->assertEquals($uid, 'foo');
+ }
+
+} \ No newline at end of file
diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php
index bc49f6db4b2..00901dd4115 100644
--- a/tests/lib/user/manager.php
+++ b/tests/lib/user/manager.php
@@ -98,6 +98,51 @@ class Manager extends \PHPUnit_Framework_TestCase {
$this->assertTrue($manager->userExists('foo'));
}
+ public function testCheckPassword() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ $backend = $this->getMock('\OC_User_Dummy');
+ $backend->expects($this->once())
+ ->method('checkPassword')
+ ->with($this->equalTo('foo'), $this->equalTo('bar'))
+ ->will($this->returnValue(true));
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnCallback(function ($actions) {
+ if ($actions === \OC_USER_BACKEND_CHECK_PASSWORD) {
+ return true;
+ } else {
+ return false;
+ }
+ }));
+
+ $manager = new \OC\User\Manager();
+ $manager->registerBackend($backend);
+
+ $user = $manager->checkPassword('foo', 'bar');
+ $this->assertTrue($user instanceof \OC\User\User);
+ }
+
+ public function testCheckPasswordNotSupported() {
+ /**
+ * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
+ */
+ $backend = $this->getMock('\OC_User_Dummy');
+ $backend->expects($this->never())
+ ->method('checkPassword');
+
+ $backend->expects($this->any())
+ ->method('implementsActions')
+ ->will($this->returnValue(false));
+
+ $manager = new \OC\User\Manager();
+ $manager->registerBackend($backend);
+
+ $this->assertFalse($manager->checkPassword('foo', 'bar'));
+ }
+
public function testGetOneBackendExists() {
/**
* @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend
diff --git a/tests/lib/user/session.php b/tests/lib/user/session.php
index 274e9e2831e..e457a7bda30 100644
--- a/tests/lib/user/session.php
+++ b/tests/lib/user/session.php
@@ -62,10 +62,6 @@ class Session extends \PHPUnit_Framework_TestCase {
$user = $this->getMock('\OC\User\User', array(), array('foo', $backend));
$user->expects($this->once())
- ->method('checkPassword')
- ->with('bar')
- ->will($this->returnValue(true));
- $user->expects($this->once())
->method('isEnabled')
->will($this->returnValue(true));
$user->expects($this->any())
@@ -73,8 +69,8 @@ class Session extends \PHPUnit_Framework_TestCase {
->will($this->returnValue('foo'));
$manager->expects($this->once())
- ->method('get')
- ->with('foo')
+ ->method('checkPassword')
+ ->with('foo', 'bar')
->will($this->returnValue($user));
$userSession = new \OC\User\Session($manager, $session);
@@ -93,16 +89,12 @@ class Session extends \PHPUnit_Framework_TestCase {
$user = $this->getMock('\OC\User\User', array(), array('foo', $backend));
$user->expects($this->once())
- ->method('checkPassword')
- ->with('bar')
- ->will($this->returnValue(true));
- $user->expects($this->once())
->method('isEnabled')
->will($this->returnValue(false));
$manager->expects($this->once())
- ->method('get')
- ->with('foo')
+ ->method('checkPassword')
+ ->with('foo', 'bar')
->will($this->returnValue($user));
$userSession = new \OC\User\Session($manager, $session);
@@ -119,17 +111,13 @@ class Session extends \PHPUnit_Framework_TestCase {
$backend = $this->getMock('OC_User_Dummy');
$user = $this->getMock('\OC\User\User', array(), array('foo', $backend));
- $user->expects($this->once())
- ->method('checkPassword')
- ->with('bar')
- ->will($this->returnValue(false));
$user->expects($this->never())
->method('isEnabled');
$manager->expects($this->once())
- ->method('get')
- ->with('foo')
- ->will($this->returnValue($user));
+ ->method('checkPassword')
+ ->with('foo', 'bar')
+ ->will($this->returnValue(false));
$userSession = new \OC\User\Session($manager, $session);
$userSession->login('foo', 'bar');
@@ -145,9 +133,9 @@ class Session extends \PHPUnit_Framework_TestCase {
$backend = $this->getMock('OC_User_Dummy');
$manager->expects($this->once())
- ->method('get')
- ->with('foo')
- ->will($this->returnValue(null));
+ ->method('checkPassword')
+ ->with('foo', 'bar')
+ ->will($this->returnValue(false));
$userSession = new \OC\User\Session($manager, $session);
$userSession->login('foo', 'bar');
diff --git a/tests/lib/user/user.php b/tests/lib/user/user.php
index b0d170cbfc5..de5ccbf38c1 100644
--- a/tests/lib/user/user.php
+++ b/tests/lib/user/user.php
@@ -100,46 +100,6 @@ class User extends \PHPUnit_Framework_TestCase {
$this->assertTrue($user->delete());
}
- public function testCheckPassword() {
- /**
- * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
- */
- $backend = $this->getMock('\OC_User_Dummy');
- $backend->expects($this->once())
- ->method('checkPassword')
- ->with($this->equalTo('foo'), $this->equalTo('bar'))
- ->will($this->returnValue(true));
-
- $backend->expects($this->any())
- ->method('implementsActions')
- ->will($this->returnCallback(function ($actions) {
- if ($actions === \OC_USER_BACKEND_CHECK_PASSWORD) {
- return true;
- } else {
- return false;
- }
- }));
-
- $user = new \OC\User\User('foo', $backend);
- $this->assertTrue($user->checkPassword('bar'));
- }
-
- public function testCheckPasswordNotSupported() {
- /**
- * @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
- */
- $backend = $this->getMock('\OC_User_Dummy');
- $backend->expects($this->never())
- ->method('checkPassword');
-
- $backend->expects($this->any())
- ->method('implementsActions')
- ->will($this->returnValue(false));
-
- $user = new \OC\User\User('foo', $backend);
- $this->assertFalse($user->checkPassword('bar'));
- }
-
public function testGetHome() {
/**
* @var \OC_User_Backend | \PHPUnit_Framework_MockObject_MockObject $backend
diff --git a/tests/lib/vcategories.php b/tests/lib/vcategories.php
deleted file mode 100644
index df5f600f20d..00000000000
--- a/tests/lib/vcategories.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-/**
-* ownCloud
-*
-* @author Thomas Tanghus
-* @copyright 2012 Thomas Tanghus (thomas@tanghus.net)
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library. If not, see <http://www.gnu.org/licenses/>.
-*
-*/
-
-//require_once("../lib/template.php");
-
-class Test_VCategories extends PHPUnit_Framework_TestCase {
-
- protected $objectType;
- protected $user;
- protected $backupGlobals = FALSE;
-
- public function setUp() {
-
- OC_User::clearBackends();
- OC_User::useBackend('dummy');
- $this->user = uniqid('user_');
- $this->objectType = uniqid('type_');
- OC_User::createUser($this->user, 'pass');
- OC_User::setUserId($this->user);
-
- }
-
- public function tearDown() {
- //$query = OC_DB::prepare('DELETE FROM `*PREFIX*vcategories` WHERE `item_type` = ?');
- //$query->execute(array('test'));
- }
-
- public function testInstantiateWithDefaults() {
- $defcategories = array('Friends', 'Family', 'Work', 'Other');
-
- $catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
-
- $this->assertEquals(4, count($catmgr->categories()));
- }
-
- public function testAddCategories() {
- $categories = array('Friends', 'Family', 'Work', 'Other');
-
- $catmgr = new OC_VCategories($this->objectType, $this->user);
-
- foreach($categories as $category) {
- $result = $catmgr->add($category);
- $this->assertTrue((bool)$result);
- }
-
- $this->assertFalse($catmgr->add('Family'));
- $this->assertFalse($catmgr->add('fAMILY'));
-
- $this->assertEquals(4, count($catmgr->categories()));
- }
-
- public function testdeleteCategories() {
- $defcategories = array('Friends', 'Family', 'Work', 'Other');
- $catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
- $this->assertEquals(4, count($catmgr->categories()));
-
- $catmgr->delete('family');
- $this->assertEquals(3, count($catmgr->categories()));
-
- $catmgr->delete(array('Friends', 'Work', 'Other'));
- $this->assertEquals(0, count($catmgr->categories()));
-
- }
-
- public function testrenameCategory() {
- $defcategories = array('Friends', 'Family', 'Wrok', 'Other');
- $catmgr = new OC_VCategories($this->objectType, $this->user, $defcategories);
-
- $this->assertTrue($catmgr->rename('Wrok', 'Work'));
- $this->assertTrue($catmgr->hasCategory('Work'));
- $this->assertFalse($catmgr->hasCategory('Wrok'));
- $this->assertFalse($catmgr->rename('Wrok', 'Work'));
-
- }
-
- public function testAddToCategory() {
- $objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
-
- $catmgr = new OC_VCategories($this->objectType, $this->user);
-
- foreach($objids as $id) {
- $catmgr->addToCategory($id, 'Family');
- }
-
- $this->assertEquals(1, count($catmgr->categories()));
- $this->assertEquals(9, count($catmgr->idsForCategory('Family')));
- }
-
- /**
- * @depends testAddToCategory
- */
- public function testRemoveFromCategory() {
- $objids = array(1, 2, 3, 4, 5, 6, 7, 8, 9);
-
- // Is this "legal"?
- $this->testAddToCategory();
- $catmgr = new OC_VCategories($this->objectType, $this->user);
-
- foreach($objids as $id) {
- $this->assertTrue(in_array($id, $catmgr->idsForCategory('Family')));
- $catmgr->removeFromCategory($id, 'Family');
- $this->assertFalse(in_array($id, $catmgr->idsForCategory('Family')));
- }
-
- $this->assertEquals(1, count($catmgr->categories()));
- $this->assertEquals(0, count($catmgr->idsForCategory('Family')));
- }
-
-}
diff --git a/tests/phpunit.xml.dist b/tests/phpunit.xml.dist
index 25dfc64cfeb..71a4ff2762c 100644
--- a/tests/phpunit.xml.dist
+++ b/tests/phpunit.xml.dist
@@ -11,7 +11,21 @@
<directory suffix=".php">..</directory>
<exclude>
<directory suffix=".php">../3rdparty</directory>
+ <directory suffix=".php">../apps/files/l10n</directory>
+ <directory suffix=".php">../apps/files_external/l10n</directory>
+ <directory suffix=".php">../apps/files_external/3rdparty</directory>
+ <directory suffix=".php">../apps/files_versions/l10n</directory>
+ <directory suffix=".php">../apps/files_encryption/l10n</directory>
+ <directory suffix=".php">../apps/files_encryption/3rdparty</directory>
+ <directory suffix=".php">../apps/files_sharing/l10n</directory>
+ <directory suffix=".php">../apps/files_trashbin/l10n</directory>
+ <directory suffix=".php">../apps/user_ldap/l10n</directory>
+ <directory suffix=".php">../apps/user_webdavauth/l10n</directory>
<directory suffix=".php">../lib/MDB2</directory>
+ <directory suffix=".php">../lib/l10n</directory>
+ <directory suffix=".php">../core/l10n</directory>
+ <directory suffix=".php">../settings/l10n</directory>
+ <directory suffix=".php">../tests</directory>
</exclude>
</whitelist>
</filter>
diff --git a/version.php b/version.php
new file mode 100644
index 00000000000..eb2e9a4a68b
--- /dev/null
+++ b/version.php
@@ -0,0 +1,17 @@
+<?php
+
+// We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel when updating major/minor version number.
+$OC_Version=array(5, 80, 8, 0);
+
+// The human radable string
+$OC_VersionString='6.0 pre alpha';
+
+// The ownCloud edition
+$OC_Edition='';
+
+// The ownCloud channel
+$OC_Channel='';
+
+// The build number
+$OC_Build='';
+