Skip to content
Permalink
Browse files

Implemented basic support for Autodiscover command

Change-Id: I57c1bffa249608578129e7680a0cfb816e0b2343
  • Loading branch information...
Lars Kneschke
Lars Kneschke committed Oct 17, 2013
1 parent c21f851 commit cc70594e3720832a90b4d838bc59da76a1928cc0
@@ -0,0 +1,188 @@
<?php
/**
* Syncroton
*
* @package Syncroton
* @license http://www.tine20.org/licenses/lgpl.html LGPL Version 3
* @copyright Copyright (c) 2013-2013 Metaways Infosystems GmbH (http://www.metaways.de)
* @author Lars Kneschke <l.kneschke@metaways.de>
*/
define('SYNCURL', 'https://sync.example.com/Microsoft-Server-ActiveSync');
/**
* exception for data not found
*
* @package Syncroton
* @subpackage Exception
*/
class Syncroton_Exception extends Exception
{
}
/**
* interface for all Syncroton command classes
*
* @package Syncroton
* @subpackage Command
*/
interface Syncroton_Command_ICommand
{
/**
* constructor of this class
*
* @param resource $_requestBody
* @param Syncroton_Model_IDevice $_device
* @param string $_policyKey
*/
public function __construct($_requestBody, Syncroton_Model_IDevice $_device, $_policyKey);
/**
* process the incoming data
*/
public function handle();
/**
* create the response
*/
public function getResponse();
/**
* return headers of command
*
* @return array list of headers
*/
public function getHeaders();
}
/**
* class to handle AutoDiscover command
*
* @package Syncroton
* @subpackage Command
*/
class Syncroton_Command_AutoDiscover implements Syncroton_Command_ICommand
{
/**
* the domDocucment containing the xml request from the client
*
* @var DOMDocument
*/
protected $requestBody;
protected $emailAddress;
public $mobileSyncUrl;
public $certEnrollUrl;
/**
* constructor of this class
*
* @param DOMDocument $_requestBody
* @param Syncroton_Model_IDevice $_device
* @param string $_policyKey
*/
public function __construct($requestBody, Syncroton_Model_IDevice $device = null, $policyKey = null)
{
$this->requestBody = $requestBody;
}
/**
* process the incoming data
*/
public function handle()
{
$xpath = new DomXPath($this->requestBody);
$xpath->registerNamespace('2006', 'http://schemas.microsoft.com/exchange/autodiscover/mobilesync/requestschema/2006');
$nodes = $xpath->query('//2006:Autodiscover/2006:Request/2006:EMailAddress');
if ($nodes->length === 0) {
throw new Syncroton_Exception();
}
$this->emailAddress = $nodes->item(0)->nodeValue;
}
/**
* create the response
*
* @return DOMDocument
*/
public function getResponse()
{
// Creates an instance of the DOMImplementation class
$imp = new DOMImplementation();
// Creates a DOMDocument instance
$document = $imp->createDocument("http://schemas.microsoft.com/exchange/autodiscover/mobilesync/requestschema/2006", 'Autodiscover');
$document->xmlVersion = '1.0';
$document->encoding = 'UTF-8';
$document->formatOutput = false;
$response = $document->documentElement->appendChild($document->createElement('Response'));
$user = $response->appendChild($document->createElement('User'));
$user->appendChild($document->createElement('EMailAddress', $this->emailAddress));
$settings = $document->createElement('Settings');
if (!empty($this->mobileSyncUrl)) {
$server = $document->createElement('Server');
$server->appendChild($document->createElement('Type', 'MobileSync'));
$server->appendChild($document->createElement('Url', $this->mobileSyncUrl));
$server->appendChild($document->createElement('Name', $this->mobileSyncUrl));
$settings->appendChild($server);
}
if (!empty($this->certEnrollUrl)) {
$server = $document->createElement('Server');
$server->appendChild($document->createElement('Type', 'CertEnroll'));
$server->appendChild($document->createElement('Url', $this->certEnrollUrl));
$server->appendChild($document->createElement('Name'));
$server->appendChild($document->createElement('ServerData', 'CertEnrollTemplate'));
$settings->appendChild($server);
}
if ($settings->hasChildNodes()) {
$action = $response->appendChild($document->createElement('Action'));
$action->appendChild($settings);
}
return $document;
}
/**
* return headers of command
*
* @return array list of headers
*/
public function getHeaders()
{
return array(
'Content-Type' => 'text/xml;charset=utf-8'
);
}
}
$document = new DOMDocument();
$document->loadXML(file_get_contents('php://input'));
$autoDiscover = new Syncroton_Command_AutoDiscover($document);
$autoDiscover->mobileSyncUrl = SYNCURL;
$autoDiscover->handle();
$response = $autoDiscover->getResponse();
foreach ($autoDiscover->getHeaders() as $name => $value) {
header($name . ': ' . $value);
}
echo $response->saveXML();
@@ -18,6 +18,15 @@
<exclude name="ServerTests.php" />
</fileset>

<!-- ============================================ -->
<!-- Target: autodiscover -->
<!-- ============================================ -->
<target name="autodiscover">
<echo msg="(Re)Creating autodiscover.php..." />

<!-- @todo implement -->
</target>

<!-- ============================================ -->
<!-- Target: clean -->
<!-- ============================================ -->
@@ -0,0 +1,126 @@
<?php
/**
* Syncroton
*
* @package Syncroton
* @subpackage Command
* @license http://www.tine20.org/licenses/lgpl.html LGPL Version 3
* @copyright Copyright (c) 2013-2013 Metaways Infosystems GmbH (http://www.metaways.de)
* @author Lars Kneschke <l.kneschke@metaways.de>
*/
/**
* class to handle AutoDiscover command
*
* @package Syncroton
* @subpackage Command
*/
class Syncroton_Command_AutoDiscover implements Syncroton_Command_ICommand
{
/**
* the domDocucment containing the xml request from the client
*
* @var DOMDocument
*/
protected $requestBody;
protected $emailAddress;
public $mobileSyncUrl;
public $certEnrollUrl;
/**
* constructor of this class
*
* @param DOMDocument $_requestBody
* @param Syncroton_Model_IDevice $_device
* @param string $_policyKey
*/
public function __construct($requestBody, Syncroton_Model_IDevice $device = null, $policyKey = null)
{
$this->requestBody = $requestBody;
}
/**
* process the incoming data
*/
public function handle()
{
$xpath = new DomXPath($this->requestBody);
$xpath->registerNamespace('2006', 'http://schemas.microsoft.com/exchange/autodiscover/mobilesync/requestschema/2006');
$nodes = $xpath->query('//2006:Autodiscover/2006:Request/2006:EMailAddress');
if ($nodes->length === 0) {
throw new Syncroton_Exception();
}
$this->emailAddress = $nodes->item(0)->nodeValue;
}
/**
* create the response
*
* @return DOMDocument
*/
public function getResponse()
{
// Creates an instance of the DOMImplementation class
$imp = new DOMImplementation();
// Creates a DOMDocument instance
$document = $imp->createDocument("http://schemas.microsoft.com/exchange/autodiscover/mobilesync/requestschema/2006", 'Autodiscover');
$document->xmlVersion = '1.0';
$document->encoding = 'UTF-8';
$document->formatOutput = false;
$response = $document->documentElement->appendChild($document->createElement('Response'));
$user = $response->appendChild($document->createElement('User'));
$user->appendChild($document->createElement('EMailAddress', $this->emailAddress));
$settings = $document->createElement('Settings');
if (!empty($this->mobileSyncUrl)) {
$server = $document->createElement('Server');
$server->appendChild($document->createElement('Type', 'MobileSync'));
$server->appendChild($document->createElement('Url', $this->mobileSyncUrl));
$server->appendChild($document->createElement('Name', $this->mobileSyncUrl));
$settings->appendChild($server);
}
if (!empty($this->certEnrollUrl)) {
$server = $document->createElement('Server');
$server->appendChild($document->createElement('Type', 'CertEnroll'));
$server->appendChild($document->createElement('Url', $this->certEnrollUrl));
$server->appendChild($document->createElement('Name'));
$server->appendChild($document->createElement('ServerData', 'CertEnrollTemplate'));
$settings->appendChild($server);
}
if ($settings->hasChildNodes()) {
$action = $response->appendChild($document->createElement('Action'));
$action->appendChild($settings);
}
return $document;
}
/**
* return headers of command
*
* @return array list of headers
*/
public function getHeaders()
{
return array(
'Content-Type' => 'text/xml;charset=utf-8'
);
}
}
@@ -61,14 +61,14 @@ abstract class Syncroton_Command_Wbxml implements Syncroton_Command_ICommand
* @var DOMDocument
*/
protected $_outputDom;
/**
* the domDocucment containing the xml request from the client
*
* @var DOMDocument
*/
protected $_requestBody;
/**
* the default namespace
*
Oops, something went wrong.

0 comments on commit cc70594

Please sign in to comment.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.