phpldapadmin/lib/hooks.php

178 lines
5.5 KiB
PHP
Raw Normal View History

2009-06-30 09:29:51 +00:00
<?php
2009-06-30 11:52:55 +00:00
// $Header: /cvsroot/phpldapadmin/phpldapadmin/lib/hooks.php,v 1.10.2.3 2008/11/28 04:44:54 wurley Exp $
2009-06-30 09:29:51 +00:00
/**
* Functions related to hooks management.
*
2009-06-30 10:46:00 +00:00
* @author Benjamin Drieu <benjamin.drieu@fr.alcove.com> and Alc<EFBFBD>?ve
2009-06-30 09:29:51 +00:00
* @package phpLDAPadmin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
2009-06-30 10:46:00 +00:00
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2009-06-30 09:29:51 +00:00
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*/
/**
* Compares two arrays by numerically comparing their 'prority'
2009-06-30 10:46:00 +00:00
* value. Standard `cmp-like' function.
2009-06-30 09:29:51 +00:00
*
* @param a First element to compare.
* @param b Second element to compare.
*
* @return -1 if priority of first element is smaller than second
2009-06-30 10:46:00 +00:00
* element priority. 1 otherwise.
2009-06-30 09:29:51 +00:00
*/
2009-06-30 10:46:00 +00:00
function sort_array_by_priority($a,$b) {
return (($a['priority'] < $b['priority']) ? -1 : 1 );
2009-06-30 09:29:51 +00:00
}
/**
* Runs procedures attached to a hook.
*
* @param hook_name Name of hook to run.
* @param args Array of optional arguments set by
2009-06-30 10:46:00 +00:00
* phpldapadmin. It is normally in a form known
2009-06-30 09:29:51 +00:00
* by call_user_func_array() :
* <pre>[ 'server_id' => 0,
2009-06-30 10:46:00 +00:00
* 'dn' => 'uid=epoussa,ou=tech,o=corp,o=fr' ]</pre>
2009-06-30 09:29:51 +00:00
*
* @return true if all procedures returned true, false otherwise.
*/
2009-06-30 10:46:00 +00:00
function run_hook($hook_name,$args) {
2009-06-30 11:46:44 +00:00
$hooks = isset($_SESSION[APPCONFIG]) ? $_SESSION[APPCONFIG]->hooks : array();
2009-06-30 10:46:00 +00:00
syslog_debug("Running hook $hook_name.");
if (! array_key_exists($hook_name,$hooks)) {
syslog_notice("Hook '$hook_name' not defined !\n");
return true;
}
unset($rollbacks);
$rollbacks = array ();
reset($hooks[$hook_name]);
/* Execution of procedures attached is done using a numeric order
* since all procedures have been attached to the hook with a
* numerical weight. */
while (list($key,$hook) = each($hooks[$hook_name])) {
array_push($rollbacks,$hook['rollback_function']);
syslog_debug("Calling ".$hook['hook_function']."\n");
$result = call_user_func_array($hook['hook_function'],$args);
syslog_notice("Called ".$hook['hook_function']."\n");
/* If a procedure fails, its optional rollback is executed with
* the same arguments. After that, all rollbacks from
* previously executed procedures are executed in the reverse
* order. */
if ($result != true) {
syslog_debug("Function ".$hook['hook_function']." returned $result\n");
while ($rollbacks) {
$rollback = array_pop($rollbacks);
if ($rollback != false) {
syslog_debug("Executing rollback $rollback\n");
call_user_func_array($rollback,$args);
}
}
return false;
2009-06-30 09:29:51 +00:00
}
2009-06-30 10:46:00 +00:00
}
2009-06-30 09:29:51 +00:00
2009-06-30 10:46:00 +00:00
return true;
2009-06-30 09:29:51 +00:00
}
/**
* Adds a procedure to a hook for later execution.
*
* @param hook_name Name of the hook.
2009-06-30 10:46:00 +00:00
* @param priority Numeric priority. Lowest means
2009-06-30 09:29:51 +00:00
* procedure will be executed before.
* @param hook_function Name of the php function called upon
* hook trigger.
* @param rollback_function Name of the php rollback function
* called upon failure.
*/
2009-06-30 10:46:00 +00:00
function add_hook($hook_name,$priority,$hook_function,$rollback_function) {
2009-06-30 11:52:55 +00:00
if (! array_key_exists($hook_name,$_SESSION[APPCONFIG]->hooks))
$_SESSION[APPCONFIG]->hooks[$hook_name] = array();
2009-06-30 09:29:51 +00:00
2009-06-30 10:46:00 +00:00
remove_hook($hook_name,-1,$hook_function,'');
2009-06-30 09:29:51 +00:00
2009-06-30 11:52:55 +00:00
array_push($_SESSION[APPCONFIG]->hooks[$hook_name],array(
'priority' => $priority,
'hook_function' => $hook_function,
'rollback_function' => $rollback_function));
2009-06-30 09:29:51 +00:00
2009-06-30 11:52:55 +00:00
uasort($_SESSION[APPCONFIG]->hooks[$hook_name],'sort_array_by_priority');
2009-06-30 09:29:51 +00:00
}
/**
* Removes a procedure from a hook, based on a filter.
*
* @param hook_name Name of the hook.
2009-06-30 10:46:00 +00:00
* @param priority Numeric priority. If set, all
2009-06-30 09:29:51 +00:00
* procedures of that priority will be
* removed.
2009-06-30 10:46:00 +00:00
* @param hook_function Name of the procedure function. If
2009-06-30 09:29:51 +00:00
* set, all procedures that call this
* function will be removed.
* @param rollback_function Name of the php rollback function
2009-06-30 10:46:00 +00:00
* called upon failure. If set, all
2009-06-30 09:29:51 +00:00
* procedures that call this function
* as a rollback will be removed.
*/
2009-06-30 10:46:00 +00:00
function remove_hook($hook_name,$priority,$hook_function,$rollback_function) {
2009-06-30 11:52:55 +00:00
if (array_key_exists($hook_name,$_SESSION[APPCONFIG]->hooks)) {
reset($_SESSION[APPCONFIG]->hooks[$hook_name]);
2009-06-30 09:29:51 +00:00
2009-06-30 11:52:55 +00:00
while (list($key,$hook) = each($_SESSION[APPCONFIG]->hooks[$hook_name])) {
2009-06-30 10:46:00 +00:00
if (($priority >= 0 && $priority == $hook['priority']) ||
($hook_function && $hook_function == $hook['hook_function']) ||
($rollback_function && $rollback_function == $hook['rollback_function'])) {
2009-06-30 09:29:51 +00:00
2009-06-30 11:52:55 +00:00
unset($_SESSION[APPCONFIG]->hooks[$hook_name][$key]);
2009-06-30 10:46:00 +00:00
}
}
}
2009-06-30 09:29:51 +00:00
}
/**
* Removes all procedures from a hook.
*
* @param hook_name Name of hook to clear.
*/
2009-06-30 10:46:00 +00:00
function clear_hooks($hook_name) {
2009-06-30 11:52:55 +00:00
if (array_key_exists($hook_name,$_SESSION[APPCONFIG]->hooks))
unset($_SESSION[APPCONFIG]->hooks[$hook_name]);
2009-06-30 09:29:51 +00:00
}
2009-06-30 10:46:00 +00:00
# Evaluating user-made hooks
if (is_dir(HOOKSDIR.'functions')) {
$dir = dir(HOOKSDIR.'functions');
2009-06-30 11:52:55 +00:00
while (false !== ($hookfile = $dir->read())) {
$filename = sprintf('%s/%s/%s',HOOKSDIR,'functions',$hookfile);
2009-06-30 09:29:51 +00:00
2009-06-30 11:52:55 +00:00
if (is_file($filename) and eregi('php[0-9]?$',$hookfile))
2009-06-30 10:46:00 +00:00
require_once "$filename";
}
2009-06-30 09:29:51 +00:00
2009-06-30 10:46:00 +00:00
$dir -> close();
2009-06-30 09:29:51 +00:00
}
?>