diff --git a/phpgwapi/inc/class.egw.inc.php b/phpgwapi/inc/class.egw.inc.php
index b950d22591..87c3dbc28f 100644
--- a/phpgwapi/inc/class.egw.inc.php
+++ b/phpgwapi/inc/class.egw.inc.php
@@ -29,7 +29,7 @@
* }
* You can now simply use $GLOBALS['egw']->datetime, and the egw class instanciates it for you on demand.
*/
-class egw
+class egw extends egw_minimal
{
/**
* Turn on debug mode. Will output additional data for debugging purposes.
@@ -37,12 +37,6 @@ class egw
* @access public
*/
var $debug = 0; // This will turn on debugging information.
- /**
- * Instance of the db-object
- *
- * @var egw_db
- */
- var $db;
/**
* Instance of the account object
*
@@ -55,12 +49,6 @@ class egw
* @var common
*/
var $common;
- /**
- * Current app at the instancation of the class
- *
- * @var string
- */
- var $currentapp;
/**
* Constructor: Instantiates the sub-classes
@@ -491,6 +479,32 @@ class egw
$this->db->disconnect();
}
}
+}
+
+/**
+ * Minimal eGW object used in setup, does not instanciate anything by default
+ *
+ */
+class egw_minimal
+{
+ /**
+ * Instance of the db-object
+ *
+ * @var egw_db
+ */
+ var $db;
+ /**
+ * Current app at the instancation of the class
+ *
+ * @var string
+ */
+ var $currentapp;
+ /**
+ * Global ADOdb object, need to be defined here, to not call magic __get method
+ *
+ * @var ADOConnection
+ */
+ var $ADOdb;
/**
* Classes which get instanciated in a different name
@@ -536,7 +550,7 @@ class egw
if (!isset(self::$sub_objects[$name]) && !class_exists($name))
{
- error_log(__METHOD__.": There's NO $name object!");
+ error_log(__METHOD__.": There's NO $name object! ".function_backtrace());
return null;
}
switch($name)
diff --git a/setup/inc/class.setup.inc.php b/setup/inc/class.setup.inc.php
index 60e9452732..37b97e0ff0 100644
--- a/setup/inc/class.setup.inc.php
+++ b/setup/inc/class.setup.inc.php
@@ -13,1102 +13,1094 @@
* @version $Id$
*/
- class egw_dummy {
- var $db;
- var $common;
- var $accounts;
-
- function invalidate_session_cache() { }
+class setup
+{
+ var $db;
+ var $config_table = 'egw_config';
+ var $applications_table = 'egw_applications';
+ var $acl_table = 'egw_acl';
+ var $accounts_table = 'egw_accounts';
+ var $prefs_table = 'egw_preferences';
+ var $lang_table = 'egw_lang';
+ var $languages_table = 'egw_languages';
+ var $hooks_table = 'egw_hooks';
+ var $cats_table = 'egw_categories';
+ var $oProc;
+ var $cookie_domain;
+
+ /**
+ * @var setup_detection
+ */
+ var $detection;
+ /**
+ * @var setup_process
+ */
+ var $process;
+ /**
+ * @var setup_translation
+ */
+ var $translation;
+ /**
+ * @var setup_html
+ */
+ var $html;
+
+ var $system_charset;
+ var $lang;
+
+ var $ConfigDomain;
+
+ /* table name vars */
+ var $tbl_apps;
+ var $tbl_config;
+ var $tbl_hooks;
+
+ /**
+ * @var float $required_php_version php version required by eGroupWare
+ */
+ var $required_php_version = 5.1;
+ var $recommended_php_version = '5.1+';
+
+ function setup($html=False, $translation=False)
+ {
+ // setup us as $GLOBALS['egw_setup'], as this gets used in our sub-objects
+ $GLOBALS['egw_setup'] =& $this;
+
+ if (!is_object($GLOBALS['egw']))
+ {
+ require_once(EGW_API_INC.'/class.egw.inc.php');
+ $GLOBALS['phpgw'] = $GLOBALS['egw'] = new egw_minimal();
+ }
+ $this->detection = new setup_detection();
+ $this->process = new setup_process();
+
+ if ($_REQUEST['system_charset']) $this->system_charset = $_REQUEST['system_charset'];
+
+ /* The setup application needs these */
+ if ($html) $this->html = new setup_html();
+ if ($translation) $this->translation = new setup_translation();
}
- class setup
+ /**
+ * include api db class for the ConfigDomain and connect to the db
+ */
+ function loaddb($connect_and_setcharset=true)
{
- var $db;
- var $config_table = 'egw_config';
- var $applications_table = 'egw_applications';
- var $acl_table = 'egw_acl';
- var $accounts_table = 'egw_accounts';
- var $prefs_table = 'egw_preferences';
- var $lang_table = 'egw_lang';
- var $languages_table = 'egw_languages';
- var $hooks_table = 'egw_hooks';
- var $cats_table = 'egw_categories';
- var $oProc;
- var $cookie_domain;
-
- /**
- * @var setup_detection
- */
- var $detection;
- /**
- * @var setup_process
- */
- var $process;
- /**
- * @var setup_translation
- */
- var $translation;
- /**
- * @var setup_html
- */
- var $html;
-
- var $system_charset;
- var $lang;
-
- var $ConfigDomain;
-
- /* table name vars */
- var $tbl_apps;
- var $tbl_config;
- var $tbl_hooks;
-
- /**
- * @var float $required_php_version php version required by eGroupWare
- */
- var $required_php_version = 5.1;
- var $recommended_php_version = '5.1+';
-
- function setup($html=False, $translation=False)
+ if(!isset($this->ConfigDomain) || empty($this->ConfigDomain))
{
- // setup us as $GLOBALS['egw_setup'], as this gets used in our sub-objects
- $GLOBALS['egw_setup'] =& $this;
-
- $this->detection =& CreateObject('setup.setup_detection');
- $this->process =& CreateObject('setup.setup_process');
-
- if ($_REQUEST['system_charset']) $this->system_charset = $_REQUEST['system_charset'];
-
- /* The setup application needs these */
- if ($html) $this->html =& CreateObject('setup.setup_html');
- if ($translation) $this->translation =& CreateObject('setup.setup_translation');
+ $this->ConfigDomain = get_var('ConfigDomain',array('COOKIE','POST'),$_POST['FormDomain']);
}
+ $GLOBALS['egw_info']['server']['db_type'] = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type'];
- /**
- * include api db class for the ConfigDomain and connect to the db
- */
- function loaddb($connect_and_setcharset=true)
+ if ($GLOBALS['egw_info']['server']['db_type'] == 'pgsql')
{
- if(!isset($this->ConfigDomain) || empty($this->ConfigDomain))
- {
- $this->ConfigDomain = get_var('ConfigDomain',array('COOKIE','POST'),$_POST['FormDomain']);
- }
- $GLOBALS['egw_info']['server']['db_type'] = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type'];
-
- if ($GLOBALS['egw_info']['server']['db_type'] == 'pgsql')
- {
- $GLOBALS['egw_info']['server']['db_persistent'] = False;
- }
- $this->db =& CreateObject('phpgwapi.egw_db');
- $this->db->Host = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_host'];
- $this->db->Port = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_port'];
- $this->db->Type = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type'];
- $this->db->Database = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_name'];
- $this->db->User = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_user'];
- $this->db->Password = $GLOBALS['egw_domain'][$this->ConfigDomain]['db_pass'];
-
- $this->db->set_app('phpgwapi');
+ $GLOBALS['egw_info']['server']['db_persistent'] = False;
+ }
+ $GLOBALS['egw']->db = $this->db = new egw_db();
+ $this->db->connect(
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_name'],
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_host'],
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_port'],
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_user'],
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_pass'],
+ $GLOBALS['egw_domain'][$this->ConfigDomain]['db_type']
+ );
+ $this->db->set_app('phpgwapi');
+
+ if ($connect_and_setcharset)
+ {
+ $this->db->Halt_On_Error = 'no'; // table might not be created at that stage
- if ($connect_and_setcharset)
- {
- $this->db->Halt_On_Error = 'no'; // table might not be created at that stage
-
- $this->set_table_names(); // sets/checks config- and applications-table-name
+ $this->set_table_names(); // sets/checks config- and applications-table-name
- // Set the DB's client charset if a system-charset is set
- $this->db->select($this->config_table,'config_value',array(
- 'config_app' => 'phpgwapi',
- 'config_name' => 'system_charset',
- ),__LINE__,__FILE__);
- if ($this->db->next_record() && $this->db->f(0))
+ // Set the DB's client charset if a system-charset is set
+ $this->db->select($this->config_table,'config_value',array(
+ 'config_app' => 'phpgwapi',
+ 'config_name' => 'system_charset',
+ ),__LINE__,__FILE__);
+ if ($this->db->next_record() && $this->db->f(0))
+ {
+ $this->system_charset = $this->db->f(0);
+ $this->db_charset_was = $this->db->Link_ID->GetCharSet(); // needed for the update
+
+ // we can NOT set the DB charset for mysql, if the api version < 1.0.1.019, as it would mess up the DB content!!!
+ if (substr($this->db->Type,0,5) == 'mysql') // we need to check the api version
{
- $this->system_charset = $this->db->f(0);
- $this->db_charset_was = $this->db->Link_ID->GetCharSet(); // needed for the update
-
- // we can NOT set the DB charset for mysql, if the api version < 1.0.1.019, as it would mess up the DB content!!!
- if (substr($this->db->Type,0,5) == 'mysql') // we need to check the api version
- {
- $this->db->select($this->applications_table,'app_version',array(
- 'app_name' => 'phpgwapi',
- ),__LINE__,__FILE__);
- $api_version = $this->db->next_record() ? $this->db->f(0) : false;
- }
- if (!$api_version || !$this->alessthanb($api_version,'1.0.1.019'))
- {
- $this->db->Link_ID->SetCharSet($this->system_charset);
- }
- }
- $this->db->Halt_On_Error = 'yes'; // setting the default again
- }
- }
-
- /**
- * Set the domain used for cookies
- *
- * @return string domain
- */
- function set_cookiedomain()
- {
- // Use HTTP_X_FORWARDED_HOST if set, which is the case behind a none-transparent proxy
- $this->cookie_domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST'];
-
- // remove port from HTTP_HOST
- if (preg_match("/^(.*):(.*)$/",$this->cookie_domain,$arr))
- {
- $this->cookie_domain = $arr[1];
- }
- if (count(explode('.',$this->cookie_domain)) <= 1)
- {
- // setcookie dont likes domains without dots, leaving it empty, gets setcookie to fill the domain in
- $this->cookie_domain = '';
- }
- }
-
- /**
- * Set a cookie
- *
- * @param string $cookiename name of cookie to be set
- * @param string $cookievalue value to be used, if unset cookie is cleared (optional)
- * @param int $cookietime when cookie should expire, 0 for session only (optional)
- */
- function set_cookie($cookiename,$cookievalue='',$cookietime=0)
- {
- if(!isset($this->cookie_domain))
- {
- $this->set_cookiedomain();
- }
- setcookie($cookiename,$cookievalue,$cookietime,'/',$this->cookie_domain);
- }
-
- /**
- * authenticate the setup user
- *
- * @param $auth_type ???
- */
- function auth($auth_type='Config')
- {
- #phpinfo();
- $FormLogout = get_var('FormLogout', array('GET','POST'));
- $ConfigLang = get_var('ConfigLang', array('POST','COOKIE'));
- if(!$FormLogout)
- {
- $ConfigLogin = get_var('ConfigLogin', array('POST'));
- $HeaderLogin = get_var('HeaderLogin', array('POST'));
- $FormDomain = get_var('FormDomain', array('POST'));
- $FormUser = get_var('FormUser', array('POST'));
- $FormPW = get_var('FormPW', array('POST'));
-
- $this->ConfigDomain = get_var('ConfigDomain',array('POST','COOKIE'));
- $ConfigUser = get_var('ConfigUser', array('POST','COOKIE'));
- $ConfigPW = get_var('ConfigPW', array('POST','COOKIE'));
- $HeaderUser = get_var('HeaderUser', array('POST','COOKIE'));
- $HeaderPW = get_var('HeaderPW', array('POST','COOKIE'));
-
- /* Setup defaults to aid in header upgrade to version 1.26.
- * This was the first version to include the following values.
- */
- if(!@isset($GLOBALS['egw_domain'][$FormDomain]['config_user']) && isset($GLOBALS['egw_domain'][$FormDomain]))
- {
- @$GLOBALS['egw_domain'][$FormDomain]['config_user'] = 'admin';
+ $this->db->select($this->applications_table,'app_version',array(
+ 'app_name' => 'phpgwapi',
+ ),__LINE__,__FILE__);
+ $api_version = $this->db->next_record() ? $this->db->f(0) : false;
}
- if(!@isset($GLOBALS['egw_info']['server']['header_admin_user']))
+ if (!$api_version || !$this->alessthanb($api_version,'1.0.1.019'))
{
- @$GLOBALS['egw_info']['server']['header_admin_user'] = 'admin';
+ $this->db->Link_ID->SetCharSet($this->system_charset);
+ }
+ }
+ $this->db->Halt_On_Error = 'yes'; // setting the default again
+ }
+ }
+
+ /**
+ * Set the domain used for cookies
+ *
+ * @return string domain
+ */
+ function set_cookiedomain()
+ {
+ // Use HTTP_X_FORWARDED_HOST if set, which is the case behind a none-transparent proxy
+ $this->cookie_domain = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST'];
+
+ // remove port from HTTP_HOST
+ if (preg_match("/^(.*):(.*)$/",$this->cookie_domain,$arr))
+ {
+ $this->cookie_domain = $arr[1];
+ }
+ if (count(explode('.',$this->cookie_domain)) <= 1)
+ {
+ // setcookie dont likes domains without dots, leaving it empty, gets setcookie to fill the domain in
+ $this->cookie_domain = '';
+ }
+ }
+
+ /**
+ * Set a cookie
+ *
+ * @param string $cookiename name of cookie to be set
+ * @param string $cookievalue value to be used, if unset cookie is cleared (optional)
+ * @param int $cookietime when cookie should expire, 0 for session only (optional)
+ */
+ function set_cookie($cookiename,$cookievalue='',$cookietime=0)
+ {
+ if(!isset($this->cookie_domain))
+ {
+ $this->set_cookiedomain();
+ }
+ setcookie($cookiename,$cookievalue,$cookietime,'/',$this->cookie_domain);
+ }
+
+ /**
+ * authenticate the setup user
+ *
+ * @param $auth_type ???
+ */
+ function auth($auth_type='Config')
+ {
+ #phpinfo();
+ $FormLogout = get_var('FormLogout', array('GET','POST'));
+ $ConfigLang = get_var('ConfigLang', array('POST','COOKIE'));
+ if(!$FormLogout)
+ {
+ $ConfigLogin = get_var('ConfigLogin', array('POST'));
+ $HeaderLogin = get_var('HeaderLogin', array('POST'));
+ $FormDomain = get_var('FormDomain', array('POST'));
+ $FormUser = get_var('FormUser', array('POST'));
+ $FormPW = get_var('FormPW', array('POST'));
+
+ $this->ConfigDomain = get_var('ConfigDomain',array('POST','COOKIE'));
+ $ConfigUser = get_var('ConfigUser', array('POST','COOKIE'));
+ $ConfigPW = get_var('ConfigPW', array('POST','COOKIE'));
+ $HeaderUser = get_var('HeaderUser', array('POST','COOKIE'));
+ $HeaderPW = get_var('HeaderPW', array('POST','COOKIE'));
+
+ /* Setup defaults to aid in header upgrade to version 1.26.
+ * This was the first version to include the following values.
+ */
+ if(!@isset($GLOBALS['egw_domain'][$FormDomain]['config_user']) && isset($GLOBALS['egw_domain'][$FormDomain]))
+ {
+ @$GLOBALS['egw_domain'][$FormDomain]['config_user'] = 'admin';
+ }
+ if(!@isset($GLOBALS['egw_info']['server']['header_admin_user']))
+ {
+ @$GLOBALS['egw_info']['server']['header_admin_user'] = 'admin';
+ }
+ }
+
+ $remoteip = $_SERVER['REMOTE_ADDR'];
+ if(!empty($remoteip) && !$this->checkip($remoteip)) { return False; }
+
+ /* If FormLogout is set, simply invalidate the cookies (LOGOUT) */
+ switch(strtolower($FormLogout))
+ {
+ case 'config':
+ /* config logout */
+ $expire = time() - 86400;
+ $this->set_cookie('ConfigUser','',$expire,'/');
+ $this->set_cookie('ConfigPW','',$expire,'/');
+ $this->set_cookie('ConfigDomain','',$expire,'/');
+// $this->set_cookie('ConfigLang','',$expire,'/');
+ $GLOBALS['egw_info']['setup']['LastDomain'] = $_COOKIE['ConfigDomain'];
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('You have successfully logged out');
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
+ return False;
+ case 'header':
+ /* header admin logout */
+ $expire = time() - 86400;
+ $this->set_cookie('HeaderUser','',$expire,'/');
+ $this->set_cookie('HeaderPW','',$expire,'/');
+// $this->set_cookie('ConfigLang','',$expire,'/');
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('You have successfully logged out');
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
+ return False;
+ }
+
+ /* We get here if FormLogout is not set (LOGIN or subsequent pages) */
+ /* Expire login if idle for 20 minutes. The cookies are updated on every page load. */
+ $expire = (int)(time() + (1200*9));
+
+ switch(strtolower($auth_type))
+ {
+ case 'header':
+ if(!empty($HeaderLogin))
+ {
+ /* header admin login */
+ /* New test is md5, cleartext version is for header < 1.26 */
+ if ($this->check_auth($FormUser,$FormPW,$GLOBALS['egw_info']['server']['header_admin_user'],
+ $GLOBALS['egw_info']['server']['header_admin_password']))
+ {
+ $this->set_cookie('HeaderUser',$FormUser,$expire,'/');
+ $this->set_cookie('HeaderPW',md5($FormPW),$expire,'/');
+ $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
+ return True;
+ }
+ else
+ {
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
+ return False;
+ }
+ }
+ elseif(!empty($HeaderPW) && $auth_type == 'Header')
+ {
+ // Returning after login to header admin
+ /* New test is md5, cleartext version is for header < 1.26 */
+ if ($this->check_auth($HeaderUser,$HeaderPW,$GLOBALS['egw_info']['server']['header_admin_user'],
+ $GLOBALS['egw_info']['server']['header_admin_password']))
+ {
+ $this->set_cookie('HeaderUser',$HeaderUser,$expire,'/');
+ $this->set_cookie('HeaderPW',$HeaderPW,$expire,'/');
+ $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
+ return True;
+ }
+ else
+ {
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
+ return False;
+ }
+ }
+ break;
+ case 'config':
+ if(!empty($ConfigLogin))
+ {
+ /* config login */
+ /* New test is md5, cleartext version is for header < 1.26 */
+ if (isset($GLOBALS['egw_domain'][$FormDomain]) &&
+ $this->check_auth($FormUser,$FormPW,@$GLOBALS['egw_domain'][$FormDomain]['config_user'],
+ @$GLOBALS['egw_domain'][$FormDomain]['config_passwd']))
+ {
+ $this->set_cookie('ConfigUser',$FormUser,$expire,'/');
+ $this->set_cookie('ConfigPW',md5($FormPW),$expire,'/');
+ $this->set_cookie('ConfigDomain',$FormDomain,$expire,'/');
+ /* Set this now since the cookie will not be available until the next page load */
+ $this->ConfigDomain = $FormDomain;
+ $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
+ return True;
+ }
+ else
+ {
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
+ return False;
+ }
+ }
+ elseif(!empty($ConfigPW))
+ {
+ // Returning after login to config
+ /* New test is md5, cleartext version is for header < 1.26 */
+ if ($this->check_auth($ConfigUser,$ConfigPW,@$GLOBALS['egw_domain'][$this->ConfigDomain]['config_user'],
+ @$GLOBALS['egw_domain'][$this->ConfigDomain]['config_passwd']))
+ {
+ $this->set_cookie('ConfigUser',$ConfigUser,$expire,'/');
+ $this->set_cookie('ConfigPW',$ConfigPW,$expire,'/');
+ $this->set_cookie('ConfigDomain',$this->ConfigDomain,$expire,'/');
+ $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
+ return True;
+ }
+ else
+ {
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
+ return False;
+ }
+ }
+ break;
+ }
+
+ return False;
+ }
+
+ /**
+ * check if username and password is valid
+ *
+ * this function compares the supplied and stored username and password
+ * as any of the passwords can be clear text or md5 we convert them to md5
+ * internal and compare always the md5 hashs
+ *
+ * @param string $user the user supplied username
+ * @param string $pw the user supplied password
+ * @param string $conf_user the configured username
+ * @param string $conf_pw the configured password
+ * @returns bool
+ */
+ function check_auth($user,$pw,$conf_user,$conf_pw)
+ {
+ #echo "
setup::check_auth('$user','$pw','$conf_user','$conf_pw')
\n";exit;
+ if ($user != $conf_user)
+ {
+ return False; // wrong username
+ }
+
+ // Verify that $pw is not already encoded as md5
+ if(!preg_match('/^[0-9a-f]{32}$/',$conf_pw))
+ {
+ $conf_pw = md5($conf_pw);
+ }
+
+
+ // Verify that $pw is not already encoded as md5
+ if(!preg_match('/^[0-9a-f]{32}$/',$pw))
+ {
+ $pw = md5($pw);
+ }
+
+ return $pw == $conf_pw;
+
+ }
+
+ function checkip($remoteip='')
+ {
+ //echo "setup::checkip($remoteip) against setup_acl='".$GLOBALS['egw_info']['server']['setup_acl']."'
\n";
+ $allowed_ips = explode(',',@$GLOBALS['egw_info']['server']['setup_acl']);
+ if(empty($GLOBALS['egw_info']['server']['setup_acl']) || !is_array($allowed_ips))
+ {
+ return True; // no test
+ }
+ $remotes = explode('.',$remoteip);
+ foreach($allowed_ips as $value)
+ {
+ if (!preg_match('/^[0-9.]+$/',$value))
+ {
+ $value = gethostbyname($was=$value); // resolve domain-name, eg. a dyndns account
+ //echo "resolving '$was' to '$value'
\n";
+ }
+ $values = explode('.',$value);
+ for($i = 0; $i < count($values); ++$i)
+ {
+ if ((int) $values[$i] != (int) $remotes[$i])
+ {
+ break;
}
}
-
- $remoteip = $_SERVER['REMOTE_ADDR'];
- if(!empty($remoteip) && !$this->checkip($remoteip)) { return False; }
-
- /* If FormLogout is set, simply invalidate the cookies (LOGOUT) */
- switch(strtolower($FormLogout))
+ if ($i == count($values))
{
- case 'config':
- /* config logout */
- $expire = time() - 86400;
- $this->set_cookie('ConfigUser','',$expire,'/');
- $this->set_cookie('ConfigPW','',$expire,'/');
- $this->set_cookie('ConfigDomain','',$expire,'/');
-// $this->set_cookie('ConfigLang','',$expire,'/');
- $GLOBALS['egw_info']['setup']['LastDomain'] = $_COOKIE['ConfigDomain'];
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('You have successfully logged out');
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
- return False;
- case 'header':
- /* header admin logout */
- $expire = time() - 86400;
- $this->set_cookie('HeaderUser','',$expire,'/');
- $this->set_cookie('HeaderPW','',$expire,'/');
-// $this->set_cookie('ConfigLang','',$expire,'/');
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('You have successfully logged out');
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
- return False;
+ return True; // match
}
+ }
+ $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
+ $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid IP address');
- /* We get here if FormLogout is not set (LOGIN or subsequent pages) */
- /* Expire login if idle for 20 minutes. The cookies are updated on every page load. */
- $expire = (int)(time() + (1200*9));
-
- switch(strtolower($auth_type))
- {
- case 'header':
- if(!empty($HeaderLogin))
- {
- /* header admin login */
- /* New test is md5, cleartext version is for header < 1.26 */
- if ($this->check_auth($FormUser,$FormPW,$GLOBALS['egw_info']['server']['header_admin_user'],
- $GLOBALS['egw_info']['server']['header_admin_password']))
- {
- $this->set_cookie('HeaderUser',$FormUser,$expire,'/');
- $this->set_cookie('HeaderPW',md5($FormPW),$expire,'/');
- $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
- return True;
- }
- else
- {
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
- return False;
- }
- }
- elseif(!empty($HeaderPW) && $auth_type == 'Header')
- {
- // Returning after login to header admin
- /* New test is md5, cleartext version is for header < 1.26 */
- if ($this->check_auth($HeaderUser,$HeaderPW,$GLOBALS['egw_info']['server']['header_admin_user'],
- $GLOBALS['egw_info']['server']['header_admin_password']))
- {
- $this->set_cookie('HeaderUser',$HeaderUser,$expire,'/');
- $this->set_cookie('HeaderPW',$HeaderPW,$expire,'/');
- $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
- return True;
- }
- else
- {
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = lang('Invalid password');
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = '';
- return False;
- }
- }
- break;
- case 'config':
- if(!empty($ConfigLogin))
- {
- /* config login */
- /* New test is md5, cleartext version is for header < 1.26 */
- if (isset($GLOBALS['egw_domain'][$FormDomain]) &&
- $this->check_auth($FormUser,$FormPW,@$GLOBALS['egw_domain'][$FormDomain]['config_user'],
- @$GLOBALS['egw_domain'][$FormDomain]['config_passwd']))
- {
- $this->set_cookie('ConfigUser',$FormUser,$expire,'/');
- $this->set_cookie('ConfigPW',md5($FormPW),$expire,'/');
- $this->set_cookie('ConfigDomain',$FormDomain,$expire,'/');
- /* Set this now since the cookie will not be available until the next page load */
- $this->ConfigDomain = $FormDomain;
- $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
- return True;
- }
- else
- {
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
- return False;
- }
- }
- elseif(!empty($ConfigPW))
- {
- // Returning after login to config
- /* New test is md5, cleartext version is for header < 1.26 */
- if ($this->check_auth($ConfigUser,$ConfigPW,@$GLOBALS['egw_domain'][$this->ConfigDomain]['config_user'],
- @$GLOBALS['egw_domain'][$this->ConfigDomain]['config_passwd']))
- {
- $this->set_cookie('ConfigUser',$ConfigUser,$expire,'/');
- $this->set_cookie('ConfigPW',$ConfigPW,$expire,'/');
- $this->set_cookie('ConfigDomain',$this->ConfigDomain,$expire,'/');
- $this->set_cookie('ConfigLang',$ConfigLang,$expire,'/');
- return True;
- }
- else
- {
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid password');
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
- return False;
- }
- }
- break;
- }
+ return False;
+ }
+ /**
+ * Return X.X.X major version from X.X.X.X versionstring
+ *
+ * @param $
+ */
+ function get_major($versionstring)
+ {
+ if(!$versionstring)
+ {
return False;
}
- /**
- * check if username and password is valid
- *
- * this function compares the supplied and stored username and password
- * as any of the passwords can be clear text or md5 we convert them to md5
- * internal and compare always the md5 hashs
- *
- * @param string $user the user supplied username
- * @param string $pw the user supplied password
- * @param string $conf_user the configured username
- * @param string $conf_pw the configured password
- * @returns bool
- */
- function check_auth($user,$pw,$conf_user,$conf_pw)
+ $version = str_replace('pre','.',$versionstring);
+ $varray = explode('.',$version);
+ $major = implode('.',array($varray[0],$varray[1],$varray[2]));
+
+ return $major;
+ }
+
+ /**
+ * Clear system/user level cache so as to have it rebuilt with the next access
+ *
+ * @deprecated AFAIK this code is not used anymore -- RalfBecker 2005/11/04
+ */
+ function clear_session_cache()
+ {
+ }
+
+ /**
+ * Add an application to the phpgw_applications table
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ * @param $enable * optional, set to True/False to override setup.inc.php setting
+ */
+ function register_app($appname,$enable=99)
+ {
+ $setup_info = $GLOBALS['setup_info'];
+
+ if(!$appname)
{
- #echo "setup::check_auth('$user','$pw','$conf_user','$conf_pw')
\n";exit;
- if ($user != $conf_user)
- {
- return False; // wrong username
- }
-
- // Verify that $pw is not already encoded as md5
- if(!preg_match('/^[0-9a-f]{32}$/',$conf_pw))
- {
- $conf_pw = md5($conf_pw);
- }
-
-
- // Verify that $pw is not already encoded as md5
- if(!preg_match('/^[0-9a-f]{32}$/',$pw))
- {
- $pw = md5($pw);
- }
-
- return $pw == $conf_pw;
-
- }
-
- function checkip($remoteip='')
- {
- //echo "setup::checkip($remoteip) against setup_acl='".$GLOBALS['egw_info']['server']['setup_acl']."'
\n";
- $allowed_ips = explode(',',@$GLOBALS['egw_info']['server']['setup_acl']);
- if(empty($GLOBALS['egw_info']['server']['setup_acl']) || !is_array($allowed_ips))
- {
- return True; // no test
- }
- $remotes = explode('.',$remoteip);
- foreach($allowed_ips as $value)
- {
- if (!preg_match('/^[0-9.]+$/',$value))
- {
- $value = gethostbyname($was=$value); // resolve domain-name, eg. a dyndns account
- //echo "resolving '$was' to '$value'
\n";
- }
- $values = explode('.',$value);
- for($i = 0; $i < count($values); ++$i)
- {
- if ((int) $values[$i] != (int) $remotes[$i])
- {
- break;
- }
- }
- if ($i == count($values))
- {
- return True; // match
- }
- }
- $GLOBALS['egw_info']['setup']['HeaderLoginMSG'] = '';
- $GLOBALS['egw_info']['setup']['ConfigLoginMSG'] = lang('Invalid IP address');
-
return False;
}
- /**
- * Return X.X.X major version from X.X.X.X versionstring
- *
- * @param $
- */
- function get_major($versionstring)
+ if($enable==99)
{
- if(!$versionstring)
- {
- return False;
- }
+ $enable = $setup_info[$appname]['enable'];
+ }
+ $enable = (int)$enable;
- $version = str_replace('pre','.',$versionstring);
- $varray = explode('.',$version);
- $major = implode('.',array($varray[0],$varray[1],$varray[2]));
-
- return $major;
+ if($GLOBALS['DEBUG'])
+ {
+ echo '
register_app(): ' . $appname . ', version: ' . $setup_info[$appname]['version'] . ', table: ' . $appstbl . '
';
+ // _debug_array($setup_info[$appname]);
}
- /**
- * Clear system/user level cache so as to have it rebuilt with the next access
- *
- * @deprecated AFAIK this code is not used anymore -- RalfBecker 2005/11/04
- */
- function clear_session_cache()
+ if($setup_info[$appname]['version'])
{
- }
-
- /**
- * Add an application to the phpgw_applications table
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- * @param $enable * optional, set to True/False to override setup.inc.php setting
- */
- function register_app($appname,$enable=99)
- {
- $setup_info = $GLOBALS['setup_info'];
-
- if(!$appname)
+ if($setup_info[$appname]['tables'])
{
- return False;
+ $tables = implode(',',$setup_info[$appname]['tables']);
}
-
- if($enable==99)
+ if ($setup_info[$appname]['tables_use_prefix'] == True)
{
- $enable = $setup_info[$appname]['enable'];
- }
- $enable = (int)$enable;
-
- if($GLOBALS['DEBUG'])
- {
- echo '
register_app(): ' . $appname . ', version: ' . $setup_info[$appname]['version'] . ', table: ' . $appstbl . '
';
- // _debug_array($setup_info[$appname]);
- }
-
- if($setup_info[$appname]['version'])
- {
- if($setup_info[$appname]['tables'])
+ if($GLOBALS['DEBUG'])
{
- $tables = implode(',',$setup_info[$appname]['tables']);
+ echo "
$appname uses tables_use_prefix, storing ". $setup_info[$appname]['tables_prefix']." as prefix for tables\n";
}
- if ($setup_info[$appname]['tables_use_prefix'] == True)
- {
- if($GLOBALS['DEBUG'])
- {
- echo "
$appname uses tables_use_prefix, storing ". $setup_info[$appname]['tables_prefix']." as prefix for tables\n";
- }
- $this->db->insert($this->config_table,array(
- 'config_app' => $appname,
- 'config_name' => $appname.'_tables_prefix',
- 'config_value' => $setup_info[$appname]['tables_prefix'],
- ),False,__LINE__,__FILE__);
- }
- $this->db->insert($this->applications_table,array(
- 'app_name' => $appname,
- 'app_enabled' => $enable,
- 'app_order' => $setup_info[$appname]['app_order'],
- 'app_tables' => $tables,
- 'app_version' => $setup_info[$appname]['version'],
+ $this->db->insert($this->config_table,array(
+ 'config_app' => $appname,
+ 'config_name' => $appname.'_tables_prefix',
+ 'config_value' => $setup_info[$appname]['tables_prefix'],
),False,__LINE__,__FILE__);
-
- $this->clear_session_cache();
}
- }
+ $this->db->insert($this->applications_table,array(
+ 'app_name' => $appname,
+ 'app_enabled' => $enable,
+ 'app_order' => $setup_info[$appname]['app_order'],
+ 'app_tables' => $tables,
+ 'app_version' => $setup_info[$appname]['version'],
+ ),False,__LINE__,__FILE__);
- /**
- * Check if an application has info in the db
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- * @param $enabled optional, set to False to not enable this app
- */
- function app_registered($appname)
- {
- $setup_info = $GLOBALS['setup_info'];
-
- if(!$appname)
- {
- return False;
- }
-
- if(@$GLOBALS['DEBUG'])
- {
- echo '
app_registered(): checking ' . $appname . ', table: ' . $this->applications_table;
- // _debug_array($setup_info[$appname]);
- }
-
- $this->db->select($this->applications_table,'COUNT(*)',array('app_name' => $appname),__LINE__,__FILE__);
- if($this->db->next_record() && $this->db->f(0))
- {
- if(@$GLOBALS['DEBUG'])
- {
- echo '... app previously registered.';
- }
- return True;
- }
- if(@$GLOBALS['DEBUG'])
- {
- echo '... app not registered';
- }
- return False;
- }
-
- /**
- * Update application info in the db
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- * @param $enabled optional, set to False to not enable this app
- */
- function update_app($appname)
- {
- $setup_info = $GLOBALS['setup_info'];
-
- if(!$appname)
- {
- return False;
- }
-
- if($GLOBALS['DEBUG'])
- {
- echo '
update_app(): ' . $appname . ', version: ' . $setup_info[$appname]['currentver'] . ', table: ' . $this->applications_table . '
';
- // _debug_array($setup_info[$appname]);
- }
-
- if(!$this->app_registered($appname))
- {
- return False;
- }
-
- if($setup_info[$appname]['version'])
- {
- //echo '
' . $setup_info[$appname]['version'];
- if($setup_info[$appname]['tables'])
- {
- $tables = implode(',',$setup_info[$appname]['tables']);
- }
- $this->db->update($this->applications_table,array(
- 'app_enabled' => $setup_info[$appname]['enable'],
- 'app_order' => $setup_info[$appname]['app_order'],
- 'app_tables' => $tables,
- 'app_version' => $setup_info[$appname]['version'],
- ),array('app_name'=>$appname),__LINE__,__FILE__);
- }
- }
-
- /**
- * Update application version in applications table, post upgrade
- *
- * @param $setup_info * Array of application information (multiple apps or single)
- * @param $appname * Application 'name' with a matching $setup_info[$appname] array slice
- * @param $tableschanged ???
- */
- function update_app_version($setup_info, $appname, $tableschanged = True)
- {
- if(!$appname)
- {
- return False;
- }
-
- if($tableschanged == True)
- {
- $GLOBALS['egw_info']['setup']['tableschanged'] = True;
- }
- if($setup_info[$appname]['currentver'])
- {
- $this->db->update($this->applications_table,array(
- 'app_version' => $setup_info[$appname]['currentver'],
- ),array('app_name'=>$appname),__LINE__,__FILE__);
- }
- return $setup_info;
- }
-
- /**
- * de-Register an application
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- */
- function deregister_app($appname)
- {
- if(!$appname)
- {
- return False;
- }
- $setup_info = $GLOBALS['setup_info'];
-
- //echo 'DELETING application: ' . $appname;
- $this->db->delete($this->applications_table,array('app_name'=>$appname),__LINE__,__FILE__);
$this->clear_session_cache();
}
+ }
- /**
- * Register an application's hooks
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- */
- function register_hooks($appname)
+ /**
+ * Check if an application has info in the db
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ * @param $enabled optional, set to False to not enable this app
+ */
+ function app_registered($appname)
+ {
+ $setup_info = $GLOBALS['setup_info'];
+
+ if(!$appname)
{
- $setup_info = $GLOBALS['setup_info'];
-
- if(!$appname)
- {
- return False;
- }
-
- if(!$this->hooks_table) // No hooks table yet
- {
- return False;
- }
-
- if (!is_object($this->hooks))
- {
- $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
- }
- $this->hooks->register_hooks($appname,$setup_info[$appname]['hooks']);
+ return False;
}
- /**
- * Update an application's hooks
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- */
- function update_hooks($appname)
+ if(@$GLOBALS['DEBUG'])
{
- $this->register_hooks($appname);
+ echo '
app_registered(): checking ' . $appname . ', table: ' . $this->applications_table;
+ // _debug_array($setup_info[$appname]);
}
- /**
- * de-Register an application's hooks
- *
- * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
- */
- function deregister_hooks($appname)
+ $this->db->select($this->applications_table,'COUNT(*)',array('app_name' => $appname),__LINE__,__FILE__);
+ if($this->db->next_record() && $this->db->f(0))
{
- if(!$this->hooks_table) // No hooks table yet
+ if(@$GLOBALS['DEBUG'])
{
- return False;
+ echo '... app previously registered.';
}
+ return True;
+ }
+ if(@$GLOBALS['DEBUG'])
+ {
+ echo '... app not registered';
+ }
+ return False;
+ }
- if(!$appname)
- {
- return False;
- }
-
- //echo "DELETING hooks for: " . $setup_info[$appname]['name'];
- if (!is_object($this->hooks))
- {
- $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
- }
- $this->hooks->register_hooks($appname);
+ /**
+ * Update application info in the db
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ * @param $enabled optional, set to False to not enable this app
+ */
+ function update_app($appname)
+ {
+ $setup_info = $GLOBALS['setup_info'];
+
+ if(!$appname)
+ {
+ return False;
}
- /**
- * call the hooks for a single application
- *
- * @param $location hook location - required
- * @param $appname application name - optional
- */
- function hook($location, $appname='')
+ if($GLOBALS['DEBUG'])
{
- if (!is_object($this->hooks))
- {
- $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
- }
- return $this->hooks->single($location,$appname,True,True);
+ echo '
update_app(): ' . $appname . ', version: ' . $setup_info[$appname]['currentver'] . ', table: ' . $this->applications_table . '
';
+ // _debug_array($setup_info[$appname]);
}
- /**
- * egw version checking, is param 1 < param 2 in phpgw versionspeak?
- * @param $a phpgw version number to check if less than $b
- * @param $b phpgw version number to check $a against
- * @return True if $a < $b
- */
- function alessthanb($a,$b,$DEBUG=False)
+ if(!$this->app_registered($appname))
{
- $num = array('1st','2nd','3rd','4th');
-
- if($DEBUG)
- {
- echo'
Input values: '
- . 'A="'.$a.'", B="'.$b.'"';
- }
- $newa = str_replace('pre','.',$a);
- $newb = str_replace('pre','.',$b);
- $testa = explode('.',$newa);
- if(@$testa[1] == '')
- {
- $testa[1] = 0;
- }
-
- $testb = explode('.',$newb);
- if(@$testb[1] == '')
- {
- $testb[1] = 0;
- }
- if(@$testb[3] == '')
- {
- $testb[3] = 0;
- }
- $less = 0;
-
- for($i=0;$iChecking if '. (int)$testa[$i] . ' is less than ' . (int)$testb[$i] . ' ...'; }
- if((int)$testa[$i] < (int)$testb[$i])
- {
- if ($DEBUG) { echo ' yes.'; }
- $less++;
- if($i<3)
- {
- /* Ensure that this is definitely smaller */
- if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely less than B."; }
- $less = 5;
- break;
- }
- }
- elseif((int)$testa[$i] > (int)$testb[$i])
- {
- if($DEBUG) { echo ' no.'; }
- $less--;
- if($i<2)
- {
- /* Ensure that this is definitely greater */
- if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely greater than B."; }
- $less = -5;
- break;
- }
- }
- else
- {
- if($DEBUG) { echo ' no, they are equal or of different length.'; }
- // makes sure eg. '1.0.0' is counted less the '1.0.0.xxx' !
- $less = count($testa) < count($testb) ? 1 : 0;
- }
- }
- if($DEBUG) { echo '
Check value is: "'.$less.'"'; }
- if($less>0)
- {
- if($DEBUG) { echo '
A is less than B'; }
- return True;
- }
- elseif($less<0)
- {
- if($DEBUG) { echo '
A is greater than B'; }
- return False;
- }
- else
- {
- if($DEBUG) { echo '
A is equal to B'; }
- return False;
- }
+ return False;
}
- /**
- * egw version checking, is param 1 > param 2 in phpgw versionspeak?
- *
- * @param $a phpgw version number to check if more than $b
- * @param $b phpgw version number to check $a against
- * @return True if $a < $b
- */
- function amorethanb($a,$b,$DEBUG=False)
+ if($setup_info[$appname]['version'])
{
- $num = array('1st','2nd','3rd','4th');
+ //echo '
' . $setup_info[$appname]['version'];
+ if($setup_info[$appname]['tables'])
+ {
+ $tables = implode(',',$setup_info[$appname]['tables']);
+ }
+ $this->db->update($this->applications_table,array(
+ 'app_enabled' => $setup_info[$appname]['enable'],
+ 'app_order' => $setup_info[$appname]['app_order'],
+ 'app_tables' => $tables,
+ 'app_version' => $setup_info[$appname]['version'],
+ ),array('app_name'=>$appname),__LINE__,__FILE__);
+ }
+ }
- if($DEBUG)
- {
- echo'
Input values: '
- . 'A="'.$a.'", B="'.$b.'"';
- }
- $newa = str_replace('pre','.',$a);
- $newb = str_replace('pre','.',$b);
- $testa = explode('.',$newa);
- if($testa[3] == '')
- {
- $testa[3] = 0;
- }
- $testb = explode('.',$newb);
- if($testb[3] == '')
- {
- $testb[3] = 0;
- }
- $less = 0;
-
- for($i=0;$iChecking if '. (int)$testa[$i] . ' is more than ' . (int)$testb[$i] . ' ...'; }
- if((int)$testa[$i] > (int)$testb[$i])
- {
- if($DEBUG) { echo ' yes.'; }
- $less++;
- if($i<3)
- {
- /* Ensure that this is definitely greater */
- if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely greater than B."; }
- $less = 5;
- break;
- }
- }
- elseif((int)$testa[$i] < (int)$testb[$i])
- {
- if($DEBUG) { echo ' no.'; }
- $less--;
- if($i<2)
- {
- /* Ensure that this is definitely smaller */
- if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely less than B."; }
- $less = -5;
- break;
- }
- }
- else
- {
- if($DEBUG) { echo ' no, they are equal.'; }
- $less = 0;
- }
- }
- if($DEBUG) { echo '
Check value is: "'.$less.'"'; }
- if($less>0)
- {
- if($DEBUG) { echo '
A is greater than B'; }
- return True;
- }
- elseif($less<0)
- {
- if($DEBUG) { echo '
A is less than B'; }
- return False;
- }
- else
- {
- if($DEBUG) { echo '
A is equal to B'; }
- return False;
- }
+ /**
+ * Update application version in applications table, post upgrade
+ *
+ * @param $setup_info * Array of application information (multiple apps or single)
+ * @param $appname * Application 'name' with a matching $setup_info[$appname] array slice
+ * @param $tableschanged ???
+ */
+ function update_app_version($setup_info, $appname, $tableschanged = True)
+ {
+ if(!$appname)
+ {
+ return False;
}
- /**
- * Own instance of the accounts class
- *
- * @var accounts
- */
- var $accounts;
+ if($tableschanged == True)
+ {
+ $GLOBALS['egw_info']['setup']['tableschanged'] = True;
+ }
+ if($setup_info[$appname]['currentver'])
+ {
+ $this->db->update($this->applications_table,array(
+ 'app_version' => $setup_info[$appname]['currentver'],
+ ),array('app_name'=>$appname),__LINE__,__FILE__);
+ }
+ return $setup_info;
+ }
+
+ /**
+ * de-Register an application
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ */
+ function deregister_app($appname)
+ {
+ if(!$appname)
+ {
+ return False;
+ }
+ $setup_info = $GLOBALS['setup_info'];
+
+ //echo 'DELETING application: ' . $appname;
+ $this->db->delete($this->applications_table,array('app_name'=>$appname),__LINE__,__FILE__);
+ $this->clear_session_cache();
+ }
+
+ /**
+ * Register an application's hooks
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ */
+ function register_hooks($appname)
+ {
+ $setup_info = $GLOBALS['setup_info'];
+
+ if(!$appname)
+ {
+ return False;
+ }
+
+ if(!$this->hooks_table) // No hooks table yet
+ {
+ return False;
+ }
+
+ if (!is_object($this->hooks))
+ {
+ $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
+ }
+ $this->hooks->register_hooks($appname,$setup_info[$appname]['hooks']);
+ }
+
+ /**
+ * Update an application's hooks
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ */
+ function update_hooks($appname)
+ {
+ $this->register_hooks($appname);
+ }
+
+ /**
+ * de-Register an application's hooks
+ *
+ * @param $appname Application 'name' with a matching $setup_info[$appname] array slice
+ */
+ function deregister_hooks($appname)
+ {
+ if(!$this->hooks_table) // No hooks table yet
+ {
+ return False;
+ }
+
+ if(!$appname)
+ {
+ return False;
+ }
- function setup_account_object(array $config=array())
+ //echo "DELETING hooks for: " . $setup_info[$appname]['name'];
+ if (!is_object($this->hooks))
{
- if (!is_object($this->accounts) || $config)
- {
- if (!is_object($this->db))
- {
- $this->loaddb();
- }
- if (!$config)
- {
- // load the configuration from the database
- $this->db->select($this->config_table,'config_name,config_value',
- "config_name LIKE 'ldap%' OR config_name LIKE 'account_%' OR config_name LIKE '%encryption%' OR config_name='auth_type'",__LINE__,__FILE__);
-
- while(($row = $this->db->row(true)))
- {
- $config[$row['config_name']] = $row['config_value'];
- }
- }
- if (!is_object($GLOBALS['egw']))
- {
- $GLOBALS['egw'] =& new egw_dummy();
- $GLOBALS['phpgw'] =& $GLOBALS['egw'];
- }
- $GLOBALS['egw']->db = clone($this->db);
- $GLOBALS['egw']->common =& CreateObject('phpgwapi.common');
+ $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
+ }
+ $this->hooks->register_hooks($appname);
+ }
- $this->accounts = new accounts($config);
- if (!is_object($GLOBALS['egw']->accounts)) $GLOBALS['egw']->accounts = $this->accounts;
- $this->accounts->cache_invalidate(); // the cache is shared for all instances of the class
+ /**
+ * call the hooks for a single application
+ *
+ * @param $location hook location - required
+ * @param $appname application name - optional
+ */
+ function hook($location, $appname='')
+ {
+ if (!is_object($this->hooks))
+ {
+ $this->hooks =& CreateObject('phpgwapi.hooks',$this->db,$this->hooks_table);
+ }
+ return $this->hooks->single($location,$appname,True,True);
+ }
- if($this->accounts->backend instanceof accounts_ldap && !$this->accounts->backend->ds)
- {
- printf("Error: Error connecting to LDAP server %s!
",$config['ldap_host']);
- return false;
- }
- }
- return true;
+ /**
+ * egw version checking, is param 1 < param 2 in phpgw versionspeak?
+ * @param $a phpgw version number to check if less than $b
+ * @param $b phpgw version number to check $a against
+ * @return True if $a < $b
+ */
+ function alessthanb($a,$b,$DEBUG=False)
+ {
+ $num = array('1st','2nd','3rd','4th');
+
+ if($DEBUG)
+ {
+ echo'
Input values: '
+ . 'A="'.$a.'", B="'.$b.'"';
+ }
+ $newa = str_replace('pre','.',$a);
+ $newb = str_replace('pre','.',$b);
+ $testa = explode('.',$newa);
+ if(@$testa[1] == '')
+ {
+ $testa[1] = 0;
}
- /**
- * add an user account or a user group
- *
- * if the $username already exists, only the id is returned, no new user / group gets created
- *
- * @param string $username alphanumerical username or groupname (account_lid)
- * @param string $first first name
- * @param string $last last name
- * @param $passwd string cleartext pw
- * @param string/boolean $primary_group Groupname for users primary group or False for a group, default 'Default'
- * @param boolean $changepw user has right to change pw, default False = Pw change NOT allowed
- * @param string $email
- * @return int the numerical user-id
- */
- function add_account($username,$first,$last,$passwd,$primary_group='Default',$changepw=False,$email='')
+ $testb = explode('.',$newb);
+ if(@$testb[1] == '')
{
- $this->setup_account_object();
+ $testb[1] = 0;
+ }
+ if(@$testb[3] == '')
+ {
+ $testb[3] = 0;
+ }
+ $less = 0;
- $primary_group_id = $primary_group ? $this->accounts->name2id($primary_group) : False;
-
- if(!($accountid = $this->accounts->name2id($username)))
+ for($i=0;$iChecking if '. (int)$testa[$i] . ' is less than ' . (int)$testb[$i] . ' ...'; }
+ if((int)$testa[$i] < (int)$testb[$i])
{
- $account = array(
- 'account_type' => $primary_group ? 'u' : 'g',
- 'account_lid' => $username,
- 'account_passwd' => $passwd,
- 'account_firstname' => $first,
- 'account_lastname' => $last,
- 'account_status' => 'A',
- 'account_primary_group' => $primary_group_id,
- 'account_expires' => -1,
- 'account_email' => $email,
- 'account_members' => ''
- );
- if (!($accountid = $this->accounts->save($account)))
+ if ($DEBUG) { echo ' yes.'; }
+ $less++;
+ if($i<3)
{
- error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') failed! accountid=$accountid");
- return false;
+ /* Ensure that this is definitely smaller */
+ if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely less than B."; }
+ $less = 5;
+ break;
}
}
- if ($primary_group) // only for users, NOT groups
+ elseif((int)$testa[$i] > (int)$testb[$i])
{
- $memberships = $this->accounts->memberships($accountid,true);
+ if($DEBUG) { echo ' no.'; }
+ $less--;
+ if($i<2)
+ {
+ /* Ensure that this is definitely greater */
+ if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely greater than B."; }
+ $less = -5;
+ break;
+ }
+ }
+ else
+ {
+ if($DEBUG) { echo ' no, they are equal or of different length.'; }
+ // makes sure eg. '1.0.0' is counted less the '1.0.0.xxx' !
+ $less = count($testa) < count($testb) ? 1 : 0;
+ }
+ }
+ if($DEBUG) { echo '
Check value is: "'.$less.'"'; }
+ if($less>0)
+ {
+ if($DEBUG) { echo '
A is less than B'; }
+ return True;
+ }
+ elseif($less<0)
+ {
+ if($DEBUG) { echo '
A is greater than B'; }
+ return False;
+ }
+ else
+ {
+ if($DEBUG) { echo '
A is equal to B'; }
+ return False;
+ }
+ }
+
+ /**
+ * egw version checking, is param 1 > param 2 in phpgw versionspeak?
+ *
+ * @param $a phpgw version number to check if more than $b
+ * @param $b phpgw version number to check $a against
+ * @return True if $a < $b
+ */
+ function amorethanb($a,$b,$DEBUG=False)
+ {
+ $num = array('1st','2nd','3rd','4th');
+
+ if($DEBUG)
+ {
+ echo'
Input values: '
+ . 'A="'.$a.'", B="'.$b.'"';
+ }
+ $newa = str_replace('pre','.',$a);
+ $newb = str_replace('pre','.',$b);
+ $testa = explode('.',$newa);
+ if($testa[3] == '')
+ {
+ $testa[3] = 0;
+ }
+ $testb = explode('.',$newb);
+ if($testb[3] == '')
+ {
+ $testb[3] = 0;
+ }
+ $less = 0;
+
+ for($i=0;$iChecking if '. (int)$testa[$i] . ' is more than ' . (int)$testb[$i] . ' ...'; }
+ if((int)$testa[$i] > (int)$testb[$i])
+ {
+ if($DEBUG) { echo ' yes.'; }
+ $less++;
+ if($i<3)
+ {
+ /* Ensure that this is definitely greater */
+ if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely greater than B."; }
+ $less = 5;
+ break;
+ }
+ }
+ elseif((int)$testa[$i] < (int)$testb[$i])
+ {
+ if($DEBUG) { echo ' no.'; }
+ $less--;
+ if($i<2)
+ {
+ /* Ensure that this is definitely smaller */
+ if($DEBUG) { echo" This is the $num[$i] octet, so A is definitely less than B."; }
+ $less = -5;
+ break;
+ }
+ }
+ else
+ {
+ if($DEBUG) { echo ' no, they are equal.'; }
+ $less = 0;
+ }
+ }
+ if($DEBUG) { echo '
Check value is: "'.$less.'"'; }
+ if($less>0)
+ {
+ if($DEBUG) { echo '
A is greater than B'; }
+ return True;
+ }
+ elseif($less<0)
+ {
+ if($DEBUG) { echo '
A is less than B'; }
+ return False;
+ }
+ else
+ {
+ if($DEBUG) { echo '
A is equal to B'; }
+ return False;
+ }
+ }
+
+ /**
+ * Own instance of the accounts class
+ *
+ * @var accounts
+ */
+ var $accounts;
- if($primary_group_id && !in_array($primary_group_id,$memberships))
- {
- $memberships[] = $primary_group_id;
-
- $this->accounts->set_memberships($memberships,$accountid);
- }
- if (!$changepw) $this->add_acl('preferences','nopasswordchange',$accountid);
- }
- //error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') successfull created accountid=$accountid");
- return $accountid;
- }
-
- /**
- * Set the memberships of an account
- *
- * @param array $groups array of group-id's
- * @param int $user account_id
- */
- function set_memberships($groups,$user)
+ function setup_account_object(array $config=array())
+ {
+error_log(__METHOD__."($config)");
+ if (!is_object($this->accounts) || $config)
{
- $this->setup_account_object();
-
- return $this->accounts->set_memberships($groups,$user);
- }
-
- /**
- * Check if accounts other then the automatically installed anonymous account exist
- *
- * We check via the account object, to deal with different account-storages
- *
- * @return boolean
- */
- function accounts_exist()
- {
- if (!$this->setup_account_object()) return false;
-
- $accounts = $this->accounts->search(array(
- 'type' => 'accounts',
- 'start' => 0,
- 'offset' => 2 // we only need to check 2 accounts, if we just check for not anonymous
- ));
-
- if (!$accounts || !is_array($accounts) || !count($accounts))
- {
- return false;
- }
- foreach($accounts as $account)
- {
- if ($account['account_lid'] != 'anonymous')
- {
- // we might add further checks, eg. if the account really has admin rights here
- return true;
- }
- }
- return false;
- }
-
- /**
- * Add ACL rights
- *
- * Dont use it to set group-membership, use set_memberships instead!
- *
- * @param $app string/array with app-names
- * @param $locations string eg. run
- * @param $account int/string accountid or account_lid
- * @param $rights int rights to set, default 1
- */
- function add_acl($apps,$location,$account,$rights=1)
- {
- //error_log("setup::add_acl(".(is_array($apps) ? "array('".implode("','",$apps)."')" : "'$apps'").",'$location',$account,$rights)");
- if (!is_numeric($account))
- {
- $this->setup_account_object();
- $account = $this->accounts->name2id($account);
- }
- if(!is_object($this->db))
+error_log(__METHOD__."($config) creating new this->accounts object");
+ if (!is_object($this->db))
{
$this->loaddb();
}
-
- if(!is_array($apps))
+ if (!$config)
{
- $apps = array($apps);
- }
- foreach($apps as $app)
- {
- $this->db->delete($this->acl_table,array(
- 'acl_appname' => $app,
- 'acl_location' => $location,
- 'acl_account' => $account
- ),__LINE__,__FILE__);
-
- if ((int) $rights)
+ // load the configuration from the database
+ $this->db->select($this->config_table,'config_name,config_value',
+ "config_name LIKE 'ldap%' OR config_name LIKE 'account_%' OR config_name LIKE '%encryption%' OR config_name='auth_type'",__LINE__,__FILE__);
+
+ while(($row = $this->db->row(true)))
{
- $this->db->insert($this->acl_table,array(
- 'acl_rights' => $rights
- ),array(
- 'acl_appname' => $app,
- 'acl_location' => $location,
- 'acl_account' => $account,
- ),__LINE__,__FILE__);
+ $config[$row['config_name']] = $row['config_value'];
}
}
+ $this->accounts = new accounts($config);
+ if (!is_object($GLOBALS['egw']->accounts)) $GLOBALS['egw']->accounts = $this->accounts;
+ $this->accounts->cache_invalidate(); // the cache is shared for all instances of the class
+
+ if($this->accounts->backend instanceof accounts_ldap && !$this->accounts->backend->ds)
+ {
+ printf("Error: Error connecting to LDAP server %s!
",$config['ldap_host']);
+ return false;
+ }
}
-
- /**
- * checks if one of the given tables exist, returns the first match
- *
- * @param array $tables array with possible table-names
- * @return string/boolean tablename or false
- */
- function table_exist($tables,$force_refresh=False)
+ return true;
+ }
+
+ /**
+ * add an user account or a user group
+ *
+ * if the $username already exists, only the id is returned, no new user / group gets created
+ *
+ * @param string $username alphanumerical username or groupname (account_lid)
+ * @param string $first first name
+ * @param string $last last name
+ * @param $passwd string cleartext pw
+ * @param string/boolean $primary_group Groupname for users primary group or False for a group, default 'Default'
+ * @param boolean $changepw user has right to change pw, default False = Pw change NOT allowed
+ * @param string $email
+ * @return int the numerical user-id
+ */
+ function add_account($username,$first,$last,$passwd,$primary_group='Default',$changepw=False,$email='')
+ {
+ $this->setup_account_object();
+
+ $primary_group_id = $primary_group ? $this->accounts->name2id($primary_group) : False;
+
+ if(!($accountid = $this->accounts->name2id($username)))
{
- static $table_names = False;
-
- if (!$table_names || $force_refresh) $table_names = $this->db->table_names();
-
- if (!$table_names) return false;
-
- foreach($table_names as $data)
+ $account = array(
+ 'account_type' => $primary_group ? 'u' : 'g',
+ 'account_lid' => $username,
+ 'account_passwd' => $passwd,
+ 'account_firstname' => $first,
+ 'account_lastname' => $last,
+ 'account_status' => 'A',
+ 'account_primary_group' => $primary_group_id,
+ 'account_expires' => -1,
+ 'account_email' => $email,
+ 'account_members' => ''
+ );
+ if (!($accountid = $this->accounts->save($account)))
{
- if (($key = array_search($data['table_name'],$tables)) !== false)
- {
- return $tables[$key];
- }
+ error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') failed! accountid=$accountid");
+ return false;
}
+ }
+ if ($primary_group) // only for users, NOT groups
+ {
+ $memberships = $this->accounts->memberships($accountid,true);
+
+ if($primary_group_id && !in_array($primary_group_id,$memberships))
+ {
+ $memberships[] = $primary_group_id;
+
+ $this->accounts->set_memberships($memberships,$accountid);
+ }
+ if (!$changepw) $this->add_acl('preferences','nopasswordchange',$accountid);
+ }
+ //error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') successfull created accountid=$accountid");
+ return $accountid;
+ }
+
+ /**
+ * Set the memberships of an account
+ *
+ * @param array $groups array of group-id's
+ * @param int $user account_id
+ */
+ function set_memberships($groups,$user)
+ {
+ $this->setup_account_object();
+
+ return $this->accounts->set_memberships($groups,$user);
+ }
+
+ /**
+ * Check if accounts other then the automatically installed anonymous account exist
+ *
+ * We check via the account object, to deal with different account-storages
+ *
+ * @return boolean
+ */
+ function accounts_exist()
+ {
+ if (!$this->setup_account_object()) return false;
+
+ $accounts = $this->accounts->search(array(
+ 'type' => 'accounts',
+ 'start' => 0,
+ 'offset' => 2 // we only need to check 2 accounts, if we just check for not anonymous
+ ));
+
+ if (!$accounts || !is_array($accounts) || !count($accounts))
+ {
return false;
}
-
- /**
- * Checks and set the names of the tables, which get accessed before an update: eg. config- and applications-table
- *
- * Other tables can always use the most up to date name
- */
- function set_table_names($force_refresh=False)
+ foreach($accounts as $account)
{
- foreach(array(
- 'config_table' => array('egw_config','phpgw_config','config'),
- 'applications_table' => array('egw_applications','phpgw_applications','applications'),
- 'accounts_table' => array('egw_accounts','phpgw_accounts'),
- 'acl_table' => array('egw_acl','phpgw_acl'),
- 'lang_table' => array('egw_lang','phpgw_lang','lang'),
- 'languages_table' => array('egw_languages','phpgw_languages','languages'),
- ) as $name => $tables)
+ if ($account['account_lid'] != 'anonymous')
{
- $table = $this->table_exist($tables,$force_refresh);
+ // we might add further checks, eg. if the account really has admin rights here
+ return true;
+ }
+ }
+ return false;
+ }
- if ($table && $table != $this->$name) // only overwrite the default name, if we realy got one (important for new installs)
- {
- $this->$name = $table;
- }
- //echo "setup::set_table_names: $name = '{$this->$name}'
\n";
+ /**
+ * Add ACL rights
+ *
+ * Dont use it to set group-membership, use set_memberships instead!
+ *
+ * @param $app string/array with app-names
+ * @param $locations string eg. run
+ * @param $account int/string accountid or account_lid
+ * @param $rights int rights to set, default 1
+ */
+ function add_acl($apps,$location,$account,$rights=1)
+ {
+ //error_log("setup::add_acl(".(is_array($apps) ? "array('".implode("','",$apps)."')" : "'$apps'").",'$location',$account,$rights)");
+ if (!is_numeric($account))
+ {
+ $this->setup_account_object();
+ $account = $this->accounts->name2id($account);
+ }
+ if(!is_object($this->db))
+ {
+ $this->loaddb();
+ }
+
+ if(!is_array($apps))
+ {
+ $apps = array($apps);
+ }
+ foreach($apps as $app)
+ {
+ $this->db->delete($this->acl_table,array(
+ 'acl_appname' => $app,
+ 'acl_location' => $location,
+ 'acl_account' => $account
+ ),__LINE__,__FILE__);
+
+ if ((int) $rights)
+ {
+ $this->db->insert($this->acl_table,array(
+ 'acl_rights' => $rights
+ ),array(
+ 'acl_appname' => $app,
+ 'acl_location' => $location,
+ 'acl_account' => $account,
+ ),__LINE__,__FILE__);
}
}
}
+
+ /**
+ * checks if one of the given tables exist, returns the first match
+ *
+ * @param array $tables array with possible table-names
+ * @return string/boolean tablename or false
+ */
+ function table_exist($tables,$force_refresh=False)
+ {
+ static $table_names = False;
+
+ if (!$table_names || $force_refresh) $table_names = $this->db->table_names();
+
+ if (!$table_names) return false;
+
+ foreach($table_names as $data)
+ {
+ if (($key = array_search($data['table_name'],$tables)) !== false)
+ {
+ return $tables[$key];
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks and set the names of the tables, which get accessed before an update: eg. config- and applications-table
+ *
+ * Other tables can always use the most up to date name
+ */
+ function set_table_names($force_refresh=False)
+ {
+ foreach(array(
+ 'config_table' => array('egw_config','phpgw_config','config'),
+ 'applications_table' => array('egw_applications','phpgw_applications','applications'),
+ 'accounts_table' => array('egw_accounts','phpgw_accounts'),
+ 'acl_table' => array('egw_acl','phpgw_acl'),
+ 'lang_table' => array('egw_lang','phpgw_lang','lang'),
+ 'languages_table' => array('egw_languages','phpgw_languages','languages'),
+ ) as $name => $tables)
+ {
+ $table = $this->table_exist($tables,$force_refresh);
+
+ if ($table && $table != $this->$name) // only overwrite the default name, if we realy got one (important for new installs)
+ {
+ $this->$name = $table;
+ }
+ //echo "setup::set_table_names: $name = '{$this->$name}'
\n";
+ }
+ }
+}