From 46b8825ce3109389cfb845bd0a4fdc41b7480e70 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 16 Feb 2026 16:52:19 -0500 Subject: [PATCH 1/4] fix: Correct maximum photo size check --- lib/Horde/Core/ActiveSync/Driver.php | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/Horde/Core/ActiveSync/Driver.php b/lib/Horde/Core/ActiveSync/Driver.php index 42b3e8dc..597e51c2 100644 --- a/lib/Horde/Core/ActiveSync/Driver.php +++ b/lib/Horde/Core/ActiveSync/Driver.php @@ -2832,6 +2832,7 @@ public function resolveRecipient($type, $search, array $opts = []) if (count($results) && isset($results[$search])) { $gal = $this->_connector->contacts_getGal(); $picture_count = 0; + $picture = null; foreach ($results[$search] as $result) { if (!empty($opts['pictures'])) { $picture = new Horde_ActiveSync_Message_ResolveRecipientsPicture( @@ -2842,13 +2843,15 @@ public function resolveRecipient($type, $search, array $opts = []) } elseif (!empty($opts['maxpictures']) && $picture_count > $opts['maxpictures']) { $picture->status = Horde_ActiveSync_Status::PICTURE_LIMIT_REACHED; - } elseif (!empty($opts['maxsize']) && - strlen($result['photo']) > $opts['maxsize']) { - $picture->status = Horde_ActiveSync_Status::PICTURE_TOO_LARGE; } else { - $picture->data = $result['photo']['load']['data']; - $picture->status = Horde_ActiveSync_Status::PICTURE_SUCCESS; - ++$picture_count; + $data = $result['photo']['load']['data']; + if (!empty($opts['maxsize']) && strlen($data) > $opts['maxsize']) { + $picture->status = Horde_ActiveSync_Status::PICTURE_TOO_LARGE; + } else { + $picture->data = $data; + $picture->status = Horde_ActiveSync_Status::PICTURE_SUCCESS; + ++$picture_count; + } } } $entry = [ @@ -2856,7 +2859,7 @@ public function resolveRecipient($type, $search, array $opts = []) 'emailaddress' => $result['email'], 'entries' => !empty($result['smimePublicKey']) ? [$this->_mungeCert($result['smimePublicKey'])] : [], 'type' => $result['source'] == $gal ? Horde_ActiveSync::RESOLVE_RESULT_GAL : Horde_ActiveSync::RESOLVE_RESULT_ADDRESSBOOK, - 'picture' => !empty($picture) ? $picture : null, + 'picture' => $picture, ]; $return[] = $entry; } From a9701dc53264c927b1ea5dcce3ee2d8d0a1b105f Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 16 Feb 2026 16:54:38 -0500 Subject: [PATCH 2/4] fix: Correct broken code to support photos in resolveRecipient() --- lib/Horde/Core/ActiveSync/Connector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Horde/Core/ActiveSync/Connector.php b/lib/Horde/Core/ActiveSync/Connector.php index 96e28b17..306805c7 100644 --- a/lib/Horde/Core/ActiveSync/Connector.php +++ b/lib/Horde/Core/ActiveSync/Connector.php @@ -541,7 +541,7 @@ public function resolveRecipient($query, array $opts = []) } $returnFields = ['name', 'email', 'alias', 'smimePublicKey']; if (!empty($opts['pictures'])) { - $returnFields[$source]['photo']; + $returnFields[] = 'photo'; } $options = [ From 31ae9188c99d7a629b650ef6d6a7981c9a38b930 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 16 Feb 2026 16:57:22 -0500 Subject: [PATCH 3/4] fix: Add missing 'source' field (expected by Horde_Core_ActiveSync_Driver::resolveRecipient) --- lib/Horde/Core/ActiveSync/Connector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Horde/Core/ActiveSync/Connector.php b/lib/Horde/Core/ActiveSync/Connector.php index 306805c7..b393a5b3 100644 --- a/lib/Horde/Core/ActiveSync/Connector.php +++ b/lib/Horde/Core/ActiveSync/Connector.php @@ -539,7 +539,7 @@ public function resolveRecipient($query, array $opts = []) foreach ($sources as $source) { $fields[$source] = ['email']; } - $returnFields = ['name', 'email', 'alias', 'smimePublicKey']; + $returnFields = ['name', 'email', 'alias', 'smimePublicKey', 'source']; if (!empty($opts['pictures'])) { $returnFields[] = 'photo'; } From 06220d419d45023d589a7efd950b78e551a4278c Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 16 Feb 2026 18:15:27 -0500 Subject: [PATCH 4/4] fix: Correct maximum photo size check in _searchGal() --- lib/Horde/Core/ActiveSync/Driver.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/Horde/Core/ActiveSync/Driver.php b/lib/Horde/Core/ActiveSync/Driver.php index 597e51c2..3ba6b862 100644 --- a/lib/Horde/Core/ActiveSync/Driver.php +++ b/lib/Horde/Core/ActiveSync/Driver.php @@ -3700,13 +3700,16 @@ protected function _searchGal(array $query) } elseif (!empty($query[Horde_ActiveSync_Request_Search::SEARCH_MAXPICTURES]) && $picture_count > $query[Horde_ActiveSync_Request_Search::SEARCH_MAXPICTURES]) { $picture->status = Horde_ActiveSync_Status::PICTURE_LIMIT_REACHED; - } elseif (!empty($query[Horde_ActiveSync_Request_Search::SEARCH_MAXSIZE]) && - strlen($row['photo']) > $query[Horde_ActiveSync_Request_Search::SEARCH_MAXSIZE]) { - $picture->status = Horde_ActiveSync_Status::PICTURE_TOO_LARGE; } else { - $picture->data = base64_encode($row['photo']['load']['data']); - $picture->status = Horde_ActiveSync_Status::PICTURE_SUCCESS; - ++$picture_count; + $data = $row['photo']['load']['data']; + if (!empty($query[Horde_ActiveSync_Request_Search::SEARCH_MAXSIZE]) && + strlen($data) > $query[Horde_ActiveSync_Request_Search::SEARCH_MAXSIZE]) { + $picture->status = Horde_ActiveSync_Status::PICTURE_TOO_LARGE; + } else { + $picture->data = base64_encode($data); + $picture->status = Horde_ActiveSync_Status::PICTURE_SUCCESS; + ++$picture_count; + } } $entry[Horde_ActiveSync::GAL_PICTURE] = $picture; }