From bb5969781aeae333d997103c30ebfb6ba0b13413 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Thu, 22 Sep 2016 20:02:07 +0200 Subject: [PATCH 01/25] [5.7] Add configuration option to fallback to previous locale (#4388) * Add configuration option to fallback to previous locale If the new configuration option 'concrete.multilingual.use_previous_locale' is set to true, let's reuse the previously used locale. * Ensure current locale selected in switch_language Former-commit-id: d05b780832b92d60abaf9d419d4bb2d5e656d168 Former-commit-id: 66ef4b6409276fa3d6b10781edac5318bb4e3ca8 --- .../blocks/switch_language/controller.php | 12 ++-- .../src/Multilingual/Service/Detector.php | 55 ++++++++++--------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/web/concrete/blocks/switch_language/controller.php b/web/concrete/blocks/switch_language/controller.php index 5d2c5b3ce10..cc086c927c8 100644 --- a/web/concrete/blocks/switch_language/controller.php +++ b/web/concrete/blocks/switch_language/controller.php @@ -80,18 +80,20 @@ public function view() $c = \Page::getCurrentPage(); $al = Section::getBySectionOfSite($c); $languages = array(); - $locale = \Localization::activeLocale(); - if (is_object($al)) { + $locale = null; + if ($al) { $locale = $al->getLanguage(); } + if (!$locale) { + $locale = \Localization::activeLocale(); + $al = Section::getByLocale($locale); + } foreach ($ml as $m) { $languages[$m->getCollectionID()] = $m->getLanguageText($locale); } $this->set('languages', $languages); $this->set('languageSections', $ml); - if (is_object($al)) { - $this->set('activeLanguage', $al->getCollectionID()); - } + $this->set('activeLanguage', $al? $al->getCollectionID() : null); $dl = \Core::make('multilingual/detector'); $this->set('defaultLocale', $dl->getPreferredSection()); $this->set('locale', $locale); diff --git a/web/concrete/src/Multilingual/Service/Detector.php b/web/concrete/src/Multilingual/Service/Detector.php index 3050513738f..8a2498128d7 100644 --- a/web/concrete/src/Multilingual/Service/Detector.php +++ b/web/concrete/src/Multilingual/Service/Detector.php @@ -71,32 +71,37 @@ public static function getPreferredSection() public static function setupSiteInterfaceLocalization(Page $c = null) { - if (\User::isLoggedIn() && Config::get('concrete.multilingual.keep_users_locale')) { - return; - } - if (!$c) { - $c = Page::getCurrentPage(); - } - // don't translate dashboard pages - $dh = \Core::make('helper/concrete/dashboard'); - if ($dh->inDashboard($c)) { - return; - } - - $ms = Section::getBySectionOfSite($c); - if (!is_object($ms)) { - $ms = static::getPreferredSection(); - } - - if (!$ms) { - return; - } - - $locale = $ms->getLocale(); - - if (strlen($locale)) { - \Localization::changeLocale($locale); + $loc = \Localization::getInstance(); + if (!(\User::isLoggedIn() && Config::get('concrete.multilingual.keep_users_locale'))) { + if (!$c) { + $c = Page::getCurrentPage(); + } + // don't translate dashboard pages + $dh = \Core::make('helper/concrete/dashboard'); + if ($dh->inDashboard($c)) { + return; + } + $locale = null; + $ms = Section::getBySectionOfSite($c); + if ($ms) { + $locale = $ms->getLocale(); + } + if (!$locale) { + if (Config::get('concrete.multilingual.use_previous_locale') && Session::has('previous_locale')) { + $locale = Session::get('previous_locale'); + } + if (!$locale) { + $ms = static::getPreferredSection(); + if ($ms) { + $locale = $ms->getLocale(); + } + } + } + if ($locale) { + $loc->setLocale($locale); + } } + Session::set('previous_locale', $loc->getLocale()); } public static function isEnabled() From efc9b4bc3565443001ca2b50b45d96c47601ba0c Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Wed, 28 Sep 2016 22:06:57 +0200 Subject: [PATCH 02/25] Fallback to viewPkgHandle if file not found for themePkgHandle (#4402) Backport of https://github.com/concrete5/concrete5/pull/4382 Former-commit-id: 48d2fa66db46a7065b244b86b7ed68b255a508df Former-commit-id: 9c298f30a2330ec87bfa79be066771e7175334d5 --- web/concrete/src/View/View.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/web/concrete/src/View/View.php b/web/concrete/src/View/View.php index bd3dd254c86..06664c2c564 100644 --- a/web/concrete/src/View/View.php +++ b/web/concrete/src/View/View.php @@ -69,10 +69,33 @@ public function setViewRootDirectoryName($directory) public function inc($file, $args = array()) { - extract($args); - extract($this->getScopeItems()); + $__data__ = array( + 'scopedItems' => $this->getScopeItems(), + ); + if ($args && is_array($args)) { + $__data__['scopedItems'] += $args; + } $env = Environment::get(); - include $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->themePkgHandle); + $path = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->themePkgHandle); + if (!file_exists($path)) { + $path2 = $env->getPath(DIRNAME_THEMES.'/'.$this->themeHandle.'/'.$file, $this->viewPkgHandle); + if (file_exists($path2)) { + $path = $path2; + } + unset($path2); + } + $__data__['path'] = $path; + unset($file); + unset($args); + unset($env); + unset($path); + if (!empty($__data__['scopedItems'])) { + if (array_key_exists('__data__', $__data__['scopedItems'])) { + throw new \Exception(t(/*i18n: %1$s is a variable name, %2$s is a function name*/'Illegal variable name \'%1$s\' in %2$s args.', '__data__', __CLASS__.'::'.__METHOD__)); + } + extract($__data__['scopedItems']); + } + include $__data__['path']; } /** From 9de8634450252e74a8fb16ef2f3897b30d37bcf3 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Fri, 30 Sep 2016 17:15:56 +0200 Subject: [PATCH 03/25] Mitigate problems about loading translation files Former-commit-id: 14bf2f5ecff47f2f96c210b5a4471e8060379971 Former-commit-id: ddbe8b03004710c82e67022efc8dc7f23a38069f --- web/concrete/src/Application/Application.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/concrete/src/Application/Application.php b/web/concrete/src/Application/Application.php index 6dbba142824..a5438c634a7 100644 --- a/web/concrete/src/Application/Application.php +++ b/web/concrete/src/Application/Application.php @@ -292,6 +292,8 @@ public function setupPackages() } $pkg->setupPackageLocalization(); } + $config->set('app.bootstrap.packages_loaded', true); + \Localization::setupSiteLocalization(); foreach($this->packages as $pkg) { if (method_exists($pkg, 'on_start')) { $pkg->on_start(); @@ -300,8 +302,6 @@ public function setupPackages() $checkAfterStart = true; } } - $config->set('app.bootstrap.packages_loaded', true); - \Localization::setupSiteLocalization(); if ($checkAfterStart) { foreach($this->packages as $pkg) { From a79b96cb697d9eeef99b5cd1c15826414bb6a094 Mon Sep 17 00:00:00 2001 From: Oliver Green Date: Tue, 11 Oct 2016 22:58:30 +0100 Subject: [PATCH 04/25] Corrected page custom style property / variable name. Former-commit-id: df95ccd786f1c57bf05d562980ad70acad6ab039 Former-commit-id: 19ecce0e40b744f9b4e38337bfc1e574f25d0202 --- web/concrete/src/Page/CustomStyle.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/concrete/src/Page/CustomStyle.php b/web/concrete/src/Page/CustomStyle.php index 04300aa8f4a..03803fef27c 100644 --- a/web/concrete/src/Page/CustomStyle.php +++ b/web/concrete/src/Page/CustomStyle.php @@ -15,9 +15,9 @@ class CustomStyle protected $presetHandle; protected $sccRecordID; - public function setThemeID($ptThemeID) + public function setThemeID($pThemeID) { - $this->ptThemeID = $ptThemeID; + $this->pThemeID = $pThemeID; } public function setValueListID($valueListID) From d6471297790d6f82d5e41ac092d1823056954d94 Mon Sep 17 00:00:00 2001 From: Oliver Green Date: Mon, 17 Oct 2016 17:21:31 +0100 Subject: [PATCH 05/25] Fix erroneous force checkins. Former-commit-id: 12d1b0bd14cb29205e176e8ece48a5c56ebcd407 Former-commit-id: c6f5510eb264e9f0f2d53dc41b5e84a70a7cc7a3 --- web/concrete/src/Page/Page.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/web/concrete/src/Page/Page.php b/web/concrete/src/Page/Page.php index fca64b60e86..73e643921cc 100644 --- a/web/concrete/src/Page/Page.php +++ b/web/concrete/src/Page/Page.php @@ -401,16 +401,21 @@ public function isCheckedOut() return $this->isCheckedOutCache; } - $dh = Core::make('helper/date'); - - $q = 'select cIsCheckedOut, '.$dh->getOverridableNow(true)." - UNIX_TIMESTAMP(cCheckedOutDatetimeLastEdit) as timeout from Pages where cID = '{$this->cID}'"; + $q = "select cIsCheckedOut, cCheckedOutDatetimeLastEdit from Pages where cID = '{$this->cID}'"; $r = $db->executeQuery($q); + + // If cCheckedOutDatetimeLastEdit is present, get the time span in seconds since it's last edit. + if (! empty($row['cCheckedOutDatetimeLastEdit'])) { + $dh = Core::make('helper/date'); + $timeSinceCheckout = ($dh->getOverridableNow(true) - strtotime($row['cCheckedOutDatetimeLastEdit'])); + } + if ($r) { $row = $r->fetchRow(); if ($row['cIsCheckedOut'] == 0) { return false; } else { - if ($row['timeout'] > CHECKOUT_TIMEOUT) { + if (isset($timeSinceCheckout) && $timeSinceCheckout > CHECKOUT_TIMEOUT) { $this->forceCheckIn(); $this->isCheckedOutCache = false; From d5a0acbf18c00a47c961d299976dbefb2c55aa97 Mon Sep 17 00:00:00 2001 From: Oliver Green Date: Tue, 18 Oct 2016 11:42:04 +0100 Subject: [PATCH 06/25] Added 'ccm-edit-mode' class to HTML tag. Former-commit-id: 5dd8e83ecf6cca00c93d0521257fc922a4fc585f Former-commit-id: 7f5281a75e7e7b3dd10a47823d84a8535115ca04 --- web/concrete/elements/page_controls_header.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/web/concrete/elements/page_controls_header.php b/web/concrete/elements/page_controls_header.php index bff72bafeb9..eabadf760b3 100644 --- a/web/concrete/elements/page_controls_header.php +++ b/web/concrete/elements/page_controls_header.php @@ -29,8 +29,11 @@ $editMode = $c->isEditMode(); $tools = REL_DIR_FILES_TOOLS_REQUIRED; + $htmlTagClasses = 'ccm-toolbar-visible'; + if ($c->isEditMode()) { $startEditMode = 'new Concrete.EditMode();'; + $htmlTagClasses .= ' ccm-edit-mode'; } else { $startEditMode = ''; } @@ -51,7 +54,7 @@ $js = <<$(function() { - $('html').addClass('ccm-toolbar-visible'); + $('html').addClass('$htmlTagClasses'); ConcretePanelManager.register({'identifier': 'dashboard', 'position': 'right', url: '{$panelDashboard}'}); ConcretePanelManager.register({'identifier': 'page', url: '{$panelPage}'}); ConcretePanelManager.register({'identifier': 'sitemap', 'position': 'right', url: '{$panelSitemap}'}); From 40a515361164f5f10475d746689d301da9b14441 Mon Sep 17 00:00:00 2001 From: Oliver Green Date: Tue, 18 Oct 2016 13:22:32 +0100 Subject: [PATCH 07/25] Fix block styles in stacks. Former-commit-id: 7c9577448f7776b0dae4b313119458d44db4e70e Former-commit-id: bd1707fe38f45124d85c4a5baec166a9b02a4bd0 --- web/concrete/blocks/core_stack_display/controller.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/concrete/blocks/core_stack_display/controller.php b/web/concrete/blocks/core_stack_display/controller.php index 1c67eaaa1ac..41b5e387d97 100644 --- a/web/concrete/blocks/core_stack_display/controller.php +++ b/web/concrete/blocks/core_stack_display/controller.php @@ -78,6 +78,10 @@ public function isValidControllerTask($method, $parameters = array()) public function runAction($action, $parameters = array()) { + if ('on_page_view' === $action) { + $this->on_page_view($parameters[0]); + } + $b = $this->findBlockForAction($action, $parameters); if (empty($b)) { return; From 7b502247d555746f17709e88e66290100e40cae9 Mon Sep 17 00:00:00 2001 From: Remo Laubacher Date: Thu, 20 Oct 2016 14:45:31 +0200 Subject: [PATCH 08/25] don't create thumbnails of a directory Former-commit-id: e9f7c1918af1b464d62404a0ee05b220889ff443 Former-commit-id: faa83143bed30843760e07426149ac9f6bc55d45 --- web/concrete/src/File/Image/BasicThumbnailer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/concrete/src/File/Image/BasicThumbnailer.php b/web/concrete/src/File/Image/BasicThumbnailer.php index 451c5d04296..39010634a25 100644 --- a/web/concrete/src/File/Image/BasicThumbnailer.php +++ b/web/concrete/src/File/Image/BasicThumbnailer.php @@ -107,7 +107,7 @@ public function getThumbnail($obj, $maxWidth, $maxHeight, $crop = false) { $src = REL_DIR_FILES_CACHE . '/' . $filename; $abspath = Config::get('concrete.cache.directory') . '/' . $filename; $thumb = new \stdClass; - if (isset($abspath) && file_exists($abspath)) { + if (isset($abspath) && file_exists($abspath) && is_file($abspath)) { $thumb->src = $src; $dimensions = getimagesize($abspath); $thumb->width = $dimensions[0]; From 3dce9f12cb6bd5cbf3d1308a363d52a28e481e00 Mon Sep 17 00:00:00 2001 From: Remo Laubacher Date: Thu, 20 Oct 2016 15:29:26 +0200 Subject: [PATCH 09/25] remove unnecessary file_exists Former-commit-id: 6631085fc2f872d1f1f343f145e37823fae2f794 Former-commit-id: e1a6d5f4fceb48adf2e71efe8844d542ace9b25b --- web/concrete/src/File/Image/BasicThumbnailer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/concrete/src/File/Image/BasicThumbnailer.php b/web/concrete/src/File/Image/BasicThumbnailer.php index 39010634a25..3e5f657fc9c 100644 --- a/web/concrete/src/File/Image/BasicThumbnailer.php +++ b/web/concrete/src/File/Image/BasicThumbnailer.php @@ -107,7 +107,7 @@ public function getThumbnail($obj, $maxWidth, $maxHeight, $crop = false) { $src = REL_DIR_FILES_CACHE . '/' . $filename; $abspath = Config::get('concrete.cache.directory') . '/' . $filename; $thumb = new \stdClass; - if (isset($abspath) && file_exists($abspath) && is_file($abspath)) { + if (isset($abspath) && is_file($abspath)) { $thumb->src = $src; $dimensions = getimagesize($abspath); $thumb->width = $dimensions[0]; From a79861f3967d808dfa166e5323b9a9bf62a894f3 Mon Sep 17 00:00:00 2001 From: Remo Laubacher Date: Fri, 28 Oct 2016 20:28:03 +0200 Subject: [PATCH 10/25] use original value in select value translations Former-commit-id: 6b0c8ac0c84ae2ed4f92889ab11e78860e00df56 Former-commit-id: 196032fdaad123c2ade74ee50bdb99d39204eacc --- web/concrete/attributes/select/option.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/concrete/attributes/select/option.php b/web/concrete/attributes/select/option.php index b316c0c69bd..62eb699e7ae 100644 --- a/web/concrete/attributes/select/option.php +++ b/web/concrete/attributes/select/option.php @@ -113,9 +113,9 @@ public static function exportTranslations() $r = $db->Execute('select ID from atSelectOptions order by ID asc'); while ($row = $r->FetchRow()) { $opt = static::getByID($row['ID']); - $translations->insert('SelectAttributeValue', $opt->getSelectAttributeOptionValue()); + $translations->insert('SelectAttributeValue', $opt->getSelectAttributeOptionValue(false)); } return $translations; } -} \ No newline at end of file +} From ddae1efefd4233697e3a41ba1b07445f68f64a1e Mon Sep 17 00:00:00 2001 From: Antti Hukkanen Date: Wed, 2 Nov 2016 18:01:21 +0200 Subject: [PATCH 11/25] Fix #4583 for 5.7 Former-commit-id: 6e0eb7e3350405a3124e2bec8f96f6812aa47ad7 Former-commit-id: 7447347a9c0e1f1c97686899a47232797e929b99 --- .../src/Foundation/EnvironmentDetector.php | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/web/concrete/src/Foundation/EnvironmentDetector.php b/web/concrete/src/Foundation/EnvironmentDetector.php index 863be5074f3..c9b28839bb0 100644 --- a/web/concrete/src/Foundation/EnvironmentDetector.php +++ b/web/concrete/src/Foundation/EnvironmentDetector.php @@ -21,14 +21,14 @@ class EnvironmentDetector { */ public function detect($environments, $consoleArgs = null) { - if ($consoleArgs) - { - return $this->detectConsoleEnvironment($environments, $consoleArgs); - } - else - { - return $this->detectVariableEnvironment($environments); + if ($consoleArgs && $env = $this->detectConsoleEnvironment($environments, $consoleArgs)) { + return $env; + } elseif ($env = $this->detectClosureEnvironment($environments)) { + return $env; + } elseif ($env = $this->detectVariableEnvironment($environments)) { + return $env; } + return $this->detectWebEnvironment($environments); } /** @@ -39,14 +39,6 @@ public function detect($environments, $consoleArgs = null) */ protected function detectWebEnvironment($environments) { - // If the given environment is just a Closure, we will defer the environment check - // to the Closure the developer has provided, which allows them to totally swap - // the webs environment detection logic with their own custom Closure's code. - if ($environments instanceof Closure) - { - return call_user_func($environments); - } - foreach ($environments as $environment => $hosts) { // To determine the current environment, we'll simply iterate through the possible @@ -77,10 +69,6 @@ protected function detectConsoleEnvironment($environments, array $args) { return head(array_slice(explode('=', $value), 1)); } - else - { - return $this->detectVariableEnvironment($environments); - } } /** @@ -93,11 +81,28 @@ protected function detectVariableEnvironment($environments) { if (($env = $this->getEnvironmentFromVariable()) !== false) { return $env; - } else { - return $this->detectWebEnvironment($environments); } } + /** + * Set the application environment from the passed closure in case a closure + * was passed. + * + * @param mixed $environments + * + * @return string|null + */ + protected function detectClosureEnvironment($environments) + { + // If the given environment is just a Closure, we will defer the environment check + // to the Closure the developer has provided, which allows them to totally swap + // the webs environment detection logic with their own custom Closure's code. + if ($environments instanceof Closure) { + return call_user_func($environments); + } + } + + /** * Get the environment argument from the console. * @@ -114,7 +119,7 @@ protected function getEnvironmentArgument(array $args) /** * Gets the environment from the CONCRETE5_ENV environment variable. - * + * * @return string|bool */ protected function getEnvironmentFromVariable() From 4cd554c44ddff85a08b63e4fdd6fe6e0b8a52ff6 Mon Sep 17 00:00:00 2001 From: Antti Hukkanen Date: Tue, 8 Nov 2016 17:37:49 +0200 Subject: [PATCH 12/25] Fix #4616 for 7.x Former-commit-id: 9cc3e5917ed82406965c5324d06ba4c190fabd13 Former-commit-id: 4f3578dc9cd30e53aedb0333a39bae3c8840b70d --- web/concrete/blocks/share_this_page/controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/concrete/blocks/share_this_page/controller.php b/web/concrete/blocks/share_this_page/controller.php index 3a60a6ee796..767940ef236 100644 --- a/web/concrete/blocks/share_this_page/controller.php +++ b/web/concrete/blocks/share_this_page/controller.php @@ -60,7 +60,7 @@ public function addService($service) protected function getSelectedServices() { - $links = array(); + $this->services = array(); $db = Database::get(); $services = $db->GetCol('select service from btShareThisPage where bID = ? order by displayOrder asc', array($this->bID) From 7a8ea3d5356b6927e3e51132a0fb2c5dc126d27e Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Sat, 12 Nov 2016 19:21:46 +0100 Subject: [PATCH 13/25] Return true/false from Mail\Service::sendMail Former-commit-id: 0f224c294f7487448e6ce73ff2d8651e2ea2d35e Former-commit-id: 8b40ddc1aec9f1a4a86d9ea5c4077b18fb125188 --- web/concrete/src/Mail/Service.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/web/concrete/src/Mail/Service.php b/web/concrete/src/Mail/Service.php index a6fe41aa91c..96f9a60c336 100644 --- a/web/concrete/src/Mail/Service.php +++ b/web/concrete/src/Mail/Service.php @@ -395,6 +395,8 @@ public function setAdditionalHeaders($headers) * @param bool $resetData Whether or not to reset the service to its default values. * * @throws \Exception + * + * @return bool */ public function sendMail($resetData = true) { @@ -492,10 +494,12 @@ public function sendMail($resetData = true) } $mail->setBody($body); + $sent = false; try { if (Config::get('concrete.email.enabled')) { $transport->send($mail); } + $sent = true; } catch (Exception $e) { if ($this->getTesting()) { throw $e; @@ -533,5 +537,7 @@ public function sendMail($resetData = true) if ($resetData) { $this->reset(); } + + return $sent; } } From 0706a474b2ed45302d73c7696a78c6a193303f0c Mon Sep 17 00:00:00 2001 From: Hamed Date: Mon, 14 Nov 2016 10:56:13 +0100 Subject: [PATCH 14/25] BugFix https://github.com/concrete5/concrete5/issues/4182 Former-commit-id: 76518342b0376cc3fb9058e6f72f8d759c0aecb0 Former-commit-id: d2424ee744bcc9024f0e93b3e42c47b597e58b4a --- .../src/Sharing/ShareThisPage/Service.php | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/web/concrete/src/Sharing/ShareThisPage/Service.php b/web/concrete/src/Sharing/ShareThisPage/Service.php index 70e16becc7f..64feea34b44 100644 --- a/web/concrete/src/Sharing/ShareThisPage/Service.php +++ b/web/concrete/src/Sharing/ShareThisPage/Service.php @@ -20,18 +20,27 @@ public static function getByHandle($ssHandle) public function getServiceLink(Page $c = null) { if (!is_object($c)) { - $c = \Page::getCurrentPage(); + $req = \Request::getInstance(); + $c = $req->getCurrentPage(); + $url = urlencode($req->getUri()); + }elseif(!$c->isError()) { + $url = urlencode(URL::to($c)); } - if (is_object($c) && !$c->isError()) { - $url = urlencode($c->getCollectionLink(true)); + + if(is_object($c) && !$c->isError()) { + $title = $c->getCollectionName(); + }else{ + $title = Config::get('concrete.site'); + } + + if (!empty($url)) { switch($this->getHandle()) { case 'facebook': return "https://www.facebook.com/sharer/sharer.php?u=$url"; case 'twitter': return "https://www.twitter.com/intent/tweet?url=$url"; case 'linkedin': - $title = urlencode($c->getCollectionName()); - return "https://www.linkedin.com/shareArticle?mini-true&url={$url}&title={$title}"; + return "https://www.linkedin.com/shareArticle?mini-true&url={$url}&title=".urlencode($title); case 'pinterest': return "https://www.pinterest.com/pin/create/button?url=$url"; case 'google_plus': @@ -41,7 +50,7 @@ public function getServiceLink(Page $c = null) case 'print': return "javascript:window.print();"; case 'email': - $body = rawurlencode(t("Check out this article on %s:\n\n%s\n%s", tc('SiteName', Config::get('concrete.site')), $c->getCollectionName(), urldecode($url))); + $body = rawurlencode(t("Check out this article on %s:\n\n%s\n%s", tc('SiteName', Config::get('concrete.site')), $title, urldecode($url))); $subject = rawurlencode(t('Thought you\'d enjoy this article.')); return "mailto:?body={$body}&subject={$subject}"; } From 9de4712e40a26295bc92a58bc89bfa4162cd9f6c Mon Sep 17 00:00:00 2001 From: Hamed Date: Mon, 14 Nov 2016 17:55:54 +0100 Subject: [PATCH 15/25] Format Code Former-commit-id: 727ab0998e63b820c3bdf626e8a5f9d58d31e981 Former-commit-id: 39eedd62e27ccc9bba9bd69d0863cb146d35a15a --- web/concrete/src/Sharing/ShareThisPage/Service.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/concrete/src/Sharing/ShareThisPage/Service.php b/web/concrete/src/Sharing/ShareThisPage/Service.php index 64feea34b44..e9f14aec3e7 100644 --- a/web/concrete/src/Sharing/ShareThisPage/Service.php +++ b/web/concrete/src/Sharing/ShareThisPage/Service.php @@ -23,13 +23,13 @@ public function getServiceLink(Page $c = null) $req = \Request::getInstance(); $c = $req->getCurrentPage(); $url = urlencode($req->getUri()); - }elseif(!$c->isError()) { + } elseif (!$c->isError()) { $url = urlencode(URL::to($c)); } - if(is_object($c) && !$c->isError()) { + if (is_object($c) && !$c->isError()) { $title = $c->getCollectionName(); - }else{ + } else { $title = Config::get('concrete.site'); } From 4cf221cccb1ac438e5106967346497604bac996a Mon Sep 17 00:00:00 2001 From: Hamed Date: Mon, 14 Nov 2016 18:10:56 +0100 Subject: [PATCH 16/25] Fix uses and clean code Former-commit-id: af1bd94321885cf78148292409aca422c2af18d1 Former-commit-id: 68ec025682847c9494677cf2c555da036ed4cc4a --- web/concrete/src/Sharing/ShareThisPage/Service.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/web/concrete/src/Sharing/ShareThisPage/Service.php b/web/concrete/src/Sharing/ShareThisPage/Service.php index e9f14aec3e7..8712377a31a 100644 --- a/web/concrete/src/Sharing/ShareThisPage/Service.php +++ b/web/concrete/src/Sharing/ShareThisPage/Service.php @@ -2,7 +2,9 @@ namespace Concrete\Core\Sharing\ShareThisPage; use Concrete\Core\Page\Page; use Concrete\Core\Sharing\SocialNetwork\Service as SocialNetworkService; -use Config; +use Request, + Config, + URL; class Service extends SocialNetworkService { @@ -20,7 +22,7 @@ public static function getByHandle($ssHandle) public function getServiceLink(Page $c = null) { if (!is_object($c)) { - $req = \Request::getInstance(); + $req = Request::getInstance(); $c = $req->getCurrentPage(); $url = urlencode($req->getUri()); } elseif (!$c->isError()) { From 93d64235c4be0c360531c7a78c6e2fbde1a64c75 Mon Sep 17 00:00:00 2001 From: Hamed Date: Mon, 14 Nov 2016 18:25:19 +0100 Subject: [PATCH 17/25] PSR-2 Fix Former-commit-id: 8fc031f0d1f58b8902eaa0f5ff3a1320dba0023d Former-commit-id: 0f2654b391b0fc25b49b8f5db969a145e927506b --- .../src/Sharing/ShareThisPage/Service.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/web/concrete/src/Sharing/ShareThisPage/Service.php b/web/concrete/src/Sharing/ShareThisPage/Service.php index 8712377a31a..86f49da9983 100644 --- a/web/concrete/src/Sharing/ShareThisPage/Service.php +++ b/web/concrete/src/Sharing/ShareThisPage/Service.php @@ -1,18 +1,18 @@ getHandle() == $ssHandle) { return $s; } @@ -23,7 +23,7 @@ public function getServiceLink(Page $c = null) { if (!is_object($c)) { $req = Request::getInstance(); - $c = $req->getCurrentPage(); + $c = $req->getCurrentPage(); $url = urlencode($req->getUri()); } elseif (!$c->isError()) { $url = urlencode(URL::to($c)); @@ -36,7 +36,7 @@ public function getServiceLink(Page $c = null) } if (!empty($url)) { - switch($this->getHandle()) { + switch ($this->getHandle()) { case 'facebook': return "https://www.facebook.com/sharer/sharer.php?u=$url"; case 'twitter': @@ -54,11 +54,9 @@ public function getServiceLink(Page $c = null) case 'email': $body = rawurlencode(t("Check out this article on %s:\n\n%s\n%s", tc('SiteName', Config::get('concrete.site')), $title, urldecode($url))); $subject = rawurlencode(t('Thought you\'d enjoy this article.')); + return "mailto:?body={$body}&subject={$subject}"; } } } - - - -} \ No newline at end of file +} From 095b7d2fac0c00c78117ca55ad2b340fbd162320 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Tue, 15 Nov 2016 21:15:42 +0100 Subject: [PATCH 18/25] Fix #4658 for v5.7 Former-commit-id: 000d07aae71f6b72de6c0fef656475393928938c Former-commit-id: 466e585034b31d334067021650bba65ab0828933 --- web/concrete/src/Block/BlockController.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/concrete/src/Block/BlockController.php b/web/concrete/src/Block/BlockController.php index e04f2dcd9ad..489ee37a0b1 100644 --- a/web/concrete/src/Block/BlockController.php +++ b/web/concrete/src/Block/BlockController.php @@ -480,7 +480,11 @@ public function isValidControllerTask($method, $parameters = array()) // how do we get <= 1? If it's 1, that means that the method has one fewer param. That's ok because // certain older blocks don't know that the last param ought to be a $bID. If they're equal it's zero // which is best. and if they're greater that's ok too. - return true; + // Now let's see if the action is for this block instance + $bID = array_pop($parameters); + if ((is_string($bID) || is_int($bID)) && $bID == $this->bID) { + return true; + } } } From 77dd04cd5d3473671c7b86b32544a902d108cab0 Mon Sep 17 00:00:00 2001 From: Remo Laubacher Date: Wed, 16 Nov 2016 09:53:01 +0100 Subject: [PATCH 19/25] disable caching of share block Former-commit-id: 1cf77c750ebefd1ef18f8860a7b8d44b433a5e5a Former-commit-id: 8ebb123e314e323f3bd95aabb5e9d0df5bd26399 --- web/concrete/blocks/share_this_page/controller.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/concrete/blocks/share_this_page/controller.php b/web/concrete/blocks/share_this_page/controller.php index 767940ef236..c71262bc5f0 100644 --- a/web/concrete/blocks/share_this_page/controller.php +++ b/web/concrete/blocks/share_this_page/controller.php @@ -15,9 +15,9 @@ class Controller extends BlockController public $helpers = array('form'); protected $btInterfaceWidth = 400; - protected $btCacheBlockOutput = true; - protected $btCacheBlockOutputOnPost = true; - protected $btCacheBlockOutputForRegisteredUsers = true; + protected $btCacheBlockOutput = false; + protected $btCacheBlockOutputOnPost = false; + protected $btCacheBlockOutputForRegisteredUsers = false; protected $btInterfaceHeight = 400; protected $btTable = 'btShareThisPage'; From f87bbb4a50e7418d0b58a7ef764b9ce6b5eaa216 Mon Sep 17 00:00:00 2001 From: Korvin Szanto Date: Thu, 1 Dec 2016 11:22:51 -0800 Subject: [PATCH 20/25] Generate secure random strings from the identifier service Former-commit-id: dc20116a7d768be19497decf4583b1041b7ce311 Former-commit-id: e7b3cc9c0efa48c17ed9ad7742f2dbcee6a3ac38 --- .../src/Utility/Service/Identifier.php | 133 ++++++++++-------- 1 file changed, 78 insertions(+), 55 deletions(-) diff --git a/web/concrete/src/Utility/Service/Identifier.php b/web/concrete/src/Utility/Service/Identifier.php index e639b11f8d2..a5e8620f631 100644 --- a/web/concrete/src/Utility/Service/Identifier.php +++ b/web/concrete/src/Utility/Service/Identifier.php @@ -1,9 +1,14 @@ * @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org) * @license http://www.concrete5.org/license/ MIT License @@ -11,76 +16,94 @@ /** * A helper that allows the creation of unique strings, for use when creating hashes, identifiers. - * @package Helpers + * + * \@package Helpers * @subpackage Validation + * * @author Andrew Embler * @copyright Copyright (c) 2003-2008 Concrete5. (http://www.concrete5.org) * @license http://www.concrete5.org/license/ MIT License */ +class Identifier +{ -class Identifier { - - private $letters = 'abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'; - - - /** - * Like generate() below, but simply appends an ever increasing number to what you provide - * until it comes back as not found - */ - public function generateFromBase($string, $table, $key) { - $foundRecord = false; - $db = Loader::db(); - $i = ''; + /** + * Like generate() below, but simply appends an ever increasing number to what you provide + * until it comes back as not found. + */ + public function generateFromBase($string, $table, $key) + { + $foundRecord = false; + $db = Application::make(Connection::class); + $i = ''; $_string = ''; - while ($foundRecord == false) { - $_string = $string . $i; - $cnt = $db->GetOne("select count(" . $key . ") as total from " . $table . " where " . $key . " = ?", array($_string)); - if ($cnt < 1) { - $foundRecord = true; - } else { - if ($i == '') { - $i = 0; - } - $i++; - } - } - return $_string; - } + while ($foundRecord == false) { + $_string = $string . $i; + $cnt = $db->GetOne("select count(" . $key . ") as total from " . $table . " where " . $key . " = ?", + array($_string)); + if ($cnt < 1) { + $foundRecord = true; + } else { + if ($i == '') { + $i = 0; + } + ++$i; + } + } + + return $_string; + } /** * Generates a unique identifier for an item in a database table. Used, among other places, in generating - * User hashes for email validation + * User hashes for email validation. + * * @param string $table * @param string $key * @param int $length * @param bool $lowercase + * * @return string */ - public function generate($table, $key, $length = 12, $lowercase = false) { - $foundHash = false; - $db = Loader::db(); - while ($foundHash == false) { - $string = $this->getString($length); - if ($lowercase) { - $string = strtolower($string); - } - $cnt = $db->GetOne("select count(" . $key . ") as total from " . $table . " where " . $key . " = ?", array($string)); - if ($cnt < 1) { - $foundHash = true; - } - } - return $string; - } + public function generate($table, $key, $length = 12, $lowercase = false) + { + $foundHash = false; + $db = Application::make(Connection::class); + while ($foundHash == false) { + $string = $this->getString($length); + if ($lowercase) { + $string = strtolower($string); + } + $cnt = $db->GetOne("select count(" . $key . ") as total from " . $table . " where " . $key . " = ?", + array($string)); + if ($cnt < 1) { + $foundHash = true; + } + } + + return $string; + } - public function getString($length = 12) { - $str = str_repeat($this->letters, 10); - $hash = substr(str_shuffle($str), 0, $length); - return $hash; - } + /** + * Generate a cryptographically secure random string + * @param int $length + * @return string + */ + public function getString($length = 12) + { + if (function_exists('random_bytes')) { + $bytes = random_bytes($length / 2); + } else { + $hash = new PasswordHash(8, false); + $bytes = $hash->get_random_bytes($length / 2); + } - public function deleteKey($table, $keyCol, $uHash){ - $db = Loader::db(); - $db->Execute("DELETE FROM ".$table." WHERE ".$keyCol."=?", array($uHash) ); - } + return bin2hex($bytes); + } + public function deleteKey($table, $keyCol, $uHash) + { + $db = Application::make(Connection::class); + $db->Execute("DELETE FROM " . $table . " WHERE " . $keyCol . "=?", array($uHash)); + } } From fa302e88503093836addc190585ec352b3b6d444 Mon Sep 17 00:00:00 2001 From: Korvin Szanto Date: Thu, 1 Dec 2016 12:19:42 -0800 Subject: [PATCH 21/25] Define cParentID and appease test gods Former-commit-id: 56f0193327db69a9afab482f6d00ef91532146af Former-commit-id: fe0d2225e855cea14295ddc5ea80ee84195fa97f --- web/concrete/src/Page/Page.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/concrete/src/Page/Page.php b/web/concrete/src/Page/Page.php index 73e643921cc..4e29255d31f 100644 --- a/web/concrete/src/Page/Page.php +++ b/web/concrete/src/Page/Page.php @@ -48,6 +48,9 @@ class Page extends Collection implements \Concrete\Core\Permission\ObjectInterfa protected $blocksAliasedFromMasterCollection = null; protected $cIsSystemPage = false; protected $cPointerOriginalID = null; + + public $cParentID; + /** * @param string $path /path/to/page * @param string $version ACTIVE or RECENT From 419c81e5522efaf8572a8044f62edf00d57bbe2a Mon Sep 17 00:00:00 2001 From: Andrew Embler Date: Thu, 1 Dec 2016 12:28:01 -0800 Subject: [PATCH 22/25] adding in info object for updates Former-commit-id: 51b273f89f1389e2c589a45b61c1c09ed6f025f1 Former-commit-id: 7a06e94cb57876571c887abc360f0ab9309df546 --- .../dashboard/system/environment/info.php | 110 +----- web/concrete/src/System/Info.php | 347 ++++++++++++++++++ .../src/Updater/ApplicationUpdate.php | 3 + 3 files changed, 362 insertions(+), 98 deletions(-) create mode 100644 web/concrete/src/System/Info.php diff --git a/web/concrete/controllers/single_page/dashboard/system/environment/info.php b/web/concrete/controllers/single_page/dashboard/system/environment/info.php index 726c1263574..ddc1c82eced 100644 --- a/web/concrete/controllers/single_page/dashboard/system/environment/info.php +++ b/web/concrete/controllers/single_page/dashboard/system/environment/info.php @@ -12,114 +12,28 @@ class Info extends DashboardPageController { public function get_environment_info() { - $activeLocale = Localization::activeLocale(); - if ($activeLocale != 'en_US') { - Localization::changeLocale('en_US'); - } - $maxExecutionTime = ini_get('max_execution_time'); - set_time_limit(5); + $info = $this->app->make('\Concrete\Core\System\Info'); + /* @var \Concrete\Core\System\Info $info */ - $environmentMessage = "# concrete5 Version\n"; - $environmentMessage .= "Core Version - " . \Config::get('concrete.version') . "\n"; - $environmentMessage .= "Version Installed - " . \Config::get('concrete.version_installed') . "\n"; - $environmentMessage .= "Database Version - " . \Config::get('concrete.version_db') . "\n\n"; + echo "# concrete5 Version\n".$info->getCoreVersions()."\n\n"; - $environmentMessage .= "# concrete5 Packages\n"; - $pla = PackageList::get(); - $pl = $pla->getPackages(); - $packages = array(); - foreach ($pl as $p) { - if ($p->isPackageInstalled()) { - $packages[] = $p->getPackageName() . ' (' . $p->getPackageVersion() . ')'; - } - } - if (count($packages) > 0) { - natcasesort($packages); - $environmentMessage .= implode(', ', $packages); - $environmentMessage .= ".\n"; - } else { - $environmentMessage .= "None\n"; - } - $environmentMessage .= "\n"; + echo "# concrete5 Packages\n".($info->getPackages() ?: 'None')."\n\n"; - // overrides - $environmentMessage .= "# concrete5 Overrides\n"; - $env = Environment::get(); - $overrides = $env->getOverrideList(); + echo "# concrete5 Overrides\n".($info->getOverrides() ?: 'None')."\n\n"; - if (count($overrides) > 0) { - $environmentMessage .= implode(', ', $overrides); - $environmentMessage .= "\n"; - } else { - $environmentMessage .= "None\n"; - } - $environmentMessage .= "\n"; + echo "# concrete5 Cache Settings\n".$info->getCache()."\n\n"; - print $environmentMessage; + echo "# Server Software\n".$info->getServerSoftware()."\n\n"; - // cache - $environmentMessage = "# concrete5 Cache Settings\n"; - $environmentMessage .= sprintf("Block Cache - %s\n", Config::get('concrete.cache.blocks') ? 'On' : 'Off'); - $environmentMessage .= sprintf("Overrides Cache - %s\n", Config::get('concrete.cache.overrides') ? 'On' : 'Off'); - $environmentMessage .= sprintf("Full Page Caching - %s\n", (Config::get('concrete.cache.pages') == 'blocks' ? 'On - If blocks on the particular page allow it.' : (Config::get('concrete.cache.pages') == 'all' ? 'On - In all cases.' : 'Off'))); - if (Config::get('concrete.cache.full_page_lifetime')) { - $environmentMessage .= sprintf("Full Page Cache Lifetime - %s\n", (Config::get('concrete.cache.full_page_lifetime') == 'default' ? sprintf('Every %s (default setting).', Core::make('helper/date')->describeInterval(Config::get('concrete.cache.lifetime'))) : (Config::get('concrete.cache.full_page_lifetime') == 'forever' ? 'Only when manually removed or the cache is cleared.' : sprintf('Every %s minutes.', Config::get('concrete.cache.full_page_lifetime_value'))))); - } - $environmentMessage .= "\n"; - print $environmentMessage; + echo "# Server API\n".$info->getServerAPI()."\n\n"; - $environmentMessage = "# Server Software\n" . $_SERVER['SERVER_SOFTWARE'] . "\n\n"; - $environmentMessage .= "# Server API\n" . php_sapi_name() . "\n\n"; - $environmentMessage .= "# PHP Version\n" . PHP_VERSION . "\n\n"; - $environmentMessage .= "# PHP Extensions\n"; - if (function_exists('get_loaded_extensions')) { - $gle = @get_loaded_extensions(); - natcasesort($gle); - $environmentMessage .= implode(', ', $gle); - $environmentMessage .= ".\n"; - } else { - $environmentMessage .= "Unable to determine\n"; - } + echo "# PHP Version\n".$info->getPhpVersion()."\n\n"; - print $environmentMessage; + echo "# PHP Extensions\n".($info->getPhpExtensions() === false ? 'Unable to determine' : $info->getPhpExtensions())."\n\n"; - ob_start(); - phpinfo(); - $section = 'phpinfo'; - $phpinfo = array($section => array()); - if (preg_match_all('#(?:

(?:)?(.*?)(?:)?

)|(?:(.*?)\s*(?:(.*?)\s*(?:(.*?)\s*)?)?)#s', ob_get_clean(), $matches, PREG_SET_ORDER)) { - foreach ($matches as $match) { - if (strlen($match[1])) { - $section = $match[1]; - $phpinfo[$section] = array(); - } elseif (isset($match[3])) { - $phpinfo[$section][$match[2]] = isset($match[4]) ? array($match[3], $match[4]) : $match[3]; - } else { - $phpinfo[$section][] = $match[2]; - } - } - } - $environmentMessage = "\n# PHP Settings\n"; - $environmentMessage .= "max_execution_time - $maxExecutionTime\n"; - foreach ($phpinfo as $name => $section) { - foreach ($section as $key => $val) { - if (preg_match('/.*max_execution_time*/', $key)) { - continue; - } - if (!preg_match('/.*limit.*/', $key) && !preg_match('/.*safe.*/', $key) && !preg_match('/.*max.*/', $key)) { - continue; - } - if (is_array($val)) { - $environmentMessage .= "$key - $val[0]\n"; - } elseif (is_string($key)) { - $environmentMessage .= "$key - $val\n"; - } else { - $environmentMessage .= "$val\n"; - } - } - } + echo "# PHP Settings\n".$info->getPhpSettings(); - print $environmentMessage; exit; } + } diff --git a/web/concrete/src/System/Info.php b/web/concrete/src/System/Info.php new file mode 100644 index 00000000000..1246c331852 --- /dev/null +++ b/web/concrete/src/System/Info.php @@ -0,0 +1,347 @@ +make('config'); + $maxExecutionTime = ini_get('max_execution_time'); + @set_time_limit(5); + + $this->installed = (bool) $app->isInstalled(); + + $this->webRootDirectory = DIR_BASE; + + $this->coreRootDirectory = DIR_BASE_CORE; + + $versions = ['Core Version - '.$config->get('concrete.version')]; + if ($this->installed) { + $versions[] = 'Version Installed - '.$config->get('concrete.version_installed'); + } + $versions[] = 'Database Version - '.$config->get('concrete.version_db'); + $this->coreVersions = implode("\n", $versions); + + $packages = []; + if ($this->installed) { + foreach (PackageList::get()->getPackages() as $p) { + if ($p->isPackageInstalled()) { + $packages[] = $p->getPackageName() . ' (' . $p->getPackageVersion() . ')'; + } + } + } + natcasesort($packages); + $this->packages = implode(', ', $packages); + + $overrides = Environment::get()->getOverrideList(); + if (empty($overrides)) { + $this->overrides = ''; + } else { + $this->overrides = implode(', ', $overrides); + } + + $cache = [ + sprintf('Block Cache - %s', $config->get('concrete.cache.blocks') ? 'On' : 'Off'), + sprintf('Overrides Cache - %s', $config->get('concrete.cache.overrides') ? 'On' : 'Off'), + sprintf('Full Page Caching - %s', + $config->get('concrete.cache.pages') == 'blocks' ? + 'On - If blocks on the particular page allow it.' + : + ( + $config->get('concrete.cache.pages') == 'all' ? + 'On - In all cases.' + : + 'Off' + ) + ), + ]; + if ($config->get('concrete.cache.full_page_lifetime')) { + $cache[] = sprintf("Full Page Cache Lifetime - %s", + $config->get('concrete.cache.full_page_lifetime') == 'default' ? + sprintf('Every %s (default setting).', $app->make('helper/date')->describeInterval($config->get('concrete.cache.lifetime'))) + : + ( + $config->get('concrete.cache.full_page_lifetime') == 'forever' ? + 'Only when manually removed or the cache is cleared.' + : + sprintf('Every %s minutes.', $config->get('concrete.cache.full_page_lifetime_value')) + ) + ); + } + $this->cache = implode("\n", $cache); + + $this->serverSoftware = \Request::getInstance()->server->get('SERVER_SOFTWARE', ''); + + $this->serverAPI = PHP_SAPI; + + $this->phpVersion = PHP_VERSION; + + if (function_exists('get_loaded_extensions')) { + $extensions = @get_loaded_extensions(); + } else { + $extensions = false; + } + if (is_array($extensions)) { + natcasesort($extensions); + $this->phpExtensions = implode(', ', $extensions); + } else { + $this->phpExtensions = false; + } + + ob_start(); + phpinfo(); + $buffer = ob_get_clean(); + $phpinfo = []; + if ($app->isRunThroughCommandLineInterface()) { + $section = null; + foreach (preg_split('/[\r\n]+/', $buffer) as $line) { + $chunks = array_map('trim', explode('=>', $line)); + switch (count($chunks)) { + case 1: + if ($chunks[0] === '') { + continue; + } + $section = $chunks[0]; + break; + case 2: + if ($section !== null) { + $phpinfo[$section][$chunks[0]] = $chunks[1]; + } + break; + default: + if ($section !== null) { + $phpinfo[$section][$chunks[0]] = [$chunks[1], $chunks[2]]; + } + break; + } + } + } else { + $section = 'phpinfo'; + $phpinfo[$section] = []; + if (preg_match_all('#(?:

(?:)?(.*?)(?:)?

)|(?:(.*?)\s*(?:(.*?)\s*(?:(.*?)\s*)?)?)#s', $buffer, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + if ($match[1] !== null && $match[1] !== '') { + $section = $match[1]; + $phpinfo[$section] = []; + } elseif (isset($match[3])) { + $phpinfo[$section][$match[2]] = isset($match[4]) ? [$match[3], $match[4]] : $match[3]; + } else { + $phpinfo[$section][] = $match[2]; + } + } + } + } + $phpSettings = [ + "max_execution_time - $maxExecutionTime", + ]; + foreach ($phpinfo as $name => $section) { + foreach ($section as $key => $val) { + if (preg_match('/.*max_execution_time*/', $key)) { + continue; + } + if (strpos($key, 'limit') === false && strpos($key, 'safe') === false && strpos($key, 'max') === false) { + continue; + } + if (is_array($val)) { + $phpSettings[] = "$key - {$val[0]}"; + } elseif (is_string($key)) { + $phpSettings[] = "$key - $val"; + } else { + $phpSettings[] = $val; + } + } + } + $this->phpSettings = implode("\n", $phpSettings); + if ($currentLocale != 'en_US') { + Localization::changeLocale($currentLocale); + } + } catch (\Exception $x) { + if ($currentLocale != 'en_US') { + Localization::changeLocale($currentLocale); + } + throw $x; + } + } + + /** + * @return bool + */ + public function isInstalled() + { + return $this->installed; + } + + /** + * @return string + */ + public function getWebRootDirectory() + { + return $this->webRootDirectory; + } + + /** + * @return string + */ + public function getCoreRootDirectory() + { + return $this->coreRootDirectory; + } + + /** + * @return string + */ + public function getCoreVersions() + { + return $this->coreVersions; + } + + /** + * @return string + */ + public function getPackages() + { + return $this->packages; + } + + /** + * @return string + */ + public function getOverrides() + { + return $this->overrides; + } + + /** + * @return string + */ + public function getCache() + { + return $this->cache; + } + + /** + * @return string + */ + public function getServerSoftware() + { + return $this->serverSoftware; + } + + /** + * @return string + */ + public function getServerAPI() + { + return $this->serverAPI; + } + + /** + * @return string + */ + public function getPhpVersion() + { + return $this->phpVersion; + } + + /** + * @var string|false + */ + protected $phpExtensions; + + /** + * @return string|false + */ + public function getPhpExtensions() + { + return $this->phpExtensions; + } + + /** + * @var string + */ + protected $phpSettings; + + /** + * @return string + */ + public function getPhpSettings() + { + return $this->phpSettings; + } + + public function getJSONOBject() + { + $o = new \stdClass(); + $o->phpSettings = $this->phpSettings; + $o->phpExtensions = $this->phpExtensions; + $o->phpVersion = $this->phpVersion; + $o->serverAPI = $this->serverAPI; + $o->serverSoftware = $this->serverSoftware; + $o->cache = $this->cache; + $o->overrides = $this->overrides; + $o->packages = $this->packages; + $o->coreVersions = $this->coreVersions; + return $o; + } +} diff --git a/web/concrete/src/Updater/ApplicationUpdate.php b/web/concrete/src/Updater/ApplicationUpdate.php index 592ef0190bb..f83f5c3cd61 100644 --- a/web/concrete/src/Updater/ApplicationUpdate.php +++ b/web/concrete/src/Updater/ApplicationUpdate.php @@ -153,6 +153,9 @@ public function getDiagnosticObject() } $overrides = id(Environment::get())->getOverrideList(); $request->getPost()->set('overrides', $overrides); + $info = \Core::make('\Concrete\Core\System\Info'); + $info = $info->getJSONOBject(); + $request->getPost()->set('environment', json_encode($info)); $client = new Client(); $client->setMethod('POST'); From ba9ee1cff66c25515b05cbd58cac4a8245a81eca Mon Sep 17 00:00:00 2001 From: Andrew Embler Date: Thu, 1 Dec 2016 12:43:17 -0800 Subject: [PATCH 23/25] upping version number Former-commit-id: c81db01f61ad4dcb260aebd205f6d1ba0d7047df Former-commit-id: 8b21b95a90f57bbdcaae6b8aa1b3905d19474470 --- web/concrete/config/concrete.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/concrete/config/concrete.php b/web/concrete/config/concrete.php index be9c166f716..6c9cd2d571c 100644 --- a/web/concrete/config/concrete.php +++ b/web/concrete/config/concrete.php @@ -7,8 +7,8 @@ * * @var string */ - 'version' => '5.7.5.10b1', - 'version_installed' => '5.7.5.10b1', + 'version' => '5.7.5.10', + 'version_installed' => '5.7.5.10', 'version_db' => '20160615000000', // the key of the latest database migration /** From 43cef975b1feb7b03cebe3534cb6c5b8361ea756 Mon Sep 17 00:00:00 2001 From: Andrew Embler Date: Thu, 1 Dec 2016 13:03:27 -0800 Subject: [PATCH 24/25] updates to changelog and download Former-commit-id: 9ccb8fe71e951f71422854cd249fdbb314d46216 Former-commit-id: 577f5f4fb589e21c51db2fe6e9f4955e473734b2 --- CHANGELOG.md | 6 ++++++ build/tasks/build-release/download.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 471aa9f90f2..fcb3ed2af65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# 5.7.5.10 + +* Minor bug fixes +* Fixed insecure use of non-random str_shuffle when creating user tokens +* Improvements to update process for version 8. + # 5.7.5.9 ## New Features diff --git a/build/tasks/build-release/download.js b/build/tasks/build-release/download.js index 9061ee8214e..a7b87d0ec75 100644 --- a/build/tasks/build-release/download.js +++ b/build/tasks/build-release/download.js @@ -1,5 +1,5 @@ module.exports = function(grunt, config, parameters, done) { - var zipUrl = parameters.releaseSourceZip || 'https://github.com/concrete5/concrete5/archive/5.7.x.zip'; + var zipUrl = parameters.releaseSourceZip || 'https://github.com/concrete5/concrete5/archive/release/5.7.5.10.zip'; var workFolder = parameters.releaseWorkFolder || './release'; function endForError(e) { process.stderr.write(e.message || e); From 2f5aeb26d46e195f9484530a51374de702ea08e5 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Tue, 6 Dec 2016 15:05:29 +0100 Subject: [PATCH 25/25] Avoid the ::class construct We're still on PHP 5.3 for the 5.7 series Former-commit-id: b0c4326e9ee3e8684c77e0122dbe2a4bc9278699 Former-commit-id: 329257fe3bbd9c78b42c448c9d9548fd1c8971d4 --- web/concrete/src/Utility/Service/Identifier.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/web/concrete/src/Utility/Service/Identifier.php b/web/concrete/src/Utility/Service/Identifier.php index a5e8620f631..fa8c9a741fa 100644 --- a/web/concrete/src/Utility/Service/Identifier.php +++ b/web/concrete/src/Utility/Service/Identifier.php @@ -1,7 +1,6 @@ getString($length); if ($lowercase) { @@ -103,7 +102,7 @@ public function getString($length = 12) public function deleteKey($table, $keyCol, $uHash) { - $db = Application::make(Connection::class); + $db = Application::make('Concrete\Core\Database\Connection\Connection'); $db->Execute("DELETE FROM " . $table . " WHERE " . $keyCol . "=?", array($uHash)); } }