HBCIUtils.log("process #1: adding new message with HKTAN(p=1,hash=...) before current message",HBCIUtils.LOG_DEBUG);
// neue msg erzeugen
additional_msg_tasks=new ArrayList<HBCIJobImpl>();
GVTAN2Step hktan = (GVTAN2Step) handler.newJob("TAN2Step");
// muessen wir explizit setzen, damit wir das HKTAN in der gleichen Version
// schicken, in der das HITANS kam.
hktan.setSegVersion(segversion);
hktan.setParam("process",process);
hktan.setParam("notlasttan","N");
// willuhn 2011-05-16
// Siehe FinTS_3.0_Security_Sicherheitsverfahren_PINTAN_Rel_20101027_final_version.pdf, Seite 58
int hktanVersion = Integer.parseInt(hktan.getSegVersion());
if (hktanVersion >= 5)
{
// Bis HKTAN4/hhd1.3 wurde das noch als Challenge-Parameter uebermittelt. Jetzt hat es einen
// eigenen Platz in den Job-Parametern
hktan.setParam("ordersegcode",task.getHBCICode());
// Zitat aus HITANS5: Diese Funktion erm�glicht das Sicherstellen einer g�ltigen Kontoverbindung
// z. B. f�r die Abrechnung von SMS-Kosten bereits vor Erzeugen und Versenden einer
// (ggf. kostenpflichtigen!) TAN.
// 0: Auftraggeberkonto darf nicht angegeben werden
// 2: Auftraggeberkonto muss angegeben werden, wenn im Gesch�ftsvorfall enthalten
String noa = secmechInfo.getProperty("needorderaccount","");
HBCIUtils.log("needorderaccount=" + noa,HBCIUtils.LOG_INFO);
if (noa.equals("2"))
{
Konto k = task.getOrderAccount();
if (k != null)
{
HBCIUtils.log("applying orderaccount to HKTAN for " + task.getHBCICode(),HBCIUtils.LOG_INFO);
hktan.setParam("orderaccount",k);
}
else
{
HBCIUtils.log("orderaccount needed, but not found in " + task.getHBCICode(),HBCIUtils.LOG_WARN);
}
}
}
// TODO: das f�r mehrfachsignaturen
// hktan.setParam("notlasttan","J");
// orderhash ermitteln
try {
// TODO: hier wird jetzt *immer* segnum=3 angenommen,
// kann in Einzelf�llen evtl. auch anders sein (?)
SEG seg=task.createJobSegment(3);
seg.validate();
String segdata=seg.toString(0);
HBCIUtils.log("calculating hash for jobsegment: "+segdata,HBCIUtils.LOG_DEBUG2);
// zu verwendenden Hash-Algorithmus von dem Wert "orderhashmode" aus den BPD abh�ngig machen
String orderhashmode=getOrderHashMode();
String alg=null;
String provider=null;
if (orderhashmode.equals("1")) {
alg="RIPEMD160";
provider="CryptAlgs4Java";
} else if (orderhashmode.equals("2")) {
alg="SHA-1";
}
HBCIUtils.log("using "+alg+"/"+provider+" for generating order hash", HBCIUtils.LOG_DEBUG);
MessageDigest digest=MessageDigest.getInstance(alg,provider);
digest.update(segdata.getBytes(Comm.ENCODING));
byte[] hash=digest.digest();
SEGFactory.getInstance().unuseObject(seg);
hktan.setParam("orderhash",new String(hash,Comm.ENCODING));
} catch (Exception e) {
throw new HBCI_Exception(e);
}
// TODO: evtl. listindex ermitteln
// hktan.setParam("listidx","");
// wenn needchallengeklass gesetzt ist:
if (secmechInfo.getProperty("needchallengeklass","N").equals("J"))
{
HBCIUtils.log("we are in PV #1, and a challenge klass is required",HBCIUtils.LOG_DEBUG);
ChallengeInfo cinfo = ChallengeInfo.getInstance();
cinfo.applyParams(task,hktan,secmechInfo);
}
// willuhn 2011-05-09: Bei Bedarf noch das TAN-Medium erfragen
applyTanMedia(hktan);
// hktan-job zur neuen msg hinzuf�gen
additional_msg_tasks.add(hktan);
// diese neue msg vor der aktuellen in die msg-queue einstellen
new_msgs.add(additional_msg_tasks);
// und gleich wieder auf null setzen, damit diese msg nicht
// sp�ter nochmal *nach* der aktuellen msg eingef�gt wird
additional_msg_tasks=null;
// den aktuellen task ganz normal zur aktuellen msg hinzuf�gen
new_msg_tasks.add(task);
} else {
// prozessvariante 2
HBCIUtils.log("process #2: adding new task HKTAN(p=4) to current message",HBCIUtils.LOG_DEBUG);
// den aktuellen task ganz normal zur aktuellen msg hinzuf�gen
new_msg_tasks.add(task);
// dazu noch einen hktan-job hinzuf�gen
GVTAN2Step hktan1 = (GVTAN2Step) handler.newJob("TAN2Step");
// muessen wir explizit setzen, damit wir das HKTAN in der gleichen Version
// schicken, in der das HITANS kam.
hktan1.setSegVersion(segversion);
hktan1.setParam("process","4");
// TODO: evtl. listindex ermitteln
// hktan1.setParam("listidx","");
// TODO: das f�r mehrfachsignaturen
// hktan1.setParam("notlasttan","N");
// willuhn 2011-05-09: Bei Bedarf noch das TAN-Medium erfragen
applyTanMedia(hktan1);
// den hktan-job zus�tzlich zur aktuellen msg hinzuf�gen
new_msg_tasks.add(hktan1);
// eine neue msg f�r das einreichen der tan erzeugen
HBCIUtils.log("creating new msg with HKTAN(p=2,orderref=DELAYED)",HBCIUtils.LOG_DEBUG);
additional_msg_tasks=new ArrayList<HBCIJobImpl>();
// HKTAN-job f�r das einreichen der TAN erzeugen
GVTAN2Step hktan2 = (GVTAN2Step) handler.newJob("TAN2Step");
// muessen wir explizit setzen, damit wir das HKTAN in der gleichen Version
// schicken, in der das HITANS kam.
hktan1.setSegVersion(segversion);
hktan2.setParam("process","2");
hktan2.setParam("notlasttan","N");
// TODO: evtl. listindex ermitteln
// hktan2.setParam("listidx","");
// TODO: das f�r mehrfachsignaturen
// hktan2.setParam("notlasttan","J");
// willuhn 2011-05-09 TAN-Media gibts nur bei Prozess 1,3,4 - also nicht in hktan2
// hktan-job zur neuen msg hinzuf�gen
additional_msg_tasks.add(hktan2);
// in dem ersten HKTAN-job eine referenz auf den zweiten speichern,
// damit der erste die auftragsreferenz sp�ter im zweiten speichern kann
HBCIUtils.log("storing reference to this HKTAN in previous HKTAN segment",HBCIUtils.LOG_DEBUG);
hktan1.storeOtherTAN2StepTask(hktan2);
// in dem zweiten HKTAN-job eine referenz auf den originalen job
// speichern, damit die antwortdaten f�r den job, die als antwortdaten
// f�r hktan2 ankommen, dem richtigen job zugeordnet werden k�nnen
HBCIUtils.log("storing reference to original job in new HKTAN segment",HBCIUtils.LOG_DEBUG);
hktan2.storeOriginalTask(task);
// die neue msg wird sp�ter (nach der aktuellen) zur msg-queue hinzugef�gt
}
} else {
// kein tan-pflichtiger task, also einfach zur gepatchten msg-queue hinzuf�gen