mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-23 16:33:17 +01:00
1246 lines
40 KiB
PHP
1246 lines
40 KiB
PHP
<?php
|
|
/**************************************************************************\
|
|
* phpGroupWare API - Commononly used functions *
|
|
* This file written by Dan Kuykendall <seek3r@phpgroupware.org> *
|
|
* and Joseph Engo <jengo@phpgroupware.org> *
|
|
* and Mark Peters <skeeter@phpgroupware.org> *
|
|
* Commononly used functions by phpGroupWare developers *
|
|
* Copyright (C) 2000, 2001 Dan Kuykendall *
|
|
* -------------------------------------------------------------------------*
|
|
* This library is part of the phpGroupWare API *
|
|
* http://www.phpgroupware.org/api *
|
|
* ------------------------------------------------------------------------ *
|
|
* This library is free software; you can redistribute it and/or modify it *
|
|
* under the terms of the GNU Lesser General Public License as published by *
|
|
* the Free Software Foundation; either version 2.1 of the License, *
|
|
* or any later version. *
|
|
* This library is distributed in the hope that it will be useful, but *
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
|
* See the GNU Lesser General Public License for more details. *
|
|
* You should have received a copy of the GNU Lesser General Public License *
|
|
* along with this library; if not, write to the Free Software Foundation, *
|
|
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
|
|
\**************************************************************************/
|
|
|
|
/* $Id$ */
|
|
|
|
$d1 = strtolower(substr($phpgw_info['server']['api_inc'],0,3));
|
|
$d2 = strtolower(substr($phpgw_info['server']['server_root'],0,3));
|
|
$d3 = strtolower(substr($phpgw_info['server']['app_inc'],0,3));
|
|
if($d1 == 'htt' || $d1 == 'ftp' || $d2 == 'htt' || $d2 == 'ftp' || $d3 == 'htt' || $d3 == 'ftp') {
|
|
echo 'Failed attempt to break in via an old Security Hole!<br>'."\n";
|
|
exit;
|
|
} unset($d1);unset($d2);unset($d3);
|
|
|
|
/*!
|
|
@class common
|
|
@abstract common class that contains commonly used functions
|
|
*/
|
|
class common
|
|
{
|
|
var $phpgw;
|
|
var $iv = '';
|
|
var $key = '';
|
|
var $crypto;
|
|
|
|
// Convert an array into the format needed for the access column.
|
|
/*!
|
|
@functionn array_to_string
|
|
@abstract Convert an array into the format needed for the access column
|
|
@param $access
|
|
@param $array
|
|
*/
|
|
function array_to_string($access,$array)
|
|
{
|
|
$s = '';
|
|
if ($access == 'group' || $access == 'public' || $access == 'none') {
|
|
if (count($array)) {
|
|
while ($t = each($array)) {
|
|
$s .= ',' . $t[1];
|
|
}
|
|
$s .= ',';
|
|
}
|
|
if (! count($array) && $access == 'none') {
|
|
$s = '';
|
|
}
|
|
}
|
|
return $s;
|
|
}
|
|
|
|
|
|
// This is used for searching the access fields
|
|
/*!
|
|
@function sql_search
|
|
@abstract this function is used for searching the access fields
|
|
@param $table
|
|
@param $owner
|
|
*/
|
|
function sql_search($table,$owner=0)
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
|
|
$s = '';
|
|
if (!$owner) {
|
|
$owner = $phpgw_info['user']['account_id'];
|
|
}
|
|
$groups = $phpgw->accounts->memberships(intval($owner));
|
|
if (gettype($groups) == 'array') {
|
|
while ($group = each($groups)) {
|
|
$s .= " or $table like '%," . $group[2] . ",%'";
|
|
}
|
|
}
|
|
return $s;
|
|
}
|
|
|
|
// return a array of installed languages
|
|
/*!
|
|
@function getInstalledLanguages
|
|
@abstract return an array of installed languages
|
|
@result $installedLanguages; an array containing the installed languages
|
|
*/
|
|
function getInstalledLanguages()
|
|
{
|
|
global $phpgw;
|
|
|
|
$phpgw->db->query('select distinct lang from lang');
|
|
while (@$phpgw->db->next_record())
|
|
{
|
|
$installedLanguages[$phpgw->db->f('lang')] = $phpgw->db->f('lang');
|
|
}
|
|
|
|
return $installedLanguages;
|
|
}
|
|
|
|
// return the preferred language of the users
|
|
// it's using HTTP_ACCEPT_LANGUAGE (send from the users browser)
|
|
// and ...(to find out which languages are installed)
|
|
/*!
|
|
@function getPreferredLanguage
|
|
@abstract return the preferred langugae of the users
|
|
@discussion it uses HTTP_ACCEPT_LANGUAGE (from the users browser) <br>
|
|
and .... to find out which languages are installed
|
|
*/
|
|
function getPreferredLanguage()
|
|
{
|
|
global $HTTP_ACCEPT_LANGUAGE;
|
|
|
|
// create a array of languages the user is accepting
|
|
$userLanguages = explode(',',$HTTP_ACCEPT_LANGUAGE);
|
|
$supportedLanguages = $this->getInstalledLanguages();
|
|
|
|
// find usersupported language
|
|
while (list($key,$value) = each($userLanguages))
|
|
{
|
|
// remove everything behind '-' example: de-de
|
|
$value = trim($value);
|
|
$pieces = explode('-', $value);
|
|
$value = $pieces[0];
|
|
# print 'current lang $value<br>';
|
|
if ($supportedLanguages[$value])
|
|
{
|
|
$retValue=$value;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// no usersupported language found -> return english
|
|
if (empty($retValue))
|
|
{
|
|
$retValue='en';
|
|
}
|
|
|
|
return $retValue;
|
|
}
|
|
|
|
// connect to the ldap server and return a handle
|
|
/*!
|
|
@function ldapConnect
|
|
@abstract connect to the ldap server and return a handle
|
|
@param $host ldap host
|
|
@param $dn ldap_root_dn
|
|
@param $passwd ldap_root_pw
|
|
*/
|
|
function ldapConnect($host = '', $dn = '', $passwd = '')
|
|
{
|
|
global $phpgw_info;
|
|
|
|
if (! $host) {
|
|
$host = $phpgw_info['server']['ldap_host'];
|
|
}
|
|
|
|
if (! $dn) {
|
|
$dn = $phpgw_info['server']['ldap_root_dn'];
|
|
}
|
|
|
|
if (! $passwd) {
|
|
$passwd = $phpgw_info['server']['ldap_root_pw'];
|
|
}
|
|
|
|
|
|
// connect to ldap server
|
|
if (! $ds = ldap_connect($host)) {
|
|
printf("<b>Error: Can't connect to LDAP server %s!</b><br>",$host);
|
|
return False;
|
|
}
|
|
|
|
// bind as admin, we not to able to do everything
|
|
if (! ldap_bind($ds,$dn,$passwd)) {
|
|
printf("<b>Error: Can't bind to LDAP server: %s!</b><br>",$dn);
|
|
return False;
|
|
}
|
|
|
|
return $ds;
|
|
}
|
|
|
|
// This function is used if the developer wants to stop a running app in the middle of execution
|
|
// We may need to do some clean up before hand
|
|
/*!
|
|
@function phpgw_exit
|
|
@abstract function to stop running an app
|
|
@discussion used to stop running an app in the middle of execution <br>
|
|
There may need to be some cleanup before hand
|
|
@param $call_footer boolean value to if true then call footer else exit
|
|
*/
|
|
function phpgw_exit($call_footer = False)
|
|
{
|
|
global $phpgw;
|
|
|
|
if ($call_footer) {
|
|
$this->phpgw_footer();
|
|
}
|
|
$phpgw->db->disconnect();
|
|
exit;
|
|
}
|
|
/*!
|
|
@function randomstring
|
|
@abstract return a random string of size $size
|
|
@param $size int-size of random string to return
|
|
*/
|
|
function randomstring($size)
|
|
{
|
|
$s = '';
|
|
srand((double)microtime()*1000000);
|
|
$random_char = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f',
|
|
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
|
|
'w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L',
|
|
'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
|
|
|
|
for ($i=0; $i<$size; $i++) {
|
|
$s .= $random_char[rand(1,61)];
|
|
}
|
|
return $s;
|
|
}
|
|
|
|
// Look at the note towards the top of this file (jengo)
|
|
function filesystem_separator()
|
|
{
|
|
return filesystem_separator();
|
|
}
|
|
/*!
|
|
@function error_list
|
|
@abstract ???
|
|
@param $error ???
|
|
*/
|
|
function error_list($error)
|
|
{
|
|
$html_error = '<table border="0" width="50%"><tr><td align="right"><b>' . lang('error') . '</b>: </td><td align="left">' . $error[0] . '</td></tr>';
|
|
|
|
for ($i=1; $i<count($error); $i++) {
|
|
$html_error .= '<tr><td> </td><td align="left">' . $error[$i] . '</td></tr>';
|
|
}
|
|
return $html_error . '</table>';
|
|
}
|
|
/*!
|
|
@function check_owner
|
|
@abstract none yet
|
|
@param $record ?
|
|
@param $link ?
|
|
@param $label ?
|
|
@param $extravars
|
|
*/
|
|
function check_owner($record,$link,$label,$extravars = '')
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
|
|
$s = '<a href="' . $phpgw->link($link,$extravars) . '"> ' . lang($label) . ' </a>';
|
|
if (ereg("^[0-9]+$",$record)) {
|
|
if ($record != $phpgw_info['user']['account_id']) {
|
|
$s = " ";
|
|
}
|
|
} else {
|
|
if ($record != $phpgw_info['user']['userid']) {
|
|
$s = " ";
|
|
}
|
|
}
|
|
|
|
return $s;
|
|
}
|
|
/*!
|
|
@function display_fullname
|
|
@abstract return the fullname of a user
|
|
@param $lid user id?
|
|
@param $firstname firstname
|
|
@param $lastname lastname
|
|
*/
|
|
function display_fullname($lid = '', $firstname = '', $lastname = '')
|
|
{
|
|
if (! $lid && ! $firstname && ! $lastname) {
|
|
global $phpgw_info;
|
|
$lid = $phpgw_info['user']['account_lid'];
|
|
$firstname = $phpgw_info['user']['firstname'];
|
|
$lastname = $phpgw_info['user']['lastname'];
|
|
}
|
|
|
|
if (! $firstname && ! $lastname) {
|
|
$s = $lid;
|
|
}
|
|
if (! $firstname && $lastname) {
|
|
$s = $lastname;
|
|
}
|
|
if ($firstname && ! $lastname) {
|
|
$s = $firstname;
|
|
}
|
|
if ($firstname && $lastname) {
|
|
$s = "$lastname, $firstname";
|
|
}
|
|
return $s;
|
|
}
|
|
/*!
|
|
@function grab_owner_name
|
|
@abstract grab the owner name
|
|
@param $id account id
|
|
*/
|
|
function grab_owner_name($id)
|
|
{
|
|
global $phpgw;
|
|
|
|
$db = $phpgw->db;
|
|
$db->query('select account_lid,account_firstname,account_lastname from phpgw_accounts where account_id='.$id,__LINE__,__FILE__);
|
|
$db->next_record();
|
|
|
|
return $phpgw->common->display_fullname($db->f('account_lid'),$db->f('account_firstname'),$db->f('account_lastname'));
|
|
}
|
|
/*!
|
|
@function create_tabs
|
|
@abstract create tabs
|
|
@param $tabs ?
|
|
@param $selected ?
|
|
@param $fontsize optional
|
|
*/
|
|
function create_tabs($tabs, $selected, $fontsize = '')
|
|
{
|
|
global $phpgw_info;
|
|
$output_text = '<table border="0" cellspacing="0" cellpadding="0"><tr>';
|
|
$ir = $phpgw_info['server']['images_dir'];
|
|
|
|
if ($fontsize) {
|
|
$fs = '<font size="' . $fontsize . '">';
|
|
$fse = '</font>';
|
|
}
|
|
|
|
$i = 1;
|
|
while ($tab = each($tabs)) {
|
|
if ($tab[0] == $selected) {
|
|
if ($i == 1) {
|
|
$output_text .= '<td align="right"><img src="' . $ir . '/tabs-start1.gif"></td>';
|
|
}
|
|
|
|
$output_text .= '<td align="left" background="' . $ir . '/tabs-bg1.gif"> <b><a href="'
|
|
. $tab[1]['link'] . '" class="tablink">' . $fs . $tab[1]['label']
|
|
. $fse . '</a></b> </td>';
|
|
if ($i == count($tabs)) {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
|
|
} else {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
|
|
}
|
|
} else {
|
|
if ($i == 1) {
|
|
$output_text .= '<td align="right"><img src="' . $ir . '/tabs-start0.gif"></td>';
|
|
}
|
|
$output_text .= '<td align="left" background="' . $ir . '/tabs-bg0.gif"> <b><a href="'
|
|
. $tab[1]['link'] . '" class="tablink">' . $fs . $tab[1]['label'] . $fse
|
|
. '</a></b> </td>';
|
|
if (($i + 1) == $selected) {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepl.gif"></td>';
|
|
} else if ($i == $selected || $i != count($tabs)) {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepm.gif"></td>';
|
|
} else if ($i == count($tabs)) {
|
|
if ($i == $selected) {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end1.gif"></td>';
|
|
} else {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-end0.gif"></td>';
|
|
}
|
|
} else {
|
|
if ($i != count($tabs)) {
|
|
$output_text .= '<td align="left"><img src="' . $ir . '/tabs-sepr.gif"></td>';
|
|
}
|
|
}
|
|
}
|
|
$i++;
|
|
$output_text .= "\n";
|
|
}
|
|
$output_text .= "</table>\n";
|
|
return $output_text;
|
|
}
|
|
/*!
|
|
@function get_app_dir
|
|
@abstract get directory of application
|
|
@discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp'];
|
|
@param $appname name of application
|
|
*/
|
|
function get_app_dir($appname = ''){
|
|
global $phpgw_info;
|
|
if ($appname == '') {
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
if ($appname == 'home' || $appname == 'logout' || $appname == 'login') {
|
|
$appname = 'phpgwapi';
|
|
}
|
|
|
|
$appdir = PHPGW_INCLUDE_ROOT . '/'.$appname;
|
|
$appdir_default = PHPGW_SERVER_ROOT . '/'.$appname;
|
|
|
|
if (is_dir ($appdir)){
|
|
return $appdir;
|
|
}elseif (is_dir ($appdir_default)){
|
|
return $appdir_default;
|
|
}else{
|
|
return False;
|
|
}
|
|
}
|
|
/*!
|
|
@function get_inc_dir
|
|
@abstract get inc (include dir) of application
|
|
@discussion $appname can either be passed or derived from $phpgw_info['flags']['currentapp'];
|
|
@param $appname name of application
|
|
*/
|
|
function get_inc_dir($appname = '')
|
|
{
|
|
global $phpgw_info;
|
|
|
|
if (! $appname){
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
if ($appname == 'home' || $appname == 'logout' || $appname == 'login') {
|
|
$appname = 'phpgwapi';
|
|
}
|
|
|
|
$incdir = PHPGW_INCLUDE_ROOT . '/' . $appname . '/inc';
|
|
$incdir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/inc';
|
|
|
|
if (is_dir ($incdir)) {
|
|
return $incdir;
|
|
} elseif (is_dir ($incdir_default)) {
|
|
return $incdir_default;
|
|
} else {
|
|
return False;
|
|
}
|
|
}
|
|
/*!
|
|
@function list_themes
|
|
@abstract list themes available
|
|
*/
|
|
function list_themes()
|
|
{
|
|
$dh = opendir(PHPGW_SERVER_ROOT . '/phpgwapi/themes');
|
|
while ($file = readdir($dh)) {
|
|
if (eregi("\.theme$", $file)) {
|
|
$list[] = substr($file,0,strpos($file,'.'));
|
|
}
|
|
}
|
|
//$dh->close();
|
|
reset ($list);
|
|
return $list;
|
|
}
|
|
/*!
|
|
@function list_templates
|
|
@abstract list available templates
|
|
*/
|
|
function list_templates(){
|
|
global $phpgw_info;
|
|
$d = dir(PHPGW_SERVER_ROOT . '/phpgwapi/templates');
|
|
while ($entry=$d->read()) {
|
|
if ($entry != 'CVS' && $entry != '.' && $entry != '..'){
|
|
$list[$entry]['name'] = $entry;
|
|
$f = PHPGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/details.inc.php';
|
|
if (file_exists ($f)){
|
|
include($f);
|
|
$list[$entry]['title'] = 'Use '.$phpgw_info['template'][$entry]['title'].'interface';
|
|
} else {
|
|
$list[$entry]['title'] = $entry;
|
|
}
|
|
}
|
|
}
|
|
$d->close();
|
|
reset ($list);
|
|
return $list;
|
|
}
|
|
/*!
|
|
@function get_tpl_dir
|
|
@abstract get template dir of an application
|
|
@param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp'];
|
|
*/
|
|
function get_tpl_dir($appname = '')
|
|
{
|
|
global $phpgw_info;
|
|
if (! $appname) {
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
if ($appname == 'home' || $appname == 'logout' || $appname == 'login') {
|
|
$appname = 'phpgwapi';
|
|
}
|
|
|
|
// Setting this for display of template choices in user preferences
|
|
if ($phpgw_info['server']['template_set'] == 'user_choice') {
|
|
$phpgw_info['server']['usrtplchoice'] = 'user_choice';
|
|
}
|
|
|
|
if ($phpgw_info['server']['template_set'] == 'user_choice' && isset($phpgw_info['user']['preferences']['common']['template_set'])) {
|
|
$phpgw_info['server']['template_set'] = $phpgw_info['user']['preferences']['common']['template_set'];
|
|
} elseif ($phpgw_info['server']['template_set'] == 'user_choice' || !isset($phpgw_info['server']['template_set'])) {
|
|
$phpgw_info['server']['template_set'] = 'default';
|
|
}
|
|
|
|
$tpldir = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/'
|
|
. $phpgw_info['server']['template_set'];
|
|
$tpldir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default';
|
|
|
|
if (is_dir($tpldir)) {
|
|
return $tpldir;
|
|
} elseif (is_dir($tpldir_default)) {
|
|
return $tpldir_default;
|
|
} else {
|
|
return False;
|
|
}
|
|
}
|
|
/*!
|
|
@function get_image_dir
|
|
@abstract get image dir of an application
|
|
@param $appname application name optional can be derived from $phpgw_info['flags']['currentapp'];
|
|
*/
|
|
function get_image_dir($appname = ''){
|
|
global $phpgw_info;
|
|
if ($appname == '') {
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
if (empty($phpgw_info['server']['template_set'])) {
|
|
$phpgw_info['server']['template_set'] = 'default';
|
|
}
|
|
|
|
$imagedir = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/'
|
|
. $phpgw_info['server']['template_set'] . '/images';
|
|
$imagedir_default = PHPGW_SERVER_ROOT . '/' . $appname . '/templates/default/images';
|
|
$imagedir_olddefault = PHPGW_SERVER_ROOT . '/' . $appname . '/images';
|
|
|
|
if (is_dir ($imagedir)){
|
|
return $imagedir;
|
|
} elseif (is_dir ($imagedir_default)) {
|
|
return $imagedir_default;
|
|
} elseif (is_dir ($imagedir_olddefault)) {
|
|
return $imagedir_olddefault;
|
|
} else {
|
|
return False;
|
|
}
|
|
}
|
|
/*!
|
|
@function get_image_path
|
|
@abstract get image path of an application
|
|
@param $appname appication name optional can be derived from $phpgw_info['flags']['currentapp'];
|
|
*/
|
|
function get_image_path($appname = '')
|
|
{
|
|
global $phpgw_info;
|
|
|
|
if ($appname == '')
|
|
{
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
|
|
if (empty($phpgw_info['server']['template_set']))
|
|
{
|
|
$phpgw_info['server']['template_set'] = 'default';
|
|
}
|
|
|
|
$imagedir = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/'.$phpgw_info['server']['template_set'].'/images';
|
|
$imagedir_default = PHPGW_SERVER_ROOT . '/'.$appname.'/templates/default/images';
|
|
$imagedir_olddefault = PHPGW_SERVER_ROOT . '/'.$appname.'/images';
|
|
|
|
if (is_dir ($imagedir))
|
|
{
|
|
return $phpgw_info['server']['webserver_url'].'/'.$appname.'/templates/'.$phpgw_info['server']['template_set'].'/images';
|
|
}
|
|
elseif (is_dir ($imagedir_default))
|
|
{
|
|
return $phpgw_info['server']['webserver_url'].'/'.$appname.'/templates/default/images';
|
|
}
|
|
elseif (is_dir ($imagedir_olddefault))
|
|
{
|
|
return $phpgw_info['server']['webserver_url'].'/'.$appname.'/images';
|
|
}
|
|
else
|
|
{
|
|
return False;
|
|
}
|
|
}
|
|
/*!
|
|
@function navbar
|
|
@abstract none yet
|
|
@discussion *someone wanna add some detail here*
|
|
*/
|
|
function navbar()
|
|
{
|
|
global $phpgw_info, $phpgw;
|
|
|
|
$phpgw_info['navbar']['home']['title'] = 'Home';
|
|
$phpgw_info['navbar']['home']['url'] = $phpgw->link('/index.php');
|
|
$phpgw_info['navbar']['home']['icon'] = $phpgw_info['server']['webserver_url'] . '/phpgwapi/templates/'
|
|
. $phpgw_info['server']['template_set'] . '/images/home.gif';
|
|
|
|
reset($phpgw_info['user']['apps']);
|
|
while ($permission = each($phpgw_info['user']['apps']))
|
|
{
|
|
if (is_long($permission[0]))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if ($phpgw_info['apps'][$permission[0]]['status'] != 2)
|
|
{
|
|
$phpgw_info['navbar'][$permission[0]]['title'] = $phpgw_info['apps'][$permission[0]]['title'];
|
|
$phpgw_info['navbar'][$permission[0]]['url'] = $phpgw->link('/' . $permission[0] . '/index.php');
|
|
$icon_file = PHPGW_SERVER_ROOT . '/'.$permission[0] . '/templates/'. $phpgw_info['server']['template_set']. '/images/navbar.gif';
|
|
|
|
if (file_exists($icon_file))
|
|
{
|
|
$phpgw_info['navbar'][$permission[0]]['icon'] = $phpgw_info['server']['webserver_url'] . '/'
|
|
. $permission[0] . '/templates/' . $phpgw_info['server']['template_set'] . '/images/navbar.gif';
|
|
}
|
|
else
|
|
{
|
|
$phpgw_info['navbar'][$permission[0]]['icon'] = $phpgw_info['server']['webserver_url'] . '/'
|
|
. $permission[0] . '/templates/default/images/navbar.gif';
|
|
}
|
|
}
|
|
}
|
|
$phpgw_info['navbar']['preferences']['title'] = 'preferences';
|
|
$phpgw_info['navbar']['preferences']['url'] = $phpgw->link('/preferences/index.php');
|
|
$phpgw_info['navbar']['preferences']['icon'] = $phpgw_info['server']['webserver_url'] . '/preferences/templates/'
|
|
. $phpgw_info['server']['template_set'] . '/images/navbar.gif';
|
|
|
|
if ($phpgw_info['flags']['currentapp'] == 'home' || $phpgw_info['flags']['currentapp'] == 'preferences' || $phpgw_info['flags']['currentapp'] == 'about')
|
|
{
|
|
$app = 'phpGroupWare';
|
|
}
|
|
else
|
|
{
|
|
$app = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
|
|
// We handle this here becuase its special
|
|
$phpgw_info['navbar']['about']['title'] = lang('About x',$app);
|
|
|
|
$phpgw_info['navbar']['about']['url'] = $phpgw->link('/about.php','app='.$app);
|
|
$phpgw_info['navbar']['about']['icon'] = $phpgw_info['server']['webserver_url'] . '/phpgwapi/templates/'
|
|
. $phpgw_info['server']['template_set'] . '/images/about.gif';
|
|
|
|
$phpgw_info['navbar']['logout']['title'] = 'Logout';
|
|
$phpgw_info['navbar']['logout']['url'] = $phpgw->link('/logout.php');
|
|
$phpgw_info['navbar']['logout']['icon'] = $phpgw_info['server']['webserver_url'] . '/phpgwapi/templates/'
|
|
. $phpgw_info['server']['template_set'] . '/images/logout.gif';
|
|
}
|
|
|
|
/*!
|
|
@function app_header
|
|
@abstract load header.inc.php for an application
|
|
*/
|
|
function app_header()
|
|
{
|
|
if (file_exists(PHPGW_APP_INC . '/header.inc.php'))
|
|
{
|
|
include(PHPGW_APP_INC . '/header.inc.php');
|
|
}
|
|
}
|
|
/*!
|
|
@function phpgw_header
|
|
@abstract load the phpgw header
|
|
*/
|
|
function phpgw_header()
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
|
|
include(PHPGW_INCLUDE_ROOT . '/phpgwapi/templates/' . $phpgw_info['server']['template_set']
|
|
. '/head.inc.php');
|
|
$this->navbar(False);
|
|
include(PHPGW_INCLUDE_ROOT . '/phpgwapi/templates/' . $phpgw_info['server']['template_set']
|
|
. '/navbar.inc.php');
|
|
if ((! isset($phpgw_info['flags']['nonavbar']) || ! $phpgw_info['flags']['nonavbar']) && ! $phpgw_info['flags']['navbar_target'])
|
|
{
|
|
echo parse_navbar();
|
|
}
|
|
}
|
|
|
|
function phpgw_footer()
|
|
{
|
|
global $phpgw, $phpgw_info, $HTMLCOMPLAINT;
|
|
|
|
if (!isset($phpgw_info['flags']['nofooter']) || !$phpgw_info['flags']['nofooter'])
|
|
{
|
|
include(PHPGW_API_INC . '/footer.inc.php');
|
|
}
|
|
|
|
// Clean up mcrypt
|
|
if (is_object($this->crypto))
|
|
{
|
|
$this->crypto->cleanup();
|
|
unset($this->crypto);
|
|
}
|
|
}
|
|
|
|
function hex2bin($data)
|
|
{
|
|
$len = strlen($data);
|
|
return pack('H' . $len, $data);
|
|
}
|
|
/*!
|
|
@function encrypt
|
|
@abstract encrypt data passed to the function
|
|
@param $data data (string?) to be encrypted
|
|
*/
|
|
function encrypt($data)
|
|
{
|
|
global $phpgw_info, $phpgw;
|
|
|
|
$data = serialize($data);
|
|
return $phpgw->crypto->encrypt($data);
|
|
}
|
|
/*!
|
|
@function decrypt
|
|
@abstract decrypt $data
|
|
@param $data data to be decrypted
|
|
*/
|
|
function decrypt($data)
|
|
{
|
|
global $phpgw_info, $phpgw;
|
|
|
|
$data = $phpgw->crypto->decrypt($data);
|
|
return unserialize($data);
|
|
}
|
|
/*!
|
|
@function des_cryptpasswd
|
|
@abstract des encrypt a password
|
|
@param $userpass userpassword
|
|
@param $random random seed
|
|
*/
|
|
function des_cryptpasswd($userpass, $random)
|
|
{
|
|
$lcrypt = '{crypt}';
|
|
$password = crypt($userpass);
|
|
$ldappassword = sprintf('%s%s', $lcrypt, $password);
|
|
|
|
return $ldappassword;
|
|
}
|
|
/*!
|
|
@function md5_cryptpasswd
|
|
@abstract md5 encrypt password
|
|
@param $userpass user password
|
|
@param $random random seed
|
|
*/
|
|
function md5_cryptpasswd($userpass, $random)
|
|
{
|
|
$bsalt = "$1$";
|
|
$esalt = "$"; // patch
|
|
$lcrypt = "{crypt}";
|
|
// $modsalt = sprintf("%s%s", $bsalt, $random);
|
|
$modsalt = sprintf("%s%s%s", $bsalt, $random, $esalt); // patch
|
|
$password = crypt($userpass, $modsalt);
|
|
$ldappassword = sprintf("%s%s", $lcrypt, $password);
|
|
|
|
return $ldappassword;
|
|
}
|
|
/*!
|
|
@function encrypt_password
|
|
@abstract encrypt password
|
|
@abstract uses the encryption type set in setup and calls the appropriate encryption functions
|
|
@param $password password to encrypt
|
|
*/
|
|
function encrypt_password($password)
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
|
|
if ($phpgw_info['server']['ldap_encryption_type'] == 'DES') {
|
|
$salt = $this->randomstring(2);
|
|
$e_password = $this->des_cryptpasswd($password, $salt);
|
|
}
|
|
if ($phpgw_info['server']['ldap_encryption_type'] == 'MD5') {
|
|
// $salt = $this->randomstring(9);
|
|
$salt = $this->randomstring(8); // patch
|
|
$e_password = $this->md5_cryptpasswd($password, $salt);
|
|
}
|
|
return $e_password;
|
|
}
|
|
/*!
|
|
@function hook
|
|
@abstract hooking function which allows applications to "hook" into each other
|
|
@discussion Someone flesh this out please
|
|
*/
|
|
function hook($location = '', $order = '')
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
if ($order == '')
|
|
{
|
|
$order[] = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
|
|
/* First include the ordered apps hook file */
|
|
reset ($order);
|
|
while (list (, $appname) = each ($order))
|
|
{
|
|
$f = PHPGW_SERVER_ROOT . '/' . $appname . '/inc/hook_'.$phpgw_info['flags']['currentapp'];
|
|
if ($location != '')
|
|
{
|
|
$f .= '_'.$location.'.inc.php';
|
|
}
|
|
else
|
|
{
|
|
$f .= '.inc.php';
|
|
}
|
|
|
|
if (file_exists($f) && ($phpgw_info['user']['apps'][$appname] || $appname == 'preferences'))
|
|
{
|
|
include($f);
|
|
}
|
|
$completed_hooks[$appname] = True;
|
|
}
|
|
|
|
/* Then add the rest */
|
|
reset ($phpgw_info['user']['apps']);
|
|
while ($permission = each($phpgw_info['user']['apps']))
|
|
{
|
|
if ($completed_hooks[$permission[0]] != True)
|
|
{
|
|
$appname = $permission[0];
|
|
$f = PHPGW_SERVER_ROOT . '/' . $permission[0] . '/inc/hook_'.$phpgw_info['flags']['currentapp'];
|
|
if ($location != '')
|
|
{
|
|
$f .= '_'.$location.'.inc.php';
|
|
}
|
|
else
|
|
{
|
|
$f .= '.inc.php';
|
|
}
|
|
|
|
if (file_exists($f) && ($phpgw_info['user']['apps'][$appname] || $appname == 'preferences'))
|
|
{
|
|
include($f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*!
|
|
@function hook_single
|
|
@abstract call the hooks for a single application
|
|
@param $location hook location - optional
|
|
@param $appname application name - optional
|
|
*/
|
|
function hook_single($location = '', $appname = '')
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
if (! $appname) {
|
|
$appname = $phpgw_info['flags']['currentapp'];
|
|
}
|
|
$s = $phpgw->common->filesystem_separator();
|
|
/* First include the ordered apps hook file */
|
|
$f = PHPGW_SERVER_ROOT . $s . $appname . $s . 'inc' . $s . 'hook_'.$appname;
|
|
if ($location != '') {
|
|
$f .= '_'.$location.'.inc.php';
|
|
} else {
|
|
$f .= '.inc.php';
|
|
}
|
|
if (file_exists($f)) {
|
|
include($f);
|
|
return True;
|
|
} else {
|
|
return False;
|
|
}
|
|
}
|
|
|
|
/*!
|
|
@function hook_count
|
|
@abstract loop through the applications and count the hooks
|
|
*/
|
|
function hook_count($location = ''){
|
|
global $phpgw, $phpgw_info;
|
|
$count = 0;
|
|
reset($phpgw_info['user']['apps']);
|
|
while ($permission = each($phpgw_info['user']['apps'])) {
|
|
$f = PHPGW_SERVER_ROOT . '/' . $permission[0] . '/inc/hook_'.$phpgw_info['flags']['currentapp'];
|
|
if ($location != ''){$f .= '_'.$location.'.inc.php';}else{$f .= '.inc.php'; }
|
|
if (file_exists($f)) {++$count;}
|
|
}
|
|
return $count;
|
|
}
|
|
|
|
/* Wrapper to the session->appsession() */
|
|
function appsession($data = '##NOTHING##') {
|
|
global $phpgw_info, $phpgw;
|
|
return $phpgw->session->appsession('default','',$data);
|
|
}
|
|
/*!
|
|
@function show_date
|
|
@abstract show current date
|
|
@param $t time - optional can be pulled from user preferences
|
|
@param $format - optional can be pulled from user prefernces
|
|
*/
|
|
function show_date($t = '', $format = '')
|
|
{
|
|
global $phpgw_info;
|
|
|
|
if (! $t)
|
|
$t = time();
|
|
|
|
$t = $t + ((60*60) * $phpgw_info['user']['preferences']['common']['tz_offset']);
|
|
|
|
if (! $format) {
|
|
$format = $phpgw_info['user']['preferences']['common']['dateformat'] . ' - ';
|
|
if ($phpgw_info['user']['preferences']['common']['timeformat'] == '12') {
|
|
$format .= 'h:i:s a';
|
|
} else {
|
|
$format .= 'H:i:s';
|
|
}
|
|
}
|
|
return date($format,$t);
|
|
}
|
|
/*!
|
|
@function dateformatorder
|
|
@abstract
|
|
@param $yearstr year - string
|
|
@param $monthstr month - string
|
|
@param $day day - string
|
|
@param $add_seperator boolean defaults to false
|
|
*/
|
|
function dateformatorder($yearstr,$monthstr,$daystr,$add_seperator = False)
|
|
{
|
|
global $phpgw_info;
|
|
$dateformat = strtolower($phpgw_info['user']['preferences']['common']['dateformat']);
|
|
$sep = substr($phpgw_info['user']['preferences']['common']['dateformat'],1,1);
|
|
|
|
$dlarr[strpos($dateformat,'y')] = $yearstr;
|
|
$dlarr[strpos($dateformat,'m')] = $monthstr;
|
|
$dlarr[strpos($dateformat,'d')] = $daystr;
|
|
ksort($dlarr);
|
|
|
|
if ($add_seperator) {
|
|
return (implode($sep,$dlarr));
|
|
} else {
|
|
return (implode(' ',$dlarr));
|
|
}
|
|
}
|
|
/*!
|
|
@function formattime
|
|
@abstract format the time takes settings from user preferences
|
|
@param $hour hour
|
|
@param $min minutes
|
|
@param $sec defaults to ''
|
|
*/
|
|
function formattime($hour,$min,$sec='')
|
|
{
|
|
global $phpgw_info;
|
|
|
|
$h12 = $hour;
|
|
if ($phpgw_info['user']['preferences']['common']['timeformat'] == '12') {
|
|
if ($hour > 12)
|
|
$ampm = ' pm';
|
|
else
|
|
$ampm = ' am';
|
|
$h12 %= 12;
|
|
if ($h12 == 0 && $hour)
|
|
$h12 = 12;
|
|
if ($h12 == 0 && ! $hour)
|
|
$h12 = 0;
|
|
} else
|
|
$h12 = $hour;
|
|
|
|
if ($sec)
|
|
$sec = ":$sec";
|
|
|
|
return "$h12:$min$sec$ampm";
|
|
}
|
|
|
|
|
|
// This is not the best place for it, but it needs to be shared bewteen Aeromail and SM
|
|
/*!
|
|
@function create_emailpreferences
|
|
@abstract create email preferences
|
|
@discussion This is not the best place for it, but it needs to be shared between Aeromail and SM
|
|
@param $prefs
|
|
@param $account_id -optional defaults to : phpgw_info['user']['account_id']
|
|
*/
|
|
function create_emailpreferences($prefs,$account_id=0)
|
|
{
|
|
global $phpgw, $phpgw_info;
|
|
|
|
if($account_id==0)
|
|
{
|
|
$account_id = $phpgw_info['user']['account_id'];
|
|
}
|
|
|
|
/* Add default preferences info */
|
|
if (!isset($prefs['email']['userid']))
|
|
{
|
|
if ($phpgw_info['server']['mail_login_type'] == 'vmailmgr')
|
|
{
|
|
$prefs['email']['userid'] = $phpgw->accounts->id2name($account_id)
|
|
. '@' . $phpgw_info['server']['mail_suffix'];
|
|
}
|
|
else
|
|
{
|
|
$prefs['email']['userid'] = $phpgw->accounts->id2name($account_id);
|
|
}
|
|
}
|
|
/* Set Server Mail Type if not defined */
|
|
if (empty($phpgw_info['server']['mail_server_type']))
|
|
{
|
|
$phpgw_info['server']['mail_server_type'] = 'imap';
|
|
}
|
|
|
|
if (!isset($prefs['email']['passwd']))
|
|
{
|
|
$prefs['email']['passwd'] = $phpgw_info['user']['passwd'];
|
|
}
|
|
else
|
|
{
|
|
$prefs['email']['passwd'] = $this->decrypt($prefs['email']['passwd']);
|
|
}
|
|
if (!isset($prefs['email']['address']))
|
|
{
|
|
$prefs['email']['address'] = $phpgw->accounts->id2name($account_id)
|
|
. '@' . $phpgw_info['server']['mail_suffix'];
|
|
}
|
|
if (!isset($prefs['email']['mail_server']))
|
|
{
|
|
$prefs['email']['mail_server'] = $phpgw_info['server']['mail_server'];
|
|
}
|
|
if (!isset($prefs['email']['mail_server_type']))
|
|
{
|
|
$prefs['email']['mail_server_type'] = $phpgw_info['server']['mail_server_type'];
|
|
}
|
|
if (!isset($prefs['email']['imap_server_type']))
|
|
{
|
|
$prefs['email']['imap_server_type'] = $phpgw_info['server']['imap_server_type'];
|
|
}
|
|
|
|
/* These sets the mail_port server variable */
|
|
if ($prefs['email']['mail_server_type']=='imap')
|
|
{
|
|
$prefs['email']['mail_port'] = '143';
|
|
}
|
|
elseif ($prefs['mail']['mail_server_type']=='pop3')
|
|
{
|
|
$prefs['email']['mail_port'] = '110';
|
|
}
|
|
|
|
/* This is going to be used to switch to the nntp class */
|
|
if ($phpgw_info['flags']['newsmode'])
|
|
{
|
|
$prefs['email']['mail_server_type'] = 'nntp';
|
|
}
|
|
return $prefs;
|
|
}
|
|
|
|
|
|
|
|
// This will be moved into the applications area.
|
|
/*!
|
|
@function check_code
|
|
@abstract ?
|
|
@discussion This will be moved into the applications area
|
|
*/
|
|
function check_code($code)
|
|
{
|
|
$s = '<br>';
|
|
switch ($code)
|
|
{
|
|
case 13: $s .= lang('Your message has been sent');break;
|
|
case 14: $s .= lang('New entry added sucessfully');break;
|
|
case 15: $s .= lang('Entry updated sucessfully'); break;
|
|
case 16: $s .= lang('Entry has been deleted sucessfully'); break;
|
|
case 18: $s .= lang('Password has been updated'); break;
|
|
case 38: $s .= lang('Password could not be changed'); break;
|
|
case 19: $s .= lang('Session has been killed'); break;
|
|
case 27: $s .= lang('Account has been updated'); break;
|
|
case 28: $s .= lang('Account has been created'); break;
|
|
case 29: $s .= lang('Account has been deleted'); break;
|
|
case 30: $s .= lang('Your settings have been updated'); break;
|
|
case 31: $s .= lang('Group has been added'); break;
|
|
case 32: $s .= lang('Group has been deleted'); break;
|
|
case 33: $s .= lang('Group has been updated'); break;
|
|
case 34: $s .= lang('Account has been deleted') . '<p>'
|
|
. lang('Error deleting x x directory',lang('users'),' '.lang('private').' ')
|
|
. ',<br>' . lang('Please x by hand',lang('delete')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/users/');
|
|
break;
|
|
case 35: $s .= lang('Account has been updated') . '<p>'
|
|
. lang('Error renaming x x directory',lang('users'),
|
|
' '.lang('private').' ')
|
|
. ',<br>' . lang('Please x by hand',
|
|
lang('rename')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/users/');
|
|
break;
|
|
case 36: $s .= lang('Account has been created') . '<p>'
|
|
. lang('Error creating x x directory',lang('users'),
|
|
' '.lang('private').' ')
|
|
. ',<br>' . lang('Please x by hand',
|
|
lang('create')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/users/');
|
|
break;
|
|
case 37: $s .= lang('Group has been added') . '<p>'
|
|
. lang('Error creating x x directory',lang('groups'),' ')
|
|
. ',<br>' . lang('Please x by hand',
|
|
lang('create')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/groups/');
|
|
break;
|
|
case 38: $s .= lang('Group has been deleted') . '<p>'
|
|
. lang('Error deleting x x directory',lang('groups'),' ')
|
|
. ',<br>' . lang('Please x by hand',
|
|
lang('delete')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/groups/');
|
|
break;
|
|
case 39: $s .= lang('Group has been updated') . '<p>'
|
|
. lang('Error renaming x x directory',lang('groups'),' ')
|
|
. ',<br>' . lang('Please x by hand',
|
|
lang('rename')) . '<br><br>'
|
|
. lang('To correct this error for the future you will need to properly set the')
|
|
. '<br>' . lang('permissions to the files/users directory')
|
|
. '<br>' . lang('On *nix systems please type: x','chmod 707 '
|
|
. $phpgw_info['server']['files_dir'] . '/groups/');
|
|
break;
|
|
case 40: $s .= lang('You have not entered a\nBrief Description').'.';
|
|
break;
|
|
case 41: $s .= lang('You have not entered a\nvalid time of day.');
|
|
break;
|
|
case 42: $s .= lang('You have not entered a\nvalid date.');
|
|
break;
|
|
default: return '';
|
|
}
|
|
return $s;
|
|
}
|
|
/*!
|
|
@fucntion phpgw_error
|
|
@abstract process error message
|
|
@param $error error
|
|
@param $line line
|
|
@param $file file
|
|
*/
|
|
function phpgw_error($error,$line = '', $file = '')
|
|
{
|
|
echo '<p><b>phpGroupWare internal error:</b><p>'.$error;
|
|
if ($line) {
|
|
echo 'Line: '.$line;
|
|
}
|
|
if ($file) {
|
|
echo 'File: '.$file;
|
|
}
|
|
echo '<p>Your session has been halted.';
|
|
exit;
|
|
}
|
|
|
|
/*!
|
|
@function create_phpcode_from_array
|
|
@abstract create phpcode from array
|
|
@param $array - array
|
|
*/
|
|
function create_phpcode_from_array($array)
|
|
{
|
|
while (list($key, $val) = each($array)) {
|
|
if (is_array($val)) {
|
|
while (list($key2, $val2) = each($val)) {
|
|
if (is_array($val2)) {
|
|
while (list($key3, $val3) = each ($val2)) {
|
|
if (is_array($val3)) {
|
|
while (list($key4, $val4) = each ($val3)) {
|
|
$s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]["' .$key4 . '"]="' . $val4 . '";';
|
|
$s .= "\n";
|
|
}
|
|
} else {
|
|
$s .= '$phpgw_info["' . $key . '"]["' . $key2 . '"]["' . $key3 . '"]="' . $val3 . '";';
|
|
$s .= "\n";
|
|
}
|
|
}
|
|
} else {
|
|
$s .= '$phpgw_info["' . $key .'"]["' . $key2 . '"]="' . $val2 . '";';
|
|
$s .= "\n";
|
|
}
|
|
}
|
|
} else {
|
|
$s .= '$phpgw_info["' . $key . '"]="' . $val . '";';
|
|
$s .= "\n";
|
|
}
|
|
}
|
|
return $s;
|
|
}
|
|
|
|
|
|
// This will return the full phpgw_info array, used for debugging
|
|
/*!
|
|
@function debug_list_array_contents
|
|
@abstract return the full phpgw_info array for debugging
|
|
@param array - array
|
|
*/
|
|
function debug_list_array_contents($array)
|
|
{
|
|
while (list($key, $val) = each($array)) {
|
|
if (is_array($val)) {
|
|
while (list($key2, $val2) = each($val)) {
|
|
if (is_array($val2)) {
|
|
while (list($key3, $val3) = each ($val2)) {
|
|
if (is_array($val3)) {
|
|
while (list($key4, $val4) = each ($val3)) {
|
|
echo $$array . "[$key][$key2][$key3][$key4]=$val4<br>";
|
|
}
|
|
} else {
|
|
echo $$array . "[$key][$key2][$key3]=$val3<br>";
|
|
}
|
|
}
|
|
} else {
|
|
echo $$array . "[$key][$key2]=$val2<br>";
|
|
}
|
|
}
|
|
} else {
|
|
echo $$array . "[$key]=$val<br>";
|
|
}
|
|
}
|
|
}
|
|
|
|
// This will return a list of functions in the API
|
|
/*!
|
|
@function debug_list_core_functions
|
|
@abstract return a list of functionsin the API
|
|
*/
|
|
|
|
function debug_list_core_functions()
|
|
{
|
|
echo '<br><b>core functions</b><br>';
|
|
echo '<pre>';
|
|
chdir(PHPGW_INCLUDE_ROOT . '/phpgwapi');
|
|
system("grep -r '^[ \t]*function' *");
|
|
echo '</pre>';
|
|
}
|
|
}//end common class
|