Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

vor 12 Jahren
vor 11 Jahren
vor 13 Jahren
vor 11 Jahren
vor 13 Jahren
vor 12 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
vor 13 Jahren
Merge branch 'master' of git://gitorious.org/owncloud/owncloud into oracle-support Conflicts: 3rdparty/Sabre/CardDAV/Plugin.php 3rdparty/smb4php/smb.php apps/bookmarks/ajax/addBookmark.php apps/bookmarks/ajax/editBookmark.php apps/bookmarks/appinfo/migrate.php apps/calendar/ajax/calendar/edit.form.php apps/calendar/ajax/changeview.php apps/calendar/ajax/import/import.php apps/calendar/ajax/settings/guesstimezone.php apps/calendar/ajax/settings/setfirstday.php apps/calendar/ajax/settings/settimeformat.php apps/calendar/ajax/share/changepermission.php apps/calendar/ajax/share/share.php apps/calendar/ajax/share/unshare.php apps/calendar/appinfo/app.php apps/calendar/appinfo/remote.php apps/calendar/appinfo/update.php apps/calendar/appinfo/version apps/calendar/js/calendar.js apps/calendar/l10n/da.php apps/calendar/l10n/de.php apps/calendar/l10n/fi_FI.php apps/calendar/l10n/gl.php apps/calendar/l10n/he.php apps/calendar/l10n/hr.php apps/calendar/l10n/ja_JP.php apps/calendar/l10n/lb.php apps/calendar/l10n/lt_LT.php apps/calendar/l10n/nb_NO.php apps/calendar/l10n/pl.php apps/calendar/l10n/pt_PT.php apps/calendar/l10n/ro.php apps/calendar/l10n/ru.php apps/calendar/l10n/sv.php apps/calendar/l10n/zh_CN.php apps/calendar/l10n/zh_TW.php apps/calendar/lib/app.php apps/calendar/lib/calendar.php apps/calendar/lib/object.php apps/calendar/lib/share.php apps/calendar/templates/part.choosecalendar.rowfields.php apps/calendar/templates/part.import.php apps/calendar/templates/settings.php apps/contacts/ajax/activation.php apps/contacts/ajax/addressbook/delete.php apps/contacts/ajax/contact/add.php apps/contacts/ajax/contact/addproperty.php apps/contacts/ajax/contact/delete.php apps/contacts/ajax/contact/deleteproperty.php apps/contacts/ajax/contact/saveproperty.php apps/contacts/ajax/createaddressbook.php apps/contacts/ajax/cropphoto.php apps/contacts/ajax/currentphoto.php apps/contacts/ajax/importaddressbook.php apps/contacts/ajax/oc_photo.php apps/contacts/ajax/savecrop.php apps/contacts/ajax/selectaddressbook.php apps/contacts/ajax/updateaddressbook.php apps/contacts/ajax/uploadimport.php apps/contacts/ajax/uploadphoto.php apps/contacts/appinfo/migrate.php apps/contacts/appinfo/remote.php apps/contacts/css/contacts.css apps/contacts/import.php apps/contacts/index.php apps/contacts/js/contacts.js apps/contacts/l10n/ca.php apps/contacts/l10n/cs_CZ.php apps/contacts/l10n/da.php apps/contacts/l10n/de.php apps/contacts/l10n/el.php apps/contacts/l10n/eo.php apps/contacts/l10n/es.php apps/contacts/l10n/et_EE.php apps/contacts/l10n/eu.php apps/contacts/l10n/fa.php apps/contacts/l10n/fi_FI.php apps/contacts/l10n/fr.php apps/contacts/l10n/he.php apps/contacts/l10n/hr.php apps/contacts/l10n/hu_HU.php apps/contacts/l10n/ia.php apps/contacts/l10n/it.php apps/contacts/l10n/ja_JP.php apps/contacts/l10n/ko.php apps/contacts/l10n/lb.php apps/contacts/l10n/mk.php apps/contacts/l10n/nb_NO.php apps/contacts/l10n/nl.php apps/contacts/l10n/pl.php apps/contacts/l10n/pt_BR.php apps/contacts/l10n/pt_PT.php apps/contacts/l10n/ro.php apps/contacts/l10n/ru.php apps/contacts/l10n/sk_SK.php apps/contacts/l10n/sl.php apps/contacts/l10n/sv.php apps/contacts/l10n/th_TH.php apps/contacts/l10n/tr.php apps/contacts/l10n/zh_CN.php apps/contacts/l10n/zh_TW.php apps/contacts/lib/addressbook.php apps/contacts/lib/hooks.php apps/contacts/lib/vcard.php apps/contacts/photo.php apps/contacts/templates/part.contact.php apps/contacts/templates/part.contacts.php apps/contacts/templates/part.cropphoto.php apps/contacts/templates/part.importaddressbook.php apps/contacts/templates/part.selectaddressbook.php apps/contacts/thumbnail.php apps/files/ajax/download.php apps/files/ajax/newfile.php apps/files/ajax/timezone.php apps/files/appinfo/update.php apps/files/appinfo/version apps/files/index.php apps/files/js/fileactions.js apps/files/js/filelist.js apps/files/js/files.js apps/files/l10n/ar.php apps/files/l10n/bg_BG.php apps/files/l10n/ca.php apps/files/l10n/cs_CZ.php apps/files/l10n/da.php apps/files/l10n/de.php apps/files/l10n/el.php apps/files/l10n/eo.php apps/files/l10n/es.php apps/files/l10n/et_EE.php apps/files/l10n/eu.php apps/files/l10n/fa.php apps/files/l10n/fi_FI.php apps/files/l10n/fr.php apps/files/l10n/gl.php apps/files/l10n/he.php apps/files/l10n/hr.php apps/files/l10n/hu_HU.php apps/files/l10n/ia.php apps/files/l10n/id.php apps/files/l10n/it.php apps/files/l10n/ja_JP.php apps/files/l10n/ko.php apps/files/l10n/lb.php apps/files/l10n/lt_LT.php apps/files/l10n/mk.php apps/files/l10n/ms_MY.php apps/files/l10n/nb_NO.php apps/files/l10n/nl.php apps/files/l10n/nn_NO.php apps/files/l10n/pl.php apps/files/l10n/pt_BR.php apps/files/l10n/pt_PT.php apps/files/l10n/ro.php apps/files/l10n/ru.php apps/files/l10n/sk_SK.php apps/files/l10n/sl.php apps/files/l10n/sr.php apps/files/l10n/sr@latin.php apps/files/l10n/sv.php apps/files/l10n/th_TH.php apps/files/l10n/tr.php apps/files/l10n/uk.php apps/files/l10n/zh_CN.php apps/files/l10n/zh_TW.php apps/files_archive/js/archive.js apps/files_encryption/lib/cryptstream.php apps/files_encryption/lib/proxy.php apps/files_encryption/tests/proxy.php apps/files_external/appinfo/app.php apps/files_external/lib/smb.php apps/files_external/lib/streamwrapper.php apps/files_external/tests/config.php apps/files_external/tests/smb.php apps/files_sharing/ajax/email.php apps/files_sharing/ajax/getitem.php apps/files_sharing/ajax/setpermissions.php apps/files_sharing/ajax/share.php apps/files_sharing/ajax/toggleresharing.php apps/files_sharing/ajax/unshare.php apps/files_sharing/ajax/userautocomplete.php apps/files_sharing/js/settings.js apps/files_sharing/js/share.js apps/files_sharing/lib_share.php apps/files_sharing/settings.php apps/files_sharing/sharedstorage.php apps/files_sharing/templates/settings.php apps/files_versions/ajax/rollbackVersion.php apps/files_versions/versions.php apps/gallery/ajax/thumbnail.php apps/gallery/appinfo/app.php apps/gallery/appinfo/update.php apps/gallery/appinfo/version apps/gallery/css/styles.css apps/gallery/index.php apps/gallery/js/pictures.js apps/gallery/l10n/ca.php apps/gallery/l10n/cs_CZ.php apps/gallery/l10n/de.php apps/gallery/l10n/el.php apps/gallery/l10n/es.php apps/gallery/l10n/fi_FI.php apps/gallery/l10n/fr.php apps/gallery/l10n/it.php apps/gallery/l10n/pl.php apps/gallery/l10n/pt_PT.php apps/gallery/l10n/ru.php apps/gallery/l10n/sl.php apps/gallery/l10n/sv.php apps/gallery/l10n/th_TH.php apps/gallery/l10n/tr.php apps/gallery/l10n/zh_CN.php apps/gallery/lib/album.php apps/gallery/lib/hooks_handlers.php apps/gallery/lib/managers.php apps/gallery/lib/photo.php apps/gallery/lib/tiles.php apps/gallery/lib/tiles_test.php apps/gallery/templates/index.php apps/media/lib_ampache.php apps/media/lib_collection.php apps/media/lib_media.php apps/remoteStorage/lib_remoteStorage.php apps/tasks/ajax/addtaskform.php apps/tasks/ajax/edittask.php apps/user_ldap/appinfo/update.php apps/user_ldap/group_ldap.php apps/user_ldap/lib_ldap.php apps/user_ldap/settings.php apps/user_ldap/templates/settings.php apps/user_ldap/user_ldap.php apps/user_migrate/appinfo/app.php apps/user_migrate/templates/settings.php apps/user_webfinger/host-meta.php config/config.sample.php core/js/js.js core/l10n/da.php core/l10n/de.php core/l10n/fi_FI.php core/l10n/gl.php core/l10n/he.php core/l10n/hr.php core/l10n/id.php core/l10n/ja_JP.php core/l10n/lb.php core/l10n/lt_LT.php core/l10n/nb_NO.php core/l10n/pl.php core/l10n/pt_PT.php core/l10n/ro.php core/l10n/ru.php core/l10n/sv.php core/lostpassword/index.php core/templates/layout.user.php core/templates/login.php db_structure.xml index.php l10n/af/calendar.po l10n/af/contacts.po l10n/af/core.po l10n/af/files.po l10n/af/settings.po l10n/ar/calendar.po l10n/ar/contacts.po l10n/ar/core.po l10n/ar/files.po l10n/ar/media.po l10n/ar/settings.po l10n/bg_BG/calendar.po l10n/bg_BG/contacts.po l10n/bg_BG/core.po l10n/bg_BG/files.po l10n/bg_BG/media.po l10n/bg_BG/settings.po l10n/ca/calendar.po l10n/ca/contacts.po l10n/ca/core.po l10n/ca/files.po l10n/ca/gallery.po l10n/ca/settings.po l10n/cs_CZ/calendar.po l10n/cs_CZ/contacts.po l10n/cs_CZ/core.po l10n/cs_CZ/files.po l10n/cs_CZ/gallery.po l10n/cs_CZ/settings.po l10n/da/calendar.po l10n/da/contacts.po l10n/da/core.po l10n/da/files.po l10n/da/settings.po l10n/de/calendar.po l10n/de/contacts.po l10n/de/core.po l10n/de/files.po l10n/de/gallery.po l10n/de/settings.po l10n/el/calendar.po l10n/el/contacts.po l10n/el/core.po l10n/el/files.po l10n/el/gallery.po l10n/el/settings.po l10n/eo/calendar.po l10n/eo/contacts.po l10n/eo/core.po l10n/eo/files.po l10n/eo/media.po l10n/eo/settings.po l10n/es/calendar.po l10n/es/contacts.po l10n/es/core.po l10n/es/files.po l10n/es/gallery.po l10n/es/settings.po l10n/et_EE/calendar.po l10n/et_EE/contacts.po l10n/et_EE/core.po l10n/et_EE/files.po l10n/et_EE/settings.po l10n/eu/calendar.po l10n/eu/contacts.po l10n/eu/core.po l10n/eu/files.po l10n/eu/settings.po l10n/fa/calendar.po l10n/fa/contacts.po l10n/fa/core.po l10n/fa/files.po l10n/fa/settings.po l10n/fi_FI/calendar.po l10n/fi_FI/contacts.po l10n/fi_FI/core.po l10n/fi_FI/files.po l10n/fi_FI/gallery.po l10n/fi_FI/settings.po l10n/fr/calendar.po l10n/fr/contacts.po l10n/fr/core.po l10n/fr/files.po l10n/fr/gallery.po l10n/fr/media.po l10n/fr/settings.po l10n/gl/calendar.po l10n/gl/contacts.po l10n/gl/core.po l10n/gl/files.po l10n/gl/settings.po l10n/he/calendar.po l10n/he/contacts.po l10n/he/core.po l10n/he/files.po l10n/he/settings.po l10n/hr/calendar.po l10n/hr/contacts.po l10n/hr/core.po l10n/hr/files.po l10n/hr/settings.po l10n/hu_HU/calendar.po l10n/hu_HU/contacts.po l10n/hu_HU/core.po l10n/hu_HU/files.po l10n/hu_HU/settings.po l10n/hy/calendar.po l10n/hy/contacts.po l10n/hy/core.po l10n/hy/files.po l10n/hy/settings.po l10n/ia/calendar.po l10n/ia/contacts.po l10n/ia/core.po l10n/ia/files.po l10n/ia/settings.po l10n/id/calendar.po l10n/id/contacts.po l10n/id/core.po l10n/id/files.po l10n/id/settings.po l10n/it/calendar.po l10n/it/contacts.po l10n/it/core.po l10n/it/files.po l10n/it/gallery.po l10n/it/settings.po l10n/ja_JP/calendar.po l10n/ja_JP/contacts.po l10n/ja_JP/core.po l10n/ja_JP/files.po l10n/ja_JP/settings.po l10n/ko/calendar.po l10n/ko/contacts.po l10n/ko/core.po l10n/ko/files.po l10n/ko/settings.po l10n/lb/calendar.po l10n/lb/contacts.po l10n/lb/core.po l10n/lb/files.po l10n/lb/settings.po l10n/lt_LT/calendar.po l10n/lt_LT/contacts.po l10n/lt_LT/core.po l10n/lt_LT/files.po l10n/lt_LT/settings.po l10n/mk/calendar.po l10n/mk/contacts.po l10n/mk/core.po l10n/mk/files.po l10n/mk/settings.po l10n/ms_MY/calendar.po l10n/ms_MY/contacts.po l10n/ms_MY/core.po l10n/ms_MY/files.po l10n/ms_MY/settings.po l10n/nb_NO/calendar.po l10n/nb_NO/contacts.po l10n/nb_NO/core.po l10n/nb_NO/files.po l10n/nb_NO/settings.po l10n/nl/calendar.po l10n/nl/contacts.po l10n/nl/core.po l10n/nl/files.po l10n/nl/settings.po l10n/nn_NO/calendar.po l10n/nn_NO/contacts.po l10n/nn_NO/core.po l10n/nn_NO/files.po l10n/nn_NO/settings.po l10n/pl/calendar.po l10n/pl/contacts.po l10n/pl/core.po l10n/pl/files.po l10n/pl/gallery.po l10n/pl/settings.po l10n/pt_BR/calendar.po l10n/pt_BR/contacts.po l10n/pt_BR/core.po l10n/pt_BR/files.po l10n/pt_BR/settings.po l10n/pt_PT/calendar.po l10n/pt_PT/contacts.po l10n/pt_PT/core.po l10n/pt_PT/files.po l10n/pt_PT/gallery.po l10n/pt_PT/settings.po l10n/ro/calendar.po l10n/ro/contacts.po l10n/ro/core.po l10n/ro/files.po l10n/ro/settings.po l10n/ru/calendar.po l10n/ru/contacts.po l10n/ru/core.po l10n/ru/files.po l10n/ru/gallery.po l10n/ru/settings.po l10n/sk_SK/calendar.po l10n/sk_SK/contacts.po l10n/sk_SK/core.po l10n/sk_SK/files.po l10n/sk_SK/settings.po l10n/sl/calendar.po l10n/sl/contacts.po l10n/sl/core.po l10n/sl/files.po l10n/sl/gallery.po l10n/sl/settings.po l10n/sr/calendar.po l10n/sr/contacts.po l10n/sr/core.po l10n/sr/files.po l10n/sr/settings.po l10n/sr@latin/calendar.po l10n/sr@latin/contacts.po l10n/sr@latin/core.po l10n/sr@latin/files.po l10n/sr@latin/settings.po l10n/sv/calendar.po l10n/sv/contacts.po l10n/sv/core.po l10n/sv/files.po l10n/sv/gallery.po l10n/sv/media.po l10n/sv/settings.po l10n/templates/bookmarks.pot l10n/templates/calendar.pot l10n/templates/contacts.pot l10n/templates/core.pot l10n/templates/files.pot l10n/templates/gallery.pot l10n/templates/media.pot l10n/templates/settings.pot l10n/th_TH/calendar.po l10n/th_TH/contacts.po l10n/th_TH/core.po l10n/th_TH/files.po l10n/th_TH/gallery.po l10n/th_TH/settings.po l10n/tr/calendar.po l10n/tr/contacts.po l10n/tr/core.po l10n/tr/files.po l10n/tr/gallery.po l10n/tr/settings.po l10n/uk/calendar.po l10n/uk/contacts.po l10n/uk/core.po l10n/uk/files.po l10n/uk/media.po l10n/uk/settings.po l10n/zh_CN/calendar.po l10n/zh_CN/contacts.po l10n/zh_CN/core.po l10n/zh_CN/files.po l10n/zh_CN/gallery.po l10n/zh_CN/settings.po l10n/zh_TW/calendar.po l10n/zh_TW/contacts.po l10n/zh_TW/core.po l10n/zh_TW/files.po l10n/zh_TW/settings.po lib/app.php lib/base.php lib/connector/sabre/file.php lib/connector/sabre/locks.php lib/connector/sabre/node.php lib/db.php lib/filecache.php lib/fileproxy/quota.php lib/files.php lib/filestorage/local.php lib/filesystemview.php lib/group/database.php lib/helper.php lib/installer.php lib/json.php lib/l10n.php lib/migrate.php lib/mimetypes.fixlist.php lib/ocs.php lib/preferences.php lib/public/json.php lib/public/util.php lib/template.php lib/user.php lib/user/database.php lib/util.php lib/vcategories.php ocs/providers.php settings/admin.php settings/ajax/lostpassword.php settings/ajax/removeuser.php settings/ajax/setbackgroundjobsmode.php settings/ajax/setlanguage.php settings/ajax/setquota.php settings/ajax/togglegroups.php settings/apps.php settings/css/settings.css settings/js/apps.js settings/js/users.js settings/l10n/bg_BG.php settings/l10n/ca.php settings/l10n/cs_CZ.php settings/l10n/da.php settings/l10n/de.php settings/l10n/el.php settings/l10n/eo.php settings/l10n/es.php settings/l10n/et_EE.php settings/l10n/eu.php settings/l10n/fa.php settings/l10n/fi_FI.php settings/l10n/fr.php settings/l10n/gl.php settings/l10n/he.php settings/l10n/hr.php settings/l10n/hu_HU.php settings/l10n/it.php settings/l10n/ja_JP.php settings/l10n/ko.php settings/l10n/lt_LT.php settings/l10n/mk.php settings/l10n/ms_MY.php settings/l10n/nb_NO.php settings/l10n/nl.php settings/l10n/nn_NO.php settings/l10n/pl.php settings/l10n/pt_BR.php settings/l10n/pt_PT.php settings/l10n/ru.php settings/l10n/sk_SK.php settings/l10n/sl.php settings/l10n/sv.php settings/l10n/th_TH.php settings/l10n/tr.php settings/l10n/zh_CN.php settings/personal.php settings/templates/admin.php settings/templates/users.php
vor 12 Jahren
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. <?php
  2. /**
  3. * ownCloud
  4. *
  5. * @author Frank Karlitschek
  6. * @author Jakob Sack
  7. * @copyright 2012 Frank Karlitschek frank@owncloud.org
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  11. * License as published by the Free Software Foundation; either
  12. * version 3 of the License, or any later version.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  18. *
  19. * You should have received a copy of the GNU Affero General Public
  20. * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  21. *
  22. */
  23. /**
  24. * Prints an XSS escaped string
  25. * @param string $string the string which will be escaped and printed
  26. */
  27. function p($string) {
  28. print(OC_Util::sanitizeHTML($string));
  29. }
  30. /**
  31. * Prints an unescaped string
  32. * @param string $string the string which will be printed as it is
  33. */
  34. function print_unescaped($string) {
  35. print($string);
  36. }
  37. /**
  38. * @brief make OC_Helper::linkTo available as a simple function
  39. * @param string $app app
  40. * @param string $file file
  41. * @param array $args array with param=>value, will be appended to the returned url
  42. * @return string link to the file
  43. *
  44. * For further information have a look at OC_Helper::linkTo
  45. */
  46. function link_to( $app, $file, $args = array() ) {
  47. return OC_Helper::linkTo( $app, $file, $args );
  48. }
  49. /**
  50. * @brief make OC_Helper::imagePath available as a simple function
  51. * @param string $app app
  52. * @param string $image image
  53. * @return string link to the image
  54. *
  55. * For further information have a look at OC_Helper::imagePath
  56. */
  57. function image_path( $app, $image ) {
  58. return OC_Helper::imagePath( $app, $image );
  59. }
  60. /**
  61. * @brief make OC_Helper::mimetypeIcon available as a simple function
  62. * @param string $mimetype mimetype
  63. * @return string link to the image
  64. *
  65. * For further information have a look at OC_Helper::mimetypeIcon
  66. */
  67. function mimetype_icon( $mimetype ) {
  68. return OC_Helper::mimetypeIcon( $mimetype );
  69. }
  70. /**
  71. * @brief make OC_Helper::humanFileSize available as a simple function
  72. * @param int $bytes size in bytes
  73. * @return string size as string
  74. *
  75. * For further information have a look at OC_Helper::humanFileSize
  76. */
  77. function human_file_size( $bytes ) {
  78. return OC_Helper::humanFileSize( $bytes );
  79. }
  80. function simple_file_size($bytes) {
  81. if ($bytes < 0) {
  82. return '?';
  83. }
  84. $mbytes = round($bytes / (1024 * 1024), 1);
  85. if ($bytes == 0) {
  86. return '0';
  87. }
  88. if ($mbytes < 0.1) {
  89. return '&lt; 0.1';
  90. }
  91. if ($mbytes > 1000) {
  92. return '&gt; 1000';
  93. } else {
  94. return number_format($mbytes, 1);
  95. }
  96. }
  97. function relative_modified_date($timestamp) {
  98. $l=OC_L10N::get('lib');
  99. $timediff = time() - $timestamp;
  100. $diffminutes = round($timediff/60);
  101. $diffhours = round($diffminutes/60);
  102. $diffdays = round($diffhours/24);
  103. $diffmonths = round($diffdays/31);
  104. if($timediff < 60) { return $l->t('seconds ago'); }
  105. else if($timediff < 120) { return $l->t('1 minute ago'); }
  106. else if($timediff < 3600) { return $l->t('%d minutes ago', $diffminutes); }
  107. else if($timediff < 7200) { return $l->t('1 hour ago'); }
  108. else if($timediff < 86400) { return $l->t('%d hours ago', $diffhours); }
  109. else if((date('G')-$diffhours) > 0) { return $l->t('today'); }
  110. else if((date('G')-$diffhours) > -24) { return $l->t('yesterday'); }
  111. else if($timediff < 2678400) { return $l->t('%d days ago', $diffdays); }
  112. else if($timediff < 5184000) { return $l->t('last month'); }
  113. else if((date('n')-$diffmonths) > 0) { return $l->t('%d months ago', $diffmonths); }
  114. else if($timediff < 63113852) { return $l->t('last year'); }
  115. else { return $l->t('years ago'); }
  116. }
  117. function html_select_options($options, $selected, $params=array()) {
  118. if (!is_array($selected)) {
  119. $selected=array($selected);
  120. }
  121. if (isset($params['combine']) && $params['combine']) {
  122. $options = array_combine($options, $options);
  123. }
  124. $value_name = $label_name = false;
  125. if (isset($params['value'])) {
  126. $value_name = $params['value'];
  127. }
  128. if (isset($params['label'])) {
  129. $label_name = $params['label'];
  130. }
  131. $html = '';
  132. foreach($options as $value => $label) {
  133. if ($value_name && is_array($label)) {
  134. $value = $label[$value_name];
  135. }
  136. if ($label_name && is_array($label)) {
  137. $label = $label[$label_name];
  138. }
  139. $select = in_array($value, $selected) ? ' selected="selected"' : '';
  140. $html .= '<option value="' . $value . '"' . $select . '>' . $label . '</option>'."\n";
  141. }
  142. return $html;
  143. }
  144. /**
  145. * This class provides the templates for owncloud.
  146. */
  147. class OC_Template{
  148. private $renderas; // Create a full page?
  149. private $application; // template Application
  150. private $vars; // Vars
  151. private $template; // The path to the template
  152. private $l10n; // The l10n-Object
  153. private $headers=array(); //custom headers
  154. /**
  155. * @brief Constructor
  156. * @param string $app app providing the template
  157. * @param string $file name of the template file (without suffix)
  158. * @param string $renderas = ""; produce a full page
  159. * @return OC_Template object
  160. *
  161. * This function creates an OC_Template object.
  162. *
  163. * If $renderas is set, OC_Template will try to produce a full page in the
  164. * according layout. For now, renderas can be set to "guest", "user" or
  165. * "admin".
  166. */
  167. public function __construct( $app, $name, $renderas = "" ) {
  168. // Set the private data
  169. $this->renderas = $renderas;
  170. $this->application = $app;
  171. $this->vars = array();
  172. $this->vars['requesttoken'] = OC_Util::callRegister();
  173. $parts = explode('/', $app); // fix translation when app is something like core/lostpassword
  174. $this->l10n = OC_L10N::get($parts[0]);
  175. // Some headers to enhance security
  176. header('X-Frame-Options: Sameorigin'); // Disallow iFraming from other domains
  177. header('X-XSS-Protection: 1; mode=block'); // Enforce browser based XSS filters
  178. header('X-Content-Type-Options: nosniff'); // Disable sniffing the content type for IE
  179. // Content Security Policy
  180. // If you change the standard policy, please also change it in config.sample.php
  181. $policy = OC_Config::getValue('custom_csp_policy', 'default-src \'self\'; script-src \'self\' \'unsafe-eval\'; style-src \'self\' \'unsafe-inline\'; frame-src *; img-src *');
  182. header('Content-Security-Policy:'.$policy); // Standard
  183. header('X-WebKit-CSP:'.$policy); // Older webkit browsers
  184. $this->findTemplate($name);
  185. }
  186. /**
  187. * autodetect the formfactor of the used device
  188. * default -> the normal desktop browser interface
  189. * mobile -> interface for smartphones
  190. * tablet -> interface for tablets
  191. * standalone -> the default interface but without header, footer and
  192. * sidebar, just the application. Useful to use just a specific
  193. * app on the desktop in a standalone window.
  194. */
  195. public static function detectFormfactor() {
  196. // please add more useragent strings for other devices
  197. if(isset($_SERVER['HTTP_USER_AGENT'])) {
  198. if(stripos($_SERVER['HTTP_USER_AGENT'], 'ipad')>0) {
  199. $mode='tablet';
  200. }elseif(stripos($_SERVER['HTTP_USER_AGENT'], 'iphone')>0) {
  201. $mode='mobile';
  202. }elseif((stripos($_SERVER['HTTP_USER_AGENT'], 'N9')>0) and (stripos($_SERVER['HTTP_USER_AGENT'], 'nokia')>0)) {
  203. $mode='mobile';
  204. }else{
  205. $mode='default';
  206. }
  207. }else{
  208. $mode='default';
  209. }
  210. return($mode);
  211. }
  212. /**
  213. * @brief Returns the formfactor extension for current formfactor
  214. */
  215. static public function getFormFactorExtension()
  216. {
  217. // if the formfactor is not yet autodetected do the
  218. // autodetection now. For possible formfactors check the
  219. // detectFormfactor documentation
  220. if(!isset($_SESSION['formfactor'])) {
  221. $_SESSION['formfactor'] = self::detectFormfactor();
  222. }
  223. // allow manual override via GET parameter
  224. if(isset($_GET['formfactor'])) {
  225. $_SESSION['formfactor']=$_GET['formfactor'];
  226. }
  227. $formfactor=$_SESSION['formfactor'];
  228. if($formfactor=='default') {
  229. $fext='';
  230. }elseif($formfactor=='mobile') {
  231. $fext='.mobile';
  232. }elseif($formfactor=='tablet') {
  233. $fext='.tablet';
  234. }elseif($formfactor=='standalone') {
  235. $fext='.standalone';
  236. }else{
  237. $fext='';
  238. }
  239. return $fext;
  240. }
  241. /**
  242. * @brief find the template with the given name
  243. * @param string $name of the template file (without suffix)
  244. *
  245. * Will select the template file for the selected theme and formfactor.
  246. * Checking all the possible locations.
  247. */
  248. protected function findTemplate($name)
  249. {
  250. // Read the selected theme from the config file
  251. $theme=OC_Config::getValue( "theme" );
  252. // Read the detected formfactor and use the right file name.
  253. $fext = self::getFormFactorExtension();
  254. $app = $this->application;
  255. // Check if it is a app template or not.
  256. if( $app != "" ) {
  257. // Check if the app is in the app folder or in the root
  258. if( file_exists(OC_App::getAppPath($app)."/templates/" )) {
  259. // Check if the template is overwritten by the selected theme
  260. if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/apps/$app/templates/", $name, $fext)) {
  261. }elseif ($this->checkPathForTemplate(OC_App::getAppPath($app)."/templates/", $name, $fext)) {
  262. }
  263. }else{
  264. // Check if the template is overwritten by the selected theme
  265. if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/$app/templates/", $name, $fext)) {
  266. }elseif ($this->checkPathForTemplate(OC::$SERVERROOT."/$app/templates/", $name, $fext)) {
  267. }else{
  268. echo('template not found: template:'.$name.' formfactor:'.$fext.' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT);
  269. die();
  270. }
  271. }
  272. }else{
  273. // Check if the template is overwritten by the selected theme
  274. if ($this->checkPathForTemplate(OC::$SERVERROOT."/themes/$theme/core/templates/", $name, $fext)) {
  275. } elseif ($this->checkPathForTemplate(OC::$SERVERROOT."/core/templates/", $name, $fext)) {
  276. }else{
  277. echo('template not found: template:'.$name.' formfactor:'.$fext.' webroot:'.OC::$WEBROOT.' serverroot:'.OC::$SERVERROOT);
  278. die();
  279. }
  280. }
  281. }
  282. /**
  283. * @brief check Path For Template with and without $fext
  284. * @param string $path to check
  285. * @param string $name of the template file (without suffix)
  286. * @param string $fext formfactor extension
  287. * @return bool true when found
  288. *
  289. * Will set $this->template and $this->path if there is a template at
  290. * the specific $path
  291. */
  292. protected function checkPathForTemplate($path, $name, $fext)
  293. {
  294. if ($name =='') return false;
  295. $template = null;
  296. if( is_file( $path.$name.$fext.'.php' )) {
  297. $template = $path.$name.$fext.'.php';
  298. }elseif( is_file( $path.$name.'.php' )) {
  299. $template = $path.$name.'.php';
  300. }
  301. if ($template) {
  302. $this->template = $template;
  303. $this->path = $path;
  304. return true;
  305. }
  306. return false;
  307. }
  308. /**
  309. * @brief Assign variables
  310. * @param string $key key
  311. * @param string $value value
  312. * @param bool $sanitizeHTML false, if data shouldn't get passed through htmlentities
  313. * @return bool
  314. *
  315. * This function assigns a variable. It can be accessed via $_[$key] in
  316. * the template.
  317. *
  318. * If the key existed before, it will be overwritten
  319. */
  320. public function assign( $key, $value, $sanitizeHTML=true ) {
  321. if($sanitizeHTML == true) $value=OC_Util::sanitizeHTML($value);
  322. $this->vars[$key] = $value;
  323. return true;
  324. }
  325. /**
  326. * @brief Appends a variable
  327. * @param string $key key
  328. * @param string $value value
  329. * @return bool
  330. *
  331. * This function assigns a variable in an array context. If the key already
  332. * exists, the value will be appended. It can be accessed via
  333. * $_[$key][$position] in the template.
  334. */
  335. public function append( $key, $value ) {
  336. if( array_key_exists( $key, $this->vars )) {
  337. $this->vars[$key][] = $value;
  338. }
  339. else{
  340. $this->vars[$key] = array( $value );
  341. }
  342. }
  343. /**
  344. * @brief Add a custom element to the header
  345. * @param string $tag tag name of the element
  346. * @param array $attributes array of attrobutes for the element
  347. * @param string $text the text content for the element
  348. */
  349. public function addHeader( $tag, $attributes, $text='') {
  350. $this->headers[]=array('tag'=>$tag,'attributes'=>$attributes, 'text'=>$text);
  351. }
  352. /**
  353. * @brief Prints the proceeded template
  354. * @return bool
  355. *
  356. * This function proceeds the template and prints its output.
  357. */
  358. public function printPage() {
  359. $data = $this->fetchPage();
  360. if( $data === false ) {
  361. return false;
  362. }
  363. else{
  364. print $data;
  365. return true;
  366. }
  367. }
  368. /**
  369. * @brief Proceeds the template
  370. * @return bool
  371. *
  372. * This function proceeds the template. If $this->renderas is set, it
  373. * will produce a full page.
  374. */
  375. public function fetchPage() {
  376. $data = $this->_fetch();
  377. if( $this->renderas ) {
  378. $page = new OC_TemplateLayout($this->renderas);
  379. if($this->renderas == 'user') {
  380. $page->assign('requesttoken', $this->vars['requesttoken']);
  381. }
  382. // Add custom headers
  383. $page->assign('headers', $this->headers, false);
  384. foreach(OC_Util::$headers as $header) {
  385. $page->append('headers', $header);
  386. }
  387. $page->assign( "content", $data, false );
  388. return $page->fetchPage();
  389. }
  390. else{
  391. return $data;
  392. }
  393. }
  394. /**
  395. * @brief doing the actual work
  396. * @return string content
  397. *
  398. * Includes the template file, fetches its output
  399. */
  400. private function _fetch() {
  401. // Register the variables
  402. $_ = $this->vars;
  403. $l = $this->l10n;
  404. // Execute the template
  405. ob_start();
  406. include $this->template; // <-- we have to use include because we pass $_!
  407. $data = ob_get_contents();
  408. @ob_end_clean();
  409. // return the data
  410. return $data;
  411. }
  412. /**
  413. * @brief Include template
  414. * @return string returns content of included template
  415. *
  416. * Includes another template. use <?php echo $this->inc('template'); ?> to
  417. * do this.
  418. */
  419. public function inc( $file, $additionalparams = null ) {
  420. $_ = $this->vars;
  421. $l = $this->l10n;
  422. if( !is_null($additionalparams)) {
  423. $_ = array_merge( $additionalparams, $this->vars );
  424. }
  425. // Include
  426. ob_start();
  427. include $this->path.$file.'.php';
  428. $data = ob_get_contents();
  429. @ob_end_clean();
  430. // Return data
  431. return $data;
  432. }
  433. /**
  434. * @brief Shortcut to print a simple page for users
  435. * @param string $application The application we render the template for
  436. * @param string $name Name of the template
  437. * @param array $parameters Parameters for the template
  438. * @return bool
  439. */
  440. public static function printUserPage( $application, $name, $parameters = array() ) {
  441. $content = new OC_Template( $application, $name, "user" );
  442. foreach( $parameters as $key => $value ) {
  443. $content->assign( $key, $value, false );
  444. }
  445. print $content->printPage();
  446. }
  447. /**
  448. * @brief Shortcut to print a simple page for admins
  449. * @param string $application The application we render the template for
  450. * @param string $name Name of the template
  451. * @param array $parameters Parameters for the template
  452. * @return bool
  453. */
  454. public static function printAdminPage( $application, $name, $parameters = array() ) {
  455. $content = new OC_Template( $application, $name, "admin" );
  456. foreach( $parameters as $key => $value ) {
  457. $content->assign( $key, $value, false );
  458. }
  459. return $content->printPage();
  460. }
  461. /**
  462. * @brief Shortcut to print a simple page for guests
  463. * @param string $application The application we render the template for
  464. * @param string $name Name of the template
  465. * @param string $parameters Parameters for the template
  466. * @return bool
  467. */
  468. public static function printGuestPage( $application, $name, $parameters = array() ) {
  469. $content = new OC_Template( $application, $name, "guest" );
  470. foreach( $parameters as $key => $value ) {
  471. $content->assign( $key, $value, false );
  472. }
  473. return $content->printPage();
  474. }
  475. /**
  476. * @brief Print a fatal error page and terminates the script
  477. * @param string $error The error message to show
  478. * @param string $hint An option hint message
  479. */
  480. public static function printErrorPage( $error_msg, $hint = '' ) {
  481. $errors = array(array('error' => $error_msg, 'hint' => $hint));
  482. OC_Template::printGuestPage("", "error", array("errors" => $errors));
  483. die();
  484. }
  485. }