HBCi4Java sperrt Online-Account(s)

 
bdombrowsky
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 26
Dabei seit: 09 / 2014
Betreff:

HBCi4Java sperrt Online-Account(s)

 · 
Gepostet: 02.05.2015 - 12:58 Uhr  ·  #1
Hallo Zusammen,

ich habe folgendes Problem, seit ca. 1 Woche, sperrt HBCi4Java meine Online Bank Zugänge.

Aktuell habe ich 2 Volksbank-Zugänge und 1 Comdirect Zugang, welche ich eigentlich erfolgreich seit ca. 1 Jahr via HBCI4Java abrufe und bisher so gut wie nie Probleme damit hatte. Jetzt hat mir das Tool mehrfach den Online Zugang mit falschen PIN "eingaben" gesperrt, dass sehr merkwürdige daran ist, dass das nicht sofort passiert.

Kurze Historie:

23.04.: Zugang ist gesperrt
28.04.: Zugang ist wieder freigeschaltet, alles funktioniert
29.04.: Keine Änderungen
30.04.: Keine Änderungen
31.04.: Keine Änderungen
01.05.: Keine Änderungen
02.05.: Keine Änderungen - Zugang gesperrt ("wrong pin")

Womit kann dies zutun haben? Dies tritt aktuell nur bei meinen Volksbank Konten auf (Kann Zufall sein...).

Ich habe den Mechanismus jetzt aktuell wieder deaktiviert, um weitere Sperrungen zu verhinden. Ich muss jetzt auf Post der Bank warten um den Account wieder freischalten zu können...

Hat jemand eine Idee hierzu? Ich mache, aus meiner Sicht, sehr einfache Dinge mit dem Tool, das einzige was eventuell etwas "extravagant" sein könnte, ist dass ich mehrere Banken anspreche (2 x auch die gleiche Bank, mit unterschiedlichen Zugängen).

Ich habe separate Passport-Dateien und separate Logfiles definiert, es sollte also eigentlich alles völlig getrennt sein. Ich könnte mir aber irgendwie vorstellen, dass das Tool dennoch "durcheinander" kommt?

Mein kleiner Code:

Code

package de.bdombrowsky.jira.plugins.hbci.utils

import org.kapott.hbci.GV.HBCIJob
import org.kapott.hbci.GV_Result.GVRAccInfo
import org.kapott.hbci.GV_Result.GVRKUms
import org.kapott.hbci.callback.HBCICallbackConsole
import org.kapott.hbci.manager.HBCIHandler
import org.kapott.hbci.manager.HBCIUtils
import org.kapott.hbci.manager.HBCIUtilsInternal
import org.kapott.hbci.passport.AbstractHBCIPassport
import org.kapott.hbci.passport.HBCIPassport
import org.kapott.hbci.status.HBCIExecStatus
import org.kapott.hbci.structures.Konto

/**
 * Created by bdo on 22.04.15.
 */

class HBCI {
    public static class MyHBCICallback
            extends HBCICallbackConsole
    {
        private Properties answers;

        public MyHBCICallback(Properties answers)
                throws Exception
        {
            super();
            this.answers = answers
        }

        public synchronized void callback(HBCIPassport passport,int reason,String msg,int datatype,StringBuffer retData)
        {
            switch (reason) {
                case NEED_CHIPCARD:
                    System.out.println(HBCIUtilsInternal.getLocMsg("CALLB_NEED_CHIPCARD"));
                    break;
                case NEED_HARDPIN:
                    System.out.println(HBCIUtilsInternal.getLocMsg("CALLB_NEED_HARDPIN"));
                    break;
                case NEED_SOFTPIN:
                    retData.replace(0,retData.length(),answers.getProperty("softpin"));
                    break;
                case NEED_PASSPHRASE_LOAD:
                case NEED_PASSPHRASE_SAVE:
                    retData.replace(0,retData.length(),answers.getProperty("passphrase"));
                    break;
                case NEED_PT_SECMECH:
                    retData.replace(0,retData.length(),answers.getProperty("secmech"));
                    break;
                case NEED_PT_PIN:
                    retData.replace(0,retData.length(),answers.getProperty("pin"));
                    break;
                case NEED_PT_TAN:
                    retData.replace(0,retData.length(),answers.getProperty("tan"));
                    break;
                case NEED_COUNTRY:
                    retData.replace(0,retData.length(),answers.getProperty("country"));
                    break;
                case NEED_BLZ:
                    retData.replace(0,retData.length(),answers.getProperty("blz"));
                    break;
                case NEED_HOST:
                    retData.replace(0,retData.length(),answers.getProperty("host"));
                    break;
                case NEED_PORT:
                    retData.replace(0,retData.length(),answers.getProperty("port"));
                    break;
                case NEED_FILTER:
                    retData.replace(0,retData.length(),answers.getProperty("filter"));
                    break;
                case NEED_USERID:
                    retData.replace(0,retData.length(),answers.getProperty("userid"));
                    break;
                case NEED_CUSTOMERID:
                    retData.replace(0,retData.length(),answers.getProperty("customerid"));
                    break;
                case NEED_SIZENTRY_SELECT:
                    retData.replace(0,retData.length(),answers.getProperty("sizentry"));
                    break;
                case NEED_NEW_INST_KEYS_ACK:
                    retData.replace(0,retData.length(),"");
                    break;
                case HAVE_NEW_MY_KEYS:
                    System.out.println("please restart batch process");
                    break;
                case HAVE_INST_MSG:
                    HBCIUtils.log(msg,HBCIUtils.LOG_INFO);
                    break;
                case NEED_CONNECTION:
                case CLOSE_CONNECTION:
                    break;
            }
        }

        // ausgabe der status-meldungen komplett unterbinden
        public synchronized void status(HBCIPassport passport,int statusTag,
                                        Object[] objs)
        {
        }
    }

    private static HBCIPassport passport;
    private static HBCIHandler hbciHandle;

    public static GVRKUms getNewEntries(String logfile, Integer accountID, Properties answersProperties, Properties configProperties)
            throws Exception
    {
        Date now = new Date()

        PrintStream outStream=new PrintStream(new FileOutputStream(logfile));
        System.setOut(outStream);
        System.setErr(outStream);

        if (HBCIUtils.getLocale() != null){
            HBCIUtils.done();
        }

        System.out.println("Inilize HBCI Utils...");
        HBCIUtils.init(configProperties, new MyHBCICallback(answersProperties));

        System.out.println("Create new Passport...");
        passport = AbstractHBCIPassport.getInstance();
        System.out.println("Passport created:" + passport);

        System.out.println("Get Report...");
        GVRKUms result=null;
        try {
            String passportVersion = passport.getHBCIVersion();
            System.out.println("passportVersion: "+ passportVersion);
            hbciHandle=new HBCIHandler((passportVersion.length()!=0)?passportVersion:"300", passport);
            Konto myAccount= passport.getAccounts()[accountID];
            HBCIJob report=hbciHandle.newJob("KUmsAll");
            report.setParam("my",myAccount);
            report.setParam("startdate",now.clearTime())
            report.addToQueue();
            HBCIExecStatus ret=hbciHandle.execute();
            result=(GVRKUms)report.getJobResult();
            // Check my result and close function
            if (result.isOK()) {
                System.out.println("Job-OK");
            } else {
                // Fehlermeldungen ausgeben
                System.out.println("Job-Error");
                System.out.println(result.getJobStatus().getErrorString());
                System.out.println("Global Error");
                System.out.println(ret.getErrorString());
            }
        } finally {
            if (hbciHandle!=null) {
                hbciHandle.close();
            }
            if (passport !=null) {
                passport.clearBPD();
                passport.clearUPD();
                passport.clearInstEncKey();
                passport.clearInstSigKey();
                passport.close();
            }
        }
        return result;
    }
}


Logfile Auszug:

Code
<DBG> [2015.05.02 12:00:00.618] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: dialog init ended with errors - searching for return code 'wro
ng PIN'
<INF> [2015.05.02 12:00:00.618] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: detected 'invalid PIN' error - clearing passport PIN
<DBG> [2015.05.02 12:00:00.618] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: autosecfunc: search for 3920s in response to detect allowed tw
ostep secmechs
<DBG> [2015.05.02 12:00:00.618] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: autosecfunc: (re)checking selected pintan secmech
<DBG> [2015.05.02 12:00:00.619] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: afterCustomDialogInitHook: patching message queues for twostep
 method
<DBG> [2015.05.02 12:00:00.619] [main/atlassian-scheduler-quartz1.clustered_Worker-3] passport.AbstractPinTanPassport: found task that does not require a TAN: HKKAZ - adding it to c
urrent msg
Job-Error

Global Error
9050:Die Nachricht enthält Fehler.
9931:*Ihre PIN ist gesperrt.
9800:Dialog abgebrochen
9340:Auftrag abgelehnt.


Über Hilfe wäre ich sehr sehr dankbar, da das Tool für mich relativ wichtig ist..

Gibt es irgendwie die Möglichkeit, auf die Rückmeldung "wrong pin" zu reagieren? Um beim ersten "wrong pin" das ganze zu deaktivieren und zu checken, was hier los ist? Ich wüsste jetzt nicht direkt, wie ich an diese Rückmeldung komme? Außer das Logfile zu parsen...

Gruß
Benni
Raimund Sichmann
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 8244
Dabei seit: 08 / 2002
Betreff:

Re: HBCi4Java sperrt Online-Account(s)

 · 
Gepostet: 03.05.2015 - 19:50 Uhr  ·  #2
Hallo Benni,
bei gesperrten Zugängen und HBCI gibt es einen Klassiker: Die Zugangsdaten wurden online geändert (also normalerweise die PIN) und die in irgendeinem HBCI-Zugang gespeicherte PIN sind vergessen worden, sind also noch alt und damit nicht gültig. Der Abruf schießt dann beim Abruf der Umsatzdaten den Zugang ab.
"irgendeinem" habe ich bewusst geschrieben, weil man häufiger im Anschluss hört: "Das war [x], dem hab ich mal die PIN gegeben". [x] wahlweise zu ersetzen mit "mein Steuerberater", "meine Sekretärin", "mein Buchhalter", "meine Ehepartner"...

oder
Die PIN wurde in eine "exotische" verwandelt, die FinTS/HBCI nicht transportieren kann.

oder
Die PIN wurde im Browser in einem anderen Tastaturlayout eingegeben als im Zahlungsverkehrsprogramm.

Gruß
Raimund
bdombrowsky
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 26
Dabei seit: 09 / 2014
Betreff:

Re: HBCi4Java sperrt Online-Account(s)

 · 
Gepostet: 07.05.2015 - 08:24 Uhr  ·  #3
Hallo,

ich habe jetzt denke ich das Problem gefunden, ich habe keine Rücksicht auf Multithreading genommen und so vermutlich versucht, eine Verbindung mit falschen Verbindungsdaten zu öffnen. Ehrlich gesagt verstehe ich das Readme hierzu nur zur Hälfte.

Hat hier jemand einen kleinen Beispielcode, wie ich in Java (JAVA Tomcat Umgebung) eine entsprechende ThreadGroup erstelle, um "exklusiv" zu laufen?

Vielen Dank und Gruß!
Benni
hibiscus
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10858
Dabei seit: 03 / 2005
Betreff:

Re: HBCi4Java sperrt Online-Account(s)

 · 
Gepostet: 07.05.2015 - 10:30 Uhr  ·  #4
Hab den Thread jetzt erst gesehen. Aber mit deinen Threads hattest du als Ursache schon recht. Ausserdem ist das hier SEHR BEDENKLICH:

Code

private static HBCIPassport passport;
private static HBCIHandler hbciHandle;


Damit hast du effektiv nur einen einzigen Passport und ein Handle. Nicht nur thread-uebergreifend sondern innerhalb des gesamten Classloaders/der JVM. Mache in Multithreading-Umgebungen nichts static. Es sei denn, das hat einen wirklichen Grund.

Zitat
Hat hier jemand einen kleinen Beispielcode, wie ich in Java (JAVA Tomcat Umgebung) eine entsprechende ThreadGroup erstelle, um "exklusiv" zu laufen?


Das laesst sich schwer beurteilen, da man anhand deines o.g. Codes nicht erkennen kann, in welchem Umfeld der Code laeuft. Wann wird das aufgerufen? Durch einen Scheduler auf deinem Server? In einem Client? Innerhalb eines HTTP-Request-Verarbeitungs-Thread?
Gewählte Zitate für Mehrfachzitierung:   0