1<?php 2 3/** 4 * This file is part of the FreeDSx LDAP package. 5 * 6 * (c) Chad Sikorra <Chad.Sikorra@gmail.com> 7 * 8 * For the full copyright and license information, please view the LICENSE 9 * file that was distributed with this source code. 10 */ 11 12namespace FreeDSx\Ldap\Protocol\ServerProtocolHandler; 13 14use FreeDSx\Ldap\Control\Control; 15use FreeDSx\Ldap\Control\PagingControl; 16use FreeDSx\Ldap\Entry\Entries; 17use FreeDSx\Ldap\Exception\OperationException; 18use FreeDSx\Ldap\Exception\RuntimeException; 19use FreeDSx\Ldap\Operation\Request\SearchRequest; 20use FreeDSx\Ldap\Operation\Response\SearchResultDone; 21use FreeDSx\Ldap\Operation\Response\SearchResultEntry; 22use FreeDSx\Ldap\Operation\ResultCode; 23use FreeDSx\Ldap\Protocol\LdapMessageRequest; 24use FreeDSx\Ldap\Protocol\LdapMessageResponse; 25use FreeDSx\Ldap\Protocol\Queue\ServerQueue; 26 27trait ServerSearchTrait 28{ 29 /** 30 * @param Entries $entries 31 * @param LdapMessageRequest $message 32 * @param ServerQueue $queue 33 * @return void 34 */ 35 private function sendEntriesToClient( 36 Entries $entries, 37 LdapMessageRequest $message, 38 ServerQueue $queue, 39 Control ...$controls 40 ): void { 41 $messages = []; 42 43 foreach ($entries->toArray() as $entry) { 44 $messages[] = new LdapMessageResponse( 45 $message->getMessageId(), 46 new SearchResultEntry($entry) 47 ); 48 } 49 50 $messages[] = new LdapMessageResponse( 51 $message->getMessageId(), 52 new SearchResultDone(ResultCode::SUCCESS), 53 ...$controls 54 ); 55 56 $queue->sendMessage(...$messages); 57 } 58 59 /** 60 * @param LdapMessageRequest $message 61 * @return SearchRequest 62 */ 63 private function getSearchRequestFromMessage(LdapMessageRequest $message): SearchRequest 64 { 65 $request = $message->getRequest(); 66 67 if (!$request instanceof SearchRequest) { 68 throw new RuntimeException(sprintf( 69 'Expected a search request, but got %s.', 70 get_class($request) 71 )); 72 } 73 return $request; 74 } 75 76 /** 77 * @param LdapMessageRequest $message 78 * @return PagingControl 79 * @throws OperationException 80 */ 81 private function getPagingControlFromMessage(LdapMessageRequest $message): PagingControl 82 { 83 $pagingControl = $message->controls()->get(Control::OID_PAGING); 84 85 if (!$pagingControl instanceof PagingControl) { 86 throw new OperationException( 87 'The paging control was expected, but not received.', 88 ResultCode::PROTOCOL_ERROR 89 ); 90 } 91 92 return $pagingControl; 93 } 94} 95