From efea86870473da5a2cdc867e171562525266c663 Mon Sep 17 00:00:00 2001 From: Florian Scholz Date: Mon, 17 Jun 2013 14:21:53 +0200 Subject: [PATCH 001/107] - removed slash-adding for logout-header-redirect --- lib/base.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index a6e4a47dbf5..ff9dd1ad1eb 100644 --- a/lib/base.php +++ b/lib/base.php @@ -641,7 +641,7 @@ class OC { OC_Preferences::deleteKey(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']); } OC_User::logout(); - header("Location: " . OC::$WEBROOT . '/'); + header("Location: " . OC::$WEBROOT); } else { if (is_null($file)) { $param['file'] = 'index.php'; From b1fd9b39074f46b635d66c80d63994ffc99bf286 Mon Sep 17 00:00:00 2001 From: Florian Scholz Date: Tue, 25 Jun 2013 10:45:37 +0200 Subject: [PATCH 002/107] - add slash if webroot is an empty string - added comment --- lib/base.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/base.php b/lib/base.php index ff9dd1ad1eb..39e0249477b 100644 --- a/lib/base.php +++ b/lib/base.php @@ -641,7 +641,8 @@ class OC { OC_Preferences::deleteKey(OC_User::getUser(), 'login_token', $_COOKIE['oc_token']); } OC_User::logout(); - header("Location: " . OC::$WEBROOT); + // redirect to webroot and add slash if webroot is empty + header("Location: " . OC::$WEBROOT.(empty(OC::$WEBROOT) ? '/' : '')); } else { if (is_null($file)) { $param['file'] = 'index.php'; From 48e426b589029b8e616be2785afc8c0b4b4aecaf Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 Dec 2013 16:46:52 +0100 Subject: [PATCH 003/107] add support for nested groups --- apps/user_ldap/group_ldap.php | 79 +++++++++++++++++++++++---- apps/user_ldap/lib/configuration.php | 3 + apps/user_ldap/templates/settings.php | 1 + 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 32e2cec5960..0a5ab192763 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -61,8 +61,7 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return false; } //usually, LDAP attributes are said to be case insensitive. But there are exceptions of course. - $members = $this->access->readAttribute($dn_group, - $this->access->connection->ldapGroupMemberAssocAttr); + $members = array_keys($this->_groupMembers($dn_group)); if(!$members) { $this->access->connection->writeToCache('inGroup'.$uid.':'.$gid, false); return false; @@ -89,6 +88,39 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return $isInGroup; } + private function _groupMembers($dn_group, &$groups_seen = null) { + if ($groups_seen == null) { + $groups_seen = array(); + } + $all_members = array(); + if (array_key_exists($dn_group, $groups_seen)) { + // avoid loops + return array(); + } + // used extensively in cron job, caching makes sense for nested groups + $cache_key = '_groupMembers'.$dn_group; + if($this->access->connection->isCached($cache_key)) { + \OCP\Util::writeLog('user_ldap', 'LEO _groupMembers('.$dn_group.') using cached value', \OCP\Util::DEBUG); + return $this->access->connection->getFromCache($cache_key); + } + $groups_seen[$dn_group] = 1; + $members = $this->access->readAttribute($dn_group, $this->access->connection->ldapGroupMemberAssocAttr, + $this->access->connection->ldapGroupFilter); + if ($members) { + foreach ($members as $member_dn) { + $all_members[$member_dn] = 1; + if ($this->access->connection->ldapNestedGroups) { + $submembers = $this->_groupMembers($member_dn, $groups_seen); + if ($submembers) { + $all_members = array_merge($all_members, $submembers); + } + } + } + } + $this->access->connection->writeToCache($cache_key, $all_members); + return $all_members; + } + /** * @brief Get all groups a user belongs to * @param $uid Name of the user @@ -124,18 +156,45 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $uid = $userDN; } - $filter = $this->access->combineFilterWithAnd(array( - $this->access->connection->ldapGroupFilter, - $this->access->connection->ldapGroupMemberAssocAttr.'='.$uid - )); - $groups = $this->access->fetchListOfGroups($filter, - array($this->access->connection->ldapGroupDisplayName, 'dn')); + $groups = array_values($this->_getGroupsByMember($uid)); $groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING); + \OCP\Util::writeLog('user_ldap', 'LEO _getGroupsByMember('.$uid.'): '.implode(", ", $groups), \OCP\Util::DEBUG); $this->access->connection->writeToCache($cacheKey, $groups); return $groups; } + /* private */ public function _getGroupsByMember($dn, &$seen = null) { + if ($seen == null) { + $seen = array(); + } + $all_groups = array(); + if (array_key_exists($dn, $seen)) { + // avoid loops + return array(); + } + $seen[$dn] = 1; + $filter = $this->combineFilterWithAnd(array( + $this->access->connection->ldapGroupFilter, + $this->access->connection->ldapGroupMemberAssocAttr.'='.$dn + )); + $groups = $this->fetchListOfGroups($filter, + array($this->access->connection->ldapGroupDisplayName, 'dn')); + if ($groups) { + foreach ($groups as $groupobj) { + $group_dn = $groupobj['dn']; + $all_groups[$group_dn] = $groupobj; + if ($this->access->connection->ldapNestedGroups) { + $supergroups = $this->_getGroupsByMember($group_dn, $seen); + if ($supergroups) { + $all_groups = array_merge($all_groups, $supergroups); + } + } + } + } + return $all_groups; + } + /** * @brief get a list of all users in a group * @returns array with user ids @@ -172,8 +231,8 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return array(); } - $members = $this->access->readAttribute($groupDN, - $this->access->connection->ldapGroupMemberAssocAttr); + $members = array_keys($this->_groupMembers($groupDN)); + \OCP\Util::writeLog('user_ldap', 'LEO _groupMembers('.$groupDN.'): '.implode(", ", $members), \OCP\Util::DEBUG); if(!$members) { //in case users could not be retrieved, return empty resultset $this->access->connection->writeToCache($cachekey, array()); diff --git a/apps/user_ldap/lib/configuration.php b/apps/user_ldap/lib/configuration.php index 874082f78f6..bceacdfdf80 100644 --- a/apps/user_ldap/lib/configuration.php +++ b/apps/user_ldap/lib/configuration.php @@ -76,6 +76,7 @@ class Configuration { 'ldapExpertUUIDUserAttr' => null, 'ldapExpertUUIDGroupAttr' => null, 'lastJpegPhotoLookup' => null, + 'ldapNestedGroups' => false, ); public function __construct($configPrefix, $autoread = true) { @@ -338,6 +339,7 @@ class Configuration { 'ldap_expert_uuid_group_attr' => '', 'has_memberof_filter_support' => 0, 'last_jpegPhoto_lookup' => 0, + 'ldap_nested_groups' => 0, ); } @@ -389,6 +391,7 @@ class Configuration { 'ldap_expert_uuid_group_attr' => 'ldapExpertUUIDGroupAttr', 'has_memberof_filter_support' => 'hasMemberOfFilterSupport', 'last_jpegPhoto_lookup' => 'lastJpegPhotoLookup', + 'ldap_nested_groups' => 'ldapNestedGroups', ); return $array; } diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index 3ccc7a860f5..ad527c06343 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -58,6 +58,7 @@

t('Username-LDAP User Mapping'));?>

t('Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.'));?>


+

From 86809be638a4dea6907322d24de618a1047bd9f0 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 8 Dec 2013 15:49:25 +0100 Subject: [PATCH 004/107] combineFilterWithAnd recently moved to Access --- apps/user_ldap/group_ldap.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 0a5ab192763..9286ece7ee1 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -174,12 +174,12 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return array(); } $seen[$dn] = 1; - $filter = $this->combineFilterWithAnd(array( + $filter = $this->access->combineFilterWithAnd(array( $this->access->connection->ldapGroupFilter, $this->access->connection->ldapGroupMemberAssocAttr.'='.$dn )); - $groups = $this->fetchListOfGroups($filter, - array($this->access->connection->ldapGroupDisplayName, 'dn')); + $groups = $this->access->fetchListOfGroups($filter, + array($this->access->connection->ldapGroupDisplayName, 'dn')); if ($groups) { foreach ($groups as $groupobj) { $group_dn = $groupobj['dn']; From 4fb16804d6c0ac12b47efaa4c50234538aa93874 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 10 Dec 2013 18:47:59 +0100 Subject: [PATCH 005/107] move nested group checkbox to directory settings --- apps/user_ldap/templates/settings.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php index ad527c06343..79c4ae224c3 100644 --- a/apps/user_ldap/templates/settings.php +++ b/apps/user_ldap/templates/settings.php @@ -36,6 +36,7 @@

+

t('Special Attributes'));?>

@@ -58,7 +59,6 @@

t('Username-LDAP User Mapping'));?>

t('Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage.'));?>


-

From a18cff44795c5888c993f83b89b8bd7f0d0b4af6 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 10 Dec 2013 19:02:01 +0100 Subject: [PATCH 006/107] remove debug output --- apps/user_ldap/group_ldap.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 9286ece7ee1..1300a280b00 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -100,7 +100,6 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { // used extensively in cron job, caching makes sense for nested groups $cache_key = '_groupMembers'.$dn_group; if($this->access->connection->isCached($cache_key)) { - \OCP\Util::writeLog('user_ldap', 'LEO _groupMembers('.$dn_group.') using cached value', \OCP\Util::DEBUG); return $this->access->connection->getFromCache($cache_key); } $groups_seen[$dn_group] = 1; @@ -158,7 +157,6 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $groups = array_values($this->_getGroupsByMember($uid)); $groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING); - \OCP\Util::writeLog('user_ldap', 'LEO _getGroupsByMember('.$uid.'): '.implode(", ", $groups), \OCP\Util::DEBUG); $this->access->connection->writeToCache($cacheKey, $groups); return $groups; @@ -232,7 +230,6 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { } $members = array_keys($this->_groupMembers($groupDN)); - \OCP\Util::writeLog('user_ldap', 'LEO _groupMembers('.$groupDN.'): '.implode(", ", $members), \OCP\Util::DEBUG); if(!$members) { //in case users could not be retrieved, return empty resultset $this->access->connection->writeToCache($cachekey, array()); From 2b127a6ac5c4da7a34c49f87878b643dafc5e40d Mon Sep 17 00:00:00 2001 From: root Date: Wed, 11 Dec 2013 10:43:48 +0100 Subject: [PATCH 007/107] fix indentation use identity test where appropriate use camelcase variable names _getGroupsByMember is a private function --- apps/user_ldap/group_ldap.php | 82 +++++++++++++++++------------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index 1300a280b00..fb47de7d945 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -88,37 +88,37 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return $isInGroup; } - private function _groupMembers($dn_group, &$groups_seen = null) { - if ($groups_seen == null) { - $groups_seen = array(); + private function _groupMembers($dnGroup, &$seen = null) { + if ($seen === null) { + $seen = array(); } - $all_members = array(); - if (array_key_exists($dn_group, $groups_seen)) { + $allMembers = array(); + if (array_key_exists($dnGroup, $seen)) { // avoid loops return array(); } // used extensively in cron job, caching makes sense for nested groups - $cache_key = '_groupMembers'.$dn_group; - if($this->access->connection->isCached($cache_key)) { - return $this->access->connection->getFromCache($cache_key); + $cacheKey = '_groupMembers'.$dnGroup; + if($this->access->connection->isCached($cacheKey)) { + return $this->access->connection->getFromCache($cacheKey); } - $groups_seen[$dn_group] = 1; - $members = $this->access->readAttribute($dn_group, $this->access->connection->ldapGroupMemberAssocAttr, - $this->access->connection->ldapGroupFilter); + $seen[$dnGroup] = 1; + $members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr, + $this->access->connection->ldapGroupFilter); if ($members) { - foreach ($members as $member_dn) { - $all_members[$member_dn] = 1; - if ($this->access->connection->ldapNestedGroups) { - $submembers = $this->_groupMembers($member_dn, $groups_seen); - if ($submembers) { - $all_members = array_merge($all_members, $submembers); - } - } - } + foreach ($members as $memberDN) { + $allMembers[$memberDN] = 1; + if ($this->access->connection->ldapNestedGroups) { + $subMembers = $this->_groupMembers($memberDN, $seen); + if ($subMembers) { + $allMembers = array_merge($allMembers, $subMembers); + } + } + } } - $this->access->connection->writeToCache($cache_key, $all_members); - return $all_members; - } + $this->access->connection->writeToCache($cacheKey, $allMembers); + return $allMembers; + } /** * @brief Get all groups a user belongs to @@ -162,11 +162,11 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { return $groups; } - /* private */ public function _getGroupsByMember($dn, &$seen = null) { - if ($seen == null) { - $seen = array(); + private function _getGroupsByMember($dn, &$seen = null) { + if ($seen === null) { + $seen = array(); } - $all_groups = array(); + $allGroups = array(); if (array_key_exists($dn, $seen)) { // avoid loops return array(); @@ -177,20 +177,20 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $this->access->connection->ldapGroupMemberAssocAttr.'='.$dn )); $groups = $this->access->fetchListOfGroups($filter, - array($this->access->connection->ldapGroupDisplayName, 'dn')); - if ($groups) { - foreach ($groups as $groupobj) { - $group_dn = $groupobj['dn']; - $all_groups[$group_dn] = $groupobj; - if ($this->access->connection->ldapNestedGroups) { - $supergroups = $this->_getGroupsByMember($group_dn, $seen); - if ($supergroups) { - $all_groups = array_merge($all_groups, $supergroups); - } - } - } - } - return $all_groups; + array($this->access->connection->ldapGroupDisplayName, 'dn')); + if ($groups) { + foreach ($groups as $groupobj) { + $groupDN = $groupobj['dn']; + $allGroups[$groupDN] = $groupobj; + if ($this->access->connection->ldapNestedGroups) { + $supergroups = $this->_getGroupsByMember($groupDN, $seen); + if ($supergroups) { + $allGroups = array_merge($allGroups, $supergroups); + } + } + } + } + return $allGroups; } /** From 66aa9b4e27deac3037ac382cc845cd26f05c682f Mon Sep 17 00:00:00 2001 From: Nicolai Ehemann Date: Fri, 17 Jan 2014 14:26:17 +0100 Subject: [PATCH 008/107] lib/files.php: make use of === instead of == --- lib/private/files.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/private/files.php b/lib/private/files.php index e6c81d58bd2..d4a8112d23b 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -51,7 +51,7 @@ class OC_Files { $xsendfile = true; } - if (is_array($files) && count($files) == 1) { + if (is_array($files) && count($files) === 1) { $files = $files[0]; } @@ -178,7 +178,7 @@ class OC_Files { if (isset($_SERVER['HTTP_RANGE']) && preg_match("/^bytes=([0-9]+)-([0-9]*)$/", $_SERVER['HTTP_RANGE'], $range)) { $filelength = filesize($filename); - if ($range[2] == "") { + if ($range[2] === "") { $range[2] = $filelength - 1; } header("Content-Range: bytes $range[1]-$range[2]/" . $filelength); @@ -280,7 +280,7 @@ class OC_Files { } //don't allow user to break his config -- broken or malicious size input - if (intval($size) == 0) { + if (intval($size) === 0) { return false; } @@ -302,7 +302,7 @@ class OC_Files { if ($content !== null) { $htaccess = $content; } - if ($hasReplaced == 0) { + if ($hasReplaced === 0) { $htaccess .= "\n" . $setting; } } From 791772abea631c503d95e21f584a66b47dc042f4 Mon Sep 17 00:00:00 2001 From: Nicolai Ehemann Date: Thu, 16 Jan 2014 17:21:19 +0100 Subject: [PATCH 009/107] refactored/cleaned up lib/files.php cleaned up get() logic fixed get() to only send headers if requested (xsendfile could get in the way) do no longer readfile() when already using mod_xsendfile or similar --- lib/private/files.php | 161 ++++++++++++++++++++++-------------------- 1 file changed, 84 insertions(+), 77 deletions(-) diff --git a/lib/private/files.php b/lib/private/files.php index d4a8112d23b..105c839177e 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -21,6 +21,12 @@ * */ +class GET_TYPE { + const FILE = 1; + const ZIP_FILES = 2; + const ZIP_DIR = 3; +} + /** * Class for fileserver access * @@ -36,6 +42,21 @@ class OC_Files { return \OC\Files\Filesystem::getDirectoryContent($path); } + private static function sendHeaders($filename, $name, $zip = false) { + OC_Response::setContentDispositionHeader($name, 'attachment'); + header('Content-Transfer-Encoding: binary'); + OC_Response::disableCaching(); + if ($zip) { + header('Content-Type: application/zip'); + } else { + $filesize = \OC\Files\Filesystem::filesize($filename); + header('Content-Type: '.\OC\Files\Filesystem::getMimeType($filename)); + if ($filesize > -1) { + header("Content-Length: ".$filesize); + } + } + } + /** * return the content of a file or return a zip file containing multiple files * @@ -56,87 +77,43 @@ class OC_Files { } if (is_array($files)) { - self::validateZipDownload($dir, $files); - $executionTime = intval(ini_get('max_execution_time')); - set_time_limit(0); - $zip = new ZipArchive(); - $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { - $l = OC_L10N::get('lib'); - throw new Exception($l->t('cannot open "%s"', array($filename))); - } - foreach ($files as $file) { - $file = $dir . '/' . $file; - if (\OC\Files\Filesystem::is_file($file)) { - $tmpFile = \OC\Files\Filesystem::toTmpFile($file); - self::$tmpFiles[] = $tmpFile; - $zip->addFile($tmpFile, basename($file)); - } elseif (\OC\Files\Filesystem::is_dir($file)) { - self::zipAddDir($file, $zip); - } - } - $zip->close(); - if ($xsendfile) { - $filename = OC_Helper::moveToNoClean($filename); - } + $get_type = GET_TYPE::ZIP_FILES; $basename = basename($dir); if ($basename) { $name = $basename . '.zip'; } else { $name = 'owncloud.zip'; } - - set_time_limit($executionTime); - } elseif (\OC\Files\Filesystem::is_dir($dir . '/' . $files)) { + $filename = $dir . '/' . $name; + } else { + $filename = $dir . '/' . $files; + if (\OC\Files\Filesystem::is_dir($dir . '/' . $files)) { + $get_type = GET_TYPE::ZIP_DIR; + $name = $files . '.zip'; + } else { + $get_type = GET_TYPE::FILE; + $name = $files; + } + } + + if ($get_type === GET_TYPE::FILE) { + $zip = false; + if ($xsendfile && OC_App::isEnabled('files_encryption')) { + $xsendfile = false; + } + } else { self::validateZipDownload($dir, $files); - $executionTime = intval(ini_get('max_execution_time')); - set_time_limit(0); $zip = new ZipArchive(); $filename = OC_Helper::tmpFile('.zip'); if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { $l = OC_L10N::get('lib'); throw new Exception($l->t('cannot open "%s"', array($filename))); } - $file = $dir . '/' . $files; - self::zipAddDir($file, $zip); - $zip->close(); - if ($xsendfile) { - $filename = OC_Helper::moveToNoClean($filename); - } - $name = $files . '.zip'; - set_time_limit($executionTime); - } else { - $zip = false; - $filename = $dir . '/' . $files; - $name = $files; - if ($xsendfile && OC_App::isEnabled('files_encryption')) { - $xsendfile = false; - } } OC_Util::obEnd(); if ($zip or \OC\Files\Filesystem::isReadable($filename)) { - OC_Response::setContentDispositionHeader($name, 'attachment'); - header('Content-Transfer-Encoding: binary'); - OC_Response::disableCaching(); - if ($zip) { - ini_set('zlib.output_compression', 'off'); - header('Content-Type: application/zip'); - header('Content-Length: ' . filesize($filename)); - self::addSendfileHeader($filename); - }else{ - $filesize = \OC\Files\Filesystem::filesize($filename); - header('Content-Type: '.\OC\Files\Filesystem::getMimeType($filename)); - if ($filesize > -1) { - header("Content-Length: ".$filesize); - } - if ($xsendfile) { - list($storage) = \OC\Files\Filesystem::resolvePath(\OC\Files\Filesystem::getView()->getAbsolutePath($filename)); - if ($storage instanceof \OC\Files\Storage\Local) { - self::addSendfileHeader(\OC\Files\Filesystem::getLocalFile($filename)); - } - } - } - } elseif ($zip or !\OC\Files\Filesystem::file_exists($filename)) { + self::sendHeaders($filename, $name, $zip); + } elseif (!\OC\Files\Filesystem::file_exists($filename)) { header("HTTP/1.0 404 Not Found"); $tmpl = new OC_Template('', '404', 'guest'); $tmpl->assign('file', $name); @@ -149,19 +126,49 @@ class OC_Files { return ; } if ($zip) { - $handle = fopen($filename, 'r'); - if ($handle) { - $chunkSize = 8 * 1024; // 1 MB chunks - while (!feof($handle)) { - echo fread($handle, $chunkSize); - flush(); + $executionTime = intval(ini_get('max_execution_time')); + set_time_limit(0); + if ($get_type === GET_TYPE::ZIP_FILES) { + foreach ($files as $file) { + $file = $dir . '/' . $file; + if (\OC\Files\Filesystem::is_file($file)) { + $tmpFile = \OC\Files\Filesystem::toTmpFile($file); + self::$tmpFiles[] = $tmpFile; + $zip->addFile($tmpFile, basename($file)); + } elseif (\OC\Files\Filesystem::is_dir($file)) { + self::zipAddDir($file, $zip); + } + } + } elseif ($get_type === GET_TYPE::ZIP_DIR) { + $file = $dir . '/' . $files; + self::zipAddDir($file, $zip); + } + $zip->close(); + if ($xsendfile) { + $filename = OC_Helper::moveToNoClean($filename); + self::addSendfileHeader($filename); + } else { + $handle = fopen($filename, 'r'); + if ($handle) { + $chunkSize = 8 * 1024; // 1 MB chunks + while (!feof($handle)) { + echo fread($handle, $chunkSize); + flush(); + } } } - if (!$xsendfile) { - unlink($filename); + set_time_limit($executionTime); + } else { + if ($xsendfile) { + list($storage) = \OC\Files\Filesystem::resolvePath($filename); + if ($storage instanceof \OC\Files\Storage\Local) { + self::addSendfileHeader(\OC\Files\Filesystem::getLocalFile($filename)); + } else { + \OC\Files\Filesystem::readfile($filename); + } + } else { + \OC\Files\Filesystem::readfile($filename); } - }else{ - \OC\Files\Filesystem::readfile($filename); } foreach (self::$tmpFiles as $tmpFile) { if (file_exists($tmpFile) and is_file($tmpFile)) { @@ -175,7 +182,7 @@ class OC_Files { header("X-Sendfile: " . $filename); } if (isset($_SERVER['MOD_X_SENDFILE2_ENABLED'])) { - if (isset($_SERVER['HTTP_RANGE']) && + if (isset($_SERVER['HTTP_RANGE']) && preg_match("/^bytes=([0-9]+)-([0-9]*)$/", $_SERVER['HTTP_RANGE'], $range)) { $filelength = filesize($filename); if ($range[2] === "") { @@ -188,7 +195,7 @@ class OC_Files { header("X-Sendfile: " . $filename); } } - + if (isset($_SERVER['MOD_X_ACCEL_REDIRECT_ENABLED'])) { header("X-Accel-Redirect: " . $filename); } From 99ad4e80007bca5062709e16652b953ad9e73dc7 Mon Sep 17 00:00:00 2001 From: Nicolai Ehemann Date: Wed, 22 Jan 2014 12:49:52 +0100 Subject: [PATCH 010/107] switched zip file creation to ZipStreamer to create zip files directly in memory --- lib/private/files.php | 42 +++++++++--------------------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/lib/private/files.php b/lib/private/files.php index 105c839177e..5370f9e1678 100644 --- a/lib/private/files.php +++ b/lib/private/files.php @@ -20,6 +20,7 @@ * License along with this library. If not, see . * */ +require_once( 'ZipStreamer/ZipStreamer.php' ); class GET_TYPE { const FILE = 1; @@ -32,8 +33,6 @@ class GET_TYPE { * */ class OC_Files { - static $tmpFiles = array(); - static public function getFileInfo($path, $includeMountPoints = true){ return \OC\Files\Filesystem::getFileInfo($path, $includeMountPoints); } @@ -103,12 +102,7 @@ class OC_Files { } } else { self::validateZipDownload($dir, $files); - $zip = new ZipArchive(); - $filename = OC_Helper::tmpFile('.zip'); - if ($zip->open($filename, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE)!==true) { - $l = OC_L10N::get('lib'); - throw new Exception($l->t('cannot open "%s"', array($filename))); - } + $zip = new ZipStreamer(false); } OC_Util::obEnd(); if ($zip or \OC\Files\Filesystem::isReadable($filename)) { @@ -132,9 +126,9 @@ class OC_Files { foreach ($files as $file) { $file = $dir . '/' . $file; if (\OC\Files\Filesystem::is_file($file)) { - $tmpFile = \OC\Files\Filesystem::toTmpFile($file); - self::$tmpFiles[] = $tmpFile; - $zip->addFile($tmpFile, basename($file)); + $fh = \OC\Files\Filesystem::fopen($file, 'r'); + $zip->addFileFromStream($fh, basename($file)); + fclose($fh); } elseif (\OC\Files\Filesystem::is_dir($file)) { self::zipAddDir($file, $zip); } @@ -143,20 +137,7 @@ class OC_Files { $file = $dir . '/' . $files; self::zipAddDir($file, $zip); } - $zip->close(); - if ($xsendfile) { - $filename = OC_Helper::moveToNoClean($filename); - self::addSendfileHeader($filename); - } else { - $handle = fopen($filename, 'r'); - if ($handle) { - $chunkSize = 8 * 1024; // 1 MB chunks - while (!feof($handle)) { - echo fread($handle, $chunkSize); - flush(); - } - } - } + $zip->finalize(); set_time_limit($executionTime); } else { if ($xsendfile) { @@ -170,11 +151,6 @@ class OC_Files { \OC\Files\Filesystem::readfile($filename); } } - foreach (self::$tmpFiles as $tmpFile) { - if (file_exists($tmpFile) and is_file($tmpFile)) { - unlink($tmpFile); - } - } } private static function addSendfileHeader($filename) { @@ -210,9 +186,9 @@ class OC_Files { $filename=$file['name']; $file=$dir.'/'.$filename; if(\OC\Files\Filesystem::is_file($file)) { - $tmpFile=\OC\Files\Filesystem::toTmpFile($file); - OC_Files::$tmpFiles[]=$tmpFile; - $zip->addFile($tmpFile, $internalDir.$filename); + $fh = \OC\Files\Filesystem::fopen($file, 'r'); + $zip->addFileFromStream($fh, $internalDir.$filename); + fclose($fh); }elseif(\OC\Files\Filesystem::is_dir($file)) { self::zipAddDir($file, $zip, $internalDir); } From a62b393d02fdfc49334b5ad4b1e847a711de741d Mon Sep 17 00:00:00 2001 From: Guillaume AMAT Date: Wed, 12 Feb 2014 00:54:35 +0100 Subject: [PATCH 011/107] Update page title when navigating through directories --- apps/files/js/filelist.js | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index a855d6cbe59..7691135e620 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -18,6 +18,15 @@ window.FileList={ $(this).attr('data-file',decodeURIComponent($(this).attr('data-file'))); }); }, + /** + * Sets a new page title + */ + setPageTitle: function(title){ + // Sets the page title with the " - ownCloud" suffix as in templates + window.document.title = title + ' - ownCloud'; + + return true; + }, /** * Returns the tr element for a given file name */ @@ -186,12 +195,22 @@ window.FileList={ changeDirectory: function(targetDir, changeUrl, force) { var $dir = $('#dir'), url, - currentDir = $dir.val() || '/'; + currentDir = $dir.val() || '/', + baseDir = targetDir.split('/').pop(), targetDir = targetDir || '/'; if (!force && currentDir === targetDir) { return; } + + if (baseDir !== '') { + FileList.setPageTitle(baseDir); + } + else { + FileList.setPageTitle(t('files', 'Files')); + } + FileList.setCurrentDir(targetDir, changeUrl); + $('#fileList').trigger( jQuery.Event('changeDirectory', { dir: targetDir, @@ -811,7 +830,8 @@ window.FileList={ }; $(document).ready(function() { - var isPublic = !!$('#isPublic').val(); + var baseDir, + isPublic = !!$('#isPublic').val(); // handle upload events var file_upload_start = $('#file_upload_start'); @@ -1095,6 +1115,14 @@ $(document).ready(function() { FileList.changeDirectory(parseCurrentDirFromUrl(), false, true); } } - + + + baseDir = parseCurrentDirFromUrl().split('/').pop(); + + if (baseDir !== '') { + FileList.setPageTitle(baseDir); + } + + FileList.createFileSummary(); }); From d10f6e94dcc92a2242aae2b2331b6f85da8d8b6c Mon Sep 17 00:00:00 2001 From: root Date: Wed, 12 Feb 2014 16:56:17 +0100 Subject: [PATCH 012/107] fix coding style to blizzz happy.. ;-) --- apps/user_ldap/group_ldap.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php index fb47de7d945..509f65712fd 100644 --- a/apps/user_ldap/group_ldap.php +++ b/apps/user_ldap/group_ldap.php @@ -105,10 +105,11 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $seen[$dnGroup] = 1; $members = $this->access->readAttribute($dnGroup, $this->access->connection->ldapGroupMemberAssocAttr, $this->access->connection->ldapGroupFilter); - if ($members) { + if (is_array($members)) { foreach ($members as $memberDN) { $allMembers[$memberDN] = 1; - if ($this->access->connection->ldapNestedGroups) { + $nestedGroups = $this->access->connection->ldapNestedGroups; + if (!empty($nestedGroups)) { $subMembers = $this->_groupMembers($memberDN, $seen); if ($subMembers) { $allMembers = array_merge($allMembers, $subMembers); @@ -155,14 +156,14 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { $uid = $userDN; } - $groups = array_values($this->_getGroupsByMember($uid)); + $groups = array_values($this->getGroupsByMember($uid)); $groups = array_unique($this->access->ownCloudGroupNames($groups), SORT_LOCALE_STRING); $this->access->connection->writeToCache($cacheKey, $groups); return $groups; } - private function _getGroupsByMember($dn, &$seen = null) { + private function getGroupsByMember($dn, &$seen = null) { if ($seen === null) { $seen = array(); } @@ -178,13 +179,14 @@ class GROUP_LDAP extends BackendUtility implements \OCP\GroupInterface { )); $groups = $this->access->fetchListOfGroups($filter, array($this->access->connection->ldapGroupDisplayName, 'dn')); - if ($groups) { + if (is_array($groups)) { foreach ($groups as $groupobj) { $groupDN = $groupobj['dn']; $allGroups[$groupDN] = $groupobj; - if ($this->access->connection->ldapNestedGroups) { - $supergroups = $this->_getGroupsByMember($groupDN, $seen); - if ($supergroups) { + $nestedGroups = $this->access->connection->ldapNestedGroups; + if (!empty($nestedGroups)) { + $supergroups = $this->getGroupsByMember($groupDN, $seen); + if (is_array($supergroups) && (count($supergroups)>0)) { $allGroups = array_merge($allGroups, $supergroups); } } From 01dee35ebe1f3ab0e8a7f986015a9fa43a80b061 Mon Sep 17 00:00:00 2001 From: Guillaume AMAT Date: Thu, 13 Feb 2014 10:47:03 +0100 Subject: [PATCH 013/107] Adds OC_Defaults values in javascript config --- core/js/config.php | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/js/config.php b/core/js/config.php index 517ea1615a8..7ec0904ec3d 100644 --- a/core/js/config.php +++ b/core/js/config.php @@ -16,6 +16,9 @@ header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Enable l10n support $l = OC_L10N::get('core'); +// Enable OC_Defaults support +$defaults = new OC_Defaults(); + // Get the config $apps_paths = array(); foreach(OC_App::getEnabledApps() as $app) { @@ -60,6 +63,20 @@ $array = array( 'session_lifetime' => \OCP\Config::getSystemValue('session_lifetime', 60 * 60 * 24), 'session_keepalive' => \OCP\Config::getSystemValue('session_keepalive', true) ) + ), + "oc_defaults" => json_encode( + array( + 'entity' => $defaults->getEntity(), + 'name' => $defaults->getName(), + 'title' => $defaults->getTitle(), + 'baseUrl' => $defaults->getBaseUrl(), + 'syncClientUrl' => $defaults->getSyncClientUrl(), + 'docBaseUrl' => $defaults->getDocBaseUrl(), + 'slogan' => $defaults->getSlogan(), + 'logoClaim' => $defaults->getLogoClaim(), + 'shortFooter' => $defaults->getShortFooter(), + 'longFooter' => $defaults->getLongFooter() + ) ) ); From 01dc7c5482e6b7486695fdba865a1c88ab05358d Mon Sep 17 00:00:00 2001 From: Guillaume AMAT Date: Thu, 13 Feb 2014 10:48:01 +0100 Subject: [PATCH 014/107] Gets the page title from oc_defaults in Files app --- apps/files/js/filelist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 7691135e620..14f03121ff6 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -23,7 +23,7 @@ window.FileList={ */ setPageTitle: function(title){ // Sets the page title with the " - ownCloud" suffix as in templates - window.document.title = title + ' - ownCloud'; + window.document.title = title + ' - ' + oc_defaults.title; return true; }, From 8387cd8ae35a0ad94a49a27ad8622bb7b8ed2b06 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 12 Feb 2014 17:21:41 +0100 Subject: [PATCH 015/107] Add option to change email settings in admin section Fix issue #7166 --- settings/admin.php | 10 ++++ settings/admin/controller.php | 83 +++++++++++++++++++++++++++++++++ settings/css/settings.css | 12 +++++ settings/js/admin.js | 38 +++++++++++++++ settings/routes.php | 3 ++ settings/templates/admin.php | 88 +++++++++++++++++++++++++++++++++++ 6 files changed, 234 insertions(+) create mode 100644 settings/admin/controller.php diff --git a/settings/admin.php b/settings/admin.php index c0e4570658a..42477bfc1ca 100755 --- a/settings/admin.php +++ b/settings/admin.php @@ -21,6 +21,16 @@ $entries=OC_Log_Owncloud::getEntries(3); $entriesremain = count(OC_Log_Owncloud::getEntries(4)) > 3; $tmpl->assign('loglevel', OC_Config::getValue( "loglevel", 2 )); +$tmpl->assign('mail_domain', OC_Config::getValue( "mail_domain", '' )); +$tmpl->assign('mail_from_address', OC_Config::getValue( "mail_from_address", '' )); +$tmpl->assign('mail_smtpmode', OC_Config::getValue( "mail_smtpmode", '' )); +$tmpl->assign('mail_smtpsecure', OC_Config::getValue( "mail_smtpsecure", '' )); +$tmpl->assign('mail_smtphost', OC_Config::getValue( "mail_smtphost", '' )); +$tmpl->assign('mail_smtpport', OC_Config::getValue( "mail_smtpport", '' )); +$tmpl->assign('mail_smtpauthtype', OC_Config::getValue( "mail_smtpauthtype", '' )); +$tmpl->assign('mail_smtpauth', OC_Config::getValue( "mail_smtpauth", false )); +$tmpl->assign('mail_smtpname', OC_Config::getValue( "mail_smtpname", '' )); +$tmpl->assign('mail_smtppassword', OC_Config::getValue( "mail_smtppassword", '' )); $tmpl->assign('entries', $entries); $tmpl->assign('entriesremain', $entriesremain); $tmpl->assign('htaccessworking', $htaccessworking); diff --git a/settings/admin/controller.php b/settings/admin/controller.php new file mode 100644 index 00000000000..9bbcd356580 --- /dev/null +++ b/settings/admin/controller.php @@ -0,0 +1,83 @@ +. +*/ + +namespace OC\Settings\Admin; + +class Controller { + public static function setMailSettings($args) { + \OC_Util::checkAdminUser(); + \OCP\JSON::callCheck(); + + $l = \OC_L10N::get('settings'); + + $smtp_settings = array( + 'mail_domain' => null, + 'mail_from_address' => null, + 'mail_smtpmode' => array('sendmail', 'smtp', 'qmail', 'php'), + 'mail_smtpsecure' => array('', 'ssl', 'tls'), + 'mail_smtphost' => null, + 'mail_smtpport' => null, + 'mail_smtpauthtype' => array('LOGIN', 'PLAIN', 'NTLM'), + 'mail_smtpauth' => true, + 'mail_smtpname' => null, + 'mail_smtppassword' => null, + ); + + foreach ($smtp_settings as $setting => $validate) { + if (!$validate) { + if (!isset($_POST[$setting]) || $_POST[$setting] === '') { + \OC_Config::deleteKey( $setting ); + } else { + \OC_Config::setValue( $setting, $_POST[$setting] ); + } + } + else if (is_bool($validate)) { + if (!empty($_POST[$setting])) { + \OC_Config::setValue( $setting, (bool) $_POST[$setting] ); + } else { + \OC_Config::deleteKey( $setting ); + } + } + else if (is_array($validate)) { + if (!isset($_POST[$setting]) || $_POST[$setting] === '') { + \OC_Config::deleteKey( $setting ); + } else if (in_array($_POST[$setting], $validate)) { + \OC_Config::setValue( $setting, $_POST[$setting] ); + } else { + $message = $l->t('Invalid value supplied for %s', array(self::getFieldname($setting, $l))); + \OC_JSON::error( array( "data" => array( "message" => $message)) ); + exit; + } + } + } + + \OC_JSON::success(array("data" => array( "message" => $l->t("Saved") ))); + } + + public static function getFieldname($setting, $l) { + switch ($setting) { + case 'mail_smtpmode': + return $l->t( 'SMTP mode' ); + case 'mail_smtpsecure': + return $l->t( 'Secure SMTP' ); + case 'mail_smtpauthtype': + return $l->t( 'Authentification method for SMTP' ); + } + } +} diff --git a/settings/css/settings.css b/settings/css/settings.css index 8a96885b789..ad205e761cb 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -150,6 +150,18 @@ span.connectionwarning {color:#933; font-weight:bold; } input[type=radio] { width:1em; } table.shareAPI td { padding-bottom: 0.8em; } +#mail_settings p label:first-child { + display: inline-block; + width: 300px; + text-align: right; +} +#mail_settings p select:nth-child(2) { + width: 143px; +} +#mail_smtpport { + width: 40px; +} + /* HELP */ .pressed {background-color:#DDD;} diff --git a/settings/js/admin.js b/settings/js/admin.js index e957bd68f1f..f39f53d413a 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -34,4 +34,42 @@ $(document).ready(function(){ $('#security').change(function(){ $.post(OC.filePath('settings','ajax','setsecurity.php'), { enforceHTTPS: $('#forcessl').val() },function(){} ); }); + + $('#mail_smtpauth').change(function() { + if (!this.checked) { + $('#mail_credentials').toggle(false); + } else { + $('#mail_credentials').toggle(true); + } + }); + + $('#mail_settings').change(function(){ + OC.msg.startSaving('#mail_settings .msg'); + var post = $( "#mail_settings" ).serialize(); + $.post(OC.Router.generate('settings_mail_settings'), post, function(data){ + OC.msg.finishedSaving('#mail_settings .msg', data); + }); + }); }); + +OC.msg={ + startSaving:function(selector){ + $(selector) + .html( t('settings', 'Saving...') ) + .removeClass('success') + .removeClass('error') + .stop(true, true) + .show(); + }, + finishedSaving:function(selector, data){ + if( data.status === "success" ){ + $(selector).html( data.data.message ) + .addClass('success') + .stop(true, true) + .delay(3000) + .fadeOut(900); + }else{ + $(selector).html( data.data.message ).addClass('error'); + } + } +}; diff --git a/settings/routes.php b/settings/routes.php index 60f9d8e1001..aa16ad491f8 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -70,6 +70,9 @@ $this->create('settings_ajax_getlog', '/settings/ajax/getlog.php') ->actionInclude('settings/ajax/getlog.php'); $this->create('settings_ajax_setloglevel', '/settings/ajax/setloglevel.php') ->actionInclude('settings/ajax/setloglevel.php'); +$this->create('settings_mail_settings', '/settings/admin/mailsettings') + ->post() + ->action('OC\Settings\Admin\Controller', 'setMailSettings'); $this->create('settings_ajax_setsecurity', '/settings/ajax/setsecurity.php') ->actionInclude('settings/ajax/setsecurity.php'); $this->create('isadmin', '/settings/js/isadmin.js') diff --git a/settings/templates/admin.php b/settings/templates/admin.php index 0eabffb9316..d81840b5b66 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -11,6 +11,27 @@ $levelLabels = array( $l->t( 'Errors and fatal issues' ), $l->t( 'Fatal issues only' ), ); + +$mail_smtpauthtype = array( + '' => $l->t('None'), + 'LOGIN' => $l->t('Login'), + 'PLAIN' => $l->t('Plain'), + 'NTLM' => $l->t('NT LAN Manager'), +); + +$mail_smtpsecure = array( + '' => $l->t('None'), + 'ssl' => $l->t('SSL'), + 'tls' => $l->t('TLS'), +); + +$mail_smtpmode = array( + 'sendmail', + 'smtp', + 'qmail', + 'php', +); + ?> +
+

t('Email Server'));?>

+ +

t('This is used for sending out notifications.')); ?>

+ +

+ + + + + +

+ +

+ + + + /> + +

+ + + +

+ + ' /> + : + ' /> +

+ +

+ + ' /> + @ + ' /> +

+ +
+

t('Log'));?>

t('Log level'));?> - - > $name): $selected = ''; if ($secure == $_['mail_smtpsecure']): @@ -301,7 +301,14 @@ if (!$_['internetconnectionworking']) {

- + + ' /> + @ + ' /> +

+ + - -

- +

-

- - ' /> - @ - ' /> +

From bc1c136cd6c27905d9e9118f355680b26a607eb6 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Feb 2014 10:34:38 +0100 Subject: [PATCH 081/107] coding style fixes: cut long lines, whitespace --- settings/js/apps.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/settings/js/apps.js b/settings/js/apps.js index 2c6f77d9314..26aecbee310 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -207,12 +207,24 @@ OC.Settings.Apps = OC.Settings.Apps || { a.prepend(filename); a.prepend(img); li.append(a); - // append the new app as last item in the list (.push is from sticky footer) + + // append the new app as last item in the list + // (.push is from sticky footer) $('#apps .wrapper .push').before(li); - // scroll the app navigation down so the newly added app is seen - $('#navigation').animate({ scrollTop: $('#navigation').height() }, 'slow'); - // draw attention to the newly added app entry by flashing it twice - container.children('li[data-id="'+entry.id+'"]').animate({opacity:.3}).animate({opacity:1}).animate({opacity:.3}).animate({opacity:1}); + + // scroll the app navigation down + // so the newly added app is seen + $('#navigation').animate({ + scrollTop: $('#navigation').height() + }, 'slow'); + + // draw attention to the newly added app entry + // by flashing it twice + container.children('li[data-id="' + entry.id + '"]') + .animate({opacity: 0.3}) + .animate({opacity: 1}) + .animate({opacity: 0.3}) + .animate({opacity: 1}); if (!SVGSupport() && entry.icon.match(/\.svg$/i)) { $(img).addClass('svg'); From 593adab2583cb70ebccf6e687073c6f4a55baf9e Mon Sep 17 00:00:00 2001 From: kondou Date: Wed, 26 Feb 2014 11:41:32 +0100 Subject: [PATCH 082/107] Fix scrutinizer issue in settings/js/apps.js --- settings/js/apps.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settings/js/apps.js b/settings/js/apps.js index 7c71453e105..b6bd9ee7205 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -248,9 +248,9 @@ $(document).ready(function(){ var item = tgt.is('li') ? $(tgt) : $(tgt).parent(); var app = item.data('app'); OC.Settings.Apps.loadApp(app); + $('#leftcontent .selected').removeClass('selected'); + item.addClass('selected'); } - $('#leftcontent .selected').removeClass('selected'); - item.addClass('selected'); return false; }); $('#rightcontent input.enable').click(function(){ From cb14b1c58dbfc605352193020cdbf19da797bb69 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Feb 2014 11:40:41 +0100 Subject: [PATCH 083/107] Add owncloud version to JS scope Fix #5361 --- core/js/config.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/js/config.php b/core/js/config.php index c606ef35056..7e23f3e2e41 100644 --- a/core/js/config.php +++ b/core/js/config.php @@ -61,8 +61,10 @@ $array = array( "firstDay" => json_encode($l->l('firstday', 'firstday')) , "oc_config" => json_encode( array( - 'session_lifetime' => \OCP\Config::getSystemValue('session_lifetime', ini_get('session.gc_maxlifetime')), - 'session_keepalive' => \OCP\Config::getSystemValue('session_keepalive', true) + 'session_lifetime' => \OCP\Config::getSystemValue('session_lifetime', ini_get('session.gc_maxlifetime')), + 'session_keepalive' => \OCP\Config::getSystemValue('session_keepalive', true), + 'version' => implode('.', OC_Util::getVersion()), + 'versionstring' => OC_Util::getVersionString(), ) ), "oc_defaults" => json_encode( From df1a5a2dfa9757ea723789b32c18e555fa776062 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Feb 2014 12:22:21 +0100 Subject: [PATCH 084/107] Update 3rdparty submodule --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index bbc37618c74..177d3ff656b 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit bbc37618c74a5439f729cc3e8ed369f674cb5415 +Subproject commit 177d3ff656bcf1153b4def12403c5f2d4fc53e73 From 3be5e48b0c255012667c0ba1f334970f62b789a6 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 26 Feb 2014 12:52:35 +0100 Subject: [PATCH 085/107] only add "received_from" if a share was found --- apps/files_sharing/lib/api.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php index 19a2d22b068..0ba58aa896a 100644 --- a/apps/files_sharing/lib/api.php +++ b/apps/files_sharing/lib/api.php @@ -172,12 +172,12 @@ class Api { // workaround because folders are named 'dir' in this context $itemType = $file['type'] === 'file' ? 'file' : 'folder'; $share = \OCP\Share::getItemShared($itemType, $file['fileid']); - $receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']); - if ($receivedFrom) { - $share['received_from'] = $receivedFrom['uid_owner']; - $share['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']); - } - if ($share) { + if($share) { + $receivedFrom = \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']); + if ($receivedFrom) { + $share['received_from'] = $receivedFrom['uid_owner']; + $share['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']); + } $result = array_merge($result, $share); } } From 9847912257de1910f99879caac8ea925fb85caed Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Feb 2014 13:10:46 +0100 Subject: [PATCH 086/107] Remove unused variables, add doc blocks and break lines Fix #7166 --- core/js/js.js | 4 ++-- settings/admin/controller.php | 18 ++++++++++++++---- settings/js/admin.js | 2 +- settings/templates/admin.php | 29 ++++++++++++++++++++--------- 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/core/js/js.js b/core/js/js.js index ac79f13a6d1..88b70723dd1 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -468,8 +468,8 @@ OC.addStyle.loaded=[]; OC.addScript.loaded=[]; OC.msg={ - startSaving:function(selector, message){ - OC.msg.startAction(selector, t('settings', 'Saving...')); + startSaving:function(selector){ + OC.msg.startAction(selector, t('core', 'Saving...')); }, finishedSaving:function(selector, data){ OC.msg.finishedAction(selector, data); diff --git a/settings/admin/controller.php b/settings/admin/controller.php index 9bbcd356580..a075d774361 100644 --- a/settings/admin/controller.php +++ b/settings/admin/controller.php @@ -20,7 +20,10 @@ namespace OC\Settings\Admin; class Controller { - public static function setMailSettings($args) { + /** + * Set mail settings + */ + public static function setMailSettings() { \OC_Util::checkAdminUser(); \OCP\JSON::callCheck(); @@ -70,14 +73,21 @@ class Controller { \OC_JSON::success(array("data" => array( "message" => $l->t("Saved") ))); } + /** + * Get the field name to use it in error messages + * + * @param $setting string + * @param $l \OC_L10N + * @return string + */ public static function getFieldname($setting, $l) { switch ($setting) { case 'mail_smtpmode': - return $l->t( 'SMTP mode' ); + return $l->t( 'Send mode' ); case 'mail_smtpsecure': - return $l->t( 'Secure SMTP' ); + return $l->t( 'Encryption' ); case 'mail_smtpauthtype': - return $l->t( 'Authentification method for SMTP' ); + return $l->t( 'Authentification method' ); } } } diff --git a/settings/js/admin.js b/settings/js/admin.js index e2bc125b8f5..5ea6a5af2df 100644 --- a/settings/js/admin.js +++ b/settings/js/admin.js @@ -44,7 +44,7 @@ $(document).ready(function(){ }); $('#mail_smtpmode').change(function() { - if ($(this).val() != 'smtp') { + if ($(this).val() !== 'smtp') { $('#setting_smtpauth').addClass('hidden'); $('#setting_smtphost').addClass('hidden'); $('#mail_smtpsecure_label').addClass('hidden'); diff --git a/settings/templates/admin.php b/settings/templates/admin.php index 377c05eb4b9..139a9dd076c 100644 --- a/settings/templates/admin.php +++ b/settings/templates/admin.php @@ -288,8 +288,12 @@ if (!$_['internetconnectionworking']) { - - > $name): $selected = ''; if ($secure == $_['mail_smtpsecure']): @@ -302,9 +306,11 @@ if (!$_['internetconnectionworking']) {

- ' /> + ' /> @ - ' /> + ' />

From 6c5cc4638008d08f4f933db775348fe9d1db57f9 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Wed, 26 Feb 2014 14:48:15 +0100 Subject: [PATCH 087/107] disable autocomplete for shared link password input, fix #7419 --- apps/files_sharing/templates/authenticate.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php index 928be93fc96..19b1fb27630 100644 --- a/apps/files_sharing/templates/authenticate.php +++ b/apps/files_sharing/templates/authenticate.php @@ -8,7 +8,10 @@

- +

From 86b3cdc132a2ae19caf327985d5613a58804d1b5 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Wed, 26 Feb 2014 17:18:38 +0100 Subject: [PATCH 088/107] close encryption session after decryption was finished --- apps/files_encryption/lib/session.php | 8 ++++++++ apps/files_encryption/lib/util.php | 8 ++++++++ settings/ajax/decryptall.php | 2 ++ 3 files changed, 18 insertions(+) diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php index aa58e33e9d2..3daaa06425f 100644 --- a/apps/files_encryption/lib/session.php +++ b/apps/files_encryption/lib/session.php @@ -134,6 +134,14 @@ class Session { } + /** + * @brief remove encryption keys and init status from session + */ + public function closeSession() { + \OC::$session->remove('encryptionInitialized'); + \OC::$session->remove('privateKey'); + } + /** * @brief Gets status if we already tried to initialize the encryption app diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index ec06bd52f5e..6bf69cd8ee1 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -1772,4 +1772,12 @@ class Util { return $session; } + /* + * @brief remove encryption related keys from the session + */ + public function closeEncryptionSession() { + $session = new \OCA\Encryption\Session($this->view); + $session->closeSession(); + } + } diff --git a/settings/ajax/decryptall.php b/settings/ajax/decryptall.php index d7c104ab151..4782a4cfc81 100644 --- a/settings/ajax/decryptall.php +++ b/settings/ajax/decryptall.php @@ -24,6 +24,8 @@ if ($result !== false) { $successful = false; } + $util->closeEncryptionSession(); + if ($successful === true) { \OCP\JSON::success(array('data' => array('message' => 'Files decrypted successfully'))); } else { From 922c1909f828d32c74d4f465ec302610c7818a39 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 26 Feb 2014 15:19:42 +0100 Subject: [PATCH 089/107] Translate string when an error occured while sending a forgot password mail Fix #7423 --- core/lostpassword/controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/lostpassword/controller.php b/core/lostpassword/controller.php index fd20c6ba249..c858696885b 100644 --- a/core/lostpassword/controller.php +++ b/core/lostpassword/controller.php @@ -69,7 +69,7 @@ class Controller { $defaults = new \OC_Defaults(); \OC_Mail::send($email, $_POST['user'], $l->t('%s password reset', array($defaults->getName())), $msg, $from, $defaults->getName()); } catch (Exception $e) { - \OC_Template::printErrorPage( 'A problem occurs during sending the e-mail please contact your administrator.'); + \OC_Template::printErrorPage( $l->t('A problem has occurred whilst sending the email, please contact your administrator.') ); } self::displayLostPasswordPage(false, true); } else { From 459b5086d56d97b2ccf42b1fd50a7924883b6c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Feb 2014 20:42:45 +0100 Subject: [PATCH 090/107] adding test for migrations on columns using keywords --- tests/data/db_structure.xml | 15 +++++++++++++++ tests/data/db_structure2.xml | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/tests/data/db_structure.xml b/tests/data/db_structure.xml index d98066c4b7e..5fffd5475f9 100644 --- a/tests/data/db_structure.xml +++ b/tests/data/db_structure.xml @@ -223,4 +223,19 @@ + + *dbprefix*migratekeyword + + + + + key + text + + true + 255 + + +
+ diff --git a/tests/data/db_structure2.xml b/tests/data/db_structure2.xml index ae5f22e9573..aa6e94a2a84 100644 --- a/tests/data/db_structure2.xml +++ b/tests/data/db_structure2.xml @@ -119,4 +119,19 @@ + + *dbprefix*migratekeyword + + + + + key + text + + false + 255 + + +
+ From 230e5e3788f8289447602b70e2445c134e532e0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Feb 2014 20:47:07 +0100 Subject: [PATCH 091/107] let's name the column 'select' because this is a keyword on all platforms --- tests/data/db_structure.xml | 2 +- tests/data/db_structure2.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/data/db_structure.xml b/tests/data/db_structure.xml index 5fffd5475f9..858c9ab1002 100644 --- a/tests/data/db_structure.xml +++ b/tests/data/db_structure.xml @@ -229,7 +229,7 @@ - key + select text true diff --git a/tests/data/db_structure2.xml b/tests/data/db_structure2.xml index aa6e94a2a84..568d90ab0a9 100644 --- a/tests/data/db_structure2.xml +++ b/tests/data/db_structure2.xml @@ -125,7 +125,7 @@ - key + select text false From ab850b961dd576a4caf7c2269d8559fdbe6d62e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 26 Feb 2014 23:56:46 +0100 Subject: [PATCH 092/107] remove unused code and fix wrong variable names - some PHPDoc updated --- lib/private/image.php | 31 ++++++++----------------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/lib/private/image.php b/lib/private/image.php index 17caaa012f5..da32aa4760f 100644 --- a/lib/private/image.php +++ b/lib/private/image.php @@ -41,8 +41,7 @@ class OC_Image { // exif_imagetype throws "read error!" if file is less than 12 byte if (filesize($filePath) > 11) { $imageType = exif_imagetype($filePath); - } - else { + } else { $imageType = false; } return $imageType ? image_type_to_mime_type($imageType) : ''; @@ -50,7 +49,7 @@ class OC_Image { /** * @brief Constructor. - * @param $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function. + * @param string|resource $imageref The path to a local file, a base64 encoded string or a resource created by an imagecreate* function. * @returns bool False on error */ public function __construct($imageRef = null) { @@ -115,13 +114,11 @@ class OC_Image { case 3: case 4: // Not tested return $this->width(); - break; case 5: // Not tested case 6: case 7: // Not tested case 8: return $this->height(); - break; } return $this->width(); } @@ -140,13 +137,11 @@ class OC_Image { case 3: case 4: // Not tested return $this->height(); - break; case 5: // Not tested case 6: case 7: // Not tested case 8: return $this->width(); - break; } return $this->height(); } @@ -197,7 +192,6 @@ class OC_Image { return false; } - $retVal = false; switch($this->imageType) { case IMAGETYPE_GIF: $retVal = imagegif($this->resource, $filePath); @@ -264,8 +258,8 @@ class OC_Image { } /** - * @returns Returns a base64 encoded string suitable for embedding in a VCard. - */ + * @return string - base64 encoded, which is suitable for embedding in a VCard. + */ function __toString() { return base64_encode($this->data()); } @@ -307,43 +301,33 @@ class OC_Image { $o = $this->getOrientation(); OC_Log::write('core', 'OC_Image->fixOrientation() Orientation: '.$o, OC_Log::DEBUG); $rotate = 0; - $flip = false; switch($o) { case -1: return false; //Nothing to fix - break; case 1: $rotate = 0; - $flip = false; break; case 2: // Not tested $rotate = 0; - $flip = true; break; case 3: $rotate = 180; - $flip = false; break; case 4: // Not tested $rotate = 180; - $flip = true; break; case 5: // Not tested $rotate = 90; - $flip = true; break; case 6: //$rotate = 90; $rotate = 270; - $flip = false; break; case 7: // Not tested $rotate = 270; - $flip = true; break; case 8: $rotate = 90; - $flip = false; break; } if($rotate) { @@ -367,6 +351,7 @@ class OC_Image { return false; } } + return false; } /** @@ -599,9 +584,9 @@ class OC_Image { $meta['imagesize'] = $meta['filesize'] - $meta['offset']; // in rare cases filesize is equal to offset so we need to read physical size if ($meta['imagesize'] < 1) { - $meta['imagesize'] = @filesize($filename) - $meta['offset']; + $meta['imagesize'] = @filesize($fileName) - $meta['offset']; if ($meta['imagesize'] < 1) { - trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); + trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $fileName . '!', E_USER_WARNING); return false; } } @@ -947,7 +932,7 @@ if ( ! function_exists( 'imagebmp') ) { $index = imagecolorat($im, $i, $j); if ($index !== $lastIndex || $sameNum > 255) { if ($sameNum != 0) { - $bmpData .= chr($same_num) . chr($lastIndex); + $bmpData .= chr($sameNum) . chr($lastIndex); } $lastIndex = $index; $sameNum = 1; From 22adc397dea060150e6982ba9dda1483eebbfa67 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 26 Feb 2014 16:26:16 +0100 Subject: [PATCH 093/107] Also quote old column name during DB migration This fixes alter table commands that didn't quote the old column name --- lib/private/db/mdb2schemamanager.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/private/db/mdb2schemamanager.php b/lib/private/db/mdb2schemamanager.php index c050d47b499..aaf2ea543b9 100644 --- a/lib/private/db/mdb2schemamanager.php +++ b/lib/private/db/mdb2schemamanager.php @@ -82,6 +82,9 @@ class MDB2SchemaManager { $platform = $this->conn->getDatabasePlatform(); foreach($schemaDiff->changedTables as $tableDiff) { $tableDiff->name = $platform->quoteIdentifier($tableDiff->name); + foreach($tableDiff->changedColumns as $column) { + $column->oldColumnName = $platform->quoteIdentifier($column->oldColumnName); + } } if ($generateSql) { From 39f2f564a99ebe719748f349aafe92ed9910bc0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 27 Feb 2014 09:39:34 +0100 Subject: [PATCH 094/107] use assertSame and assertNotSame for etag checks --- apps/files_encryption/tests/util.php | 4 +-- tests/lib/appframework/http/ResponseTest.php | 2 +- tests/lib/files/cache/scanner.php | 28 +++++++++++++------- tests/lib/files/etagtest.php | 6 ++++- tests/lib/files/view.php | 2 +- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php index f70e30c4d73..203ba55dbfd 100755 --- a/apps/files_encryption/tests/util.php +++ b/apps/files_encryption/tests/util.php @@ -344,7 +344,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // check if mtime and etags unchanged $this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']); - $this->assertEquals($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']); + $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']); $this->view->unlink($this->userId . '/files/' . $filename); } @@ -373,7 +373,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // check if mtime and etags unchanged $this->assertEquals($fileInfoEncrypted['mtime'], $fileInfoUnencrypted['mtime']); - $this->assertEquals($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']); + $this->assertSame($fileInfoEncrypted['etag'], $fileInfoUnencrypted['etag']); // file should no longer be encrypted $this->assertEquals(0, $fileInfoUnencrypted['encrypted']); diff --git a/tests/lib/appframework/http/ResponseTest.php b/tests/lib/appframework/http/ResponseTest.php index 4f21d77a170..063ab8b5d33 100644 --- a/tests/lib/appframework/http/ResponseTest.php +++ b/tests/lib/appframework/http/ResponseTest.php @@ -78,7 +78,7 @@ class ResponseTest extends \PHPUnit_Framework_TestCase { public function testGetEtag() { $this->childResponse->setEtag('hi'); - $this->assertEquals('hi', $this->childResponse->getEtag()); + $this->assertSame('hi', $this->childResponse->getEtag()); } diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php index 3f5604b4d45..9df98c36fa8 100644 --- a/tests/lib/files/cache/scanner.php +++ b/tests/lib/files/cache/scanner.php @@ -150,13 +150,15 @@ class Scanner extends \PHPUnit_Framework_TestCase { $this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder'), 'storage_mtime' => $this->storage->filemtime('folder'))); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); - $this->assertNotEquals($oldData['etag'], $newData['etag']); + $this->assertTrue(is_string($oldData['etag']), 'Expected a string'); + $this->assertTrue(is_string($newData['etag']), 'Expected a string'); + $this->assertNotSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); $oldData = $newData; $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); $newData = $this->cache->get(''); - $this->assertEquals($oldData['etag'], $newData['etag']); + $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals(-1, $newData['size']); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE); @@ -164,17 +166,17 @@ class Scanner extends \PHPUnit_Framework_TestCase { $this->assertNotEquals(-1, $oldData['size']); $this->scanner->scanFile('', \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); - $this->assertEquals($oldData['etag'], $newData['etag']); + $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_RECURSIVE, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); - $this->assertEquals($oldData['etag'], $newData['etag']); + $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG + \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); - $this->assertEquals($oldData['etag'], $newData['etag']); + $this->assertSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); } @@ -217,8 +219,11 @@ class Scanner extends \PHPUnit_Framework_TestCase { // manipulate etag to simulate an empty etag $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); $data0 = $this->cache->get('folder/bar.txt'); + $this->assertTrue(is_string($data0['etag']), 'Expected a string'); $data1 = $this->cache->get('folder'); + $this->assertTrue(is_string($data1['etag']), 'Expected a string'); $data2 = $this->cache->get(''); + $this->assertTrue(is_string($data2['etag']), 'Expected a string'); $data0['etag'] = ''; $this->cache->put('folder/bar.txt', $data0); @@ -227,10 +232,15 @@ class Scanner extends \PHPUnit_Framework_TestCase { // verify cache content $newData0 = $this->cache->get('folder/bar.txt'); - $newData1 = $this->cache->get('folder'); - $newData2 = $this->cache->get(''); + $this->assertTrue(is_string($newData0['etag']), 'Expected a string'); $this->assertNotEmpty($newData0['etag']); - $this->assertNotEquals($data1['etag'], $newData1['etag']); - $this->assertNotEquals($data2['etag'], $newData2['etag']); + + $newData1 = $this->cache->get('folder'); + $this->assertTrue(is_string($newData1['etag']), 'Expected a string'); + $this->assertNotSame($data1['etag'], $newData1['etag']); + + $newData2 = $this->cache->get(''); + $this->assertTrue(is_string($newData2['etag']), 'Expected a string'); + $this->assertNotSame($data2['etag'], $newData2['etag']); } } diff --git a/tests/lib/files/etagtest.php b/tests/lib/files/etagtest.php index ce05adb188a..af9f66835f0 100644 --- a/tests/lib/files/etagtest.php +++ b/tests/lib/files/etagtest.php @@ -65,7 +65,11 @@ class EtagTest extends \PHPUnit_Framework_TestCase { $scanner = new \OC\Files\Utils\Scanner($user1); $scanner->backgroundScan('/'); - $this->assertEquals($originalEtags, $this->getEtags($files)); + $newEtags = $this->getEtags($files); + // loop over array and use assertSame over assertEquals to prevent false positives + foreach ($originalEtags as $file => $originalEtag) { + $this->assertSame($originalEtag, $newEtags[$file]); + } } /** diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php index 371d1ed1798..c85f1128dbe 100644 --- a/tests/lib/files/view.php +++ b/tests/lib/files/view.php @@ -563,6 +563,6 @@ class View extends \PHPUnit_Framework_TestCase { $scanner->scanFile('test', \OC\Files\Cache\Scanner::REUSE_ETAG); $info2 = $view->getFileInfo('/test/test'); - $this->assertEquals($info['etag'], $info2['etag']); + $this->assertSame($info['etag'], $info2['etag']); } } From 131c12ad8d51c4a0acad03299bd617907c9f1d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 27 Feb 2014 09:51:26 +0100 Subject: [PATCH 095/107] use assertInternalType for typechecking --- tests/lib/files/cache/scanner.php | 16 +++--- tests/lib/files/cache/updater.php | 84 +++++++++++++++++++++++-------- 2 files changed, 71 insertions(+), 29 deletions(-) diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php index 9df98c36fa8..5182fac8b10 100644 --- a/tests/lib/files/cache/scanner.php +++ b/tests/lib/files/cache/scanner.php @@ -150,8 +150,8 @@ class Scanner extends \PHPUnit_Framework_TestCase { $this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder'), 'storage_mtime' => $this->storage->filemtime('folder'))); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); - $this->assertTrue(is_string($oldData['etag']), 'Expected a string'); - $this->assertTrue(is_string($newData['etag']), 'Expected a string'); + $this->assertInternalType('string', $oldData['etag']); + $this->assertInternalType('string', $newData['etag']); $this->assertNotSame($oldData['etag'], $newData['etag']); $this->assertEquals($oldData['size'], $newData['size']); @@ -219,11 +219,11 @@ class Scanner extends \PHPUnit_Framework_TestCase { // manipulate etag to simulate an empty etag $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_ETAG); $data0 = $this->cache->get('folder/bar.txt'); - $this->assertTrue(is_string($data0['etag']), 'Expected a string'); + $this->assertInternalType('string', $data0['etag']); $data1 = $this->cache->get('folder'); - $this->assertTrue(is_string($data1['etag']), 'Expected a string'); + $this->assertInternalType('string', $data1['etag']); $data2 = $this->cache->get(''); - $this->assertTrue(is_string($data2['etag']), 'Expected a string'); + $this->assertInternalType('string', $data2['etag']); $data0['etag'] = ''; $this->cache->put('folder/bar.txt', $data0); @@ -232,15 +232,15 @@ class Scanner extends \PHPUnit_Framework_TestCase { // verify cache content $newData0 = $this->cache->get('folder/bar.txt'); - $this->assertTrue(is_string($newData0['etag']), 'Expected a string'); + $this->assertInternalType('string', $newData0['etag']); $this->assertNotEmpty($newData0['etag']); $newData1 = $this->cache->get('folder'); - $this->assertTrue(is_string($newData1['etag']), 'Expected a string'); + $this->assertInternalType('string', $newData1['etag']); $this->assertNotSame($data1['etag'], $newData1['etag']); $newData2 = $this->cache->get(''); - $this->assertTrue(is_string($newData2['etag']), 'Expected a string'); + $this->assertInternalType('string', $newData2['etag']); $this->assertNotSame($data2['etag'], $newData2['etag']); } } diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php index 48986149a73..57c799e608b 100644 --- a/tests/lib/files/cache/updater.php +++ b/tests/lib/files/cache/updater.php @@ -96,10 +96,14 @@ class Updater extends \PHPUnit_Framework_TestCase { Filesystem::file_put_contents('foo.txt', 'asd'); $cachedData = $this->cache->get('foo.txt'); $this->assertEquals(3, $cachedData['size']); - $this->assertNotEquals($fooCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $fooCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($fooCachedData['etag'], $cachedData['etag']); $cachedData = $this->cache->get(''); $this->assertEquals(2 * $textSize + $imageSize + 3, $cachedData['size']); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $rootCachedData = $cachedData; $this->assertFalse($this->cache->inCache('bar.txt')); @@ -110,7 +114,9 @@ class Updater extends \PHPUnit_Framework_TestCase { $mtime = $cachedData['mtime']; $cachedData = $this->cache->get(''); $this->assertEquals(2 * $textSize + $imageSize + 2 * 3, $cachedData['size']); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $mtime); } @@ -127,11 +133,15 @@ class Updater extends \PHPUnit_Framework_TestCase { $mtime = $cachedData['mtime']; $cachedData = $cache2->get(''); - $this->assertNotEquals($substorageCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $substorageCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); $this->assertEquals($mtime, $cachedData['mtime']); $cachedData = $this->cache->get('folder'); - $this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $folderCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); $this->assertEquals($mtime, $cachedData['mtime']); } @@ -146,19 +156,25 @@ class Updater extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->cache->inCache('foo.txt')); $cachedData = $this->cache->get(''); $this->assertEquals(2 * $textSize + $imageSize, $cachedData['size']); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $cachedData['mtime']); $rootCachedData = $cachedData; Filesystem::mkdir('bar_folder'); $this->assertTrue($this->cache->inCache('bar_folder')); $cachedData = $this->cache->get(''); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $rootCachedData = $cachedData; Filesystem::rmdir('bar_folder'); $this->assertFalse($this->cache->inCache('bar_folder')); $cachedData = $this->cache->get(''); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $cachedData['mtime']); } @@ -174,11 +190,15 @@ class Updater extends \PHPUnit_Framework_TestCase { $this->assertFalse($cache2->inCache('foo.txt')); $cachedData = $cache2->get(''); - $this->assertNotEquals($substorageCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $substorageCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($substorageCachedData['mtime'], $cachedData['mtime']); $cachedData = $this->cache->get('folder'); - $this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $folderCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($folderCachedData['mtime'], $cachedData['mtime']); } @@ -199,7 +219,9 @@ class Updater extends \PHPUnit_Framework_TestCase { $mtime = $cachedData['mtime']; $cachedData = $this->cache->get(''); $this->assertEquals(3 * $textSize + $imageSize, $cachedData['size']); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); } public function testRenameExtension() { @@ -227,12 +249,16 @@ class Updater extends \PHPUnit_Framework_TestCase { $mtime = $cachedData['mtime']; $cachedData = $cache2->get(''); - $this->assertNotEquals($substorageCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $substorageCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); // rename can cause mtime change - invalid assert // $this->assertEquals($mtime, $cachedData['mtime']); $cachedData = $this->cache->get('folder'); - $this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $folderCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); // rename can cause mtime change - invalid assert // $this->assertEquals($mtime, $cachedData['mtime']); } @@ -242,11 +268,15 @@ class Updater extends \PHPUnit_Framework_TestCase { $fooCachedData = $this->cache->get('foo.txt'); Filesystem::touch('foo.txt'); $cachedData = $this->cache->get('foo.txt'); - $this->assertNotEquals($fooCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $fooCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($fooCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($fooCachedData['mtime'], $cachedData['mtime']); $cachedData = $this->cache->get(''); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $this->assertGreaterThanOrEqual($rootCachedData['mtime'], $cachedData['mtime']); $rootCachedData = $cachedData; @@ -255,14 +285,20 @@ class Updater extends \PHPUnit_Framework_TestCase { $folderCachedData = $this->cache->get('folder'); Filesystem::touch('folder/bar.txt', $time); $cachedData = $this->cache->get('folder/bar.txt'); - $this->assertNotEquals($barCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $barCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($barCachedData['etag'], $cachedData['etag']); $this->assertEquals($time, $cachedData['mtime']); $cachedData = $this->cache->get('folder'); - $this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $folderCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); $cachedData = $this->cache->get(''); - $this->assertNotEquals($rootCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $rootCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($rootCachedData['etag'], $cachedData['etag']); $this->assertEquals($time, $cachedData['mtime']); } @@ -279,14 +315,20 @@ class Updater extends \PHPUnit_Framework_TestCase { $time = 1371006070; Filesystem::touch('folder/substorage/foo.txt', $time); $cachedData = $cache2->get('foo.txt'); - $this->assertNotEquals($fooCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $fooCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($fooCachedData['etag'], $cachedData['etag']); $this->assertEquals($time, $cachedData['mtime']); $cachedData = $cache2->get(''); - $this->assertNotEquals($substorageCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $substorageCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($substorageCachedData['etag'], $cachedData['etag']); $cachedData = $this->cache->get('folder'); - $this->assertNotEquals($folderCachedData['etag'], $cachedData['etag']); + $this->assertInternalType('string', $folderCachedData['etag']); + $this->assertInternalType('string', $cachedData['etag']); + $this->assertNotSame($folderCachedData['etag'], $cachedData['etag']); $this->assertEquals($time, $cachedData['mtime']); } From f0cd08ab5d819bd11640dc51338f4ee3d52a623f Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Feb 2014 12:13:09 +0100 Subject: [PATCH 096/107] remove border from log in input fields, simpler and works better with themes --- core/css/styles.css | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/core/css/styles.css b/core/css/styles.css index 341a507ce37..082d2c714cf 100644 --- a/core/css/styles.css +++ b/core/css/styles.css @@ -405,11 +405,9 @@ input[name="adminpass-clone"] { padding-left:1.8em; width:11.7em !important; } /* General new input field look */ #body-login input[type="text"], #body-login input[type="password"], -#body-login input[type="email"] { - border: 1px solid #323233; - border-radius: 5px; -} -#body-login input[type='submit'] { +#body-login input[type="email"], +#body-login input[type="submit"] { + border: none; border-radius: 5px; } From a5a671392c4a86fb865ba36e5e1cd0539fb26ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Thu, 27 Feb 2014 12:16:58 +0100 Subject: [PATCH 097/107] rename config to camelcase --- .jshintrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jshintrc b/.jshintrc index f40dd22b5fd..90cec5c5961 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,5 +1,5 @@ { - "camelCase": true, + "camelcase": true, "eqeqeq": true, "immed": true, "latedef": false, From af467d92f642309fdd13a305367ad11cd6976a62 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Feb 2014 12:21:05 +0100 Subject: [PATCH 098/107] Installation: relabel 'Advanced' to more descriptive 'Storage & database' --- core/templates/installation.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/templates/installation.php b/core/templates/installation.php index d3adb34f412..d9f3c38ab11 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -67,7 +67,7 @@ 0): ?>
- t( 'Advanced' )); ?> + t( 'Storage & database' )); ?>
From 2ba6cd4e2b779d43424fd2a037319923749666d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Thu, 27 Feb 2014 12:42:53 +0100 Subject: [PATCH 099/107] initialize etags of temporary storage --- tests/lib/files/cache/updater.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php index 57c799e608b..a6ee8c46661 100644 --- a/tests/lib/files/cache/updater.php +++ b/tests/lib/files/cache/updater.php @@ -122,6 +122,7 @@ class Updater extends \PHPUnit_Framework_TestCase { public function testWriteWithMountPoints() { $storage2 = new \OC\Files\Storage\Temporary(array()); + $storage2->getScanner()->scan(''); //initialize etags $cache2 = $storage2->getCache(); Filesystem::mount($storage2, array(), '/' . self::$user . '/files/folder/substorage'); $folderCachedData = $this->cache->get('folder'); From 58bc6aee51a5b380ae8943c489f6fdd7434bcc42 Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Thu, 27 Feb 2014 12:48:25 +0100 Subject: [PATCH 100/107] icons: automatically show delete hover instead of using explicit class --- core/css/icons.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/css/icons.css b/core/css/icons.css index 814749c5af8..d3d4d7da709 100644 --- a/core/css/icons.css +++ b/core/css/icons.css @@ -66,7 +66,8 @@ .icon-delete { background-image: url('../img/actions/delete.svg'); } -.icon-delete-hover { +.icon-delete:hover, +.icon-delete:focus { background-image: url('../img/actions/delete-hover.svg'); } From 7c92e2e3ad9555746aca7df38431a56bc4aced83 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 27 Feb 2014 14:04:19 +0100 Subject: [PATCH 101/107] Update rawlist to work with new fileinfo object --- apps/files/ajax/rawlist.php | 59 +++++++++++++++----------------- lib/private/files/filesystem.php | 2 +- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/apps/files/ajax/rawlist.php b/apps/files/ajax/rawlist.php index 40da32b223a..89c21a172fc 100644 --- a/apps/files/ajax/rawlist.php +++ b/apps/files/ajax/rawlist.php @@ -1,12 +1,12 @@ getPreviewManager()->isMimeSupported($file['mimetype']); - $file["date"] = OCP\Util::formatDate($file["mtime"]); - $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); - $files[] = $file; - } +if ($mimetypes && !in_array('httpd/unix-directory', $mimetypes)) { + $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir, 'httpd/unix-directory')); } if (is_array($mimetypes) && count($mimetypes)) { foreach ($mimetypes as $mimetype) { - foreach( \OC\Files\Filesystem::getDirectoryContent( $dir, $mimetype ) as $file ) { - $file['directory'] = $dir; - $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']); - $file["date"] = OCP\Util::formatDate($file["mtime"]); - $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); - $files[] = $file; - } + $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir, $mimetype)); } } else { - foreach( \OC\Files\Filesystem::getDirectoryContent( $dir ) as $file ) { - $file['directory'] = $dir; - $file['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file['mimetype']); - $file["date"] = OCP\Util::formatDate($file["mtime"]); - $file['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); - $files[] = $file; - } + $files = array_merge($files, \OC\Files\Filesystem::getDirectoryContent($dir)); +} + +$result = array(); +foreach ($files as $file) { + $fileData = array(); + $fileData['directory'] = $dir; + $fileData['name'] = $file->getName(); + $fileData['type'] = $file->getType(); + $fileData['path'] = $file['path']; + $fileData['id'] = $file->getId(); + $fileData['size'] = $file->getSize(); + $fileData['mtime'] = $file->getMtime(); + $fileData['mimetype'] = $file->getMimetype(); + $fileData['isPreviewAvailable'] = \OC::$server->getPreviewManager()->isMimeSupported($file->getMimetype()); + $fileData["date"] = OCP\Util::formatDate($file->getMtime()); + $fileData['mimetype_icon'] = \OCA\Files\Helper::determineIcon($file); + $result[] = $fileData; } // Sort by name -usort($files, function ($a, $b) { - if ($a['name'] === $b['name']) { - return 0; - } - return ($a['name'] < $b['name']) ? -1 : 1; -}); +usort($result, array('\OCA\Files\Helper', 'fileCmp')); -OC_JSON::success(array('data' => $files)); +OC_JSON::success(array('data' => $result)); diff --git a/lib/private/files/filesystem.php b/lib/private/files/filesystem.php index 7f7b6f7f468..6478854eae8 100644 --- a/lib/private/files/filesystem.php +++ b/lib/private/files/filesystem.php @@ -761,7 +761,7 @@ class Filesystem { * * @param string $directory path under datadirectory * @param string $mimetype_filter limit returned content to this mimetype or mimepart - * @return array + * @return \OC\Files\FileInfo[] */ public static function getDirectoryContent($directory, $mimetype_filter = '') { return self::$defaultInstance->getDirectoryContent($directory, $mimetype_filter); From 4ace1a273d705a21736f92ba3a38f08d8465bca0 Mon Sep 17 00:00:00 2001 From: Bjoern Schiessle Date: Thu, 27 Feb 2014 13:58:51 +0100 Subject: [PATCH 102/107] remember original fopen access type in pre-proxy because sometimes they change during the fopen call, e.g. 'r' becomes 'r+' if we open an URL --- apps/files_encryption/lib/proxy.php | 32 ++++++++++++++++++++++------ apps/files_encryption/lib/stream.php | 3 +++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 9d456f6c517..3b9a1f08338 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -38,6 +38,7 @@ class Proxy extends \OC_FileProxy { private static $blackList = null; //mimetypes blacklisted from encryption private static $unencryptedSizes = array(); // remember unencrypted size + private static $fopenMode = array(); // remember the fopen mode /** * Check if a file requires encryption @@ -213,6 +214,16 @@ class Proxy extends \OC_FileProxy { return true; } + /** + * @brief remember initial fopen mode because sometimes it gets changed during the request + * @param string $path path + * @param string $mode type of access + */ + public function preFopen($path, $mode) { + self::$fopenMode[$path] = $mode; + } + + /** * @param $path * @param $result @@ -240,7 +251,15 @@ class Proxy extends \OC_FileProxy { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $meta = stream_get_meta_data($result); + // if we remember the mode from the pre proxy we re-use it + // oterwise we fall back to stream_get_meta_data() + if (isset(self::$fopenMode[$path])) { + $mode = self::$fopenMode[$path]; + unset(self::$fopenMode[$path]); + } else { + $meta = stream_get_meta_data($result); + $mode = $meta['mode']; + } $view = new \OC_FilesystemView(''); @@ -258,14 +277,15 @@ class Proxy extends \OC_FileProxy { // Open the file using the crypto stream wrapper // protocol and let it do the decryption work instead - $result = fopen('crypt://' . $path, $meta['mode']); + $result = fopen('crypt://' . $path, $mode); } elseif ( - self::shouldEncrypt($path) - and $meta['mode'] !== 'r' - and $meta['mode'] !== 'rb' + self::shouldEncrypt($path) + and $mode !== 'r' + and $mode !== 'rb' + ) { - $result = fopen('crypt://' . $path, $meta['mode']); + $result = fopen('crypt://' . $path, $mode); } // Re-enable the proxy diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php index 88eacc6f136..58ac03373a7 100644 --- a/apps/files_encryption/lib/stream.php +++ b/apps/files_encryption/lib/stream.php @@ -167,6 +167,9 @@ class Stream { } else { $this->meta = stream_get_meta_data($this->handle); + // sometimes fopen changes the mode, e.g. for a url "r" convert to "r+" + // but we need to remember the original access type + $this->meta['mode'] = $mode; } From 49b331be39162bbca738cadfedd6042028613b94 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Thu, 27 Feb 2014 14:39:16 +0100 Subject: [PATCH 103/107] add BMP mimetype for BMP previews --- lib/private/mimetypes.list.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/private/mimetypes.list.php b/lib/private/mimetypes.list.php index 9bd07b89023..a216414c9dd 100644 --- a/lib/private/mimetypes.list.php +++ b/lib/private/mimetypes.list.php @@ -31,6 +31,7 @@ return array( 'bash' => 'text/x-shellscript', 'blend' => 'application/x-blender', 'bin' => 'application/x-bin', + 'bmp' => 'image/bmp', 'cb7' => 'application/x-cbr', 'cba' => 'application/x-cbr', 'cbr' => 'application/x-cbr', From fefd7248585e2831adfb1ae9d40c49e94529e36d Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 27 Feb 2014 19:50:16 +0100 Subject: [PATCH 104/107] Fixed wrong field name This re-fixes an issue where the unencrypted size isn't updated correctly when saving a text file in the UI multiple times. Fixes #7467 --- apps/files_encryption/lib/proxy.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 9d456f6c517..6b1e4b7745b 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -146,7 +146,7 @@ class Proxy extends \OC_FileProxy { if ( isset(self::$unencryptedSizes[$normalizedPath]) ) { $view = new \OC_FilesystemView('/'); $view->putFileInfo($normalizedPath, - array('encrypted' => true, 'encrypted_size' => self::$unencryptedSizes[$normalizedPath])); + array('encrypted' => true, 'unencrypted_size' => self::$unencryptedSizes[$normalizedPath])); unset(self::$unencryptedSizes[$normalizedPath]); } From e78da036c11b600bfcf15387ecb053a87150444a Mon Sep 17 00:00:00 2001 From: Jan-Christoph Borchardt Date: Fri, 28 Feb 2014 10:09:34 +0100 Subject: [PATCH 105/107] profile image: relabel technical 'Abort' to more widely used 'Cancel' --- settings/templates/personal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 188ff75f96b..470b8180bcc 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -108,7 +108,7 @@ if($_['passwordChangeSupported']) { From 4c4bb70cb67fb20739ec48fc2d06400485413dda Mon Sep 17 00:00:00 2001 From: Lukas Reschke Date: Fri, 28 Feb 2014 11:14:18 +0100 Subject: [PATCH 106/107] CSS is now loaded directly instead via PHP 269f24cf9617397aaf501b27ec1af2c8e3154cf8 was not changed in setup.php which prevented loading of CSS files in some environments (e.g. my local setup) for apps. --- lib/private/setup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/private/setup.php b/lib/private/setup.php index 3906204bda3..0d5bf424b33 100644 --- a/lib/private/setup.php +++ b/lib/private/setup.php @@ -147,7 +147,7 @@ class OC_Setup { $content.= "RewriteRule ^.well-known/host-meta /public.php?service=host-meta [QSA,L]\n"; $content.= "RewriteRule ^.well-known/carddav /remote.php/carddav/ [R]\n"; $content.= "RewriteRule ^.well-known/caldav /remote.php/caldav/ [R]\n"; - $content.= "RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L]\n"; + $content.= "RewriteRule ^apps/([^/]*)/(.*\.(php))$ index.php?app=$1&getfile=$2 [QSA,L]\n"; $content.= "RewriteRule ^remote/(.*) remote.php [QSA,L]\n"; $content.= "\n"; $content.= "\n"; From 1dcb4f740a566d570f636e665f0973ff38042259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Fri, 28 Feb 2014 16:55:50 +0100 Subject: [PATCH 107/107] Update SabreDAV to 1.7.11 --- 3rdparty | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty b/3rdparty index 177d3ff656b..c77c4ddbd4a 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 177d3ff656bcf1153b4def12403c5f2d4fc53e73 +Subproject commit c77c4ddbd4ae86a307d073647e76d602eafd0c64