This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Konfigurierbares Auto-Expiry von BPD. In letzter Zeit kommt es immer …

…haeufiger vor, dass Banken entweder die Versionsnummern in ihren BPD nicht mehr aktualisieren und HBCI4Java daher nicht mitkriegt, wenn sich da was aendert. Oder aber in HCBI4Java wurde der Support fuer neue Geschaeftsvorfaelle (in letzter Zeit natuerlich das SEPA-Zeug) eingebaut, was bewirkt, dass HBCI4Java dann mehr Daten aus den BPD erkennen wuerde als vorher - naemlich die BPD des neu hinzugekommenen Geschaeftsvorfalls. Das greift aber erst bei Neuabruf der BPD.

Damit die nun nicht immer manuell geloescht werden muessen, gibt es mit diesem Commit einen neuen Parameter "bpd.maxage.days", mit dem man einen automatischen Verfall der BPD konfigurieren kann und diese - per Default alle 7 Tage - neu geladen werden.
  • Loading branch information...
willuhn committed Sep 4, 2014
1 parent 7d8a05b commit 9183772c20240aeb75a5710ba28abc4a2d81fba8
Showing with 76 additions and 5 deletions.
  1. +67 −2 src/org/kapott/hbci/manager/HBCIInstitute.java
  2. +9 −3 src/org/kapott/hbci/manager/HBCIUtils.java
@@ -27,6 +27,7 @@
import java.security.spec.KeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.Arrays;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
@@ -47,6 +48,9 @@
public final class HBCIInstitute
implements IHandlerData
{
private final static String BPD_KEY_LASTUPDATE = "_lastupdate";
private final static String BPD_KEY_HBCIVERSION = "_hbciversion";
private HBCIPassportInternal passport;
private HBCIKernelImpl kernel;
@@ -82,7 +86,8 @@ void updateBPD(Properties result)
}
if (p.size()!=0) {
p.setProperty("_hbciversion",kernel.getHBCIVersion());
p.setProperty(BPD_KEY_HBCIVERSION,kernel.getHBCIVersion());
p.setProperty(BPD_KEY_LASTUPDATE,String.valueOf(System.currentTimeMillis()));
passport.setBPD(p);
HBCIUtils.log("installed new BPD with version "+passport.getBPDVersion(),HBCIUtils.LOG_INFO);
HBCIUtilsInternal.getCallback().status(passport,HBCICallback.STATUS_INST_BPD_INIT_DONE,passport.getBPD());
@@ -194,14 +199,74 @@ private void doDialogEnd(String dialogid,boolean needSig)
}
}
}
/**
* Prueft, ob die BPD abgelaufen sind und neu geladen werden muessen.
* @return true, wenn die BPD abgelaufen sind.
*/
private boolean isBPDExpired()
{
Properties bpd = passport.getBPD();
String maxAge = HBCIUtils.getParam("bpd.maxage.days","7");
HBCIUtils.log("[BPD] max age: " + maxAge + " days",HBCIUtils.LOG_INFO);
long maxMillis = -1L;
try
{
int days = Integer.parseInt(maxAge);
if (days == 0)
{
HBCIUtils.log("[BPD] auto-expiry disabled",HBCIUtils.LOG_INFO);
return false;
}
if (days > 0)
maxMillis = days * 24 * 60 * 60 * 1000L;
}
catch (NumberFormatException e)
{
HBCIUtils.log(e);
return false;
}
long lastUpdate = 0L;
if (bpd != null)
{
String s = bpd.getProperty(BPD_KEY_LASTUPDATE,Long.toString(lastUpdate));
try
{
lastUpdate = Long.parseLong(s);
}
catch (NumberFormatException e)
{
HBCIUtils.log(e);
return false;
}
HBCIUtils.log("[BPD] last update: " + (lastUpdate == 0 ? "never" : new Date(lastUpdate)),HBCIUtils.LOG_INFO);
}
long now = System.currentTimeMillis();
if (maxMillis < 0 || (now - lastUpdate) > maxMillis)
{
HBCIUtils.log("[BPD] expired, will be updated now",HBCIUtils.LOG_INFO);
return true;
}
return false;
}
/**
* Aktualisiert die BPD bei Bedarf.
*/
public void fetchBPD()
{
// BPD abholen, wenn nicht vorhanden oder HBCI-Version geaendert
Properties bpd=passport.getBPD();
String hbciVersionOfBPD=(bpd!=null)?bpd.getProperty("_hbciversion"):null;
String hbciVersionOfBPD=(bpd!=null)?bpd.getProperty(BPD_KEY_HBCIVERSION):null;
if (passport.getBPDVersion().equals("0") ||
isBPDExpired() ||
hbciVersionOfBPD==null ||
!hbciVersionOfBPD.equals(kernel.getHBCIVersion())) {
@@ -276,12 +276,18 @@ werden kann (also am besten erst ohne diesen Parameter ausprobieren -
eine HTTPS-Verbindung mit dem HBCI-Server aufgebaut, für diese
Verbindung wird der localPort-Parameter im Moment noch nicht ausgewertet.</p></li>
<li><code>comm.standard.socks.server</code>
<p>Soll für ausgehende Verbindungen ein SOCKS-Server verwendet werden, kann
<p>Soll fuer ausgehende Verbindungen ein SOCKS-Server verwendet werden, kann
dieser SOCKS-Server im Format <code>hostname:port</code> festgelegt werden.
Diese Einstellung wird <em>NICHT</em> für HBCI-PIN/TAN verwendet, sondern nur
für alle "richtigen" HBCI-Verbindungen (alle Passport-Varianten von RDH und DDV).</p></li>
Diese Einstellung wird <em>NICHT</em> fuer HBCI-PIN/TAN verwendet, sondern nur
fuer alle "richtigen" HBCI-Verbindungen (alle Passport-Varianten von RDH und DDV).</p></li>
<li><code>sepa.schema.validation</code>
<p>Kann auf 1 gesetzt werden, wenn das erzeugte XML gegen das Schema validiert werden soll.</p></li>
<li><code>bpd.maxage.days</code>
<p>Maximales Alter der BPD in Tagen nach deren Ablauf die BPD erneut abgerufen werden - auch dann,
wenn sich deren Versionsnummer nicht geaendert hat. Das ermoeglicht das automatische Aktualisieren
der BPD, wenn die Bank die Versionsnummer nicht erhoeht. Ein Wert von "-1" bedeutet: Jedesmal
BPD erneut abrufen. Ein Wert von "0" bedeutet: Niemals BPD ohne Versionsaenderung erneut abrufen.
Der Default-Wet ist 7 - also einmal pro Woche.</p></li>
<li><code>kernel.kernel.xmlpath</code>
<p>(wird nicht gesetzt, zur Zeit nur intern benutzt)</p></li>
<li><code>kernel.kernel.blzpath</code>

0 comments on commit 9183772

Please sign in to comment.