Seditio Source
Root |
./othercms/b2evolution_7.2.3/plugins/_generic_ping.plugin.php
<?php
/**
 * This file implements the generic_ping_plugin.
 *
 * This file is part of the evoCore framework - {@link http://evocore.net/}
 * See also {@link https://github.com/b2evolution/b2evolution}.
 *
 * @license GNU GPL v2 - {@link http://b2evolution.net/about/gnu-gpl-license}
 *
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
 * Parts of this file are copyright (c)2004-2006 by Daniel HAHLER - {@link http://thequod.de/contact}.
 *
 * @package plugins
 *
 * @author blueyed: Daniel HAHLER
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );


/**
 * Generic Ping Plugin
 *
 * @package plugins
 */
class generic_ping_plugin extends Plugin
{
   
/**
     * Variables below MUST be overriden by plugin implementations,
     * either in the subclass declaration or in the subclass constructor.
     */
   
var $code = 'b2evGPing';
    var
$priority = 50;
    var
$version = '7.2.3';
    var
$author = 'The b2evo Group';
    var
$help_url = '';  // empty URL defaults to manual wiki

    /*
     * These variables MAY be overriden.
     */
   
var $group = 'ping';


   
/**
     * Init
     *
     * This gets called after a plugin has been registered/instantiated.
     */
   
function PluginInit( & $params )
    {
       
$this->name = T_('Generic Ping plugin');
       
$this->short_desc = T_('Use this plugin to add a generic ping service to your installation.');

        if(
$params['is_installed'] )
        {
// is not set for not-installed Plugins
           
$this->ping_service_name = $this->Settings->get('ping_service_name');
           
$this->ping_service_note = $this->Settings->get('ping_service_note');
        }
    }


   
/**
     * Define the GLOBAL settings of the plugin here. These can then be edited in the backoffice in System > Plugins.
     *
     * @param array Associative array of parameters (since v1.9).
     *    'for_editing': true, if the settings get queried for editing;
     *                   false, if they get queried for instantiating {@link Plugin::$Settings}.
     * @return array see {@link Plugin::GetDefaultSettings()}.
     * The array to be returned should define the names of the settings as keys (max length is 30 chars)
     * and assign an array with the following keys to them (only 'label' is required):
     */
   
function GetDefaultSettings( & $params )
    {
        return array(
           
'ping_service_url' => array(
                   
'label' => T_('Ping service URL'),
                   
'defaultvalue' => '',
                   
'type' => 'text',
                   
'size' => 50,
                   
'note' => T_('The URL of the ping service.').' '.sprintf( T_('E.g. %s'), '<code>rpc.weblogs.com/RPC2</code>, <code>rpc.foobar.com:8080</code> '.T_('or').' <code>https://rpc.foobar.com:8080</code>'),
                ),
           
'ping_service_extended' => array(
                   
'label' => T_('Extended ping?'),
                   
'type' => 'checkbox',
                   
'defaultvalue' => 0,
                   
'note' => T_('Use weblogUpdates.extendedPing method instead of weblogUpdates.ping?'),
                ),
           
'ping_service_name' => array(
                   
'label' => T_('Ping service name'),
                   
'defaultvalue' => '',
                   
'type' => 'text',
                   
'size' => 25,
                   
'note' => T_('The name of the ping service, used for displaying only.'),
            ),
           
'ping_service_note' => array(
                   
'label' => T_('Ping service note'),
                   
'defaultvalue' => '',
                   
'type' => 'text',
                   
'size' => 50,
                   
'note' => T_('Notes about the ping service, used for displaying only.'),
            ),
        );
    }


   
/**
     * Check ping service URL and plugin code.
     */
   
function BeforeEnable()
    {
       
$ping_service_url = $this->Settings->get('ping_service_url');
        if( empty(
$ping_service_url) )
        {
            return
T_('You must configure a ping service URL before the plugin can be enabled.');
        }

        if( empty(
$this->code) )
        {
            return
T_('The ping plugin needs a non-empty code.');
        }

        return
true;
    }


   
/**
     * Check ping service URL.
     */
   
function PluginSettingsValidateSet( & $params )
    {
        if(
$params['name'] == 'ping_service_url' )
        {
            if( !
$this->parse_ping_url($params['value']) )
            {
                return
T_('The ping service URL is invalid.');
            }
        }
    }


   
/**
     * Parse a given ping service URL
     *
     * @return false|array False in case of error, array with keys 'host', 'port', 'path' otherwise
     */
   
function parse_ping_url( $url )
    {
        if( empty(
$url ) )
        {    
// Wrong URL is provided:
           
return false;
        }

        if( !
preg_match( '#^(https?:)?//#', $url ) )
        {    
// Prepend protocol "http" automatically:
           
$url = 'http://'.$url;
        }

        if( ! (
$url_data = parse_url( $url ) ) || empty( $url_data['host'] ) )
        {    
// Wrong URL is provided:
           
return false;
        }

        return array(
               
'protocol' => isset( $url_data['scheme'] ) ? $url_data['scheme'] : 'http',
               
'host'     => $url_data['host'],
               
'port'     => isset( $url_data['port'] ) ? $url_data['port'] : 80,
               
'path'     => isset( $url_data['path'] ) ? $url_data['path'] : '',
            );
    }


   
/**
     * Send a ping to the configured service.
     */
   
function ItemSendPing( & $params )
    {
        global
$debug;
        global
$outgoing_proxy_hostname, $outgoing_proxy_port, $outgoing_proxy_username, $outgoing_proxy_password;

        if( !
defined( 'CANUSEXMLRPC' ) || CANUSEXMLRPC !== true )
        {    
// Could not use xmlrpc client because server has no the requested extensions:
           
$params['xmlrpcresp'] = CANUSEXMLRPC;
            return
false;
        }

       
// Parse ping URL to initialize XMLRPC client:
       
$url = $this->parse_ping_url( $this->Settings->get( 'ping_service_url' ) );

        if( !
$url )
        {    
// Wrong URL of the plugin settings:
           
$params['xmlrpcresp'] = T_('The ping service URL is invalid.');
            return
false;
        }

       
$Item = $params['Item'];
       
$item_Blog = $Item->get_Blog();

       
$client = new xmlrpc_client( $url['path'], $url['host'], $url['port'], $url['protocol'] );
       
$client->debug = ($debug && $params['display']);

       
// Set proxy for outgoing connections:
       
if( ! empty( $outgoing_proxy_hostname ) )
        {
           
$client->setProxy( $outgoing_proxy_hostname, $outgoing_proxy_port, $outgoing_proxy_username, $outgoing_proxy_password );
        }

        if(
$this->Settings->get('ping_service_extended') )
        {
           
$message = new xmlrpcmsg("weblogUpdates.extendedPing", array(
                    new
xmlrpcval( $item_Blog->get('name') ),
                    new
xmlrpcval( $item_Blog->get('url') ),
                    new
xmlrpcval( $Item->get_permanent_url() ),
                    new
xmlrpcval( $item_Blog->get('atom_url') ),
                   
// TODO: tags..
                   
));
        }
        else
        {
           
$message = new xmlrpcmsg("weblogUpdates.ping", array(
                    new
xmlrpcval( $item_Blog->get('name') ),
                    new
xmlrpcval( $item_Blog->get('url') ) ));
        }
       
$result = $client->send($message);

       
$params['xmlrpcresp'] = $result;

        return
true;
    }

}

?>