From 65df265e30201ceb74271cf4f6400bc6485af52d Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Thu, 6 Aug 2015 22:26:19 -0600 Subject: [PATCH 01/14] Added a default type as a default type :) --- system/src/Grav/Common/Page/Types.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/src/Grav/Common/Page/Types.php b/system/src/Grav/Common/Page/Types.php index f6407cadd..7138359d9 100644 --- a/system/src/Grav/Common/Page/Types.php +++ b/system/src/Grav/Common/Page/Types.php @@ -49,6 +49,9 @@ class Types implements \ArrayAccess, \Iterator, \Countable $this->systemBlueprints = $this->findBlueprints('blueprints://pages'); } + // register default by default + $this->register('default'); + foreach (Folder::all($path, $options) as $type) { $this->register($type); } From 867445cbd8af40b7642abbc242c4cf855ceccfde Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Thu, 6 Aug 2015 22:26:51 -0600 Subject: [PATCH 02/14] refactor the blueprints fallback a little --- system/src/Grav/Common/Page/Page.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 0666b8fc4..4263a5731 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -705,16 +705,16 @@ class Page $pages = self::getGrav()['pages']; $blueprint = $pages->blueprints($this->blueprintName()); - $fields = $blueprint->fields(); + $edit_mode = self::getGrav()['admin'] ? self::getGrav()['config']->get('plugins.admin.edit_mode') : null; // override if you only want 'normal' mode - if (empty($fields) && self::getGrav()['admin'] && self::getGrav()['config']->get('plugins.admin.edit_mode', 'auto') == 'normal') { + if (empty($fields) && ($edit_mode == 'auto' || $edit_mode == 'normal')) { $blueprint = $pages->blueprints('default'); } // override if you only want 'expert' mode - if (!empty($fields) && self::getGrav()['admin'] && self::getGrav()['config']->get('plugins.admin.edit_mode', 'auto') == 'expert') { + if (!empty($fields) && $edit_mode == 'expert') { $blueprint = $pages->blueprints(''); } From 5c367ac59845a71c1d557948525e998927486372 Mon Sep 17 00:00:00 2001 From: Flavio Copes Date: Fri, 7 Aug 2015 12:11:01 +0200 Subject: [PATCH 03/14] Update pages blueprint to add toggleable and remove the global options --- system/blueprints/pages/default.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/system/blueprints/pages/default.yaml b/system/blueprints/pages/default.yaml index d0f78c6ea..2e757a472 100644 --- a/system/blueprints/pages/default.yaml +++ b/system/blueprints/pages/default.yaml @@ -50,12 +50,12 @@ form: fields: header.published: type: toggle + toggleable: true label: Published help: "By default, a page is published unless you explicitly set published: false or via a publish_date being in the future, or unpublish_date in the past" highlight: 1 size: medium options: - '': Global 1: Yes 0: No validate: @@ -232,11 +232,11 @@ form: header.visible: type: toggle + toggleable: true label: Visible help: "Determines if a page is visible in the navigation." highlight: 1 options: - '': Global 1: Enabled 0: Disabled validate: @@ -244,12 +244,11 @@ form: header.routable: type: toggle + toggleable: true label: Routable help: If this page is reachable by a URL highlight: 1 - default: '' options: - '': Global 1: Enabled 0: Disabled validate: @@ -257,10 +256,10 @@ form: header.cache_enable: type: toggle + toggleable: true label: Caching highlight: 1 options: - '': Global 1: Enabled 0: Disabled validate: From 77caad99449dd7bdfceb6265101937b52a68c61c Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 7 Aug 2015 08:13:29 -0600 Subject: [PATCH 04/14] refactor recurse with public method to reset pages cache --- system/src/Grav/Common/Page/Pages.php | 43 ++++++++++++++++++++------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index c132e158b..27fe4c3ce 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -514,7 +514,7 @@ class Pages /** @var UniformResourceLocator $locator */ $locator = $this->grav['locator']; - $pagesDir = $locator->findResource('page://'); + $pages_dir = $locator->findResource('page://'); if ($config->get('system.cache.enabled')) { /** @var Cache $cache */ @@ -529,10 +529,10 @@ class Pages $last_modified = 0; break; case 'folder': - $last_modified = Folder::lastModifiedFolder($pagesDir); + $last_modified = Folder::lastModifiedFolder($pages_dir); break; default: - $last_modified = Folder::lastModifiedFile($pagesDir); + $last_modified = Folder::lastModifiedFile($pages_dir); } $page_cache_id = md5(USER_DIR.$last_modified.$language->getActive().$config->checksum()); @@ -541,25 +541,46 @@ class Pages if (!$this->instances) { $this->grav['debugger']->addMessage('Page cache missed, rebuilding pages..'); - $this->recurse($pagesDir); - $this->buildRoutes(); + // recurse pages and cache result + $this->resetPages($pages_dir, $page_cache_id); - // save pages, routes, taxonomy, and sort to cache - $cache->save( - $page_cache_id, - array($this->instances, $this->routes, $this->children, $taxonomy->taxonomy(), $this->sort) - ); } else { // If pages was found in cache, set the taxonomy $this->grav['debugger']->addMessage('Page cache hit.'); $taxonomy->taxonomy($taxonomy_map); } } else { - $this->recurse($pagesDir); + $this->recurse($pages_dir); $this->buildRoutes(); } } + /** + * Accessible method to manually reset the pages cache + * + * @param $pages_dir + * @param $page_cache_id + */ + public function resetPages($pages_dir, $page_cache_id) + { + $this->recurse($pages_dir); + $this->buildRoutes(); + + // cache if needed + if ($this->grav['config']->get('system.cache.enabled')) { + /** @var Cache $cache */ + $cache = $this->grav['cache']; + /** @var Taxonomy $taxonomy */ + $taxonomy = $this->grav['taxonomy']; + + // save pages, routes, taxonomy, and sort to cache + $cache->save( + $page_cache_id, + array($this->instances, $this->routes, $this->children, $taxonomy->taxonomy(), $this->sort) + ); + } + } + /** * Recursive function to load & build page relationships. * From 972987c5154616bda7844e6b5fb69a0e04969493 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 7 Aug 2015 13:10:23 -0600 Subject: [PATCH 05/14] updated composer.phar --- bin/composer.phar | Bin 1113024 -> 1116534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/composer.phar b/bin/composer.phar index 4b099f5b829ac253c507a5eff995d7423c7c9b8b..deead1618f6b1e646cb9fd1d2146ab224bd01ea8 100755 GIT binary patch delta 15089 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 From 8c4f6d68e83b5ae4bd674614967b47b1a3abb966 Mon Sep 17 00:00:00 2001 From: Flavio Copes Date: Fri, 7 Aug 2015 21:15:34 +0200 Subject: [PATCH 06/14] Better example for date format, fixes getgrav/grav-plugin-admin#26 --- system/blueprints/config/system.yaml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index ab1fead2c..8d0b1812b 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -57,10 +57,10 @@ form: help: "Set the short date format that can be used by themes" default: "jS M Y" options: - "F jS \\a\\t g:ia": "January 1st at 11:59pm" - "l jS of F g:i A": "Monday 1st of January at 11:59 PM" - "D, m M Y G:i:s": "Mon, 01 Jan 2014 23:59:00" - "d-m-y G:i": "01-01-14 23:59" + "F jS \\a\\t g:ia": "February 10th at 11:59pm" + "l jS of F g:i A": "Monday 10th of February at 11:59 PM" + "D, m M Y G:i:s": "Mon, 10 Feb 2014 23:59:00" + "d-m-y G:i": "10-02-14 23:59" "jS M Y": "10th Feb 2014" pages.dateformat.long: @@ -70,12 +70,11 @@ form: label: Long date format help: "Set the long date format that can be used by themes" options: - "F jS \\a\\t g:ia": "January 1st at 11:59pm" - "l jS of F g:i A": "Monday 1st of January at 11:59 PM" - "D, m M Y G:i:s": "Mon, 01 Jan 2014 23:59:00" - "d-m-y G:i": "01-01-14 23:59" + "F jS \\a\\t g:ia": "February 10th at 11:59pm" + "l jS of F g:i A": "Monday 10th of February at 11:59 PM" + "D, m M Y G:i:s": "Mon, 10 Feb 2014 23:59:00" + "d-m-y G:i": "10-02-14 23:59" "jS M Y": "10th Feb 2014" - pages.order.by: type: select size: medium From d28656ce4b6f050cd8c32e95936c09c83b2c0807 Mon Sep 17 00:00:00 2001 From: Flavio Copes Date: Fri, 7 Aug 2015 21:59:50 +0200 Subject: [PATCH 07/14] Update system blueprint to use the current date in the date format select, refs getgrav/grav-plugin-admin#26 --- system/blueprints/config/system.yaml | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index 8d0b1812b..f8e73018b 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -50,31 +50,32 @@ form: '': 'Default (Server Timezone)' pages.dateformat.short: - type: select + type: dateformat size: medium classes: fancy label: Short date format help: "Set the short date format that can be used by themes" default: "jS M Y" options: - "F jS \\a\\t g:ia": "February 10th at 11:59pm" - "l jS of F g:i A": "Monday 10th of February at 11:59 PM" - "D, m M Y G:i:s": "Mon, 10 Feb 2014 23:59:00" - "d-m-y G:i": "10-02-14 23:59" - "jS M Y": "10th Feb 2014" + "F jS \\a\\t g:ia": Date1 + "l jS of F g:i A": Date2 + "D, m M Y G:i:s": Date3 + "d-m-y G:i": Date4 + "jS M Y": Date5 pages.dateformat.long: - type: select + type: dateformat size: medium classes: fancy label: Long date format help: "Set the long date format that can be used by themes" options: - "F jS \\a\\t g:ia": "February 10th at 11:59pm" - "l jS of F g:i A": "Monday 10th of February at 11:59 PM" - "D, m M Y G:i:s": "Mon, 10 Feb 2014 23:59:00" - "d-m-y G:i": "10-02-14 23:59" - "jS M Y": "10th Feb 2014" + "F jS \\a\\t g:ia": Date1 + "l jS of F g:i A": Date2 + "D, m M Y G:i:s": Date3 + "d-m-y G:i": Date4 + "jS M Y": Date5 + pages.order.by: type: select size: medium From 8922f6a48612c656a874d45b710441d908bc8732 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 7 Aug 2015 13:33:25 -0700 Subject: [PATCH 08/14] Added isSymlink logic to determine if Grav is symbolically linked or not. --- CHANGELOG.md | 11 ++++++++--- system/src/Grav/Common/GPM/Installer.php | 10 ++++++++++ system/src/Grav/Common/GPM/Remote/Grav.php | 5 +++++ system/src/Grav/Common/GPM/Upgrader.php | 10 ++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50f855b2a..1e160286d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +# v0.9.36 +## XX/XX/2015 + +1. [](#improved) + * Added isSymlink method in GPM to determine if Grav is symbolically linked or not + # v0.9.35 ## 08/06/2015 @@ -5,13 +11,12 @@ * Added `body_classes` field * Added `visiblity` toggle and help tooltips on new page form * Added new `Page.unsetRoute()` method to allow admin to regenerate the route -1. [](#improved) +2. [](#improved) * User save no longer stores username each time * Page list form field now shows all pages except root * Removed required option from page title * Added configuration settings for running Nginx in sub directory -1. [](#bugfix) - * Fixed issue with GPM and cURL throwing `Undefined offset: 1` error +3. [](#bugfix) * Fixed deep translation merging * Fixed broken **metadata** merging with site defaults * Fixed broken **summary** field diff --git a/system/src/Grav/Common/GPM/Installer.php b/system/src/Grav/Common/GPM/Installer.php index e2ebd0ed2..859257f3b 100644 --- a/system/src/Grav/Common/GPM/Installer.php +++ b/system/src/Grav/Common/GPM/Installer.php @@ -287,4 +287,14 @@ class Installer { return self::$error; } + + /** + * Allows to manually set an error + * @param $error the Error code + */ + + public static function setError($error) + { + self::$error = $error; + } } diff --git a/system/src/Grav/Common/GPM/Remote/Grav.php b/system/src/Grav/Common/GPM/Remote/Grav.php index 7b9cef274..d0a62a25f 100644 --- a/system/src/Grav/Common/GPM/Remote/Grav.php +++ b/system/src/Grav/Common/GPM/Remote/Grav.php @@ -87,4 +87,9 @@ class Grav extends AbstractPackageCollection { return version_compare(GRAV_VERSION, $this->getVersion(), '<'); } + + public function isSymlink() + { + return is_link(GRAV_ROOT . DS . 'index.php'); + } } diff --git a/system/src/Grav/Common/GPM/Upgrader.php b/system/src/Grav/Common/GPM/Upgrader.php index f9e3c0e81..590ad4df7 100644 --- a/system/src/Grav/Common/GPM/Upgrader.php +++ b/system/src/Grav/Common/GPM/Upgrader.php @@ -80,4 +80,14 @@ class Upgrader { return version_compare($this->getLocalVersion(), $this->getRemoteVersion(), "<"); } + + /** + * Checks if Grav is currently symbolically linked + * @return boolean True if Grav is symlinked, False otherwise. + */ + + public function isSymlink() + { + return $this->remote->isSymlink(); + } } From 16b2cccea470971dc71a3cbae2ba576711a4595b Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 7 Aug 2015 15:15:28 -0600 Subject: [PATCH 09/14] Use sessions for admin even when sessions are disabled --- system/src/Grav/Common/Session.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/system/src/Grav/Common/Session.php b/system/src/Grav/Common/Session.php index c587b6332..cb63df20b 100644 --- a/system/src/Grav/Common/Session.php +++ b/system/src/Grav/Common/Session.php @@ -20,17 +20,23 @@ class Session extends \RocketTheme\Toolbox\Session\Session $uri = $this->grav['uri']; $config = $this->grav['config']; - if ($config->get('system.session.enabled')) { - // Only activate admin if we're inside the admin path. - $is_admin = false; + $is_admin = false; + + $session_timeout = $config->get('system.session.timeout', 1800); + $session_path = $config->get('system.session.path', '/' . ltrim($uri->rootUrl(false), '/')); + + // Activate admin if we're inside the admin path. + if ($config->get('plugins.admin.enabled')) { $route = $config->get('plugins.admin.route'); $base = '/' . trim($route, '/'); if (substr($uri->route(), 0, strlen($base)) == $base) { + $session_timeout = $config->get('plugins.admin.session.timeout', 1800); $is_admin = true; } + } + + if ($config->get('system.session.enabled') || $is_admin) { - $session_timeout = $config->get('system.session.timeout', 1800); - $session_path = $config->get('system.session.path', '/' . ltrim($uri->rootUrl(false), '/')); // Define session service. parent::__construct( From aacd9732f223634452063e87f48073a6c4c84c94 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 8 Aug 2015 11:24:18 -0600 Subject: [PATCH 10/14] Added a `newuser` command to make creating users simpler --- bin/grav | 1 + .../src/Grav/Console/Cli/NewUserCommand.php | 136 ++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 system/src/Grav/Console/Cli/NewUserCommand.php diff --git a/bin/grav b/bin/grav index fb101b78f..26a633566 100755 --- a/bin/grav +++ b/bin/grav @@ -41,5 +41,6 @@ $app->addCommands(array( new Grav\Console\Cli\ClearCacheCommand(), new Grav\Console\Cli\BackupCommand(), new Grav\Console\Cli\NewProjectCommand(), + new Grav\Console\Cli\NewUserCommand(), )); $app->run(); diff --git a/system/src/Grav/Console/Cli/NewUserCommand.php b/system/src/Grav/Console/Cli/NewUserCommand.php new file mode 100644 index 000000000..cbab7804d --- /dev/null +++ b/system/src/Grav/Console/Cli/NewUserCommand.php @@ -0,0 +1,136 @@ +setName("newuser") + ->setDescription("Creates a new user") + ->setHelp('The newuser creates a new user file in user/accounts/ folder'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * + * @return int|null|void + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $this->setupConsole($input, $output); + $helper = $this->getHelper('question'); + $data = []; + + $this->output->writeln('Create new user'); + $this->output->writeln(''); + + // Get username and validate + $question = new Question('Enter a username: ', 'admin'); + $question->setValidator(function ($value) { + if (!preg_match('/^[a-z0-9_-]{3,16}$/', $value)) { + throw new RuntimeException( + 'Username should be between 3 and 16 comprised of lowercase letters, numbers, underscores and hyphens' + ); + } + if (file_exists(self::getGrav()['locator']->findResource('user://accounts/' . $value . YAML_EXT))) { + throw new RuntimeException( + 'Username "'.$value.'" already exists, please pick another username' + ); + } + return $value; + }); + $username = $helper->ask($this->input, $this->output, $question); + + // Get password and validate + $question = new Question('Enter a password: '); + $question->setValidator(function ($value) { + if (!preg_match('/(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}/', $value)) { + throw new RuntimeException('Password must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters'); + } + return $value; + }); + $data['password'] = $helper->ask($this->input, $this->output, $question); + + // Get email and validate + $question = new Question('Enter an email: '); + $question->setValidator(function ($value) { + if (!preg_match('/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/', $value)) { + throw new RuntimeException( + 'Not a valid email address' + ); + } + return $value; + }); + $data['email'] = $helper->ask($this->input, $this->output, $question); + + // Choose permissions + $question = new ChoiceQuestion( + 'Please choose a set of permissions:', + array('a'=>'admin access', 's'=>'site access', 'b'=>'admin and site access'), + 'a' + ); + $question->setErrorMessage('permissions %s is invalid.'); + $permissions_choice = $helper->ask($this->input, $this->output, $question); + + switch ($permissions_choice) { + case 'a': + $data['access']['admin'] = ['login' => true, 'super' => true]; + break; + case 's': + $data['access']['site'] = ['login' => true]; + break; + case 'b': + $data['access']['admin'] = ['login' => true, 'super' => true]; + $data['access']['site'] = ['login' => true]; + } + + // Get fullname + $question = new Question('Enter a fullname: '); + $question->setValidator(function ($value) { + if ($value === null or trim($value) == '') { + throw new RuntimeException( + 'Fullname is required' + ); + } + return $value; + }); + $data['fullname'] = $helper->ask($this->input, $this->output, $question); + + // Get title + $question = new Question('Enter a title: '); + $data['title'] = $helper->ask($this->input, $this->output, $question); + + // Create user object and save it + $user = new User($data); + $file = CompiledYamlFile::instance(self::getGrav()['locator']->findResource('user://accounts/' . $username . YAML_EXT, true, true)); + $user->file($file); + $user->save(); + + $this->output->writeln(''); + $this->output->writeln('Success! User '. $username .' created.'); + } +} From 76c4da79457971aebc8de4571109e7270657f3da Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 8 Aug 2015 14:44:30 -0600 Subject: [PATCH 11/14] support user and system languages --- system/src/Grav/Common/Config/Config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Config/Config.php b/system/src/Grav/Common/Config/Config.php index cc1feeac6..0cafeb7a0 100644 --- a/system/src/Grav/Common/Config/Config.php +++ b/system/src/Grav/Common/Config/Config.php @@ -373,10 +373,11 @@ class Config extends Data $content = $lang_file->content(); $this->languages->mergeRecursive($content); } + unset($languageFiles['user/plugins']); } - if (isset($languageFiles['system/languages'])) { - foreach ((array) $languageFiles['system/languages'] as $lang => $item) { + foreach ($languageFiles as $location) { + foreach ($location as $lang => $item) { $lang_file = CompiledYamlFile::instance($item['file']); $content = $lang_file->content(); $this->languages->join($lang, $content, '/'); From 4c94776ace21b9b979ebcf01da2e788d5b26ce57 Mon Sep 17 00:00:00 2001 From: Flavio Copes Date: Tue, 11 Aug 2015 10:08:45 +0200 Subject: [PATCH 12/14] Minor code improvements and typos --- system/blueprints/config/system.yaml | 2 +- system/src/Grav/Common/Grav.php | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/system/blueprints/config/system.yaml b/system/blueprints/config/system.yaml index f8e73018b..65401dece 100644 --- a/system/blueprints/config/system.yaml +++ b/system/blueprints/config/system.yaml @@ -180,7 +180,7 @@ form: languages.session_store_active: type: toggle label: Active language in session - help: "Support translations in Grav, plugins and extensions" + help: "Store the active language in the session" highlight: 0 options: 1: Yes diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 5e4737411..e9aceffef 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -257,7 +257,7 @@ class Grav extends Container $this['session']->close(); } - if ($this['uri']->isExternal($route)) { + if ($uri->isExternal($route)) { $url = $route; } else { $url = rtrim($uri->rootUrl(), '/') .'/'. trim($route, '/'); @@ -277,7 +277,6 @@ class Grav extends Container { /** @var Language $language */ $language = $this['language']; - $config = $this['config']; if ($language->enabled()) { return $this->redirect($language->getLanguage() . $route, $code); @@ -413,7 +412,7 @@ class Grav extends Container } /** - * This attempts to fine media, other files, and download them + * This attempts to find media, other files, and download them * @param $page * @param $path */ From 3cf5c6e4abd05e17037e5242034f13fb48ac9f8b Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Tue, 11 Aug 2015 15:46:48 -0600 Subject: [PATCH 13/14] Use GRAV_ROOT for session identifier #53 --- system/src/Grav/Common/Session.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Session.php b/system/src/Grav/Common/Session.php index cb63df20b..2b3469178 100644 --- a/system/src/Grav/Common/Session.php +++ b/system/src/Grav/Common/Session.php @@ -44,8 +44,8 @@ class Session extends \RocketTheme\Toolbox\Session\Session $session_path ); - $site_identifier = $config->get('site.title', 'unknown'); - $this->setName($config->get('system.session.name', 'grav_site') . '_' . substr(md5($site_identifier), 0, 7) . ($is_admin ? '_admin' : '')); + $unique_identifier = GRAV_ROOT; + $this->setName($config->get('system.session.name', 'grav_site') . '_' . substr(md5($unique_identifier), 0, 7) . ($is_admin ? '_admin' : '')); $this->start(); setcookie(session_name(), session_id(), time() + $session_timeout, $session_path); } From 5a7ad45a7e68faf2ea13a1aa533f8271aebb04d5 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Tue, 11 Aug 2015 19:38:07 -0600 Subject: [PATCH 14/14] version update --- CHANGELOG.md | 12 +++++++++++- system/defines.php | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e160286d..bd3a997a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,18 @@ # v0.9.36 -## XX/XX/2015 +## 08/11/2015 +1. [](#new) + * Added a new `newuser` CLI command to create user accounts + * Added `default` blueprint for all templates + * Support `user` and `system` language translation merging 1. [](#improved) * Added isSymlink method in GPM to determine if Grav is symbolically linked or not + * Refactored page recursing + * Updated blueprints to use new toggles + * Updated blueprints to use current date for date format fields + * Updated composer.phar + * Use sessions for admin even when disabled for site + * Use `GRAV_ROOT` in session identifier # v0.9.35 ## 08/06/2015 diff --git a/system/defines.php b/system/defines.php index 6828ce4fe..84c41d5f6 100644 --- a/system/defines.php +++ b/system/defines.php @@ -2,7 +2,7 @@ // Some standard defines define('GRAV', true); -define('GRAV_VERSION', '0.9.35'); +define('GRAV_VERSION', '0.9.36'); define('DS', '/'); // Directories and Paths