Пример #1
0
  /**
   * Setzen eines Job-Parameters. Für alle Highlevel-Jobs ist in der Package-Beschreibung zum
   * Package {@link org.kapott.hbci.GV} eine Auflistung aller Jobs und deren Parameter zu finden.
   * Für alle Lowlevel-Jobs kann eine Liste aller Parameter entweder mit dem Tool {@link
   * org.kapott.hbci.tools.ShowLowlevelGVs} oder zur Laufzeit durch Aufruf der Methode {@link
   * org.kapott.hbci.manager.HBCIHandler#getLowlevelJobParameterNames(String)} ermittelt werden.
   *
   * <p>Bei Verwendung dieser oder einer der anderen <code>setParam()</code>-Methoden werden
   * zusätzlich einige der Job-Restriktionen (siehe {@link #getJobRestrictions()}) analysiert. Beim
   * Verletzen einer der überprüften Einschränkungen wird eine Exception mit einer entsprechenden
   * Meldung erzeugt. Diese Überprüfung findet allerdings nur bei Highlevel-Jobs statt.
   *
   * @param paramName der Name des zu setzenden Parameters.
   * @param index Der index oder <code>null</code>, wenn kein Index gewünscht ist
   * @param value Wert, auf den der Parameter gesetzt werden soll
   */
  @Override
  public void setParam(String paramName, Integer index, String value) {
    // wenn der Parameter einen LogFilter-Level gesetzt hat, dann den
    // betreffenden Wert zum Logfilter hinzufügen
    Integer logFilterLevel = logFilterLevels.get(paramName);
    if (logFilterLevel != null && logFilterLevel.intValue() != 0) {
      LogFilter.getInstance().addSecretData(value, "X", logFilterLevel.intValue());
    }

    String[][] destinations = constraints.get(paramName);
    HBCIPassportInternal passport = getMainPassport();

    if (destinations == null) {
      String msg =
          HBCIUtilsInternal.getLocMsg(
              "EXCMSG_PARAM_NOTNEEDED", new String[] {paramName, getName()});
      if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg))
        throw new InvalidUserDataException(msg);
      destinations = new String[0][];
    }

    if (value == null || value.length() == 0) {
      String msg =
          HBCIUtilsInternal.getLocMsg("EXCMSG_PARAM_EMPTY", new String[] {paramName, getName()});
      if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg))
        throw new InvalidUserDataException(msg);
      value = "";
    }

    if (index != null && !indexedConstraints.contains(paramName)) {
      String msg =
          HBCIUtilsInternal.getLocMsg(
              "EXCMSG_PARAM_NOTINDEXED", new String[] {paramName, getName()});
      if (!HBCIUtilsInternal.ignoreError(passport, "client.errors.ignoreWrongJobDataErrors", msg))
        throw new InvalidUserDataException(msg);
    }

    for (int i = 0; i < destinations.length; i++) {
      String[] valuePair = destinations[i];
      String lowlevelname = valuePair[0];

      if (index != null && indexedConstraints.contains(paramName)) {
        lowlevelname = insertIndex(lowlevelname, index);
      }

      setLowlevelParam(lowlevelname, value);
    }
  }
Пример #2
0
  public void verifyConstraints() {
    HBCIPassportInternal passport = getMainPassport();

    // durch alle gespeicherten constraints durchlaufen
    for (Iterator<String> i = constraints.keySet().iterator(); i.hasNext(); ) {
      // den frontendnamen für das constraint ermitteln
      String frontendName = (i.next());

      // dazu alle ziel-lowlevelparameter mit default-wert extrahieren
      String[][] values = (constraints.get(frontendName));

      // durch alle ziel-lowlevel-parameternamen durchlaufen, die gesetzt werden müssen
      for (int j = 0; j < values.length; j++) {
        // Array mit Pfadname und default Wert
        String[] value = values[j];
        // lowlevel-name (Pfadname) des parameters (z.B. wird Frontendname src.bic zum Pfad My.bic
        String destination = value[0];
        // default-wert des parameters, wenn keiner angegeben wurde
        String defValue = value[1];

        String givenContent = getLowlevelParam(destination);
        if (givenContent == null && indexedConstraints.contains(frontendName)) {
          givenContent = getLowlevelParam(insertIndex(destination, 0));
        }

        String content = null;

        content = defValue;
        if (givenContent != null && givenContent.length() != 0) content = givenContent;

        if (content == null) {
          String msg = HBCIUtilsInternal.getLocMsg("EXC_MISSING_HL_PROPERTY", frontendName);
          if (!HBCIUtilsInternal.ignoreError(
              passport, "client.errors.ignoreWrongJobDataErrors", msg))
            throw new InvalidUserDataException(msg);
          content = "";
        }

        // evtl. default-wert als aktuellen wert setzen (naemlich dann,
        // wenn kein content angegeben wurde (givenContent==null), aber
        // ein default-Content definiert wurde (content.length()!=0)
        if (content.length() != 0 && givenContent == null) setLowlevelParam(destination, content);
      }
    }

    // verify if segment can be created
    SEG seg = null;
    try {
      seg = createJobSegment();
      seg.validate();
    } catch (Exception ex) {
      throw new HBCI_Exception("*** the job segment for this task can not be created", ex);
    } finally {
      if (seg != null) {
        SEGFactory.getInstance().unuseObject(seg);
      }
    }
  }
Пример #3
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);
      }
    }
  }
Пример #4
0
 public int checkSegSeq(int value) {
   int num = Integer.parseInt(getValueOfDE(getPath() + ".SegHead.seq"));
   if (num != value) {
     if (!HBCIUtilsInternal.ignoreError(
         null,
         "client.errors.ignoreSegSeqErrors",
         HBCIUtilsInternal.getLocMsg(
             "EXCMSG_INVSEQNUM", new Object[] {getPath(), new Integer(value), new Integer(num)})))
       throw new InvalidSegSeqException(getPath(), value, num);
   }
   return value + 1;
 }
Пример #5
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);
    }
  }
Пример #6
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);
    }
  }
Пример #7
0
 public static String getLocMsg(String key, Object o) {
   return HBCIUtilsInternal.getLocMsg(key, new Object[] {o});
 }