Commit 208e6bbb authored by Sebastian Kummer's avatar Sebastian Kummer

Merge pull request #132 in ZP/z-push from release/2.2 to master

* commit '9eb68bf8':
  ZP-809 Bumped version to 2.2.8.
  ZP-809 bumped version to 2.2.8beta1.
  ZP-809 Bumped to 2.2.8alpha2.
  ZP-809 Bumped version file, removed white space.
  Merge pull request #119 in ZP/z-push from bugfix/ZP-784-sync-with-remove-fails-if-source-message to develop
  Merge pull request #114 in ZP/z-push from bugfix/ZP-799-disallow-new-new-time-proposal-is to develop
  Merge pull request #113 in ZP/z-push from bugfix/ZP-798-loopdetection-gets-stuck to develop
  Merge pull request #103 in ZP/z-push from bugfix/ZP-786-instanceof-is-lowercase to develop
  Merge pull request #100 in ZP/z-push from feature/ZP-782-log-file-and-line-in-zpushexception to develop
  Merge pull request #101 in ZP/z-push from bugfix/ZP-783-statusexception-from-phpwrapper-not to develop
  Merge pull request #99 in ZP/z-push from bugfix/ZP-780-incompatible-zcp-7.0.x-ics-importfolderchange to develop
  Merge pull request #94 in ZP/z-push from bugfix/ZP-773-autodiscover-needs-timezone-set-for to develop
  Merge pull request #98 in ZP/z-push from bugfix/ZP-776-remove-obsolete-check-and-link to develop
  Merge pull request #97 in ZP/z-push from bugfix/ZP-775-z-push-admin-a-resync-t-does-not-work to develop
  ZP-785 Fix mixed EOL.
parents 62aac989 9eb68bf8
...@@ -265,5 +265,15 @@ class ZPushAutodiscover { ...@@ -265,5 +265,15 @@ class ZPushAutodiscover {
} }
} }
// set time zone
// code contributed by Robert Scheck (rsc)
if(defined('TIMEZONE') ? constant('TIMEZONE') : false) {
if (! @date_default_timezone_set(TIMEZONE))
throw new FatalMisconfigurationException(sprintf("The configured TIMEZONE '%s' is not valid. Please check supported timezones at http://www.php.net/manual/en/timezones.php", constant('TIMEZONE')));
}
else if(!ini_get('date.timezone')) {
date_default_timezone_set('Europe/Amsterdam');
}
ZPushAutodiscover::DoZPushAutodiscover(); ZPushAutodiscover::DoZPushAutodiscover();
?> ?>
\ No newline at end of file
...@@ -44,6 +44,9 @@ ...@@ -44,6 +44,9 @@
/********************************************************************************** /**********************************************************************************
* Default settings * Default settings
*/ */
// Defines the default time zone, change e.g. to "Europe/London" if necessary
define('TIMEZONE', '');
// Defines the base path on the server // Defines the base path on the server
define('BASE_PATH', dirname($_SERVER['SCRIPT_FILENAME']). '/'); define('BASE_PATH', dirname($_SERVER['SCRIPT_FILENAME']). '/');
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
* *
* Created : 14.02.2011 * Created : 14.02.2011
* *
* Copyright 2007 - 2013 Zarafa Deutschland GmbH * Copyright 2007 - 2015 Zarafa Deutschland GmbH
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3, * it under the terms of the GNU Affero General Public License, version 3,
...@@ -311,17 +311,23 @@ class ImportChangesICS implements IImportChanges { ...@@ -311,17 +311,23 @@ class ImportChangesICS implements IImportChanges {
$potConflicts = $exporter->GetChangeCount(); $potConflicts = $exporter->GetChangeCount();
$started = time(); $started = time();
$exported = 0; $exported = 0;
while(is_array($exporter->Synchronize())) { try {
$exported++; while(is_array($exporter->Synchronize())) {
$exported++;
// stop if this takes more than 15 seconds and there are more than 5 changes still to be exported
// within 20 seconds this should be finished or it will not be performed // stop if this takes more than 15 seconds and there are more than 5 changes still to be exported
if ((time() - $started) > 15 && ($potConflicts - $exported) > 5 ) { // within 20 seconds this should be finished or it will not be performed
ZLog::Write(LOGLEVEL_WARN, sprintf("ImportChangesICS->lazyLoadConflicts(): conflict detection cancelled as operation is too slow. In %d seconds only %d from %d changes were processed.",(time() - $started), $exported, $potConflicts)); if ((time() - $started) > 15 && ($potConflicts - $exported) > 5 ) {
$this->conflictsLoaded = true; ZLog::Write(LOGLEVEL_WARN, sprintf("ImportChangesICS->lazyLoadConflicts(): conflict detection cancelled as operation is too slow. In %d seconds only %d from %d changes were processed.",(time() - $started), $exported, $potConflicts));
return; $this->conflictsLoaded = true;
return;
}
} }
} }
// something really bad happened while exporting changes
catch (StatusException $stex) {
ZLog::Write(LOGLEVEL_WARN, sprintf("ImportChangesICS->lazyLoadConflicts(): got StatusException code %d while exporting changes. Ignore and mark conflicts as loaded.",$stex->getCode()));
}
$this->conflictsLoaded = true; $this->conflictsLoaded = true;
} }
} }
...@@ -694,4 +700,4 @@ class ImportChangesICS implements IImportChanges { ...@@ -694,4 +700,4 @@ class ImportChangesICS implements IImportChanges {
return $ret; return $ret;
} }
} }
?> ?>
\ No newline at end of file
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Created : 14.02.2011 * Created : 14.02.2011
* *
* Copyright 2007 - 2013 Zarafa Deutschland GmbH * Copyright 2007 - 2015 Zarafa Deutschland GmbH
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3, * it under the terms of the GNU Affero General Public License, version 3,
...@@ -847,6 +847,14 @@ class MAPIProvider { ...@@ -847,6 +847,14 @@ class MAPIProvider {
$storeprops = $this->getStoreProps(); $storeprops = $this->getStoreProps();
// For ZCP 7.0.x we need to retrieve more properties explicitly, see ZP-780
if (isset($folderprops[PR_SOURCE_KEY]) && !isset($folderprops[PR_ENTRYID]) && !isset($folderprops[PR_CONTAINER_CLASS])) {
$entryid = mapi_msgstore_entryidfromsourcekey($this->store, $folderprops[PR_SOURCE_KEY]);
$mapifolder = mapi_msgstore_openentry($this->store, $entryid);
$folderprops = mapi_getprops($mapifolder, array(PR_DISPLAY_NAME, PR_PARENT_ENTRYID, PR_ENTRYID, PR_SOURCE_KEY, PR_PARENT_SOURCE_KEY, PR_CONTAINER_CLASS, PR_ATTR_HIDDEN));
ZLog::Write(LOGLEVEL_DEBUG, "MAPIProvider->GetFolder(): received insuffient of data from ICS. Fetching required data.");
}
if(!isset($folderprops[PR_DISPLAY_NAME]) || if(!isset($folderprops[PR_DISPLAY_NAME]) ||
!isset($folderprops[PR_PARENT_ENTRYID]) || !isset($folderprops[PR_PARENT_ENTRYID]) ||
!isset($folderprops[PR_SOURCE_KEY]) || !isset($folderprops[PR_SOURCE_KEY]) ||
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* Created : 20.10.2011 * Created : 20.10.2011
* *
* Copyright 2007 - 2013 Zarafa Deutschland GmbH * Copyright 2007 - 2015 Zarafa Deutschland GmbH
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3, * it under the terms of the GNU Affero General Public License, version 3,
...@@ -572,12 +572,12 @@ class LoopDetection extends InterProcessData { ...@@ -572,12 +572,12 @@ class LoopDetection extends InterProcessData {
$obsolete = true; $obsolete = true;
} }
else { else {
ZLog::Write(LOGLEVEL_DEBUG, sprintf("LoopDetection->IsSyncStateObsolete(): check folderid: '%s' uuid '%s' counter: %d - last counter: %d with %d queued", ZLog::Write(LOGLEVEL_DEBUG, sprintf("LoopDetection->IsSyncStateObsolete(): check folderid: '%s' uuid '%s' counter: %d - last counter: %d with %d queued",
$folderid, $uuid, $counter, $current["count"], $current["queued"])); $folderid, $uuid, $counter, $current["count"], $current["queued"]));
if ($current["uuid"] == $uuid && ( if ($current["uuid"] == $uuid && (
$current["count"] > $counter || $current["count"] > $counter ||
($current["count"] == $counter && $current["queued"] > 0) || ($current["count"] == $counter && $current["queued"] > 0) ||
(isset($current["usage"]) && $current["usage"] >= $counter) (isset($current["usage"]) && $current["usage"] >= $counter)
)) { )) {
$usage = isset($current["usage"]) ? sprintf(" - counter %d already expired",$current["usage"]) : ""; $usage = isset($current["usage"]) ? sprintf(" - counter %d already expired",$current["usage"]) : "";
...@@ -736,7 +736,7 @@ class LoopDetection extends InterProcessData { ...@@ -736,7 +736,7 @@ class LoopDetection extends InterProcessData {
ZLog::Write(LOGLEVEL_DEBUG, "LoopDetection->Detect(): case 3.1 detected - loop detected, init loop mode"); ZLog::Write(LOGLEVEL_DEBUG, "LoopDetection->Detect(): case 3.1 detected - loop detected, init loop mode");
$current['loopcount'] = 1; $current['loopcount'] = 1;
// the MaxCount is the max number of messages exported before // the MaxCount is the max number of messages exported before
$current['maxCount'] = $counter + (($maxItems < $queuedMessages)? $maxItems: $queuedMessages); $current['maxCount'] = $counter + (($maxItems < $queuedMessages) ? $maxItems : $queuedMessages);
$loop = true; // loop mode!! $loop = true; // loop mode!!
} }
else if ($queuedMessages == 0) { else if ($queuedMessages == 0) {
...@@ -758,7 +758,7 @@ class LoopDetection extends InterProcessData { ...@@ -758,7 +758,7 @@ class LoopDetection extends InterProcessData {
ZLog::Write(LOGLEVEL_DEBUG, sprintf("LoopDetection->Detect(): case 3.3.1 detected - broken item should be next, attempt to ignore it - id '%s'", $current['potential'])); ZLog::Write(LOGLEVEL_DEBUG, sprintf("LoopDetection->Detect(): case 3.3.1 detected - broken item should be next, attempt to ignore it - id '%s'", $current['potential']));
$this->ignore_messageid = $current['potential']; $this->ignore_messageid = $current['potential'];
} }
$current['maxCount'] = $counter + $queuedMessages; $current['maxCount'] = $counter + (($maxItems < $queuedMessages) ? $maxItems : $queuedMessages);
$loop = true; // loop mode!! $loop = true; // loop mode!!
} }
} }
......
...@@ -240,15 +240,13 @@ class ZPush { ...@@ -240,15 +240,13 @@ class ZPush {
Utils::FixFileOwner(LOGERRORFILE); Utils::FixFileOwner(LOGERRORFILE);
// set time zone // set time zone
// code contributed by Robert Scheck (rsc) - more information: https://developer.berlios.de/mantis/view.php?id=479 // code contributed by Robert Scheck (rsc)
if(function_exists("date_default_timezone_set")) { if(defined('TIMEZONE') ? constant('TIMEZONE') : false) {
if(defined('TIMEZONE') ? constant('TIMEZONE') : false) { if (! @date_default_timezone_set(TIMEZONE))
if (! @date_default_timezone_set(TIMEZONE)) throw new FatalMisconfigurationException(sprintf("The configured TIMEZONE '%s' is not valid. Please check supported timezones at http://www.php.net/manual/en/timezones.php", constant('TIMEZONE')));
throw new FatalMisconfigurationException(sprintf("The configured TIMEZONE '%s' is not valid. Please check supported timezones at http://www.php.net/manual/en/timezones.php", constant('TIMEZONE'))); }
} else if(!ini_get('date.timezone')) {
else if(!ini_get('date.timezone')) { date_default_timezone_set('Europe/Amsterdam');
date_default_timezone_set('Europe/Amsterdam');
}
} }
return true; return true;
......
...@@ -55,8 +55,8 @@ class ZPushException extends Exception { ...@@ -55,8 +55,8 @@ class ZPushException extends Exception {
if (!$logLevel) if (!$logLevel)
$logLevel = $this->defaultLogLevel; $logLevel = $this->defaultLogLevel;
ZLog::Write($logLevel, get_class($this) .': '. $message . ' - code: '.$code, false);
parent::__construct($message, (int) $code); parent::__construct($message, (int) $code);
ZLog::Write($logLevel, get_class($this) .': '. $message . ' - code: '.$code. ' - file: '. $this->getFile().':'.$this->getLine(), false);
} }
public function getHTTPCodeString() { public function getHTTPCodeString() {
......
...@@ -181,7 +181,7 @@ class Ping extends RequestProcessor { ...@@ -181,7 +181,7 @@ class Ping extends RequestProcessor {
$pingstatus = SYNC_PINGSTATUS_FOLDERHIERSYNCREQUIRED; $pingstatus = SYNC_PINGSTATUS_FOLDERHIERSYNCREQUIRED;
self::$deviceManager->AnnounceProcessStatus(false, $pingstatus); self::$deviceManager->AnnounceProcessStatus(false, $pingstatus);
break; break;
case SyncCollections::OBSOLETE_CONNECTION: case SyncCollections::OBSOLETE_CONNECTION:
$foundchanges = false; $foundchanges = false;
break; break;
case SyncCollections::HIERARCHY_CHANGED: case SyncCollections::HIERARCHY_CHANGED:
......
...@@ -1258,8 +1258,8 @@ class Sync extends RequestProcessor { ...@@ -1258,8 +1258,8 @@ class Sync extends RequestProcessor {
$folderid = self::$backend->GetWasteBasket(); $folderid = self::$backend->GetWasteBasket();
if($folderid) { if($folderid) {
$this->importer->ImportMessageMove($serverid, $folderid);
$actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS; $actiondata["statusids"][$serverid] = SYNC_STATUS_SUCCESS;
$this->importer->ImportMessageMove($serverid, $folderid);
break; break;
} }
else else
...@@ -1271,7 +1271,9 @@ class Sync extends RequestProcessor { ...@@ -1271,7 +1271,9 @@ class Sync extends RequestProcessor {
} }
} }
catch (StatusException $stex) { catch (StatusException $stex) {
$actiondata["statusids"][$serverid] = $stex->getCode(); if($stex->getCode() != SYNC_MOVEITEMSSTATUS_SUCCESS) {
$actiondata["statusids"][$serverid] = SYNC_STATUS_OBJECTNOTFOUND;
}
} }
break; break;
} }
......
...@@ -129,11 +129,13 @@ class SyncMeetingRequest extends SyncObject { ...@@ -129,11 +129,13 @@ class SyncMeetingRequest extends SyncObject {
SYNC_POOMMAIL_GLOBALOBJID => array ( self::STREAMER_VAR => "globalobjid"), SYNC_POOMMAIL_GLOBALOBJID => array ( self::STREAMER_VAR => "globalobjid"),
SYNC_POOMMAIL_DISALLOWNEWTIMEPROPOSAL => array ( self::STREAMER_VAR => "disallownewtimeproposal",
self::STREAMER_CHECKS => array( self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO,
self::STREAMER_CHECK_ONEVALUEOF => array(0,1) )),
); );
if (Request::GetProtocolVersion() >= 14.0) {
$mapping[SYNC_POOMMAIL_DISALLOWNEWTIMEPROPOSAL] = array ( self::STREAMER_VAR => "disallownewtimeproposal",
self::STREAMER_CHECKS => array( self::STREAMER_CHECK_REQUIRED => self::STREAMER_CHECK_SETZERO,
self::STREAMER_CHECK_ONEVALUEOF => array(0,1) ));
}
parent::SyncObject($mapping); parent::SyncObject($mapping);
} }
} }
......
...@@ -82,7 +82,7 @@ abstract class SyncObject extends Streamer { ...@@ -82,7 +82,7 @@ abstract class SyncObject extends Streamer {
public function emptySupported($supportedFields) { public function emptySupported($supportedFields) {
// Some devices do not send supported tag. In such a case remove all not set properties. // Some devices do not send supported tag. In such a case remove all not set properties.
if (($supportedFields === false || !is_array($supportedFields) || (empty($supportedFields)))) { if (($supportedFields === false || !is_array($supportedFields) || (empty($supportedFields)))) {
if (defined('UNSET_UNDEFINED_PROPERTIES') && UNSET_UNDEFINED_PROPERTIES && ($this instanceOf SyncContact || $this instanceOf SyncAppointment)) { if (defined('UNSET_UNDEFINED_PROPERTIES') && UNSET_UNDEFINED_PROPERTIES && ($this instanceof SyncContact || $this instanceof SyncAppointment)) {
ZLog::Write(LOGLEVEL_INFO, sprintf("%s->emptySupported(): no supported list available, emptying all not set parameters", get_class($this))); ZLog::Write(LOGLEVEL_INFO, sprintf("%s->emptySupported(): no supported list available, emptying all not set parameters", get_class($this)));
$supportedFields = array_keys($this->mapping); $supportedFields = array_keys($this->mapping);
} }
......
...@@ -72,18 +72,18 @@ class Webservice { ...@@ -72,18 +72,18 @@ class Webservice {
$this->server->setClass("WebserviceDevice"); $this->server->setClass("WebserviceDevice");
} }
// the webservice command is handled by its class // the webservice command is handled by its class
if ($commandCode == ZPush::COMMAND_WEBSERVICE_USERS) { if ($commandCode == ZPush::COMMAND_WEBSERVICE_USERS) {
if (!defined("ALLOW_WEBSERVICE_USERS_ACCESS") || ALLOW_WEBSERVICE_USERS_ACCESS !== true) if (!defined("ALLOW_WEBSERVICE_USERS_ACCESS") || ALLOW_WEBSERVICE_USERS_ACCESS !== true)
throw new HTTPReturnCodeException(sprintf("Access to the WebserviceUsers service is disabled in configuration. Enable setting ALLOW_WEBSERVICE_USERS_ACCESS.", Request::GetAuthUser()), 403); throw new HTTPReturnCodeException(sprintf("Access to the WebserviceUsers service is disabled in configuration. Enable setting ALLOW_WEBSERVICE_USERS_ACCESS.", Request::GetAuthUser()), 403);
ZLog::Write(LOGLEVEL_DEBUG, sprintf("Webservice::HandleWebservice('%s'): executing WebserviceUsers service", $commandCode)); ZLog::Write(LOGLEVEL_DEBUG, sprintf("Webservice::HandleWebservice('%s'): executing WebserviceUsers service", $commandCode));
if(ZPush::GetBackend()->Setup("SYSTEM", true) == false) if(ZPush::GetBackend()->Setup("SYSTEM", true) == false)
throw new AuthenticationRequiredException(sprintf("User '%s' has no admin privileges", Request::GetAuthUser())); throw new AuthenticationRequiredException(sprintf("User '%s' has no admin privileges", Request::GetAuthUser()));
include_once('webserviceusers.php'); include_once('webserviceusers.php');
$this->server->setClass("WebserviceUsers"); $this->server->setClass("WebserviceUsers");
} }
$this->server->handle(); $this->server->handle();
......
...@@ -45,15 +45,15 @@ include ('lib/utils/zpushadmin.php'); ...@@ -45,15 +45,15 @@ include ('lib/utils/zpushadmin.php');
class WebserviceUsers { class WebserviceUsers {
/** /**
* Returns a list of all known devices * Returns a list of all known devices
* *
* @access public * @access public
* @return array * @return array
*/ */
public function ListDevices() { public function ListDevices() {
return ZPushAdmin::ListDevices(false); return ZPushAdmin::ListDevices(false);
} }
/** /**
* Returns a list of all known devices of the users * Returns a list of all known devices of the users
...@@ -74,29 +74,29 @@ class WebserviceUsers { ...@@ -74,29 +74,29 @@ class WebserviceUsers {
return $output; return $output;
} }
/** /**
* Returns a list of all known devices with users and when they synchronized for the first time * Returns a list of all known devices with users and when they synchronized for the first time
* *
* @access public * @access public
* @return array * @return array
*/ */
public function ListDevicesDetails() { public function ListDevicesDetails() {
$devices = ZPushAdmin::ListDevices(false); $devices = ZPushAdmin::ListDevices(false);
$output = array(); $output = array();
ZLog::Write(LOGLEVEL_INFO, sprintf("WebserviceUsers::ListLastSync(): found %d devices", count($devices))); ZLog::Write(LOGLEVEL_INFO, sprintf("WebserviceUsers::ListLastSync(): found %d devices", count($devices)));
ZPush::GetTopCollector()->AnnounceInformation(sprintf("Retrieved details of %d devices and getting users", count($devices)), true); ZPush::GetTopCollector()->AnnounceInformation(sprintf("Retrieved details of %d devices and getting users", count($devices)), true);
foreach ($devices as $deviceId) { foreach ($devices as $deviceId) {
$output[$deviceId] = array(); $output[$deviceId] = array();
$users = ZPushAdmin::ListUsers($deviceId); $users = ZPushAdmin::ListUsers($deviceId);
foreach ($users as $user) { foreach ($users as $user) {
$output[$deviceId][$user] = ZPushAdmin::GetDeviceDetails($deviceId, $user); $output[$deviceId][$user] = ZPushAdmin::GetDeviceDetails($deviceId, $user);
} }
} }
return $output; return $output;
} }
} }
?> ?>
\ No newline at end of file
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* *
* Created : 18.04.2008 * Created : 18.04.2008
* *
* Copyright 2007 - 2015 Zarafa Deutschland GmbH * Copyright 2007 - 2016 Zarafa Deutschland GmbH
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3, * it under the terms of the GNU Affero General Public License, version 3,
...@@ -41,6 +41,6 @@ ...@@ -41,6 +41,6 @@
* Consult LICENSE file for details * Consult LICENSE file for details
************************************************/ ************************************************/
define("ZPUSH_VERSION", "2.2.7"); define("ZPUSH_VERSION", "2.2.8");
?> ?>
\ No newline at end of file
...@@ -239,7 +239,7 @@ class ZPushAdminCLI { ...@@ -239,7 +239,7 @@ class ZPushAdminCLI {
elseif (isset($options['type']) && !empty($options['type'])) elseif (isset($options['type']) && !empty($options['type']))
self::$type = strtolower(trim($options['type'])); self::$type = strtolower(trim($options['type']));
// if type is set, it must be one of known types or a 44 byte long folder id // if type is set, it must be one of known types or a 44 or 48 byte long folder id
if (self::$type !== false) { if (self::$type !== false) {
if (self::$type !== self::TYPE_OPTION_EMAIL && if (self::$type !== self::TYPE_OPTION_EMAIL &&
self::$type !== self::TYPE_OPTION_CALENDAR && self::$type !== self::TYPE_OPTION_CALENDAR &&
...@@ -247,10 +247,11 @@ class ZPushAdminCLI { ...@@ -247,10 +247,11 @@ class ZPushAdminCLI {
self::$type !== self::TYPE_OPTION_TASK && self::$type !== self::TYPE_OPTION_TASK &&
self::$type !== self::TYPE_OPTION_NOTE && self::$type !== self::TYPE_OPTION_NOTE &&
self::$type !== self::TYPE_OPTION_HIERARCHY && self::$type !== self::TYPE_OPTION_HIERARCHY &&
strlen(self::$type) !== 44) { strlen(self::$type) !== 44 &&
strlen(self::$type) !== 48) {
self::$errormessage = "Wrong 'type'. Possible values are: ". self::$errormessage = "Wrong 'type'. Possible values are: ".
"'".self::TYPE_OPTION_EMAIL."', '".self::TYPE_OPTION_CALENDAR."', '".self::TYPE_OPTION_CONTACT."', '".self::TYPE_OPTION_TASK."', '".self::TYPE_OPTION_NOTE."', ".self::TYPE_OPTION_HIERARCHY."' ". "'".self::TYPE_OPTION_EMAIL."', '".self::TYPE_OPTION_CALENDAR."', '".self::TYPE_OPTION_CONTACT."', '".self::TYPE_OPTION_TASK."', '".self::TYPE_OPTION_NOTE."', ".self::TYPE_OPTION_HIERARCHY."' ".
"or a 44 byte long folder id (as hex)."; "or a 44 or 48 byte long folder id (as hex).";
return; return;
} }
} }
......
<?php <?php
/*********************************************** /***********************************************
* File : printwbxml.php * File : printwbxml.php
* Project : Z-Push * Project : Z-Push
* Descr : decodes and prints wbxml as base64 to stdout * Descr : decodes and prints wbxml as base64 to stdout
* *
* Created : 18.05.2015 * Created : 18.05.2015
* *
* Copyright 2015 Zarafa Deutschland GmbH * Copyright 2015 Zarafa Deutschland GmbH
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3, * it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation with the following additional * as published by the Free Software Foundation with the following additional
* term according to sec. 7: * term according to sec. 7:
* *
* According to sec. 7 of the GNU Affero General Public License, version 3, * According to sec. 7 of the GNU Affero General Public License, version 3,
* the terms of the AGPL are supplemented with the following terms: * the terms of the AGPL are supplemented with the following terms:
* *
* "Zarafa" is a registered trademark of Zarafa B.V. * "Zarafa" is a registered trademark of Zarafa B.V.
* "Z-Push" is a registered trademark of Zarafa Deutschland GmbH * "Z-Push" is a registered trademark of Zarafa Deutschland GmbH
* The licensing of the Program under the AGPL does not imply a trademark license. * The licensing of the Program under the AGPL does not imply a trademark license.
* Therefore any rights, title and interest in our trademarks remain entirely with us. * Therefore any rights, title and interest in our trademarks remain entirely with us.
* *
* However, if you propagate an unmodified version of the Program you are * However, if you propagate an unmodified version of the Program you are
* allowed to use the term "Z-Push" to indicate that you distribute the Program. * allowed to use the term "Z-Push" to indicate that you distribute the Program.
* Furthermore you may use our trademarks where it is necessary to indicate * Furthermore you may use our trademarks where it is necessary to indicate
* the intended purpose of a product or service provided you use it in accordance * the intended purpose of a product or service provided you use it in accordance
* with honest practices in industrial or commercial matters. * with honest practices in industrial or commercial matters.
* If you want to propagate modified versions of the Program under the name "Z-Push", * If you want to propagate modified versions of the Program under the name "Z-Push",
* you may only do so if you have a written permission by Zarafa Deutschland GmbH * you may only do so if you have a written permission by Zarafa Deutschland GmbH
* (to acquire a permission please contact Zarafa at trademark@zarafa.com). * (to acquire a permission please contact Zarafa at trademark@zarafa.com).
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
* Consult LICENSE file for details * Consult LICENSE file for details
************************************************/ ************************************************/
if (count($argv) < 2) { if (count($argv) < 2) {
die("\tUsage: printwbmxl.php WBXML-INPUT-HERE\n\n"); die("\tUsage: printwbmxl.php WBXML-INPUT-HERE\n\n");
} }
$wbxml64 = $argv[1]; $wbxml64 = $argv[1];
// include the stuff we need // include the stuff we need
include_once('../../src/lib/utils/stringstreamwrapper.php'); include_once('../../src/lib/utils/stringstreamwrapper.php');
include_once('../../src/lib/wbxml/wbxmldefs.php'); include_once('../../src/lib/wbxml/wbxmldefs.php');
include_once('../../src/lib/wbxml/wbxmldecoder.php'); include_once('../../src/lib/wbxml/wbxmldecoder.php');
include_once('../../src/lib/wbxml/wbxmlencoder.php'); include_once('../../src/lib/wbxml/wbxmlencoder.php');
// minimal definitions & log to stdout overwrite // minimal definitions & log to stdout overwrite
define('WBXML_DEBUG', true); define('WBXML_DEBUG', true);
define("LOGLEVEL_WBXML", "wbxml"); define("LOGLEVEL_WBXML", "wbxml");
define("LOGLEVEL_DEBUG", "debug"); define("LOGLEVEL_DEBUG", "debug");
class ZLog { class ZLog {
static public function Write($level, $msg, $truncate = false) { static public function Write($level, $msg, $truncate = false) {
// we only care about the wbxml // we only care about the wbxml
if ($level == "wbxml") { if ($level == "wbxml") {
if (substr($msg,0,1) == "I") { if (substr($msg,0,1) == "I") {
echo substr($msg,1) . "\n"; echo substr($msg,1) . "\n";
} }
else { else {
echo $msg . "\n"; echo $msg . "\n";
} }
} }
} }
} }
// setup // setup
$wxbml = StringStreamWrapper::Open($wbxml64); $wxbml = StringStreamWrapper::Open($wbxml64);
$base64filter = stream_filter_append($wxbml, 'convert.base64-decode'); $base64filter = stream_filter_append($wxbml, 'convert.base64-decode');
$decoder = new WBXMLDecoder($wxbml); $decoder = new WBXMLDecoder($wxbml);
if (! $decoder->IsWBXML()) { if (! $decoder->IsWBXML()) {
die("input is not WBXML as base64\n\n"); die("input is not WBXML as base64\n\n");
} }
echo "\n"; echo "\n";
// read everything and log it // read everything and log it
$decoder->readRemainingData(); $decoder->readRemainingData();
echo "\n"; echo "\n";
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment