Skip to content
This repository has been archived by the owner on May 16, 2018. It is now read-only.

Commit

Permalink
Umbenennen aller Passport-Dateien jetzt AV-Scanner-tolerant wie bei P…
Browse files Browse the repository at this point in the history
…IN/TAN
  • Loading branch information
willuhn committed Mar 29, 2016
1 parent 195e272 commit 5bd4eda
Show file tree
Hide file tree
Showing 14 changed files with 86 additions and 55 deletions.
1 change: 1 addition & 0 deletions src/messages.properties
Expand Up @@ -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}
Expand Down
1 change: 1 addition & 0 deletions src/messages_de.properties
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/org/kapott/hbci/comm/CommPinTan.java
Expand Up @@ -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;
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/manager/HBCIDialog.java
Expand Up @@ -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();
Expand Down Expand Up @@ -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
Expand Down
12 changes: 11 additions & 1 deletion src/org/kapott/hbci/manager/HBCIUtilsInternal.java
Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down
54 changes: 54 additions & 0 deletions src/org/kapott/hbci/passport/AbstractHBCIPassport.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
}
}
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportAnonymous.java
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportDDV.java
Expand Up @@ -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);
}
Expand Down
38 changes: 1 addition & 37 deletions src/org/kapott/hbci/passport/HBCIPassportPinTan.java
Expand Up @@ -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)
{
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportRDH.java
Expand Up @@ -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)) {
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportRDHNew.java
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportRDHXFile.java
Expand Up @@ -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);
}
Expand Down
5 changes: 3 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportRSA.java
Expand Up @@ -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);
}
Expand Down
4 changes: 2 additions & 2 deletions src/org/kapott/hbci/passport/HBCIPassportSIZRDHFile.java
Expand Up @@ -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);
}
Expand Down

0 comments on commit 5bd4eda

Please sign in to comment.