From 519a3e01f51993049fab5099fda3984ec6b86dd9 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 11:43:08 +0100 Subject: [PATCH 01/13] Added ip address repeater to form --- modules/cms/lang/en/lang.php | 5 +++++ .../cms/models/maintenancesetting/fields.yaml | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index 4994bc2f55..8e30fcc111 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -100,6 +100,11 @@ 'is_enabled' => 'Enable maintenance mode', 'is_enabled_comment' => 'Select the page to show when maintenance mode is activated.', 'hint' => 'Maintenance mode will display the maintenance page to visitors who are not signed in to the back-end area.', + 'ip_whitelist' => [ + 'name' => 'IP Whitelist', + 'ip' => 'IP Address', + 'label' => 'Rule Label' + ] ], 'page' => [ 'not_found_name' => "The page ':name' is not found", diff --git a/modules/cms/models/maintenancesetting/fields.yaml b/modules/cms/models/maintenancesetting/fields.yaml index 6c5e3dec4c..def741cda2 100644 --- a/modules/cms/models/maintenancesetting/fields.yaml +++ b/modules/cms/models/maintenancesetting/fields.yaml @@ -15,4 +15,21 @@ fields: cms_page: type: dropdown - cssClass: checkbox-align \ No newline at end of file + cssClass: checkbox-align + + ip_whitelist: + label: cms::lang.maintenance.ip_whitelist.name + type: repeater + cssClass: checkbox-align + form: + fields: + + ip: + label: cms::lang.maintenance.ip_whitelist.ip + type: text + span: left + + label: + label: cms::lang.maintenance.ip_whitelist.ip + type: text + span: right From c4bb1f1af3d5ff5cb002f4b62cf0b9bb5b1182c5 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 11:43:45 +0100 Subject: [PATCH 02/13] Added inWhitelist method to check ip addresses --- modules/cms/models/MaintenanceSetting.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index be806055b1..e5f5296bef 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -89,4 +89,15 @@ public function afterFetch() $this->is_enabled = false; } } + + /** + * Returns bool on if IP is in the whitelist + * @return bool + */ + public static function inWhitelist(string $ip): bool + { + return in_array($ip, array_map(function ($arr) { + return $arr['ip']; + }, static::get('ip_whitelist', []))); + } } From 559aee112359833b294012e1d45243b77eae1a32 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 11:44:18 +0100 Subject: [PATCH 03/13] Added ip check to maintenance condition --- modules/cms/classes/Controller.php | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/cms/classes/Controller.php b/modules/cms/classes/Controller.php index b61f52061d..c38f1aca63 100644 --- a/modules/cms/classes/Controller.php +++ b/modules/cms/classes/Controller.php @@ -163,6 +163,7 @@ public function run($url = '/') if ( MaintenanceSetting::isConfigured() && MaintenanceSetting::get('is_enabled', false) && + !MaintenanceSetting::inWhitelist(Request::ip()) && !BackendAuth::getUser() ) { if (!Request::ajax()) { From 1014958b862cb8e0b5bb3079057bc225baa6b3ba Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 14:11:29 +0100 Subject: [PATCH 04/13] Fixed incorrect lang for label --- modules/cms/models/maintenancesetting/fields.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms/models/maintenancesetting/fields.yaml b/modules/cms/models/maintenancesetting/fields.yaml index def741cda2..7272c8d64a 100644 --- a/modules/cms/models/maintenancesetting/fields.yaml +++ b/modules/cms/models/maintenancesetting/fields.yaml @@ -30,6 +30,6 @@ fields: span: left label: - label: cms::lang.maintenance.ip_whitelist.ip + label: cms::lang.maintenance.ip_whitelist.label type: text span: right From 67f5f71a36c9eb0a288690b4084012b1c24fe041 Mon Sep 17 00:00:00 2001 From: jaxwilko <31214002+jaxwilko@users.noreply.github.com> Date: Tue, 4 May 2021 15:20:53 +0100 Subject: [PATCH 05/13] Update modules/cms/models/MaintenanceSetting.php Co-authored-by: Luke Towers --- modules/cms/models/MaintenanceSetting.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index e5f5296bef..1532a744fc 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -91,7 +91,9 @@ public function afterFetch() } /** - * Returns bool on if IP is in the whitelist + * Check if the provided IP is in the whitelist + * + * @param string $ip * @return bool */ public static function inWhitelist(string $ip): bool From 79e4ddca8ce971a3f35dc0cdbaa93c2352c71d5a Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Tue, 4 May 2021 08:34:23 -0600 Subject: [PATCH 06/13] Update modules/cms/models/MaintenanceSetting.php --- modules/cms/models/MaintenanceSetting.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index 1532a744fc..11539c2a7b 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -98,8 +98,6 @@ public function afterFetch() */ public static function inWhitelist(string $ip): bool { - return in_array($ip, array_map(function ($arr) { - return $arr['ip']; - }, static::get('ip_whitelist', []))); + return \Symfony\Component\HttpFoundation\IpUtils::checkIp($ip, static::get('ip_whitelist', [])) } } From 30a2f99548739715332c0461a8c631f36063d0c5 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 15:51:54 +0100 Subject: [PATCH 07/13] Added Arr::pluck to get IP values --- modules/cms/models/MaintenanceSetting.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index 11539c2a7b..7c91b12e61 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -3,6 +3,8 @@ use Model; use Cms\Classes\Page; use Cms\Classes\Theme; +use Illuminate\Support\Arr; +use Symfony\Component\HttpFoundation\IpUtils; use ApplicationException; /** @@ -98,6 +100,6 @@ public function afterFetch() */ public static function inWhitelist(string $ip): bool { - return \Symfony\Component\HttpFoundation\IpUtils::checkIp($ip, static::get('ip_whitelist', [])) + return IpUtils::checkIp($ip, Arr::pluck(static::get('ip_whitelist', []), 'ip')); } } From 363562ed89fc5d77a044e41c69ac50af9db67e7c Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Tue, 4 May 2021 16:20:51 +0100 Subject: [PATCH 08/13] Switched to Winter Arr --- modules/cms/models/MaintenanceSetting.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index 7c91b12e61..edae03cc3f 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -3,7 +3,7 @@ use Model; use Cms\Classes\Page; use Cms\Classes\Theme; -use Illuminate\Support\Arr; +use Winter\Storm\Support\Arr; use Symfony\Component\HttpFoundation\IpUtils; use ApplicationException; From de9b33782c9417bc06f76426e7d0bfad7a01ef58 Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Tue, 4 May 2021 20:38:35 -0600 Subject: [PATCH 09/13] Update modules/cms/lang/en/lang.php --- modules/cms/lang/en/lang.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index 8e30fcc111..bf6804c972 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -103,7 +103,7 @@ 'ip_whitelist' => [ 'name' => 'IP Whitelist', 'ip' => 'IP Address', - 'label' => 'Rule Label' + 'label' => 'Description' ] ], 'page' => [ From 8c371172a36cb2bc1d13d6be5a45e7b14d80f069 Mon Sep 17 00:00:00 2001 From: Jack Wilkinson Date: Mon, 10 May 2021 17:07:09 +0100 Subject: [PATCH 10/13] Renamed method and updated lang strings --- modules/cms/lang/en/lang.php | 7 ++++--- modules/cms/models/MaintenanceSetting.php | 4 ++-- modules/cms/models/maintenancesetting/fields.yaml | 9 +++++---- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index bf6804c972..6402a9f2a5 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -100,9 +100,10 @@ 'is_enabled' => 'Enable maintenance mode', 'is_enabled_comment' => 'Select the page to show when maintenance mode is activated.', 'hint' => 'Maintenance mode will display the maintenance page to visitors who are not signed in to the back-end area.', - 'ip_whitelist' => [ - 'name' => 'IP Whitelist', - 'ip' => 'IP Address', + 'allowed_ips' => [ + 'name' => 'Allowed IP addresses', + 'description' => 'IP addresses that are permitted to view the site while maintenance mode is active', + 'ip' => 'IP address', 'label' => 'Description' ] ], diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index edae03cc3f..3cc0081d9f 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -98,8 +98,8 @@ public function afterFetch() * @param string $ip * @return bool */ - public static function inWhitelist(string $ip): bool + public static function inAllowedIps(string $ip): bool { - return IpUtils::checkIp($ip, Arr::pluck(static::get('ip_whitelist', []), 'ip')); + return IpUtils::checkIp($ip, Arr::pluck(static::get('allowed_ips', []), 'ip')); } } diff --git a/modules/cms/models/maintenancesetting/fields.yaml b/modules/cms/models/maintenancesetting/fields.yaml index 7272c8d64a..f5e1faeb87 100644 --- a/modules/cms/models/maintenancesetting/fields.yaml +++ b/modules/cms/models/maintenancesetting/fields.yaml @@ -17,19 +17,20 @@ fields: type: dropdown cssClass: checkbox-align - ip_whitelist: - label: cms::lang.maintenance.ip_whitelist.name + allowed_ips: + label: cms::lang.maintenance.allowed_ips.name type: repeater + commentAbove: cms::lang.maintenance.allowed_ips.description cssClass: checkbox-align form: fields: ip: - label: cms::lang.maintenance.ip_whitelist.ip + label: cms::lang.maintenance.allowed_ips.ip type: text span: left label: - label: cms::lang.maintenance.ip_whitelist.label + label: cms::lang.maintenance.allowed_ips.label type: text span: right From beadc1c23bc7cb89895096b43d1677047b276b7b Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Mon, 10 May 2021 16:06:37 -0600 Subject: [PATCH 11/13] Apply suggestions from code review --- modules/cms/classes/Controller.php | 2 +- modules/cms/models/MaintenanceSetting.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cms/classes/Controller.php b/modules/cms/classes/Controller.php index c38f1aca63..28e659ac2f 100644 --- a/modules/cms/classes/Controller.php +++ b/modules/cms/classes/Controller.php @@ -163,7 +163,7 @@ public function run($url = '/') if ( MaintenanceSetting::isConfigured() && MaintenanceSetting::get('is_enabled', false) && - !MaintenanceSetting::inWhitelist(Request::ip()) && + !MaintenanceSetting::isAllowedIp(Request::ip()) && !BackendAuth::getUser() ) { if (!Request::ajax()) { diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index 3cc0081d9f..e92d9ea549 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -98,7 +98,7 @@ public function afterFetch() * @param string $ip * @return bool */ - public static function inAllowedIps(string $ip): bool + public static function isAllowedIp(string $ip): bool { return IpUtils::checkIp($ip, Arr::pluck(static::get('allowed_ips', []), 'ip')); } From d9b973dada68a02f474f0090b04bb1da372be1a6 Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Tue, 29 Jun 2021 22:00:31 +0800 Subject: [PATCH 12/13] Minor tweaks --- modules/cms/models/MaintenanceSetting.php | 2 +- modules/cms/models/maintenancesetting/fields.yaml | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/cms/models/MaintenanceSetting.php b/modules/cms/models/MaintenanceSetting.php index e92d9ea549..890ea014d0 100644 --- a/modules/cms/models/MaintenanceSetting.php +++ b/modules/cms/models/MaintenanceSetting.php @@ -93,7 +93,7 @@ public function afterFetch() } /** - * Check if the provided IP is in the whitelist + * Check if the provided IP is in the allowed IP list. * * @param string $ip * @return bool diff --git a/modules/cms/models/maintenancesetting/fields.yaml b/modules/cms/models/maintenancesetting/fields.yaml index f5e1faeb87..2839225a4b 100644 --- a/modules/cms/models/maintenancesetting/fields.yaml +++ b/modules/cms/models/maintenancesetting/fields.yaml @@ -24,12 +24,10 @@ fields: cssClass: checkbox-align form: fields: - ip: label: cms::lang.maintenance.allowed_ips.ip type: text span: left - label: label: cms::lang.maintenance.allowed_ips.label type: text From ce7e23073f5e271b75bd55ed5f787ca55b1507df Mon Sep 17 00:00:00 2001 From: Ben Thomson Date: Mon, 30 Aug 2021 01:39:55 +0000 Subject: [PATCH 13/13] Change prompt label --- modules/cms/lang/en/lang.php | 1 + modules/cms/models/maintenancesetting/fields.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/cms/lang/en/lang.php b/modules/cms/lang/en/lang.php index 6402a9f2a5..fe19adfc2b 100644 --- a/modules/cms/lang/en/lang.php +++ b/modules/cms/lang/en/lang.php @@ -103,6 +103,7 @@ 'allowed_ips' => [ 'name' => 'Allowed IP addresses', 'description' => 'IP addresses that are permitted to view the site while maintenance mode is active', + 'prompt' => 'Add an IP Address', 'ip' => 'IP address', 'label' => 'Description' ] diff --git a/modules/cms/models/maintenancesetting/fields.yaml b/modules/cms/models/maintenancesetting/fields.yaml index 2839225a4b..765590e2c5 100644 --- a/modules/cms/models/maintenancesetting/fields.yaml +++ b/modules/cms/models/maintenancesetting/fields.yaml @@ -21,6 +21,7 @@ fields: label: cms::lang.maintenance.allowed_ips.name type: repeater commentAbove: cms::lang.maintenance.allowed_ips.description + prompt: cms::lang.maintenance.allowed_ips.prompt cssClass: checkbox-align form: fields: