Commit 0a92884b authored by Sebastian Kummer's avatar Sebastian Kummer

Merge pull request #470 in ZP/z-push from...

Merge pull request #470 in ZP/z-push from feature/ZP-1065-koe-inject-ldap-signatures-like-webapp to develop

* commit 'aa08137c':
  ZP-1065 Changed method name to make it clearer.
  ZP-1065 fix typo.
  ZP-1065 Implement WebserviceInfo->GetSignatures().
  ZP-1065 Send signatures hash in headers of Settings.
  ZP-1065 Extended IBackend, implemented in Backend and BackendKopano.
  ZP-1065 Make MAPIUtils::GetError() public so it can used in other places, remove duplicated getNativeBodyType and getError from MAPIProvider - use the ones in MAPIUtils.
parents 394ceefb aa08137c
...@@ -1476,6 +1476,37 @@ class BackendKopano implements IBackend, ISearchProvider { ...@@ -1476,6 +1476,37 @@ class BackendKopano implements IBackend, ISearchProvider {
} }
} }
/**
* Returns a KoeSignatures object.
*
* @access public
* @return KoeSignatures
*/
public function GetKoeSignatures() {
$sigs = new KoeSignatures();
$storeProps = mapi_getprops($this->store, array(PR_EC_WEBACCESS_SETTINGS_JSON));
// Check if property exists, if it doesn't exist then we can continue with an empty signature object
if (isset($storeProps[PR_EC_WEBACCESS_SETTINGS_JSON]) || MAPIUtils::GetError(PR_EC_WEBACCESS_SETTINGS_JSON, $storeProps) == MAPI_E_NOT_ENOUGH_MEMORY) {
$settings_string = MAPIUtils::readPropStream($this->store, PR_EC_WEBACCESS_SETTINGS_JSON);
if(!empty($settings_string)) {
$settings = json_decode($settings_string, true);
if (json_last_error()) {
ZLog::Write(LOGLEVEL_WARN, sprintf("KopanoBackend->GetKoeSignatures(): Error decoding JSON WebApp settings: %s", json_last_error()));
}
if (isset($settings['settings']['zarafa']['v1']['contexts']['mail']['signatures'])) {
// convert WebApp signatures into KoeSignatures object
$sigs->LoadSignaturesFromData($settings['settings']['zarafa']['v1']['contexts']['mail']['signatures']);
ZLog::Write(LOGLEVEL_DEBUG, sprintf("KopanoBackend->GetKoeSignatures(): Found %d signatures - new '%s' - reply/fw: '%s' - hash: %s", count($sigs->GetSignatures()), $sigs->GetNewMessageSignatureId(), $sigs->GetReplyForwardSignatureId(), $sigs->GetHash()));
}
else {
ZLog::Write(LOGLEVEL_DEBUG, "KopanoBackend->GetKoeSignatures(): No signature data in WebApp settings");
}
}
}
return $sigs;
}
/**---------------------------------------------------------------------------------------------------------- /**----------------------------------------------------------------------------------------------------------
* Private methods * Private methods
*/ */
......
...@@ -315,10 +315,10 @@ class MAPIProvider { ...@@ -315,10 +315,10 @@ class MAPIProvider {
} }
if (!isset($message->nativebodytype)) { if (!isset($message->nativebodytype)) {
$message->nativebodytype = $this->getNativeBodyType($messageprops); $message->nativebodytype = MAPIUtils::GetNativeBodyType($messageprops);
} }
elseif ($message->nativebodytype == SYNC_BODYPREFERENCE_UNDEFINED) { elseif ($message->nativebodytype == SYNC_BODYPREFERENCE_UNDEFINED) {
$nbt = $this->getNativeBodyType($messageprops); $nbt = MAPIUtils::GetNativeBodyType($messageprops);
ZLog::Write(LOGLEVEL_INFO, sprintf("MAPIProvider->getAppointment(): native body type is undefined. Set it to %d.", $nbt)); ZLog::Write(LOGLEVEL_INFO, sprintf("MAPIProvider->getAppointment(): native body type is undefined. Set it to %d.", $nbt));
$message->nativebodytype = $nbt; $message->nativebodytype = $nbt;
} }
...@@ -834,10 +834,10 @@ class MAPIProvider { ...@@ -834,10 +834,10 @@ class MAPIProvider {
if (!isset($message->contentclass)) $message->contentclass = DEFAULT_EMAIL_CONTENTCLASS; if (!isset($message->contentclass)) $message->contentclass = DEFAULT_EMAIL_CONTENTCLASS;
if (!isset($message->nativebodytype)) { if (!isset($message->nativebodytype)) {
$message->nativebodytype = $this->getNativeBodyType($messageprops); $message->nativebodytype = MAPIUtils::GetNativeBodyType($messageprops);
} }
elseif ($message->nativebodytype == SYNC_BODYPREFERENCE_UNDEFINED) { elseif ($message->nativebodytype == SYNC_BODYPREFERENCE_UNDEFINED) {
$nbt = $this->getNativeBodyType($messageprops); $nbt = MAPIUtils::GetNativeBodyType($messageprops);
ZLog::Write(LOGLEVEL_INFO, sprintf("MAPIProvider->getEmail(): native body type is undefined. Set it to %d.", $nbt)); ZLog::Write(LOGLEVEL_INFO, sprintf("MAPIProvider->getEmail(): native body type is undefined. Set it to %d.", $nbt));
$message->nativebodytype = $nbt; $message->nativebodytype = $nbt;
} }
...@@ -2617,107 +2617,6 @@ class MAPIProvider { ...@@ -2617,107 +2617,6 @@ class MAPIProvider {
} }
} }
/**
* Calculates the native body type of a message using available properties. Refer to oxbbody.
*
* @param array $messageprops
*
* @access private
* @return int
*/
private function getNativeBodyType($messageprops) {
//check if the properties are set and get the error code if needed
if (!isset($messageprops[PR_BODY])) $messageprops[PR_BODY] = $this->getError(PR_BODY, $messageprops);
if (!isset($messageprops[PR_RTF_COMPRESSED])) $messageprops[PR_RTF_COMPRESSED] = $this->getError(PR_RTF_COMPRESSED, $messageprops);
if (!isset($messageprops[PR_HTML])) $messageprops[PR_HTML] = $this->getError(PR_HTML, $messageprops);
if (!isset($messageprops[PR_RTF_IN_SYNC])) $messageprops[PR_RTF_IN_SYNC] = $this->getError(PR_RTF_IN_SYNC, $messageprops);
if ( // 1
($messageprops[PR_BODY] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_HTML] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_PLAIN;
elseif ( // 2
($messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_HTML] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_PLAIN;
elseif ( // 3
($messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_HTML] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_RTF;
elseif ( // 4
($messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_HTML] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_RTF;
elseif ( // 5
($messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_HTML] == MAPI_E_NOT_ENOUGH_MEMORY) &&
(!$messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_HTML;
elseif ( // 6
($messageprops[PR_RTF_COMPRESSED] != MAPI_E_NOT_FOUND || $messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_HTML] != MAPI_E_NOT_FOUND || $messageprops[PR_HTML] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_RTF;
elseif ( // 7
($messageprops[PR_RTF_COMPRESSED] != MAPI_E_NOT_FOUND || $messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_HTML] != MAPI_E_NOT_FOUND || $messageprops[PR_HTML] == MAPI_E_NOT_ENOUGH_MEMORY) &&
(!$messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_HTML;
elseif ( // 8
($messageprops[PR_BODY] != MAPI_E_NOT_FOUND || $messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] != MAPI_E_NOT_FOUND || $messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_RTF;
elseif ( // 9.1
($messageprops[PR_BODY] != MAPI_E_NOT_FOUND || $messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] != MAPI_E_NOT_FOUND || $messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
(!$messageprops[PR_RTF_IN_SYNC]))
return SYNC_BODYPREFERENCE_PLAIN;
elseif ( // 9.2
($messageprops[PR_RTF_COMPRESSED] != MAPI_E_NOT_FOUND || $messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_BODY] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_HTML] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_RTF;
elseif ( // 9.3
($messageprops[PR_BODY] != MAPI_E_NOT_FOUND || $messageprops[PR_BODY] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_HTML] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_PLAIN;
elseif ( // 9.4
($messageprops[PR_HTML] != MAPI_E_NOT_FOUND || $messageprops[PR_HTML] == MAPI_E_NOT_ENOUGH_MEMORY) &&
($messageprops[PR_BODY] == MAPI_E_NOT_FOUND) &&
($messageprops[PR_RTF_COMPRESSED] == MAPI_E_NOT_FOUND))
return SYNC_BODYPREFERENCE_HTML;
else // 10
return SYNC_BODYPREFERENCE_PLAIN;
}
/**
* Returns the error code for a given property. Helper for getNativeBodyType function.
*
* @param int $tag
* @param array $messageprops
*
* @access private
* @return int (MAPI_ERROR_CODE)
*/
private function getError($tag, $messageprops) {
$prBodyError = mapi_prop_tag(PT_ERROR, mapi_prop_id($tag));
if(isset($messageprops[$prBodyError]) && mapi_is_error($messageprops[$prBodyError])) {
if($messageprops[$prBodyError] == MAPI_E_NOT_ENOUGH_MEMORY_32BIT ||
$messageprops[$prBodyError] == MAPI_E_NOT_ENOUGH_MEMORY_64BIT) {
return MAPI_E_NOT_ENOUGH_MEMORY;
}
}
return MAPI_E_NOT_FOUND;
}
/** /**
* Sets properties for an email message. * Sets properties for an email message.
* *
......
...@@ -472,10 +472,10 @@ class MAPIUtils { ...@@ -472,10 +472,10 @@ class MAPIUtils {
*/ */
public static function GetNativeBodyType($messageprops) { public static function GetNativeBodyType($messageprops) {
//check if the properties are set and get the error code if needed //check if the properties are set and get the error code if needed
if (!isset($messageprops[PR_BODY])) $messageprops[PR_BODY] = self::getError(PR_BODY, $messageprops); if (!isset($messageprops[PR_BODY])) $messageprops[PR_BODY] = self::GetError(PR_BODY, $messageprops);
if (!isset($messageprops[PR_RTF_COMPRESSED])) $messageprops[PR_RTF_COMPRESSED] = self::getError(PR_RTF_COMPRESSED, $messageprops); if (!isset($messageprops[PR_RTF_COMPRESSED])) $messageprops[PR_RTF_COMPRESSED] = self::GetError(PR_RTF_COMPRESSED, $messageprops);
if (!isset($messageprops[PR_HTML])) $messageprops[PR_HTML] = self::getError(PR_HTML, $messageprops); if (!isset($messageprops[PR_HTML])) $messageprops[PR_HTML] = self::GetError(PR_HTML, $messageprops);
if (!isset($messageprops[PR_RTF_IN_SYNC])) $messageprops[PR_RTF_IN_SYNC] = self::getError(PR_RTF_IN_SYNC, $messageprops); if (!isset($messageprops[PR_RTF_IN_SYNC])) $messageprops[PR_RTF_IN_SYNC] = self::GetError(PR_RTF_IN_SYNC, $messageprops);
if ( // 1 if ( // 1
($messageprops[PR_BODY] == MAPI_E_NOT_FOUND) && ($messageprops[PR_BODY] == MAPI_E_NOT_FOUND) &&
...@@ -544,15 +544,16 @@ class MAPIUtils { ...@@ -544,15 +544,16 @@ class MAPIUtils {
} }
/** /**
* Returns the error code for a given property. Helper for getNativeBodyType function. * Returns the error code for a given property.
* Helper for MAPIUtils::GetNativeBodyType() function but also used in other places.
* *
* @param int $tag * @param int $tag
* @param array $messageprops * @param array $messageprops
* *
* @access private * @access public
* @return int (MAPI_ERROR_CODE) * @return int (MAPI_ERROR_CODE)
*/ */
private static function getError($tag, $messageprops) { public static function GetError($tag, $messageprops) {
$prBodyError = mapi_prop_tag(PT_ERROR, mapi_prop_id($tag)); $prBodyError = mapi_prop_tag(PT_ERROR, mapi_prop_id($tag));
if(isset($messageprops[$prBodyError]) && mapi_is_error($messageprops[$prBodyError])) { if(isset($messageprops[$prBodyError]) && mapi_is_error($messageprops[$prBodyError])) {
if($messageprops[$prBodyError] == MAPI_E_NOT_ENOUGH_MEMORY_32BIT || if($messageprops[$prBodyError] == MAPI_E_NOT_ENOUGH_MEMORY_32BIT ||
......
<?php
/***********************************************
* File : koesignatures.php
* Project : Z-Push
* Descr : Holds a list of signatures and signature options for KOE.
*
* Created : 06.02.2017
*
* Copyright 2007 - 2017 Zarafa Deutschland GmbH
*
* 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,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* 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/>.
*
* Consult LICENSE file for details
*************************************************/
class KoeSignatures {
private $all = array();
private $new_message;
private $replyforward_message;
private $hash;
/**
* Constructor
*
* @access public
*/
public function __construct() {
$this->GetHash();
}
/**
* Loads data from an array.
*
* @param array $data
*
* @access public
* @return void
*/
public function LoadSignaturesFromData($data) {
if (isset($data['all'])) {
foreach ($data['all'] as $id => $signature) {
$koeSig = KoeSignature::GetSignatureFromArray($id, $signature);
$this->AddSignature($koeSig);
}
}
if (isset($data['new_message'])) {
$this->SetNewMessageSignatureId($data['new_message']);
}
if (isset($data['replyforward_message'])) {
$this->SetReplyForwardSignatureId($data['replyforward_message']);
}
// update the hash
$this->GetHash();
}
/**
* Adds a KoeSignature object to the list.
*
* @param KoeSignature $koeSig
*
* @access public
* @return void
*/
public function AddSignature($koeSig) {
$this->all[$koeSig->id] = $koeSig;
}
/**
* Returns an array of KoeSignature objects.
*
* @access public
* @return array
*/
public function GetSignatures() {
return $this->all;
}
/**
* Returns a KoeSignature signature object or null if id is not available.
*
* @param KoeSignature $koeSig
*
* @access public
* @return KoeSignature | null
*/
public function GetSignature($id) {
return (isset($this->all[$id]) ? $this->all[$id] : null);
}
/**
* Sets the KoeSignature id to be used for new messages.
* The id is not verified if present.
*
* @param string $id
*
* @access public
* @return void
*/
public function SetNewMessageSignatureId($id) {
$this->new_message = $id;
}
/**
* Gets the KoeSignature id to be used for new messages.
*
* @access public
* @return string | null
*/
public function GetNewMessageSignatureId() {
return $this->new_message;
}
/**
* Sets the KoeSignature id to be used when replying or forwarding.
* The id is not verified if present.
*
* @param string $id
*
* @access public
* @return void
*/
public function SetReplyForwardSignatureId($id) {
$this->replyforward_message = $id;
}
/**
* Gets the KoeSignature id to be used when replying or forwarding.
*
* @access public
* @return string | null
*/
public function GetReplyForwardSignatureId() {
return $this->replyforward_message;
}
/**
* Returns the hash of the currently loaded data.
*
* @access public
* @return string
*/
public function GetHash() {
$this->hash = sha1(json_encode($this->all).$this->new_message.$this->replyforward_message);
return $this->hash;
}
}
/**
* Helper class holding a signature.
*/
class KoeSignature {
public $id;
public $name;
public $content;
public $isHTML;
/**
* Creates a new KoeSignature object from a data array.
*
* @param string $id
* @param array $data
*
* @access public
* @return KoeSignature
*/
public static function GetSignatureFromArray($id, array $data) {
$sig = new KoeSignature();
$sig->id = $id;
$sig->name = $data['name'];
$sig->content = $data['content'];
$sig->isHTML = (bool) $data['isHTML'];
return $sig;
}
}
\ No newline at end of file
...@@ -247,6 +247,16 @@ abstract class Backend implements IBackend { ...@@ -247,6 +247,16 @@ abstract class Backend implements IBackend {
return "not implemented-".gmdate("Y-m-d-H"); return "not implemented-".gmdate("Y-m-d-H");
} }
/**
* Returns a KoeSignatures object.
*
* @access public
* @return KoeSignatures
*/
public function GetKoeSignatures() {
return new KoeSignatures();
}
/**---------------------------------------------------------------------------------------------------------- /**----------------------------------------------------------------------------------------------------------
* Protected methods for BackendStorage * Protected methods for BackendStorage
......
...@@ -333,4 +333,12 @@ interface IBackend { ...@@ -333,4 +333,12 @@ interface IBackend {
* @return string|boolean * @return string|boolean
*/ */
public function GetKoeGabBackendFolderId($foldername); public function GetKoeGabBackendFolderId($foldername);
/**
* Returns a KoeSignatures object.
*
* @access public
* @return KoeSignatures
*/
public function GetKoeSignatures();
} }
...@@ -50,10 +50,15 @@ class Settings extends RequestProcessor { ...@@ -50,10 +50,15 @@ class Settings extends RequestProcessor {
if (defined('KOE_CAPABILITY_SHAREDFOLDER') && KOE_CAPABILITY_SHAREDFOLDER) $cap[] = "sharedfolder"; if (defined('KOE_CAPABILITY_SHAREDFOLDER') && KOE_CAPABILITY_SHAREDFOLDER) $cap[] = "sharedfolder";
if (defined('KOE_CAPABILITY_SENDAS') && KOE_CAPABILITY_SENDAS) $cap[] = "sendas"; if (defined('KOE_CAPABILITY_SENDAS') && KOE_CAPABILITY_SENDAS) $cap[] = "sendas";
if (defined('KOE_CAPABILITY_SECONDARYCONTACTS') && KOE_CAPABILITY_SECONDARYCONTACTS) $cap[] = "secondarycontacts"; if (defined('KOE_CAPABILITY_SECONDARYCONTACTS') && KOE_CAPABILITY_SECONDARYCONTACTS) $cap[] = "secondarycontacts";
if (defined('KOE_CAPABILITY_SIGNATURES') && KOE_CAPABILITY_SIGNATURES) $cap[] = "signatures";
self::$specialHeaders = array(); self::$specialHeaders = array();
self::$specialHeaders[] = "X-Push-Capabilities: ". implode(",",$cap); self::$specialHeaders[] = "X-Push-Capabilities: ". implode(",",$cap);
self::$specialHeaders[] = "X-Push-GAB-Name: ". bin2hex(KOE_GAB_NAME); self::$specialHeaders[] = "X-Push-GAB-Name: ". bin2hex(KOE_GAB_NAME);
if (defined('KOE_CAPABILITY_SIGNATURES') && KOE_CAPABILITY_SIGNATURES) {
self::$specialHeaders[] = "X-Push-Signatures-Hash: ". self::$backend->GetKoeSignatures()->GetHash();
}
} }
//save the request parameters //save the request parameters
......
...@@ -53,6 +53,27 @@ class WebserviceInfo { ...@@ -53,6 +53,27 @@ class WebserviceInfo {
return $output; return $output;
} }
/**
* Returns signatures saved for the Request::GetGETUser().
*
* @access public
* @return KoeSignatures
*/
public function GetSignatures() {
$user = Request::GetGETUser();
$sigs = null;
$hasRights = ZPush::GetBackend()->Setup($user);
ZLog::Write(LOGLEVEL_INFO, sprintf("WebserviceInfo::GetSignatures(): permissions to open store '%s': %s", $user, Utils::PrintAsString($hasRights)));
if ($hasRights) {
$sigs = ZPush::GetBackend()->GetKoeSignatures();
ZPush::GetTopCollector()->AnnounceInformation(sprintf("Retrieved %d signatures", count($sigs->GetSignatures())), true);
}
return $sigs;
}
/** /**
* Returns the Z-Push version. * Returns the Z-Push version.
* *
......
...@@ -73,6 +73,8 @@ return array( ...@@ -73,6 +73,8 @@ return array(
'IpcMemcachedProvider' => $baseDir . '/backend/ipcmemcached/ipcmemcachedprovider.php', 'IpcMemcachedProvider' => $baseDir . '/backend/ipcmemcached/ipcmemcachedprovider.php',
'IpcSharedMemoryProvider' => $baseDir . '/backend/ipcsharedmemory/ipcsharedmemoryprovider.php', 'IpcSharedMemoryProvider' => $baseDir . '/backend/ipcsharedmemory/ipcsharedmemoryprovider.php',
'ItemOperations' => $baseDir . '/lib/request/itemoperations.php', 'ItemOperations' => $baseDir . '/lib/request/itemoperations.php',
'KoeSignature' => $baseDir . '/lib/core/koesignatures.php',
'KoeSignatures' => $baseDir . '/lib/core/koesignatures.php',
'KopanoChangesWrapper' => $baseDir . '/backend/kopano/kopanochangeswrapper.php', 'KopanoChangesWrapper' => $baseDir . '/backend/kopano/kopanochangeswrapper.php',
'Log' => $baseDir . '/lib/log/log.php', 'Log' => $baseDir . '/lib/log/log.php',
'LoopDetection' => $baseDir . '/lib/core/loopdetection.php', 'LoopDetection' => $baseDir . '/lib/core/loopdetection.php',
......
...@@ -80,6 +80,8 @@ class ComposerStaticInitd6749fc2fb9944bbe86b2b7d79a7852f ...@@ -80,6 +80,8 @@ class ComposerStaticInitd6749fc2fb9944bbe86b2b7d79a7852f
'IpcMemcachedProvider' => __DIR__ . '/../..' . '/backend/ipcmemcached/ipcmemcachedprovider.php', 'IpcMemcachedProvider' => __DIR__ . '/../..' . '/backend/ipcmemcached/ipcmemcachedprovider.php',
'IpcSharedMemoryProvider' => __DIR__ . '/../..' . '/backend/ipcsharedmemory/ipcsharedmemoryprovider.php', 'IpcSharedMemoryProvider' => __DIR__ . '/../..' . '/backend/ipcsharedmemory/ipcsharedmemoryprovider.php',
'ItemOperations' => __DIR__ . '/../..' . '/lib/request/itemoperations.php', 'ItemOperations' => __DIR__ . '/../..' . '/lib/request/itemoperations.php',
'KoeSignature' => __DIR__ . '/../..' . '/lib/core/koesignatures.php',
'KoeSignatures' => __DIR__ . '/../..' . '/lib/core/koesignatures.php',
'KopanoChangesWrapper' => __DIR__ . '/../..' . '/backend/kopano/kopanochangeswrapper.php', 'KopanoChangesWrapper' => __DIR__ . '/../..' . '/backend/kopano/kopanochangeswrapper.php',
'Log' => __DIR__ . '/../..' . '/lib/log/log.php', 'Log' => __DIR__ . '/../..' . '/lib/log/log.php',
'LoopDetection' => __DIR__ . '/../..' . '/lib/core/loopdetection.php', 'LoopDetection' => __DIR__ . '/../..' . '/lib/core/loopdetection.php',
......
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