From 243f3f0c4c2831f4cf27c33f1d4cc748843d24da Mon Sep 17 00:00:00 2001 From: Simon Könnecke Date: Mon, 25 Nov 2013 12:26:03 +0100 Subject: No decimal points for Kilobyte and Byte #5371. --- lib/private/helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/helper.php b/lib/private/helper.php index c82d3bd4ef4..4fe3097af26 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -252,7 +252,7 @@ class OC_Helper { if ($bytes < 1024) { return "$bytes B"; } - $bytes = round($bytes / 1024, 1); + $bytes = round($bytes / 1024, 0); if ($bytes < 1024) { return "$bytes kB"; } -- cgit v1.2.3 From 301d469813763cc28d82986f906eb29a45102294 Mon Sep 17 00:00:00 2001 From: Alexander Bergolth Date: Wed, 4 Dec 2013 18:01:51 +0100 Subject: Symfonys addCollection() with multiple arguments is deprecated, fix deprecation warning --- lib/private/router.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/router.php b/lib/private/router.php index dbaca9e0d5d..19c1e4473ec 100644 --- a/lib/private/router.php +++ b/lib/private/router.php @@ -67,7 +67,8 @@ class OC_Router { $this->useCollection($app); require_once $file; $collection = $this->getCollection($app); - $this->root->addCollection($collection, '/apps/'.$app); + $collection->addPrefix('/apps/'.$app); + $this->root->addCollection($collection); } $this->useCollection('root'); require_once 'settings/routes.php'; @@ -76,7 +77,8 @@ class OC_Router { // include ocs routes require_once 'ocs/routes.php'; $collection = $this->getCollection('ocs'); - $this->root->addCollection($collection, '/ocs'); + $collection->addPrefix('/ocs'); + $this->root->addCollection($collection); } protected function getCollection($name) { -- cgit v1.2.3 From 4c4c9096c4e3653ddd44aa299d34367e243dd257 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Sat, 7 Dec 2013 11:38:01 +0100 Subject: fix plural translation - fixes #6226 --- core/js/js.js | 2 +- lib/private/l10n.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/core/js/js.js b/core/js/js.js index f5991cfc9dd..d9b3b54e0a1 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -115,7 +115,7 @@ t.cache = {}; */ function n(app, text_singular, text_plural, count, vars) { initL10N(app); - var identifier = '_' + text_singular + '__' + text_plural + '_'; + var identifier = '_' + text_singular + '_::_' + text_plural + '_'; if( typeof( t.cache[app][identifier] ) !== 'undefined' ){ var translation = t.cache[app][identifier]; if ($.isArray(translation)) { diff --git a/lib/private/l10n.php b/lib/private/l10n.php index 2d440850459..98665c84c55 100644 --- a/lib/private/l10n.php +++ b/lib/private/l10n.php @@ -262,7 +262,7 @@ class OC_L10N implements \OCP\IL10N { */ public function n($text_singular, $text_plural, $count, $parameters = array()) { $this->init(); - $identifier = "_${text_singular}__${text_plural}_"; + $identifier = "_${text_singular}_::_${text_plural}_"; if( array_key_exists($identifier, $this->translations)) { return new OC_L10N_String( $this, $identifier, $parameters, $count ); } -- cgit v1.2.3 From a36bf5c2b5430eb4bcbabead92c9d2c1a669b035 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 9 Dec 2013 12:38:27 +0100 Subject: preserve 3rd party values in in the Session destructor --- lib/private/session/internal.php | 11 ++++++++++- lib/private/session/memory.php | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php index 60aecccc8aa..49b52b5c796 100644 --- a/lib/private/session/internal.php +++ b/lib/private/session/internal.php @@ -26,10 +26,19 @@ class Internal extends Memory { } public function __destruct() { - $_SESSION = $this->data; + $_SESSION = array_merge($_SESSION, $this->data); session_write_close(); } + /** + * @param string $key + */ + public function remove($key) { + // also remove it from $_SESSION to prevent re-setting the old value during the merge + unset($_SESSION[$key]); + parent::remove($key); + } + public function clear() { session_unset(); @session_regenerate_id(true); diff --git a/lib/private/session/memory.php b/lib/private/session/memory.php index c148ff4b9b9..134cee582ed 100644 --- a/lib/private/session/memory.php +++ b/lib/private/session/memory.php @@ -11,7 +11,7 @@ namespace OC\Session; /** * Class Internal * - * store session data in an in-memory array, not persistance + * store session data in an in-memory array, not persistent * * @package OC\Session */ -- cgit v1.2.3 From 009e25788f3ad3118e2c72935ffee6591c0bc17b Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 9 Dec 2013 15:47:51 +0100 Subject: correctly mark app management active --- core/templates/layout.user.php | 2 +- lib/private/templatelayout.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 9e1d8022ecb..717edf28243 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -104,7 +104,7 @@
  • class="active"> + class="active"> t('Apps')); ?> diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php index 625f3424a04..d5cd5039753 100644 --- a/lib/private/templatelayout.php +++ b/lib/private/templatelayout.php @@ -46,6 +46,7 @@ class OC_TemplateLayout extends OC_Template { $user_displayname = OC_User::getDisplayName(); $this->assign( 'user_displayname', $user_displayname ); $this->assign( 'user_uid', OC_User::getUser() ); + $this->assign( 'appsmanagement_active', strpos(OC_Request::requestUri(), OC_Helper::linkToRoute('settings_apps')) === 0 ); $this->assign('enableAvatars', \OC_Config::getValue('enable_avatars', true)); } else if ($renderas == 'guest' || $renderas == 'error') { parent::__construct('core', 'layout.guest'); -- cgit v1.2.3 From 409b5108896edda9adf916cd566dbce2d2b00351 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 10 Dec 2013 12:05:39 +0100 Subject: Moved content disposition code+workarounds to OCP\Response Added new OC\Response API called setContentDispositionHeader() that contains the needed workarounds for UTF8 and IE. Refactored download code to use the new API. Removed unused trashbin download file. --- apps/files/download.php | 7 +----- apps/files_trashbin/download.php | 51 ---------------------------------------- apps/files_versions/download.php | 7 +----- lib/private/files.php | 7 +----- lib/private/response.php | 14 +++++++++++ lib/public/response.php | 9 +++++++ 6 files changed, 26 insertions(+), 69 deletions(-) delete mode 100644 apps/files_trashbin/download.php (limited to 'lib/private') diff --git a/apps/files/download.php b/apps/files/download.php index e3fe24e45d7..6b055e99a53 100644 --- a/apps/files/download.php +++ b/apps/files/download.php @@ -37,12 +37,7 @@ if(!\OC\Files\Filesystem::file_exists($filename)) { $ftype=\OC\Files\Filesystem::getMimeType( $filename ); header('Content-Type:'.$ftype); -if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} +OCP\Response::setContentDispositionHeader(basename($filename), 'attachment'); OCP\Response::disableCaching(); header('Content-Length: '.\OC\Files\Filesystem::filesize($filename)); diff --git a/apps/files_trashbin/download.php b/apps/files_trashbin/download.php deleted file mode 100644 index 60328e1dddb..00000000000 --- a/apps/files_trashbin/download.php +++ /dev/null @@ -1,51 +0,0 @@ -. -* -*/ - -// Check if we are a user -OCP\User::checkLoggedIn(); - -$filename = $_GET["file"]; - -$view = new OC_FilesystemView('/'.\OCP\User::getUser().'/files_trashbin/files'); - -if(!$view->file_exists($filename)) { - header("HTTP/1.0 404 Not Found"); - $tmpl = new OCP\Template( '', '404', 'guest' ); - $tmpl->assign('file', $filename); - $tmpl->printPage(); - exit; -} - -$ftype=$view->getMimeType( $filename ); - -header('Content-Type:'.$ftype);if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} -OCP\Response::disableCaching(); -header('Content-Length: '. $view->filesize($filename)); - -OC_Util::obEnd(); -$view->readfile( $filename ); diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php index 040a662e61b..2fe56d2e638 100644 --- a/apps/files_versions/download.php +++ b/apps/files_versions/download.php @@ -36,12 +36,7 @@ $view = new OC\Files\View('/'); $ftype = $view->getMimeType('/'.$uid.'/files/'.$filename); header('Content-Type:'.$ftype); -if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode( basename($filename) ) . '"' ); -} else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode( basename($filename) ) - . '; filename="' . rawurlencode( basename($filename) ) . '"' ); -} +OCP\Response::setContentDispositionHeader(basename($filename), 'attachment'); OCP\Response::disableCaching(); header('Content-Length: '.$view->filesize($versionName)); diff --git a/lib/private/files.php b/lib/private/files.php index 6ffa14c0d91..e6c81d58bd2 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -115,12 +115,7 @@ class OC_Files { } OC_Util::obEnd(); if ($zip or \OC\Files\Filesystem::isReadable($filename)) { - if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { - header( 'Content-Disposition: attachment; filename="' . rawurlencode($name) . '"' ); - } else { - header( 'Content-Disposition: attachment; filename*=UTF-8\'\'' . rawurlencode($name) - . '; filename="' . rawurlencode($name) . '"' ); - } + OC_Response::setContentDispositionHeader($name, 'attachment'); header('Content-Transfer-Encoding: binary'); OC_Response::disableCaching(); if ($zip) { diff --git a/lib/private/response.php b/lib/private/response.php index 674176d078b..1b9cb473d67 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -147,6 +147,20 @@ class OC_Response { header('Last-Modified: '.$lastModified); } + /** + * Sets the content disposition header (with possible workarounds) + * @param string $filename file name + * @param string $type disposition type, either 'attachment' or 'inline' + */ + static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { + if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); + } else { + header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) + . '; filename="' . rawurlencode( $filename ) . '"' ); + } + } + /** * @brief Send file as response, checking and setting caching headers * @param $filepath of file to send diff --git a/lib/public/response.php b/lib/public/response.php index 2ca0a0c9fa4..24d3c81d628 100644 --- a/lib/public/response.php +++ b/lib/public/response.php @@ -54,6 +54,15 @@ class Response { \OC_Response::setLastModifiedHeader( $lastModified ); } + /** + * Sets the content disposition header (with possible workarounds) + * @param string $filename file name + * @param string $type disposition type, either 'attachment' or 'inline' + */ + static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { + \OC_Response::setContentDispositionHeader( $filename, $type ); + } + /** * Disable browser caching * @see enableCaching with cache_time = 0 -- cgit v1.2.3 From 82bf1f9c8ccbfed39790d22b2fbea2c5286122dc Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 10 Dec 2013 12:40:59 +0100 Subject: Added workaround for Android content disposition Fixes #5807 --- lib/private/response.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/response.php b/lib/private/response.php index 1b9cb473d67..c6edda0f949 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -153,7 +153,8 @@ class OC_Response { * @param string $type disposition type, either 'attachment' or 'inline' */ static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { - if ( preg_match( "/MSIE/", $_SERVER["HTTP_USER_AGENT"] ) ) { + // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent + if ( preg_match( '/MSIE/', $_SERVER['HTTP_USER_AGENT'] ) or preg_match( '#Android.*Chrome/[.0-9]*#', $_SERVER['HTTP_USER_AGENT'] ) ) { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); } else { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) -- cgit v1.2.3 From cdd182ce356b697d0c1d029c1f7fe64277d8410f Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Wed, 11 Dec 2013 00:13:40 +0100 Subject: Send "SET NAMES utf8" to MySQL for PHP below 5.3.6 --- lib/private/db.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/private') diff --git a/lib/private/db.php b/lib/private/db.php index 1e5d12649df..562065259fa 100644 --- a/lib/private/db.php +++ b/lib/private/db.php @@ -101,6 +101,9 @@ class OC_DB { ); $connectionParams['adapter'] = '\OC\DB\Adapter'; $connectionParams['wrapperClass'] = 'OC\DB\Connection'; + // Send "SET NAMES utf8". Only required on PHP 5.3 below 5.3.6. + // See http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names#4361485 + $eventManager->addEventSubscriber(new \Doctrine\DBAL\Event\Listeners\MysqlSessionInit); break; case 'pgsql': $connectionParams = array( -- cgit v1.2.3 From 5c7a08aab45a7f24086066549e1992f3dc2fdde6 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Dec 2013 12:59:48 +0100 Subject: check if a $_SESSION entry exists before we try to remove it --- lib/private/session/internal.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/session/internal.php b/lib/private/session/internal.php index 49b52b5c796..a7c9e2fdefd 100644 --- a/lib/private/session/internal.php +++ b/lib/private/session/internal.php @@ -35,7 +35,9 @@ class Internal extends Memory { */ public function remove($key) { // also remove it from $_SESSION to prevent re-setting the old value during the merge - unset($_SESSION[$key]); + if (isset($_SESSION[$key])) { + unset($_SESSION[$key]); + } parent::remove($key); } -- cgit v1.2.3 From b126374780c7364da13b89f000e09467732a3cec Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Dec 2013 15:47:36 +0100 Subject: cache the result from inGroup --- lib/private/group/group.php | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'lib/private') diff --git a/lib/private/group/group.php b/lib/private/group/group.php index bcd2419b309..694827d100e 100644 --- a/lib/private/group/group.php +++ b/lib/private/group/group.php @@ -18,7 +18,12 @@ class Group { /** * @var \OC\User\User[] $users */ - private $users; + private $users = array(); + + /** + * @var bool $usersLoaded + */ + private $usersLoaded; /** * @var \OC_Group_Backend[] | \OC_Group_Database[] $backend @@ -26,7 +31,7 @@ class Group { private $backends; /** - * @var \OC\Hooks\PublicEmitter $emitter; + * @var \OC\Hooks\PublicEmitter $emitter ; */ private $emitter; @@ -58,7 +63,7 @@ class Group { * @return \OC\User\User[] */ public function getUsers() { - if ($this->users) { + if ($this->usersLoaded) { return $this->users; } @@ -74,6 +79,7 @@ class Group { } $this->users = $this->getVerifiedUsers($userIds); + $this->usersLoaded = true; return $this->users; } @@ -84,8 +90,14 @@ class Group { * @return bool */ public function inGroup($user) { + foreach ($this->users as $cachedUser) { + if ($user->getUID() === $cachedUser->getUID()) { + return true; + } + } foreach ($this->backends as $backend) { if ($backend->inGroup($user->getUID(), $this->gid)) { + $this->users[] = $user; return true; } } @@ -185,6 +197,7 @@ class Group { * @return \OC\User\User[] */ public function searchDisplayName($search, $limit = null, $offset = null) { + $users = array(); foreach ($this->backends as $backend) { if ($backend->implementsActions(OC_GROUP_BACKEND_GET_DISPLAYNAME)) { $userIds = array_keys($backend->displayNamesInGroup($this->gid, $search, $limit, $offset)); @@ -229,17 +242,17 @@ class Group { /** * @brief returns all the Users from an array that really exists - * @param $userIds an array containing user IDs - * @return an Array with the userId as Key and \OC\User\User as value + * @param string[] $userIds an array containing user IDs + * @return \OC\User\User[] an Array with the userId as Key and \OC\User\User as value */ private function getVerifiedUsers($userIds) { - if(!is_array($userIds)) { + if (!is_array($userIds)) { return array(); } $users = array(); foreach ($userIds as $userId) { $user = $this->userManager->get($userId); - if(!is_null($user)) { + if (!is_null($user)) { $users[$userId] = $user; } } -- cgit v1.2.3 From 366d75e9479b1ac2b52b6a37389a4aa107b059e3 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Dec 2013 16:22:26 +0100 Subject: cache the home folder of a User --- lib/private/user/database.php | 124 +++++++++++++++++++++--------------------- lib/private/user/user.php | 16 ++++-- 2 files changed, 73 insertions(+), 67 deletions(-) (limited to 'lib/private') diff --git a/lib/private/user/database.php b/lib/private/user/database.php index 3db770f9898..c99db3b27ca 100644 --- a/lib/private/user/database.php +++ b/lib/private/user/database.php @@ -42,13 +42,13 @@ class OC_User_Database extends OC_User_Backend { /** * @var PasswordHash */ - static private $hasher=null; + static private $hasher = null; private function getHasher() { - if(!self::$hasher) { + if (!self::$hasher) { //we don't want to use DES based crypt(), since it doesn't return a hash with a recognisable prefix - $forcePortable=(CRYPT_BLOWFISH!=1); - self::$hasher=new PasswordHash(8, $forcePortable); + $forcePortable = (CRYPT_BLOWFISH != 1); + self::$hasher = new PasswordHash(8, $forcePortable); } return self::$hasher; @@ -63,14 +63,14 @@ class OC_User_Database extends OC_User_Backend { * Creates a new user. Basic checking of username is done in OC_User * itself, not in its subclasses. */ - public function createUser( $uid, $password ) { - if( $this->userExists($uid) ) { + public function createUser($uid, $password) { + if ($this->userExists($uid)) { return false; - }else{ - $hasher=$this->getHasher(); - $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', '')); - $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )' ); - $result = $query->execute( array( $uid, $hash)); + } else { + $hasher = $this->getHasher(); + $hash = $hasher->HashPassword($password . OC_Config::getValue('passwordsalt', '')); + $query = OC_DB::prepare('INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )'); + $result = $query->execute(array($uid, $hash)); return $result ? true : false; } @@ -83,10 +83,10 @@ class OC_User_Database extends OC_User_Backend { * * Deletes a user */ - public function deleteUser( $uid ) { + public function deleteUser($uid) { // Delete user-group-relation - $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*users` WHERE `uid` = ?' ); - $query->execute( array( $uid )); + $query = OC_DB::prepare('DELETE FROM `*PREFIX*users` WHERE `uid` = ?'); + $query->execute(array($uid)); return true; } @@ -98,15 +98,15 @@ class OC_User_Database extends OC_User_Backend { * * Change the password of a user */ - public function setPassword( $uid, $password ) { - if( $this->userExists($uid) ) { - $hasher=$this->getHasher(); - $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', '')); - $query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?' ); - $query->execute( array( $hash, $uid )); + public function setPassword($uid, $password) { + if ($this->userExists($uid)) { + $hasher = $this->getHasher(); + $hash = $hasher->HashPassword($password . OC_Config::getValue('passwordsalt', '')); + $query = OC_DB::prepare('UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?'); + $query->execute(array($hash, $uid)); return true; - }else{ + } else { return false; } } @@ -119,12 +119,12 @@ class OC_User_Database extends OC_User_Backend { * * Change the display name of a user */ - public function setDisplayName( $uid, $displayName ) { - if( $this->userExists($uid) ) { - $query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `displayname` = ? WHERE `uid` = ?' ); - $query->execute( array( $displayName, $uid )); + public function setDisplayName($uid, $displayName) { + if ($this->userExists($uid)) { + $query = OC_DB::prepare('UPDATE `*PREFIX*users` SET `displayname` = ? WHERE LOWER(`uid`) = ?'); + $query->execute(array($displayName, $uid)); return true; - }else{ + } else { return false; } } @@ -132,18 +132,16 @@ class OC_User_Database extends OC_User_Backend { /** * @brief get display name of the user * @param $uid user ID of the user - * @return display name + * @return string display name */ public function getDisplayName($uid) { - if( $this->userExists($uid) ) { - $query = OC_DB::prepare( 'SELECT `displayname` FROM `*PREFIX*users` WHERE `uid` = ?' ); - $result = $query->execute( array( $uid ))->fetchAll(); - $displayName = trim($result[0]['displayname'], ' '); - if ( !empty($displayName) ) { - return $displayName; - } else { - return $uid; - } + $query = OC_DB::prepare('SELECT `displayname` FROM `*PREFIX*users` WHERE `uid` = ?'); + $result = $query->execute(array($uid))->fetchAll(); + $displayName = trim($result[0]['displayname'], ' '); + if (!empty($displayName)) { + return $displayName; + } else { + return $uid; } } @@ -156,9 +154,9 @@ class OC_User_Database extends OC_User_Backend { public function getDisplayNames($search = '', $limit = null, $offset = null) { $displayNames = array(); $query = OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users`' - .' WHERE LOWER(`displayname`) LIKE LOWER(?) OR ' - .'LOWER(`uid`) LIKE LOWER(?)', $limit, $offset); - $result = $query->execute(array($search.'%', $search.'%')); + . ' WHERE LOWER(`displayname`) LIKE LOWER(?) OR ' + . 'LOWER(`uid`) LIKE LOWER(?)', $limit, $offset); + $result = $query->execute(array($search . '%', $search . '%')); $users = array(); while ($row = $result->fetchRow()) { $displayNames[$row['uid']] = $row['displayname']; @@ -176,30 +174,30 @@ class OC_User_Database extends OC_User_Backend { * Check if the password is correct without logging in the user * returns the user id or false */ - public function checkPassword( $uid, $password ) { - $query = OC_DB::prepare( 'SELECT `uid`, `password` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)' ); - $result = $query->execute( array( $uid)); + public function checkPassword($uid, $password) { + $query = OC_DB::prepare('SELECT `uid`, `password` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)'); + $result = $query->execute(array($uid)); - $row=$result->fetchRow(); - if($row) { - $storedHash=$row['password']; - if ($storedHash[0]=='$') {//the new phpass based hashing - $hasher=$this->getHasher(); - if($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), $storedHash)) { + $row = $result->fetchRow(); + if ($row) { + $storedHash = $row['password']; + if ($storedHash[0] == '$') { //the new phpass based hashing + $hasher = $this->getHasher(); + if ($hasher->CheckPassword($password . OC_Config::getValue('passwordsalt', ''), $storedHash)) { return $row['uid']; - }else{ + } else { return false; } - }else{//old sha1 based hashing - if(sha1($password)==$storedHash) { + } else { //old sha1 based hashing + if (sha1($password) == $storedHash) { //upgrade to new hashing $this->setPassword($row['uid'], $password); return $row['uid']; - }else{ + } else { return false; } } - }else{ + } else { return false; } } @@ -212,7 +210,7 @@ class OC_User_Database extends OC_User_Backend { */ public function getUsers($search = '', $limit = null, $offset = null) { $query = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users` WHERE LOWER(`uid`) LIKE LOWER(?)', $limit, $offset); - $result = $query->execute(array($search.'%')); + $result = $query->execute(array($search . '%')); $users = array(); while ($row = $result->fetchRow()) { $users[] = $row['uid']; @@ -226,8 +224,8 @@ class OC_User_Database extends OC_User_Backend { * @return boolean */ public function userExists($uid) { - $query = OC_DB::prepare( 'SELECT COUNT(*) FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)' ); - $result = $query->execute( array( $uid )); + $query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)'); + $result = $query->execute(array($uid)); if (OC_DB::isError($result)) { OC_Log::write('core', OC_DB::getErrorMessage($result), OC_Log::ERROR); return false; @@ -236,14 +234,14 @@ class OC_User_Database extends OC_User_Backend { } /** - * @brief get the user's home directory - * @param string $uid the username - * @return boolean - */ + * @brief get the user's home directory + * @param string $uid the username + * @return boolean + */ public function getHome($uid) { - if($this->userExists($uid)) { - return OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" ) . '/' . $uid; - }else{ + if ($this->userExists($uid)) { + return OC_Config::getValue("datadirectory", OC::$SERVERROOT . "/data") . '/' . $uid; + } else { return false; } } diff --git a/lib/private/user/user.php b/lib/private/user/user.php index e773473ec41..a9e32b5d597 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -37,6 +37,11 @@ class User { */ private $emitter; + /** + * @var string $home + */ + private $home; + /** * @param string $uid * @param \OC_User_Backend $backend @@ -133,10 +138,13 @@ class User { * @return string */ public function getHome() { - if ($this->backend->implementsActions(\OC_USER_BACKEND_GET_HOME) and $home = $this->backend->getHome($this->uid)) { - return $home; + if (!$this->home) { + if ($this->backend->implementsActions(\OC_USER_BACKEND_GET_HOME) and $home = $this->backend->getHome($this->uid)) { + $this->home = $home; + } + $this->home = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/' . $this->uid; //TODO switch to Config object once implemented } - return \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/' . $this->uid; //TODO switch to Config object once implemented + return $this->home; } /** @@ -145,7 +153,7 @@ class User { * @return bool */ public function canChangeAvatar() { - if($this->backend->implementsActions(\OC_USER_BACKEND_PROVIDE_AVATAR)) { + if ($this->backend->implementsActions(\OC_USER_BACKEND_PROVIDE_AVATAR)) { return $this->backend->canChangeAvatar($this->uid); } return true; -- cgit v1.2.3 From 3d299923786aa818aafeef1cb4dc3778b6fc1692 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 11 Dec 2013 16:25:41 +0100 Subject: user Group->users as assosiative array --- lib/private/group/group.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/group/group.php b/lib/private/group/group.php index 694827d100e..97f1cb8d960 100644 --- a/lib/private/group/group.php +++ b/lib/private/group/group.php @@ -90,14 +90,12 @@ class Group { * @return bool */ public function inGroup($user) { - foreach ($this->users as $cachedUser) { - if ($user->getUID() === $cachedUser->getUID()) { - return true; - } + if (isset($this->users[$user->getUID()])) { + return true; } foreach ($this->backends as $backend) { if ($backend->inGroup($user->getUID(), $this->gid)) { - $this->users[] = $user; + $this->users[$user->getUID()] = $user; return true; } } -- cgit v1.2.3 From 335b2f40a631f7188ab921d69289acaf31908c6e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 10 Dec 2013 15:32:48 +0100 Subject: Fixed download file from URL error messages - L10N now converted to string to make them work with json_encode - Added specific error message when server doesn't allow fopen on URLs - Fixed client side to correctly show error message in a notification - Added OCP\JSON::encode() method to encode JSON with support for the OC_L10N_String values --- apps/files/ajax/newfile.php | 28 ++++++++++++++++++++-------- apps/files/js/file-upload.js | 7 ++++++- lib/private/eventsource.php | 6 +++--- lib/private/json.php | 9 ++++++++- lib/public/json.php | 8 ++++++++ 5 files changed, 45 insertions(+), 13 deletions(-) (limited to 'lib/private') diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index c327d2b9f94..ec5b716fb2a 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -53,13 +53,13 @@ $result = array( ); if(trim($filename) === '') { - $result['data'] = array('message' => $l10n->t('File name cannot be empty.')); + $result['data'] = array('message' => (string)$l10n->t('File name cannot be empty.')); OCP\JSON::error($result); exit(); } if(strpos($filename, '/') !== false) { - $result['data'] = array('message' => $l10n->t('File name must not contain "/". Please choose a different name.')); + $result['data'] = array('message' => (string)$l10n->t('File name must not contain "/". Please choose a different name.')); OCP\JSON::error($result); exit(); } @@ -68,7 +68,7 @@ if(strpos($filename, '/') !== false) { $target = $dir.'/'.$filename; if (\OC\Files\Filesystem::file_exists($target)) { - $result['data'] = array('message' => $l10n->t( + $result['data'] = array('message' => (string)$l10n->t( 'The name %s is already used in the folder %s. Please choose a different name.', array($filename, $dir)) ); @@ -78,20 +78,32 @@ if (\OC\Files\Filesystem::file_exists($target)) { if($source) { if(substr($source, 0, 8)!='https://' and substr($source, 0, 7)!='http://') { - OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Not a valid source') ))); + OCP\JSON::error(array('data' => array('message' => $l10n->t('Not a valid source')))); + exit(); + } + + if (!ini_get('allow_url_fopen')) { + $eventSource->send('error', array('message' => $l10n->t('Server is not allowed to open URLs, please check the server configuration'))); + $eventSource->close(); exit(); } $ctx = stream_context_create(null, array('notification' =>'progress')); - $sourceStream=fopen($source, 'rb', false, $ctx); - $result=\OC\Files\Filesystem::file_put_contents($target, $sourceStream); + $sourceStream=@fopen($source, 'rb', false, $ctx); + $result = 0; + if (is_resource($sourceStream)) { + $result=\OC\Files\Filesystem::file_put_contents($target, $sourceStream); + } if($result) { $meta = \OC\Files\Filesystem::getFileInfo($target); $mime=$meta['mimetype']; $id = $meta['fileid']; - $eventSource->send('success', array('mime'=>$mime, 'size'=>\OC\Files\Filesystem::filesize($target), 'id' => $id, 'etag' => $meta['etag'])); + $eventSource->send('success', array('mime' => $mime, 'size' => \OC\Files\Filesystem::filesize($target), 'id' => $id, 'etag' => $meta['etag'])); } else { - $eventSource->send('error', $l10n->t('Error while downloading %s to %s', array($source, $target))); + $eventSource->send('error', array('message' => $l10n->t('Error while downloading %s to %s', array($source, $target)))); + } + if (is_resource($sourceStream)) { + fclose($sourceStream); } $eventSource->close(); exit(); diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index e9663353f74..196817432d5 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -658,7 +658,12 @@ $(document).ready(function() { }); eventSource.listen('error',function(error) { $('#uploadprogressbar').fadeOut(); - alert(error); + var message = (error && error.message) || t('core', 'Error fetching URL'); + OC.Notification.show(message); + //hide notification after 10 sec + setTimeout(function() { + OC.Notification.hide(); + }, 10000); }); break; } diff --git a/lib/private/eventsource.php b/lib/private/eventsource.php index a83084d9251..4df0bc2e7cd 100644 --- a/lib/private/eventsource.php +++ b/lib/private/eventsource.php @@ -64,13 +64,13 @@ class OC_EventSource{ } if($this->fallback) { $response=''.PHP_EOL; + .$this->fallBackId.',"' . $type . '",' . OCP\JSON::encode($data) . ')' . PHP_EOL; echo $response; }else{ if($type) { - echo 'event: '.$type.PHP_EOL; + echo 'event: ' . $type.PHP_EOL; } - echo 'data: '.json_encode($data).PHP_EOL; + echo 'data: ' . OCP\JSON::encode($data) . PHP_EOL; } echo PHP_EOL; flush(); diff --git a/lib/private/json.php b/lib/private/json.php index 6ba0b13806b..8401f7c3a12 100644 --- a/lib/private/json.php +++ b/lib/private/json.php @@ -109,7 +109,14 @@ class OC_JSON{ if($setContentType) { self::setContentTypeHeader(); } + echo self::encode($data); + } + + /** + * Encode JSON + */ + public static function encode($data) { array_walk_recursive($data, array('OC_JSON', 'to_string')); - echo json_encode($data); + return json_encode($data); } } diff --git a/lib/public/json.php b/lib/public/json.php index 134f724b0e6..831e3ef1cf6 100644 --- a/lib/public/json.php +++ b/lib/public/json.php @@ -169,4 +169,12 @@ class JSON { public static function checkAdminUser() { return(\OC_JSON::checkAdminUser()); } + + /** + * Encode JSON + * @param array $data + */ + public static function encode($data) { + return(\OC_JSON::encode($data)); + } } -- cgit v1.2.3 From f23b7a262fe4582baf75f9fb968b716c2da3071c Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Dec 2013 12:57:25 +0100 Subject: fix fallback overwriting result of getHome --- lib/private/user/user.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/user/user.php b/lib/private/user/user.php index a9e32b5d597..b4f33fa73cc 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -141,8 +141,9 @@ class User { if (!$this->home) { if ($this->backend->implementsActions(\OC_USER_BACKEND_GET_HOME) and $home = $this->backend->getHome($this->uid)) { $this->home = $home; + } else { + $this->home = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/' . $this->uid; //TODO switch to Config object once implemented } - $this->home = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/' . $this->uid; //TODO switch to Config object once implemented } return $this->home; } -- cgit v1.2.3 From 8a86837eac8da8beaa225e339902cab94c46e675 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 12 Dec 2013 13:59:00 +0100 Subject: remove unneeded ; in comment --- lib/private/group/group.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/group/group.php b/lib/private/group/group.php index 97f1cb8d960..8d2aa87a788 100644 --- a/lib/private/group/group.php +++ b/lib/private/group/group.php @@ -31,7 +31,7 @@ class Group { private $backends; /** - * @var \OC\Hooks\PublicEmitter $emitter ; + * @var \OC\Hooks\PublicEmitter $emitter */ private $emitter; -- cgit v1.2.3 From 91d6a6dd7c350c5ab6e879089a1b7b1be3e82b0f Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 11 Dec 2013 13:56:45 +0100 Subject: On webdav sesssions, loginname was compared to username which does not need to match necessarily --- lib/base.php | 7 +++---- lib/private/user/session.php | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) (limited to 'lib/private') diff --git a/lib/base.php b/lib/base.php index a6033f03f8c..473be9da4b3 100644 --- a/lib/base.php +++ b/lib/base.php @@ -527,10 +527,9 @@ class OC { OC_User::useBackend(new OC_User_Database()); OC_Group::useBackend(new OC_Group_Database()); - if (isset($_SERVER['PHP_AUTH_USER']) && self::$session->exists('user_id') - && $_SERVER['PHP_AUTH_USER'] != self::$session->get('user_id')) { - $sessionUser = self::$session->get('user_id'); + && $_SERVER['PHP_AUTH_USER'] != self::$session->get('loginname')) { + $sessionUser = self::$session->get('loginname'); $serverUser = $_SERVER['PHP_AUTH_USER']; OC_Log::write('core', "Session user-id ($sessionUser) doesn't match SERVER[PHP_AUTH_USER] ($serverUser).", @@ -805,7 +804,7 @@ class OC { if ( OC_Config::getValue('log_authfailip', false) ) { OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:'.$_SERVER['REMOTE_ADDR'], OC_Log::WARN); - } else { + } else { OC_Log::write('core', 'Login failed: user \''.$_POST["user"].'\' , wrong password, IP:set log_authfailip=true in conf', OC_Log::WARN); } diff --git a/lib/private/user/session.php b/lib/private/user/session.php index 9c9bee3da25..c2885d00413 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -112,6 +112,38 @@ class Session implements Emitter, \OCP\IUserSession { } } + /** + * set the login name + * + * @param string login name for the logged in user + */ + public function setLoginname($loginname) { + if (is_null($loginname)) { + $this->session->remove('loginname'); + } else { + $this->session->set('loginname', $loginname); + } + } + + /** + * get the login name of the current user + * + * @return string + */ + public function getLoginname() { + if ($this->activeUser) { + return $this->session->get('loginname'); + } else { + $uid = $this->session->get('user_id'); + if ($uid) { + $this->activeUser = $this->manager->get($uid); + return $this->session->get('loginname'); + } else { + return null; + } + } + } + /** * try to login with the provided credentials * @@ -126,6 +158,7 @@ class Session implements Emitter, \OCP\IUserSession { if (!is_null($user)) { if ($user->isEnabled()) { $this->setUser($user); + $this->setLoginname($uid); $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); return true; } else { @@ -143,6 +176,7 @@ class Session implements Emitter, \OCP\IUserSession { public function logout() { $this->manager->emit('\OC\User', 'logout'); $this->setUser(null); + $this->setLoginname(null); $this->unsetMagicInCookie(); } -- cgit v1.2.3 From 59f02066b6466e982a68b6e1f35578cc79d21285 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 16 Dec 2013 14:28:56 +0100 Subject: add default parameter for AllConfig->get*Value() --- lib/private/allconfig.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'lib/private') diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 72aabf60793..06ecbc8a072 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -25,11 +25,13 @@ class AllConfig implements \OCP\IConfig { /** * Looks up a system wide defined value + * * @param string $key the key of the value, under which it was saved + * @param string $default the default value to be returned if the value isn't set * @return string the saved value */ - public function getSystemValue($key) { - return \OCP\Config::getSystemValue($key, ''); + public function getSystemValue($key, $default = '') { + return \OCP\Config::getSystemValue($key, $default); } @@ -45,12 +47,14 @@ class AllConfig implements \OCP\IConfig { /** * Looks up an app wide defined value + * * @param string $appName the appName that we stored the value under * @param string $key the key of the value, under which it was saved + * @param string $default the default value to be returned if the value isn't set * @return string the saved value */ - public function getAppValue($appName, $key) { - return \OCP\Config::getAppValue($appName, $key, ''); + public function getAppValue($appName, $key, $default = '') { + return \OCP\Config::getAppValue($appName, $key, $default); } @@ -70,8 +74,10 @@ class AllConfig implements \OCP\IConfig { * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we stored the value under * @param string $key the key under which the value is being stored + * @param string $default the default value to be returned if the value isn't set + * @return string */ - public function getUserValue($userId, $appName, $key){ - return \OCP\Config::getUserValue($userId, $appName, $key); + public function getUserValue($userId, $appName, $key, $default = null){ + return \OCP\Config::getUserValue($userId, $appName, $key, $default); } } -- cgit v1.2.3 From e2efad6ae7c77f9bd50e50e1ba5db27d1d52434f Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 16 Dec 2013 14:33:03 +0100 Subject: Also add default to the \OCP\IConfig interface --- lib/private/allconfig.php | 8 ++++++-- lib/public/iconfig.php | 15 ++++++++++++--- 2 files changed, 18 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index 06ecbc8a072..a4aa69d43fb 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -4,7 +4,7 @@ * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. - * + * */ namespace OC; @@ -15,6 +15,7 @@ namespace OC; class AllConfig implements \OCP\IConfig { /** * Sets a new system wide value + * * @param string $key the key of the value, under which will be saved * @param string $value the value that should be stored * @todo need a use case for this @@ -37,6 +38,7 @@ class AllConfig implements \OCP\IConfig { /** * 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 @@ -60,6 +62,7 @@ class AllConfig implements \OCP\IConfig { /** * 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 @@ -71,13 +74,14 @@ class AllConfig implements \OCP\IConfig { /** * Shortcut for getting a user defined value + * * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we stored the value under * @param string $key the key under which the value is being stored * @param string $default the default value to be returned if the value isn't set * @return string */ - public function getUserValue($userId, $appName, $key, $default = null){ + public function getUserValue($userId, $appName, $key, $default = '') { return \OCP\Config::getUserValue($userId, $appName, $key, $default); } } diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index da6b6c54843..1d0f8e0015c 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -36,6 +36,7 @@ namespace OCP; 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 @@ -44,14 +45,17 @@ interface IConfig { /** * Looks up a system wide defined value + * * @param string $key the key of the value, under which it was saved + * @param string $default the default value to be returned if the value isn't set * @return string the saved value */ - public function getSystemValue($key); + public function getSystemValue($key, $default = ''); /** * Writes a new app wide value + * * @param string $appName the appName that we want to store the value under * @param string $key the key of the value, under which will be saved * @param string $value the value that should be stored @@ -60,15 +64,18 @@ interface IConfig { /** * Looks up an app wide defined value + * * @param string $appName the appName that we stored the value under * @param string $key the key of the value, under which it was saved + * @param string $default the default value to be returned if the value isn't set * @return string the saved value */ - public function getAppValue($appName, $key); + public function getAppValue($appName, $key, $default = ''); /** * Set a user defined value + * * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we want to store the value under * @param string $key the key under which the value is being stored @@ -78,9 +85,11 @@ interface IConfig { /** * Shortcut for getting a user defined value + * * @param string $userId the userId of the user that we want to store the value under * @param string $appName the appName that we stored the value under * @param string $key the key under which the value is being stored + * @param string $default the default value to be returned if the value isn't set */ - public function getUserValue($userId, $appName, $key); + public function getUserValue($userId, $appName, $key, $default = ''); } -- cgit v1.2.3 From 2a1d6d310628fbd22b1972442b19ad98d8ff7ad1 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 16 Dec 2013 15:04:02 +0100 Subject: Do not use L10n when logging exceptions In some specific situations, the L10N bundle isn't loadable yet (for example when there is an issue with the app_config table). In such case, we still want to be able to log the real exception. This fixes errors that say "OC_L10N_String::__toString must not throw exceptions" --- lib/private/template.php | 3 +-- lib/public/util.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'lib/private') diff --git a/lib/private/template.php b/lib/private/template.php index 9b2c1211e61..b2c3a20f281 100644 --- a/lib/private/template.php +++ b/lib/private/template.php @@ -292,9 +292,8 @@ class OC_Template extends \OC\Template\Base { if (!empty($hint)) { $hint = '
    '.$hint.'
    '; } - $l = OC_L10N::get('lib'); while (method_exists($exception, 'previous') && $exception = $exception->previous()) { - $error_msg .= '
    '.$l->t('Caused by:').' '; + $error_msg .= '
    Caused by:' . ' '; if ($exception->getCode()) { $error_msg .= '['.$exception->getCode().'] '; } diff --git a/lib/public/util.php b/lib/public/util.php index 1d76fd1e1f7..8e85f9afc3f 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -103,9 +103,8 @@ class Util { } // include cause - $l = \OC_L10N::get('lib'); while (method_exists($ex, 'getPrevious') && $ex = $ex->getPrevious()) { - $message .= ' - '.$l->t('Caused by:').' '; + $message .= ' - Caused by:' . ' '; $message .= $ex->getMessage(); if ($ex->getCode()) { $message .= '[' . $ex->getCode() . '] '; -- cgit v1.2.3 From a3fbad43c176e89261bbedcefb261168255df6d1 Mon Sep 17 00:00:00 2001 From: Thomas Tanghus Date: Mon, 16 Dec 2013 17:07:22 +0100 Subject: Use DEBUG instead of ERROR when favourites not found. Fix #6419 --- lib/private/tags.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/tags.php b/lib/private/tags.php index 9fdb35a7d6e..fe7de1073a0 100644 --- a/lib/private/tags.php +++ b/lib/private/tags.php @@ -480,7 +480,7 @@ class Tags implements \OCP\ITags { return $this->getIdsForTag(self::TAG_FAVORITE); } catch(\Exception $e) { \OCP\Util::writeLog('core', __METHOD__.', exception: ' . $e->getMessage(), - \OCP\Util::ERROR); + \OCP\Util::DEBUG); return array(); } } -- cgit v1.2.3 From dfeb04a574a5d2f3c4288f8195e6926ac9bca4cf Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 17 Dec 2013 02:20:00 +0100 Subject: Do not use xcache variable cache if cache size is 0. This is possible because it is possible to only use xcache as an opcode cache but not a variable cache. --- lib/private/memcache/xcache.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'lib/private') diff --git a/lib/private/memcache/xcache.php b/lib/private/memcache/xcache.php index 33de30562f9..4485f905207 100644 --- a/lib/private/memcache/xcache.php +++ b/lib/private/memcache/xcache.php @@ -44,11 +44,15 @@ class XCache extends Cache { static public function isAvailable(){ if (!extension_loaded('xcache')) { return false; - } elseif (\OC::$CLI) { + } + if (\OC::$CLI) { return false; - }else{ - return true; } + $var_size = (int) ini_get('xcache.var_size'); + if (!$var_size) { + return false; + } + return true; } } -- cgit v1.2.3 From 3b0d0e2b1f3fec67e18402b0b0ecaf03dcb6fed8 Mon Sep 17 00:00:00 2001 From: Oliver Gasser Date: Tue, 17 Dec 2013 22:46:45 +0100 Subject: DB: Support DECIMAL(precision,scale) syntax in XML Add support for specifying the precision and scale of a decimal data type to the XML description language. See owncloud/core#6475 --- lib/private/db/mdb2schemareader.php | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib/private') diff --git a/lib/private/db/mdb2schemareader.php b/lib/private/db/mdb2schemareader.php index 511bd1c90bd..b1fd2454cb0 100644 --- a/lib/private/db/mdb2schemareader.php +++ b/lib/private/db/mdb2schemareader.php @@ -183,6 +183,14 @@ class MDB2SchemaReader { $primary = $this->asBool($child); $options['primary'] = $primary; break; + case 'precision': + $precision = (string)$child; + $options['precision'] = $precision; + break; + case 'scale': + $scale = (string)$child; + $options['scale'] = $scale; + break; default: throw new \DomainException('Unknown element: ' . $child->getName()); -- cgit v1.2.3 From a6c1b3ece3ee70936dc7ca2c099076d86773cc61 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 16 Dec 2013 14:22:25 +0100 Subject: fix the config option to remove the ability for users to set their displayname --- lib/private/server.php | 12 ++++++++++-- lib/private/user/manager.php | 17 +++++++++++++---- lib/private/user/user.php | 17 ++++++++++++++--- 3 files changed, 37 insertions(+), 9 deletions(-) (limited to 'lib/private') diff --git a/lib/private/server.php b/lib/private/server.php index 77c3732a9ca..bee70dec2df 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -69,10 +69,18 @@ class Server extends SimpleContainer implements IServerContainer { return new Root($manager, $view, $user); }); $this->registerService('UserManager', function($c) { - return new \OC\User\Manager(); + /** + * @var SimpleContainer $c + * @var \OC\AllConfig $config + */ + $config = $c->query('AllConfig'); + return new \OC\User\Manager($config); }); $this->registerService('UserSession', function($c) { - /** @var $c SimpleContainer */ + /** + * @var SimpleContainer $c + * @var \OC\User\Manager $manager + */ $manager = $c->query('UserManager'); $userSession = new \OC\User\Session($manager, \OC::$session); $userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) { diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 703c8cd7413..cf83a75ba25 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -35,7 +35,16 @@ class Manager extends PublicEmitter { */ private $cachedUsers = array(); - public function __construct() { + /** + * @var \OC\AllConfig $config + */ + private $config; + + /** + * @param \OC\AllConfig $config + */ + public function __construct($config = null) { + $this->config = $config; $cachedUsers = $this->cachedUsers; $this->listen('\OC\User', 'postDelete', function ($user) use (&$cachedUsers) { $i = array_search($user, $cachedUsers); @@ -103,7 +112,7 @@ class Manager extends PublicEmitter { if (isset($this->cachedUsers[$uid])) { return $this->cachedUsers[$uid]; } - $this->cachedUsers[$uid] = new User($uid, $backend, $this); + $this->cachedUsers[$uid] = new User($uid, $backend, $this, $this->config); return $this->cachedUsers[$uid]; } @@ -141,7 +150,7 @@ class Manager extends PublicEmitter { */ public function checkPassword($loginname, $password) { foreach ($this->backends as $backend) { - if($backend->implementsActions(\OC_USER_BACKEND_CHECK_PASSWORD)) { + if ($backend->implementsActions(\OC_USER_BACKEND_CHECK_PASSWORD)) { $uid = $backend->checkPassword($loginname, $password); if ($uid !== false) { return $this->getUserObject($uid, $backend); @@ -234,7 +243,7 @@ class Manager extends PublicEmitter { // Allowed are: "a-z", "A-Z", "0-9" and "_.@-" if (preg_match('/[^a-zA-Z0-9 _\.@\-]/', $uid)) { throw new \Exception('Only the following characters are allowed in a username:' - . ' "a-z", "A-Z", "0-9", and "_.@-"'); + . ' "a-z", "A-Z", "0-9", and "_.@-"'); } // No empty username if (trim($uid) == '') { diff --git a/lib/private/user/user.php b/lib/private/user/user.php index b4f33fa73cc..b0b4657413c 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -42,12 +42,18 @@ class User { */ private $home; + /** + * @var \OC\AllConfig $config + */ + private $config; + /** * @param string $uid * @param \OC_User_Backend $backend - * @param Emitter $emitter + * @param \OC\Hooks\Emitter $emitter + * @param \OC\AllConfig $config */ - public function __construct($uid, $backend, $emitter = null) { + public function __construct($uid, $backend, $emitter = null, $config = null) { $this->uid = $uid; if ($backend and $backend->implementsActions(OC_USER_BACKEND_GET_DISPLAYNAME)) { $this->displayName = $backend->getDisplayName($uid); @@ -58,6 +64,7 @@ class User { $this->emitter = $emitter; $enabled = \OC_Preferences::getValue($uid, 'core', 'enabled', 'true'); //TODO: DI for OC_Preferences $this->enabled = ($enabled === 'true'); + $this->config = $config; } /** @@ -175,7 +182,11 @@ class User { * @return bool */ public function canChangeDisplayName() { - return $this->backend->implementsActions(\OC_USER_BACKEND_SET_DISPLAYNAME); + if ($this->config and $this->config->getSystemValue('allow_user_to_change_display_name') === false) { + return false; + } else { + return $this->backend->implementsActions(\OC_USER_BACKEND_SET_DISPLAYNAME); + } } /** -- cgit v1.2.3 From e7a5c90cab3f1afd9c3f81a76c128eced7e94b69 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 16 Dec 2013 16:02:03 +0100 Subject: Replace static usage of OC_Config and OC_Preferences with the injected \OC\ConfigAll --- lib/private/user/user.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/user/user.php b/lib/private/user/user.php index b0b4657413c..ef5364cbf7b 100644 --- a/lib/private/user/user.php +++ b/lib/private/user/user.php @@ -62,9 +62,13 @@ class User { } $this->backend = $backend; $this->emitter = $emitter; - $enabled = \OC_Preferences::getValue($uid, 'core', 'enabled', 'true'); //TODO: DI for OC_Preferences - $this->enabled = ($enabled === 'true'); $this->config = $config; + if ($this->config) { + $enabled = $this->config->getUserValue($uid, 'core', 'enabled', 'true'); + $this->enabled = ($enabled === 'true'); + } else { + $this->enabled = true; + } } /** @@ -148,8 +152,10 @@ class User { if (!$this->home) { if ($this->backend->implementsActions(\OC_USER_BACKEND_GET_HOME) and $home = $this->backend->getHome($this->uid)) { $this->home = $home; + } elseif ($this->config) { + $this->home = $this->config->getSystemValue('datadirectory') . '/' . $this->uid; } else { - $this->home = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data") . '/' . $this->uid; //TODO switch to Config object once implemented + $this->home = \OC::$SERVERROOT . '/data/' . $this->uid; } } return $this->home; @@ -205,7 +211,9 @@ class User { */ public function setEnabled($enabled) { $this->enabled = $enabled; - $enabled = ($enabled) ? 'true' : 'false'; - \OC_Preferences::setValue($this->uid, 'core', 'enabled', $enabled); + if ($this->config) { + $enabled = ($enabled) ? 'true' : 'false'; + $this->config->setUserValue($this->uid, 'core', 'enabled', $enabled); + } } } -- cgit v1.2.3 From 5a646477a56bc3ac0a93d46839927f5c504cf4bd Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 18 Dec 2013 15:10:12 +0100 Subject: Fetch all appconfig values for an app at once and cache the results --- lib/private/appconfig.php | 138 ++++++++++++++++++++++++++++------------------ 1 file changed, 84 insertions(+), 54 deletions(-) (limited to 'lib/private') diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index 4f170e054e9..58c037a91e7 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -37,7 +37,10 @@ * This class provides an easy way for apps to store config values in the * database. */ -class OC_Appconfig{ +class OC_Appconfig { + + private static $cache = array(); + /** * @brief Get all apps using the config * @return array with app ids @@ -47,11 +50,11 @@ class OC_Appconfig{ */ public static function getApps() { // No magic in here! - $query = OC_DB::prepare( 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`' ); + $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'); $result = $query->execute(); $apps = array(); - while( $row = $result->fetchRow()) { + while ($row = $result->fetchRow()) { $apps[] = $row["appid"]; } @@ -66,19 +69,32 @@ class OC_Appconfig{ * This function gets all keys of an app. Please note that the values are * not returned. */ - public static function getKeys( $app ) { + public static function getKeys($app) { // No magic in here as well - $query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); - $result = $query->execute( array( $app )); + $query = OC_DB::prepare('SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?'); + $result = $query->execute(array($app)); $keys = array(); - while( $row = $result->fetchRow()) { + while ($row = $result->fetchRow()) { $keys[] = $row["configkey"]; } return $keys; } + private static function getAppValues($app) { + if (!isset(self::$cache[$app])) { + self::$cache[$app] = array(); + } + $query = OC_DB::prepare('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`' + . ' WHERE `appid` = ?'); + $result = $query->execute(array($app)); + while ($row = $result->fetchRow()) { + self::$cache[$app][$row['configkey']] = $row['configvalue']; + } + return self::$cache[$app]; + } + /** * @brief Gets the config value * @param string $app app @@ -89,15 +105,18 @@ class OC_Appconfig{ * This function gets a value from the appconfig table. If the key does * not exist the default value will be returned */ - public static function getValue( $app, $key, $default = null ) { - // At least some magic in here :-) - $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*appconfig`' - .' WHERE `appid` = ? AND `configkey` = ?' ); - $result = $query->execute( array( $app, $key )); - $row = $result->fetchRow(); - if($row) { - return $row["configvalue"]; - }else{ + public static function getValue($app, $key, $default = null) { + if (!isset(self::$cache[$app])) { + self::$cache[$app] = array(); + } + if (isset(self::$cache[$app][$key])) { + return self::$cache[$app][$key]; + } + $values = self::getAppValues($app); + if (isset($values[$key])) { + return $values[$key]; + } else { + self::$cache[$app][$key] = $default; return $default; } } @@ -109,8 +128,11 @@ class OC_Appconfig{ * @return bool */ public static function hasKey($app, $key) { - $exists = self::getKeys( $app ); - return in_array( $key, $exists ); + if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) { + return true; + } + $exists = self::getKeys($app); + return in_array($key, $exists); } /** @@ -122,17 +144,16 @@ class OC_Appconfig{ * * Sets a value. If the key did not exist before it will be created. */ - public static function setValue( $app, $key, $value ) { + public static function setValue($app, $key, $value) { // Does the key exist? yes: update. No: insert - if(! self::hasKey($app, $key)) { - $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )' - .' VALUES( ?, ?, ? )' ); - $query->execute( array( $app, $key, $value )); - } - else{ - $query = OC_DB::prepare( 'UPDATE `*PREFIX*appconfig` SET `configvalue` = ?' - .' WHERE `appid` = ? AND `configkey` = ?' ); - $query->execute( array( $value, $app, $key )); + if (!self::hasKey($app, $key)) { + $query = OC_DB::prepare('INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` )' + . ' VALUES( ?, ?, ? )'); + $query->execute(array($app, $key, $value)); + } else { + $query = OC_DB::prepare('UPDATE `*PREFIX*appconfig` SET `configvalue` = ?' + . ' WHERE `appid` = ? AND `configkey` = ?'); + $query->execute(array($value, $app, $key)); } // TODO where should this be documented? \OC_Hook::emit('OC_Appconfig', 'post_set_value', array( @@ -140,6 +161,10 @@ class OC_Appconfig{ 'key' => $key, 'value' => $value )); + if (!isset(self::$cache[$app])) { + self::$cache[$app] = array(); + } + self::$cache[$app][$key] = $value; } /** @@ -150,10 +175,13 @@ class OC_Appconfig{ * * Deletes a key. */ - public static function deleteKey( $app, $key ) { + public static function deleteKey($app, $key) { // Boring! - $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' ); - $query->execute( array( $app, $key )); + $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?'); + $query->execute(array($app, $key)); + if (isset(self::$cache[$app]) and isset(self::$cache[$app][$key])) { + unset(self::$cache[$app][$key]); + } return true; } @@ -165,44 +193,46 @@ class OC_Appconfig{ * * Removes all keys in appconfig belonging to the app. */ - public static function deleteApp( $app ) { + public static function deleteApp($app) { // Nothing special - $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); - $query->execute( array( $app )); + $query = OC_DB::prepare('DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?'); + $query->execute(array($app)); + self::$cache[$app] = array(); return true; } /** * get multiply values, either the app or key can be used as wildcard by setting it to false + * * @param app * @param key * @return array */ public static function getValues($app, $key) { - if($app!==false and $key!==false) { + if ($app !== false and $key !== false) { return false; } - $fields='`configvalue`'; - $where='WHERE'; - $params=array(); - if($app!==false) { - $fields.=', `configkey`'; - $where.=' `appid` = ?'; - $params[]=$app; - $key='configkey'; - }else{ - $fields.=', `appid`'; - $where.=' `configkey` = ?'; - $params[]=$key; - $key='appid'; + $fields = '`configvalue`'; + $where = 'WHERE'; + $params = array(); + if ($app !== false) { + $fields .= ', `configkey`'; + $where .= ' `appid` = ?'; + $params[] = $app; + $key = 'configkey'; + } else { + $fields .= ', `appid`'; + $where .= ' `configkey` = ?'; + $params[] = $key; + $key = 'appid'; } - $queryString='SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where; - $query=OC_DB::prepare($queryString); - $result=$query->execute($params); - $values=array(); - while($row=$result->fetchRow()) { - $values[$row[$key]]=$row['configvalue']; + $queryString = 'SELECT ' . $fields . ' FROM `*PREFIX*appconfig` ' . $where; + $query = OC_DB::prepare($queryString); + $result = $query->execute($params); + $values = array(); + while ($row = $result->fetchRow()) { + $values[$row[$key]] = $row['configvalue']; } return $values; } -- cgit v1.2.3 From 6c707323f23d0abc0759ba2d61caf148c5c68edb Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 18 Dec 2013 15:25:28 +0100 Subject: only walk an array --- lib/private/json.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/json.php b/lib/private/json.php index 8401f7c3a12..6a9e5a2df5e 100644 --- a/lib/private/json.php +++ b/lib/private/json.php @@ -116,7 +116,9 @@ class OC_JSON{ * Encode JSON */ public static function encode($data) { - array_walk_recursive($data, array('OC_JSON', 'to_string')); + if (is_array($data)) { + array_walk_recursive($data, array('OC_JSON', 'to_string')); + } return json_encode($data); } } -- cgit v1.2.3 From 2e195dbdae2f270d40191ff6f01d10cc81c1dc06 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 18 Dec 2013 15:28:32 +0100 Subject: dont re-read the config values for an app when a non existing key is fetched --- lib/private/appconfig.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index 58c037a91e7..dfe03698059 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -41,6 +41,8 @@ class OC_Appconfig { private static $cache = array(); + private static $appsLoaded = array(); + /** * @brief Get all apps using the config * @return array with app ids @@ -86,11 +88,14 @@ class OC_Appconfig { if (!isset(self::$cache[$app])) { self::$cache[$app] = array(); } - $query = OC_DB::prepare('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`' - . ' WHERE `appid` = ?'); - $result = $query->execute(array($app)); - while ($row = $result->fetchRow()) { - self::$cache[$app][$row['configkey']] = $row['configvalue']; + if (array_search($app, self::$appsLoaded) === false) { + $query = OC_DB::prepare('SELECT `configvalue`, `configkey` FROM `*PREFIX*appconfig`' + . ' WHERE `appid` = ?'); + $result = $query->execute(array($app)); + while ($row = $result->fetchRow()) { + self::$cache[$app][$row['configkey']] = $row['configvalue']; + } + self::$appsLoaded[] = $app; } return self::$cache[$app]; } -- cgit v1.2.3 From b109d411d8e88a84a1b2620b42e977c52c7492ff Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 18 Dec 2013 22:39:02 +0100 Subject: Added missing mime types This is mostly to fix acceptance tests that have a .cc file. Also fixed typo in python mime type. --- lib/private/mimetypes.list.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 8ab8ac81bd8..3034c2777f7 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -82,7 +82,7 @@ return array( 'mov'=>'video/quicktime', 'webm'=>'video/webm', 'wmv'=>'video/x-ms-asf', - 'py'=>'text/x-script.phyton', + 'py'=>'text/x-script.python', 'vcf' => 'text/vcard', 'vcard' => 'text/vcard', 'doc'=>'application/msword', @@ -103,5 +103,9 @@ return array( 'markdown' => 'text/markdown', 'mdown' => 'text/markdown', 'mdwn' => 'text/markdown', - 'reveal' => 'text/reveal' + 'reveal' => 'text/reveal', + 'c' => 'text/x-c', + 'cc' => 'text/x-c', + 'cpp' => 'text/x-c++src', + 'c++' => 'text/x-c++src', ); -- cgit v1.2.3 From 09bd5bd517fee80e8b44b7645b51a8ba482a4d7c Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 12 Dec 2013 11:32:56 +0100 Subject: Added isUserAgent() method to request - added isUserAgent() method to OC_Request which makes it possible to test it - OC_Response::setContentDisposition now uses OC_Request::isUserAgent() --- lib/private/request.php | 23 ++++++++++++++++++++++ lib/private/response.php | 3 +-- tests/lib/request.php | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/request.php b/lib/private/request.php index b2afda35922..d9d5ae08e28 100755 --- a/lib/private/request.php +++ b/lib/private/request.php @@ -7,6 +7,11 @@ */ class OC_Request { + + const USER_AGENT_IE = '/MSIE/'; + // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent + const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#'; + /** * @brief Check overwrite condition * @param string $type @@ -210,4 +215,22 @@ class OC_Request { return false; } } + + /** + * Checks whether the user agent matches a given regex + * @param string|array $agent agent name or array of agent names + * @return boolean true if at least one of the given agent matches, + * false otherwise + */ + static public function isUserAgent($agent) { + if (!is_array($agent)) { + $agent = array($agent); + } + foreach ($agent as $regex) { + if (preg_match($regex, $_SERVER['HTTP_USER_AGENT'])) { + return true; + } + } + return false; + } } diff --git a/lib/private/response.php b/lib/private/response.php index c6edda0f949..04746437347 100644 --- a/lib/private/response.php +++ b/lib/private/response.php @@ -153,8 +153,7 @@ class OC_Response { * @param string $type disposition type, either 'attachment' or 'inline' */ static public function setContentDispositionHeader( $filename, $type = 'attachment' ) { - // Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent - if ( preg_match( '/MSIE/', $_SERVER['HTTP_USER_AGENT'] ) or preg_match( '#Android.*Chrome/[.0-9]*#', $_SERVER['HTTP_USER_AGENT'] ) ) { + if (OC_Request::isUserAgent(array(OC_Request::USER_AGENT_IE, OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME))) { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename="' . rawurlencode( $filename ) . '"' ); } else { header( 'Content-Disposition: ' . rawurlencode($type) . '; filename*=UTF-8\'\'' . rawurlencode( $filename ) diff --git a/tests/lib/request.php b/tests/lib/request.php index 090cebc9231..c6401a57144 100644 --- a/tests/lib/request.php +++ b/tests/lib/request.php @@ -70,4 +70,54 @@ class Test_Request extends PHPUnit_Framework_TestCase { array('/oc/core1', '/oc/core/index.php'), ); } + + /** + * @dataProvider userAgentProvider + */ + public function testUserAgent($testAgent, $userAgent, $matches) { + $_SERVER['HTTP_USER_AGENT'] = $testAgent; + $this->assertEquals($matches, OC_Request::isUserAgent($userAgent)); + } + + function userAgentProvider() { + return array( + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + OC_Request::USER_AGENT_IE, + true + ), + array( + 'Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Firefox/24.0', + OC_Request::USER_AGENT_IE, + false + ), + array( + 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36', + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + true + ), + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + false + ), + // test two values + array( + 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', + array( + OC_Request::USER_AGENT_IE, + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + ), + true + ), + array( + 'Mozilla/5.0 (Linux; Android 4.4; Nexus 4 Build/KRT16S) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36', + array( + OC_Request::USER_AGENT_IE, + OC_Request::USER_AGENT_ANDROID_MOBILE_CHROME, + ), + true + ), + ); + } } -- cgit v1.2.3 From 1c340444a43d76c388153059aefd24276d8347a9 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 19 Dec 2013 20:18:09 +0100 Subject: Added test cleanup listener to detect untidy tests After each test suite, detects whether there are stray datafiles, hooks or proxies, then show a warning and clear them. --- lib/private/fileproxy.php | 6 +- lib/private/hook.php | 8 +++ tests/phpunit-autotest.xml | 7 +++ tests/testcleanuplistener.php | 139 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 tests/testcleanuplistener.php (limited to 'lib/private') diff --git a/lib/private/fileproxy.php b/lib/private/fileproxy.php index 52ec79b4bdb..2997aaf81b6 100644 --- a/lib/private/fileproxy.php +++ b/lib/private/fileproxy.php @@ -67,7 +67,11 @@ class OC_FileProxy{ self::$proxies[]=$proxy; } - public static function getProxies($operation) { + public static function getProxies($operation = null) { + if ($operation === null) { + // return all + return self::$proxies; + } $proxies=array(); foreach(self::$proxies as $proxy) { if(method_exists($proxy, $operation)) { diff --git a/lib/private/hook.php b/lib/private/hook.php index 8516cf0dcff..b63b442c31b 100644 --- a/lib/private/hook.php +++ b/lib/private/hook.php @@ -97,4 +97,12 @@ class OC_Hook{ self::$registered=array(); } } + + /** + * DO NOT USE! + * For unit tests ONLY! + */ + static public function getHooks() { + return self::$registered; + } } diff --git a/tests/phpunit-autotest.xml b/tests/phpunit-autotest.xml index a893e96ad97..1a2ab35491b 100644 --- a/tests/phpunit-autotest.xml +++ b/tests/phpunit-autotest.xml @@ -35,5 +35,12 @@ + + + + detail + + + diff --git a/tests/testcleanuplistener.php b/tests/testcleanuplistener.php new file mode 100644 index 00000000000..368ea7bc8f4 --- /dev/null +++ b/tests/testcleanuplistener.php @@ -0,0 +1,139 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/** + * Detects tests that didn't clean up properly, show a warning, then clean up after them. + */ +class TestCleanupListener implements PHPUnit_Framework_TestListener { + private $verbosity; + + public function __construct($verbosity = 'verbose') { + $this->verbosity = $verbosity; + } + + public function addError(PHPUnit_Framework_Test $test, Exception $e, $time) { + } + + public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time) { + } + + public function addIncompleteTest(PHPUnit_Framework_Test $test, Exception $e, $time) { + } + + public function addSkippedTest(PHPUnit_Framework_Test $test, Exception $e, $time) { + } + + public function startTest(PHPUnit_Framework_Test $test) { + } + + public function endTest(PHPUnit_Framework_Test $test, $time) { + } + + public function startTestSuite(PHPUnit_Framework_TestSuite $suite) { + } + + public function endTestSuite(PHPUnit_Framework_TestSuite $suite) { + if ($this->cleanStrayDataFiles() && $this->isShowSuiteWarning()) { + printf("TestSuite '%s': Did not clean up data dir\n", $suite->getName()); + } + if ($this->cleanStrayHooks() && $this->isShowSuiteWarning()) { + printf("TestSuite '%s': Did not clean up hooks\n", $suite->getName()); + } + if ($this->cleanProxies() && $this->isShowSuiteWarning()) { + printf("TestSuite '%s': Did not clean up proxies\n", $suite->getName()); + } + } + + private function isShowSuiteWarning() { + return $this->verbosity === 'suite' || $this->verbosity === 'detail'; + } + + private function isShowDetail() { + return $this->verbosity === 'detail'; + } + + private function unlinkDir($dir) { + if ($dh = opendir($dir)) { + while (($file = readdir($dh)) !== false) { + if ($file === '..' || $file === '.') { + continue; + } + $path = $dir . '/' . $file; + if (is_dir($path)) { + $this->unlinkDir($path); + } + else { + unlink($path); + } + } + closedir($dh); + } + rmdir($dir); + } + + private function cleanStrayDataFiles() { + $knownEntries = array( + 'owncloud.log' => true, + 'owncloud.db' => true, + '..' => true, + '.' => true + ); + $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data'); + $entries = array(); + if ($dh = opendir($datadir)) { + while (($file = readdir($dh)) !== false) { + if (!isset($knownEntries[$file])) { + $entries[] = $file; + } + } + closedir($dh); + } + + if (count($entries) > 0) { + foreach ($entries as $entry) { + $this->unlinkDir($datadir . '/' . $entry); + if ($this->isShowDetail()) { + printf("Stray datadir entry: %s\n", $entry); + } + } + return true; + } + + return false; + } + + private function cleanStrayHooks() { + $hasHooks = false; + $hooks = OC_Hook::getHooks(); + if (!$hooks || sizeof($hooks) === 0) { + return false; + } + + foreach ($hooks as $signalClass => $signals) { + if (sizeof($signals)) { + foreach ($signals as $signalName => $handlers ) { + if (sizeof($handlers) > 0) { + $hasHooks = true; + OC_Hook::clear($signalClass, $signalName); + if ($this->isShowDetail()) { + printf("Stray hook: \"%s\" \"%s\"\n", $signalClass, $signalName); + } + } + } + } + } + return $hasHooks; + } + + private function cleanProxies() { + $proxies = OC_FileProxy::getProxies(); + OC_FileProxy::clearProxies(); + return count($proxies) > 0; + } +} +?> -- cgit v1.2.3 From 1c0b8ed21421334fed1a699e52dbb5765b66f96d Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Fri, 20 Dec 2013 13:48:46 +0100 Subject: Adding a random postfix to the part file. --- lib/private/connector/sabre/file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index 295575f0af6..d476e9fab14 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D } // mark file as partial while uploading (ignored by the scanner) - $partpath = $this->path . '.part'; + $partpath = $this->path . rand() . '.part'; // if file is located in /Shared we write the part file to the users // root folder because we can't create new files in /shared -- cgit v1.2.3 From c6377e9125ed2a1b508dd1d2e12db8a82934f648 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Mon, 16 Dec 2013 17:22:44 +0100 Subject: Fixed apps loading order On SQLite the app order can be arbitrary and cause strange bugs. On MySQL, the app order seems to be always alphabetical. This fix enforces alphabetical order to make sure that all environments behave the same and to reduce bugs related to app loading order. Fixes #6442 --- lib/private/app.php | 10 ++++++---- lib/private/appconfig.php | 2 +- tests/lib/app.php | 13 +++++++++++++ tests/lib/appconfig.php | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) (limited to 'lib/private') diff --git a/lib/private/app.php b/lib/private/app.php index eca40a81cc1..34c00e97fb9 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -166,20 +166,22 @@ class OC_App{ * get all enabled apps */ private static $enabledAppsCache = array(); - public static function getEnabledApps() { + public static function getEnabledApps($forceRefresh = false) { if(!OC_Config::getValue('installed', false)) { return array(); } - if(!empty(self::$enabledAppsCache)) { + if(!$forceRefresh && !empty(self::$enabledAppsCache)) { return self::$enabledAppsCache; } $apps=array('files'); $sql = 'SELECT `appid` FROM `*PREFIX*appconfig`' - .' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\''; + . ' WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'' + . ' ORDER BY `appid`'; if (OC_Config::getValue( 'dbtype', 'sqlite' ) === 'oci') { //FIXME oracle hack: need to explicitly cast CLOB to CHAR for comparison $sql = 'SELECT `appid` FROM `*PREFIX*appconfig`' - .' WHERE `configkey` = \'enabled\' AND to_char(`configvalue`)=\'yes\''; + . ' WHERE `configkey` = \'enabled\' AND to_char(`configvalue`)=\'yes\'' + . ' ORDER BY `appid`'; } $query = OC_DB::prepare( $sql ); $result=$query->execute(); diff --git a/lib/private/appconfig.php b/lib/private/appconfig.php index dfe03698059..da0b2ff8604 100644 --- a/lib/private/appconfig.php +++ b/lib/private/appconfig.php @@ -52,7 +52,7 @@ class OC_Appconfig { */ public static function getApps() { // No magic in here! - $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'); + $query = OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`'); $result = $query->execute(); $apps = array(); diff --git a/tests/lib/app.php b/tests/lib/app.php index 52eade90a6e..49f40f089bb 100644 --- a/tests/lib/app.php +++ b/tests/lib/app.php @@ -79,4 +79,17 @@ class Test_App extends PHPUnit_Framework_TestCase { $this->assertFalse(OC_App::isAppVersionCompatible($oc, $app)); } + /** + * Tests that the app order is correct + */ + public function testGetEnabledAppsIsSorted() { + $apps = \OC_App::getEnabledApps(true); + // copy array + $sortedApps = $apps; + sort($sortedApps); + // 'files' is always on top + unset($sortedApps[array_search('files', $sortedApps)]); + array_unshift($sortedApps, 'files'); + $this->assertEquals($sortedApps, $apps); + } } diff --git a/tests/lib/appconfig.php b/tests/lib/appconfig.php index 4d82cd5ba7b..23dd2549e32 100644 --- a/tests/lib/appconfig.php +++ b/tests/lib/appconfig.php @@ -35,7 +35,7 @@ class Test_Appconfig extends PHPUnit_Framework_TestCase { } public function testGetApps() { - $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`'); + $query = \OC_DB::prepare('SELECT DISTINCT `appid` FROM `*PREFIX*appconfig` ORDER BY `appid`'); $result = $query->execute(); $expected = array(); while ($row = $result->fetchRow()) { -- cgit v1.2.3 From 63a2bea7ec0171595f2a96639827e9d477fc6878 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Tue, 17 Dec 2013 00:44:35 +0100 Subject: Remove OC_DB_StatementWrapper::numRows(). Using this method will result in an unneccesary extra SQL query (which also may return an incorrect result because the underlying table changed in the meantime). In general: If you are performing an UPDATE, DELETE or equivalent query, OC_DB_StatementWrapper::execute() will already give you the number of "affected rows" via \Doctrine\DBAL\Driver\Statement::rowCount(). This will not work for SELECT queries, however. If you want to know whether a table contains any rows matching your condition, use "SELECT id FROM ... WHERE ... LIMIT 1". If you want to know whether a table contains any rows matching your condition and you also need the data, use "SELECT ... FROM ... WHERE ...", then use one of the fetch() methods. If you want to count the number of rows matching your condition, use use "SELECT COUNT(...) AS number_of_rows FROM ... WHERE ...", then use one of the fetch() methods. --- lib/private/db/statementwrapper.php | 19 ------------------- 1 file changed, 19 deletions(-) (limited to 'lib/private') diff --git a/lib/private/db/statementwrapper.php b/lib/private/db/statementwrapper.php index b8da1afc0e5..5e89261d936 100644 --- a/lib/private/db/statementwrapper.php +++ b/lib/private/db/statementwrapper.php @@ -29,25 +29,6 @@ class OC_DB_StatementWrapper { return call_user_func_array(array($this->statement,$name), $arguments); } - /** - * provide numRows - */ - public function numRows() { - $type = OC_Config::getValue( "dbtype", "sqlite" ); - if ($type == 'oci') { - // OCI doesn't have a queryString, just do a rowCount for now - return $this->statement->rowCount(); - } - $regex = '/^SELECT\s+(?:ALL\s+|DISTINCT\s+)?(?:.*?)\s+FROM\s+(.*)$/i'; - $queryString = $this->statement->getWrappedStatement()->queryString; - if (preg_match($regex, $queryString, $output) > 0) { - $query = OC_DB::prepare("SELECT COUNT(*) FROM {$output[1]}"); - return $query->execute($this->lastArguments)->fetchColumn(); - }else{ - return $this->statement->rowCount(); - } - } - /** * make execute return the result instead of a bool */ -- cgit v1.2.3 From ae5671d2813f74562b77ae4288f01b4ed5ed52be Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 31 Dec 2013 14:36:02 +0100 Subject: new config parameter 'front_controller_active' which will instruct the url generator to generate urls without index.php --- lib/private/server.php | 5 +++-- lib/private/urlgenerator.php | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) (limited to 'lib/private') diff --git a/lib/private/server.php b/lib/private/server.php index 77c3732a9ca..17565fafa46 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -120,7 +120,8 @@ class Server extends SimpleContainer implements IServerContainer { return new \OC\L10N\Factory(); }); $this->registerService('URLGenerator', function($c) { - return new \OC\URLGenerator(); + $config = $this->getConfig(); + return new \OC\URLGenerator($config); }); $this->registerService('AppHelper', function($c) { return new \OC\AppHelper(); @@ -249,7 +250,7 @@ class Server extends SimpleContainer implements IServerContainer { } /** - * @return \OC\Config + * @return \OCP\IConfig */ function getConfig() { return $this->query('AllConfig'); diff --git a/lib/private/urlgenerator.php b/lib/private/urlgenerator.php index 7795011fd06..4e3c1109000 100644 --- a/lib/private/urlgenerator.php +++ b/lib/private/urlgenerator.php @@ -15,6 +15,19 @@ use RuntimeException; * Class to generate URLs */ class URLGenerator implements IURLGenerator { + + /** + * @var \OCP\IConfig + */ + private $config; + + /** + * @param \OCP\IConfig $config + */ + public function __construct($config) { + $this->config = $config; + } + /** * @brief Creates an url using a defined route * @param $route @@ -41,12 +54,18 @@ class URLGenerator implements IURLGenerator { * Returns a url to the given app and file. */ public function linkTo( $app, $file, $args = array() ) { + $frontControllerActive=($this->config->getSystemValue('front_controller_active', 'false') == 'true'); + if( $app != '' ) { $app_path = \OC_App::getAppPath($app); // Check if the app is in the app folder if ($app_path && file_exists($app_path . '/' . $file)) { if (substr($file, -3) == 'php' || substr($file, -3) == 'css') { + $urlLinkTo = \OC::$WEBROOT . '/index.php/apps/' . $app; + if ($frontControllerActive) { + $urlLinkTo = \OC::$WEBROOT . '/apps/' . $app; + } $urlLinkTo .= ($file != 'index.php') ? '/' . $file : ''; } else { $urlLinkTo = \OC_App::getAppWebPath($app) . '/' . $file; @@ -58,7 +77,11 @@ class URLGenerator implements IURLGenerator { if (file_exists(\OC::$SERVERROOT . '/core/' . $file)) { $urlLinkTo = \OC::$WEBROOT . '/core/' . $file; } else { - $urlLinkTo = \OC::$WEBROOT . '/' . $file; + if ($frontControllerActive && $file === 'index.php') { + $urlLinkTo = \OC::$WEBROOT; + } else { + $urlLinkTo = \OC::$WEBROOT . '/' . $file; + } } } -- cgit v1.2.3 From 6254f0a403e315461f8e20ebccf71cb91e9313a3 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 31 Dec 2013 15:12:17 +0100 Subject: use getAppWebPath() in here as well --- lib/private/template/cssresourcelocator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/template/cssresourcelocator.php b/lib/private/template/cssresourcelocator.php index 8e7831ca549..e26daa25827 100644 --- a/lib/private/template/cssresourcelocator.php +++ b/lib/private/template/cssresourcelocator.php @@ -22,7 +22,7 @@ class CSSResourceLocator extends ResourceLocator { $app = substr($style, 0, strpos($style, '/')); $style = substr($style, strpos($style, '/')+1); $app_path = \OC_App::getAppPath($app); - $app_url = $this->webroot . '/index.php/apps/' . $app; + $app_url = \OC_App::getAppWebPath($app); if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url) || $this->appendIfExist($app_path, $style.'.css', $app_url) ) { -- cgit v1.2.3 From 4c179850abc1fd8d750b9a13e700819556c6be7d Mon Sep 17 00:00:00 2001 From: Niklas Sombert Date: Wed, 1 Jan 2014 13:43:23 +0100 Subject: Revert "Added support for extra backends (see pull request #5043)" This reverts commit 2d75914f2a97cbfd34ae7c2ef27f5bd8185b81eb, reversing changes made to 760fa9ea3005e7df81a1fac54f207dbe7d8ef312. --- lib/private/connector/sabre/auth.php | 2 -- 1 file changed, 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/connector/sabre/auth.php b/lib/private/connector/sabre/auth.php index 43beb5e3f66..0c84fa6b757 100644 --- a/lib/private/connector/sabre/auth.php +++ b/lib/private/connector/sabre/auth.php @@ -36,8 +36,6 @@ class OC_Connector_Sabre_Auth extends Sabre_DAV_Auth_Backend_AbstractBasic { return true; } else { OC_Util::setUpFS();//login hooks may need early access to the filesystem - //setup extra user backends - OC_User::setupBackends();//if you do not want to use Owncloud's integrated login if(OC_User::login($username, $password)) { OC_Util::setUpFS(OC_User::getUser()); return true; -- cgit v1.2.3 From d5382ac05dd80fe5e963fd84bf00c970bda934c9 Mon Sep 17 00:00:00 2001 From: lolozere Date: Wed, 1 Jan 2014 14:09:02 +0100 Subject: Add support mimetype Add support mimetype for extension .sh, .bash and .sh-lib --- lib/private/mimetypes.list.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/private') diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 3034c2777f7..740982910e0 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -108,4 +108,7 @@ return array( 'cc' => 'text/x-c', 'cpp' => 'text/x-c++src', 'c++' => 'text/x-c++src', + 'sh' => 'text/x-shellscript', + 'bash' => 'text/x-shellscript', + 'sh-lib' => 'text/x-shellscript', ); -- cgit v1.2.3 From 9b4a827e0bd9dc02fe7f2c9487fed21f50447ea0 Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Wed, 1 Jan 2014 09:52:19 -0800 Subject: don't specify path to 3rdparty directory when registering Pimple autoloader The core 3rdparty directory is in the include_path from lib/base.php anyway, so this is unnecessary, and causes problems for downstream distributors who unbundle Pimple. --- lib/private/appframework/utility/simplecontainer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/appframework/utility/simplecontainer.php b/lib/private/appframework/utility/simplecontainer.php index 7e4db63bde5..e631e657756 100644 --- a/lib/private/appframework/utility/simplecontainer.php +++ b/lib/private/appframework/utility/simplecontainer.php @@ -3,7 +3,7 @@ namespace OC\AppFramework\Utility; // register 3rdparty autoloaders -require_once __DIR__ . '/../../../../3rdparty/Pimple/Pimple.php'; +require_once 'Pimple/Pimple.php'; /** * Class SimpleContainer -- cgit v1.2.3 From 25370fcb8235d2129cab0f8a5843c4784b3673d0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 2 Jan 2014 13:19:10 +0100 Subject: Return SPACE_UNKNOWN if disk_free_space is disabled when getting the free space on a local storage --- lib/private/files/storage/local.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/files/storage/local.php b/lib/private/files/storage/local.php index 02e8df4af4e..db3c6bfca3a 100644 --- a/lib/private/files/storage/local.php +++ b/lib/private/files/storage/local.php @@ -256,7 +256,7 @@ if (\OC_Util::runningOnWindows()) { public function free_space($path) { $space = @disk_free_space($this->datadir . $path); - if ($space === false) { + if ($space === false || is_null($space)) { return \OC\Files\SPACE_UNKNOWN; } return $space; -- cgit v1.2.3 From 83f968ace2822a1e56ccb2804e3513d95b528e5a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 2 Jan 2014 16:12:56 +0100 Subject: Fix APCIterator syntax in \OC\Memcache\APCU::clear see http://www.php.net/manual/en/apciterator.construct.php --- lib/private/memcache/apcu.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/memcache/apcu.php b/lib/private/memcache/apcu.php index ccc1aa6e562..dac0f5f208a 100644 --- a/lib/private/memcache/apcu.php +++ b/lib/private/memcache/apcu.php @@ -12,7 +12,7 @@ class APCu extends APC { public function clear($prefix = '') { $ns = $this->getNamespace() . $prefix; $ns = preg_quote($ns, '/'); - $iter = new \APCIterator('/^'.$ns.'/'); + $iter = new \APCIterator('user', '/^'.$ns.'/'); return apc_delete($iter); } -- cgit v1.2.3 From ed469a7d2c11b92cad4446a596c2b27c2d46362b Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 7 Jan 2014 11:53:33 +0100 Subject: in order to work properly with encryption ocTransferId is added to the file path - questionable usage of magic string --- lib/private/connector/sabre/file.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index d476e9fab14..53524ec9e54 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -64,7 +64,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D } // mark file as partial while uploading (ignored by the scanner) - $partpath = $this->path . rand() . '.part'; + $partpath = $this->path . '.ocTransferId' . rand() . '.part'; // if file is located in /Shared we write the part file to the users // root folder because we can't create new files in /shared -- cgit v1.2.3 From 07a84aa5ebc71c1476f89eb5736754b7a2f74d47 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 7 Jan 2014 14:52:18 +0100 Subject: reuse existing helper function OC_Helper::is_function_enabled --- lib/private/preview/movies.php | 2 +- lib/private/preview/office.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/preview/movies.php b/lib/private/preview/movies.php index ac771deb413..71cd3bae057 100644 --- a/lib/private/preview/movies.php +++ b/lib/private/preview/movies.php @@ -18,7 +18,7 @@ function findBinaryPath($program) { // movie preview is currently not supported on Windows if (!\OC_Util::runningOnWindows()) { - $isExecEnabled = !in_array('exec', explode(', ', ini_get('disable_functions'))); + $isExecEnabled = \OC_Helper::is_function_enabled('exec'); $ffmpegBinary = null; $avconvBinary = null; diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php index 318ab51f851..7a4826c76ec 100644 --- a/lib/private/preview/office.php +++ b/lib/private/preview/office.php @@ -7,7 +7,7 @@ */ //both, libreoffice backend and php fallback, need imagick if (extension_loaded('imagick')) { - $isShellExecEnabled = !in_array('shell_exec', explode(', ', ini_get('disable_functions'))); + $isShellExecEnabled = \OC_Helper::is_function_enabled('shell_exec'); // LibreOffice preview is currently not supported on Windows if (!\OC_Util::runningOnWindows()) { -- cgit v1.2.3 From 9d869ab5968b737531a0f0bb3c648d7ffe920341 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 7 Jan 2014 14:53:02 +0100 Subject: we shall explode on ',' only --- lib/private/helper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/helper.php b/lib/private/helper.php index 4fe3097af26..a06932a11f9 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -858,7 +858,7 @@ class OC_Helper { if (!function_exists($function_name)) { return false; } - $disabled = explode(', ', ini_get('disable_functions')); + $disabled = explode(',', ini_get('disable_functions')); if (in_array($function_name, $disabled)) { return false; } -- cgit v1.2.3 From 9404a8f40c51f57309d3b5a3b5937f869d563573 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Tue, 7 Jan 2014 15:51:08 +0100 Subject: remove duplicate exe mimetype, add correct msi mimetype --- lib/private/mimetypes.list.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 740982910e0..08228336966 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -66,6 +66,7 @@ return array( 'xlsx'=>'application/msexcel', 'php'=>'application/x-php', 'exe'=>'application/x-ms-dos-executable', + 'msi'=>'application/x-msi', 'pl'=>'application/x-pearl', 'py'=>'application/x-python', 'blend'=>'application/x-blender', @@ -97,8 +98,6 @@ return array( 'ai' => 'application/illustrator', 'epub' => 'application/epub+zip', 'mobi' => 'application/x-mobipocket-ebook', - 'exe' => 'application', - 'msi' => 'application', 'md' => 'text/markdown', 'markdown' => 'text/markdown', 'mdown' => 'text/markdown', -- cgit v1.2.3 From 09d7882571e047de4ed907f0f0317dae056cf890 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 7 Jan 2014 19:47:01 +0100 Subject: trimming all array elements --- lib/private/helper.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/helper.php b/lib/private/helper.php index a06932a11f9..1c8d01c141f 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -859,10 +859,12 @@ class OC_Helper { return false; } $disabled = explode(',', ini_get('disable_functions')); + $disabled = array_map('trim', $disabled); if (in_array($function_name, $disabled)) { return false; } - $disabled = explode(', ', ini_get('suhosin.executor.func.blacklist')); + $disabled = explode(',', ini_get('suhosin.executor.func.blacklist')); + $disabled = array_map('trim', $disabled); if (in_array($function_name, $disabled)) { return false; } -- cgit v1.2.3 From 5be4af9f519ef8d0424f8b07ba84c43da9cf11f4 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 7 Jan 2014 17:41:04 +0100 Subject: Now also preventing to override "files" dir size with -1 Fixes #6526 --- lib/private/files/cache/homecache.php | 2 +- tests/lib/files/cache/homecache.php | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'lib/private') diff --git a/lib/private/files/cache/homecache.php b/lib/private/files/cache/homecache.php index 18dfbfe3191..71bb944da71 100644 --- a/lib/private/files/cache/homecache.php +++ b/lib/private/files/cache/homecache.php @@ -16,7 +16,7 @@ class HomeCache extends Cache { * @return int */ public function calculateFolderSize($path) { - if ($path !== '/' and $path !== '') { + if ($path !== '/' and $path !== '' and $path !== 'files') { return parent::calculateFolderSize($path); } diff --git a/tests/lib/files/cache/homecache.php b/tests/lib/files/cache/homecache.php index 2fa7f1ba92e..87fd0dba4c6 100644 --- a/tests/lib/files/cache/homecache.php +++ b/tests/lib/files/cache/homecache.php @@ -62,33 +62,39 @@ class HomeCache extends \PHPUnit_Framework_TestCase { } /** - * Tests that the root folder size calculation ignores the subdirs that have an unknown - * size. This makes sure that quota calculation still works as it's based on the root - * folder size. + * Tests that the root and files folder size calculation ignores the subdirs + * that have an unknown size. This makes sure that quota calculation still + * works as it's based on the "files" folder size. */ public function testRootFolderSizeIgnoresUnknownUpdate() { - $dir1 = 'knownsize'; - $dir2 = 'unknownsize'; + $dir1 = 'files/knownsize'; + $dir2 = 'files/unknownsize'; $fileData = array(); $fileData[''] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); + $fileData['files'] = array('size' => -1, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); $fileData[$dir1] = array('size' => 1000, 'mtime' => 20, 'mimetype' => 'httpd/unix-directory'); $fileData[$dir2] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'httpd/unix-directory'); $this->cache->put('', $fileData['']); + $this->cache->put('files', $fileData['files']); $this->cache->put($dir1, $fileData[$dir1]); $this->cache->put($dir2, $fileData[$dir2]); + $this->assertTrue($this->cache->inCache('files')); $this->assertTrue($this->cache->inCache($dir1)); $this->assertTrue($this->cache->inCache($dir2)); - // check that root size ignored the unknown sizes + // check that files and root size ignored the unknown sizes + $this->assertEquals(1000, $this->cache->calculateFolderSize('files')); $this->assertEquals(1000, $this->cache->calculateFolderSize('')); // clean up $this->cache->remove(''); + $this->cache->remove('files'); $this->cache->remove($dir1); $this->cache->remove($dir2); + $this->assertFalse($this->cache->inCache('files')); $this->assertFalse($this->cache->inCache($dir1)); $this->assertFalse($this->cache->inCache($dir2)); } -- cgit v1.2.3 From 1e1ced777275c70307d26556843938e68ca25fde Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Tue, 7 Jan 2014 23:05:37 +0100 Subject: Introduce user count action to user management --- lib/private/user/backend.php | 16 +++++++++------- lib/private/user/database.php | 15 +++++++++++++++ lib/private/user/manager.php | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+), 7 deletions(-) (limited to 'lib/private') diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index 02c93d13bdf..6969ce4ba34 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -31,13 +31,14 @@ define('OC_USER_BACKEND_NOT_IMPLEMENTED', -501); /** * actions that user backends can define */ -define('OC_USER_BACKEND_CREATE_USER', 0x0000001); -define('OC_USER_BACKEND_SET_PASSWORD', 0x0000010); -define('OC_USER_BACKEND_CHECK_PASSWORD', 0x0000100); -define('OC_USER_BACKEND_GET_HOME', 0x0001000); -define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x0010000); -define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x0100000); -define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x1000000); +define('OC_USER_BACKEND_CREATE_USER', 0x00000001); +define('OC_USER_BACKEND_SET_PASSWORD', 0x00000010); +define('OC_USER_BACKEND_CHECK_PASSWORD', 0x00000100); +define('OC_USER_BACKEND_GET_HOME', 0x00001000); +define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x00010000); +define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x00100000); +define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x01000000); +define('OC_USER_BACKEND_COUNT_USERS', 0x10000000); /** * Abstract base class for user management. Provides methods for querying backend @@ -55,6 +56,7 @@ abstract class OC_User_Backend implements OC_User_Interface { OC_USER_BACKEND_GET_DISPLAYNAME => 'getDisplayName', OC_USER_BACKEND_SET_DISPLAYNAME => 'setDisplayName', OC_USER_BACKEND_PROVIDE_AVATAR => 'canChangeAvatar', + OC_USER_BACKEND_COUNT_USERS => 'countUsers', ); /** diff --git a/lib/private/user/database.php b/lib/private/user/database.php index c99db3b27ca..1a63755b980 100644 --- a/lib/private/user/database.php +++ b/lib/private/user/database.php @@ -253,4 +253,19 @@ class OC_User_Database extends OC_User_Backend { return true; } + /** + * counts the users in the database + * + * @return int | bool + */ + public function countUsers() { + $query = OC_DB::prepare('SELECT COUNT(*) FROM `*PREFIX*users`'); + $result = $query->execute(); + if (OC_DB::isError($result)) { + OC_Log::write('core', OC_DB::getErrorMessage($result), OC_Log::ERROR); + return false; + } + return $result->fetchOne(); + } + } diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index cf83a75ba25..101b388f1e0 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -270,4 +270,22 @@ class Manager extends PublicEmitter { } return false; } + + /** + * returns how many users per backend exist (if supported by backend) + * + * @return array with backend class as key and count number as value + */ + public function countUsers() { + $userCountStatistics = array(); + foreach ($this->backends as $backend) { + if ($backend->implementsActions(\OC_USER_BACKEND_COUNT_USERS)) { + $backendusers = $backend->countUsers(); + if($backendusers !== false) { + $userCountStatistics[get_class($backend)] = $backendusers; + } + } + } + return $userCountStatistics; + } } -- cgit v1.2.3 From 5eef107344bbb3fc4a93675f6d3b63fc82ba930a Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 8 Jan 2014 07:56:08 +0100 Subject: turn off mod_pagespeed --- .htaccess | 3 +++ lib/private/setup.php | 3 +++ 2 files changed, 6 insertions(+) (limited to 'lib/private') diff --git a/.htaccess b/.htaccess index 08e2a82facb..fa6263c7ffe 100755 --- a/.htaccess +++ b/.htaccess @@ -38,3 +38,6 @@ DirectoryIndex index.php index.html AddDefaultCharset utf-8 Options -Indexes + + ModPagespeed Off + diff --git a/lib/private/setup.php b/lib/private/setup.php index b5c530a091f..5232398d1d7 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -159,6 +159,9 @@ class OC_Setup { $content.= "\n"; $content.= "AddDefaultCharset utf-8\n"; $content.= "Options -Indexes\n"; + $content.= "\n"; + $content.= "ModPagespeed Off\n"; + $content.= "\n"; @file_put_contents(OC::$SERVERROOT.'/.htaccess', $content); //supress errors in case we don't have permissions for it self::protectDataDirectory(); -- cgit v1.2.3 From f642ad39614970de67358d80517bc1d76a006e0e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 8 Jan 2014 13:17:36 +0100 Subject: Prevent deleting storage root Storage mount points are not deletable, so make sure that the unlink operation and its hooks aren't run in such cases. Note that some storages might recursively delete their contents when calling unlink on their root. This fix prevents that as well. --- lib/private/files/view.php | 13 +++++++++++++ tests/lib/files/view.php | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) (limited to 'lib/private') diff --git a/lib/private/files/view.php b/lib/private/files/view.php index ac45a881331..8893911ed5d 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -336,6 +336,19 @@ class View { } public function unlink($path) { + if ($path === '' || $path === '/') { + // do not allow deleting the root + return false; + } + $postFix = (substr($path, -1, 1) === '/') ? '/' : ''; + $absolutePath = Filesystem::normalizePath($this->getAbsolutePath($path)); + list($storage, $internalPath) = Filesystem::resolvePath($absolutePath . $postFix); + if (!$internalPath || $internalPath === '' || $internalPath === '/') { + // do not allow deleting the storage's root / the mount point + // because for some storages it might delete the whole contents + // but isn't supposed to work that way + return false; + } return $this->basicOperation('unlink', $path, array('delete')); } diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index b59cef9f0da..76a7fd5f1ca 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -306,6 +306,48 @@ class View extends \PHPUnit_Framework_TestCase { $this->assertTrue($rootView->file_exists('anotherfolder/bar.txt')); } + /** + * @medium + */ + function testUnlink() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->file_put_contents('/foo.txt', 'asd'); + $rootView->file_put_contents('/substorage/bar.txt', 'asd'); + + $this->assertTrue($rootView->file_exists('foo.txt')); + $this->assertTrue($rootView->file_exists('substorage/bar.txt')); + + $this->assertTrue($rootView->unlink('foo.txt')); + $this->assertTrue($rootView->unlink('substorage/bar.txt')); + + $this->assertFalse($rootView->file_exists('foo.txt')); + $this->assertFalse($rootView->file_exists('substorage/bar.txt')); + } + + /** + * @medium + */ + function testUnlinkRootMustFail() { + $storage1 = $this->getTestStorage(); + $storage2 = $this->getTestStorage(); + \OC\Files\Filesystem::mount($storage1, array(), '/'); + \OC\Files\Filesystem::mount($storage2, array(), '/substorage'); + + $rootView = new \OC\Files\View(''); + $rootView->file_put_contents('/foo.txt', 'asd'); + $rootView->file_put_contents('/substorage/bar.txt', 'asd'); + + $this->assertFalse($rootView->unlink('')); + $this->assertFalse($rootView->unlink('/')); + $this->assertFalse($rootView->unlink('substorage')); + $this->assertFalse($rootView->unlink('/substorage')); + } + /** * @medium */ -- cgit v1.2.3 From cb6a3e2617c6549d4a305f3612bef8aa5840306e Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 13:24:28 +0100 Subject: if backends have the same class name, sum their users up instead of overwriting --- lib/private/user/manager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/user/manager.php b/lib/private/user/manager.php index 101b388f1e0..90970ef9963 100644 --- a/lib/private/user/manager.php +++ b/lib/private/user/manager.php @@ -282,7 +282,11 @@ class Manager extends PublicEmitter { if ($backend->implementsActions(\OC_USER_BACKEND_COUNT_USERS)) { $backendusers = $backend->countUsers(); if($backendusers !== false) { - $userCountStatistics[get_class($backend)] = $backendusers; + if(isset($userCountStatistics[get_class($backend)])) { + $userCountStatistics[get_class($backend)] += $backendusers; + } else { + $userCountStatistics[get_class($backend)] = $backendusers; + } } } } -- cgit v1.2.3 From d7cb5ab080e2b3abe804ffe974ebb65398914943 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 13:26:48 +0100 Subject: add tests for user counting --- lib/private/user/dummy.php | 9 ++++++ tests/lib/user/manager.php | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) (limited to 'lib/private') diff --git a/lib/private/user/dummy.php b/lib/private/user/dummy.php index 52be7edfa75..fc15a630cf3 100644 --- a/lib/private/user/dummy.php +++ b/lib/private/user/dummy.php @@ -123,4 +123,13 @@ class OC_User_Dummy extends OC_User_Backend { public function hasUserListings() { return true; } + + /** + * counts the users in the database + * + * @return int | bool + */ + public function countUsers() { + return 0; + } } diff --git a/tests/lib/user/manager.php b/tests/lib/user/manager.php index 00901dd4115..ad1ac9e12f2 100644 --- a/tests/lib/user/manager.php +++ b/tests/lib/user/manager.php @@ -346,4 +346,76 @@ class Manager extends \PHPUnit_Framework_TestCase { $manager->createUser('foo', 'bar'); } + + public function testCountUsersNoBackend() { + $manager = new \OC\User\Manager(); + + $result = $manager->countUsers(); + $this->assertTrue(is_array($result)); + $this->assertTrue(empty($result)); + } + + public function testCountUsersOneBackend() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend = $this->getMock('\OC_User_Dummy'); + $backend->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(7)); + + $backend->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend); + + $result = $manager->countUsers(); + $keys = array_keys($result); + $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + + $users = array_shift($result); + $this->assertEquals(7, $users); + } + + public function testCountUsersTwoBackends() { + /** + * @var \OC_User_Dummy | \PHPUnit_Framework_MockObject_MockObject $backend + */ + $backend1 = $this->getMock('\OC_User_Dummy'); + $backend1->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(7)); + + $backend1->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $backend2 = $this->getMock('\OC_User_Dummy'); + $backend2->expects($this->once()) + ->method('countUsers') + ->will($this->returnValue(16)); + + $backend2->expects($this->once()) + ->method('implementsActions') + ->with(\OC_USER_BACKEND_COUNT_USERS) + ->will($this->returnValue(true)); + + $manager = new \OC\User\Manager(); + $manager->registerBackend($backend1); + $manager->registerBackend($backend2); + + $result = $manager->countUsers(); + //because the backends have the same class name, only one value expected + $this->assertEquals(1, count($result)); + $keys = array_keys($result); + $this->assertTrue(strpos($keys[0], 'Mock_OC_User_Dummy') !== false); + + $users = array_shift($result); + //users from backends shall be summed up + $this->assertEquals(7+16, $users); + } } -- cgit v1.2.3 From e35bca1c266cbe1468da9b4a328e2521d00c30f2 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 8 Jan 2014 16:07:01 +0100 Subject: Fix ownCloud for php5.3.x --- lib/private/server.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/server.php b/lib/private/server.php index 5977ee9b5a0..2cbd37a97d7 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -128,7 +128,8 @@ class Server extends SimpleContainer implements IServerContainer { return new \OC\L10N\Factory(); }); $this->registerService('URLGenerator', function($c) { - $config = $this->getConfig(); + /** @var $c SimpleContainer */ + $config = $c->query('AllConfig'); return new \OC\URLGenerator($config); }); $this->registerService('AppHelper', function($c) { -- cgit v1.2.3 From 8eaa39f4e2fb7bb1036aca5727db320de00960e2 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 8 Jan 2014 18:43:20 +0100 Subject: Removed special handling of part files in shared storage rename This fixes the issue introduced by the transfer id which itself wasn't taken into account by the shortcut code for part file in the shared storage class. --- apps/files_sharing/lib/sharedstorage.php | 33 ++++++++++++-------------------- lib/private/connector/sabre/file.php | 5 ++++- 2 files changed, 16 insertions(+), 22 deletions(-) (limited to 'lib/private') diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 3116cd717fb..6b4db9763f5 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -293,29 +293,20 @@ class Shared extends \OC\Files\Storage\Common { } public function rename($path1, $path2) { - // Check for partial files - if (pathinfo($path1, PATHINFO_EXTENSION) === 'part') { - if ($oldSource = $this->getSourcePath($path1)) { + // Renaming/moving is only allowed within shared folders + $pos1 = strpos($path1, '/', 1); + $pos2 = strpos($path2, '/', 1); + if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { + $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); + // Within the same folder, we only need UPDATE permissions + if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) { list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - $newInternalPath = substr($oldInternalPath, 0, -5); + list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); return $storage->rename($oldInternalPath, $newInternalPath); - } - } else { - // Renaming/moving is only allowed within shared folders - $pos1 = strpos($path1, '/', 1); - $pos2 = strpos($path2, '/', 1); - if ($pos1 !== false && $pos2 !== false && ($oldSource = $this->getSourcePath($path1))) { - $newSource = $this->getSourcePath(dirname($path2)) . '/' . basename($path2); - // Within the same folder, we only need UPDATE permissions - if (dirname($path1) == dirname($path2) and $this->isUpdatable($path1)) { - list($storage, $oldInternalPath) = \OC\Files\Filesystem::resolvePath($oldSource); - list(, $newInternalPath) = \OC\Files\Filesystem::resolvePath($newSource); - return $storage->rename($oldInternalPath, $newInternalPath); - // otherwise DELETE and CREATE permissions required - } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { - $rootView = new \OC\Files\View(''); - return $rootView->rename($oldSource, $newSource); - } + // otherwise DELETE and CREATE permissions required + } elseif ($this->isDeletable($path1) && $this->isCreatable(dirname($path2))) { + $rootView = new \OC\Files\View(''); + return $rootView->rename($oldSource, $newSource); } } return false; diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index 53524ec9e54..c3b59007295 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -242,7 +242,10 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D $fileExists = $fs->file_exists($targetPath); if ($renameOkay === false || $fileExists === false) { \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR); - $fs->unlink($targetPath); + // only delete if an error occurred and the target file was already created + if ($fileExists) { + $fs->unlink($targetPath); + } throw new Sabre_DAV_Exception(); } -- cgit v1.2.3 From 4585b4ea3f1fd21aabc167102e74a382dfa0cbd8 Mon Sep 17 00:00:00 2001 From: Arthur Schiwon Date: Wed, 8 Jan 2014 19:41:10 +0100 Subject: Infowarning about 32bit --- lib/private/user/backend.php | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/private') diff --git a/lib/private/user/backend.php b/lib/private/user/backend.php index 6969ce4ba34..f4e5618e04a 100644 --- a/lib/private/user/backend.php +++ b/lib/private/user/backend.php @@ -39,6 +39,7 @@ define('OC_USER_BACKEND_GET_DISPLAYNAME', 0x00010000); define('OC_USER_BACKEND_SET_DISPLAYNAME', 0x00100000); define('OC_USER_BACKEND_PROVIDE_AVATAR', 0x01000000); define('OC_USER_BACKEND_COUNT_USERS', 0x10000000); +//more actions cannot be defined without breaking 32bit platforms! /** * Abstract base class for user management. Provides methods for querying backend -- cgit v1.2.3 From 9b7c3a5c66a9f987ff572aaece2ef6e895bf4ab6 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Thu, 9 Jan 2014 10:27:47 +0100 Subject: fixing PHPDoc and use cameCase names --- lib/private/user/session.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'lib/private') diff --git a/lib/private/user/session.php b/lib/private/user/session.php index c2885d00413..1e299416fb3 100644 --- a/lib/private/user/session.php +++ b/lib/private/user/session.php @@ -115,13 +115,13 @@ class Session implements Emitter, \OCP\IUserSession { /** * set the login name * - * @param string login name for the logged in user + * @param string $loginName for the logged in user */ - public function setLoginname($loginname) { - if (is_null($loginname)) { + public function setLoginName($loginName) { + if (is_null($loginName)) { $this->session->remove('loginname'); } else { - $this->session->set('loginname', $loginname); + $this->session->set('loginname', $loginName); } } @@ -130,7 +130,7 @@ class Session implements Emitter, \OCP\IUserSession { * * @return string */ - public function getLoginname() { + public function getLoginName() { if ($this->activeUser) { return $this->session->get('loginname'); } else { @@ -158,7 +158,7 @@ class Session implements Emitter, \OCP\IUserSession { if (!is_null($user)) { if ($user->isEnabled()) { $this->setUser($user); - $this->setLoginname($uid); + $this->setLoginName($uid); $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); return true; } else { @@ -176,7 +176,7 @@ class Session implements Emitter, \OCP\IUserSession { public function logout() { $this->manager->emit('\OC\User', 'logout'); $this->setUser(null); - $this->setLoginname(null); + $this->setLoginName(null); $this->unsetMagicInCookie(); } -- cgit v1.2.3 From 22bd69f75cc91a79653038d20143aff9ee8b226a Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Thu, 9 Jan 2014 10:28:24 +0100 Subject: set login name within apache auth backend --- lib/private/user.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/private') diff --git a/lib/private/user.php b/lib/private/user.php index e0d6b9f3f51..98ebebbe5c1 100644 --- a/lib/private/user.php +++ b/lib/private/user.php @@ -246,6 +246,8 @@ class OC_User { session_regenerate_id(true); self::setUserId($uid); self::setDisplayName($uid); + self::getUserSession()->setLoginName($uid); + OC_Hook::emit( "OC_User", "post_login", array( "uid" => $uid, 'password'=>'' )); return true; } -- cgit v1.2.3 From 4faba49f0a38427e96ef8393900f799c5a5ba6aa Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 9 Jan 2014 17:27:55 +0100 Subject: Fix calculated folder size to use unencrypted size The encrypted size was used when calculating folder sizes. This fix now also sums up the unencrypted size and shows that one when available. --- lib/private/files/cache/cache.php | 22 ++++++++++++++----- tests/lib/files/cache/cache.php | 45 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php index 8e682a96b75..1e7936ca26d 100644 --- a/lib/private/files/cache/cache.php +++ b/lib/private/files/cache/cache.php @@ -178,7 +178,7 @@ class Cache { if ($file['storage_mtime'] == 0) { $file['storage_mtime'] = $file['mtime']; } - if ($file['encrypted']) { + if ($file['encrypted'] or ($file['unencrypted_size'] > 0 and $file['mimetype'] === 'httpd/unix-directory')) { $file['encrypted_size'] = $file['size']; $file['size'] = $file['unencrypted_size']; } @@ -511,22 +511,34 @@ class Cache { $entry = $this->get($path); if ($entry && $entry['mimetype'] === 'httpd/unix-directory') { $id = $entry['fileid']; - $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2 FROM `*PREFIX*filecache` '. + $sql = 'SELECT SUM(`size`) AS f1, MIN(`size`) AS f2, ' . + 'SUM(`unencrypted_size`) AS f3 ' . + 'FROM `*PREFIX*filecache` ' . 'WHERE `parent` = ? AND `storage` = ?'; $result = \OC_DB::executeAudited($sql, array($id, $this->getNumericStorageId())); if ($row = $result->fetchRow()) { - list($sum, $min) = array_values($row); + list($sum, $min, $unencryptedSum) = array_values($row); $sum = (int)$sum; $min = (int)$min; + $unencryptedSum = (int)$unencryptedSum; if ($min === -1) { $totalSize = $min; } else { $totalSize = $sum; } + $update = array(); if ($entry['size'] !== $totalSize) { - $this->update($id, array('size' => $totalSize)); + $update['size'] = $totalSize; + } + if ($entry['unencrypted_size'] !== $unencryptedSum) { + $update['unencrypted_size'] = $unencryptedSum; + } + if (count($update) > 0) { + $this->update($id, $update); + } + if ($totalSize !== -1 and $unencryptedSum > 0) { + $totalSize = $unencryptedSum; } - } } return $totalSize; diff --git a/tests/lib/files/cache/cache.php b/tests/lib/files/cache/cache.php index 052d70dd0b4..7d9329328a3 100644 --- a/tests/lib/files/cache/cache.php +++ b/tests/lib/files/cache/cache.php @@ -137,6 +137,51 @@ class Cache extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->cache->inCache('folder/bar')); } + public function testEncryptedFolder() { + $file1 = 'folder'; + $file2 = 'folder/bar'; + $file3 = 'folder/foo'; + $data1 = array('size' => 100, 'mtime' => 50, 'mimetype' => 'httpd/unix-directory'); + $fileData = array(); + $fileData['bar'] = array('size' => 1000, 'unencrypted_size' => 900, 'encrypted' => 1, 'mtime' => 20, 'mimetype' => 'foo/file'); + $fileData['foo'] = array('size' => 20, 'unencrypted_size' => 16, 'encrypted' => 1, 'mtime' => 25, 'mimetype' => 'foo/file'); + + $this->cache->put($file1, $data1); + $this->cache->put($file2, $fileData['bar']); + $this->cache->put($file3, $fileData['foo']); + + $content = $this->cache->getFolderContents($file1); + $this->assertEquals(count($content), 2); + foreach ($content as $cachedData) { + $data = $fileData[$cachedData['name']]; + // indirect retrieval swaps unencrypted_size and size + $this->assertEquals($data['unencrypted_size'], $cachedData['size']); + } + + $file4 = 'folder/unkownSize'; + $fileData['unkownSize'] = array('size' => -1, 'mtime' => 25, 'mimetype' => 'foo/file'); + $this->cache->put($file4, $fileData['unkownSize']); + + $this->assertEquals(-1, $this->cache->calculateFolderSize($file1)); + + $fileData['unkownSize'] = array('size' => 5, 'mtime' => 25, 'mimetype' => 'foo/file'); + $this->cache->put($file4, $fileData['unkownSize']); + + $this->assertEquals(916, $this->cache->calculateFolderSize($file1)); + // direct cache entry retrieval returns the original values + $this->assertEquals(1025, $this->cache->get($file1)['size']); + $this->assertEquals(916, $this->cache->get($file1)['unencrypted_size']); + + $this->cache->remove($file2); + $this->cache->remove($file3); + $this->cache->remove($file4); + $this->assertEquals(0, $this->cache->calculateFolderSize($file1)); + + $this->cache->remove('folder'); + $this->assertFalse($this->cache->inCache('folder/foo')); + $this->assertFalse($this->cache->inCache('folder/bar')); + } + public function testRootFolderSizeForNonHomeStorage() { $dir1 = 'knownsize'; $dir2 = 'unknownsize'; -- cgit v1.2.3 From 2abea964625713180d811e4fd1cfd25a92ee2c88 Mon Sep 17 00:00:00 2001 From: Joan Date: Fri, 10 Jan 2014 09:33:35 +0100 Subject: Disabled internet checking as mentioned when in proxy mode --- lib/private/util.php | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib/private') diff --git a/lib/private/util.php b/lib/private/util.php index c0e618cc863..9b37dccb507 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -892,6 +892,11 @@ class OC_Util { return false; } + // in case the connection is via proxy return true to avoid connecting to owncloud.org + if(OC_Config::getValue('proxy', '') != '') { + return true; + } + // try to connect to owncloud.org to see if http connections to the internet are possible. $connected = @fsockopen("www.owncloud.org", 80); if ($connected) { -- cgit v1.2.3 From a2cae551f30a0166439af9d467134d4bd802e940 Mon Sep 17 00:00:00 2001 From: st3so Date: Sun, 12 Jan 2014 15:45:33 +0100 Subject: fixing typo in redirection query string --- lib/private/util.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/util.php b/lib/private/util.php index c0e618cc863..a4b3761dbd3 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -580,7 +580,7 @@ class OC_Util { // Check if we are a user if( !OC_User::isLoggedIn()) { header( 'Location: '.OC_Helper::linkToAbsolute( '', 'index.php', - array('redirectUrl' => OC_Request::requestUri()) + array('redirect_url' => OC_Request::requestUri()) )); exit(); } -- cgit v1.2.3 From 68458604703eab0283dc9e4c2c8b3dd1f97aaaef Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Mon, 13 Jan 2014 12:27:05 +0100 Subject: keep response message --- lib/private/api.php | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'lib/private') diff --git a/lib/private/api.php b/lib/private/api.php index 03d7b7382a5..c713368125c 100644 --- a/lib/private/api.php +++ b/lib/private/api.php @@ -33,7 +33,7 @@ class OC_API { const USER_AUTH = 1; const SUBADMIN_AUTH = 2; const ADMIN_AUTH = 3; - + /** * API Response Codes */ @@ -41,13 +41,13 @@ class OC_API { const RESPOND_SERVER_ERROR = 996; const RESPOND_NOT_FOUND = 998; const RESPOND_UNKNOWN_ERROR = 999; - + /** * api actions */ protected static $actions = array(); private static $logoutRequired = false; - + /** * registers an api call * @param string $method the http method @@ -58,7 +58,7 @@ class OC_API { * @param array $defaults * @param array $requirements */ - public static function register($method, $url, $action, $app, + public static function register($method, $url, $action, $app, $authLevel = OC_API::USER_AUTH, $defaults = array(), $requirements = array()) { @@ -75,7 +75,7 @@ class OC_API { } self::$actions[$name][] = array('app' => $app, 'action' => $action, 'authlevel' => $authLevel); } - + /** * handles an api call * @param array $parameters @@ -125,7 +125,7 @@ class OC_API { self::respond($response, $format); } - + /** * merge the returned result objects into one response * @param array $responses @@ -166,32 +166,31 @@ class OC_API { // Maybe any that are not OC_API::RESPOND_SERVER_ERROR // Merge failed responses if more than one $data = array(); - $meta = array(); foreach($shipped['failed'] as $failure) { $data = array_merge_recursive($data, $failure['response']->getData()); } $picked = reset($shipped['failed']); $code = $picked['response']->getStatusCode(); - $response = new OC_OCS_Result($data, $code); + $meta = $picked['response']->getMeta(); + $response = new OC_OCS_Result($data, $code, $meta['message']); return $response; } elseif(!empty($shipped['succeeded'])) { $responses = array_merge($shipped['succeeded'], $thirdparty['succeeded']); } elseif(!empty($thirdparty['failed'])) { // Merge failed responses if more than one $data = array(); - $meta = array(); foreach($thirdparty['failed'] as $failure) { $data = array_merge_recursive($data, $failure['response']->getData()); } $picked = reset($thirdparty['failed']); $code = $picked['response']->getStatusCode(); - $response = new OC_OCS_Result($data, $code); + $meta = $picked['response']->getMeta(); + $response = new OC_OCS_Result($data, $code, $meta['message']); return $response; } else { $responses = $thirdparty['succeeded']; } // Merge the successful responses - $meta = array(); $data = array(); foreach($responses as $app => $response) { @@ -200,22 +199,25 @@ class OC_API { } else { $data = array_merge_recursive($data, $response['response']->getData()); } - $codes[] = $response['response']->getStatusCode(); + $codes[] = array('code' => $response['response']->getStatusCode(), + 'meta' => $response['response']->getMeta()); } // Use any non 100 status codes $statusCode = 100; + $statusMessage = null; foreach($codes as $code) { - if($code != 100) { - $statusCode = $code; + if($code['code'] != 100) { + $statusCode = $code['code']; + $statusMessage = $code['meta']['message']; break; } } - $result = new OC_OCS_Result($data, $statusCode); + $result = new OC_OCS_Result($data, $statusCode, $statusMessage); return $result; } - + /** * authenticate the api call * @param array $action the action details as supplied to OC_API::register() @@ -261,8 +263,8 @@ class OC_API { return false; break; } - } - + } + /** * http basic auth * @return string|false (username, or false on failure) @@ -294,7 +296,7 @@ class OC_API { return false; } - + /** * respond to a call * @param OC_OCS_Result $result @@ -343,5 +345,5 @@ class OC_API { } } } - + } -- cgit v1.2.3 From 203d5d01cabae52373f556d50f2bb541560eb4b0 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Jan 2014 13:54:07 +0100 Subject: Use storage_mtime when determining if we can reuse cached data while scanning --- lib/private/files/cache/scanner.php | 2 +- tests/lib/files/cache/updater.php | 2 +- tests/lib/files/etagtest.php | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php index a8c069ee99f..92a4c01841b 100644 --- a/lib/private/files/cache/scanner.php +++ b/lib/private/files/cache/scanner.php @@ -122,7 +122,7 @@ class Scanner extends BasicEmitter { $propagateETagChange = true; } // only reuse data if the file hasn't explicitly changed - if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) { + if (isset($data['storage_mtime']) && isset($cacheData['storage_mtime']) && $data['storage_mtime'] === $cacheData['storage_mtime']) { if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) { $data['size'] = $cacheData['size']; } diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php index 91e384e12af..ba103cee675 100644 --- a/tests/lib/files/cache/updater.php +++ b/tests/lib/files/cache/updater.php @@ -88,7 +88,7 @@ class Updater extends \PHPUnit_Framework_TestCase { public function testWrite() { $textSize = strlen("dummy file data\n"); $imageSize = filesize(\OC::$SERVERROOT . '/core/img/logo.png'); - $this->cache->put('foo.txt', array('mtime' => 100)); + $this->cache->put('foo.txt', array('mtime' => 100, 'storage_mtime' => 100)); $rootCachedData = $this->cache->get(''); $this->assertEquals(3 * $textSize + $imageSize, $rootCachedData['size']); diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php index 6c41413c4df..14003896d66 100644 --- a/tests/lib/files/etagtest.php +++ b/tests/lib/files/etagtest.php @@ -11,6 +11,12 @@ namespace Test\Files; use OC\Files\Filesystem; use OCP\Share; +class TemporaryNoTouch extends \OC\Files\Storage\Temporary { + public function touch($path, $mtime = null) { + return false; + } +} + class EtagTest extends \PHPUnit_Framework_TestCase { private $datadir; @@ -68,6 +74,23 @@ class EtagTest extends \PHPUnit_Framework_TestCase { $this->assertEquals($originalEtags, $this->getEtags($files)); } + public function testTouchNotSupported() { + $storage = new TemporaryNoTouch(array()); + $scanner = $storage->getScanner(); + Filesystem::mount($storage, array(), '/test/'); + $past = time() - 100; + $storage->file_put_contents('test', 'foobar'); + $scanner->scan(''); + $view = new \OC\Files\View(''); + $info = $view->getFileInfo('/test/test'); + + $view->touch('/test/test', $past); + $scanner->scanFile('test', \OC\Files\Cache\Scanner::REUSE_ETAG); + + $info2 = $view->getFileInfo('/test/test'); + $this->assertEquals($info['etag'], $info2['etag']); + } + private function getEtags($files) { $etags = array(); foreach ($files as $file) { -- cgit v1.2.3 From 7f68497b39db9528975862a091effe03fc802f91 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Wed, 15 Jan 2014 17:11:29 +0100 Subject: error handling in case a requested app doesn't exists --- lib/private/installer.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'lib/private') diff --git a/lib/private/installer.php b/lib/private/installer.php index 8375b231e9b..835b6b4c01a 100644 --- a/lib/private/installer.php +++ b/lib/private/installer.php @@ -407,6 +407,9 @@ class OC_Installer{ include OC_App::getAppPath($app)."/appinfo/install.php"; } $info=OC_App::getAppInfo($app); + if (is_null($info)) { + return false; + } OC_Appconfig::setValue($app, 'installed_version', OC_App::getAppVersion($app)); //set remote/public handelers -- cgit v1.2.3 From 6b4c3df0876a4786bbde406349746600c87e1e6b Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 17 Jan 2014 14:40:48 +0100 Subject: Load a separate config (if present) when running unit tests --- lib/base.php | 14 ++++++++++++-- lib/private/config.php | 2 +- lib/private/legacy/config.php | 1 - lib/private/util.php | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/lib/base.php b/lib/base.php index f30575c7b12..d320f6f2411 100644 --- a/lib/base.php +++ b/lib/base.php @@ -57,6 +57,9 @@ class OC { * web path in 'url' */ public static $APPSROOTS = array(); + + public static $configDir; + /* * requested app */ @@ -100,6 +103,13 @@ class OC { get_include_path() ); + if(defined('PHPUNIT_RUN') and PHPUNIT_RUN and is_dir(OC::$SERVERROOT . '/test_config/')) { + self::$configDir = OC::$SERVERROOT . '/test_config/'; + } else { + self::$configDir = OC::$SERVERROOT . '/config/'; + } + OC_Config::$object = new \OC\Config(self::$configDir); + OC::$SUBURI = str_replace("\\", "/", substr(realpath($_SERVER["SCRIPT_FILENAME"]), strlen(OC::$SERVERROOT))); $scriptName = OC_Request::scriptName(); if (substr($scriptName, -1) == '/') { @@ -175,8 +185,8 @@ class OC { } public static function checkConfig() { - if (file_exists(OC::$SERVERROOT . "/config/config.php") - and !is_writable(OC::$SERVERROOT . "/config/config.php") + if (file_exists(self::$configDir . "/config.php") + and !is_writable(self::$configDir . "/config.php") ) { $defaults = new OC_Defaults(); if (self::$CLI) { diff --git a/lib/private/config.php b/lib/private/config.php index caf7b1d7066..8a9d5ca6158 100644 --- a/lib/private/config.php +++ b/lib/private/config.php @@ -50,7 +50,7 @@ class Config { protected $debugMode; /** - * @param $configDir path to the config dir, needs to end with '/' + * @param string $configDir path to the config dir, needs to end with '/' */ public function __construct($configDir) { $this->configDir = $configDir; diff --git a/lib/private/legacy/config.php b/lib/private/legacy/config.php index c457979113e..ab67c8d3020 100644 --- a/lib/private/legacy/config.php +++ b/lib/private/legacy/config.php @@ -38,7 +38,6 @@ * This class is responsible for reading and writing config.php, the very basic * configuration file of ownCloud. */ -OC_Config::$object = new \OC\Config(OC::$SERVERROOT.'/config/'); class OC_Config { /** diff --git a/lib/private/util.php b/lib/private/util.php index a4b3761dbd3..be8b5439543 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -312,7 +312,7 @@ class OC_Util { .'" target="_blank">giving the webserver write access to the root directory
    .'; // Check if config folder is writable. - if(!is_writable(OC::$SERVERROOT."/config/") or !is_readable(OC::$SERVERROOT."/config/")) { + if(!is_writable(OC::$configDir) or !is_readable(OC::$configDir)) { $errors[] = array( 'error' => "Can't write into config directory", 'hint' => 'This can usually be fixed by ' -- cgit v1.2.3 From bf0471a92ed4fca8fe3344839acd83d6918cf566 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Fri, 17 Jan 2014 14:05:39 +0100 Subject: show link to app documentation --- lib/private/app.php | 4 ++++ settings/css/settings.css | 6 ++++++ settings/js/apps.js | 20 +++++++++++++++++++- settings/templates/apps.php | 5 +++++ 4 files changed, 34 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/app.php b/lib/private/app.php index 34c00e97fb9..0c60557914a 100644 --- a/lib/private/app.php +++ b/lib/private/app.php @@ -555,6 +555,10 @@ class OC_App{ }elseif($child->getName()=='description') { $xml=(string)$child->asXML(); $data[$child->getName()]=substr($xml, 13, -14);//script tags + }elseif($child->getName()=='documentation') { + foreach($child as $subchild) { + $data["documentation"][$subchild->getName()] = (string)$subchild; + } }else{ $data[$child->getName()]=(string)$child; } diff --git a/settings/css/settings.css b/settings/css/settings.css index a93c675d466..8a96885b789 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -131,6 +131,12 @@ span.version { margin-left:1em; margin-right:1em; color:#555; } .appslink { text-decoration: underline; } .score { color:#666; font-weight:bold; font-size:0.8em; } +.appinfo .documentation { + margin-top: 1em; + margin-bottom: 1em; +} + + /* LOG */ #log { white-space:normal; } #lessLog { display:none; } diff --git a/settings/js/apps.js b/settings/js/apps.js index a55c55e24cf..1d05d01e1f2 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -37,6 +37,24 @@ OC.Settings.Apps = OC.Settings.Apps || { } page.find('span.licence').text(appLicense); + var userDocumentation = false; + var adminDocumentation = false; + if (typeof(app.documentation.user) !== 'undefined') { + userDocumentation = true; + page.find('span.userDocumentation').html("" + t('settings', 'User Documentation') + ""); + page.find('p.documentation').show(); + } + if (typeof(app.documentation.admin) !== 'undefined') { + adminDocumentation = true; + page.find('span.adminDocumentation').html("" + t('settings', 'Admin Documentation') + ""); + page.find('p.documentation').show(); + } + + if(userDocumentation && adminDocumentation) { + page.find('span.userDocumentation').after(', '); + } + + if (app.update !== false) { page.find('input.update').show(); page.find('input.update').data('appid', app.id); @@ -110,7 +128,7 @@ OC.Settings.Apps = OC.Settings.Apps || { element.val(t('settings','Disable')); } },'json') - .fail(function() { + .fail(function() { OC.Settings.Apps.showErrorMessage(t('settings', 'Error while enabling app')); appitem.data('errormsg', t('settings', 'Error while enabling app')); appitem.data('active',false); diff --git a/settings/templates/apps.php b/settings/templates/apps.php index 0b76f775fea..ce48ef77d12 100644 --- a/settings/templates/apps.php +++ b/settings/templates/apps.php @@ -34,6 +34,11 @@ class="version">

    + -- cgit v1.2.3 From 1af7dab5358d7fd495e4382037c6e2528e2b76d5 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Sun, 19 Jan 2014 18:49:51 +0100 Subject: Fixed quota wrapper to not wrap failed fopen streams When calling fopen() on some storage types, these return false instead of throwing an exception. This fix makes sure that in case the stream wasn't opened (for example when a file doesn't exist any more) the stream isn't wrapped. Also added 'rb' as another case that doesn't need to be wrapped. Fixes #6832 --- lib/private/files/storage/wrapper/quota.php | 2 +- tests/lib/files/storage/wrapper/quota.php | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/files/storage/wrapper/quota.php b/lib/private/files/storage/wrapper/quota.php index 43016e0892f..a430e3e4617 100644 --- a/lib/private/files/storage/wrapper/quota.php +++ b/lib/private/files/storage/wrapper/quota.php @@ -95,7 +95,7 @@ class Quota extends Wrapper { public function fopen($path, $mode) { $source = $this->storage->fopen($path, $mode); $free = $this->free_space(''); - if ($free >= 0 && $mode !== 'r') { + if ($source && $free >= 0 && $mode !== 'r' && $mode !== 'rb') { return \OC\Files\Stream\Quota::wrap($source, $free); } else { return $source; diff --git a/tests/lib/files/storage/wrapper/quota.php b/tests/lib/files/storage/wrapper/quota.php index 9b14335782f..87bafb64d41 100644 --- a/tests/lib/files/storage/wrapper/quota.php +++ b/tests/lib/files/storage/wrapper/quota.php @@ -59,6 +59,20 @@ class Quota extends \Test\Files\Storage\Storage { $this->assertEquals('foobarqwe', $instance->file_get_contents('foo')); } + public function testReturnFalseWhenFopenFailed(){ + $failStorage = $this->getMock( + '\OC\Files\Storage\Local', + array('fopen'), + array(array('datadir' => $this->tmpDir))); + $failStorage->expects($this->any()) + ->method('fopen') + ->will($this->returnValue(false)); + + $instance = new \OC\Files\Storage\Wrapper\Quota(array('storage' => $failStorage, 'quota' => 1000)); + + $this->assertFalse($instance->fopen('failedfopen', 'r')); + } + public function testReturnRegularStreamOnRead(){ $instance = $this->getLimitedStorage(9); @@ -71,6 +85,11 @@ class Quota extends \Test\Files\Storage\Storage { $meta = stream_get_meta_data($stream); $this->assertEquals('plainfile', $meta['wrapper_type']); fclose($stream); + + $stream = $instance->fopen('foo', 'rb'); + $meta = stream_get_meta_data($stream); + $this->assertEquals('plainfile', $meta['wrapper_type']); + fclose($stream); } public function testReturnQuotaStreamOnWrite(){ -- cgit v1.2.3 From 221e656e91de48f74e170662cb9680e5e2aac792 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Mon, 20 Jan 2014 10:10:34 +0100 Subject: Revert "use getAppWebPath() in here as well" This reverts commit 6254f0a403e315461f8e20ebccf71cb91e9313a3. --- lib/private/template/cssresourcelocator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/template/cssresourcelocator.php b/lib/private/template/cssresourcelocator.php index e26daa25827..8e7831ca549 100644 --- a/lib/private/template/cssresourcelocator.php +++ b/lib/private/template/cssresourcelocator.php @@ -22,7 +22,7 @@ class CSSResourceLocator extends ResourceLocator { $app = substr($style, 0, strpos($style, '/')); $style = substr($style, strpos($style, '/')+1); $app_path = \OC_App::getAppPath($app); - $app_url = \OC_App::getAppWebPath($app); + $app_url = $this->webroot . '/index.php/apps/' . $app; if ($this->appendIfExist($app_path, $style.$this->form_factor.'.css', $app_url) || $this->appendIfExist($app_path, $style.'.css', $app_url) ) { -- cgit v1.2.3 From 3d6d8d1bb683f9daca3a2b8a876e291adc320375 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 20 Jan 2014 15:21:21 +0100 Subject: Reuse the data retrieved from the cache in checkUpdate --- apps/files_sharing/lib/watcher.php | 2 +- lib/private/files/cache/watcher.php | 4 ++-- lib/private/files/view.php | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/apps/files_sharing/lib/watcher.php b/apps/files_sharing/lib/watcher.php index c40cf6911b8..285b1a58c6e 100644 --- a/apps/files_sharing/lib/watcher.php +++ b/apps/files_sharing/lib/watcher.php @@ -32,7 +32,7 @@ class Shared_Watcher extends Watcher { * @param string $path */ public function checkUpdate($path) { - if ($path != '' && parent::checkUpdate($path)) { + if ($path != '' && parent::checkUpdate($path) === true) { // since checkUpdate() has already updated the size of the subdirs, // only apply the update to the owner's parent dirs diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php index 58f624c8990..251ecbe7071 100644 --- a/lib/private/files/cache/watcher.php +++ b/lib/private/files/cache/watcher.php @@ -40,7 +40,7 @@ class Watcher { * check $path for updates * * @param string $path - * @return boolean true if path was updated, false otherwise + * @return boolean | array true if path was updated, otherwise the cached data is returned */ public function checkUpdate($path) { $cachedEntry = $this->cache->get($path); @@ -56,7 +56,7 @@ class Watcher { $this->cache->correctFolderSize($path); return true; } - return false; + return $cachedEntry; } /** diff --git a/lib/private/files/view.php b/lib/private/files/view.php index 8893911ed5d..d97544b865e 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -801,6 +801,7 @@ class View { * @var string $internalPath */ list($storage, $internalPath) = Filesystem::resolvePath($path); + $data = null; if ($storage) { $cache = $storage->getCache($internalPath); $permissionsCache = $storage->getPermissionsCache($internalPath); @@ -811,10 +812,12 @@ class View { $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); } else { $watcher = $storage->getWatcher($internalPath); - $watcher->checkUpdate($internalPath); + $data = $watcher->checkUpdate($internalPath); } - $data = $cache->get($internalPath); + if (!is_array($data)) { + $data = $cache->get($internalPath); + } if ($data and $data['fileid']) { if ($includeMountPoints and $data['mimetype'] === 'httpd/unix-directory') { -- cgit v1.2.3 From 23a4d0d44ef8b918f054e7ad608d04b2e9a68995 Mon Sep 17 00:00:00 2001 From: Thomas Müller Date: Tue, 21 Jan 2014 11:32:30 +0100 Subject: OC_Util::setupFS($user) will create a data dir for the given string - no matter if the user really exists - OCP\JSON::checkUserExists($owner); introduces a ready to use check which will bail out with an JSON error --- apps/files/ajax/upload.php | 1 + apps/files/triggerupdate.php | 1 + apps/files_sharing/ajax/publicpreview.php | 3 ++- apps/files_sharing/appinfo/update.php | 1 + apps/files_sharing/public.php | 6 +++--- lib/private/json.php | 14 ++++++++++++++ lib/private/util.php | 4 ++++ lib/public/json.php | 10 +++++++++- 8 files changed, 35 insertions(+), 5 deletions(-) (limited to 'lib/private') diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 0e905f993ac..bdaf6a77d14 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -34,6 +34,7 @@ if (empty($_POST['dirToken'])) { // resolve reshares $rootLinkItem = OCP\Share::resolveReShare($linkItem); + OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); // Setup FS with owner OC_Util::tearDownFS(); OC_Util::setupFS($rootLinkItem['uid_owner']); diff --git a/apps/files/triggerupdate.php b/apps/files/triggerupdate.php index 0e29edbba35..a37b9823add 100644 --- a/apps/files/triggerupdate.php +++ b/apps/files/triggerupdate.php @@ -6,6 +6,7 @@ if (OC::$CLI) { if (count($argv) === 2) { $file = $argv[1]; list(, $user) = explode('/', $file); + OCP\JSON::checkUserExists($owner); OC_Util::setupFS($user); $view = new \OC\Files\View(''); /** diff --git a/apps/files_sharing/ajax/publicpreview.php b/apps/files_sharing/ajax/publicpreview.php index 54a9806e8bf..a52f522afac 100644 --- a/apps/files_sharing/ajax/publicpreview.php +++ b/apps/files_sharing/ajax/publicpreview.php @@ -39,6 +39,7 @@ if(!isset($linkedItem['uid_owner']) || !isset($linkedItem['file_source'])) { $rootLinkItem = OCP\Share::resolveReShare($linkedItem); $userId = $rootLinkItem['uid_owner']; +OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); \OC_Util::setupFS($userId); \OC\Files\Filesystem::initMountPoints($userId); $view = new \OC\Files\View('/' . $userId . '/files'); @@ -88,4 +89,4 @@ try{ } catch (\Exception $e) { \OC_Response::setStatus(500); \OC_Log::write('core', $e->getmessage(), \OC_Log::DEBUG); -} \ No newline at end of file +} diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php index 0d827da28ea..4b716e764f4 100644 --- a/apps/files_sharing/appinfo/update.php +++ b/apps/files_sharing/appinfo/update.php @@ -44,6 +44,7 @@ if (version_compare($installedVersion, '0.3', '<')) { $shareType = OCP\Share::SHARE_TYPE_USER; $shareWith = $row['uid_shared_with']; } + OCP\JSON::checkUserExists($row['uid_owner']); OC_User::setUserId($row['uid_owner']); //we need to setup the filesystem for the user, otherwise OC_FileSystem::getRoot will fail and break OC_Util::setupFS($row['uid_owner']); diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index d050efd5b32..80dd708ee51 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -43,10 +43,10 @@ if (isset($_GET['t'])) { $shareOwner = $linkItem['uid_owner']; $path = null; $rootLinkItem = OCP\Share::resolveReShare($linkItem); - $fileOwner = $rootLinkItem['uid_owner']; - if (isset($fileOwner)) { + if (isset($rootLinkItem['uid_owner'])) { + OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); OC_Util::tearDownFS(); - OC_Util::setupFS($fileOwner); + OC_Util::setupFS($rootLinkItem['uid_owner']); $path = \OC\Files\Filesystem::getPath($linkItem['file_source']); } } diff --git a/lib/private/json.php b/lib/private/json.php index 6a9e5a2df5e..5c5d7e3a3da 100644 --- a/lib/private/json.php +++ b/lib/private/json.php @@ -64,6 +64,20 @@ class OC_JSON{ } } + /** + * Check is a given user exists - send json error msg if not + * @param string $user + */ + public static function checkUserExists($user) { + if (!OCP\User::userExists($user)) { + $l = OC_L10N::get('lib'); + OCP\JSON::error(array('data' => array('message' => $l->t('Unknown user')))); + exit; + } + } + + + /** * Check if the user is a subadmin, send json error msg if not */ diff --git a/lib/private/util.php b/lib/private/util.php index 72afa6f9478..8aa7a074d0d 100755 --- a/lib/private/util.php +++ b/lib/private/util.php @@ -51,6 +51,10 @@ class OC_Util { self::$rootMounted = true; } + if ($user != '' && !OCP\User::userExists($user)) { + return false; + } + //if we aren't logged in, there is no use to set up the filesystem if( $user != "" ) { \OC\Files\Filesystem::addStorageWrapper(function($mountPoint, $storage){ diff --git a/lib/public/json.php b/lib/public/json.php index 831e3ef1cf6..cd5d233ef90 100644 --- a/lib/public/json.php +++ b/lib/public/json.php @@ -167,7 +167,7 @@ class JSON { * @return string json formatted string if not admin user. */ public static function checkAdminUser() { - return(\OC_JSON::checkAdminUser()); + \OC_JSON::checkAdminUser(); } /** @@ -177,4 +177,12 @@ class JSON { public static function encode($data) { return(\OC_JSON::encode($data)); } + + /** + * Check is a given user exists - send json error msg if not + * @param string $user + */ + public static function checkUserExists($user) { + \OC_JSON::checkUserExists($user); + } } -- cgit v1.2.3 From 267e1f3c40b9b9bdabaf0e49221744f80f7bc5a4 Mon Sep 17 00:00:00 2001 From: Jörn Friedrich Dreyer Date: Tue, 21 Jan 2014 12:41:10 +0100 Subject: use 'download.zip' as default name for zip downloads instead of 'owncloud.zip' --- lib/private/files.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/files.php b/lib/private/files.php index e6c81d58bd2..8ce632013cf 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -83,7 +83,7 @@ class OC_Files { if ($basename) { $name = $basename . '.zip'; } else { - $name = 'owncloud.zip'; + $name = 'download.zip'; } set_time_limit($executionTime); -- cgit v1.2.3 From 6241655df4121619de42ba797ec076d9b6927568 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 23 Jan 2014 02:15:42 +0100 Subject: Bring mimetype list into alphabetical order. --- lib/private/mimetypes.list.php | 123 ++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 62 deletions(-) (limited to 'lib/private') diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 08228336966..72860d0e64f 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -21,93 +21,92 @@ */ /** - * list of mimetypes by extension + * Array mapping file extensions to mimetypes (in alphabetical order). */ - return array( + 'ai' => 'application/illustrator', + 'avi'=>'video/x-msvideo', + 'bash' => 'text/x-shellscript', + 'blend'=>'application/x-blender', + 'cc' => 'text/x-c', + 'cdr' => 'application/coreldraw', + 'cpp' => 'text/x-c++src', 'css'=>'text/css', + 'c' => 'text/x-c', + 'c++' => 'text/x-c++src', + 'doc'=>'application/msword', + 'doc'=>'application/msword', + 'docx'=>'application/msword', + 'docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dv'=>'video/dv', + 'epub' => 'application/epub+zip', + 'exe'=>'application/x-ms-dos-executable', 'flac'=>'audio/flac', 'gif'=>'image/gif', - 'gzip'=>'application/x-gzip', 'gz'=>'application/x-gzip', + 'gzip'=>'application/x-gzip', 'html'=>'text/html', 'htm'=>'text/html', - 'ics'=>'text/calendar', 'ical'=>'text/calendar', + 'ics'=>'text/calendar', + 'impress' => 'text/impress', 'jpeg'=>'image/jpeg', 'jpg'=>'image/jpeg', 'js'=>'application/javascript', + 'keynote'=>'application/x-iwork-keynote-sffkey', + 'kra'=>'application/x-krita', + 'm2t'=>'video/mp2t', + 'm4v'=>'video/mp4', + 'markdown' => 'text/markdown', + 'mdown' => 'text/markdown', + 'md' => 'text/markdown', + 'mdwn' => 'text/markdown', + 'mobi' => 'application/x-mobipocket-ebook', + 'mov'=>'video/quicktime', + 'mp3'=>'audio/mpeg', + 'mp4'=>'video/mp4', + 'mpeg'=>'video/mpeg', + 'mpg'=>'video/mpeg', + 'msi'=>'application/x-msi', + 'numbers'=>'application/x-iwork-numbers-sffnumbers', + 'odg'=>'application/vnd.oasis.opendocument.graphics', + 'odp'=>'application/vnd.oasis.opendocument.presentation', + 'ods'=>'application/vnd.oasis.opendocument.spreadsheet', + 'odt'=>'application/vnd.oasis.opendocument.text', 'oga'=>'audio/ogg', 'ogg'=>'audio/ogg', 'ogv'=>'video/ogg', + 'pages'=>'application/x-iwork-pages-sffpages', 'pdf'=>'application/pdf', + 'php'=>'application/x-php', + 'pl'=>'application/x-pearl', 'png'=>'image/png', + 'ppt'=>'application/mspowerpoint', + 'pptx'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'psd'=>'application/x-photoshop', + 'py'=>'application/x-python', + 'py'=>'text/x-script.python', + 'reveal' => 'text/reveal', + 'sgf' => 'application/sgf', + 'sh-lib' => 'text/x-shellscript', + 'sh' => 'text/x-shellscript', 'svg'=>'image/svg+xml', 'tar'=>'application/x-tar', - 'tgz'=>'application/x-compressed', 'tar.gz'=>'application/x-compressed', - 'tif'=>'image/tiff', + 'tgz'=>'application/x-compressed', 'tiff'=>'image/tiff', + 'tif'=>'image/tiff', 'txt'=>'text/plain', - 'zip'=>'application/zip', + 'vcard' => 'text/vcard', + 'vcf' => 'text/vcard', 'wav'=>'audio/wav', - 'odt'=>'application/vnd.oasis.opendocument.text', - 'ods'=>'application/vnd.oasis.opendocument.spreadsheet', - 'odg'=>'application/vnd.oasis.opendocument.graphics', - 'odp'=>'application/vnd.oasis.opendocument.presentation', - 'pages'=>'application/x-iwork-pages-sffpages', - 'numbers'=>'application/x-iwork-numbers-sffnumbers', - 'keynote'=>'application/x-iwork-keynote-sffkey', - 'kra'=>'application/x-krita', - 'mp3'=>'audio/mpeg', - 'doc'=>'application/msword', - 'docx'=>'application/msword', - 'xls'=>'application/msexcel', - 'xlsx'=>'application/msexcel', - 'php'=>'application/x-php', - 'exe'=>'application/x-ms-dos-executable', - 'msi'=>'application/x-msi', - 'pl'=>'application/x-pearl', - 'py'=>'application/x-python', - 'blend'=>'application/x-blender', - 'xcf'=>'application/x-gimp', - 'psd'=>'application/x-photoshop', - 'xml'=>'application/xml', - 'avi'=>'video/x-msvideo', - 'dv'=>'video/dv', - 'm2t'=>'video/mp2t', - 'mp4'=>'video/mp4', - 'm4v'=>'video/mp4', - 'mpg'=>'video/mpeg', - 'mpeg'=>'video/mpeg', - 'mov'=>'video/quicktime', 'webm'=>'video/webm', 'wmv'=>'video/x-ms-asf', - 'py'=>'text/x-script.python', - 'vcf' => 'text/vcard', - 'vcard' => 'text/vcard', - 'doc'=>'application/msword', - 'docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'xcf'=>'application/x-gimp', 'xls'=>'application/msexcel', + 'xls'=>'application/msexcel', + 'xlsx'=>'application/msexcel', 'xlsx'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'ppt'=>'application/mspowerpoint', - 'pptx'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'sgf' => 'application/sgf', - 'cdr' => 'application/coreldraw', - 'impress' => 'text/impress', - 'ai' => 'application/illustrator', - 'epub' => 'application/epub+zip', - 'mobi' => 'application/x-mobipocket-ebook', - 'md' => 'text/markdown', - 'markdown' => 'text/markdown', - 'mdown' => 'text/markdown', - 'mdwn' => 'text/markdown', - 'reveal' => 'text/reveal', - 'c' => 'text/x-c', - 'cc' => 'text/x-c', - 'cpp' => 'text/x-c++src', - 'c++' => 'text/x-c++src', - 'sh' => 'text/x-shellscript', - 'bash' => 'text/x-shellscript', - 'sh-lib' => 'text/x-shellscript', + 'xml'=>'application/xml', + 'zip'=>'application/zip', ); -- cgit v1.2.3 From 689516ebd7a47847938420bf8715469b68fb3535 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 23 Jan 2014 02:22:46 +0100 Subject: Remove duplicate mimetypes while keeping previous behaviour. --- lib/private/mimetypes.list.php | 5 ----- 1 file changed, 5 deletions(-) (limited to 'lib/private') diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 72860d0e64f..9db396e9fd2 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -35,8 +35,6 @@ return array( 'c' => 'text/x-c', 'c++' => 'text/x-c++src', 'doc'=>'application/msword', - 'doc'=>'application/msword', - 'docx'=>'application/msword', 'docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dv'=>'video/dv', 'epub' => 'application/epub+zip', @@ -84,7 +82,6 @@ return array( 'ppt'=>'application/mspowerpoint', 'pptx'=>'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'psd'=>'application/x-photoshop', - 'py'=>'application/x-python', 'py'=>'text/x-script.python', 'reveal' => 'text/reveal', 'sgf' => 'application/sgf', @@ -104,8 +101,6 @@ return array( 'wmv'=>'video/x-ms-asf', 'xcf'=>'application/x-gimp', 'xls'=>'application/msexcel', - 'xls'=>'application/msexcel', - 'xlsx'=>'application/msexcel', 'xlsx'=>'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xml'=>'application/xml', 'zip'=>'application/zip', -- cgit v1.2.3 From 47ea7704ca796a23fc5e9ec8f4a7668d1bbe9446 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 23 Jan 2014 02:46:05 +0100 Subject: Fix icons for xml,ppt,dot,dotx files. --- lib/private/helper.php | 2 ++ lib/private/mimetypes.list.php | 2 ++ 2 files changed, 4 insertions(+) (limited to 'lib/private') diff --git a/lib/private/helper.php b/lib/private/helper.php index 1c8d01c141f..90ef704c3cc 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -161,6 +161,7 @@ class OC_Helper { 'application/vnd.oasis.opendocument.text-template' => 'x-office/document', 'application/vnd.oasis.opendocument.text-web' => 'x-office/document', 'application/vnd.oasis.opendocument.text-master' => 'x-office/document', + 'application/mspowerpoint' => 'x-office/presentation', 'application/vnd.ms-powerpoint' => 'x-office/presentation', 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'x-office/presentation', 'application/vnd.openxmlformats-officedocument.presentationml.template' => 'x-office/presentation', @@ -171,6 +172,7 @@ class OC_Helper { 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12' => 'x-office/presentation', 'application/vnd.oasis.opendocument.presentation' => 'x-office/presentation', 'application/vnd.oasis.opendocument.presentation-template' => 'x-office/presentation', + 'application/msexcel' => 'x-office/spreadsheet', 'application/vnd.ms-excel' => 'x-office/spreadsheet', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'x-office/spreadsheet', 'application/vnd.openxmlformats-officedocument.spreadsheetml.template' => 'x-office/spreadsheet', diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 9db396e9fd2..1ad333b5084 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -36,6 +36,8 @@ return array( 'c++' => 'text/x-c++src', 'doc'=>'application/msword', 'docx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot'=>'application/msword', + 'dotx'=>'application/vnd.openxmlformats-officedocument.wordprocessingml.template', 'dv'=>'video/dv', 'epub' => 'application/epub+zip', 'exe'=>'application/x-ms-dos-executable', -- cgit v1.2.3 From 96f194c0f6038444aae4270d2481a2ee1ccd7691 Mon Sep 17 00:00:00 2001 From: Andreas Fischer Date: Thu, 23 Jan 2014 03:06:14 +0100 Subject: Add icons for mdb and accdb files. --- lib/private/helper.php | 1 + lib/private/mimetypes.list.php | 2 ++ 2 files changed, 3 insertions(+) (limited to 'lib/private') diff --git a/lib/private/helper.php b/lib/private/helper.php index 90ef704c3cc..58bee9c6300 100644 --- a/lib/private/helper.php +++ b/lib/private/helper.php @@ -182,6 +182,7 @@ class OC_Helper { 'application/vnd.ms-excel.sheet.binary.macroEnabled.12' => 'x-office/spreadsheet', 'application/vnd.oasis.opendocument.spreadsheet' => 'x-office/spreadsheet', 'application/vnd.oasis.opendocument.spreadsheet-template' => 'x-office/spreadsheet', + 'application/msaccess' => 'database', ); if (isset($alias[$mimetype])) { diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 1ad333b5084..40fb1d2d97d 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -24,6 +24,7 @@ * Array mapping file extensions to mimetypes (in alphabetical order). */ return array( + 'accdb'=>'application/msaccess', 'ai' => 'application/illustrator', 'avi'=>'video/x-msvideo', 'bash' => 'text/x-shellscript', @@ -60,6 +61,7 @@ return array( 'markdown' => 'text/markdown', 'mdown' => 'text/markdown', 'md' => 'text/markdown', + 'mdb'=>'application/msaccess', 'mdwn' => 'text/markdown', 'mobi' => 'application/x-mobipocket-ebook', 'mov'=>'video/quicktime', -- cgit v1.2.3 From 2f8ebd03b011b705883bf9666b1bdaafb971f110 Mon Sep 17 00:00:00 2001 From: Otto Sabart Date: Fri, 24 Jan 2014 15:52:28 +0100 Subject: Add check for apc.enabled option Sometimes it's not possible to disable APC entirely and some of apc_functions are disabled. Only thing which is possible is to disable apc.enable option. --- lib/private/memcache/apc.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/private') diff --git a/lib/private/memcache/apc.php b/lib/private/memcache/apc.php index 575ee4427db..e995cbc526e 100644 --- a/lib/private/memcache/apc.php +++ b/lib/private/memcache/apc.php @@ -50,6 +50,8 @@ class APC extends Cache { static public function isAvailable() { if (!extension_loaded('apc')) { return false; + } elseif (!ini_get('apc.enabled')) { + return false; } elseif (!ini_get('apc.enable_cli') && \OC::$CLI) { return false; } else { -- cgit v1.2.3 From 11ef12a1060f3e34312ae40c690f95765d7c5f89 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 23 Jan 2014 12:11:53 +0100 Subject: Added exception logger plugin for sabre connector Whenever an exception occurs in the sabre connector code or code called by it, it will be logged. This plugin approach is needed because Sabre already catches exceptions to return them to the client in the XML response, so they don't appear logged in the web server log. This will make it much easier to debug syncing issues. --- apps/files/appinfo/remote.php | 1 + .../connector/sabre/exceptionloggerplugin.php | 50 ++++++++++++++++++++++ lib/private/connector/sabre/file.php | 6 +-- lib/public/util.php | 8 +++- 4 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 lib/private/connector/sabre/exceptionloggerplugin.php (limited to 'lib/private') diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php index 9f290796205..ef22fe92188 100644 --- a/apps/files/appinfo/remote.php +++ b/apps/files/appinfo/remote.php @@ -52,6 +52,7 @@ $server->addPlugin(new OC_Connector_Sabre_FilesPlugin()); $server->addPlugin(new OC_Connector_Sabre_AbortedUploadDetectionPlugin()); $server->addPlugin(new OC_Connector_Sabre_QuotaPlugin()); $server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin()); +$server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav')); // And off we go! $server->exec(); diff --git a/lib/private/connector/sabre/exceptionloggerplugin.php b/lib/private/connector/sabre/exceptionloggerplugin.php new file mode 100644 index 00000000000..8e77afaf207 --- /dev/null +++ b/lib/private/connector/sabre/exceptionloggerplugin.php @@ -0,0 +1,50 @@ + + * + * @license AGPL3 + */ + +class OC_Connector_Sabre_ExceptionLoggerPlugin extends Sabre_DAV_ServerPlugin +{ + private $appName; + + /** + * @param string $loggerAppName app name to use when logging + */ + public function __construct($loggerAppName = 'webdav') { + $this->appName = $loggerAppName; + } + + /** + * This initializes the plugin. + * + * This function is called by Sabre_DAV_Server, after + * addPlugin is called. + * + * This method should set up the required event subscriptions. + * + * @param Sabre_DAV_Server $server + * @return void + */ + public function initialize(Sabre_DAV_Server $server) { + + $server->subscribeEvent('exception', array($this, 'logException'), 10); + } + + /** + * Log exception + * + * @internal param Exception $e exception + */ + public function logException($e) { + $exceptionClass = get_class($e); + if ($exceptionClass !== 'Sabre_DAV_Exception_NotAuthenticated') { + \OCP\Util::logException($this->appName, $e); + } + } +} diff --git a/lib/private/connector/sabre/file.php b/lib/private/connector/sabre/file.php index c3b59007295..ed27cef440d 100644 --- a/lib/private/connector/sabre/file.php +++ b/lib/private/connector/sabre/file.php @@ -79,7 +79,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D \OC_Log::write('webdav', '\OC\Files\Filesystem::file_put_contents() failed', \OC_Log::ERROR); $fs->unlink($partpath); // because we have no clue about the cause we can only throw back a 500/Internal Server Error - throw new Sabre_DAV_Exception(); + throw new Sabre_DAV_Exception('Could not write file contents'); } } catch (\OCP\Files\NotPermittedException $e) { // a more general case - due to whatever reason the content could not be written @@ -105,7 +105,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D if ($renameOkay === false || $fileExists === false) { \OC_Log::write('webdav', '\OC\Files\Filesystem::rename() failed', \OC_Log::ERROR); $fs->unlink($partpath); - throw new Sabre_DAV_Exception(); + throw new Sabre_DAV_Exception('Could not rename part file to final file'); } // allow sync clients to send the mtime along in a header @@ -246,7 +246,7 @@ class OC_Connector_Sabre_File extends OC_Connector_Sabre_Node implements Sabre_D if ($fileExists) { $fs->unlink($targetPath); } - throw new Sabre_DAV_Exception(); + throw new Sabre_DAV_Exception('Could not rename part file assembled from chunks'); } // allow sync clients to send the mtime along in a header diff --git a/lib/public/util.php b/lib/public/util.php index 8e85f9afc3f..e893a76d811 100644 --- a/lib/public/util.php +++ b/lib/public/util.php @@ -88,14 +88,18 @@ class Util { * @param Exception $ex exception to log */ public static function logException( $app, \Exception $ex ) { - $message = $ex->getMessage(); + $class = get_class($ex); + if ($class !== 'Exception') { + $message = $class . ': '; + } + $message .= $ex->getMessage(); if ($ex->getCode()) { $message .= ' [' . $ex->getCode() . ']'; } \OCP\Util::writeLog($app, 'Exception: ' . $message, \OCP\Util::FATAL); if (defined('DEBUG') and DEBUG) { // also log stack trace - $stack = explode('#', $ex->getTraceAsString()); + $stack = explode("\n", $ex->getTraceAsString()); // first element is empty array_shift($stack); foreach ($stack as $s) { -- cgit v1.2.3