diff --git a/src/org/kapott/hbci/GV/GVTANMediaList.java b/src/org/kapott/hbci/GV/GVTANMediaList.java index 437bc5bb..c801a69b 100644 --- a/src/org/kapott/hbci/GV/GVTANMediaList.java +++ b/src/org/kapott/hbci/GV/GVTANMediaList.java @@ -1,6 +1,7 @@ package org.kapott.hbci.GV; import java.util.Properties; + import org.kapott.hbci.GV_Result.GVRTANMediaList; import org.kapott.hbci.manager.HBCIHandler; import org.kapott.hbci.manager.HBCIUtils; @@ -18,7 +19,7 @@ public static String getLowlevelName() public GVTANMediaList(HBCIHandler handler) { super(handler,getLowlevelName(),new GVRTANMediaList()); - addConstraint("mediatype","mediatype","1", LogFilter.FILTER_NONE); + addConstraint("mediatype","mediatype","0", LogFilter.FILTER_NONE); // "1" gibts nicht. Siehe FinTS_3.0_Security_Sicherheitsverfahren_PINTAN_Rel_20101027_final_version.pdf "TAN-Medium-Art" addConstraint("mediacategory", "mediacategory", "A", LogFilter.FILTER_NONE); } @@ -30,6 +31,9 @@ public void extractResults(HBCIMsgStatus msgstatus,String header,int idx) if(s != null) { ((GVRTANMediaList)jobResult).setTanOption(Integer.parseInt(s)); } + + // Da drin speichern wir die Namen der TAN-Medien - kommt direkt in die UPD im Passport + StringBuffer mediaNames = new StringBuffer(); for (int i=0;;i++) { String mediaheader=HBCIUtilsInternal.withCounter(header+".MediaInfo",i); @@ -76,6 +80,28 @@ public void extractResults(HBCIMsgStatus msgstatus,String header,int idx) } ((GVRTANMediaList)jobResult).add(info); + + // Es gibt auch noch "verfuegbar", da muss das Medium aber erst noch freigeschaltet werden + boolean isActive = info.status != null && info.status.equals("1"); + boolean haveName = info.mediaName != null && info.mediaName.length() > 0; + // boolean isMobileTan = info.mediaCategory != null && info.mediaCategory.equalsIgnoreCase("M"); + + // Zu den UPD hinzufuegen + if (isActive && haveName) + { + if (mediaNames.length() != 0) + mediaNames.append("|"); + + mediaNames.append(info.mediaName); + } + } + + String names = mediaNames.toString(); + if (names.length() > 0) + { + HBCIUtils.log("adding TAN media names to UPD: " + names, HBCIUtils.LOG_INFO); + Properties upd = getParentHandler().getPassport().getUPD(); + upd.setProperty("tanmedia.names",names); } } diff --git a/src/org/kapott/hbci/manager/HBCIHandler.java b/src/org/kapott/hbci/manager/HBCIHandler.java index bf36c539..2bd7796b 100644 --- a/src/org/kapott/hbci/manager/HBCIHandler.java +++ b/src/org/kapott/hbci/manager/HBCIHandler.java @@ -23,6 +23,7 @@ import java.lang.reflect.Constructor; import java.security.KeyPair; +import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; @@ -141,19 +142,77 @@ public HBCIHandler(String hbciversion,HBCIPassport passport) throw new HBCI_Exception(HBCIUtilsInternal.getLocMsg("EXCMSG_CANT_CREATE_HANDLE"),e); } - // wenn in den UPD noch keine SEPA-Informationen ueber die Konten enthalten + // wenn in den UPD noch keine SEPA- und TAN-Medien-Informationen ueber die Konten enthalten // sind, versuchen wir, diese zu holen Properties upd=passport.getUPD(); - if (upd!=null && !upd.getProperty("_fetchedSEPA","").equals("1")) { - // wir haben UPD, in denen aber nicht "_fetchedSEPA=1" drinsteht - updateSEPAInfo(); + if (upd!=null && !upd.containsKey("_fetchedMetaInfo")) + { + // wir haben UPD, in denen aber nicht "_fetchedMetaInfo" drinsteht + updateMetaInfo(); } } - /* wenn der GV SEPAInfo unterstützt wird, heißt das, dass die Bank mit + /** + * Ruft die SEPA-Infos der Konten sowie die TAN-Medienbezeichnungen ab. + * unterstuetzt wird und speichert diese Infos in den UPD. + */ + public void updateMetaInfo() + { + Properties bpd = passport.getBPD(); + if (bpd == null) + { + HBCIUtils.log("have no bpd, skip fetching of meta info", HBCIUtils.LOG_WARN); + return; + } + + try + { + final Properties lowlevel = this.getSupportedLowlevelJobs(); + + // SEPA-Infos abrufen + if (lowlevel.getProperty("SEPAInfo") != null) + { + HBCIUtils.log("fetching SEPA information", HBCIUtils.LOG_INFO); + HBCIJob sepainfo = this.newJob("SEPAInfo"); + sepainfo.addToQueue(); + } + + // TAN-Medien abrufen - aber nur bei PIN/TAN-Verfahren + if (lowlevel.getProperty("TANMediaList") != null && (this.passport instanceof AbstractPinTanPassport)) + { + HBCIUtils.log("fetching TAN media list", HBCIUtils.LOG_INFO); + HBCIJob tanMedia = this.newJob("TANMediaList"); + tanMedia.addToQueue(); + } + + HBCIExecStatus status = this.execute(); + if (status.isOK()) + { + HBCIUtils.log("successfully fetched meta info", HBCIUtils.LOG_INFO); + passport.getUPD().setProperty("_fetchedMetaInfo",new Date().toString()); + passport.saveChanges(); + } + else + { + HBCIUtils.log("error while fetching meta info: " + status.toString(), HBCIUtils.LOG_ERR); + } + } + catch (Exception e) + { + // Wir werfen das nicht als Exception. Unschoen, wenn das nicht klappt. + // Aber kein Grund zur Panik. + HBCIUtils.log(e); + } + } + + + /** + * Wenn der GV SEPAInfo unterstützt wird, heißt das, dass die Bank mit * SEPA-Konten umgehen kann. In diesem Fall holen wir die SEPA-Informationen * über die Konten von der Bank ab - für jedes SEPA-fähige Konto werden u.a. - * BIC/IBAN geliefert */ + * BIC/IBAN geliefert + * @deprecated Bitte updateMetaInfo verwenden. Das aktualisiert auch die TAN-Medien. + */ public void updateSEPAInfo() { Properties bpd = passport.getBPD(); diff --git a/src/org/kapott/hbci/manager/HBCIUser.java b/src/org/kapott/hbci/manager/HBCIUser.java index 6236deb4..3e678b06 100644 --- a/src/org/kapott/hbci/manager/HBCIUser.java +++ b/src/org/kapott/hbci/manager/HBCIUser.java @@ -565,8 +565,26 @@ public void updateUPD(Properties result) if (p.size()!=0) { p.setProperty("_hbciversion",kernel.getHBCIVersion()); + + // Wir sichern wenigstens noch die TAN-Media-Infos, die vom HBCIHandler vorher abgerufen wurden + // Das ist etwas unschoen. Sinnvollerweise sollten die SEPA-Infos und TAN-Medien nicht in den + // UPD gespeichert werden. Dann gehen die auch nicht jedesmal wieder verloren und muessen nicht + // dauernd neu abgerufen werden. Das wuerde aber einen groesseren Umbau erfordern + Properties upd = passport.getUPD(); + if (upd != null) + { + String mediaInfo = upd.getProperty("tanmedia.names"); + if (mediaInfo != null) + { + HBCIUtils.log("rescued TAN media info to new UPD: " + mediaInfo,HBCIUtils.LOG_INFO); + p.setProperty("tanmedia.names",mediaInfo); + } + } + + String oldVersion = passport.getUPDVersion(); passport.setUPD(p); - HBCIUtils.log("installed new UPD with version "+passport.getUPDVersion(),HBCIUtils.LOG_INFO); + + HBCIUtils.log("installed new UPD [old version: " + oldVersion + ", new version: " + passport.getUPDVersion() + "]",HBCIUtils.LOG_INFO); HBCIUtilsInternal.getCallback().status(passport,HBCICallback.STATUS_INIT_UPD_DONE,passport.getUPD()); } } diff --git a/src/org/kapott/hbci/passport/AbstractPinTanPassport.java b/src/org/kapott/hbci/passport/AbstractPinTanPassport.java index 940d0570..030d8e51 100644 --- a/src/org/kapott/hbci/passport/AbstractPinTanPassport.java +++ b/src/org/kapott/hbci/passport/AbstractPinTanPassport.java @@ -1237,6 +1237,7 @@ private void applyTanMedia(GVTAN2Step hktan) HBCIUtils.log("we have to add the tan media",HBCIUtils.LOG_DEBUG); StringBuffer retData=new StringBuffer(); + retData.append(this.getUPD().getProperty("tanmedia.names","")); HBCIUtilsInternal.getCallback().callback(this,HBCICallback.NEED_PT_TANMEDIA, "*** Enter the name of your TAN media", HBCICallback.TYPE_TEXT, diff --git a/src/org/kapott/hbci/passport/HBCIPassportPinTan.java b/src/org/kapott/hbci/passport/HBCIPassportPinTan.java index 44fd4d83..c4568308 100644 --- a/src/org/kapott/hbci/passport/HBCIPassportPinTan.java +++ b/src/org/kapott/hbci/passport/HBCIPassportPinTan.java @@ -252,9 +252,12 @@ public void saveChanges() HBCIUtils.log("closing output stream", HBCIUtils.LOG_DEBUG); o.close(); - HBCIUtils.log("deleting old passport file " + passportfile, HBCIUtils.LOG_DEBUG); - if (!passportfile.delete()) - HBCIUtils.log("delete method for " + passportfile + " returned false", HBCIUtils.LOG_ERR); + 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;