From 9624271935c892ec30d8fe56addfe8f105cd5984 Mon Sep 17 00:00:00 2001 From: Ivan Carlos Date: Fri, 2 Jan 2026 22:31:30 -0300 Subject: [PATCH] updated --- plugin.php | 327 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 283 insertions(+), 44 deletions(-) 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
@@ -82,6 +114,35 @@ function icc_config_do_page() {

+

reCAPTCHA v3 Settings

+

+ + +

+

+

+

+

+ +

Meta Redirect Settings

+

+ + +
Single character prefix to trigger meta redirect. Default is a dot (.) +

+

+ + +
Delay before redirecting. Default is 1 second. Use 0 for immediate redirect. +

+ +

Redirect Code Settings

+

+ + +
Use 302 (Temporary) instead of 301 (Permanent) for standard redirects. +

+


@@ -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 ''; echo '

'; - echo ''; - echo ''.yourls_get_option( 'icc_logo_imageurl_tag' ).''; + echo ''; + echo '' . yourls_get_option('icc_logo_imageurl_tag') . ''; 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(); + } +}