diff --git a/1984-hosting-support.php b/1984-hosting-support.php
index 3cc08bf..6597503 100644
--- a/1984-hosting-support.php
+++ b/1984-hosting-support.php
@@ -2,11 +2,13 @@
/*
* Plugin Name: 1984 Hosting Support
- * Version: 1.0.1
- * Author: 1984 ehf
+ * Version: 1.1.0
+ * Author: 1984 ehf.
* Author URI: https://1984.hosting
* Description: Support plugin for 1984 Hosting customers.
* Update URI: https://git.1984.is/1984/1984-hosting-support/
+ * Text Domain: hostingsupport1984
+ * Domain Path: /languages
*/
/**
@@ -19,6 +21,7 @@
* There are other classes that may depend on this file, so only remove it if
* you do not intend to use the plugin.
*/
+
class HostingSupport1984 {
const HOSTING_SUPPORT_VERSION = '0.4.0';
@@ -51,6 +54,51 @@ class HostingSupport1984 {
'switch_theme',
array( $this, 'theme_switch_hook' )
);
+
+ // Add a clear warning on the Patchstack plugin row to discourage removal.
+ add_filter(
+ 'plugin_row_meta',
+ array(
+ $this,
+ 'add_patchstack_warning_row_meta',
+ ),
+ 10,
+ 2
+ );
+
+ // Prevent deactivation/deletion of this plugin and Patchstack via UI links.
+ add_filter(
+ 'plugin_action_links',
+ array(
+ $this,
+ 'filter_plugin_action_links',
+ ),
+ 10,
+ 4
+ );
+ add_filter(
+ 'network_admin_plugin_action_links',
+ array(
+ $this,
+ 'filter_plugin_action_links',
+ ),
+ 10,
+ 4
+ );
+
+ // Guard against direct requests (single and bulk) on Plugins screens and updater endpoints.
+ add_action( 'load-plugins.php', array(
+ $this,
+ 'protect_plugins_admin_actions',
+ ) );
+ add_action( 'load-plugins-network.php', array(
+ $this,
+ 'protect_plugins_admin_actions',
+ ) );
+ add_action( 'load-update.php', array(
+ $this,
+ 'protect_plugins_admin_actions',
+ ) );
}
/**
@@ -66,15 +114,6 @@ class HostingSupport1984 {
);
}
- /**
- * Check if Patchstack is enabled.
- *
- * @return Boolean
- */
- public function is_patchstack_active() {
- return is_plugin_active( 'patchstack/patchstack.php' );
- }
-
/**
* On activation of this plugin, set auto-update option for core,
* plus enable auto-updates for installed plugins and themes.
@@ -100,6 +139,15 @@ class HostingSupport1984 {
update_site_option( 'auto_update_themes', array_keys( $all_themes ) );
}
+ /**
+ * Check if Patchstack is enabled.
+ *
+ * @return Boolean
+ */
+ public function is_patchstack_active() {
+ return is_plugin_active( 'patchstack/patchstack.php' );
+ }
+
/**
* On plugin activation, add to auto-updated list of plugins.
*
@@ -111,7 +159,7 @@ class HostingSupport1984 {
return;
}
- $auto_updated_plugins = (array) get_site_option( 'auto_update_plugins', array() );
+ $auto_updated_plugins = (array) get_site_option( 'auto_update_plugins', array() );
$auto_updated_plugins[] = $plugin;
update_site_option( 'auto_update_plugins', array_unique( $auto_updated_plugins ) );
@@ -131,6 +179,155 @@ class HostingSupport1984 {
$all_themes = wp_get_themes();
update_site_option( 'auto_update_themes', array_keys( $all_themes ) );
}
+
+ /**
+ * Append a prominent warning to the Patchstack plugin row in the Plugins screen.
+ *
+ * @param array $links Existing row meta links.
+ * @param string $file Plugin file path about plugins directory.
+ *
+ * @return array Modified row meta-links.
+ */
+ public function add_patchstack_warning_row_meta( array $links, string $file ): array {
+ // Only show the warning on the Patchstack row AND only if Patchstack is active.
+ if ( 'patchstack/patchstack.php' !== $file || ! $this->is_patchstack_active() ) {
+ return $links;
+ }
+
+ $warning_text =
+ __( '1984 Hosting: Please do not deactivate or delete this plugin - part of your WordPress Service Pack.', 'hostingsupport1984' );
+
+ $logo_1984_url = plugins_url( 'icons/1984-hosting-logo.webp', __FILE__ );
+ $logo_patchstack = plugins_url( 'icons/patchstack-logo.svg', __FILE__ );
+
+ $title_1984 = __( 'Visit 1984 Hosting Homepage', 'hostingsupport1984' );
+ $title_patchstack = __( 'Visit Patchstack Homepage', 'hostingsupport1984' );
+
+ $container_open =
+ '';
+
+ $warning_icon =
+ '';
+
+ $text_html = '' . esc_html( $warning_text ) . '';
+
+
+ $logos_html =
+ ''
+ .
+ ''
+ .
+ '
'
+ .
+ ''
+ .
+ ''
+ .
+ '
'
+ .
+ ''
+ .
+ '';
+
+ $links[] = $container_open . $warning_icon . $text_html . $logos_html . '';
+
+ return $links;
+ }
+
+ /**
+ * Remove Deactivate/Delete action links for protected plugins (single and network admin).
+ *
+ * @param array $actions
+ * @param string $plugin_file
+ * @param array $plugin_data
+ * @param string $context
+ *
+ * @return array
+ */
+ public function filter_plugin_action_links(
+ array $actions, string $plugin_file, array $plugin_data,
+ string $context
+ ): array {
+ if ( $this->is_protected_plugin( $plugin_file ) ) {
+ unset( $actions['deactivate'] );
+ unset( $actions['delete'] );
+ }
+
+ return $actions;
+ }
+
+ /**
+ * Determine if a plugin file is in the protected list.
+ *
+ * @param string $plugin_file
+ *
+ * @return bool
+ */
+ private function is_protected_plugin( string $plugin_file ): bool {
+ return in_array( $plugin_file, $this->get_protected_plugins(), true );
+ }
+
+ /**
+ * Return plugin basenames that must be protected from deactivation/deletion.
+ *
+ * @return string[]
+ */
+ private function get_protected_plugins(): array {
+ // Always protect this plugin from deactivation/deletion.
+ $own = plugin_basename( __FILE__ );
+ $protected = array( $own );
+
+ // Additionally protect Patchstack - but only while it is active.
+ if ( $this->is_patchstack_active() ) {
+ $protected[] = 'patchstack/patchstack.php';
+ }
+
+ return $protected;
+ }
+
+ /**
+ * Intercept admin actions attempting to deactivate or delete protected plugins and block them.
+ */
+ public function protect_plugins_admin_actions() {
+ // Collect requested action(s).
+ $action = isset( $_REQUEST['action'] ) ? sanitize_key( (string) $_REQUEST['action'] ) : '';
+ $action2 = isset( $_REQUEST['action2'] ) ? sanitize_key( (string) $_REQUEST['action2'] ) : '';
+
+ $targets = array();
+ if ( ! empty( $_REQUEST['plugin'] ) ) {
+ $targets[] = sanitize_text_field( (string) $_REQUEST['plugin'] );
+ }
+ if ( ! empty( $_REQUEST['checked'] ) && is_array( $_REQUEST['checked'] ) ) {
+ foreach ( $_REQUEST['checked'] as $pf ) {
+ $targets[] = sanitize_text_field( (string) $pf );
+ }
+ }
+
+ if ( empty( $targets ) ) {
+ return;
+ }
+
+ $blocked_actions = array(
+ 'deactivate',
+ 'deactivate-selected',
+ 'delete',
+ 'delete-selected',
+ 'delete-plugin',
+ );
+
+ if ( ! in_array( $action, $blocked_actions, true ) && ! in_array( $action2, $blocked_actions, true ) ) {
+ return;
+ }
+
+ $protected = $this->get_protected_plugins();
+ $intersect = array_intersect( $targets, $protected );
+ if ( ! empty( $intersect ) ) {
+ wp_die(
+ __( 'For security, this action is blocked: 1984 Hosting Support cannot be deactivated or deleted. Patchstack cannot be deactivated or deleted while it is active.', 'hostingsupport1984' ),
+ 403
+ );
+ }
+ }
}
$hosting_support_1984 = new HostingSupport1984();
diff --git a/icons/patchstack-logo.svg b/icons/patchstack-logo.svg
new file mode 100644
index 0000000..6bc8eb7
--- /dev/null
+++ b/icons/patchstack-logo.svg
@@ -0,0 +1,86 @@
+
\ No newline at end of file
diff --git a/js/1984-hosting-support.js b/js/1984-hosting-support.js
index 310ba84..2d6a6c1 100644
--- a/js/1984-hosting-support.js
+++ b/js/1984-hosting-support.js
@@ -4,16 +4,14 @@
* @license https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html GNU General Public License v2.0
*/
-function HostingSupport1984CopyEmailAddress( e ) {
- e.preventDefault();
- var emailAddressTag = document.querySelector( '#hosting-support-1984-address' );
- emailAddressTag.select();
- document.execCommand( 'copy' );
+function HostingSupport1984CopyEmailAddress(e) {
+ e.preventDefault();
+ const emailAddressTag = document.querySelector('#hosting-support-1984-address');
+ navigator.clipboard.writeText(emailAddressTag.value)
+ .catch(err => console.error("Clipboard write failed:", err));
}
-if (document.querySelector( '#hosting-support-1984-link' )) {
- document.querySelector( '#hosting-support-1984-link' ).addEventListener(
- 'click',
- HostingSupport1984CopyEmailAddress
- );
+const hostingSupport1984Link = document.querySelector('#hosting-support-1984-link');
+if (hostingSupport1984Link) {
+ hostingSupport1984Link.addEventListener('click', HostingSupport1984CopyEmailAddress);
}
diff --git a/languages/hostingsupport1984-is_IS.mo b/languages/hostingsupport1984-is_IS.mo
index bc9b2ab..9c81070 100644
Binary files a/languages/hostingsupport1984-is_IS.mo and b/languages/hostingsupport1984-is_IS.mo differ
diff --git a/languages/hostingsupport1984-is_IS.po b/languages/hostingsupport1984-is_IS.po
index ff32444..007bf31 100644
--- a/languages/hostingsupport1984-is_IS.po
+++ b/languages/hostingsupport1984-is_IS.po
@@ -1,41 +1,77 @@
+# Copyright (C) 2025 1984 ehf.
+# This file is distributed under the same license as the 1984 Hosting Support plugin.
msgid ""
msgstr ""
-"Project-Id-Version: 1984 Big Brother\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-01-19 10:05+0000\n"
-"PO-Revision-Date: 2021-01-19 10:09+0000\n"
-"Last-Translator: \n"
-"Language-Team: Íslenska\n"
-"Language: is_IS\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Project-Id-Version: 1984 Hosting Support 1.1.0\n"
+"Report-Msgid-Bugs-To: https://git.1984.is/1984/1984-hosting-support"
+"support\n"
+"POT-Creation-Date: 2025-12-02T11:33:54+00:00\n"
+"PO-Revision-Date: 2025-12-02T11:00:44+00:00\n"
+"Last-Translator: Sævar Bergur Sigurgeirsson \n"
+"Language-Team: none\n"
+"Language: is\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Loco https://localise.biz/\n"
-"X-Loco-Version: 2.4.2; wp-5.6"
+"X-Generator: WP-CLI 2.12.0\n"
+"X-Domain: hostingsupport1984\n"
-#: 1984-hosting-support-ui.php:100
+#. Plugin Name of the plugin
+#: 1984-hosting-support.php 1984-hosting-support-ui.php:49
msgid "1984 Hosting Support"
msgstr "Aðstoð og stuðningur hjá 1984"
-#. Name of the plugin
-msgid "1984-hosting-support.php"
+#. Description of the plugin
+#: 1984-hosting-support.php
+msgid "Support plugin for 1984 Hosting customers."
+msgstr "Stuðningsviðbót fyrir viðskiptavini 1984."
+
+#. Author of the plugin
+#: 1984-hosting-support.php
+msgid "1984 ehf."
msgstr ""
-#: views/support-dashboard-widget.php:31
+#. Author URI of the plugin
+#: 1984-hosting-support.php
+msgid "https://1984.hosting"
+msgstr ""
+
+#: 1984-hosting-support.php:197
+msgid ""
+"1984 Hosting: Please do not deactivate or delete this plugin - part of your "
+"WordPress Service Pack."
+msgstr ""
+"1984 Hosting: Vinsamlegast ekki slökkva á eða eyða þessari viðbót - hún er "
+"hluti af WordPress þjónustupakkanum þínum."
+
+#: 1984-hosting-support.php:202
+msgid "Visit 1984 Hosting Homepage"
+msgstr "Heimsækja vefsíðu 1984 Hosting"
+
+#: 1984-hosting-support.php:203
+msgid "Visit Patchstack Homepage"
+msgstr "Heimsækja vefsíðu Patchstack"
+
+#: 1984-hosting-support.php:322
+msgid ""
+"For security, this action is blocked: 1984 Hosting Support and Patchstack "
+"cannot be deactivated or deleted while this policy is active."
+msgstr ""
+"Af öryggisástæðum er þessari aðgerð hafnað: 1984 Hosting Support og "
+"Patchstack er ekki hægt að slökkva á eða eyða meðan þessi regla er virk."
+
+#: views/support-dashboard-widget.php:21
msgid "My Profile"
msgstr "Minn aðgangur"
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:34
msgid "My Sites, Domains & VPSs"
msgstr "Vefir, lén og sýndarvélar"
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:48
msgid "Knowledge Base"
msgstr "Viskubrunnur 1984"
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:62
msgid "Contact Support"
msgstr "Fá aðstoð"
-
-
diff --git a/languages/hostingsupport1984.pot b/languages/hostingsupport1984.pot
index 15d27ae..892a99e 100644
--- a/languages/hostingsupport1984.pot
+++ b/languages/hostingsupport1984.pot
@@ -1,41 +1,68 @@
+# Copyright (C) 2025 1984 ehf.
+# This file is distributed under the same license as the 1984 Hosting Support plugin.
msgid ""
msgstr ""
-"Project-Id-Version: 1984 Big Brother\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-01-19 10:05+0000\n"
-"PO-Revision-Date: 2021-01-19 10:09+0000\n"
-"Last-Translator: \n"
-"Language-Team: Íslenska\n"
-"Language: is_IS\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"Project-Id-Version: 1984 Hosting Support 1.1.0\n"
+"Report-Msgid-Bugs-To: https://git.1984.is/1984/1984-hosting-support\n"
+"Last-Translator: Sævar Bergur Sigurgeirsson \n"
+"Language-Team: none\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Loco https://localise.biz/\n"
-"X-Loco-Version: 2.4.2; wp-5.6"
+"POT-Creation-Date: 2025-12-02T11:33:54+00:00\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"X-Generator: WP-CLI 2.12.0\n"
+"X-Domain: hostingsupport1984\n"
-#: 1984-hosting-support-ui.php:100
+#. Plugin Name of the plugin
+#: 1984-hosting-support.php
+#: 1984-hosting-support-ui.php:49
msgid "1984 Hosting Support"
-msgstr "Aðstoð og stuðningur hjá 1984"
-
-#. Name of the plugin
-msgid "1984-hosting-support.php"
msgstr ""
-#: views/support-dashboard-widget.php:31
+#. Description of the plugin
+#: 1984-hosting-support.php
+msgid "Support plugin for 1984 Hosting customers."
+msgstr ""
+
+#. Author of the plugin
+#: 1984-hosting-support.php
+msgid "1984 ehf."
+msgstr ""
+
+#. Author URI of the plugin
+#: 1984-hosting-support.php
+msgid "https://1984.hosting"
+msgstr ""
+
+#: 1984-hosting-support.php:197
+msgid "1984 Hosting: Please do not deactivate or delete this plugin - part of your WordPress Service Pack."
+msgstr ""
+
+#: 1984-hosting-support.php:202
+msgid "Visit 1984 Hosting Homepage"
+msgstr ""
+
+#: 1984-hosting-support.php:203
+msgid "Visit Patchstack Homepage"
+msgstr ""
+
+#: 1984-hosting-support.php:322
+msgid "For security, this action is blocked: 1984 Hosting Support and Patchstack cannot be deactivated or deleted while this policy is active."
+msgstr ""
+
+#: views/support-dashboard-widget.php:21
msgid "My Profile"
msgstr ""
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:34
msgid "My Sites, Domains & VPSs"
msgstr ""
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:48
msgid "Knowledge Base"
msgstr ""
-#: views/support-dashboard-widget.php:15
+#: views/support-dashboard-widget.php:62
msgid "Contact Support"
msgstr ""
-
-
diff --git a/style/1984-hosting-support.css b/style/1984-hosting-support.css
index 49ca127..3ccd4fd 100644
--- a/style/1984-hosting-support.css
+++ b/style/1984-hosting-support.css
@@ -7,51 +7,33 @@
* https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
**/
-#hostingsupport1984_support_widget {
- background: #fffbee;
-}
-
-#adminmenu a.toplevel_page_hostingsupport1984_manage {
- background-color: #b48701;
- font-weight: bold;
-}
-
-#adminmenu a.toplevel_page_hostingsupport1984_manage:hover {
- color: #fff;
-}
-
-#adminmenu a.toplevel_page_hostingsupport1984_manage div.wp-menu-image::before {
- color: #fff;
-}
-
#hosting-support-1984-main-links {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 0.2rem;
- list-style-type: none;
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 0.2rem;
+ list-style-type: none;
}
.hosting-support-1984-li {
}
.hosting-support-1984-icon {
- width: 5.3em;
- height: auto;
- display: block;
- margin: auto;
+ width: 5.3em;
+ height: auto;
+ display: block;
+ margin: auto;
}
.hosting-support-1984-text {
- text-align: center;
+ text-align: center;
}
#hosting-support-1984-logo {
- display: flex;
- justify-content: flex-end;
+ display: flex;
+ justify-content: flex-end;
}
#hosting-support-1984-logo img {
- width: auto;
- height: 1.5em;
-}
-
+ width: auto;
+ height: 1.5em;
+}
\ No newline at end of file