diff --git a/lib/Horde/ActiveSync/Request/Settings.php b/lib/Horde/ActiveSync/Request/Settings.php index 98deac92..22130d9c 100644 --- a/lib/Horde/ActiveSync/Request/Settings.php +++ b/lib/Horde/ActiveSync/Request/Settings.php @@ -350,9 +350,19 @@ protected function _getOofObject($info) } $msg = Horde_ActiveSync::messageFactory('OofMessage'); $msg->internal = ''; - $msg->enabled = $info['oofmsgs'][0]['enabled'] ? 1 : "0"; - $msg->reply = $info['oofmsgs'][0]['replymessage']; - $msg->bodytype = 'text'; + $oofMsgs = $info->get('oofmsgs', []); + $oofMsg = (is_array($oofMsgs) && array_key_exists(0, $oofMsgs)) + ? $oofMsgs[0] + : null; + if (is_array($oofMsg)) { + $msg->enabled = $oofMsg['enabled'] ? 1 : '0'; + $msg->reply = $oofMsg['replymessage'] ?? ''; + $msg->bodytype = $oofMsg['bodytype'] ?? 'text'; + } else { + $msg->enabled = '0'; + $msg->reply = ''; + $msg->bodytype = 'text'; + } $oof->messages[] = $msg; return $oof; diff --git a/test/unit/Horde/ActiveSync/Request/SettingsRequestTest.php b/test/unit/Horde/ActiveSync/Request/SettingsRequestTest.php new file mode 100644 index 00000000..32b90b46 --- /dev/null +++ b/test/unit/Horde/ActiveSync/Request/SettingsRequestTest.php @@ -0,0 +1,74 @@ + + * @license http://www.horde.org/licenses/gpl GPLv2 + * @copyright 2026 The Horde Project (http://www.horde.org/) + * @package ActiveSync + */ + +namespace Horde\ActiveSync\Request; + +use Horde_ActiveSync_Request_Settings; +use PHPUnit\Framework\Attributes\CoversClass; +use PHPUnit\Framework\TestCase; +use ReflectionClass; + +#[CoversClass(Horde_ActiveSync_Request_Settings::class)] +class SettingsRequestTest extends TestCase +{ + public function testGetOofObjectDefaultsWhenNoMessagesConfigured() + { + $oof = $this->_getOofObject([ + 'status' => Horde_ActiveSync_Request_Settings::STATUS_SUCCESS, + 'oofstate' => Horde_ActiveSync_Request_Settings::OOF_STATE_DISABLED, + 'oofmsgs' => [], + ]); + + $this->assertSame( + Horde_ActiveSync_Request_Settings::OOF_STATE_DISABLED, + $oof->state + ); + $this->assertCount(1, $oof->messages); + $this->assertSame('0', $oof->messages[0]->enabled); + $this->assertSame('', $oof->messages[0]->reply); + $this->assertSame('text', $oof->messages[0]->bodytype); + } + + public function testGetOofObjectUsesConfiguredMessage() + { + $oof = $this->_getOofObject([ + 'status' => Horde_ActiveSync_Request_Settings::STATUS_SUCCESS, + 'oofstate' => Horde_ActiveSync_Request_Settings::OOF_STATE_ENABLED, + 'oofmsgs' => [ + [ + 'enabled' => true, + 'replymessage' => 'Out of office.', + 'bodytype' => 'HTML', + ], + ], + ]); + + $this->assertSame(1, $oof->messages[0]->enabled); + $this->assertSame('Out of office.', $oof->messages[0]->reply); + $this->assertSame('HTML', $oof->messages[0]->bodytype); + } + + /** + * @param array $info + * + * @return \Horde_ActiveSync_Message_Oof + */ + protected function _getOofObject(array $info) + { + $request = (new ReflectionClass(Horde_ActiveSync_Request_Settings::class)) + ->newInstanceWithoutConstructor(); + $method = (new ReflectionClass(Horde_ActiveSync_Request_Settings::class)) + ->getMethod('_getOofObject'); + $method->setAccessible(true); + + return $method->invoke($request, $info); + } +}