/* $Id: RSecTypeTAN.java,v 1.1 2011/05/04 22:37:57 willuhn Exp $
This file is part of HBCI4Java
Copyright (C) 2001-2008 Stefan Palme
HBCI4Java is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
HBCI4Java is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.kapott.hbci.rewrite;
import java.util.Iterator;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.manager.HBCIUtilsInternal;
import org.kapott.hbci.manager.MsgGen;
import org.kapott.hbci.protocol.MSG;
import org.kapott.hbci.protocol.MultipleSyntaxElements;
import org.kapott.hbci.protocol.SyntaxElement;
import org.kapott.hbci.protocol.factory.MSGFactory;
/** <p>Rewriter-Modul f�r falsche Informationen �ber TAN-Verfahren. Einige Banken
* mit HBCI+ (HBCI-PIN/TAN) -Unterst�tzung stellen f�lschlicherweise in die BPD
* die Information ein, dass das Sicherheitsverfahren "TAN" unterst�tzt wird.
* "TAN" ist aber kein g�ltiger Code f�r Sicherheitsmechanismen, so dass dieses
* Rewriter-Modul die "TAN"-Information aus den BPD entfernt.</p>
* <p>Ist dieses Modul aktiv, so muss auch das Modul "<code>Olly</code>" aktiv
* sein, weil einige hier vorgenommene �nderungen wiederum fehlerhafte Nachrichten
* erzeugen, die aber durch "<code>Olly</code>" wieder korrigiert werden.</p> */
public class RSecTypeTAN
extends Rewrite
{
// TODO: den rewriter umschreiben, so dass er nur string-operationen
// benutzt, weil nicht sichergestellt werden kann, dass die eingehende
// nachricht hier tats�chlich schon geparst werden kann
public String incomingClearText(String st,MsgGen gen)
{
// empfangene Nachricht parsen, dabei die validvalues-�berpr�fung weglassen
String myMsgName=(String)getData("msgName")+"Res";
MSG msg=MSGFactory.getInstance().createMSG(myMsgName,st,st.length(),
gen,
MSG.CHECK_SEQ,MSG.DONT_CHECK_VALIDS);
// in einer Schleife durch alle SuppSecMethods-Datens�tze laufen
for (int i=0;;i++) {
String elemBaseName=HBCIUtilsInternal.withCounter(myMsgName+".BPD.SecMethod.SuppSecMethods",i);
SyntaxElement elem=msg.getElement(elemBaseName+".method");
if (elem==null) {
break;
}
// Methodenbezeichner extrahieren
String method=elem.toString();
if (method.equals("TAN")) { // "TAN" ist ung�ltiger Bezeichner
HBCIUtils.log("there is an invalid sec type (TAN) in this BPD - removing it",HBCIUtils.LOG_WARN);
// Elternelement finden (Segment "SecMethods")
SyntaxElement parent=elem.getParent().getParent().getParent().getParent();
String parentPath=parent.getPath();
int number=0;
// durch alle Elemente dieses Segmentes laufen, bis die Multiple-DEG
// mit den unterst�tzten SecMethods gefunden wurde
for (Iterator<MultipleSyntaxElements> it=parent.getChildContainers().iterator();it.hasNext();) {
MultipleSyntaxElements childContainer= it.next();
if (childContainer.getPath().equals(parentPath+".SuppSecMethods")) {
// die Anzahl der eingestellten unterst�tzten SecMethods herausholen
number=childContainer.getElements().size();
break;
}
}
int startpos;
int endpos;
/* wenn mehr als eine SecMethod im Segment stand, dann braucht nur
* das eine der multiplen DEGs entfernt werden. Wenn aber nur die eine
* fehlerhafte Info enthalten war, dann muss das gesamte Segment
* entfernt werden, weil ein SecMethods-Segment ohne tats�chliche Daten
* �ber unterst�tzte SecMethods ung�ltig ist. */
if (number>1) { // nur das eine fehlerhafte TAN:1 l�schen
startpos=elem.getPosInMsg();
endpos=startpos
+1
+elem.toString(0).length()
+1
+msg.getElement(elemBaseName+".version").toString(0).length();
} else { // komplettes segment "SecMethod" l�schen
startpos=parent.getPosInMsg()+1;
endpos=startpos+parent.toString(0).length();
/* der Fehler, der hier gemacht wird (nachfolgende Segment-
* Sequenznummern sind falsch), wird durch ein nachgeschaltetes
* Olly-Modul korrigiert */
}
st=new StringBuffer(st).delete(startpos,endpos).toString();
HBCIUtils.log("new message after removing: "+st,HBCIUtils.LOG_DEBUG);
break;
}
}
MSGFactory.getInstance().unuseObject(msg);
return st;
}
}