Skip to content

Commit

Permalink
Implemented basic support for Autodiscover command
Browse files Browse the repository at this point in the history
Change-Id: I57c1bffa249608578129e7680a0cfb816e0b2343
  • Loading branch information
Lars Kneschke committed Oct 17, 2013
1 parent c21f851 commit cc70594
Show file tree
Hide file tree
Showing 5 changed files with 386 additions and 2 deletions.
188 changes: 188 additions & 0 deletions autodiscover.php
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
*/

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();
9 changes: 9 additions & 0 deletions build.xml
Original file line number Diff line number Diff line change
Expand Up @@ -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 -->
<!-- ============================================ -->
Expand Down
126 changes: 126 additions & 0 deletions lib/Syncroton/Command/AutoDiscover.php
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
*/

/**
* 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'
);
}
}
4 changes: 2 additions & 2 deletions lib/Syncroton/Command/Wbxml.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand Down
Loading

0 comments on commit cc70594

Please sign in to comment.