Skip to content

Commit

Permalink
Fix sending proper error codes when FOLDERCREATE command fails.
Browse files Browse the repository at this point in the history
  • Loading branch information
mrubinsk committed Nov 4, 2013
1 parent 4aad928 commit 94d1bf6
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
Expand Up @@ -323,8 +323,12 @@ public function importFolderChange($uid, $displayname, $parent = Horde_ActiveSyn

try {
$new_uid = $this->_as->driver->changeFolder($folderid, $displayname, $parent_sid, $uid);
} catch (Horde_Exception_PermissionDenied $e) {
$this->_logger->err($e->getMessage());
throw new Horde_ActiveSync_Exception($e->getMessage(), Horde_ActiveSync_Exception::UNSUPPORTED);
} catch (Horde_ActiveSync_Exception $e) {
return false;
$this->_logger->err($e->getMessage());
throw $e;
}

$change = array();
Expand Down
7 changes: 7 additions & 0 deletions framework/ActiveSync/lib/Horde/ActiveSync/Exception.php
Expand Up @@ -29,4 +29,11 @@
*/
class Horde_ActiveSync_Exception extends Horde_Exception_Wrapped
{
/** Error codes **/

// Defauld, unspecified.
const UNSPECIFIED = 0;

// Unsupported action was attempted.
const UNSUPPORTED = 3;
}
41 changes: 26 additions & 15 deletions framework/ActiveSync/lib/Horde/ActiveSync/Request/FolderCreate.php
Expand Up @@ -134,8 +134,15 @@ protected function _handle()
$importer = $this->_activeSync->getImporter();
$importer->init($this->_state);
if (!$delete) {
if (!$serverid = $importer->importFolderChange($serverid, $displayname, $parentid)) {
$status = self::STATUS_ERROR;
try {
$serverid = $importer->importFolderChange($serverid, $displayname, $parentid, $type);
} catch (Horde_ActiveSync_Exception $e) {
$this->_logger->err($e->getMessage());
if ($e->getCode() == Horde_ActiveSync_Exception::UNSUPPORTED) {
$status = Horde_ActiveSync_Status::UNEXPECTED_ITEM_CLASS;
} else {
$status = self::STATUS_ERROR;
}
}
} else {
try {
Expand All @@ -151,27 +158,31 @@ protected function _handle()
// @TODO: Horde 6 - pass a H_AS_Message_Folder object to the importFolderChange()
// method so we can delegate the _serverid creation to the backend like
// it should be.
$folder = $this->_activeSync->messageFactory('Folder');
$folder->serverid = $serverid;
$folder->displayname = $displayname;
$folder->type = $type;
$folder->_serverid = $displayname;
$collections->updateFolderInHierarchy($folder);
$collections->save();
if ($status == self::STATUS_SUCCESS) {
$folder = $this->_activeSync->messageFactory('Folder');
$folder->serverid = $serverid;
$folder->displayname = $displayname;
$folder->type = $type;
$folder->_serverid = $displayname;
$collections->updateFolderInHierarchy($folder);
$collections->save();
}

$this->_encoder->startTag(self::FOLDERCREATE);

$this->_encoder->startTag(Horde_ActiveSync::FOLDERHIERARCHY_STATUS);
$this->_encoder->content($status);
$this->_encoder->endTag();

$this->_encoder->startTag(Horde_ActiveSync::FOLDERHIERARCHY_SYNCKEY);
$this->_encoder->content($newsynckey);
$this->_encoder->endTag();
if ($status == self::STATUS_SUCCESS) {
$this->_encoder->startTag(Horde_ActiveSync::FOLDERHIERARCHY_SYNCKEY);
$this->_encoder->content($newsynckey);
$this->_encoder->endTag();

$this->_encoder->startTag(Horde_ActiveSync::FOLDERHIERARCHY_SERVERENTRYID);
$this->_encoder->content($serverid);
$this->_encoder->endTag();
$this->_encoder->startTag(Horde_ActiveSync::FOLDERHIERARCHY_SERVERENTRYID);
$this->_encoder->content($serverid);
$this->_encoder->endTag();
}

$this->_encoder->endTag();
} elseif ($update) {
Expand Down

0 comments on commit 94d1bf6

Please sign in to comment.