mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-25 09:23:28 +01:00
Fix multi-domain support for SyncML
This commit is contained in:
parent
b596935291
commit
712a87152f
@ -19,7 +19,7 @@
|
|||||||
* @copyright (c) The Horde Project (http://www.horde.org/)
|
* @copyright (c) The Horde Project (http://www.horde.org/)
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
require_once(EGW_API_INC.'/class.egw_db.inc.php');
|
|
||||||
include_once 'Horde/SyncML/Command.php';
|
include_once 'Horde/SyncML/Command.php';
|
||||||
include_once 'Horde/SyncML/Command/Status.php';
|
include_once 'Horde/SyncML/Command/Status.php';
|
||||||
include_once 'Horde/SyncML/Command/Alert.php';
|
include_once 'Horde/SyncML/Command/Alert.php';
|
||||||
@ -646,11 +646,12 @@ class Horde_SyncML_SyncMLBody extends Horde_SyncML_ContentHandler {
|
|||||||
switch ($element) {
|
switch ($element) {
|
||||||
case 'Final':
|
case 'Final':
|
||||||
$this->_actionCommands = false;
|
$this->_actionCommands = false;
|
||||||
$deviceInfo = $state->getClientDeviceInfo();
|
|
||||||
|
|
||||||
if ($state->getSyncStatus() == CLIENT_SYNC_STARTED) {
|
if ($state->getSyncStatus() == CLIENT_SYNC_STARTED) {
|
||||||
if (strtolower($deviceInfo['manufacturer']) == 'funambol'
|
if ($state->isAuthorized() &&
|
||||||
&& isset($deviceInfo['softwareVersion'])) {
|
($deviceInfo = $state->getClientDeviceInfo()) &&
|
||||||
|
strtolower($deviceInfo['manufacturer']) == 'funambol'
|
||||||
|
&& isset($deviceInfo['softwareVersion'])) {
|
||||||
$swversion = $deviceInfo['softwareVersion'];
|
$swversion = $deviceInfo['softwareVersion'];
|
||||||
if ($swversion < 1.0) {
|
if ($swversion < 1.0) {
|
||||||
// e.g. Mozilla plugin uses this range
|
// e.g. Mozilla plugin uses this range
|
||||||
@ -668,9 +669,8 @@ class Horde_SyncML_SyncMLBody extends Horde_SyncML_ContentHandler {
|
|||||||
} else {
|
} else {
|
||||||
$state->setSyncStatus(CLIENT_SYNC_ACKNOWLEDGED);
|
$state->setSyncStatus(CLIENT_SYNC_ACKNOWLEDGED);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if ($state->getSyncStatus() == SERVER_SYNC_FINNISHED) {
|
} elseif ($state->getSyncStatus() == SERVER_SYNC_FINNISHED) {
|
||||||
$state->setSyncStatus(SERVER_SYNC_ACKNOWLEDGED);
|
$state->setSyncStatus(SERVER_SYNC_ACKNOWLEDGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +203,11 @@ class Horde_SyncML_State {
|
|||||||
|
|
||||||
var $_password;
|
var $_password;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* integer 0 authorization pending
|
||||||
|
* -1 authorization failed
|
||||||
|
* 1 session is authorized
|
||||||
|
*/
|
||||||
var $_isAuthorized;
|
var $_isAuthorized;
|
||||||
|
|
||||||
var $_AuthConfirmed;
|
var $_AuthConfirmed;
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
* @author Joerg Lehrke <jlehrke@noc.de>
|
* @author Joerg Lehrke <jlehrke@noc.de>
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
require_once(EGW_API_INC.'/class.egw_db.inc.php');
|
|
||||||
include_once dirname(__FILE__).'/State.php';
|
include_once dirname(__FILE__).'/State.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -301,68 +301,95 @@ class EGW_SyncML_State extends Horde_SyncML_State
|
|||||||
}
|
}
|
||||||
|
|
||||||
function isAuthorized() {
|
function isAuthorized() {
|
||||||
if (!$this->_isAuthorized) {
|
|
||||||
if(!isset($this->_locName) && !isset($this->_password)) {
|
|
||||||
Horde::logMessage('SyncML: Authentication not yet possible currently. Username and password not available' , __FILE__, __LINE__, PEAR_LOG_DEBUG);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($this->_password)) {
|
if(!isset($this->_locName))
|
||||||
Horde::logMessage('SyncML: Authentication not yet possible currently. Password not available' , __FILE__, __LINE__, PEAR_LOG_DEBUG);
|
{
|
||||||
return false;
|
Horde::logMessage('SyncML: Authentication not yet possible. Username not available',
|
||||||
}
|
__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (strpos($this->_locName,'@') === False) {
|
// store sessionID in a variable, because create() and verify() reset this value
|
||||||
$this->_account_domain = $GLOBALS['egw_info']['server']['default_domain'];
|
$sessionID = session_id();
|
||||||
$this->_locName .= '@'. $this->_account_domain;
|
|
||||||
} else {
|
|
||||||
$parts = explode('@',$this->_locName);
|
|
||||||
$this->_account_domain = array_pop($parts);
|
|
||||||
}
|
|
||||||
|
|
||||||
$GLOBALS['egw_info']['user']['domain'] = $this->_account_domain;
|
if (strpos($this->_locName,'@') === False)
|
||||||
if (is_array($GLOBALS['egw_domain'][$this->_account_domain]))
|
{
|
||||||
|
$this->_account_domain = $GLOBALS['egw_info']['server']['default_domain'];
|
||||||
|
$this->_locName .= '@'. $this->_account_domain;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$parts = explode('@',$this->_locName);
|
||||||
|
$this->_account_domain = array_pop($parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_object($GLOBALS['egw']))
|
||||||
|
{
|
||||||
|
// Let the EGw core create the infrastructure classes
|
||||||
|
$_POST['login'] = $this->_locName;
|
||||||
|
$_REQUEST['domain'] = $this->_account_domain;
|
||||||
|
$GLOBALS['egw_info']['server']['default_domain'] = $this->_account_domain;
|
||||||
|
$GLOBALS['egw_info']['flags']['currentapp'] = 'login';
|
||||||
|
$GLOBALS['egw_info']['flags']['noapi'] = false;
|
||||||
|
require_once(EGW_API_INC . '/functions.inc.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
$GLOBALS['egw_info']['flags']['currentapp'] = 'syncml';
|
||||||
|
|
||||||
|
if (!$this->_isAuthorized)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!isset($this->_password))
|
||||||
{
|
{
|
||||||
|
Horde::logMessage('SyncML: Authentication not yet possible. Credetials missing',
|
||||||
|
__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($GLOBALS['egw']->session->create($this->_locName,$this->_password,'text'))
|
||||||
|
{
|
||||||
|
if ($GLOBALS['egw_info']['user']['apps']['syncml'])
|
||||||
|
{
|
||||||
|
$this->_isAuthorized = 1;
|
||||||
|
// restore the original sessionID
|
||||||
|
session_regenerate_id();
|
||||||
|
session_id($sessionID);
|
||||||
|
$GLOBALS['sessionid'] = $sessionID;
|
||||||
|
@session_start();
|
||||||
|
|
||||||
|
Horde::logMessage('SyncML_EGW[' . $GLOBALS['sessionid']
|
||||||
|
.']: Authentication of ' . $this->_locName . ' succeded',
|
||||||
|
__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
||||||
|
|
||||||
|
$config =& CreateObject('phpgwapi.config','syncml');
|
||||||
|
$config->read_repository();
|
||||||
|
$GLOBALS['config_syncml'] =& $config->config_data;
|
||||||
|
unset($config);
|
||||||
|
|
||||||
$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'];
|
|
||||||
// It works -- don't ask me why.
|
|
||||||
$this->db = new egw_db($GLOBALS['egw_info']['server']);
|
|
||||||
if (!$this->db->connect()) {
|
|
||||||
Horde::logMessage('SyncML_EGW: Can not connect to database for user ' . $this->_locName,
|
|
||||||
__FILE__, __LINE__, PEAR_LOG_ERROR);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
#Horde::logMessage('SyncML: authenticate with username: ' . $this->_locName . ' and password: ' . $this->_password, __FILE__, __LINE__, PEAR_LOG_DEBUG);
|
{
|
||||||
|
$this->_isAuthorized = -1; // Authorization failed!
|
||||||
if (($GLOBALS['sessionid'] = $GLOBALS['egw']->session->create($this->_locName,$this->_password,'text'))) {
|
Horde::logMessage('SyncML is not enabled for user '
|
||||||
if ($GLOBALS['egw_info']['user']['apps']['syncml']) {
|
. $this->_locName, __FILE__, __LINE__, PEAR_LOG_ERROR);
|
||||||
$this->_isAuthorized = 1;
|
|
||||||
Horde::logMessage('SyncML_EGW: Authentication of ' . $this->_locName . '/' . $GLOBALS['sessionid'] . ' succeded',
|
|
||||||
__FILE__, __LINE__, PEAR_LOG_DEBUG);
|
|
||||||
} else {
|
|
||||||
$this->_isAuthorized = -1; // Authentication failed!
|
|
||||||
Horde::logMessage('SyncML is not enabled for user ' . $this->_locName,
|
|
||||||
__FILE__, __LINE__, PEAR_LOG_ERROR);
|
|
||||||
}
|
|
||||||
return ($this->_isAuthorized > 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->_isAuthorized = -1;
|
else
|
||||||
Horde::logMessage('SyncML: Authentication of ' . $this->_locName . ' failed' ,
|
{
|
||||||
__FILE__, __LINE__, PEAR_LOG_INFO);
|
$this->_isAuthorized = -1;
|
||||||
} else {
|
Horde::logMessage('SyncML: Authentication of ' . $this->_locName
|
||||||
// store sessionID in a variable, because verify() may reset this value
|
. ' failed', __FILE__, __LINE__, PEAR_LOG_INFO);
|
||||||
$sessionID = session_id();
|
|
||||||
$GLOBALS['egw_info']['user']['domain'] = $this->_account_domain;
|
}
|
||||||
if (!$GLOBALS['egw']->session->verify($sessionID, 'staticsyncmlkp3')) {
|
|
||||||
Horde::logMessage('SyncML_EGW: egw session(' .$sessionID. ') not verified' ,
|
}
|
||||||
__FILE__, __LINE__, PEAR_LOG_WARNING);
|
elseif ($this->_isAuthorized > 0)
|
||||||
|
{
|
||||||
|
if (!$GLOBALS['egw']->session->verify($sessionID, 'staticsyncmlkp3'))
|
||||||
|
{
|
||||||
|
Horde::logMessage('SyncML_EGW: egw session(' . $sessionID
|
||||||
|
. ') could not be not verified' ,
|
||||||
|
__FILE__, __LINE__, PEAR_LOG_ERROR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ($this->_isAuthorized > 0);
|
return ($this->_isAuthorized > 0);
|
||||||
|
28
rpc.php
28
rpc.php
@ -10,22 +10,27 @@
|
|||||||
|
|
||||||
error_reporting(E_ALL & ~E_NOTICE);
|
error_reporting(E_ALL & ~E_NOTICE);
|
||||||
@define('AUTH_HANDLER', true);
|
@define('AUTH_HANDLER', true);
|
||||||
@define('HORDE_BASE', dirname(__FILE__).'/phpgwapi/inc/horde/');
|
@define('EGW_API_INC', dirname(__FILE__) . '/phpgwapi/inc/');
|
||||||
|
@define('HORDE_BASE', EGW_API_INC . '/horde/');
|
||||||
require_once HORDE_BASE . '/lib/core.php';
|
require_once HORDE_BASE . '/lib/core.php';
|
||||||
require_once 'Horde/RPC.php';
|
require_once 'Horde/RPC.php';
|
||||||
|
//require_once EGW_API_INC . '/common_functions.inc.php';
|
||||||
|
|
||||||
$GLOBALS['egw_info'] = array(
|
$GLOBALS['egw_info'] = array(
|
||||||
'flags' => array(
|
'flags' => array(
|
||||||
'currentapp' => 'login',
|
'currentapp' => 'syncml',
|
||||||
'noheader' => True,
|
'noheader' => true,
|
||||||
'nonavbar' => True,
|
'nonavbar' => true,
|
||||||
'disable_Template_class' => True
|
'noapi' => true,
|
||||||
)
|
'disable_Template_class' => true,
|
||||||
|
),
|
||||||
|
'server' => array(
|
||||||
|
'show_domain_selectbox' => true,
|
||||||
|
),
|
||||||
);
|
);
|
||||||
include('./header.inc.php');
|
|
||||||
|
|
||||||
// allow to use an authentication specific for SyncML
|
|
||||||
$GLOBALS['egw_info']['flags']['currentapp'] = 'syncml';
|
include('./header.inc.php');
|
||||||
|
|
||||||
$errors = array();
|
$errors = array();
|
||||||
|
|
||||||
@ -45,11 +50,6 @@ if(version_compare(PHP_VERSION, '5.0.0') < 0) {
|
|||||||
$errors[] = 'eGroupWare\'s SyncML server requires PHP5. Please update to PHP 5.0.x if you want to use SyncML.';
|
$errors[] = 'eGroupWare\'s SyncML server requires PHP5. Please update to PHP 5.0.x if you want to use SyncML.';
|
||||||
}
|
}
|
||||||
|
|
||||||
$config =& CreateObject('phpgwapi.config','syncml');
|
|
||||||
$config->read_repository();
|
|
||||||
$GLOBALS['config_syncml'] =& $config->config_data;
|
|
||||||
unset($config);
|
|
||||||
|
|
||||||
/* Look at the Content-type of the request, if it is available, to try
|
/* Look at the Content-type of the request, if it is available, to try
|
||||||
* and determine what kind of request this is. */
|
* and determine what kind of request this is. */
|
||||||
$input = null;
|
$input = null;
|
||||||
|
Loading…
Reference in New Issue
Block a user