1<?php
2/**
3 * This file is part of the FreeDSx LDAP package.
4 *
5 * (c) Chad Sikorra <Chad.Sikorra@gmail.com>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11namespace FreeDSx\Ldap\Protocol\Factory;
12
13use FreeDSx\Ldap\Operation\LdapResult;
14use FreeDSx\Ldap\Operation\Request\AddRequest;
15use FreeDSx\Ldap\Operation\Request\BindRequest;
16use FreeDSx\Ldap\Operation\Request\CompareRequest;
17use FreeDSx\Ldap\Operation\Request\DeleteRequest;
18use FreeDSx\Ldap\Operation\Request\ExtendedRequest;
19use FreeDSx\Ldap\Operation\Request\ModifyDnRequest;
20use FreeDSx\Ldap\Operation\Request\ModifyRequest;
21use FreeDSx\Ldap\Operation\Request\SearchRequest;
22use FreeDSx\Ldap\Operation\Response\AddResponse;
23use FreeDSx\Ldap\Operation\Response\BindResponse;
24use FreeDSx\Ldap\Operation\Response\CompareResponse;
25use FreeDSx\Ldap\Operation\Response\DeleteResponse;
26use FreeDSx\Ldap\Operation\Response\ExtendedResponse;
27use FreeDSx\Ldap\Operation\Response\ModifyDnResponse;
28use FreeDSx\Ldap\Operation\Response\ModifyResponse;
29use FreeDSx\Ldap\Operation\Response\SearchResultDone;
30use FreeDSx\Ldap\Operation\ResultCode;
31use FreeDSx\Ldap\Protocol\LdapMessageRequest;
32use FreeDSx\Ldap\Protocol\LdapMessageResponse;
33
34/**
35 * For a specific request and result code/diagnostic, get the response object if possible.
36 *
37 * @author Chad Sikorra <Chad.Sikorra@gmail.com>
38 */
39class ResponseFactory
40{
41    /**
42     * Retrieve the expected response type for the request that was given.
43     */
44    public function getStandardResponse(LdapMessageRequest $message, int $resultCode = ResultCode::SUCCESS, string $diagnostic = ''): LdapMessageResponse
45    {
46        $response = null;
47        $request = $message->getRequest();
48
49        if ($request instanceof BindRequest) {
50            $response = new BindResponse(new LdapResult($resultCode, '', $diagnostic));
51        } elseif ($request instanceof SearchRequest) {
52            $response = new SearchResultDone($resultCode, '', $diagnostic);
53        } elseif ($request instanceof AddRequest) {
54            $response = new AddResponse($resultCode, $request->getEntry()->getDn()->toString(), $diagnostic);
55        } elseif ($request instanceof CompareRequest) {
56            $response = new CompareResponse($resultCode, $request->getDn()->toString(), $diagnostic);
57        } elseif ($request instanceof DeleteRequest) {
58            $response = new DeleteResponse($resultCode, $request->getDn()->toString(), $diagnostic);
59        } elseif ($request instanceof ModifyDnRequest) {
60            $response = new ModifyDnResponse($resultCode, $request->getDn()->toString(), $diagnostic);
61        } elseif ($request instanceof ModifyRequest) {
62            $response = new ModifyResponse($resultCode, $request->getDn()->toString(), $diagnostic);
63        } elseif ($request instanceof ExtendedRequest) {
64            $response = new ExtendedResponse(new LdapResult($resultCode, '', $diagnostic));
65        } else {
66            return $this->getExtendedError('Invalid request.', ResultCode::OPERATIONS_ERROR);
67        }
68
69        return new LdapMessageResponse(
70            $message->getMessageId(),
71            $response
72        );
73    }
74
75    /**
76     * Retrieve an extended error, which has a message ID of zero.
77     */
78    public function getExtendedError(string $message, int $errorCode, ?string $responseName = null): LdapMessageResponse
79    {
80        return new LdapMessageResponse(
81            0,
82            new ExtendedResponse(new LdapResult($errorCode, '', $message), $responseName)
83        );
84    }
85}
86