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);
      }
    }
  }
Exemple #3
0
 @Override
 public final void run() {
   init();
   try {
     prepare();
     execute();
   } catch (Exception e) {
     HBCIUtils.log(e);
   } finally {
     done();
   }
 }
Exemple #4
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);
    }
  }
  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 #6
0
 protected void setLowlevelParam(String key, String value) {
   HBCIUtils.log("setting lowlevel parameter " + key + " = " + value, HBCIUtils.LOG_DEBUG);
   llParams.setProperty(key, value);
 }
Exemple #7
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;
  }
Exemple #8
0
 public void addSignaturePassport(HBCIPassport passport, String role) {
   HBCIUtils.log("adding additional passport to job " + getName(), HBCIUtils.LOG_DEBUG);
   passports.addPassport((HBCIPassportInternal) passport, role);
 }