diff --git a/phpgwapi/inc/class.egw.inc.php b/phpgwapi/inc/class.egw.inc.php
index 5aa46a2f9c..d1b28eae29 100644
--- a/phpgwapi/inc/class.egw.inc.php
+++ b/phpgwapi/inc/class.egw.inc.php
@@ -1,471 +1,488 @@
db =& CreateObject('phpgwapi.egw_db');
- if ($this->debug)
+ /**
+ * Constructor: Instantiates the sub-classes
+ *
+ * @author RalfBecker@outdoor-training.de
+ * @param array $domain_names array with valid egw-domain names
+ */
+ function egw($domain_names=null)
{
- $this->db->Debug = 1;
+ $GLOBALS['egw'] =& $this; // we need to be immediately available there for the other classes we instantiate
+ // for the migration: reference us to the old phpgw object
+ $GLOBALS['phpgw'] =& $this;
+ $this->setup($domain_names,True);
}
- $this->db->set_app('phpgwapi');
- $this->db->Halt_On_Error = 'no';
- $this->db->connect(
- $GLOBALS['egw_info']['server']['db_name'],
- $GLOBALS['egw_info']['server']['db_host'],
- $GLOBALS['egw_info']['server']['db_port'],
- $GLOBALS['egw_info']['server']['db_user'],
- $GLOBALS['egw_info']['server']['db_pass'],
- $GLOBALS['egw_info']['server']['db_type']
- );
- // check if eGW is already setup, if not redirect to setup/
- $this->db->select($this->config_table,'COUNT(config_name)',false,__LINE__,__FILE__);
- if(!$this->db->next_record())
+ /**
+ * Called every time the constructor is called. Also called by sessions to ensure the correct db,
+ * in which case we do not recreate the session object.
+ * @author RalfBecker@outdoor-training.de (moved to setup() by milos@groupwhere.org
+ * @param array $domain_names array with valid egw-domain names
+ * @param boolean $createsessionobject True to create the session object (default=True)
+ */
+ function setup($domain_names,$createsessionobject=True)
{
- $setup_dir = str_replace($_SERVER['PHP_SELF'],'index.php','setup/');
- echo '
Fatal Error: It appears that you have not created the database tables for '
- .'eGroupWare. Click here to run setup.';
- exit;
+ // create the DB-object
+ $this->db =& CreateObject('phpgwapi.egw_db');
+ if ($this->debug)
+ {
+ $this->db->Debug = 1;
+ }
+ $this->db->set_app('phpgwapi');
+
+ $this->db->Halt_On_Error = 'no';
+ $this->db->connect(
+ $GLOBALS['egw_info']['server']['db_name'],
+ $GLOBALS['egw_info']['server']['db_host'],
+ $GLOBALS['egw_info']['server']['db_port'],
+ $GLOBALS['egw_info']['server']['db_user'],
+ $GLOBALS['egw_info']['server']['db_pass'],
+ $GLOBALS['egw_info']['server']['db_type']
+ );
+ // check if eGW is already setup, if not redirect to setup/
+ $this->db->select($this->config_table,'COUNT(config_name)',false,__LINE__,__FILE__);
+ if(!$this->db->next_record())
+ {
+ $setup_dir = str_replace($_SERVER['PHP_SELF'],'index.php','setup/');
+ echo 'Fatal Error: It appears that you have not created the database tables for '
+ .'eGroupWare. Click here to run setup.';
+ exit;
+ }
+ $this->db->Halt_On_Error = 'yes';
+
+ // 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->db->Link_ID->SetCharSet($this->db->f(0));
+ }
+ // load up the $GLOBALS['egw_info']['server'] array
+ $this->db->select($this->config_table,'*',array('config_app' => 'phpgwapi'),__LINE__,__FILE__);
+ while (($row = $this->db->row(true)))
+ {
+ $GLOBALS['egw_info']['server'][$row['config_name']] = stripslashes($row['config_value']);
+ }
+ // setup the other subclasses
+ $this->log =& CreateObject('phpgwapi.errorlog');
+ $this->translation =& CreateObject('phpgwapi.translation');
+ $this->common =& CreateObject('phpgwapi.common');
+ $this->hooks =& CreateObject('phpgwapi.hooks');
+ $this->auth =& CreateObject('phpgwapi.auth');
+ $this->accounts =& CreateObject('phpgwapi.accounts');
+ $this->acl =& CreateObject('phpgwapi.acl');
+ /* Do not create the session object if called by the sessions class. This way
+ * we ensure the correct db based on the user domain.
+ */
+ if($createsessionobject)
+ {
+ $this->session =& CreateObject('phpgwapi.sessions',$domain_names);
+ }
+ $this->preferences =& CreateObject('phpgwapi.preferences');
+ $this->applications =& CreateObject('phpgwapi.applications');
+ $this->contenthistory =& CreateObject('phpgwapi.contenthistory');
+ $this->datetime =& CreateObject('phpgwapi.datetime');
+
+ include_once(EGW_INCLUDE_ROOT.'/phpgwapi/inc/class.error.inc.php');
+
+ register_shutdown_function(array($this->common, 'egw_final'));
+
+ if ($GLOBALS['egw_info']['flags']['currentapp'] != 'login' && $GLOBALS['egw_info']['flags']['currentapp'] != 'logout')
+ {
+ $this->verify_session();
+ $this->applications->read_installed_apps(); // to get translated app-titles, has to be after verify_session
+
+ $this->define_egw_constants();
+
+ $this->load_theme_info();
+
+ $this->check_app_rights();
+
+ $this->load_optional_classes();
+ }
+ else // set the defines for login, in case it's more then just login
+ {
+ $this->define_egw_constants();
+ }
}
- $this->db->Halt_On_Error = 'yes';
-
- // 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->db->Link_ID->SetCharSet($this->db->f(0));
- }
- // load up the $GLOBALS['egw_info']['server'] array
- $this->db->select($this->config_table,'*',array('config_app' => 'phpgwapi'),__LINE__,__FILE__);
- while (($row = $this->db->row(true)))
- {
- $GLOBALS['egw_info']['server'][$row['config_name']] = stripslashes($row['config_value']);
- }
- // setup the other subclasses
- $this->log =& CreateObject('phpgwapi.errorlog');
- $this->translation =& CreateObject('phpgwapi.translation');
- $this->common =& CreateObject('phpgwapi.common');
- $this->hooks =& CreateObject('phpgwapi.hooks');
- $this->auth =& CreateObject('phpgwapi.auth');
- $this->accounts =& CreateObject('phpgwapi.accounts');
- $this->acl =& CreateObject('phpgwapi.acl');
- $this->session =& CreateObject('phpgwapi.sessions',$domain_names);
- $this->preferences =& CreateObject('phpgwapi.preferences');
- $this->applications =& CreateObject('phpgwapi.applications');
- $this->contenthistory =& CreateObject('phpgwapi.contenthistory');
- $this->datetime =& CreateObject('phpgwapi.datetime');
- include_once(EGW_INCLUDE_ROOT.'/phpgwapi/inc/class.error.inc.php');
-
- register_shutdown_function(array($this->common, 'egw_final'));
-
- if ($GLOBALS['egw_info']['flags']['currentapp'] != 'login' && $GLOBALS['egw_info']['flags']['currentapp'] != 'logout')
+ /**
+ * __wakeup function gets called by php while unserializing the egw-object, eg. reconnects to the DB
+ *
+ * @author RalfBecker@outdoor-training.de
+ */
+ function __wakeup()
{
- $this->verify_session();
- $this->applications->read_installed_apps(); // to get translated app-titles, has to be after verify_session
-
+ $GLOBALS['egw'] =& $this; // we need to be immediately available there for the other classes we instantiate
+ // for the migration: reference us to the old phpgw object
+ $GLOBALS['phpgw'] =& $this;
+ register_shutdown_function(array($this->common, 'egw_final'));
+
+ $this->db->connect(); // we need to re-connect
+ foreach(array('translation','hooks','auth','accounts','acl','session','preferences','applications','contenthistory','contacts') as $class)
+ {
+ if (is_object($this->$class->db))
+ {
+ $this->$class->db->Link_ID =& $this->db->Link_ID;
+ }
+ }
+ if ($GLOBALS['egw_info']['server']['account_repository'] == 'ldap')
+ {
+ // reconnect the LDAP server, unfortunally this does not work via accounts::__wakeup() as the common-object is not yet available
+ $this->accounts->ds = $this->common->ldapConnect();
+ }
$this->define_egw_constants();
+ }
+
+ /**
+ * wakeup2 funcontion needs to be called after unserializing the egw-object
+ *
+ * It adapts the restored object/enviroment to the changed (current) application / page-request
+ *
+ * @author RalfBecker@outdoor-training.de
+ */
+ function wakeup2()
+ {
+ // do some application specific stuff, need to be done as we are different (current) app now
+ if (is_object($this->template))
+ {
+ $this->template->set_root(EGW_APP_TPL);
+ }
+ $this->translation->add_app($GLOBALS['egw_info']['flags']['currentapp']);
+
+ // verify the session
+ $GLOBALS['egw']->verify_session();
+ $GLOBALS['egw']->check_app_rights();
- $this->load_theme_info();
-
- $this->check_app_rights();
-
$this->load_optional_classes();
}
- else // set the defines for login, in case it's more then just login
- {
- $this->define_egw_constants();
- }
- }
-
- /**
- * __wakeup function gets called by php while unserializing the egw-object, eg. reconnects to the DB
- *
- * @author RalfBecker@outdoor-training.de
- */
- function __wakeup()
- {
- $GLOBALS['egw'] =& $this; // we need to be imediatly avalilible there for the other classes we instanciate
- // for the migration: reference us to the old phpgw object
- $GLOBALS['phpgw'] =& $this;
- register_shutdown_function(array($this->common, 'egw_final'));
- $this->db->connect(); // we need to re-connect
- foreach(array('translation','hooks','auth','accounts','acl','session','preferences','applications','contenthistory','contacts') as $class)
+ /**
+ * load optional classes by mentioning them in egw_info[flags][enable_CLASS_class] => true
+ *
+ * Also loads the template-class if not egw_info[flags][disable_Template_class] is set
+ *
+ * Maybe the whole thing should be depricated ;-)
+ */
+ function load_optional_classes()
{
- if (is_object($this->$class->db))
+ // load classes explicitly mentioned
+ foreach($GLOBALS['egw_info']['flags'] as $enable_class => $enable)
{
- $this->$class->db->Link_ID =& $this->db->Link_ID;
+ if ($enable && substr($enable_class,0,7) == 'enable_')
+ {
+ $enable_class = substr($enable_class,7,-6);
+ $this->$enable_class =& CreateObject('phpgwapi.'.$enable_class);
+ }
}
- }
- if ($GLOBALS['egw_info']['server']['account_repository'] == 'ldap')
- {
- // reconnect the LDAP server, unfortunally this does not work via accounts::__wakeup() as the common-object is not yet availible
- $this->accounts->ds = $this->common->ldapConnect();
- }
- $this->define_egw_constants();
- }
-
- /**
- * wakeup2 funcontion needs to be called after unserializing the egw-object
- *
- * It adapts the restored object/enviroment to the changed (current) application / page-request
- *
- * @author RalfBecker@outdoor-training.de
- */
- function wakeup2()
- {
- // do some application specific stuff, need to be done as we are different (current) app now
- if (is_object($this->template))
- {
- $this->template->set_root(EGW_APP_TPL);
- }
- $this->translation->add_app($GLOBALS['egw_info']['flags']['currentapp']);
-
- // verify the session
- $GLOBALS['egw']->verify_session();
- $GLOBALS['egw']->check_app_rights();
- $this->load_optional_classes();
- }
-
- /**
- * load optional classes by mentioning them in egw_info[flags][enable_CLASS_class] => true
- *
- * Also loads the template-class if not egw_info[flags][disable_Template_class] is set
- *
- * Maybe the whole thing should be depricated ;-)
- */
- function load_optional_classes()
- {
- // load classes explicitly mentioned
- foreach($GLOBALS['egw_info']['flags'] as $enable_class => $enable)
- {
- if ($enable && substr($enable_class,0,7) == 'enable_')
+ // load the template class, if not turned off
+ if(!$GLOBALS['egw_info']['flags']['disable_Template_class'])
{
- $enable_class = substr($enable_class,7,-6);
- $this->$enable_class =& CreateObject('phpgwapi.'.$enable_class);
+ $this->template =& CreateObject('phpgwapi.Template',EGW_APP_TPL);
}
- }
-
- // load the template class, if not turned off
- if(!$GLOBALS['egw_info']['flags']['disable_Template_class'])
- {
- $this->template =& CreateObject('phpgwapi.Template',EGW_APP_TPL);
- }
- // output the header unless the developer turned it off
- if (!@$GLOBALS['egw_info']['flags']['noheader'])
- {
- $GLOBALS['egw']->common->egw_header();
- }
-
- // Load the (depricated) app include files if they exists
- if (EGW_APP_INC != "" && ! preg_match ('/phpgwapi/i', EGW_APP_INC) &&
- file_exists(EGW_APP_INC . '/functions.inc.php') && !isset($_GET['menuaction']))
- {
- include(EGW_APP_INC . '/functions.inc.php');
- }
- if (!@$GLOBALS['egw_info']['flags']['noheader'] && !@$GLOBALS['egw_info']['flags']['noappheader'] &&
+ // output the header unless the developer turned it off
+ if (!@$GLOBALS['egw_info']['flags']['noheader'])
+ {
+ $GLOBALS['egw']->common->egw_header();
+ }
+
+ // Load the (depricated) app include files if they exists
+ if (EGW_APP_INC != "" && ! preg_match ('/phpgwapi/i', EGW_APP_INC) &&
+ file_exists(EGW_APP_INC . '/functions.inc.php') && !isset($_GET['menuaction']))
+ {
+ include(EGW_APP_INC . '/functions.inc.php');
+ }
+ if (!@$GLOBALS['egw_info']['flags']['noheader'] && !@$GLOBALS['egw_info']['flags']['noappheader'] &&
file_exists(EGW_APP_INC . '/header.inc.php') && !isset($_GET['menuaction']))
- {
- include(EGW_APP_INC . '/header.inc.php');
+ {
+ include(EGW_APP_INC . '/header.inc.php');
+ }
}
- }
-
- /**
- * Verfiy there is a valid session
- *
- * One can specify a callback, which gets called if there's no valid session. If the callback returns true, the parameter
- * containst account-details (in keys login, passwd and passwd_type) to automatic create an (anonymous session)
- *
- * It also checks if enforce_ssl is set in the DB and redirects to the https:// version of the site.
- *
- * If there is no valid session and none could be automatic created, the function will redirect to login and NOT return
- */
- function verify_session()
- {
- if(isset($GLOBALS['egw_info']['server']['enforce_ssl']) && !$_SERVER['HTTPS'])
- {
- Header('Location: https://' . $GLOBALS['egw_info']['server']['hostname'] . $GLOBALS['egw_info']['server']['webserver_url'] . $_SERVER['REQUEST_URI']);
- exit;
- }
- $account_callback = $GLOBALS['egw_info']['flags']['autocreate_session_callback'];
- // check if we have a session, if not try to automatic create one
- if (!$this->session->verify() &&
- !($account_callback && function_exists($account_callback) && $account_callback($account) &&
+ /**
+ * Verfiy there is a valid session
+ *
+ * One can specify a callback, which gets called if there's no valid session. If the callback returns true, the parameter
+ * containst account-details (in keys login, passwd and passwd_type) to automatic create an (anonymous session)
+ *
+ * It also checks if enforce_ssl is set in the DB and redirects to the https:// version of the site.
+ *
+ * If there is no valid session and none could be automatic created, the function will redirect to login and NOT return
+ */
+ function verify_session()
+ {
+ if(isset($GLOBALS['egw_info']['server']['enforce_ssl']) && !$_SERVER['HTTPS'])
+ {
+ Header('Location: https://' . $GLOBALS['egw_info']['server']['hostname'] . $GLOBALS['egw_info']['server']['webserver_url'] . $_SERVER['REQUEST_URI']);
+ exit;
+ }
+ $account_callback = $GLOBALS['egw_info']['flags']['autocreate_session_callback'];
+
+ // check if we have a session, if not try to automatic create one
+ if (!$this->session->verify() &&
+ !($account_callback && function_exists($account_callback) && $account_callback($account) &&
($sessionid = $this->session->create($account))))
- {
- //echo "account_callback='$account_callback', account=".print_r($account,true).", sessionid=$sessionid
\n"; exit;
- // we forward to the same place after the re-login
- if ($GLOBALS['egw_info']['server']['webserver_url'] && $GLOBALS['egw_info']['server']['webserver_url'] != '/')
{
- list(,$relpath) = explode($GLOBALS['egw_info']['server']['webserver_url'],$_SERVER['PHP_SELF'],2);
- }
- else // the webserver-url is empty or just a slash '/' (eGW is installed in the docroot and no domain given)
- {
- if (preg_match('/^https?:\/\/[^\/]*\/(.*)$/',$relpath=$_SERVER['PHP_SELF'],$matches))
+ //echo "account_callback='$account_callback', account=".print_r($account,true).", sessionid=$sessionid
\n"; exit;
+ // we forward to the same place after the re-login
+ if ($GLOBALS['egw_info']['server']['webserver_url'] && $GLOBALS['egw_info']['server']['webserver_url'] != '/')
{
- $relpath = $matches[1];
+ list(,$relpath) = explode($GLOBALS['egw_info']['server']['webserver_url'],$_SERVER['PHP_SELF'],2);
}
+ else // the webserver-url is empty or just a slash '/' (eGW is installed in the docroot and no domain given)
+ {
+ if (preg_match('/^https?:\/\/[^\/]*\/(.*)$/',$relpath=$_SERVER['PHP_SELF'],$matches))
+ {
+ $relpath = $matches[1];
+ }
+ }
+ // this removes the sessiondata if its saved in the URL
+ $query = preg_replace('/[&]?sessionid(=|%3D)[^&]+&kp3(=|%3D)[^&]+&domain=.*$/','',$_SERVER['QUERY_STRING']);
+ Header('Location: '.$GLOBALS['egw_info']['server']['webserver_url'].'/login.php?cd=10&phpgw_forward='.urlencode($relpath.(!empty($query) ? '?'.$query : '')));
+ exit;
}
- // this removes the sessiondata if its saved in the URL
- $query = preg_replace('/[&]?sessionid(=|%3D)[^&]+&kp3(=|%3D)[^&]+&domain=.*$/','',$_SERVER['QUERY_STRING']);
- Header('Location: '.$GLOBALS['egw_info']['server']['webserver_url'].'/login.php?cd=10&phpgw_forward='.urlencode($relpath.(!empty($query) ? '?'.$query : '')));
- exit;
}
- }
-
- /**
- * Verfiy the user has rights for the requested app
- *
- * If the user has no rights for the app (eg. called via URL) he get a permission denied page (this function does NOT return)
- */
- function check_app_rights()
- {
- if ($GLOBALS['egw_info']['flags']['currentapp'] != 'about')
+
+ /**
+ * Verify the user has rights for the requested app
+ *
+ * If the user has no rights for the app (eg. called via URL) he get a permission denied page (this function does NOT return)
+ */
+ function check_app_rights()
{
- // This will need to use ACL in the future
- if (!$GLOBALS['egw_info']['user']['apps'][$GLOBALS['egw_info']['flags']['currentapp']] ||
+ if ($GLOBALS['egw_info']['flags']['currentapp'] != 'about')
+ {
+ // This will need to use ACL in the future
+ if (!$GLOBALS['egw_info']['user']['apps'][$GLOBALS['egw_info']['flags']['currentapp']] ||
($GLOBALS['egw_info']['flags']['admin_only'] && !$GLOBALS['egw_info']['user']['apps']['admin']))
- {
- $this->common->egw_header();
- if ($GLOBALS['egw_info']['flags']['noheader'])
{
- echo parse_navbar();
+ $this->common->egw_header();
+ if ($GLOBALS['egw_info']['flags']['noheader'])
+ {
+ echo parse_navbar();
+ }
+
+ $this->log->write(array('text'=>'W-Permissions, Attempted to access %1','p1'=>$GLOBALS['egw_info']['flags']['currentapp']));
+
+ echo ''.lang('Access not permitted').'';
+ $this->common->egw_exit(True);
}
-
- $this->log->write(array('text'=>'W-Permissions, Attempted to access %1','p1'=>$GLOBALS['egw_info']['flags']['currentapp']));
-
- echo ''.lang('Access not permitted').'';
- $this->common->egw_exit(True);
}
}
- }
-
- /**
- * Load old theme info into egw_info[theme]
- *
- * @deprecated all theming should be done via CSS files of the template
- */
- function load_theme_info()
- {
- global $phpgw_info; // this is necesary as the included theme-files use $phpgw_info !!!
- // at the moment we still need the theme files, hopefully they are gone soon in favor of CSS
- if(@file_exists(EGW_SERVER_ROOT . '/phpgwapi/themes/' . $GLOBALS['egw_info']['user']['preferences']['common']['theme'] . '.theme'))
+ /**
+ * Load old theme info into egw_info[theme]
+ *
+ * @deprecated all theming should be done via CSS files of the template
+ */
+ function load_theme_info()
{
- include($file = EGW_SERVER_ROOT . '/phpgwapi/themes/' . $GLOBALS['egw_info']['user']['preferences']['common']['theme'] . '.theme');
+ global $phpgw_info; // this is necesary as the included theme-files use $phpgw_info !!!
+
+ // at the moment we still need the theme files, hopefully they are gone soon in favor of CSS
+ if(@file_exists(EGW_SERVER_ROOT . '/phpgwapi/themes/' . $GLOBALS['egw_info']['user']['preferences']['common']['theme'] . '.theme'))
+ {
+ include($file = EGW_SERVER_ROOT . '/phpgwapi/themes/' . $GLOBALS['egw_info']['user']['preferences']['common']['theme'] . '.theme');
+ }
+ elseif(@file_exists(EGW_SERVER_ROOT . '/phpgwapi/themes/default.theme'))
+ {
+ include($file = EGW_SERVER_ROOT . '/phpgwapi/themes/default.theme');
+ }
+ else
+ {
+ // Hope we don't get to this point. Better then the user seeing a
+ // complety back screen and not know whats going on
+ echo '';
+ $this->log->write(array('text'=>'F-Abort, No themes found'));
+
+ exit;
+ }
}
- elseif(@file_exists(EGW_SERVER_ROOT . '/phpgwapi/themes/default.theme'))
+
+ /**
+ * create all the defines / constants of the eGW-environment (plus the deprecated phpgw ones)
+ */
+ function define_egw_constants()
{
- include($file = EGW_SERVER_ROOT . '/phpgwapi/themes/default.theme');
+ define('SEP',filesystem_separator());
+ define('EGW_ACL_READ',1);
+ define('EGW_ACL_ADD',2);
+ define('EGW_ACL_EDIT',4);
+ define('EGW_ACL_DELETE',8);
+ define('EGW_ACL_PRIVATE',16);
+ define('EGW_ACL_GROUP_MANAGERS',32);
+ define('EGW_ACL_CUSTOM_1',64);
+ define('EGW_ACL_CUSTOM_2',128);
+ define('EGW_ACL_CUSTOM_3',256);
+ // and the old ones
+ define('PHPGW_ACL_READ',1);
+ define('PHPGW_ACL_ADD',2);
+ define('PHPGW_ACL_EDIT',4);
+ define('PHPGW_ACL_DELETE',8);
+ define('PHPGW_ACL_PRIVATE',16);
+ define('PHPGW_ACL_GROUP_MANAGERS',32);
+ define('PHPGW_ACL_CUSTOM_1',64);
+ define('PHPGW_ACL_CUSTOM_2',128);
+ define('PHPGW_ACL_CUSTOM_3',256);
+ // A few hacker resistant constants that will be used throught the program
+ define('EGW_TEMPLATE_DIR', $this->common->get_tpl_dir('phpgwapi'));
+ define('EGW_IMAGES_DIR', $this->common->get_image_path('phpgwapi'));
+ define('EGW_IMAGES_FILEDIR', $this->common->get_image_dir('phpgwapi'));
+ define('EGW_APP_ROOT', $this->common->get_app_dir());
+ define('EGW_APP_INC', $this->common->get_inc_dir());
+ define('EGW_APP_TPL', $this->common->get_tpl_dir());
+ define('EGW_IMAGES', $this->common->get_image_path());
+ define('EGW_APP_IMAGES_DIR', $this->common->get_image_dir());
+ // and the old ones
+ define('PHPGW_TEMPLATE_DIR',EGW_TEMPLATE_DIR);
+ define('PHPGW_IMAGES_DIR',EGW_IMAGES_DIR);
+ define('PHPGW_IMAGES_FILEDIR',EGW_IMAGES_FILEDIR);
+ define('PHPGW_APP_ROOT',EGW_APP_ROOT);
+ define('PHPGW_APP_INC',EGW_APP_INC);
+ define('PHPGW_APP_TPL',EGW_APP_TPL);
+ define('PHPGW_IMAGES',EGW_IMAGES);
+ define('PHPGW_APP_IMAGES_DIR',EGW_APP_IMAGES_DIR);
}
- else
+
+ /**
+ * force the session cache to be re-created, because some of it's data changed
+ *
+ * Needs to be called if user-preferences, system-config or enabled apps of the current user have been changed and
+ * the change should have immediate effect
+ */
+ function invalidate_session_cache()
{
- // Hope we don't get to this point. Better then the user seeing a
- // complety back screen and not know whats going on
- echo '';
- $this->log->write(array('text'=>'F-Abort, No themes found'));
-
+ unset($_SESSION['egw_info_cache']);
+ unset($_SESSION['egw_included_files']);
+ unset($_SESSION['egw_object_cache']);
+ }
+
+ /**
+ * run string through htmlspecialchars and stripslashes
+ *
+ * @param string $s
+ * @return string The string with html special characters replaced with entities
+ */
+ function strip_html($s)
+ {
+ return htmlspecialchars(stripslashes($s));
+ }
+
+ /**
+ * Link url generator
+ *
+ * Used for backwards compatibility and as a shortcut. If no url is passed, it will use PHP_SELF. Wrapper to session->link()
+ *
+ * @param string $string The url the link is for
+ * @param string/array $extravars Extra params to be passed to the url
+ * @return string The full url after processing
+ */
+ function link($url = '', $extravars = '')
+ {
+ return $this->session->link($url, $extravars);
+ }
+
+ function redirect_link($url = '',$extravars='')
+ {
+ $this->redirect($this->session->link($url, $extravars));
+ }
+
+ /**
+ * Handles redirects under iis and apache, it does NOT return (calls exit)
+ *
+ * This function handles redirects under iis and apache it assumes that $phpgw->link() has already been called
+ *
+ * @param string The url ro redirect to
+ */
+ function redirect($url = '')
+ {
+ /* global $HTTP_ENV_VARS; */
+
+ $iis = @strpos($GLOBALS['HTTP_ENV_VARS']['SERVER_SOFTWARE'], 'IIS', 0);
+
+ if(!$url)
+ {
+ $url = $_SERVER['PHP_SELF'];
+ }
+ if($iis)
+ {
+ echo "\n\n\nRedirecting to $url";
+ echo "\n";
+ echo "\n";
+ echo "Please continue to this page
";
+ echo "\n";
+ }
+ else
+ {
+ Header("Location: $url");
+ print("\n\n");
+ }
exit;
}
- }
- /**
- * create all the defines / constants of the eGW-enviroment (plus the depricated phpgw ones)
- */
- function define_egw_constants()
- {
- define('SEP',filesystem_separator());
- define('EGW_ACL_READ',1);
- define('EGW_ACL_ADD',2);
- define('EGW_ACL_EDIT',4);
- define('EGW_ACL_DELETE',8);
- define('EGW_ACL_PRIVATE',16);
- define('EGW_ACL_GROUP_MANAGERS',32);
- define('EGW_ACL_CUSTOM_1',64);
- define('EGW_ACL_CUSTOM_2',128);
- define('EGW_ACL_CUSTOM_3',256);
- // and the old ones
- define('PHPGW_ACL_READ',1);
- define('PHPGW_ACL_ADD',2);
- define('PHPGW_ACL_EDIT',4);
- define('PHPGW_ACL_DELETE',8);
- define('PHPGW_ACL_PRIVATE',16);
- define('PHPGW_ACL_GROUP_MANAGERS',32);
- define('PHPGW_ACL_CUSTOM_1',64);
- define('PHPGW_ACL_CUSTOM_2',128);
- define('PHPGW_ACL_CUSTOM_3',256);
- // A few hacker resistant constants that will be used throught the program
- define('EGW_TEMPLATE_DIR', $this->common->get_tpl_dir('phpgwapi'));
- define('EGW_IMAGES_DIR', $this->common->get_image_path('phpgwapi'));
- define('EGW_IMAGES_FILEDIR', $this->common->get_image_dir('phpgwapi'));
- define('EGW_APP_ROOT', $this->common->get_app_dir());
- define('EGW_APP_INC', $this->common->get_inc_dir());
- define('EGW_APP_TPL', $this->common->get_tpl_dir());
- define('EGW_IMAGES', $this->common->get_image_path());
- define('EGW_APP_IMAGES_DIR', $this->common->get_image_dir());
- // and the old ones
- define('PHPGW_TEMPLATE_DIR',EGW_TEMPLATE_DIR);
- define('PHPGW_IMAGES_DIR',EGW_IMAGES_DIR);
- define('PHPGW_IMAGES_FILEDIR',EGW_IMAGES_FILEDIR);
- define('PHPGW_APP_ROOT',EGW_APP_ROOT);
- define('PHPGW_APP_INC',EGW_APP_INC);
- define('PHPGW_APP_TPL',EGW_APP_TPL);
- define('PHPGW_IMAGES',EGW_IMAGES);
- define('PHPGW_APP_IMAGES_DIR',EGW_APP_IMAGES_DIR);
- }
-
- /**
- * force the session cache to be re-created, because some of it's data changed
- *
- * Needs to be called if user-preferences, system-config or enabled apps of the current user have been changed and
- * the change should have immediate effect
- */
- function invalidate_session_cache()
- {
- unset($_SESSION['egw_info_cache']);
- unset($_SESSION['egw_included_files']);
- unset($_SESSION['egw_object_cache']);
- }
-
- /**
- * run string through htmlspecialchars and stripslashes
- *
- * @param string $s
- * @return string The string with html special characters replaced with entities
- */
- function strip_html($s)
- {
- return htmlspecialchars(stripslashes($s));
- }
-
- /**
- * Link url generator
- *
- * Used for backwards compatibility and as a shortcut. If no url is passed, it will use PHP_SELF. Wrapper to session->link()
- *
- * @param string $string The url the link is for
- * @param string/array $extravars Extra params to be passed to the url
- * @return string The full url after processing
- */
- function link($url = '', $extravars = '')
- {
- return $this->session->link($url, $extravars);
- }
-
- function redirect_link($url = '',$extravars='')
- {
- $this->redirect($this->session->link($url, $extravars));
- }
-
- /**
- * Handles redirects under iis and apache, it does NOT return (calls exit)
- *
- * This function handles redirects under iis and apache it assumes that $phpgw->link() has already been called
- *
- * @param string The url ro redirect to
- */
- function redirect($url = '')
- {
- /* global $HTTP_ENV_VARS; */
-
- $iis = @strpos($GLOBALS['HTTP_ENV_VARS']['SERVER_SOFTWARE'], 'IIS', 0);
-
- if(!$url)
+ /**
+ * Shortcut to translation class
+ *
+ * This function is a basic wrapper to translation->translate()
+ *
+ * @deprecated only used in the old timetracker
+ * @param string The key for the phrase
+ * @see translation->translate()
+ */
+ function lang($key,$args=null)
{
- $url = $_SERVER['PHP_SELF'];
+ if (!is_array($args))
+ {
+ $args = func_get_args();
+ array_shift($args);
+ }
+ return $this->translation->translate($key,$args);
}
- if($iis)
- {
- echo "\n\n\nRedirecting to $url";
- echo "\n";
- echo "\n";
- echo "Please continue to this page
";
- echo "\n";
- }
- else
- {
- Header("Location: $url");
- print("\n\n");
- }
- exit;
}
-
- /**
- * Shortcut to translation class
- *
- * This function is a basic wrapper to translation->translate()
- *
- * @deprecated only used in the old timetracker
- * @param string The key for the phrase
- * @see translation->translate()
- */
- function lang($key,$args=null)
- {
- if (!is_array($args))
- {
- $args = func_get_args();
- array_shift($args);
- }
- return $this->translation->translate($key,$args);
- }
-}
diff --git a/phpgwapi/inc/class.sessions.inc.php b/phpgwapi/inc/class.sessions.inc.php
index 5f03aa5318..6e5ffb1513 100644
--- a/phpgwapi/inc/class.sessions.inc.php
+++ b/phpgwapi/inc/class.sessions.inc.php
@@ -22,7 +22,7 @@
* along with this library; if not, write to the Free Software Foundation, *
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
\**************************************************************************/
-
+
/* $Id$ */
/**
@@ -206,46 +206,6 @@
}
}
- /**
- * Introspection for XML-RPC/SOAP
- * Diabled - why??
- *
- * @param string $_type tpye of introspection being sought
- * @return array available methods and args
- */
- function DONTlist_methods($_type)
- {
- if (is_array($_type))
- {
- $_type = $_type['type'];
- }
-
- switch($_type)
- {
- case 'xmlrpc':
- $xml_functions = array(
- 'list_methods' => array(
- 'function' => 'list_methods',
- 'signature' => array(array(xmlrpcStruct,xmlrpcString)),
- 'docstring' => lang('Read this list of methods.')
- ),
- 'update_dla' => array(
- 'function' => 'update_dla',
- 'signature' => array(array(xmlrpcBoolean)),
- 'docstring' => lang('Returns an array of todo items')
- )
- );
- return $xml_functions;
- break;
- case 'soap':
- return $this->soap_functions;
- break;
- default:
- return array();
- break;
- }
- }
-
function split_login_domain($both,&$login,&$domain)
{
$parts = explode('@',$both);
@@ -309,6 +269,20 @@
$this->split_login_domain($session['session_lid'],$this->account_lid,$this->account_domain);
+ /* This is to ensure that we authenticate to the correct domain (might not be default) */
+ if($this->account_domain != $GLOBALS['egw_info']['user']['domain'])
+ {
+ $GLOBALS['egw']->ADOdb = null;
+ $GLOBALS['egw_info']['user']['domain'] = $this->account_domain;
+ // reset the db
+ $GLOBALS['egw_info']['server']['db_host'] = $GLOBALS['egw_domain'][$this->account_domain]['db_host'];
+ $GLOBALS['egw_info']['server']['db_port'] = $GLOBALS['egw_domain'][$this->account_domain]['db_port'];
+ $GLOBALS['egw_info']['server']['db_name'] = $GLOBALS['egw_domain'][$this->account_domain]['db_name'];
+ $GLOBALS['egw_info']['server']['db_user'] = $GLOBALS['egw_domain'][$this->account_domain]['db_user'];
+ $GLOBALS['egw_info']['server']['db_pass'] = $GLOBALS['egw_domain'][$this->account_domain]['db_pass'];
+ $GLOBALS['egw_info']['server']['db_type'] = $GLOBALS['egw_domain'][$this->account_domain]['db_type'];
+ $GLOBALS['egw']->setup('',False);
+ }
$GLOBALS['egw_info']['user']['kp3'] = $this->kp3;
$this->update_dla();
@@ -325,8 +299,11 @@
$this->iv = $GLOBALS['egw_info']['server']['mcrypt_iv'];
$GLOBALS['egw']->crypto->init(array($this->key,$this->iv));
- if ($fill_egw_info_and_repositories) $this->read_repositories(@$GLOBALS['egw_info']['server']['cache_phpgw_info']);
-
+ if ($fill_egw_info_and_repositories)
+ {
+ $this->read_repositories(@$GLOBALS['egw_info']['server']['cache_phpgw_info']);
+ }
+
if ($this->user['expires'] != -1 && $this->user['expires'] < time())
{
if(is_object($GLOBALS['egw']->log))
@@ -345,7 +322,7 @@
{
$GLOBALS['egw_info']['user'] = $this->user;
$GLOBALS['egw_info']['hooks'] = $this->hooks;
-
+
$GLOBALS['egw_info']['user']['session_ip'] = $session['session_ip'];
$GLOBALS['egw_info']['user']['passwd'] = base64_decode($this->appsession('password','phpgwapi'));
}
@@ -500,9 +477,24 @@
}
$now = time();
+ /* This is to ensure that we authenticate to the correct domain (might not be default) */
+ if($this->account_domain != $GLOBALS['egw_info']['user']['domain'])
+ {
+ $GLOBALS['egw']->ADOdb = null;
+ $GLOBALS['egw_info']['user']['domain'] = $this->account_domain;
+ // reset the db
+ $GLOBALS['egw_info']['server']['db_host'] = $GLOBALS['egw_domain'][$this->account_domain]['db_host'];
+ $GLOBALS['egw_info']['server']['db_port'] = $GLOBALS['egw_domain'][$this->account_domain]['db_port'];
+ $GLOBALS['egw_info']['server']['db_name'] = $GLOBALS['egw_domain'][$this->account_domain]['db_name'];
+ $GLOBALS['egw_info']['server']['db_user'] = $GLOBALS['egw_domain'][$this->account_domain]['db_user'];
+ $GLOBALS['egw_info']['server']['db_pass'] = $GLOBALS['egw_domain'][$this->account_domain]['db_pass'];
+ $GLOBALS['egw_info']['server']['db_type'] = $GLOBALS['egw_domain'][$this->account_domain]['db_type'];
+ $GLOBALS['egw']->setup('',False);
+ }
+
//echo "session::create(login='$login'): lid='$this->account_lid', domain='$this->account_domain'
\n";
$user_ip = $this->getuser_ip();
-
+
$this->account_id = $GLOBALS['egw']->accounts->name2id($this->account_lid);
if (($blocked = $this->login_blocked($login,$user_ip)) || // too many unsuccessful attempts
@@ -642,7 +634,7 @@
{
$blocked = False;
$block_time = time() - $GLOBALS['egw_info']['server']['block_time'] * 60;
-
+
$ip = $this->db->db_addslashes($ip);
$this->db->query("SELECT count(*) FROM phpgw_access_log WHERE account_id=0 AND ip='$ip' AND li > $block_time",__LINE__,__FILE__);
$this->db->next_record();
@@ -667,7 +659,7 @@
$from = 'eGroupWare@'.$GLOBALS['egw_info']['server']['mail_suffix'];
$subject = lang("eGroupWare: login blocked for user '%1', IP %2",$login,$ip);
$body = lang("Too many unsucessful attempts to login: %1 for the user '%2', %3 for the IP %4",$false_id,$login,$false_ip,$ip);
-
+
if(!is_object($GLOBALS['egw']->send))
{
$GLOBALS['egw']->send = CreateObject('phpgwapi.send');
@@ -704,7 +696,7 @@
$this->session_flags = $session['session_flags'];
list($this->account_lid,$this->account_domain) = explode('@', $session['session_lid']);
-
+
if ($this->account_domain == '')
{
$this->account_domain = $GLOBALS['egw_info']['server']['default_domain'];
@@ -1057,7 +1049,7 @@
{
$this->history_id = md5($this->login . time());
$history = $this->appsession($location = 'history', $appname = 'phpgwapi');
-
+
if(count($history) >= $GLOBALS['egw_info']['server']['max_history'])
{
array_shift($history);
@@ -1066,7 +1058,7 @@
}
return $this->history_id;
}
-
+
/**
* Detects if the page has already been called before - good for forms
*
@@ -1318,7 +1310,7 @@
*/
function list_sessions($start,$order,$sort,$all_no_sort = False)
{}
-
+
/**
* Get the number of normal / non-anonymous sessions
*