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);
    }
  }
Exemple #2
0
  /**
   * 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());
  }
Exemple #4
0
  /**
   * 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();
  }
Exemple #6
0
  /**
   * 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);
  }
Exemple #7
0
 private void done() {
   if (handler != null) {
     handler.close();
   }
   if (passport != null) {
     passport.close();
   }
   HBCIUtils.doneThread();
 }
Exemple #8
0
  /**
   * 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));
  }
Exemple #10
0
  /* 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);
      }
    }
  }
Exemple #11
0
  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();
      }
    }
  }
Exemple #12
0
 @Override
 public final void run() {
   init();
   try {
     prepare();
     execute();
   } catch (Exception e) {
     HBCIUtils.log(e);
   } finally {
     done();
   }
 }
Exemple #13
0
  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();
      }
    }
  }
Exemple #15
0
 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");
 }
Exemple #16
0
  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);
    }
  }
Exemple #17
0
  /* 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);
    }
  }
Exemple #18
0
  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);
    }
  }
Exemple #19
0
  /**
   * 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);
    }
  }
Exemple #20
0
 private void init() {
   HBCIUtils.initThread(properties, callback);
 }
Exemple #21
0
 public void addSignaturePassport(HBCIPassport passport, String role) {
   HBCIUtils.log("adding additional passport to job " + getName(), HBCIUtils.LOG_DEBUG);
   passports.addPassport((HBCIPassportInternal) passport, role);
 }
Exemple #22
0
  /* 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();
    }
  }
Exemple #24
0
 /**
  * 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));
 }
Exemple #25
0
 protected void setLowlevelParam(String key, String value) {
   HBCIUtils.log("setting lowlevel parameter " + key + " = " + value, HBCIUtils.LOG_DEBUG);
   llParams.setProperty(key, value);
 }
Exemple #26
0
  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!");
    }
  }