diff --git a/src/messages.properties b/src/messages.properties index d3cdbac1..6ab657ff 100644 --- a/src/messages.properties +++ b/src/messages.properties @@ -46,6 +46,7 @@ EXCMSG_BZUERR=CRC error in BZU: {0} EXCMSG_BZUMISSING=BZU data missing EXCMSG_CALLB_ERR=error in callback EXCMSG_CALLB_UNKNOWN=unknown callback reason: {0} +EXCMSG_ADDJOB=adding job {0} to dialog EXCMSG_CANTADDJOB=error while adding task {0} to current dialog EXCMSG_CANTCREATECOMM=can not create communication instance of type {0} EXCMSG_CANTCREATEFILT=can not create filter instance of type {0} diff --git a/src/messages_de.properties b/src/messages_de.properties index 93b35731..894b68b7 100644 --- a/src/messages_de.properties +++ b/src/messages_de.properties @@ -46,6 +46,7 @@ EXCMSG_BZUERR=Fehler beim EXCMSG_BZUMISSING=es fehlen die BZÜ-Daten EXCMSG_CALLB_ERR=Fehler in Callback-Routine aufgetreten EXCMSG_CALLB_UNKNOWN=Unbekannte Callback-Ursache: {0} +EXCMSG_ADDJOB=Füge Auftrag {0} zum Dialog hinzu EXCMSG_CANTADDJOB=Fehler beim Hinzufügen des Auftrages {0} zum aktuellen Dialog EXCMSG_CANTCREATECOMM=kann keine Kommunikations-Objekt des Typs {0} erzeugen EXCMSG_CANTCREATEFILT=kann kein Filter-Objekt vom Typ {0} erzeugen diff --git a/src/org/kapott/hbci/comm/CommPinTan.java b/src/org/kapott/hbci/comm/CommPinTan.java index bae7293e..73d95778 100644 --- a/src/org/kapott/hbci/comm/CommPinTan.java +++ b/src/org/kapott/hbci/comm/CommPinTan.java @@ -169,7 +169,7 @@ protected StringBuffer pong(MsgGen gen) byte[] b=new byte[1024]; StringBuffer ret=new StringBuffer(); - HBCIUtils.log("waiting for response",HBCIUtils.LOG_INFO); + HBCIUtils.log(HBCIUtilsInternal.getLocMsg("STATUS_MSG_RECV"),HBCIUtils.LOG_INFO); int msgsize=conn.getContentLength(); int num; diff --git a/src/org/kapott/hbci/manager/HBCIDialog.java b/src/org/kapott/hbci/manager/HBCIDialog.java index 6566c1d4..27cf6ad9 100644 --- a/src/org/kapott/hbci/manager/HBCIDialog.java +++ b/src/org/kapott/hbci/manager/HBCIDialog.java @@ -104,7 +104,7 @@ private HBCIMsgStatus doDialogInit() boolean s=mainPassport.isSupported(); HBCIUtils.log("passport supported: "+s,HBCIUtils.LOG_DEBUG); - HBCIUtils.log("processing dialog init",HBCIUtils.LOG_INFO); + HBCIUtils.log(HBCIUtilsInternal.getLocMsg("STATUS_DIALOG_INIT"),HBCIUtils.LOG_INFO); HBCIUtilsInternal.getCallback().status(mainPassport,HBCICallback.STATUS_DIALOG_INIT,null); String country=mainPassport.getCountry(); String blz=mainPassport.getBLZ(); @@ -465,7 +465,7 @@ public void addTask(HBCIJobImpl job) // signatur-anforderungen (anzahl) in einer msg stehen try { - HBCIUtils.log("adding job "+job.getName()+" to dialog",HBCIUtils.LOG_INFO); + HBCIUtils.log(HBCIUtilsInternal.getLocMsg("EXCMSG_ADDJOB",job.getName()),HBCIUtils.LOG_INFO); job.verifyConstraints(); // check bpd.numgva here diff --git a/src/org/kapott/hbci/manager/HBCIUtilsInternal.java b/src/org/kapott/hbci/manager/HBCIUtilsInternal.java index 2f7a5a71..2d95c8c4 100644 --- a/src/org/kapott/hbci/manager/HBCIUtilsInternal.java +++ b/src/org/kapott/hbci/manager/HBCIUtilsInternal.java @@ -27,6 +27,7 @@ import java.text.MessageFormat; import java.util.Hashtable; import java.util.Locale; +import java.util.MissingResourceException; import java.util.Properties; import java.util.ResourceBundle; @@ -88,7 +89,16 @@ public static HBCICallback getCallback() public static String getLocMsg(String key) { ThreadGroup group=Thread.currentThread().getThreadGroup(); - return locMsgs.get(group).getString(key); + try + { + return locMsgs.get(group).getString(key); + } + catch (MissingResourceException re) + { + // tolerieren wir + HBCIUtils.log(re,HBCIUtils.LOG_ERR); + return key; + } } public static String getLocMsg(String key,Object o) diff --git a/src/org/kapott/hbci/passport/AbstractHBCIPassport.java b/src/org/kapott/hbci/passport/AbstractHBCIPassport.java index d68f306f..5ec38719 100644 --- a/src/org/kapott/hbci/passport/AbstractHBCIPassport.java +++ b/src/org/kapott/hbci/passport/AbstractHBCIPassport.java @@ -21,6 +21,7 @@ package org.kapott.hbci.passport; +import java.io.File; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -1010,4 +1011,57 @@ public int getMaxGVSegsPerMsg() { return 0; } + + /** + * Ersetzt die Datei origFile gegen tmpFile. + * Nach dem Loeschen der Datei origFile wartet die Methode jedoch maximal 20 Sekunden, + * um sicherzustellen, dass z.Bsp. Virenscanner die Datei wieder losgelassen haben und + * sie wirklich verschwunden ist, bevor tmpFile auf den Namen von origFile umbenannt wird. + * Wichtig ist, dass zum Zeitpunkt des Aufrufes dieser Methode alle Streams auf die + * Dateien bereits geschlossen wurden. Die Schreibvorgaenge auf die Dateien muessen also + * abgeschlossen sein. Heisst: "os.close()" nicht erst im finally-Block machen sondern + * VOR dem Aufruf dieser Methode. + * @param origFile die originale zu ersetzende Datei. + * @param tmpFile die neue Datei, welche die originale ersetzen soll. + */ + protected void safeReplace(File origFile, File tmpFile) + { + if (origFile.exists()) // Nur loeschen, wenn es ueberhaupt existiert + { + HBCIUtils.log("deleting old passport file " + origFile, HBCIUtils.LOG_DEBUG); + if (!origFile.delete()) + HBCIUtils.log("delete method for " + origFile + " returned false", HBCIUtils.LOG_ERR); + } + + // Wenn die Datei noch existiert, warten wir noch etwas + int retry = 0; + while (origFile.exists() && retry++ < 20) + { + try + { + HBCIUtils.log("wait a little bit, maybe another thread (antivirus scanner) holds a lock, file still exists", HBCIUtils.LOG_WARN); + Thread.sleep(1000L); + } + catch (InterruptedException e) + { + HBCIUtils.log("interrupted", HBCIUtils.LOG_WARN); + break; + } + if (!origFile.exists()) + { + HBCIUtils.log("passport file now gone: " + origFile, HBCIUtils.LOG_INFO); + break; + } + } + + // Datei existiert immer noch, dann brauchen wir das Rename gar nicht erst versuchen + if (origFile.exists()) + throw new HBCI_Exception("could not delete " + origFile); + + HBCIUtils.log("renaming " + tmpFile.getName() + " to " + origFile.getName(), HBCIUtils.LOG_DEBUG); + if (!tmpFile.renameTo(origFile)) + { + throw new HBCI_Exception("could not rename " + tmpFile.getName() + " to " + origFile.getName()); + } + } } diff --git a/src/org/kapott/hbci/passport/HBCIPassportAnonymous.java b/src/org/kapott/hbci/passport/HBCIPassportAnonymous.java index ab42bdfc..5d0b3bbf 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportAnonymous.java +++ b/src/org/kapott/hbci/passport/HBCIPassportAnonymous.java @@ -522,8 +522,8 @@ public void saveChanges() tform.transform(new DOMSource(root),new StreamResult(co)); co.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_PASSPORT_WRITEERR"),e); } diff --git a/src/org/kapott/hbci/passport/HBCIPassportDDV.java b/src/org/kapott/hbci/passport/HBCIPassportDDV.java index d947392e..8114e07e 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportDDV.java +++ b/src/org/kapott/hbci/passport/HBCIPassportDDV.java @@ -638,8 +638,8 @@ public void saveChanges() o.writeObject(getHBCIVersion()); o.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_PASSPORT_WRITEERR"),e); } diff --git a/src/org/kapott/hbci/passport/HBCIPassportPinTan.java b/src/org/kapott/hbci/passport/HBCIPassportPinTan.java index 4b505ad0..a9ad1678 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportPinTan.java +++ b/src/org/kapott/hbci/passport/HBCIPassportPinTan.java @@ -252,43 +252,7 @@ public void saveChanges() HBCIUtils.log("closing output stream", HBCIUtils.LOG_DEBUG); o.close(); - if (passportfile.exists()) // Nur loeschen, wenn es ueberhaupt existiert - { - HBCIUtils.log("deleting old passport file " + passportfile, HBCIUtils.LOG_DEBUG); - if (!passportfile.delete()) - HBCIUtils.log("delete method for " + passportfile + " returned false", HBCIUtils.LOG_ERR); - } - - // Wenn die Datei noch existiert, warten wir noch etwas - int retry = 0; - while (passportfile.exists() && retry++ < 10) - { - try - { - HBCIUtils.log("wait a little bit, maybe another thread (antivirus scanner) is currently locking the file", HBCIUtils.LOG_INFO); - Thread.sleep(1000L); - } - catch (InterruptedException e) - { - HBCIUtils.log("interrupted", HBCIUtils.LOG_WARN); - break; - } - if (!passportfile.exists()) - { - HBCIUtils.log("passport file now gone: " + passportfile, HBCIUtils.LOG_INFO); - break; - } - } - - // Datei existiert immer noch, dann brauchen wir das Rename gar nicht erst versuchen - if (passportfile.exists()) - throw new HBCI_Exception("could not delete " + passportfile); - - HBCIUtils.log("renaming " + tempfile.getName() + " to " + passportfile.getName(), HBCIUtils.LOG_DEBUG); - if (!tempfile.renameTo(passportfile)) - { - throw new HBCI_Exception("could not rename " + tempfile.getName() + " to " + passportfile.getName()); - } + this.safeReplace(passportfile,tempfile); } catch (HBCI_Exception he) { diff --git a/src/org/kapott/hbci/passport/HBCIPassportRDH.java b/src/org/kapott/hbci/passport/HBCIPassportRDH.java index 7e210739..86f0a4ef 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportRDH.java +++ b/src/org/kapott/hbci/passport/HBCIPassportRDH.java @@ -201,8 +201,8 @@ public void saveChanges() o.writeObject(getCustomerId()); o.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + + this.safeReplace(passportfile,tempfile); HBCIKey k=getMyPrivateSigKey(); if (k!=null && k.key!=null && !(k.key instanceof RSAPrivateCrtKey)) { diff --git a/src/org/kapott/hbci/passport/HBCIPassportRDHNew.java b/src/org/kapott/hbci/passport/HBCIPassportRDHNew.java index 9a3c677e..d9e87b6a 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportRDHNew.java +++ b/src/org/kapott/hbci/passport/HBCIPassportRDHNew.java @@ -378,8 +378,8 @@ public void saveChanges() tform.transform(new DOMSource(root),new StreamResult(co)); co.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception("*** saving of passport file failed",e); } diff --git a/src/org/kapott/hbci/passport/HBCIPassportRDHXFile.java b/src/org/kapott/hbci/passport/HBCIPassportRDHXFile.java index 3033ba0b..8d062df6 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportRDHXFile.java +++ b/src/org/kapott/hbci/passport/HBCIPassportRDHXFile.java @@ -238,8 +238,8 @@ public void saveChanges() fo.write(data); fo.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception("*** saving of passport file failed", e); } diff --git a/src/org/kapott/hbci/passport/HBCIPassportRSA.java b/src/org/kapott/hbci/passport/HBCIPassportRSA.java index 1f019640..a225bb76 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportRSA.java +++ b/src/org/kapott/hbci/passport/HBCIPassportRSA.java @@ -713,8 +713,9 @@ public void saveChanges() { o.writeObject(getCustomerId()); o.close(); - passportfile.delete(); - tempfile.renameTo(passportfile); + + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_PASSPORT_WRITEERR"), e); } diff --git a/src/org/kapott/hbci/passport/HBCIPassportSIZRDHFile.java b/src/org/kapott/hbci/passport/HBCIPassportSIZRDHFile.java index ca68276c..73fb5021 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportSIZRDHFile.java +++ b/src/org/kapott/hbci/passport/HBCIPassportSIZRDHFile.java @@ -135,8 +135,8 @@ public void saveChanges() saveData(tempfile.getAbsolutePath()); - passportfile.delete(); - tempfile.renameTo(passportfile); + this.safeReplace(passportfile,tempfile); + } catch (Exception e) { throw new HBCI_Exception("*** saving of passport file failed",e); }