Skip to content

Commit e812223

Browse files
committed
support BTUOrderParams for EBICS 3.0 request
1 parent 9fb00fc commit e812223

9 files changed

+185
-145
lines changed

src/main/java/org/kopi/ebics/client/EbicsClient.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ public void revokeSubscriber(User user, Product product) throws Exception {
372372
try {
373373
keyManager.lockAccess();
374374
} catch (Exception e) {
375-
log.error(messages.getString("spr.send.error", userId), e);
375+
log.error(messages.getString("spr.send.error", userId));
376376
throw e;
377377
}
378378

@@ -383,7 +383,7 @@ public void revokeSubscriber(User user, Product product) throws Exception {
383383
* Sends a file to the ebics bank server
384384
* @throws Exception
385385
*/
386-
public void sendFile(File file, User user, Product product, EbicsOrderType orderType) throws Exception {
386+
public void sendFile(File file, User user, Product product, EbicsOrderType orderType, EbicsUploadParams params) throws Exception {
387387
EbicsSession session = createSession(user, product);
388388

389389
FileTransfer transferManager = new FileTransfer(session);
@@ -392,16 +392,28 @@ public void sendFile(File file, User user, Product product, EbicsOrderType order
392392
configuration.getTransferTraceDirectory(user));
393393

394394
try {
395-
transferManager.sendFile(IOUtils.getFileContent(file), orderType);
395+
transferManager.sendFile(IOUtils.getFileContent(file), orderType, params);
396396
} catch (IOException | EbicsException e) {
397397
log
398-
.error(messages.getString("upload.file.error", file.getAbsolutePath()), e);
398+
.error(messages.getString("upload.file.error", file.getAbsolutePath()));
399399
throw e;
400400
}
401401
}
402402

403+
public void sendFile(File file, EbicsOrderType orderType, EbicsUploadParams params) throws Exception {
404+
sendFile(file, defaultUser, defaultProduct, orderType, params);
405+
}
406+
403407
public void sendFile(File file, EbicsOrderType orderType) throws Exception {
404-
sendFile(file, defaultUser, defaultProduct, orderType);
408+
EbicsUploadParams params;
409+
if (orderType == OrderType.XE2) {
410+
var orderParams = new EbicsUploadParams.OrderParams("MCT", "CH", null, "pain.001",
411+
"03");
412+
params = new EbicsUploadParams(null, orderParams);
413+
} else {
414+
params = new EbicsUploadParams(defaultUser.getPartner().nextOrderId(), null);
415+
}
416+
sendFile(file, defaultUser, defaultProduct, orderType, params);
405417
}
406418

407419
public void fetchFile(File file, User user, Product product, EbicsOrderType orderType,
@@ -660,8 +672,7 @@ public static void main(String[] args) throws Exception {
660672
OrderType.XE2, OrderType.CCT);
661673
for (EbicsOrderType type : sendFileOrders) {
662674
if (hasOption(cmd, type)) {
663-
client.sendFile(new File(inputFileValue), client.defaultUser,
664-
client.defaultProduct, type);
675+
client.sendFile(new File(inputFileValue), type);
665676
break;
666677
}
667678
}

src/main/java/org/kopi/ebics/client/FileTransfer.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,13 +91,11 @@ public FileTransfer(EbicsSession session) {
9191
* @throws IOException
9292
* @throws EbicsException
9393
*/
94-
public void sendFile(byte[] content, EbicsOrderType orderType)
94+
public void sendFile(byte[] content, EbicsOrderType orderType, EbicsUploadParams params)
9595
throws IOException, EbicsException
9696
{
9797
HttpRequestSender sender = new HttpRequestSender(session);
98-
UploadInitializationRequestElement initializer = new UploadInitializationRequestElement(session,
99-
orderType,
100-
content);
98+
var initializer = new UploadInitializationRequestElement(session, orderType, params, content);
10199
initializer.build();
102100
initializer.validate();
103101
session.getConfiguration().getTraceManager().trace(initializer.getUserSignature());

src/main/java/org/kopi/ebics/xml/DefaultEbicsRootElement.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
import java.io.OutputStream;
2424
import java.io.PrintStream;
2525
import java.math.BigInteger;
26+
import java.nio.charset.StandardCharsets;
2627
import java.util.ArrayList;
2728
import java.util.HashMap;
2829
import java.util.Iterator;
30+
import java.util.List;
2931
import java.util.Map;
3032

3133
import javax.xml.namespace.QName;
@@ -83,6 +85,10 @@ public byte[] prettyPrint() {
8385
}
8486
}
8587

88+
public String toPrettyString() {
89+
return new String(prettyPrint(), StandardCharsets.UTF_8);
90+
}
91+
8692
/**
8793
* Inserts a schema location to the current ebics root element.
8894
* @param namespaceURI the name space URI
@@ -159,7 +165,7 @@ public void addNamespaceDecl(String prefix, String uri) {
159165

160166
@Override
161167
public void validate() throws EbicsException {
162-
ArrayList<XmlError> validationMessages = new ArrayList<>();
168+
List<XmlError> validationMessages = new ArrayList<>();
163169
boolean isValid = document.validate(new XmlOptions().setErrorListener(validationMessages));
164170

165171
if (!isValid) {
@@ -172,7 +178,8 @@ public void validate() throws EbicsException {
172178
message.append(iter.next().getMessage());
173179
}
174180

175-
throw new EbicsException(message.toString());
181+
throw new EbicsException(
182+
"Invalid " + this.getClass().getSimpleName() + ": " + message);
176183
}
177184
}
178185

src/main/java/org/kopi/ebics/xml/DownloadInitializationRequestElement.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.kopi.ebics.schema.h005.EbicsRequestDocument.EbicsRequest.Body;
2727
import org.kopi.ebics.schema.h005.EbicsRequestDocument.EbicsRequest.Header;
2828
import org.kopi.ebics.schema.h005.MutableHeaderType;
29+
import org.kopi.ebics.schema.h005.StandardOrderParamsDocument;
2930
import org.kopi.ebics.schema.h005.StandardOrderParamsType;
3031
import org.kopi.ebics.schema.h005.StaticHeaderOrderDetailsType;
3132
import org.kopi.ebics.schema.h005.StaticHeaderType;
@@ -85,7 +86,8 @@ public void buildInitialization() throws EbicsException {
8586
//FIXME Some banks cannot handle OrderID element in download process. Add parameter in configuration!!!
8687
orderDetails = EbicsXmlFactory.createStaticHeaderOrderDetailsType(null,//session.getUser().getPartner().nextOrderId(),
8788
type,
88-
standardOrderParamsType);
89+
standardOrderParamsType,
90+
StandardOrderParamsDocument.type);
8991

9092
xstatic = EbicsXmlFactory.createStaticHeaderType(session.getBankID(),
9193
nonce,

src/main/java/org/kopi/ebics/xml/EbicsXmlFactory.java

Lines changed: 44 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@
3333
import org.ebics.s002.UserSignatureDataDocument;
3434
import org.ebics.s002.UserSignatureDataSigBookType;
3535
import org.kopi.ebics.schema.h005.AuthenticationPubKeyInfoType;
36+
import org.kopi.ebics.schema.h005.BTUOrderParamsDocument;
37+
import org.kopi.ebics.schema.h005.BTUParamsType;
38+
import org.kopi.ebics.schema.h005.DataDigestType;
3639
import org.kopi.ebics.schema.h005.DataEncryptionInfoType.EncryptionPubKeyDigest;
3740
import org.kopi.ebics.schema.h005.DataTransferRequestType;
3841
import org.kopi.ebics.schema.h005.DataTransferRequestType.DataEncryptionInfo;
@@ -51,6 +54,7 @@
5154
import org.kopi.ebics.schema.h005.EncryptionPubKeyInfoType;
5255
import org.kopi.ebics.schema.h005.HIARequestOrderDataDocument;
5356
import org.kopi.ebics.schema.h005.HIARequestOrderDataType;
57+
import org.kopi.ebics.schema.h005.MessageType;
5458
import org.kopi.ebics.schema.h005.MutableHeaderType;
5559
import org.kopi.ebics.schema.h005.MutableHeaderType.SegmentNumber;
5660
import org.kopi.ebics.schema.h005.NoPubKeyDigestsRequestStaticHeaderType;
@@ -784,19 +788,19 @@ public static StaticHeaderType createStaticHeaderType(String hostId, byte[] nonc
784788
int numSegments, String partnerId, StaticHeaderType.Product product, String securityMedium,
785789
String userId, Calendar timestamp, StaticHeaderOrderDetailsType orderDetails,
786790
StaticHeaderType.BankPubKeyDigests bankPubKeyDigests) {
787-
StaticHeaderType newStaticHeaderType = StaticHeaderType.Factory.newInstance();
788-
newStaticHeaderType.setHostID(hostId);
789-
newStaticHeaderType.setNonce(nonce);
790-
newStaticHeaderType.setNumSegments(numSegments);
791-
newStaticHeaderType.setPartnerID(partnerId);
792-
newStaticHeaderType.setProduct(product);
793-
newStaticHeaderType.setSecurityMedium(securityMedium);
794-
newStaticHeaderType.setUserID(userId);
795-
newStaticHeaderType.setTimestamp(timestamp);
796-
newStaticHeaderType.setOrderDetails(orderDetails);
797-
newStaticHeaderType.setBankPubKeyDigests(bankPubKeyDigests);
791+
StaticHeaderType header = StaticHeaderType.Factory.newInstance();
792+
header.setHostID(hostId);
793+
header.setNonce(nonce);
794+
header.setNumSegments(numSegments);
795+
header.setPartnerID(partnerId);
796+
header.setProduct(product);
797+
header.setSecurityMedium(securityMedium);
798+
header.setUserID(userId);
799+
header.setTimestamp(timestamp);
800+
header.setOrderDetails(orderDetails);
801+
header.setBankPubKeyDigests(bankPubKeyDigests);
798802

799-
return newStaticHeaderType;
803+
return header;
800804
}
801805

802806
/**
@@ -881,17 +885,33 @@ public static StaticHeaderType createStaticHeaderType(String hostId, byte[] nonc
881885

882886
public static StaticHeaderOrderDetailsType createStaticHeaderOrderDetailsType(String orderId,
883887
StaticHeaderOrderDetailsType.AdminOrderType orderType,
884-
StandardOrderParamsType orderParams) {
888+
XmlObject orderParams, SchemaType orderParamsType) {
885889

886890
StaticHeaderOrderDetailsType type = StaticHeaderOrderDetailsType.Factory.newInstance();
887891
if (orderId != null) {
888892
type.setOrderID(orderId);
889893
}
890-
891-
type.setOrderParams(orderParams);
892-
var newInstance = StandardOrderParamsDocument.type.getDocumentElementName();
893-
qualifySubstitutionGroup(type.getOrderParams(), newInstance, null);
894894
type.setAdminOrderType(orderType);
895+
type.setOrderParams(orderParams);
896+
qualifySubstitutionGroup(type.getOrderParams(), orderParamsType.getDocumentElementName(), null);
897+
return type;
898+
}
899+
900+
public static BTUParamsType createBTUParams(String serviceName, String scope, String option,
901+
String messageName, String messageVersion) {
902+
var type = BTUParamsType.Factory.newInstance();
903+
var service = type.addNewService();
904+
service.setServiceName(serviceName);
905+
service.setScope(scope);
906+
if (option != null) {
907+
service.setServiceOption(option);
908+
}
909+
var msgType = MessageType.Factory.newInstance();
910+
911+
msgType.setStringValue(messageName);
912+
//msgType.setFormat(messageName);
913+
msgType.setVersion(messageVersion);
914+
service.setMsgName(msgType);
895915
return type;
896916
}
897917

@@ -1134,10 +1154,16 @@ public static EbicsRequestDocument.EbicsRequest.Body createEbicsRequestBody(
11341154
* @return the <code>DataTransferRequestType</code> XML object
11351155
*/
11361156
public static DataTransferRequestType createDataTransferRequestType(
1137-
DataEncryptionInfo dataEncryptionInfo, SignatureData signatureData) {
1157+
DataEncryptionInfo dataEncryptionInfo, SignatureData signatureData, String digestValue) {
11381158
DataTransferRequestType newDataTransferRequestType = DataTransferRequestType.Factory.newInstance();
11391159
newDataTransferRequestType.setDataEncryptionInfo(dataEncryptionInfo);
11401160
newDataTransferRequestType.setSignatureData(signatureData);
1161+
if (digestValue != null) {
1162+
var digest = DataDigestType.Factory.newInstance();
1163+
digest.setSignatureVersion("A005");
1164+
digest.setStringValue(digestValue);
1165+
newDataTransferRequestType.setDataDigest(digest);
1166+
}
11411167

11421168
return newDataTransferRequestType;
11431169
}

src/main/java/org/kopi/ebics/xml/InitializationRequestElement.java

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,16 @@ protected InitializationRequestElement(EbicsSession session,
6262
keySpec = new SecretKeySpec(key, "EAS");
6363
}
6464

65-
@Override
66-
public void build() throws EbicsException {
67-
SignedInfo signedInfo;
68-
69-
buildInitialization();
70-
signedInfo = new SignedInfo(session.getUser(), getDigest());
71-
signedInfo.build();
72-
((EbicsRequestDocument)document).getEbicsRequest().setAuthSignature(signedInfo.getSignatureType());
73-
((EbicsRequestDocument)document).getEbicsRequest().getAuthSignature().setSignatureValue(EbicsXmlFactory.createSignatureValueType(signedInfo.sign(toByteArray())));
74-
}
65+
@Override
66+
public void build() throws EbicsException {
67+
buildInitialization();
68+
SignedInfo signedInfo = new SignedInfo(session.getUser(), getDigest());
69+
signedInfo.build();
70+
var ebicsRequest = ((EbicsRequestDocument) document).getEbicsRequest();
71+
ebicsRequest.setAuthSignature(signedInfo.getSignatureType());
72+
ebicsRequest.getAuthSignature().setSignatureValue(
73+
EbicsXmlFactory.createSignatureValueType(signedInfo.sign(toByteArray())));
74+
}
7575

7676
@Override
7777
public String getName() {

src/main/java/org/kopi/ebics/xml/SPRRequestElement.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,19 @@
2929
import org.kopi.ebics.schema.h005.EbicsRequestDocument.EbicsRequest.Body;
3030
import org.kopi.ebics.schema.h005.EbicsRequestDocument.EbicsRequest.Header;
3131
import org.kopi.ebics.schema.h005.MutableHeaderType;
32+
import org.kopi.ebics.schema.h005.StandardOrderParamsDocument;
3233
import org.kopi.ebics.schema.h005.StandardOrderParamsType;
3334
import org.kopi.ebics.schema.h005.StaticHeaderOrderDetailsType;
3435
import org.kopi.ebics.schema.h005.StaticHeaderType;
3536
import org.kopi.ebics.schema.h005.StaticHeaderType.BankPubKeyDigests;
3637
import org.kopi.ebics.schema.h005.StaticHeaderType.BankPubKeyDigests.Authentication;
3738
import org.kopi.ebics.schema.h005.StaticHeaderType.BankPubKeyDigests.Encryption;
3839
import org.kopi.ebics.schema.h005.StaticHeaderType.Product;
39-
import org.kopi.ebics.session.EbicsSession;
40-
import org.kopi.ebics.session.OrderType;
41-
import org.kopi.ebics.utils.Utils;
42-
43-
40+
import org.kopi.ebics.session.EbicsSession;
41+
import org.kopi.ebics.session.OrderType;
42+
import org.kopi.ebics.utils.Utils;
43+
44+
4445
/**
4546
* The <code>SPRRequestElement</code> is the request element
4647
* for revoking a subscriber
@@ -53,7 +54,7 @@ public class SPRRequestElement extends InitializationRequestElement {
5354
* Constructs a new SPR request element.
5455
* @param session the current ebic session.
5556
*/
56-
public SPRRequestElement(EbicsSession session) throws EbicsException {
57+
public SPRRequestElement(EbicsSession session) {
5758
super(session, OrderType.SPR, "SPRRequest.xml");
5859
}
5960

@@ -97,7 +98,8 @@ public void buildInitialization() throws EbicsException {
9798
type.setStringValue(this.getType());
9899

99100
orderDetails = EbicsXmlFactory.createStaticHeaderOrderDetailsType(session.getUser().getPartner().nextOrderId(), type,
100-
standardOrderParamsType);
101+
standardOrderParamsType,
102+
StandardOrderParamsDocument.type);
101103
xstatic = EbicsXmlFactory.createStaticHeaderType(session.getBankID(),
102104
nonce,
103105
0,
@@ -116,7 +118,7 @@ public void buildInitialization() throws EbicsException {
116118
dataEncryptionInfo = EbicsXmlFactory.createDataEncryptionInfo(true,
117119
encryptionPubKeyDigest,
118120
generateTransactionKey());
119-
dataTransfer = EbicsXmlFactory.createDataTransferRequestType(dataEncryptionInfo, signatureData);
121+
dataTransfer = EbicsXmlFactory.createDataTransferRequestType(dataEncryptionInfo, signatureData, null);
120122
body = EbicsXmlFactory.createEbicsRequestBody(dataTransfer);
121123
request = EbicsXmlFactory.createEbicsRequest(session.getConfiguration().getRevision(),
122124
session.getConfiguration().getVersion(),

src/main/java/org/kopi/ebics/xml/TransferRequestElement.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ public byte[] getDigest() throws EbicsException {
8787

8888
try {
8989
return MessageDigest.getInstance("SHA-256", "BC").digest(Utils.canonize(toByteArray()));
90-
} catch (NoSuchAlgorithmException e) {
91-
throw new EbicsException(e.getMessage());
92-
} catch (NoSuchProviderException e) {
90+
} catch (NoSuchAlgorithmException | NoSuchProviderException e) {
9391
throw new EbicsException(e.getMessage());
9492
}
9593
}

0 commit comments

Comments
 (0)