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