/* $Id: InitAndTest.java,v 1.1 2011/05/04 22:37:45 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.tools;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Properties;
import org.kapott.hbci.callback.HBCICallbackConsole;
import org.kapott.hbci.manager.HBCIHandler;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.passport.AbstractHBCIPassport;
import org.kapott.hbci.passport.HBCIPassport;
/** <p>Tool zum Initialisieren und Testen eines HBCI-Passports. Dieses Tool dient
einerseits als Vorlage f�r die Benutzung von <em>HBCI4Java</em> in eigenen Anwendungen und
gleichzeitig als Tool, um ein HBCI-Passport einzurichten und zu initialisieren.</p><p>
F�r das Einrichten und Initialisieren eines HBCI-Passports gibt es keine
speziellen Funktionen, statt dessen wird ein Passport einfach so benutzt, als
ob es schon vorhanden w�re. Alle fehlenden Daten holt sich <em>HBCI4Java</em> selbstst�ndig
entweder �ber den Callback-Mechanismus vom Anwender oder durch spezielle
HBCI-Dialoge von der Bank.</p><p>
Aus diesem Grund kann dieses Tool sowohl zum Testen eines schon existierenden Passports
wie auch zum Einrichten eines neuen Passports verwendet werden, ohne etwas am
Programmcode zu �ndern. In der gleichen Weise wie dieses Tool kann auch eine
komplexere Anwendung <em>HBCI4Java</em> benutzen, in diesem Tool fehlt nur das Hinzuf�gen
von Gesch�ftsvorf�llen zum HBCI-Dialog.</p><p>
Beim Start des Programmes mit
<code>java org.kapott.hbci.tools.InitAndTest</code>
werden verschiedene Parameter �ber die Standardeingabe abgefragt.
Konkret handelt es sich dabei um alle HBCI-Parameter, die f�r die Initialisierung
eines Passports und dessen Verwendung ben�tigt werden. Die HBCI-Parameter werden mit
den eingegeben Werten initialisiert. Anschlie�end wird ein Passport-Objekt erzeugt
und ein "leerer" HBCI-Dialog (d.h. einer, der keine Gesch�ftsvorf�lle enth�lt) ausgef�hrt.</p><p>
Bei diesem Vorgang sorgt <em>HBCI4Java</em> selbst daf�r, dass alle relevanten Daten vorhanden sind
bzw. initialisiert diese entspechend. L�uft das Programm fehlerfrei durch, so ist sichergestellt,
dass das benutzte Passport (=Sicherheitsmedium) korrekt initialisiert und funktionsbereit
ist.</p> */
public final class InitAndTest
{
private static class MyCallback
extends HBCICallbackConsole
{
@Override
public synchronized void status(HBCIPassport passport, int statusTag,
Object[] o)
{
// disable status output
}
}
private static HBCIPassport passport;
private static HBCIHandler hbciHandle;
public static void main(String[] args)
throws IOException
{
try {
HBCIUtils.init(null,new MyCallback());
readBasicParams();
readPassportParams();
passport=AbstractHBCIPassport.getInstance();
readHBCIVersion();
readActions();
if (HBCIUtils.getParam("action.resetBPD").equals("1")) {
passport.clearBPD();
}
if (HBCIUtils.getParam("action.resetUPD").equals("1")) {
passport.clearUPD();
}
hbciHandle=new HBCIHandler(HBCIUtils.getParam("client.passport.hbciversion.default"),
passport);
/* HBCIExecStatus ret=hbciHandle.execute();
System.out.println("ExecStatus");
System.out.println(ret.toString());
System.out.println("ExecStatusEnd");
System.out.println("ExecStatusError");
System.out.println(ret.getErrorString());
System.out.println("ExecStatusErrorEnd"); */
printSupportedGVs(hbciHandle);
System.out.println();
System.out.println("finished.");
System.out.println();
} finally {
if (hbciHandle!=null) {
hbciHandle.close();
} else if (passport!=null) {
passport.close();
}
}
}
private static void readParam(String paramName,String def,String descr)
throws IOException
{
System.out.println();
System.out.println(descr);
System.out.println("press ENTER to accept the default; '-' to set no value for this parameter");
System.out.print(paramName+" ["+def+"]: ");
System.out.flush();
String value=new BufferedReader(new InputStreamReader(System.in)).readLine();
if (value.equals("-")) {
value=null;
} else if (value.length()==0) {
value=def;
}
if (value!=null) {
System.out.println(paramName+"="+value);
HBCIUtils.setParam(paramName,value);
}
}
private static void readBasicParams()
throws IOException
{
readParam("client.connection.localPort",null,"local tcp-port to be used for outgoing connections");
readParam("comm.standard.socks.server",null,"SOCKS server to be used for outgoing connections (will be ignored for PIN/TAN)");
readParam("log.loglevel.default","5","loglevel for HBCI4Java-messages (from 0(no logging) to 5(really heavy)");
readParam("kernel.rewriter",HBCIUtils.getParam("kernel.rewriter"),"rewriter modules to be activated");
}
private static void readPassportParams()
throws IOException
{
readParam("client.passport.default",null,"enter type of media you have (Anonymous, DDV, RDHNew, RDH (deprecated), PinTan, SIZRDHFile or RDHXFile)");
String type=HBCIUtils.getParam("client.passport.default","");
if (type.equals("Anonymous")) {
readParam("client.passport.Anonymous.filename","passport_anon.dat","filename to be used for your HBCI4Java keyfile.");
readParam("client.passport.Anonymous.init","1","never change this value!");
} else if (type.equals("DDV")) {
readParam("client.passport.DDV.path","./","the path where to store a file to cash information about your HBCI account");
readParam("client.passport.DDV.libname.ddv","/home/kleiner/projects/hbci2/chipcard/lib/libhbci4java-card-linux.so","the name of the library needed to use the CTAPI interface of your chipcard terminal");
readParam("client.passport.DDV.libname.ctapi","/usr/lib/libctapi-cyberjack.so","the name of the library containing the CTAPI interface to your chipcard terminal");
readParam("client.passport.DDV.port","1","the port to which your chipcard terminal is connected (in most cases 1, 0 or 2)");
readParam("client.passport.DDV.ctnumber","0","the logical number for your chipcard terminal, can be 0 in most cases");
readParam("client.passport.DDV.usebio","0","use the biometric interface of Reiner-SCT chipcard terminals (0 or 1)");
readParam("client.passport.DDV.softpin","0","use the keypad of your chipcard terminal (0) or your PC-keyboard (1) to enter the PIN for your HBCI chipcard");
readParam("client.passport.DDV.entryidx","1","enter the index, which HBCI account stored on the card should be used");
} else if (type.equals("RDH")) {
readParam("client.passport.RDH.filename","my_passport.dat","filename to be used for your HBCI4Java keyfile. DONT LOOSE THIS FILE!");
readParam("client.passport.RDH.init","1","never change this value!");
} else if (type.equals("RDHNew")) {
readParam("client.passport.RDHNew.filename","my_passport.dat","filename to be used for your HBCI4Java keyfile. DONT LOOSE THIS FILE!");
readParam("client.passport.RDHNew.init","1","never change this value!");
} else if (type.equals("PinTan")) {
readParam("client.passport.PinTan.filename","my_passport_pintan.dat","filename to be used for your PIN/TAN keyfile");
readParam("client.passport.PinTan.checkcert","1","whether to check the HTTPS-certificate of the server (1) or not (0)");
readParam("client.passport.PinTan.certfile",null,"filename with a SSL-certificate for HTTPS-communication; leave blank when you don't want to check the certificate or when the certificate can be checked with the java-builtin CA database");
readParam("client.passport.PinTan.proxy",null,"host:port for proxy server to be used; leave blank when you want direct connections to be made");
readParam("client.passport.PinTan.proxyuser",null,"when you need proxy authentication enter the username here; leave empty to be queried on demand");
readParam("client.passport.PinTan.proxypass",null,"when you need proxy authentication enter the passphrase here; leave empty to be queried on demand");
readParam("client.passport.PinTan.init","1","never change this value!");
} else if (type.equals("SIZRDHFile")) {
readParam("client.passport.SIZRDHFile.filename","secret.key","filename of SIZ-RDH-keyfile to be used. MAKE A BACKUP OF THIS FILE BEFORE USE!");
readParam("client.passport.SIZRDHFile.libname","/usr/lib/libhbci4java-sizrdh.so","filename of native library for accessing SIZ RDH files");
readParam("client.passport.SIZRDHFile.init","1","never change this value!");
} else if (type.equals("RDHXFile")) {
readParam("client.passport.RDHXFile.filename","secret.key","filename of SIZ-RDH2-keyfile to be used. MAKE A BACKUP OF THIS FILE BEFORE USE!");
readParam("client.passport.RDHXFile.init","1","never change this value!");
}
}
private static void readHBCIVersion()
throws IOException
{
String pversion=passport.getHBCIVersion();
readParam("client.passport.hbciversion.default",((pversion.length()!=0)?pversion:"210"),"the hbci-version to be used; may be '201', '210', '220', '300' or 'plus'");
}
private static void readActions()
throws IOException
{
readParam("action.resetBPD","1","reset and refetch BPD (1/0)");
readParam("action.resetUPD","1","reset and refetch UPD (1/0)");
}
private static void printSupportedGVs(HBCIHandler handle)
{
Properties gvcodes=getGVCodes();
String[] codes=gvcodes.keySet().toArray(new String[0]);
Arrays.sort(codes);
System.out.println();
System.out.println("lowlevel GVs supported by institute and HBCI4Java:");
for (int i=0; i<codes.length; i++) {
String gvcode=codes[i];
String name=gvcodes.getProperty(gvcode);
if (!name.startsWith("Template")) {
System.out.println(" "+gvcode+" ("+name+")");
}
}
System.out.println();
System.out.println("lowlevel GVs supported by institute but unknown to HBCI4Java:");
for (int i=0; i<codes.length; i++) {
String gvcode=codes[i];
String name=gvcodes.getProperty(gvcode);
if (name.startsWith("Template")) {
System.out.println(" "+gvcode);
}
}
}
private static Properties getGVCodes()
{
Properties ret=new Properties();
Properties bpd=passport.getBPD();
for (Enumeration e=bpd.propertyNames();e.hasMoreElements();) {
String key=(String)e.nextElement();
if (key.startsWith("Params") &&
key.endsWith(".SegHead.code"))
{
String gvcode=bpd.getProperty(key);
int dotPos=key.indexOf('.');
int dotPos2=key.indexOf('.',dotPos+1);
String gvname=key.substring(dotPos+1,dotPos2);
int len=gvname.length();
int versionPos=-1;
for (int i=len-1;i>=0;i--) {
char ch=gvname.charAt(i);
if (!(ch>='0' && ch<='9')) {
versionPos=i+1;
break;
}
}
String version=gvname.substring(versionPos);
if (version.length()!=0) {
gvname=gvname.substring(0,versionPos-3); // remove version and "Par"
}
ret.setProperty(gvcode,gvname);
}
}
return ret;
}
}