Skip to content

Commit ec9581c

Browse files
add hcs order type
1 parent 9ddbd3a commit ec9581c

File tree

10 files changed

+248
-42
lines changed

10 files changed

+248
-42
lines changed

src/Contracts/EbicsClientInterface.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,23 @@ public function FUL(
377377
?RequestContext $context = null
378378
): UploadOrderResult;
379379

380+
/**
381+
* Standard order type for renewing user certificates.
382+
*
383+
* @param SignatureInterface $signatureA
384+
* @param SignatureInterface $signatureE
385+
* @param SignatureInterface $signatureX
386+
* @param RequestContext|null $context
387+
*
388+
* @return UploadOrderResult
389+
*/
390+
public function HCS(
391+
SignatureInterface $signatureA,
392+
SignatureInterface $signatureE,
393+
SignatureInterface $signatureX,
394+
?RequestContext $context = null
395+
): UploadOrderResult;
396+
380397
/**
381398
* Upload initiation of the credit transfer per SEPA.
382399
* specification set by the European Payment Council or Die Deutsche Kreditwirtschaft (DK (German)).

src/EbicsClient.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
use EbicsApi\Ebics\Models\Bank;
4040
use EbicsApi\Ebics\Models\Crypt\Key;
4141
use EbicsApi\Ebics\Models\Crypt\RSA;
42+
use EbicsApi\Ebics\Models\CustomerHCS;
4243
use EbicsApi\Ebics\Models\DownloadOrderResult;
4344
use EbicsApi\Ebics\Models\DownloadSegment;
4445
use EbicsApi\Ebics\Models\DownloadTransaction;
@@ -154,6 +155,43 @@ public function __construct(Bank $bank, User $user, Keyring $keyring, array $opt
154155
$this->httpClient = $options['http_client'] ?? new CurlHttpClient();
155156
}
156157

158+
public function HCS(
159+
SignatureInterface $signatureA,
160+
SignatureInterface $signatureE,
161+
SignatureInterface $signatureX,
162+
?RequestContext $context = null
163+
): UploadOrderResult
164+
{
165+
$context = $this->requestFactory->prepareStandardContext($context);
166+
$context->setWithES(true);
167+
168+
$orderData = new CustomerHCS();
169+
$this->orderDataHandler->handleHCS(
170+
$orderData,
171+
$signatureA,
172+
$signatureE,
173+
$signatureX,
174+
$context->getDateTime()
175+
);
176+
177+
$transaction = $this->uploadTransaction(
178+
function (UploadTransaction $transaction) use ($orderData, $context) {
179+
$transaction->setOrderData($orderData->getContent());
180+
$transaction->setNumSegments(1);
181+
$transaction->setDigest($this->cryptService->hash($transaction->getOrderData()));
182+
183+
return $this->requestFactory->createHCS($transaction, $context);
184+
}
185+
);
186+
187+
$this->keyring->setUserSignatureA($signatureA);
188+
$this->keyring->setUserSignatureE($signatureE);
189+
$this->keyring->setUserSignatureX($signatureX);
190+
191+
return $this->createUploadOrderResult($transaction, $orderData);
192+
}
193+
194+
157195
/**
158196
* @inheritDoc
159197
* @throws EbicsException

src/Factories/RequestFactory.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -709,6 +709,8 @@ abstract public function createCDB(UploadTransaction $transaction, RequestContex
709709

710710
abstract public function createCIP(UploadTransaction $transaction, RequestContext $context): Request;
711711

712+
abstract public function createHCS(UploadTransaction $transaction, RequestContext $context): Request;
713+
712714
abstract public function createXE2(UploadTransaction $transaction, RequestContext $context): Request;
713715

714716
abstract public function createXE3(UploadTransaction $transaction, RequestContext $context): Request;

src/Factories/RequestFactoryV24.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,9 @@ public function createYCT(UploadTransaction $transaction, RequestContext $contex
173173

174174
return $this->createFUL($transaction, $context);
175175
}
176+
177+
public function createHCS(UploadTransaction $transaction, RequestContext $context): Request
178+
{
179+
throw new LogicException('Method not implemented yet for EBICS 2.4');
180+
}
176181
}

src/Factories/RequestFactoryV25.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,27 @@ private function buildDownloadRequest(RequestContext $context): Request
366366
->popInstance();
367367
}
368368

369+
public function createHCS(
370+
UploadTransaction $transaction,
371+
RequestContext $context,
372+
): Request {
373+
$signatureData = new UserSignature();
374+
$this->userSignatureHandler->handle($signatureData, $transaction->getDigest());
375+
376+
$context
377+
->setOrderType('HCS')
378+
->setWithES(true)
379+
->setBank($this->bank)
380+
->setUser($this->user)
381+
->setKeyring($this->keyring)
382+
->setTransactionKey($transaction->getKey())
383+
->setNumSegments($transaction->getNumSegments())
384+
->setSignatureData($signatureData);
385+
386+
return $this->buildUploadRequest($context);
387+
}
388+
389+
369390
/**
370391
* @throws EbicsException
371392
*/

src/Factories/RequestFactoryV30.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use EbicsApi\Ebics\Models\Http\Request;
2020
use EbicsApi\Ebics\Models\UploadTransaction;
2121
use EbicsApi\Ebics\Models\UserSignature;
22+
use LogicException;
2223

2324
/**
2425
* Ebics 3.0 RequestFactory.
@@ -386,6 +387,11 @@ public function createYCT(UploadTransaction $transaction, RequestContext $contex
386387
return $this->createBTU($transaction, $context);
387388
}
388389

390+
public function createHCS(UploadTransaction $transaction, RequestContext $context): Request
391+
{
392+
throw new LogicException('Method not implemented yet for EBICS 2.5');
393+
}
394+
389395
public function prepareDownloadContext(?RequestContext $requestContext = null): RequestContext
390396
{
391397
$requestContext = $this->prepareStandardContext($requestContext);

src/Handlers/OrderDataHandler.php

Lines changed: 91 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
use EbicsApi\Ebics\Factories\SignatureFactory;
1515
use EbicsApi\Ebics\Handlers\Traits\H00XTrait;
1616
use EbicsApi\Ebics\Models\CustomerH3K;
17+
use EbicsApi\Ebics\Models\CustomerHCS;
1718
use EbicsApi\Ebics\Models\CustomerHIA;
1819
use EbicsApi\Ebics\Models\CustomerINI;
1920
use EbicsApi\Ebics\Models\Keyring;
2021
use EbicsApi\Ebics\Models\User;
22+
use EbicsApi\Ebics\Models\XmlData;
2123
use EbicsApi\Ebics\Models\XmlDocument;
2224
use EbicsApi\Ebics\Services\CryptService;
2325

@@ -56,13 +58,16 @@ public function __construct(
5658
$this->bigIntegerFactory = $bigIntegerFactory;
5759
}
5860

59-
abstract protected function createSignaturePubKeyOrderData(CustomerINI $xml): DOMElement;
61+
abstract protected function createSignaturePubKeyOrderData(XmlData $xml): DOMElement;
6062

61-
abstract protected function handleINISignaturePubKey(
63+
abstract protected function createHCSRequestOrderData(XmlData $xml): DOMElement;
64+
65+
abstract protected function handleSignaturePubKey(
6266
DOMElement $xmlSignaturePubKeyInfo,
63-
CustomerINI $xml,
67+
XmlData $xml,
6468
SignatureInterface $certificateA,
65-
DateTimeInterface $dateTime
69+
DateTimeInterface $dateTime,
70+
string $ns = ''
6671
): void;
6772

6873
/**
@@ -89,7 +94,7 @@ public function handleINI(CustomerINI $xml, SignatureInterface $certificateA, Da
8994
$this->handleX509Data($xmlSignaturePubKeyInfo, $xml, $certificateA);
9095
}
9196

92-
$this->handleINISignaturePubKey($xmlSignaturePubKeyInfo, $xml, $certificateA, $dateTime);
97+
$this->handleSignaturePubKey($xmlSignaturePubKeyInfo, $xml, $certificateA, $dateTime);
9398

9499
// Add SignatureVersion to SignaturePubKeyInfo.
95100
$xmlSignatureVersion = $xml->createElement('SignatureVersion');
@@ -111,18 +116,20 @@ protected function createHIARequestOrderData(CustomerHIA $xml): DOMElement
111116
);
112117
}
113118

114-
abstract protected function handleHIAAuthenticationPubKey(
119+
abstract protected function handleAuthenticationPubKey(
115120
DOMElement $xmlAuthenticationPubKeyInfo,
116-
CustomerHIA $xml,
121+
XmlData $xml,
117122
SignatureInterface $certificateX,
118-
DateTimeInterface $dateTime
123+
DateTimeInterface $dateTime,
124+
string $ns = ''
119125
): void;
120126

121-
abstract protected function handleHIAEncryptionPubKey(
127+
abstract protected function handleEncryptionPubKey(
122128
DOMElement $xmlEncryptionPubKeyInfo,
123-
CustomerHIA $xml,
129+
XmlData $xml,
124130
SignatureInterface $certificateE,
125-
DateTimeInterface $dateTime
131+
DateTimeInterface $dateTime,
132+
string $ns = ''
126133
): void;
127134

128135
/**
@@ -154,7 +161,7 @@ public function handleHIA(
154161
$this->handleX509Data($xmlAuthenticationPubKeyInfo, $xml, $certificateX);
155162
}
156163

157-
$this->handleHIAAuthenticationPubKey($xmlAuthenticationPubKeyInfo, $xml, $certificateX, $dateTime);
164+
$this->handleAuthenticationPubKey($xmlAuthenticationPubKeyInfo, $xml, $certificateX, $dateTime);
158165

159166
// Add AuthenticationVersion to AuthenticationPubKeyInfo.
160167
$xmlAuthenticationVersion = $xml->createElement('AuthenticationVersion');
@@ -169,7 +176,7 @@ public function handleHIA(
169176
$this->handleX509Data($xmlEncryptionPubKeyInfo, $xml, $certificateE);
170177
}
171178

172-
$this->handleHIAEncryptionPubKey($xmlEncryptionPubKeyInfo, $xml, $certificateE, $dateTime);
179+
$this->handleEncryptionPubKey($xmlEncryptionPubKeyInfo, $xml, $certificateE, $dateTime);
173180

174181
// Add EncryptionVersion to EncryptionPubKeyInfo.
175182
$xmlEncryptionVersion = $xml->createElement('EncryptionVersion');
@@ -183,6 +190,77 @@ public function handleHIA(
183190
$this->handleUserId($xmlHIARequestOrderData, $xml);
184191
}
185192

193+
/**
194+
* Adds OrderData DOM elements to XML DOM for HCS request.
195+
*
196+
* @throws EbicsException
197+
*/
198+
public function handleHCS(
199+
CustomerHCS $xml,
200+
SignatureInterface $certificateA,
201+
SignatureInterface $certificateE,
202+
SignatureInterface $certificateX,
203+
DateTimeInterface $dateTime
204+
): void {
205+
// Add HCSRequestOrderData to root.
206+
$xmlHCSRequestOrderData = $this->createHCSRequestOrderData($xml);
207+
$xml->appendChild($xmlHCSRequestOrderData);
208+
209+
210+
// Add AuthenticationPubKeyInfo to HIARequestOrderData.
211+
$xmlAuthenticationPubKeyInfo = $xml->createElement('AuthenticationPubKeyInfo');
212+
$xmlHCSRequestOrderData->appendChild($xmlAuthenticationPubKeyInfo);
213+
214+
if ($this->keyring->isCertified()) {
215+
$this->handleX509Data($xmlAuthenticationPubKeyInfo, $xml, $certificateX);
216+
}
217+
218+
$this->handleAuthenticationPubKey($xmlAuthenticationPubKeyInfo, $xml, $certificateX, $dateTime);
219+
220+
// Add AuthenticationVersion to AuthenticationPubKeyInfo.
221+
$xmlAuthenticationVersion = $xml->createElement('AuthenticationVersion');
222+
$xmlAuthenticationVersion->nodeValue = $this->keyring->getUserSignatureXVersion();
223+
$xmlAuthenticationPubKeyInfo->appendChild($xmlAuthenticationVersion);
224+
225+
226+
// Add EncryptionPubKeyInfo to HCSRequestOrderData.
227+
$xmlEncryptionPubKeyInfo = $xml->createElement('EncryptionPubKeyInfo');
228+
$xmlHCSRequestOrderData->appendChild($xmlEncryptionPubKeyInfo);
229+
230+
if ($this->keyring->isCertified()) {
231+
$this->handleX509Data($xmlEncryptionPubKeyInfo, $xml, $certificateE);
232+
}
233+
234+
$this->handleEncryptionPubKey($xmlEncryptionPubKeyInfo, $xml, $certificateE, $dateTime);
235+
236+
// Add EncryptionVersion to EncryptionPubKeyInfo.
237+
$xmlEncryptionVersion = $xml->createElement('EncryptionVersion');
238+
$xmlEncryptionVersion->nodeValue = $this->keyring->getUserSignatureEVersion();
239+
$xmlEncryptionPubKeyInfo->appendChild($xmlEncryptionVersion);
240+
241+
242+
// Add SignaturePubKeyInfo to SignaturePubKeyOrderData.
243+
$xmlSignaturePubKeyInfo = $xml->createElement('esig:SignaturePubKeyInfo');
244+
$xmlHCSRequestOrderData->appendChild($xmlSignaturePubKeyInfo);
245+
246+
if ($this->keyring->isCertified()) {
247+
$this->handleX509Data($xmlSignaturePubKeyInfo, $xml, $certificateA);
248+
}
249+
250+
$this->handleSignaturePubKey($xmlSignaturePubKeyInfo, $xml, $certificateA, $dateTime, 'esig');
251+
252+
// Add SignatureVersion to SignaturePubKeyInfo.
253+
$xmlSignatureVersion = $xml->createElement('esig:SignatureVersion');
254+
$xmlSignatureVersion->nodeValue = $this->keyring->getUserSignatureAVersion();
255+
$xmlSignaturePubKeyInfo->appendChild($xmlSignatureVersion);
256+
257+
// Add PartnerID to HIARequestOrderData.
258+
$this->handlePartnerId($xmlHCSRequestOrderData, $xml);
259+
260+
// Add UserID to HIARequestOrderData.
261+
$this->handleUserId($xmlHCSRequestOrderData, $xml);
262+
}
263+
186264
/**
187265
* Adds OrderData DOM elements to XML DOM for H3K request.
188266
*

0 commit comments

Comments
 (0)