diff --git a/.upgrade.yml b/.upgrade.yml new file mode 100644 index 0000000..5872d59 --- /dev/null +++ b/.upgrade.yml @@ -0,0 +1,12 @@ +mappings: + VersionFeed: SilverStripe\VersionFeed\VersionFeed + VersionFeed_Controller: SilverStripe\VersionFeed\VersionFeedController + VersionFeedSiteConfig: SilverStripe\VersionFeed\VersionFeedSiteConfig + CachedContentFilter: SilverStripe\VersionFeed\Filters\CachedContentFilter + ContentFilter: SilverStripe\VersionFeed\Filters\ContentFilter + RateLimitFilter: SilverStripe\VersionFeed\Filters\RateLimitFilter + \VersionFeed\Filters\CachedContentFilter: SilverStripe\VersionFeed\Filters\CachedContentFilter + \VersionFeed\Filters\ContentFilter: SilverStripe\VersionFeed\Filters\ContentFilter + \VersionFeed\Filters\RateLimitFilter: SilverStripe\VersionFeed\Filters\RateLimitFilter + VersionFeedFunctionalTest: SilverStripe\VersionFeed\Tests\VersionFeedFunctionalTest + VersionFeedTest: SilverStripe\VersionFeed\Tests\VersionFeedTest diff --git a/src/Filters/CachedContentFilter.php b/src/Filters/CachedContentFilter.php index d9ccf05..73dc2a5 100644 --- a/src/Filters/CachedContentFilter.php +++ b/src/Filters/CachedContentFilter.php @@ -1,6 +1,12 @@ getCache(); // Return cached value if available - $cacheEnabled = \Config::inst()->get(get_class(), 'cache_enabled'); + $cacheEnabled = Config::inst()->get(get_class(), 'cache_enabled'); $result = (isset($_GET['flush']) || !$cacheEnabled) ? null : $cache->load($key); diff --git a/src/Filters/ContentFilter.php b/src/Filters/ContentFilter.php index be26b95..e2670f3 100644 --- a/src/Filters/ContentFilter.php +++ b/src/Filters/ContentFilter.php @@ -1,6 +1,14 @@ setOption('automatic_serialization', true); // Map 0 to null for unlimited lifetime - $lifetime = \Config::inst()->get(get_class($this), 'cache_lifetime') ?: null; + $lifetime = Config::inst()->get(get_class($this), 'cache_lifetime') ?: null; $cache->setLifetime($lifetime); return $cache; } diff --git a/src/Filters/RateLimitFilter.php b/src/Filters/RateLimitFilter.php index e79e00d..d6a232b 100644 --- a/src/Filters/RateLimitFilter.php +++ b/src/Filters/RateLimitFilter.php @@ -1,6 +1,16 @@ get(get_class(), 'lock_bypage')) { + if(Config::inst()->get(get_class(), 'lock_bypage')) { $key .= '_' . md5($itemkey); } // Add user-specific identifier - if(\Config::inst()->get(get_class(), 'lock_byuserip') && \Controller::has_curr()) { - $ip = \Controller::curr()->getRequest()->getIP(); + if(Config::inst()->get(get_class(), 'lock_byuserip') && Controller::has_curr()) { + $ip = Controller::curr()->getRequest()->getIP(); $key .= '_' . md5($ip); } @@ -76,7 +86,7 @@ class RateLimitFilter extends ContentFilter { public function getContent($key, $callback) { // Bypass rate limiting if flushing, or timeout isn't set - $timeout = \Config::inst()->get(get_class(), 'lock_timeout'); + $timeout = Config::inst()->get(get_class(), 'lock_timeout'); if(isset($_GET['flush']) || !$timeout) { return parent::getContent($key, $callback); } @@ -87,7 +97,7 @@ class RateLimitFilter extends ContentFilter { if($lockedUntil = $cache->load($limitKey)) { if(time() < $lockedUntil) { // Politely inform visitor of limit - $response = new \SS_HTTPResponse_Exception('Too Many Requests.', 429); + $response = new HTTPResponse_Exception('Too Many Requests.', 429); $response->getResponse()->addHeader('Retry-After', 1 + $lockedUntil - time()); throw $response; } @@ -100,7 +110,7 @@ class RateLimitFilter extends ContentFilter { $result = parent::getContent($key, $callback); // Reset rate limit with optional cooldown - if($cooldown = \Config::inst()->get(get_class(), 'lock_cooldown')) { + if($cooldown = Config::inst()->get(get_class(), 'lock_cooldown')) { // Set cooldown on successful query execution $cache->save(time() + $cooldown, $limitKey); } else { diff --git a/src/VersionFeed.php b/src/VersionFeed.php index 63f52b1..a13989b 100644 --- a/src/VersionFeed.php +++ b/src/VersionFeed.php @@ -1,5 +1,28 @@ get('VersionFeed', 'changes_enabled') + if(!Config::inst()->get(VersionFeed::class, 'changes_enabled') || !$this->owner->PublicHistory || $this->owner->Version == '' ) { @@ -59,7 +87,7 @@ class VersionFeed_Controller extends Extension { $target = $this->owner; $key = implode('_', array('changes', $this->owner->ID, $this->owner->Version)); $entries = $this->filterContent($key, function() use ($target) { - return $target->getDiffList(null, Config::inst()->get('VersionFeed', 'changes_limit')); + return $target->getDiffList(null, Config::inst()->get(VersionFeed::class, 'changes_limit')); }); // Generate the output. @@ -74,13 +102,13 @@ class VersionFeed_Controller extends Extension { */ public function allchanges() { // Check viewability of allchanges - if(!Config::inst()->get('VersionFeed', 'allchanges_enabled') + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled') || !SiteConfig::current_site_config()->AllChangesEnabled ) { return $this->owner->httpError(404, 'Global history not viewable'); } - $limit = (int)Config::inst()->get('VersionFeed', 'allchanges_limit'); + $limit = (int)Config::inst()->get(VersionFeed::class, 'allchanges_limit'); $latestChanges = DB::query(' SELECT * FROM "SiteTree_versions" WHERE "WasPublished" = \'1\' @@ -135,7 +163,7 @@ class VersionFeed_Controller extends Extension { * Generates and embeds the RSS header link for the page-specific version rss feed */ public function linkToPageRSSFeed() { - if (!Config::inst()->get('VersionFeed', 'changes_enabled') || !$this->owner->PublicHistory) { + if (!Config::inst()->get(VersionFeed::class, 'changes_enabled') || !$this->owner->PublicHistory) { return; } @@ -152,7 +180,7 @@ class VersionFeed_Controller extends Extension { * Generates and embeds the RSS header link for the global version rss feed */ public function linkToAllSiteRSSFeed() { - if(!Config::inst()->get('VersionFeed', 'allchanges_enabled') + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled') || !SiteConfig::current_site_config()->AllChangesEnabled ) { return; diff --git a/src/VersionFeedSiteConfig.php b/src/VersionFeedSiteConfig.php index 2320bc5..a646638 100644 --- a/src/VersionFeedSiteConfig.php +++ b/src/VersionFeedSiteConfig.php @@ -1,5 +1,21 @@ get('VersionFeed', 'allchanges_enabled')) return; + public function updateCMSFields(FieldList $fields) { + if(!Config::inst()->get(VersionFeed::class, 'allchanges_enabled')) return; $fields->addFieldToTab('Root.Access', FieldGroup::create(new CheckboxField('AllChangesEnabled', $this->owner->fieldLabel('AllChangesEnabled'))) diff --git a/tests/VersionFeedFunctionalTest.php b/tests/VersionFeedFunctionalTest.php index c6fe994..e53be6e 100644 --- a/tests/VersionFeedFunctionalTest.php +++ b/tests/VersionFeedFunctionalTest.php @@ -1,10 +1,29 @@ array('VersionFeed'), - 'Page_Controller' => array('VersionFeed_Controller'), + 'Page' => array(VersionFeed::class), + 'Page_Controller' => array(VersionFeedController::class), ); protected $userIP; @@ -12,15 +31,15 @@ class VersionFeedFunctionalTest extends FunctionalTest { public function setUp() { parent::setUp(); - $cache = SS_Cache::factory('VersionFeed_Controller'); + $cache = SS_Cache::factory(VersionFeedController::class); $cache->clean(Zend_Cache::CLEANING_MODE_ALL); $this->userIP = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : null; Config::nest(); // Enable history by default - Config::inst()->update('VersionFeed', 'changes_enabled', true); - Config::inst()->update('VersionFeed', 'allchanges_enabled', true); + Config::inst()->update(VersionFeed::class, 'changes_enabled', true); + Config::inst()->update(VersionFeed::class, 'allchanges_enabled', true); // Disable caching and locking by default Config::inst()->update('VersionFeed\Filters\CachedContentFilter', 'cache_enabled', false); @@ -72,7 +91,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Artifically set cache lock Config::inst()->update('VersionFeed\Filters\RateLimitFilter', 'lock_byuserip', false); - $cache = SS_Cache::factory('VersionFeed_Controller'); + $cache = SS_Cache::factory(VersionFeedController::class); $cache->setOption('automatic_serialization', true); $cache->save(time() + 10, \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX); @@ -89,7 +108,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { $key = implode('_', array( 'changes', $page1->ID, - Versioned::get_versionnumber_by_stage('SiteTree', 'Live', $page1->ID, false) + Versioned::get_versionnumber_by_stage(SiteTree::class, 'Live', $page1->ID, false) )); $key = \VersionFeed\Filters\RateLimitFilter::CACHE_PREFIX . '_' . md5($key); $cache->save(time() + 10, $key); @@ -195,7 +214,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'changes' action foreach(array(true, false) as $publicHistory_Config) { - Config::inst()->update('VersionFeed', 'changes_enabled', $publicHistory_Config); + Config::inst()->update(VersionFeed::class, 'changes_enabled', $publicHistory_Config); $expectedResponse = $publicHistory_Page && $publicHistory_Config ? 200 : 404; $response = $this->get($page->RelativeLink('changes')); $this->assertEquals($expectedResponse, $response->getStatusCode()); @@ -204,7 +223,7 @@ class VersionFeedFunctionalTest extends FunctionalTest { // Test requests to 'allchanges' action on each page foreach(array(true, false) as $allChanges_Config) { foreach(array(true, false) as $allChanges_SiteConfig) { - Config::inst()->update('VersionFeed', 'allchanges_enabled', $allChanges_Config); + Config::inst()->update(VersionFeed::class, 'allchanges_enabled', $allChanges_Config); $siteConfig = SiteConfig::current_site_config(); $siteConfig->AllChangesEnabled = $allChanges_SiteConfig; $siteConfig->write(); diff --git a/tests/VersionFeedTest.php b/tests/VersionFeedTest.php index f782c6f..48cb591 100644 --- a/tests/VersionFeedTest.php +++ b/tests/VersionFeedTest.php @@ -1,11 +1,21 @@ array('VersionFeed'), - 'ContentController' => array('VersionFeed_Controller'), + 'SiteTree' => array(VersionFeed::class), + 'ContentController' => array(VersionFeedController::class), ); protected $illegalExtensions = array(