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