public void saveChanges() { try { if (getPassportKey() == null) setPassportKey(calculatePassportKey(FOR_SAVE)); PBEParameterSpec paramspec = new PBEParameterSpec(CIPHER_SALT, CIPHER_ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.ENCRYPT_MODE, getPassportKey(), paramspec); File passportfile = new File(getFilename()); File directory = passportfile.getAbsoluteFile().getParentFile(); String prefix = passportfile.getName() + "_"; File tempfile = File.createTempFile(prefix, "", directory); ObjectOutputStream o = new ObjectOutputStream(new CipherOutputStream(new FileOutputStream(tempfile), cipher)); o.writeObject(getCountry()); o.writeObject(getBLZ()); o.writeObject(getHost()); o.writeObject(getPort()); o.writeObject(getUserId()); o.writeObject(getSysId()); o.writeObject(getSigId()); o.writeObject(getBPD()); o.writeObject(getUPD()); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { HBCIKey key = getKey(i, j); if (key != null) { o.writeObject( new HBCIKey(key.country, key.blz, key.userid, key.num, key.version, key.key)); } else o.writeObject(null); } } o.writeObject(getCID()); o.writeObject(getHBCIVersion()); o.writeObject(getCustomerId()); o.close(); passportfile.delete(); tempfile.renameTo(passportfile); HBCIKey k = getMyPrivateSigKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private sig key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } k = getMyPrivateEncKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private enc key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } } catch (Exception e) { throw new HBCI_Exception("*** saving of passport file failed", e); } }
/** * Legt die Versionsnummer des Segments manuell fest. Ist u.a. noetig, um HKTAN-Segmente in genau * der Version zu senden, in der auch die HITANS empfangen wurden. Andernfalls koennte es * passieren, dass wir ein HKTAN mit einem TAN-Verfahren senden, welches in dieser HKTAN-Version * gar nicht von der Bank unterstuetzt wird. Das ist ein Dirty-Hack, ich weiss ;) Falls das noch * IRGENDWO anders verwendet wird, muss man hoellisch aufpassen, dass alle Stellen, wo "this.name" * bzw. "this.segVersion" direkt oder indirekt verwendet wurde, ebenfalls beruecksichtigt werden. * * @param version die neue Versionsnummer. */ public synchronized void setSegVersion(String version) { if (version == null || version.length() == 0) { HBCIUtils.log( "tried to change segment version for task " + this.jobName + " explicit, but no version given", HBCIUtils.LOG_WARN); return; } // Wenn sich die Versionsnummer nicht geaendert hat, muessen wir die // Huehner ja nicht verrueckt machen ;) if (version.equals(this.segVersion)) return; HBCIUtils.log( "changing segment version for task " + this.jobName + " explicit from " + this.segVersion + " to " + version, HBCIUtils.LOG_INFO); // Der alte Name String oldName = this.name; // Neuer Name und neue Versionsnummer this.segVersion = version; this.name = this.jobName + version; // Bereits gesetzte llParams fixen String[] names = this.llParams.keySet().toArray(new String[this.llParams.size()]); for (String s : names) { if (!s.startsWith(oldName)) continue; // nicht betroffen // Alten Schluessel entfernen und neuen einfuegen String value = this.llParams.getProperty(s); String newName = s.replaceFirst(oldName, this.name); this.llParams.remove(s); this.llParams.setProperty(newName, value); } // Destination-Namen in den LowLevel-Parameter auf den neuen Namen umbiegen Enumeration<String> e = constraints.keys(); while (e.hasMoreElements()) { String frontendName = e.nextElement(); String[][] values = constraints.get(frontendName); for (int i = 0; i < values.length; ++i) { String[] value = values[i]; // value[0] ist das Target if (!value[0].startsWith(oldName)) continue; // Hier ersetzen wir z.Bsp. "TAN2Step5.process" gegen "TAN2Step3.process" value[0] = value[0].replaceFirst(oldName, this.name); } } }
/** * Erzeugt das Passport-Objekt. * * @throws Exception */ @Before public void beforeTest() throws Exception { // Testdatei im Arbeitsverzeichnis - sollte in der Run-Konfiguration auf ein eigenes Verzeichnis // zeigen String workDir = System.getProperty("user.dir"); InputStream in = new FileInputStream(workDir + "/DauerSEPAList.properties"); params.load(in); settings.put(HBCICallback.NEED_BLZ, params.getProperty("blz")); settings.put(HBCICallback.NEED_CUSTOMERID, params.getProperty("customerid")); settings.put(HBCICallback.NEED_HOST, params.getProperty("host")); settings.put(HBCICallback.NEED_PT_PIN, params.getProperty("pin")); settings.put(HBCICallback.NEED_USERID, params.getProperty("userid")); settings.put(HBCICallback.NEED_PT_SECMECH, params.getProperty("secmech")); Properties props = new Properties(); props.put("log.loglevel.default", Integer.toString(LOGLEVEL)); props.put("infoPoint.enabled", Boolean.FALSE.toString()); props.put( "client.passport.PinTan.filename", dir.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".pt"); props.put("client.passport.PinTan.init", "1"); props.put( "client.passport.PinTan.checkcert", "0"); // Check der SSL-Zertifikate abschalten - brauchen wir nicht fuer den Test // falls noetig props.put("client.passport.PinTan.proxy", ""); // host:port props.put("client.passport.PinTan.proxyuser", ""); props.put("client.passport.PinTan.proxypass", ""); HBCICallback callback = new HBCICallbackConsole() { public void callback( HBCIPassport passport, int reason, String msg, int datatype, StringBuffer retData) { // haben wir einen vordefinierten Wert? String value = settings.get(reason); if (value != null) { retData.replace(0, retData.length(), value); return; } // Ne, dann an Super-Klasse delegieren super.callback(passport, reason, msg, datatype, retData); } }; HBCIUtils.init(props, callback); this.passport = (HBCIPassportPinTan) AbstractHBCIPassport.getInstance("PinTan"); // init handler this.handler = new HBCIHandler(params.getProperty("hbciversion"), passport); // dump bpd // this.dump("BPD",this.passport.getBPD()); // Liste der unterstuetzten Geschaeftsvorfaelle ausgeben // this.dump("Supported GV",this.handler.getSupportedLowlevelJobs()); }
/** * ct. * * @param config die PINTAN-Config. * @throws RemoteException */ public TANDialog(PinTanConfig config) throws RemoteException { super(TANDialog.POSITION_CENTER); this.config = config; this.setSize(WINDOW_WIDTH, SWT.DEFAULT); // Deaktivierung der Anzeige von Sternen im TAN-Dialog. setShowPassword(this.config != null && this.config.getShowTan()); setLabelText(i18n.tr("TAN")); // Einmal aufrufen, damit der Text gesetzt wird. setText(null); String s = null; try { BeanService service = Application.getBootLoader().getBootable(BeanService.class); SynchronizeSession session = service.get(HBCISynchronizeBackend.class).getCurrentSession(); Konto konto = session != null ? session.getKonto() : null; if (konto != null) { s = konto.getBezeichnung(); String name = HBCIUtils.getNameForBLZ(konto.getBLZ()); if (name != null && name.length() > 0) s += " [" + name + "]"; } } catch (Exception e) { Logger.error("unable to determine current konto", e); } if (s != null) setTitle(i18n.tr("TAN-Eingabe - Konto {0}", s)); else setTitle(i18n.tr("TAN-Eingabe")); }
public static void main(String[] args) throws IOException { HBCIUtils.init(null, new HBCICallbackConsole()); String nameOld = readParam(args, 0, "Filename of old RDH passport file"); HBCIUtils.setParam("client.passport.RDH.filename", nameOld); HBCIUtils.setParam("client.passport.RDH.init", "1"); HBCIPassportInternal passportOld = (HBCIPassportInternal) AbstractHBCIPassport.getInstance("RDH"); String nameNew = readParam(args, 1, "Filename of new RDHNew passport file"); HBCIUtils.setParam("client.passport.RDHNew.filename", nameNew); HBCIUtils.setParam("client.passport.RDHNew.init", "0"); HBCIPassportInternal passportNew = (HBCIPassportInternal) AbstractHBCIPassport.getInstance("RDHNew"); passportNew.setCountry(passportOld.getCountry()); passportNew.setBLZ(passportOld.getBLZ()); passportNew.setHost(passportOld.getHost()); passportNew.setPort(passportOld.getPort()); passportNew.setUserId(passportOld.getUserId()); passportNew.setCustomerId(passportOld.getCustomerId()); passportNew.setSysId(passportOld.getSysId()); passportNew.setSigId(passportOld.getSigId()); passportNew.setProfileVersion(passportOld.getProfileVersion()); passportNew.setHBCIVersion(passportOld.getHBCIVersion()); passportNew.setBPD(passportOld.getBPD()); passportNew.setUPD(passportOld.getUPD()); ((HBCIPassportRDHNew) passportNew) .setInstSigKey(((AbstractRDHSWPassport) passportOld).getInstSigKey()); ((HBCIPassportRDHNew) passportNew) .setInstEncKey(((AbstractRDHSWPassport) passportOld).getInstEncKey()); ((HBCIPassportRDHNew) passportNew) .setMyPublicSigKey(((AbstractRDHSWPassport) passportOld).getMyPublicSigKey()); ((HBCIPassportRDHNew) passportNew) .setMyPrivateSigKey(((AbstractRDHSWPassport) passportOld).getMyPrivateSigKey()); ((HBCIPassportRDHNew) passportNew) .setMyPublicEncKey(((AbstractRDHSWPassport) passportOld).getMyPublicEncKey()); ((HBCIPassportRDHNew) passportNew) .setMyPrivateEncKey(((AbstractRDHSWPassport) passportOld).getMyPrivateEncKey()); passportNew.saveChanges(); passportOld.close(); passportNew.close(); }
/** * Setzen eines komplexen Job-Parameters (Geldbetrag). Einige Jobs benötigten Geldbeträge als * Parameter. Diese müssten auf "normalem" Wege durch zwei Aufrufe von {@link * #setParam(String,String)} erzeugt werden (je einer für den Wert und die Währung). Durch * Verwendung dieser Methode wird dieser Weg abgekürzt. Es wird ein Value-Objekt übergeben, für * welches die entsprechenden zwei <code>setParam(String,String)</code>-Aufrufe automatisch * erzeugt werden. * * @param paramname die Basis der Parameter für die Geldbetragsdaten (für "<code>btg.value</code>" * und "<code>btg.curr</code>" wäre das also "<code>btg</code>") * @param v ein Value-Objekt, aus welchem die zu setzenden Parameterdaten entnommen werden */ public void setParam(String paramname, Value v) { if (acceptsParam(paramname + ".value")) setParam(paramname + ".value", HBCIUtils.bigDecimal2String(v.getBigDecimalValue())); String curr = v.getCurr(); if (acceptsParam(paramname + ".curr") && curr != null && curr.length() != 0) setParam(paramname + ".curr", curr); }
private void done() { if (handler != null) { handler.close(); } if (passport != null) { passport.close(); } HBCIUtils.doneThread(); }
/** * BUGZILLA 150 * * @see PasswordDialog#setText(String) */ public void setText(String text) { //////////////////////////////////////////////////////////////////////////// // Bezeichnung des Kontos ermitteln String s = null; try { BeanService service = Application.getBootLoader().getBootable(BeanService.class); SynchronizeSession session = service.get(HBCISynchronizeBackend.class).getCurrentSession(); Konto konto = session != null ? session.getKonto() : null; if (konto != null) { s = konto.getBezeichnung(); String name = HBCIUtils.getNameForBLZ(konto.getBLZ()); if (name != null && name.length() > 0) s += " [" + name + "]"; } } catch (Exception e) { Logger.error("unable to determine current konto", e); } if (text == null || text.length() == 0) { text = i18n.tr("Bitte geben Sie eine TAN-Nummer ein."); } else { // Der Text kann ein "challenge" von der Bank enthalten. Dieser kann Formatierungen enthalten. // Z.Bsp. "<b>Text</b>", "<li>..." usw. Siehe // FinTS_3.0_Security_Sicherheitsverfahren_PINTAN_Rel_20101027_final_version.pdf // Seite 127. Das muss noch beachtet werden // Eigentlich kann man in den BPD noch nachschauen, ob fuer das TAN-Verfahren // "ischallengestructured=J", // aber das brauchen wir nicht. Wenn HTML-Tags drin stehen, ersetzen wir sie gegen // Formatierungen. text = text.replaceAll("<br>", "\n"); text = text.replaceAll("<p>", "\n\n"); text = text.replaceAll("<p>", "\n\n"); text = text.replaceAll("<ul>", "\n"); text = text.replaceAll("</ul>", ""); text = text.replaceAll("<ol>", "\n"); text = text.replaceAll("</ol>", ""); text = text.replaceAll("</li>", "\n"); text = text.replaceAll("<li>", " - "); // Unterstuetzen wir noch nicht text = text.replaceAll("<b>", ""); text = text.replaceAll("</b>", ""); text = text.replaceAll("<i>", ""); text = text.replaceAll("</i>", ""); text = text.replaceAll("<u>", ""); text = text.replaceAll("</u>", ""); } if (s != null) text += ("\n" + i18n.tr("Konto: {0}", s)); super.setText(text); }
/** @see de.willuhn.jameica.gui.dialogs.AbstractDialog#paint(org.eclipse.swt.widgets.Composite) */ protected void paint(Composite parent) throws Exception { Container group = new SimpleContainer(parent); group.addHeadline(i18n.tr("Details des Dauerauftrages")); Input kto = new LabelInput(auftrag.getKonto().getKontonummer()); kto.setComment(auftrag.getKonto().getBezeichnung()); group.addLabelPair(i18n.tr("Eigenes Konto"), kto); Input empfName = new LabelInput(auftrag.getGegenkontoName()); group.addLabelPair(i18n.tr("Name des Empfänger"), empfName); Input empfKto = new LabelInput(auftrag.getGegenkontoNummer()); empfKto.setComment( auftrag.getGegenkontoBLZ() + "/" + HBCIUtils.getNameForBLZ(auftrag.getGegenkontoBLZ())); group.addLabelPair(i18n.tr("Konto des Empfängers"), empfKto); LabelInput betrag = new LabelInput( HBCI.DECIMALFORMAT.format(auftrag.getBetrag()) + " " + auftrag.getKonto().getWaehrung()); betrag.setColor(Color.ERROR); group.addLabelPair(i18n.tr("Betrag"), betrag); group.addSeparator(); Date e = auftrag.getErsteZahlung(); String se = i18n.tr("Zum nächstmöglichen Termin"); if (e != null) se = HBCI.DATEFORMAT.format(e); Input ersteZahlung = new LabelInput(se); group.addLabelPair(i18n.tr("Erste Zahlung"), ersteZahlung); Date l = auftrag.getLetzteZahlung(); String sl = i18n.tr("keine End-Datum vorgegeben"); if (l != null) sl = HBCI.DATEFORMAT.format(l); Input letzteZahlung = new LabelInput(sl); group.addLabelPair(i18n.tr("Letzte Zahlung"), letzteZahlung); Input turnus = new LabelInput(TurnusHelper.createBezeichnung(auftrag.getTurnus())); group.addLabelPair(i18n.tr("Zahlungsturnus"), turnus); group.addHeadline(i18n.tr("Verwendungszweck")); group.addText(VerwendungszweckUtil.toString(auftrag, "\n"), false); if (auftrag.isActive()) group.addText( i18n.tr("Sind Sie sicher, daß Sie diese Änderungen jetzt zur Bank senden wollen?") + "\n", true); else group.addText( i18n.tr("Sind Sie sicher, daß Sie diesen Dauerauftrag jetzt ausführen wollen?") + "\n", true); super.paint(parent); getShell().setMinimumSize(getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT)); }
/* füllt das Objekt mit den Rückgabedaten. Dazu wird zuerst eine Liste aller Segmente erstellt, die Rückgabedaten für diesen Task enthalten. Anschließend werden die HBCI-Rückgabewerte (RetSegs) im outStore gespeichert. Danach werden die GV-spezifischen Daten im outStore abgelegt */ public void fillJobResult(HBCIMsgStatus status, int offset) { try { executed = true; Properties result = status.getData(); // nachsehen, welche antwortsegmente ueberhaupt // zu diesem task gehoeren // res-num --> segmentheader (wird für sortierung der // antwort-segmente benötigt) Hashtable<Integer, String> keyHeaders = new Hashtable<Integer, String>(); for (Enumeration i = result.keys(); i.hasMoreElements(); ) { String key = (String) (i.nextElement()); if (key.startsWith("GVRes") && key.endsWith(".SegHead.ref")) { String segref = result.getProperty(key); if ((Integer.parseInt(segref)) - offset == idx) { // nummer des antwortsegments ermitteln int resnum = 0; if (key.startsWith("GVRes_")) { resnum = Integer.parseInt(key.substring(key.indexOf('_') + 1, key.indexOf('.'))); } keyHeaders.put( new Integer(resnum), key.substring(0, key.length() - (".SegHead.ref").length())); } } } saveBasicValues(result, idx + offset); saveReturnValues(status, idx + offset); // segment-header-namen der antwortsegmente in der reihenfolge des // eintreffens sortieren Object[] resnums = keyHeaders.keySet().toArray(new Object[0]); Arrays.sort(resnums); // alle antwortsegmente durchlaufen for (int i = 0; i < resnums.length; i++) { // dabei reihenfolge des eintreffens beachten String header = keyHeaders.get(resnums[i]); extractPlaintextResults(status, header, contentCounter); extractResults(status, header, contentCounter++); // der contentCounter wird fuer jedes antwortsegment um 1 erhoeht } } catch (Exception e) { String msg = HBCIUtilsInternal.getLocMsg("EXCMSG_CANTSTORERES", getName()); if (!HBCIUtilsInternal.ignoreError( getMainPassport(), "client.errors.ignoreJobResultStoreErrors", msg + ": " + HBCIUtils.exception2String(e))) { throw new HBCI_Exception(msg, e); } } }
public static void main(String[] args) throws IOException { try { HBCIUtils.init(null, new MyCallback()); readBasicParams(); readPassportParams(); passport = AbstractHBCIPassport.getInstance(); readHBCIVersion(); readActions(); if (HBCIUtils.getParam("action.resetBPD").equals("1")) { passport.clearBPD(); } if (HBCIUtils.getParam("action.resetUPD").equals("1")) { passport.clearUPD(); } hbciHandle = new HBCIHandler(HBCIUtils.getParam("client.passport.hbciversion.default"), passport); /* HBCIExecStatus ret=hbciHandle.execute(); System.out.println("ExecStatus"); System.out.println(ret.toString()); System.out.println("ExecStatusEnd"); System.out.println("ExecStatusError"); System.out.println(ret.getErrorString()); System.out.println("ExecStatusErrorEnd"); */ printSupportedGVs(hbciHandle); System.out.println(); System.out.println("finished."); System.out.println(); } finally { if (hbciHandle != null) { hbciHandle.close(); } else if (passport != null) { passport.close(); } } }
@Override public final void run() { init(); try { prepare(); execute(); } catch (Exception e) { HBCIUtils.log(e); } finally { done(); } }
private void _checkAccountCRC(String frontendname, String blz, String number) { // pruefsummenberechnung nur wenn blz/kontonummer angegeben sind if (blz == null || number == null) { return; } if (blz.length() == 0 || number.length() == 0) { return; } // daten merken, die im urspruenglich verwendet wurden (um spaeter // zu wissen, ob sie korrigiert wurden) String orig_blz = blz; String orig_number = number; while (true) { // daten validieren boolean crcok = HBCIUtils.checkAccountCRC(blz, number); // aktuelle daten merken String old_blz = blz; String old_number = number; if (!crcok) { // wenn beim validieren ein fehler auftrat, nach neuen daten fragen StringBuffer sb = new StringBuffer(blz).append("|").append(number); HBCIUtilsInternal.getCallback() .callback( getMainPassport(), HBCICallback.HAVE_CRC_ERROR, HBCIUtilsInternal.getLocMsg("CALLB_HAVE_CRC_ERROR"), HBCICallback.TYPE_TEXT, sb); int idx = sb.indexOf("|"); blz = sb.substring(0, idx); number = sb.substring(idx + 1); } if (blz.equals(old_blz) && number.equals(old_number)) { // blz und kontonummer auch nach rueckfrage unveraendert, // also tatsaechlich mit diesen daten weiterarbeiten break; } } if (!blz.equals(orig_blz)) { setParam(frontendname + ".KIK.blz", blz); } if (!number.equals(orig_number)) { setParam(frontendname + ".number", number); } }
/** * Schliesst das Passport-Objekt und loescht die Passport-Datei. * * @throws Exception */ @After public void afterTest() throws Exception { try { if (this.passport != null) this.passport.close(); File file = new File(this.passport.getFileName()); if (!file.delete()) throw new Exception("unable to delete " + file); } finally { try { if (this.handler != null) this.handler.close(); } finally { HBCIUtils.done(); } } }
private static void readBasicParams() throws IOException { readParam( "client.connection.localPort", null, "local tcp-port to be used for outgoing connections"); readParam( "comm.standard.socks.server", null, "SOCKS server to be used for outgoing connections (will be ignored for PIN/TAN)"); readParam( "log.loglevel.default", "5", "loglevel for HBCI4Java-messages (from 0(no logging) to 5(really heavy)"); readParam( "kernel.rewriter", HBCIUtils.getParam("kernel.rewriter"), "rewriter modules to be activated"); }
private static void readParam(String paramName, String def, String descr) throws IOException { System.out.println(); System.out.println(descr); System.out.println("press ENTER to accept the default; '-' to set no value for this parameter"); System.out.print(paramName + " [" + def + "]: "); System.out.flush(); String value = new BufferedReader(new InputStreamReader(System.in)).readLine(); if (value.equals("-")) { value = null; } else if (value.length() == 0) { value = def; } if (value != null) { System.out.println(paramName + "=" + value); HBCIUtils.setParam(paramName, value); } }
/* wenn wenigstens ein HBCI-Rückgabewert für den aktuellen GV gefunden wurde, so werden im outStore zusätzlich die entsprechenden Dialog-Parameter gespeichert (Property @c basic.*) */ private void saveBasicValues(Properties result, int ref) { // wenn noch keine basic-daten gespeichert sind if (jobResult.getDialogId() == null) { // Pfad des originalen MsgHead-Segmentes holen und um "orig_" ergaenzen, // um den Key fuer die entsprechenden Daten in das result-Property zu erhalten String msgheadName = "orig_" + result.getProperty("1"); jobResult.storeResult("basic.dialogid", result.getProperty(msgheadName + ".dialogid")); jobResult.storeResult("basic.msgnum", result.getProperty(msgheadName + ".msgnum")); jobResult.storeResult("basic.segnum", Integer.toString(ref)); HBCIUtils.log( "basic values for " + getName() + " set to " + jobResult.getDialogId() + "/" + jobResult.getMsgNum() + "/" + jobResult.getSegNum(), HBCIUtils.LOG_DEBUG); } }
private void _checkIBANCRC(String frontendname, String iban) { // pruefsummenberechnung nur wenn iban vorhanden ist if (iban == null || iban.length() == 0) { return; } // daten merken, die im urspruenglich verwendet wurden (um spaeter // zu wissen, ob sie korrigiert wurden) String orig_iban = iban; while (true) { boolean crcok = HBCIUtils.checkIBANCRC(iban); String old_iban = iban; if (!crcok) { StringBuffer sb = new StringBuffer(iban); HBCIUtilsInternal.getCallback() .callback( getMainPassport(), HBCICallback.HAVE_IBAN_ERROR, HBCIUtilsInternal.getLocMsg("CALLB_HAVE_IBAN_ERROR"), HBCICallback.TYPE_TEXT, sb); iban = sb.toString(); } if (iban.equals(old_iban)) { // iban unveraendert break; } } if (!iban.equals(orig_iban)) { setParam(frontendname + ".iban", iban); } }
/** * Laedt einen existierenden oder erstellt einen neuen Schluessel. * * @param key der Schluessel. * @param create true, wenn ein neuer erstellt werden soll. * @return der Schluessel. * @throws ApplicationException * @throws OperationCanceledException */ private HBCIPassport load(RDHKey key, boolean create) throws ApplicationException, OperationCanceledException { HBCICallback callback = null; try { String filename = key.getFilename(); if (create) { Logger.info("create " + getPassportType() + " key " + filename); } else { Logger.info("load " + getPassportType() + " key " + filename); File f = new File(filename); if (!f.exists()) { InsertKeyDialog kd = new InsertKeyDialog(f); Boolean b = (Boolean) kd.open(); if (b == null || !b.booleanValue()) throw new OperationCanceledException( i18n.tr("Schlüsseldiskette nicht eingelegt oder nicht lesbar")); } } HBCI plugin = (HBCI) Application.getPluginLoader().getPlugin(HBCI.class); callback = plugin.getHBCICallback(); if (callback != null && (callback instanceof HBCICallbackSWT)) ((HBCICallbackSWT) callback).setCurrentHandle(new PassportHandleImpl()); else Logger.warn("unable to register current handle, callback: " + callback); String type = getPassportType(); HBCIUtils.setParam("client.passport.default", type); // ist eigentlich nicht noetig HBCIUtils.setParam("client.passport." + type + ".filename", filename); HBCIUtils.setParam("client.passport." + type + ".init", "1"); return AbstractHBCIPassport.getInstance(type); } catch (Exception e) { OperationCanceledException oce = (OperationCanceledException) HBCIFactory.getCause(e, OperationCanceledException.class); if (oce != null) throw oce; ApplicationException ae = (ApplicationException) HBCIFactory.getCause(e, ApplicationException.class); if (ae != null) throw ae; NeedKeyAckException ack = (NeedKeyAckException) HBCIFactory.getCause(e, NeedKeyAckException.class); if (ack != null) { String text = i18n.tr( "Bitte senden Sie den INI-Brief an Ihre Bank und warten Sie auf die Freischaltung durch die Bank."); Application.getMessagingFactory() .sendMessage(new StatusBarMessage(text, StatusBarMessage.TYPE_ERROR)); throw new ApplicationException(text); } InvalidPassphraseException ipe = (InvalidPassphraseException) HBCIFactory.getCause(e, InvalidPassphraseException.class); if (ipe != null) { String text = i18n.tr("Das Passwort für die Schlüsseldatei ist falsch."); Application.getMessagingFactory() .sendMessage(new StatusBarMessage(text, StatusBarMessage.TYPE_ERROR)); throw new ApplicationException(text); } // Keine brauchbare Exception gefunden Logger.error("unable to load " + getPassportType() + " key", e); throw new ApplicationException( i18n.tr("Fehler beim Laden des Schlüssels: {0}", e.getMessage()), e); } finally { if (callback != null && (callback instanceof HBCICallbackSWT)) ((HBCICallbackSWT) callback).setCurrentHandle(null); } }
private void init() { HBCIUtils.initThread(properties, callback); }
public void addSignaturePassport(HBCIPassport passport, String role) { HBCIUtils.log("adding additional passport to job " + getName(), HBCIUtils.LOG_DEBUG); passports.addPassport((HBCIPassportInternal) passport, role); }
/* gibt zu einem gegebenen jobnamen des namen dieses jobs in der syntax-spez. * zurück (also mit angehängter versionsnummer) */ private void findSpecNameForGV(String jobnameLL, HBCIHandler handler) { int maxVersion = 0; StringBuffer key = new StringBuffer(); // alle param-segmente durchlaufen Properties bpd = handler.getPassport().getBPD(); for (Enumeration i = bpd.propertyNames(); i.hasMoreElements(); ) { String path = (String) i.nextElement(); key.setLength(0); key.append(path); if (key.indexOf("Params") == 0) { key.delete(0, key.indexOf(".") + 1); // wenn segment mit namen des aktuellen jobs gefunden wurde if (key.indexOf(jobnameLL + "Par") == 0 && key.toString().endsWith(".SegHead.code")) { // willuhn 2011-06-06 Maximal zulaessige Segment-Version ermitteln // Hintergrund: Es gibt Szenarien, in denen nicht die hoechste verfuegbare // Versionsnummer verwendet werden kann, weil die Voraussetzungen impliziert, // die beim User nicht gegeben sind. Mit diesem Parameter kann die maximale // Version nach oben begrenzt werden. In AbstractPinTanPassport#setBPD() ist // ein konkretes Beispiel enthalten (Bank macht HITANS5 und damit HHD 1.4, der // User hat aber nur ein HHD-1.3-tauglichen TAN-Generator) int maxAllowedVersion = Integer.parseInt( HBCIUtils.getParam( "kernel.gv." + bpd.getProperty(path, "default") + ".segversion.max", "0")); key.delete(0, jobnameLL.length() + ("Par").length()); // extrahieren der versionsnummer aus dem spez-namen String st = key.substring(0, key.indexOf(".")); int version = 0; try { version = Integer.parseInt(st); } catch (Exception e) { HBCIUtils.log( "found invalid job version: key=" + key + ", jobnameLL=" + jobnameLL + " (this is a known, but harmless bug)", HBCIUtils.LOG_WARN); } // willuhn 2011-06-06 Segment-Versionen ueberspringen, die groesser als die max. // zulaessige sind if (maxAllowedVersion > 0 && version > maxAllowedVersion) { HBCIUtils.log( "skipping segment version " + version + " for task " + jobnameLL + ", larger than allowed version " + maxAllowedVersion, HBCIUtils.LOG_INFO); continue; } // merken der größten jemals aufgetretenen versionsnummer if (version != 0) { HBCIUtils.log( "task " + jobnameLL + " is supported with segment version " + st, HBCIUtils.LOG_DEBUG2); if (version > maxVersion) { maxVersion = version; } } } } } if (maxVersion == 0) { throw new JobNotSupportedException(jobnameLL); } // namen+versionsnummer speichern this.jobName = jobnameLL; this.segVersion = Integer.toString(maxVersion); this.name = jobnameLL + this.segVersion; }
public HBCIPassportRDH(Object initObject) { this(initObject, 0); String header = getParamHeader(); String fname = HBCIUtils.getParam(header + ".filename"); boolean init = HBCIUtils.getParam(header + ".init", "1").equals("1"); if (fname == null) { throw new NullPointerException(header + ".filename must not be null"); } HBCIUtils.log("loading passport data from file " + fname, HBCIUtils.LOG_DEBUG); setFilename(fname); if (init) { HBCIUtils.log("loading data from file " + fname, HBCIUtils.LOG_DEBUG); setFilterType("None"); setPort(new Integer(3000)); if (!new File(fname).canRead()) { HBCIUtils.log("have to create new passport file", HBCIUtils.LOG_WARN); askForMissingData(true, true, true, true, false, true, true); saveChanges(); } ObjectInputStream o = null; try { int retries = Integer.parseInt(HBCIUtils.getParam("client.retries.passphrase", "3")); while (true) { // loop for entering the correct passphrase if (getPassportKey() == null) setPassportKey(calculatePassportKey(FOR_LOAD)); PBEParameterSpec paramspec = new PBEParameterSpec(CIPHER_SALT, CIPHER_ITERATIONS); Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES"); cipher.init(Cipher.DECRYPT_MODE, getPassportKey(), paramspec); o = null; try { o = new ObjectInputStream(new CipherInputStream(new FileInputStream(fname), cipher)); } catch (StreamCorruptedException e) { setPassportKey(null); retries--; if (retries <= 0) throw new InvalidPassphraseException(); } if (o != null) break; } setCountry((String) (o.readObject())); setBLZ((String) (o.readObject())); setHost((String) (o.readObject())); setPort((Integer) (o.readObject())); setUserId((String) (o.readObject())); setSysId((String) (o.readObject())); setSigId((Long) (o.readObject())); setBPD((Properties) (o.readObject())); setUPD((Properties) (o.readObject())); for (int i = 0; i < 3; i++) { for (int j = 0; j < 2; j++) { setKey(i, j, (HBCIKey) (o.readObject())); } } setCID((String) (o.readObject())); setHBCIVersion((String) o.readObject()); setCustomerId((String) o.readObject()); HBCIKey k = getMyPrivateSigKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private sig key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } k = getMyPrivateEncKey(); if (k != null && k.key != null && !(k.key instanceof RSAPrivateCrtKey)) { HBCIUtils.log( "private enc key is no CRT key, please contact the author!", HBCIUtils.LOG_WARN); } } catch (Exception e) { throw new HBCI_Exception("*** loading of passport file failed", e); } try { o.close(); } catch (Exception e) { HBCIUtils.log(e); } if (askForMissingData(true, true, true, true, false, true, true)) saveChanges(); } }
/** * Setzen eines Job-Parameters, bei dem ein Datums als Wert erwartet wird. Diese Methode dient als * Wrapper für {@link #setParam(String,String)}, um das Datum in einen korrekt formatierten String * umzuwandeln. Das "richtige" Datumsformat ist dabei abhängig vom aktuellen Locale. * * @param paramName Name des zu setzenden Job-Parameters * @param date Datum, welches als Wert für den Job-Parameter benutzt werden soll */ public void setParam(String paramName, Date date) { setParam(paramName, HBCIUtils.date2StringISO(date)); }
protected void setLowlevelParam(String key, String value) { HBCIUtils.log("setting lowlevel parameter " + key + " = " + value, HBCIUtils.LOG_DEBUG); llParams.setProperty(key, value); }
private static void readPassportParams() throws IOException { readParam( "client.passport.default", null, "enter type of media you have (Anonymous, DDV, RDHNew, RDH (deprecated), PinTan, SIZRDHFile or RDHXFile)"); String type = HBCIUtils.getParam("client.passport.default", ""); if (type.equals("Anonymous")) { readParam( "client.passport.Anonymous.filename", "passport_anon.dat", "filename to be used for your HBCI4Java keyfile."); readParam("client.passport.Anonymous.init", "1", "never change this value!"); } else if (type.equals("DDV")) { readParam( "client.passport.DDV.path", "./", "the path where to store a file to cash information about your HBCI account"); readParam( "client.passport.DDV.libname.ddv", "/home/kleiner/projects/hbci2/chipcard/lib/libhbci4java-card-linux.so", "the name of the library needed to use the CTAPI interface of your chipcard terminal"); readParam( "client.passport.DDV.libname.ctapi", "/usr/lib/libctapi-cyberjack.so", "the name of the library containing the CTAPI interface to your chipcard terminal"); readParam( "client.passport.DDV.port", "1", "the port to which your chipcard terminal is connected (in most cases 1, 0 or 2)"); readParam( "client.passport.DDV.ctnumber", "0", "the logical number for your chipcard terminal, can be 0 in most cases"); readParam( "client.passport.DDV.usebio", "0", "use the biometric interface of Reiner-SCT chipcard terminals (0 or 1)"); readParam( "client.passport.DDV.softpin", "0", "use the keypad of your chipcard terminal (0) or your PC-keyboard (1) to enter the PIN for your HBCI chipcard"); readParam( "client.passport.DDV.entryidx", "1", "enter the index, which HBCI account stored on the card should be used"); } else if (type.equals("RDH")) { readParam( "client.passport.RDH.filename", "my_passport.dat", "filename to be used for your HBCI4Java keyfile. DONT LOOSE THIS FILE!"); readParam("client.passport.RDH.init", "1", "never change this value!"); } else if (type.equals("RDHNew")) { readParam( "client.passport.RDHNew.filename", "my_passport.dat", "filename to be used for your HBCI4Java keyfile. DONT LOOSE THIS FILE!"); readParam("client.passport.RDHNew.init", "1", "never change this value!"); } else if (type.equals("PinTan")) { readParam( "client.passport.PinTan.filename", "my_passport_pintan.dat", "filename to be used for your PIN/TAN keyfile"); readParam( "client.passport.PinTan.checkcert", "1", "whether to check the HTTPS-certificate of the server (1) or not (0)"); readParam( "client.passport.PinTan.certfile", null, "filename with a SSL-certificate for HTTPS-communication; leave blank when you don't want to check the certificate or when the certificate can be checked with the java-builtin CA database"); readParam( "client.passport.PinTan.proxy", null, "host:port for proxy server to be used; leave blank when you want direct connections to be made"); readParam( "client.passport.PinTan.proxyuser", null, "when you need proxy authentication enter the username here; leave empty to be queried on demand"); readParam( "client.passport.PinTan.proxypass", null, "when you need proxy authentication enter the passphrase here; leave empty to be queried on demand"); readParam("client.passport.PinTan.init", "1", "never change this value!"); } else if (type.equals("SIZRDHFile")) { readParam( "client.passport.SIZRDHFile.filename", "secret.key", "filename of SIZ-RDH-keyfile to be used. MAKE A BACKUP OF THIS FILE BEFORE USE!"); readParam( "client.passport.SIZRDHFile.libname", "/usr/lib/libhbci4java-sizrdh.so", "filename of native library for accessing SIZ RDH files"); readParam("client.passport.SIZRDHFile.init", "1", "never change this value!"); } else if (type.equals("RDHXFile")) { readParam( "client.passport.RDHXFile.filename", "secret.key", "filename of SIZ-RDH2-keyfile to be used. MAKE A BACKUP OF THIS FILE BEFORE USE!"); readParam("client.passport.RDHXFile.init", "1", "never change this value!"); } }