diff --git a/plugin.php b/plugin.php
index 6af3d74..0d213c2 100644
--- a/plugin.php
+++ b/plugin.php
@@ -2,37 +2,46 @@
/*
Plugin Name: ICC Webmaster Settings
Plugin URI: https://github.com/ivancarlosti/yourlsiccwebmastersettings
-Description: Change Logo, Title, Page Footer, add custom CSS, and customize favicon lines
-Version: 1.01
+Description: Customize Logo, Title, Footer, CSS & Favicons. Add reCAPTCHA v3, Meta Redirects (delayed), and Force 302 Redirects.
+Version: 2.0
Author: Ivan Carlos
Author URI: https://ivancarlos.com.br/
*/
// No direct call
-if( !defined( 'YOURLS_ABSPATH' ) ) die();
+if (!defined('YOURLS_ABSPATH'))
+ die();
+
+// Default redirect delay in seconds (used when option unset)
+define('ICC_MRDR_DEFAULT_DELAY', 1);
// Register unified config page
-yourls_add_action( 'plugins_loaded', 'icc_config_add_page' );
-function icc_config_add_page() {
- yourls_register_plugin_page( 'icc_logo_title_footer_favicon_config', 'Webmaster Settings', 'icc_config_do_page' );
+yourls_add_action('plugins_loaded', 'icc_config_add_page');
+function icc_config_add_page()
+{
+ yourls_register_plugin_page('icc_logo_title_footer_favicon_config', 'Webmaster Settings', 'icc_config_do_page');
}
// Handle and display unified config page
-function icc_config_do_page() {
- if( isset( $_POST['icc_submit'] ) ) icc_config_update_option();
+function icc_config_do_page()
+{
+ if (isset($_POST['icc_submit']))
+ icc_config_update_option();
// Options
- $icc_logo_imageurl = yourls_get_option( 'icc_logo_imageurl' );
- $icc_logo_imageurl_tag = yourls_get_option( 'icc_logo_imageurl_tag' );
- $icc_logo_imageurl_title = yourls_get_option( 'icc_logo_imageurl_title' );
- $icc_title_custom = yourls_get_option( 'icc_title_custom' );
- $icc_footer_text = yourls_get_option( 'icc_footer_text' );
- if ($icc_footer_text === false) $icc_footer_text = '';
+ $icc_logo_imageurl = yourls_get_option('icc_logo_imageurl');
+ $icc_logo_imageurl_tag = yourls_get_option('icc_logo_imageurl_tag');
+ $icc_logo_imageurl_title = yourls_get_option('icc_logo_imageurl_title');
+ $icc_title_custom = yourls_get_option('icc_title_custom');
+ $icc_footer_text = yourls_get_option('icc_footer_text');
+ if ($icc_footer_text === false)
+ $icc_footer_text = '';
$footer_text_escaped = htmlspecialchars($icc_footer_text);
// Custom CSS option
- $icc_custom_css = yourls_get_option( 'icc_custom_css' );
- if ($icc_custom_css === false) $icc_custom_css = '';
+ $icc_custom_css = yourls_get_option('icc_custom_css');
+ if ($icc_custom_css === false)
+ $icc_custom_css = '';
$custom_css_escaped = htmlspecialchars($icc_custom_css);
$defaults = [
@@ -43,13 +52,36 @@ function icc_config_do_page() {
$favicon_options = [];
foreach ($defaults as $key => $default_value) {
$val = yourls_get_option($key);
- if ($val === false) $val = $default_value;
+ if ($val === false)
+ $val = $default_value;
$favicon_options[$key] = $val;
}
- $escape_attr = function($str) {
+
+ // reCAPTCHA options
+ $icc_recaptcha_enabled = yourls_get_option('icc_recaptcha_enabled');
+ $icc_recaptcha_site_key = yourls_get_option('icc_recaptcha_site_key');
+ $icc_recaptcha_secret_key = yourls_get_option('icc_recaptcha_secret_key');
+
+ $recaptcha_checked = $icc_recaptcha_enabled ? 'checked' : '';
+ $escape_attr = function ($str) {
return htmlspecialchars($str, ENT_QUOTES | ENT_HTML5);
};
+ // Meta Redirect options
+ $icc_mrdr_url_prefix = yourls_get_option('icc_mrdr_url_prefix');
+ if ($icc_mrdr_url_prefix === false)
+ $icc_mrdr_url_prefix = '.';
+
+ $icc_mrdr_delay = yourls_get_option('icc_mrdr_delay');
+ if ($icc_mrdr_delay === false || !is_numeric($icc_mrdr_delay) || (int) $icc_mrdr_delay < 0) {
+ $icc_mrdr_delay = ICC_MRDR_DEFAULT_DELAY;
+ }
+ $escaped_delay = (int) $icc_mrdr_delay;
+
+ // 302 Redirect options
+ $icc_302_redirect_enabled = yourls_get_option('icc_302_redirect_enabled');
+ $redirect_302_checked = $icc_302_redirect_enabled ? 'checked' : '';
+
echo <<Webmaster Settings
@@ -92,75 +153,253 @@ HTML;
}
// Update options
-function icc_config_update_option() {
+function icc_config_update_option()
+{
$fields_logo = ['icc_logo_imageurl', 'icc_logo_imageurl_tag', 'icc_logo_imageurl_title'];
foreach ($fields_logo as $key) {
- if (isset($_POST[$key])) yourls_update_option($key, strval($_POST[$key]));
+ if (isset($_POST[$key]))
+ yourls_update_option($key, strval($_POST[$key]));
}
- if (isset($_POST['icc_title_custom'])) yourls_update_option('icc_title_custom', strval($_POST['icc_title_custom']));
- if (isset($_POST['icc_footer_text'])) yourls_update_option('icc_footer_text', $_POST['icc_footer_text']);
- if (isset($_POST['icc_custom_css'])) yourls_update_option('icc_custom_css', $_POST['icc_custom_css']);
- $fields_favicon = ['favicon_icon32','favicon_icon16','favicon_shortcut_icon'];
+ if (isset($_POST['icc_title_custom']))
+ yourls_update_option('icc_title_custom', strval($_POST['icc_title_custom']));
+ if (isset($_POST['icc_footer_text']))
+ yourls_update_option('icc_footer_text', $_POST['icc_footer_text']);
+ if (isset($_POST['icc_custom_css']))
+ yourls_update_option('icc_custom_css', $_POST['icc_custom_css']);
+ $fields_favicon = ['favicon_icon32', 'favicon_icon16', 'favicon_shortcut_icon'];
foreach ($fields_favicon as $key) {
- if (isset($_POST[$key])) yourls_update_option($key, strval($_POST[$key]));
+ if (isset($_POST[$key]))
+ yourls_update_option($key, strval($_POST[$key]));
}
+
+ // reCAPTCHA update
+ $recaptcha_enabled = isset($_POST['icc_recaptcha_enabled']);
+ $site_key = isset($_POST['icc_recaptcha_site_key']) ? trim($_POST['icc_recaptcha_site_key']) : '';
+ $secret_key = isset($_POST['icc_recaptcha_secret_key']) ? trim($_POST['icc_recaptcha_secret_key']) : '';
+
+ if ($recaptcha_enabled && (empty($site_key) || empty($secret_key))) {
+ echo 'Error: both Site Key and Secret Key are required to enable reCAPTCHA.
';
+ // Do not update enabled status if validation fails
+ } else {
+ yourls_update_option('icc_recaptcha_enabled', $recaptcha_enabled);
+ yourls_update_option('icc_recaptcha_site_key', $site_key);
+ yourls_update_option('icc_recaptcha_secret_key', $secret_key);
+ }
+
+ // Meta Redirect update
+ if (isset($_POST['icc_mrdr_url_prefix'])) {
+ $prefix = substr(trim($_POST['icc_mrdr_url_prefix']), 0, 1);
+ if ($prefix === '') {
+ yourls_delete_option('icc_mrdr_url_prefix');
+ } else {
+ yourls_update_option('icc_mrdr_url_prefix', $prefix);
+ }
+ }
+ if (isset($_POST['icc_mrdr_delay'])) {
+ $delay = intval($_POST['icc_mrdr_delay']);
+ if ($delay < 0)
+ $delay = ICC_MRDR_DEFAULT_DELAY;
+ yourls_update_option('icc_mrdr_delay', $delay);
+ }
+
+ // 302 Redirect update
+ $redirect_302_enabled = isset($_POST['icc_302_redirect_enabled']);
+ yourls_update_option('icc_302_redirect_enabled', $redirect_302_enabled);
}
// Show custom logo
-yourls_add_filter( 'pre_html_logo', 'icc_hideoriginallogo' );
-function icc_hideoriginallogo() {
+yourls_add_filter('pre_html_logo', 'icc_hideoriginallogo');
+function icc_hideoriginallogo()
+{
echo '';
}
-yourls_add_filter( 'html_logo', 'icc_logo' );
-function icc_logo() {
+yourls_add_filter('html_logo', 'icc_logo');
+function icc_logo()
+{
echo '';
echo '';
}
// Show custom title
-yourls_add_filter( 'html_title', 'icc_change_title' );
-function icc_change_title( $value ) {
- $custom = yourls_get_option( 'icc_title_custom' );
- if ($custom !== '') return $custom;
+yourls_add_filter('html_title', 'icc_change_title');
+function icc_change_title($value)
+{
+ $custom = yourls_get_option('icc_title_custom');
+ if ($custom !== '')
+ return $custom;
return $value;
}
// Replace footer text with custom footer from option
-yourls_add_filter( 'html_footer_text', 'icc_change_footer' );
-function icc_change_footer( $value ) {
- $custom_footer = yourls_get_option( 'icc_footer_text' );
- if ( !empty($custom_footer) ) return $custom_footer;
+yourls_add_filter('html_footer_text', 'icc_change_footer');
+function icc_change_footer($value)
+{
+ $custom_footer = yourls_get_option('icc_footer_text');
+ if (!empty($custom_footer))
+ return $custom_footer;
return $value;
}
// Output favicon lines (only if set)
yourls_add_filter('shunt_html_favicon', 'icc_plugin_favicon');
-function icc_plugin_favicon() {
+function icc_plugin_favicon()
+{
$opts = [
'favicon_icon32' => yourls_get_option('favicon_icon32'),
'favicon_icon16' => yourls_get_option('favicon_icon16'),
'favicon_shortcut_icon' => yourls_get_option('favicon_shortcut_icon'),
];
if (!empty($opts['favicon_icon32'])) {
- echo ''."\n";
+ echo '' . "\n";
}
if (!empty($opts['favicon_icon16'])) {
- echo ''."\n";
+ echo '' . "\n";
}
if (!empty($opts['favicon_shortcut_icon'])) {
- echo ''."\n";
+ echo '' . "\n";
}
return true;
}
// Output custom CSS if set
yourls_add_action('html_head', 'icc_print_custom_css');
-function icc_print_custom_css() {
+function icc_print_custom_css()
+{
$css = yourls_get_option('icc_custom_css');
if ($css !== false && trim($css) !== '') {
echo "\n";
}
}
+
+// reCAPTCHA v3 Integration
+yourls_add_action('html_head', 'icc_recaptcha_v3_html_head');
+function icc_recaptcha_v3_html_head()
+{
+ if (!yourls_get_option('icc_recaptcha_enabled'))
+ return;
+ $site_key = yourls_get_option('icc_recaptcha_site_key');
+ if ($site_key) {
+ echo '';
+ }
+}
+
+yourls_add_action('login_form_bottom', 'icc_recaptcha_v3_login_form');
+function icc_recaptcha_v3_login_form()
+{
+ if (!yourls_get_option('icc_recaptcha_enabled'))
+ return;
+ echo '';
+ echo '';
+}
+
+yourls_add_action('login_form_end', 'icc_recaptcha_v3_inject_script');
+function icc_recaptcha_v3_inject_script()
+{
+ if (!yourls_get_option('icc_recaptcha_enabled'))
+ return;
+ $site_key = yourls_get_option('icc_recaptcha_site_key');
+ if ($site_key) {
+ echo '';
+ }
+}
+
+yourls_add_action('pre_login_username_password', 'icc_recaptcha_v3_validation');
+function icc_recaptcha_v3_validation()
+{
+ if (!yourls_get_option('icc_recaptcha_enabled'))
+ return;
+
+ $site_key = yourls_get_option('icc_recaptcha_site_key');
+ $secret_key = yourls_get_option('icc_recaptcha_secret_key');
+
+ if (empty($site_key) || empty($secret_key))
+ return; // Should not happen if validation works, but safety net
+
+ $token = isset($_POST['token']) ? $_POST['token'] : '';
+
+ // call curl to POST request
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, "https://www.google.com/recaptcha/api/siteverify");
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array('secret' => $secret_key, 'response' => $token)));
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
+ $response = curl_exec($ch);
+ curl_close($ch);
+ $arrResponse = json_decode($response, true);
+
+ // verify the response
+ if (isset($arrResponse["success"]) && $arrResponse["success"] == '1' && isset($arrResponse["score"]) && $arrResponse["score"] >= 0.5) {
+ // reCAPTCHA succeeded
+ return true;
+ } else {
+ // reCAPTCHA failed
+ yourls_login_screen($error_msg = 'reCAPTCHA verification failed');
+ yourls_die('reCAPTCHA verification failed. Please try again.');
+ return false;
+ }
+}
+
+// Meta Redirect Logic
+yourls_add_action('loader_failed', 'icc_mrdr_redirect');
+function icc_mrdr_redirect($args)
+{
+ // Get prefix from option or fallback default
+ $prefix = yourls_get_option('icc_mrdr_url_prefix');
+ if ($prefix === false || $prefix === '') {
+ $prefix = '.';
+ }
+
+ // Get delay from option or fallback default
+ $delay = yourls_get_option('icc_mrdr_delay');
+ if ($delay === false || !is_numeric($delay) || (int) $delay < 0) {
+ $delay = ICC_MRDR_DEFAULT_DELAY;
+ }
+ $delay = (int) $delay;
+
+ // Escape prefix safely for regex
+ $escaped_prefix = preg_quote($prefix, '!');
+
+ // Check if requested keyword starts with prefix
+ if (isset($args[0]) && preg_match('!^' . $escaped_prefix . '(.*)!', $args[0], $matches)) {
+ $keyword = yourls_sanitize_keyword($matches[1]);
+
+ // Load YOURLS core to use the URL functions if not already available (usually available in this hook context)
+ // require_once(dirname(__FILE__) . '/../../../includes/load-yourls.php'); // Not typically needed inside a plugin hook
+
+ $url = yourls_get_keyword_longurl($keyword);
+ if (!$url) {
+ return; // No redirect
+ }
+
+ // Output meta refresh redirect with configured delay
+ echo '';
+ echo 'You will be redirected to ' . htmlspecialchars($url) . '.';
+ echo '';
+ exit;
+ }
+}
+
+// 302 Redirect Logic
+yourls_add_action('pre_redirect', 'icc_force_302_redirect');
+function icc_force_302_redirect($args)
+{
+ if (!yourls_get_option('icc_302_redirect_enabled'))
+ return;
+
+ $url = $args[0];
+ $code = $args[1];
+ if ($code != 302) {
+ // Redirect with 302 instead
+ yourls_redirect($url, 302);
+ die();
+ }
+}