/**
   * Dialog zur Eingabe des Passworts fuer Schluesseldateien.
   *
   * @param passport der HBCI-Passport.
   * @return eingegebenes Passwort.
   * @throws Exception
   */
  public static synchronized String getKeyPassword(HBCIPassport passport) throws Exception {
    HBCI plugin = (HBCI) Application.getPluginLoader().getPlugin(HBCI.class);
    boolean forceAsk =
        plugin.getResources().getSettings().getBoolean("hbcicallback.askpassphrase.force", false);

    boolean secondTry = System.currentTimeMillis() - lastTry < 600l;
    if (secondTry) {
      Logger.warn(
          "cached key seems to be wrong, asking user, passport: " + passport.getClass().getName());
      // wir waren grad eben schonmal hier. Das Passwort muss falsch sein. Wir loeschen es aus dem
      // Cache
      clearPINCache(passport);
    }

    if (!forceAsk && !secondTry) {
      String pw = getCachedPIN(passport);
      if (pw != null) {
        Logger.info("using cached password, passport: " + passport.getClass().getName());
        lastTry = System.currentTimeMillis();
        return pw; // wir haben ein gecachtes Passwort, das nehmen wir
      }
    }
    lastTry = 0;

    // Wir haben nichts im Cache oder wurden explizit aufgefordert, nach dem Passwort zu fragen
    KeyPasswordLoadDialog dialog = new KeyPasswordLoadDialog(passport);
    String pw = (String) dialog.open();
    if (!forceAsk) // Nur cachen, wenn die Passwort-Abfrage nicht erzwungen war
    setCachedPIN(passport, pw);
    return pw;
  }