<?php
/* Copyright (c) 2022-2024 Aimy Extensions, Netzum Sorglos Software GmbH
 *
 * https://www.aimy-extensions.com/
 *
 * License: GNU GPLv2, see LICENSE.txt within distribution and/or
 *          http://www.aimy-extensions.com/software-license.html
 */
 namespace Aimy\IndexNow\Helpers; defined( '_JEXEC' ) or die(); use Joomla\CMS\Factory; use Joomla\CMS\Uri\Uri; use Joomla\CMS\Filesystem\File; use Joomla\CMS\Language\Text; abstract class PluginHelper { static public function getElapsedMinutes( $stamp ) { return floor( ( time() - intval( $stamp ) ) / 60 ); } static public function getAbsoluteUrl( $relUrl ) { $u = Uri::getInstance( Uri::root() ); return sprintf( '%s://%s/%s', $u->getScheme(), $u->getHost(), ltrim( $relUrl, '/' ) ); } static public function getWebsiteIpAddress() { $host = Uri::getInstance( Uri::root() )->getHost(); $ip = gethostbyname( $host ); if ( $ip ) { return $ip; } $dns_6 = dns_get_record( $host, DNS_AAAA ); if ( $dns_6 && is_array( $dns_6 ) ) { foreach ( $dns_6 as $rec ) { if ( isset( $rec[ 'type' ] ) && $rec[ 'type' ] == 'AAAA' ) { return $rec[ 'ipv6' ]; } } } return false; } static public function getKeyfileName( $key ) { return $key . '.txt'; } static public function writeKeyfileIfNotExistent( $key ) { $path = rtrim( JPATH_ROOT, '/' ) . '/' . self::getKeyfileName( $key ); if ( file_exists( $path ) ) { return false; } if ( File::write( $path, "$key\n" ) ) { return true; } throw new \RuntimeException( $path . ': Failed to write keyfile' ); } static public function checkKey( $key ) { if ( empty( $key ) ) { throw new \RuntimeException( '<b>Aimy IndexNow</b>: ' . Text::sprintf( 'AIMY_IN_ERR_NO_KEY_SET_X', self::getPluginOptionsURL() ) ); } if ( strlen( $key ) < 8 or strlen( $key ) > 128 or ! preg_match( '/^[a-z0-9-]+$/i', $key ) or preg_match( '#^(robots|README|index|htaccess)$#', $key ) ) { throw new \RuntimeException( '<b>Aimy IndexNow</b>: ' . Text::sprintf( 'AIMY_IN_ERR_KEY_INVALID_X', self::getPluginOptionsURL() ) ); } } static public function isJoomla3() { return ( strpos( strVal( JVERSION ), '3.' ) === 0 ); } static public function inBackend() { if ( self::isJoomla3() ) { return Factory::getApplication()->isAdmin(); } return Factory::getApplication()->isClient( 'administrator' ); } static public function inFrontend() { if ( self::isJoomla3() ) { return Factory::getApplication()->isSite(); } return Factory::getApplication()->isClient( 'site' ); } static public function isFrontendEditing() { if ( self::inFrontend() && Factory::getConfig()->get( 'frontediting', false ) ) { $user = Factory::getUser(); return ( $user->guest != 1 ); } } static public function getCtxComponent( $context ) { $ctx = explode( '.', $context, 2 ); if ( ! is_array( $ctx ) or count( $ctx ) !== 2 ) { throw new \RuntimeException( 'Failed to parse context: ' . $context ); } return $ctx[ 0 ]; } static public function getCtxView( $context ) { $ctx = explode( '.', $context, 2 ); if ( ! is_array( $ctx ) or count( $ctx ) !== 2 ) { throw new \RuntimeException( 'Failed to parse context: ' . $context ); } return $ctx[ 1 ]; } static public function getPluginOptionsURL() { $id = false; try { $db = Factory::getDbo(); $q = $db->getQuery( true ); $q->select( $db->quoteName( array( 'extension_id' ) ) ) ->from( $db->quoteName( '#__extensions' ) ) ->where( $db->quoteName( 'element' ) . ' = ' . $db->quote( 'aimyindexnow' ) ); $db->setQuery( $q ); $id = $db->loadResult(); } catch ( \Exception $e ) { } if ( $id ) { return 'index.php?option=com_plugins&amp;task=plugin.edit&amp;' . 'extension_id=' . $id; } return 'index.php?option=com_plugins&amp;view=plugins'; } static public function jsonToObject( $json ) { $obj = false; $flags = 0; if ( defined( 'JSON_THROW_ON_ERROR' ) ) { $flags += JSON_THROW_ON_ERROR; } try { $obj = \json_decode( $json, false, 512, $flags ); } catch ( \Exception $e ) { $obj = false; } return $obj; } static public function isLocalIpAddress( $ip ) { $v = filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ); return ($v === false); } static public function getComMediaImagePath() { if ( ! function_exists( 'json_decode' ) ) { return 'images'; } $params = false; try { $db = Factory::getDbo(); $q = $db->getQuery( true ); $q->select( $db->quoteName( array( 'params' ) ) ) ->from( $db->quoteName( '#__extensions' ) ) ->where( $db->quoteName( 'element' ) . ' = ' . $db->quote( 'com_media' ) ); $db->setQuery( $q ); $params = $db->loadResult(); } catch ( \Exception $e ) { } if ( empty( $params ) or ! is_string( $params ) ) { return 'images'; } $params = json_decode( $params ); if ( empty( $params ) or ! isset( $params->image_path ) or empty( $params->image_path ) ) { return 'images'; } return trim( $params->image_path, '/ ' ); } } 
