xoops forums

wishcraft

Module Developer
Posted on: 2015/6/24 9:39
wishcraft
wishcraft (Show more)
Module Developer
Posts: 3711
Since: 2007/5/18
#1

@upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

The hooking strata need's too be exploited further; this is similar to an event handler, exactly that what it is -- it is made with a cursor style entry.

Example in this call this is how you would change it in class/model/read.php.
/**
     * retrieve objects from the database
     *
     * For performance consideration, getAll() is recommended
     *
     * @param CriteriaElement|null $criteria {@link CriteriaElement} conditions to be met
     * @param bool $id_as_key use the ID as key for the array
     * @param bool $as_object return an array of objects?
     * @return array
     */
    
public function getObjects(CriteriaElement $criteria null$id_as_key false$as_object true)
    {
        
$objects $this->getAll($criterianull$as_object$id_as_key);
        
$xoopsPreload XoopsPreload::getInstance();
        return 
$xoopsPreload->triggerFunction('core.'.basename(dirname(__DIR__)).'.'.__CLASS__.'.'.__FUNCTION__$objects, array('criteria'=>$criteria));;
    }


Example in this call this is how you would change it in class/model/read.php.
/**
     * get all objects matching a condition
     *
     * @param CriteriaElement|null $criteria {@link CriteriaElement} to match
     * @param array $fields variables to fetch
     * @param bool $asObject flag indicating as object, otherwise as array
     * @param bool $id_as_key use the ID as key for the array
     * @return array of objects/array {@link XoopsObject}
     */
    
public function getAll(CriteriaElement $criteria null$fields null$asObject true$id_as_key true)
    {
        if (
is_array($fields) && count($fields) > 0) {
            if (!
in_array($this->handler->keyName$fields)) {
                
$fields[] = $this->handler->keyName;
            }
            
$select "`" implode("`, `"$fields) . "`";
        } else {
            
$select "*";
        }
        
$limit null;
        
$start null;
        
$sql "SELECT {$select} FROM `{$this->handler->table}`";
        if (isset(
$criteria)) {
            
$sql .= " " $criteria->renderWhere();
            if (
$groupby $criteria->getGroupby()) {
                
$sql .= ' GROUP BY (' $groupby ')';
            }
            if (
$sort $criteria->getSort()) {
                
$sql .= " ORDER BY {$sort} " $criteria->getOrder();
                
$orderSet true;
            } else if (
$order $criteria->getOrder()) {
                
$sql .= " ORDER BY {$this->handler->keyName} " $order;
                
$orderSet true;
            }
            
$limit $criteria->getLimit();
            
$start $criteria->getStart();
        }
        if (empty(
$orderSet)) {
            
//$sql .= " ORDER BY `{$this->handler->keyName}` DESC";
        
}
        
$result $this->handler->db->query($sql$limit$start);
        
$ret = array();
        if (
$asObject) {
            while (
$myrow $this->handler->db->fetchArray($result)) {
                
$object $this->handler->create(false);
                
$object->assignVars($myrow);
                if (
$id_as_key) {
                    
$ret[$myrow[$this->handler->keyName]] = $object;
                } else {
                    
$ret[] = $object;
                }
                unset(
$object);
            }
        } else {
            
$object $this->handler->create(false);
            while (
$myrow $this->handler->db->fetchArray($result)) {
                
$object->assignVars($myrow);
                if (
$id_as_key) {
                    
$ret[$myrow[$this->handler->keyName]] = $object->getValues();
                } else {
                    
$ret[] = $object->getValues();
                }
            }
            unset(
$object);
        }
        
$xoopsPreload XoopsPreload::getInstance();
        return 
$xoopsPreload->triggerFunction('core.'.basename(dirname(__DIR__)).'.'.__CLASS__.'.'.__FUNCTION__.'.'.$this->handler->table$objects, array('criteria'=>$criteria));
    }


The line that changed in this example between the two functions is, the part that has been added to include the child objects table name so it session more lower layer:-

// Added to the line in second example call :[.'.'.$this->handler->table]:
$xoopsPreload->triggerFunction('core.'.basename(dirname(__DIR__)).'.'.__CLASS__.'.'.__FUNCTION__.'.'.$this->handler->table$objects, array('criteria'=>$criteria));


The function triggerFunction will need to be created as well I am sure they might be some other type of preloaded apart from event... maybe you could make something as a handler class that set class sessioning.

wishcraft

Module Developer
Posted on: 2015/8/14 16:23
wishcraft
wishcraft (Show more)
Module Developer
Posts: 3711
Since: 2007/5/18
#2

Re: @upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

Replacement for the Events handler to included a function/method handler as well for the events hooking stratums as well as by design to include preloads in theme as well the following class preloads.php need to be changed to so:~

class/preloads.php
class XoopsPreload
{
    
/**
     * @var array $_preloads array containing information about the event observers
     */
    
var $_preloads = array();

    
/**
     * @var array $_routines array containing the events that are being observed
     */
    
var $_routines = array();
    
    
/**
     * Constructor
     *
     * @return    void
     */
    
function XoopsPreload()
    {
        
$this->setPreloads();
        
$this->setEvents();
    }

    
/**
     * Allow one instance only!
     *
     * @return object
     */
    
static function &getInstance()
    {
        static 
$instance false;
        if (!
$instance) {
            
$instance = new XoopsPreload();
        }
        return 
$instance;
    }

    
/**
     * Get available preloads information and set them to go!
     *
     * @return void
     */
    
function setPreloads()
    {
        
//$modules_list = XoopsLists::getDirListAsArray(XOOPS_ROOT_PATH . "/modules/");
        
if ($modules_list XoopsCache::read('system_modules_active')) {
            
$i 0;
            foreach (
$modules_list as $module) {
                if (
is_dir($dir XOOPS_ROOT_PATH "/modules/{$module}/preloads/")) {
                    
$file_list XoopsLists::getFileListAsArray($dir);
                    foreach (
$file_list as $file) {
                        if (
preg_match('/(.php)$/i'$file)) {
                            
$file substr($file0, -4);
                            
$this->_preloads[$i]['module'] = $module;
                            
$this->_preloads[$i]['file'] = $file;
                            
$i++;
                        }
                    }
                }
            }
            if (isset(
$GLOBALS["xoopsConfig"]['theme_set']))
            {
                
$theme $GLOBALS["xoopsConfig"]['theme_set'];
                if (
is_dir($dir XOOPS_ROOT_PATH "/themes/{$theme}/preloads/")) {
                    
$file_list XoopsLists::getFileListAsArray($dir);
                    foreach (
$file_list as $file) {
                        if (
preg_match('/(.php)$/i'$file)) {
                            
$file substr($file0, -4);
                            
$this->_preloads[$i]['theme'] = $theme;
                            
$this->_preloads[$i]['file'] = $file;
                            
$i++;
                        }
                    }
                }
            }
        }
    }

    
/**
     * Get available events and set them to go!
     *
     * @return void
     */
    
function setEvents()
    {
        foreach (
$this->_preloads as $preload) {
            if (isset(
$preload['module']))
            {
                include_once 
XOOPS_ROOT_PATH '/modules/' $preload['module'] . '/preloads/' $preload['file']. '.php';
                
$class_name ucfirst($preload['module']) . ucfirst($preload['file']) . 'Preload' ;
                if (!
class_exists($class_name)) {
                    continue;
                }
            } elseif (isset(
$preload['theme']))    { 
                include_once 
XOOPS_ROOT_PATH '/themes/' $preload['theme'] . '/preloads/' $preload['file']. '.php';
                
$class_name ucfirst($preload['theme']) . ucfirst($preload['file']) . 'Preload' ;
                if (!
class_exists($class_name)) {
                    continue;
                }
            }
            
$class_methods get_class_methods($class_name);
            foreach (
$class_methods as $method) {
                if (
strpos($method'event') === 0) {
                    
$event_name strtolower(str_replace('event'''$method));
                    
$event= array('class_name' => $class_name'method' => $method);
                    
$this->_routines[$event_name][] = $event;
                }
            }
        }
    }

    
/**
     * Triggers a specific event
     *
     * @param $event_name string Name of the event to trigger
     * @param $args array Method arguments
     *
     * @return void
     */
    
function triggerEvent($event_name$args = array())
    {
        
$event_name strtolower(str_replace('.'''$event_name));
        if (isset(
$this->_routines[$event_name])) {
            foreach (
$this->_routines[$event_name] as $event) {
                try {
                    
call_user_func(array($event['class_name'], $event['method']), $args);
                }
                catch(
Exception $err)
                {
                    
trigger_error("Preload Event Hooking Error: ".$event['class_name']."::".$event['method'] . " ~ $err"E_RECOVERABLE_ERROR);
                }
            }
        }
    }
    
    
/**
     * Triggers a specific function or method with variable of return
     *
     * @param $event_name string Name of the event to trigger
     * @param $args array Method arguments
     *
     * @return void
     */
    
function triggerMethod($method_name ''$dbtable 'default'$arga NULL$argb NULL$argc NULL$argd NULL$arge NULL$argf NULL$argg NULL$argh NULL$argj NULL)
    {
        if (!
is_null($argj))
            
$args "j";
        elseif (!
is_null($argh) && is_null($argj))
            
$args "h";
        elseif (!
is_null($argg) && is_null($argh))
            
$args "g";
        elseif (!
is_null($argf) && is_null($argg))
            
$args "f";
        elseif (!
is_null($arge) && is_null($argf))
            
$args "e";
        elseif (!
is_null($argd) && is_null($arge))
            
$args "d";
        elseif (!
is_null($argc) && is_null($argd))
            
$args "c";
        elseif (!
is_null($argb) && is_null($argc))
            
$args "b";
        elseif (!
is_null($arga) && is_null($argb))
            
$args "a";
        else
            
$args "-";
        
$method_name strtolower(str_replace('.'''$method_name));
        if (isset(
$this->_routines[$method_name])) {
            foreach (
$this->_routines[$method_name] as $event) {
                try {
                    switch (
$args)
                    {
                        case 
"j":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg$arge$argj);
                            break;
                        case 
"h":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg$argh);
                            break;
                        case 
"g":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg);
                            break;
                        case 
"f":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf);
                            break;
                        case 
"e":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge);
                            break;
                        case 
"d":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd);
                            break;
                        case 
"c":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc);
                            break;
                        case 
"b":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb);
                            break;
                        case 
"a":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga);
                            break;
                        default:
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable);
                            break;
                    }
                    
                }
                catch(
Exception $err)
                {
                    
trigger_error("Preload Function Hooking Error: ".$event['class_name']."::".$event['method'] . " ~ $err"E_RECOVERABLE_ERROR);
                }
            }
        }
    }
}


This lists' the changes to the XoopsPreload that need to be made!!

geekwright

Quite a regular
Posted on: 2015/8/16 20:29
geekwright
geekwright (Show more)
Quite a regular
Posts: 274
Since: 2010/10/15
#3

Re: @upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

Interesting. I have a couple of observations.

Dude, use the current source on GitHub :) The sourceforge code is moldy -- lots of changes since then.

If you put this hook in to Model\Read you would never be able to trust the expected return from anything. Any installed module would be able to interfere with any handler no matter if it was the active module or not. Sounds like a free for all that could get unstable very easily, and that is not good.

Doing this to an individual handler (extending and method override) is trivial.

Combine that with the existing Events class (what XoopsPreload grew into,) and you can accomplish this with less collateral risk.

One of the improvements is the addition of Events::addListener(). You can dynamically listen for any event and have it invoke any callable. This way, you don't have to set up the listeners unless it is needed.

There is no triggerFunction(), but since there is always the chance of more than one listener, you could never really rely on which return value you would get. You would have to include a strategy to combine or choose from possibly multiple returns.

The existing triggerEvent() takes one argument, but that can be anything. Historically, that has often been an array, but using an object as the argument is often a better choice. For example, the psr4loader event brings the Psr4ClassLoader object with it, so the preload listeners can just register what they need -- the return is done through the passed object. Even a humble ArrayObject or SplQueue can be quite useful here.

Using a custom object for a complex result mechanism would allow you to more cleanly document what is actually occurring, making it easier to use and reuse the solution.

Put these pieces together, you can build something that doesn't open up so many potential issues.

wishcraft

Module Developer
Posted on: 2015/8/19 9:48
wishcraft
wishcraft (Show more)
Module Developer
Posts: 3711
Since: 2007/5/18
#4

Re: @upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

Quote:
Dude, use the current source on GitHub :) The sourceforge code is moldy -- lots of changes since then.


I have a problem with using GitHub, for starters as the Module Team Leader I do not have access, also we are supported and one of the few projects that Sourceforge.net feature, for one reason, there total interface is made from XOOPS 1.

Also GitHub is sourceforge competitor, as well as git being available on Sourceforge.net which are a strong sponsor of us and we should be using Git on Sourceforge, can you give me access to the GitHub so I can start working on the modules for 2.6? I will set up a username now which is - LabsDotCoop

Just a thought I really think we should be using the git on source-forge, otherwise I am happy to migrate the modules to each unique GitHubs for Each one if necessary.

Quote:
If you put this hook in to Model\Read you would never be able to trust the expected return from anything. Any installed module would be able to interfere with any handler no matter if it was the active module or not. Sounds like a free for all that could get unstable very easily, and that is not good.


Actually that is not the case, the purpose of reporting the for example 'table' name reported by the persistence is part of the reason, part the reason for the method one is to do the following for example in the XoopsModelRead::GetAll() from /class/model/read.php function, so if needed it can be event hooked by a preloader in those unique scenarios, I found like in multisite (Which I really think you should implement in the code as it is a great hack I found that can be done to allow for multiple session on domain and sub-domain’s please look at it, there where alot of demand in the forum previous to implement my multisite hack in the system and the core back when I was both in module teams and the core development of XOOPS 2.4)

Just looking at the example given for XoopsPreloader::triggerMethod() it really needs to look like so:-
/**
     * Triggers a specific function or method with variable of return
     *
     * @param $event_name string Name of the event to trigger
     * @param $args array Method arguments
     *
     * @return void
     */
    
function triggerMethod($method_name ''$function ''$class ''$dbtable 'default'$arga NULL$argb NULL$argc NULL$argd NULL$arge NULL$argf NULL$argg NULL$argh NULL$argj NULL)
    {
        if (!
is_null($argj))
            
$args "j";
        elseif (!
is_null($argh) && is_null($argj))
            
$args "h";
        elseif (!
is_null($argg) && is_null($argh))
            
$args "g";
        elseif (!
is_null($argf) && is_null($argg))
            
$args "f";
        elseif (!
is_null($arge) && is_null($argf))
            
$args "e";
        elseif (!
is_null($argd) && is_null($arge))
            
$args "d";
        elseif (!
is_null($argc) && is_null($argd))
            
$args "c";
        elseif (!
is_null($argb) && is_null($argc))
            
$args "b";
        elseif (!
is_null($arga) && is_null($argb))
            
$args "a";
        else
            
$args "-";
        
$method_name strtolower(str_replace('.'''$method_name)) . strtolower(str_replace('.'''$function)) . strtolower(str_replace('.'''$class)) .;
        if (isset(
$this->_routines[$method_name])) {
            foreach (
$this->_routines[$method_name] as $event) {
                try {
                    switch (
$args)
                    {
                        case 
"j":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg$arge$argj);
                            break;
                        case 
"h":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg$argh);
                            break;
                        case 
"g":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf$argg);
                            break;
                        case 
"f":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge$argf);
                            break;
                        case 
"e":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd$arge);
                            break;
                        case 
"d":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc$argd);
                            break;
                        case 
"c":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb$argc);
                            break;
                        case 
"b":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga$argb);
                            break;
                        case 
"a":
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable$arga);
                            break;
                        default:
                            return 
call_user_func(array($event['class_name'], $event['method']), $dbtable);
                            break;
                    }
                    
                }
                catch(
Exception $err)
                {
                    
trigger_error("Preload Function Hooking Error: ".$event['class_name']."::".$event['method'] . " ~ $err"E_RECOVERABLE_ERROR);
                }
            }
        }


Just looking at the example given for XoopsModelRead::GetAll() + XoopsModelRead::GetObjects() it really needs to look like so:-
/**
     * get all objects matching a condition
     *
     * @param object $criteria {@link CriteriaElement} to match
     * @param array $fields variables to fetch
     * @param bool $asObject flag indicating as object, otherwise as array
     * @param bool $id_as_key use the ID as key for the array
     * @return array of objects/array {@link XoopsObject}
     */
    
function &getAll($criteria null$fields null$asObject true$id_as_key true)
    {
        
XoopsLoad::load('preload');
        
$xoopsPreload =& XoopsPreload::getInstance();
        
$criteria $xoopsPreload->triggerMethod('core.class.model.criteria'__FUNCTION____CLASS__$this->table$criteria, &$fields, &$asObject, &$id_as_key);
        
$fields $xoopsPreload->triggerMethod('core.class.model.fields'__FUNCTION____CLASS__$this->table$criteria, &$fields, &$asObject, &$id_as_key);
        if (
is_array($fields) && count($fields) > 0) {
            if (!
in_array($this->handler->keyName$fields)) {
                
$fields[] = $this->handler->keyName;
            }
            
$select "`" implode("`, `"$fields) . "`";
        } else {
            
$select "*";
        }
        
$limit null;
        
$start null;
        
$sql "SELECT {$select} FROM `{$this->handler->table}`";
        if (isset(
$criteria) && is_subclass_of($criteria"criteriaelement")) {
            
$sql .= " " $criteria->renderWhere();
            if (
$groupby $criteria->getGroupby()) {
                
$sql .= $groupby;
            }
            if (
$sort $criteria->getSort()) {
                
$sql .= " ORDER BY {$sort} " $criteria->getOrder();
                
$orderSet true;
            }
            
$limit $criteria->getLimit();
            
$start $criteria->getStart();
        }
        if (empty(
$orderSet)) {
            
//$sql .= " ORDER BY `{$this->handler->keyName}` DESC";
        
}
        
$result $this->handler->db->query($sql$limit$start);
        
$ret = array();
        if (
$asObject) {
            while (
$myrow $this->handler->db->fetchArray($result)) {
                
$object =& $this->handler->create(false);
                
$object->assignVars($myrow);
                if (
$id_as_key) {
                    
$ret[$myrow[$this->handler->keyName]] = $object;
                } else {
                    
$ret[] = $object;
                }
                unset(
$object);
            }
        } else {
            
$object =& $this->handler->create(false);
            while (
$myrow $this->handler->db->fetchArray($result)) {
                
$object->assignVars($myrow);
                if (
$id_as_key) {
                    
$ret[$myrow[$this->handler->keyName]] = $object->getValues(array_keys($myrow));
                } else {
                    
$ret[] = $object->getValues(array_keys($myrow));
                }
            }
            unset(
$object);
        }
        return 
$xoopsPreload->triggerMethod('core.class.model.return'__FUNCTION____CLASS__$this->table$ret);;
    }

    
/**
     * retrieve objects from the database
     *
     * For performance consideration, getAll() is recommended
     *
     * @param object $criteria {@link CriteriaElement} conditions to be met
     * @param bool $id_as_key use the ID as key for the array
     * @param bool $as_object return an array of objects?
     * @return array
     */
    
function &getObjects($criteria null$id_as_key false$as_object true)
    {
        
XoopsLoad::load('preload');
        
$xoopsPreload =& XoopsPreload::getInstance();
        
$criteria $xoopsPreload->triggerMethod('core.class.model.criteria'__FUNCTION____CLASS__$this->table$criteria, &$fields, &$asObject, &$id_as_key);
        
$objects $this->getAll($criterianull$as_object$id_as_key);
        return 
$xoopsPreload->triggerMethod('core.class.model.return'__FUNCTION____CLASS__$this->table$objects);
    }


The reason I need these changes made is the event hook stratum was my concept that I got trabis to implement who only did a small property of the total events on the core that needed to be hooked!

The purpose of an event hook is so all facilities of the core is reachable by the module development so any feature, query, question or otherwise can be some how determined and altered should it be needed!!

The purpose if you understand is fluid dynamics of the code, this means, to do some features in the core it become static and doesn't need to be later altered by module developers having to distribute the core files to replace, this triggerMethod() needs to go through all the functions as well as there needs to be functioning on function __destruct() as well as function __construct() with all the core classes the following preloader running:-

function __construct()
    {
        
XoopsLoad::load('preload');
        
$xoopsPreload =& XoopsPreload::getInstance();
        
$xoopsPreload->triggerEvent('core.class.construct.'.strtolower(__CLASS__), array($this));
    }

    function 
__destruct()
    {
        
XoopsLoad::load('preload');
        
$xoopsPreload =& XoopsPreload::getInstance();
        
$xoopsPreload->triggerEvent('core.class.destruct.'.strtolower(__CLASS__), array($this));
    }


Cause these are components of events that all classes have that are missing!!

One thing you will notice is if you look at XoopsPreloader::setPreloads() is the ataption of preloaders for themes, this is a functional requirement as it need's to be in all facite of the events system as an eventing hooker (Which is how microsoft stuff works actually with Event Hooks for CPU MIPS)

/**
     * Get available preloads information and set them to go!
     *
     * @return void
     */
    
function setPreloads()
    {
        
//$modules_list = XoopsLists::getDirListAsArray(XOOPS_ROOT_PATH . "/modules/");
        
if ($modules_list XoopsCache::read('system_modules_active')) {
            
$i 0;
            foreach (
$modules_list as $module) {
                if (
is_dir($dir XOOPS_ROOT_PATH "/modules/{$module}/preloads/")) {
                    
$file_list XoopsLists::getFileListAsArray($dir);
                    foreach (
$file_list as $file) {
                        if (
preg_match('/(.php)$/i'$file)) {
                            
$file substr($file0, -4);
                            
$this->_preloads[$i]['module'] = $module;
                            
$this->_preloads[$i]['file'] = $file;
                            
$i++;
                        }
                    }
                }
            }
            if (isset(
$GLOBALS["xoopsConfig"]['theme_set']))
            {
                
$theme $GLOBALS["xoopsConfig"]['theme_set'];
                if (
is_dir($dir XOOPS_ROOT_PATH "/themes/{$theme}/preloads/")) {
                    
$file_list XoopsLists::getFileListAsArray($dir);
                    foreach (
$file_list as $file) {
                        if (
preg_match('/(.php)$/i'$file)) {
                            
$file substr($file0, -4);
                            
$this->_preloads[$i]['theme'] = $theme;
                            
$this->_preloads[$i]['file'] = $file;
                            
$i++;
                        }
                    }
                }
            }
        }


I will continue my response in the next thread this is getting length.. but thanks for your reply so far geekwrite!!

Btw, geek write you want an invisible spot to mail from can you and the other team member send me 2 postcards to create a divine handshake - upto 5 days apart with a return either email or snail mail address for an @extraterrestrialmail.com - 500Mb Imap/pop3 mail box my snail mail address for one postcard with your always assumed password with Labs.coop as well as your return mail address and email address to:

Quote:

Chronolabs Cooperative
Unit Ten
466 Illawarra Rd
Marrickville South, NSW, 2204
Australia


Make sure they are identical SO I know they are yours the post card, I have upto 50 Email address, I will be paying for a year supply, if you also want a forwarder on it specify it in the second postcard, and the email address you want the forwarder, separate from the first postcard with your email, return mail so i can send you the server setting in the snail mail and.. at least in some kind of order, just make sure the postcard for the postcardware email box is identical so they match up, mine is leshy@extraterrestrialmail.com

JulioNC

Quite a regular
Posted on: 2015/8/20 5:47
JulioNC
JulioNC (Show more)
Quite a regular
Posts: 239
Since: 2004/10/8
#5

Re: @upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

I don't sure about Preloaders introduced by trabis and wishcraft. It's a kind of Hook events?
Instead why don't use EventDispatcher or implement an Observer pattern.

Observer Pattern
https://github.com/domnikl/DesignPatte ... aster/Behavioral/Observer

Mediator
https://github.com/domnikl/DesignPatte ... aster/Behavioral/Mediator

Mamba

Moderator
Posted on: 2015/8/20 6:43
Mamba
Mamba (Show more)
Moderator
Posts: 10798
Since: 2004/4/23
#6

Re: @upgrade::- Hooking Stratum Preloaders by Trabis and Myself need to be exploited!!

Julio, did you read Richard's post, and looked into the Events class, incl. the Events::addListener() ?
Support XOOPS => DONATE
Use 2.5.10 | Docs | Modules | Bugs