示例#1
0
GWEN_INHERIT(AIO_OFX_GROUP, AIO_OFX_GROUP_STATUS)


typedef struct AIO_OFX_GROUP_STATUS_ERROR AIO_OFX_GROUP_STATUS_ERROR;
struct AIO_OFX_GROUP_STATUS_ERROR {
  int code;           /**< The error's code */
  const char *name;        /**< The error's name */
  const char *description; /**< The long description of the error */
};



/* this list has been copied from LibOFX */
static AIO_OFX_GROUP_STATUS_ERROR error_msg_list[] = {
  {0,    I18S("Success"), I18S("The server successfully processed the request.")},
  {1,    I18S("Client is up-to-date"), I18S("Based on the client timestamp, the client has the latest information. The response does not supply any additional information.")},
  {2000, I18S("General error"), I18S("Error other than those specified by the remaining error codes. (Note: Servers should provide a more specific error whenever possible. Error code 2000 should be reserved for cases in which a more specific code is not available.)")},
  {2001, I18S("Invalid account"), I18S("The account was invalid (whatever that means)")},
  {2002, I18S("General account error"), I18S("Account error not specified by the remaining error codes.")},
  {2003, I18S("Account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")},
  {2004, I18S("Account closed"), I18S("The specified account number corresponds to an account that has been closed.")},
  {2005, I18S("Account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")},
  {2006, I18S("Source account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")},
  {2007, I18S("Source account closed"), I18S("The specified account number corresponds to an account that has been closed.")},
  {2008, I18S("Source account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")},
  {2009, I18S("Destination account not found"), I18S("The specified account number does not correspond to one of the user's accounts.")},
  {2010, I18S("Destination account closed"), I18S("The specified account number corresponds to an account that has been closed.")},
  {2011, I18S("Destination account not authorized"), I18S("The user is not authorized to perform this action on the account, or the server does not allow this type of action to be performed on the account.")},
  {2012, I18S("Invalid amount"), I18S("The specified amount is not valid for this action; for example, the user specified a negative payment amount.")},
  {2014, I18S("Date too soon"), I18S("The server cannot process the requested action by the date specified by the user.")},
示例#2
0
static const char *csv_dateFormats[]= {
  "DD.MM.YYYY",
  "dD.mM.YYYY",
  "MM/DD/YYYY",
  "mM/dD/YYYY",
  "DD/MM/YYYY",
  "dD/mM/YYYY",
  "YYYY/MM/DD",
  "YYYY/mM/dD",
  NULL
};


static const char *csv_delimiters[]= {
  "TAB", I18S("Tabulator (default)"),
  "SPACE", I18S("Space"),
  ",", I18S("Komma (,)"),
  ";", I18S("Semicolon (;)"),
  ":", I18S("Colon (:)"),
  NULL
};


static const char *csv_subjects[]= {
  "transactions", I18S("Booked Transactions (default)"),
  "notedTransactions", I18S("Noted Transactions"),
  NULL
};

示例#3
0
int AO_Provider__AddSignOn(AB_PROVIDER *pro,
			   AB_USER *u,
			   GWEN_BUFFER *buf) {
  GWEN_TIME *ti;
  const char *s;
  char userpass[64];

  ti=GWEN_CurrentTime();
  assert(ti);

  GWEN_Buffer_AppendString(buf, "<SIGNONMSGSRQV1>");
  GWEN_Buffer_AppendString(buf, "<SONRQ>");
  GWEN_Buffer_AppendString(buf, "<DTCLIENT>");
  if (AO_User_GetFlags(u) & AO_USER_FLAGS_SEND_SHORT_DATE)
    GWEN_Time_toString(ti, "YYYYMMDDhhmmss", buf);
  else
    GWEN_Time_toString(ti, "YYYYMMDDhhmmss.000", buf);

  s=AB_User_GetUserId(u);
  if (s) {
    GWEN_Buffer_AppendString(buf, "<USERID>");
    GWEN_Buffer_AppendString(buf, s);
    GWEN_Buffer_AppendString(buf, "\r\n");
  }
  else {
    DBG_ERROR(AQOFXCONNECT_LOGDOMAIN,
	      "Missing user id, should not happen");
    GWEN_Gui_ProgressLog(0,
			 GWEN_LoggerLevel_Error,
			 I18N("Missing user id, should not happen"));
    return GWEN_ERROR_INTERNAL;
  }

  /* get password */
  userpass[0]=0;
  while (strlen(userpass)<4) {
    GWEN_BUFFER *nbuf;
    int rv;
    char msg[]=I18S("Please enter the password for user %s"
                    "<html>"
                    "Please enter the password for user <b>%s</b>"
                    "</html>");
    char msgbuf[512];

    nbuf=GWEN_Buffer_new(0, 64, 0, 1);
    GWEN_Buffer_AppendString(nbuf, "OFX::userpass::");
    GWEN_Buffer_AppendString(nbuf, s);
    snprintf(msgbuf, sizeof(msgbuf), I18N(msg), s, s);
    rv=GWEN_Gui_GetPassword(0,
			    GWEN_Buffer_GetStart(nbuf),
			    I18N("Enter Password"),
			    msgbuf,
			    userpass,
			    4,
			    sizeof(userpass),
			    0);
    GWEN_Buffer_free(nbuf);
    if (rv<0) {
      memset(userpass, 0, sizeof(userpass));
      GWEN_Time_free(ti);
      return rv;
    }
  } /* while */

  GWEN_Buffer_AppendString(buf, "<USERPASS>");
  GWEN_Buffer_AppendString(buf, userpass);
  GWEN_Buffer_AppendString(buf, "\r\n");
  memset(userpass, 0, sizeof(userpass));

  GWEN_Buffer_AppendString(buf, "<LANGUAGE>ENG");

  /* possibly add FI */
  if (!(AO_User_GetFlags(u) & AO_USER_FLAGS_EMPTY_FID)) {
    if (AO_User_GetFid(u)) {
      GWEN_Buffer_AppendString(buf, "<FI>");
      s=AO_User_GetOrg(u);
      if (s) {
	GWEN_Buffer_AppendString(buf, "<ORG>");
	GWEN_Buffer_AppendString(buf, s);
      }
      s=AO_User_GetFid(u);
      if (s) {
	GWEN_Buffer_AppendString(buf, "<FID>");
	GWEN_Buffer_AppendString(buf, s);
      }
      GWEN_Buffer_AppendString(buf, "</FI>");
    }
  }

  /* add APPID */
  s=AO_User_GetAppId(u);
  if (s==NULL || *s==0)
    s="QWIN";
  GWEN_Buffer_AppendString(buf, "<APPID>");
  GWEN_Buffer_AppendString(buf, s);

  /* add APPVER */
  s=AO_User_GetAppVer(u);
  if (s==NULL || *s==0)
    s="1200";
  GWEN_Buffer_AppendString(buf, "<APPVER>");
  GWEN_Buffer_AppendString(buf, s);

  /* add CLIENTUID, if known */
  s=AO_User_GetClientUid(u);
  if (s && *s) {
    GWEN_Buffer_AppendString(buf, "<CLIENTUID>");
    GWEN_Buffer_AppendString(buf, s);
  }

  /* close elements */
  GWEN_Buffer_AppendString(buf, "</SONRQ>");
  GWEN_Buffer_AppendString(buf, "</SIGNONMSGSRQV1>");

  GWEN_Time_free(ti);

  return 0;
}
示例#4
0
int main(int argc, char **argv) {
  GWEN_DB_NODE *db;
  const char *cmd;
  int rv;
  AB_BANKING *ab;
  GWEN_GUI *gui;
  int nonInteractive=0;
  int acceptValidCerts=0;
  const char *pinFile;
  const char *cfgDir;
  const char *s;
  const GWEN_ARGS args[]={
  {
    GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
    GWEN_ArgsType_Char,           /* type */
    "cfgdir",                     /* name */
    0,                            /* minnum */
    1,                            /* maxnum */
    "D",                          /* short option */
    "cfgdir",                     /* long option */
    I18S("Specify the configuration folder"),
    I18S("Specify the configuration folder")
  },
  {
    0,                            /* flags */
    GWEN_ArgsType_Int,            /* type */
    "nonInteractive",             /* name */
    0,                            /* minnum */
    1,                            /* maxnum */
    "n",                          /* short option */
    "noninteractive",             /* long option */
    "Select non-interactive mode",/* short description */
    "Select non-interactive mode.\n"        /* long description */
    "This automatically returns a confirmative answer to any non-critical\n"
    "message."
  },
  {
    0,                            /* flags */
    GWEN_ArgsType_Int,            /* type */
    "acceptValidCerts",           /* name */
    0,                            /* minnum */
    1,                            /* maxnum */
    "A",                          /* short option */
    "acceptvalidcerts",           /* long option */
    "Automatically accept all valid TLS certificate",
    "Automatically accept all valid TLS certificate"
  },
  {
    GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
    GWEN_ArgsType_Char,           /* type */
    "charset",                    /* name */
    0,                            /* minnum */
    1,                            /* maxnum */
    0,                            /* short option */
    "charset",                    /* long option */
    "Specify the output character set",       /* short description */
    "Specify the output character set"        /* long description */
  },
  {
    GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
    GWEN_ArgsType_Char,           /* type */
    "pinfile",                    /* name */
    0,                            /* minnum */
    1,                            /* maxnum */
    "P",                          /* short option */
    "pinfile",                    /* long option */
    "Specify the PIN file",       /* short description */
    "Specify the PIN file"        /* long description */
  },
  {
    GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */
    GWEN_ArgsType_Int,            /* type */
    "help",                       /* name */
    0,                            /* minnum */
    0,                            /* maxnum */
    "h",                          /* short option */
    "help",
    I18S("Show this help screen. For help on commands, "
	 "run aqbanking-cli <COMMAND> --help."),
    I18S("Show this help screen. For help on commands, run aqbanking-cli <COMMAND> --help.")
  }
  };

  rv=GWEN_Init();
  if (rv) {
    fprintf(stderr, "ERROR: Unable to init Gwen.\n");
    exit(2);
  }

  GWEN_Logger_Open(0, "aqbanking-cli", 0,
		   GWEN_LoggerType_Console,
		   GWEN_LoggerFacility_User);
  GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning);

  rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, LOCALEDIR);
  if (rv) {
    DBG_ERROR(0, "Could not bind textdomain (%d)", rv);
  }
  else {
    rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8");
    if (rv) {
      DBG_ERROR(0, "Could not set codeset (%d)", rv);
    }
  }

  db=GWEN_DB_Group_new("arguments");
  rv=GWEN_Args_Check(argc, argv, 1,
		     GWEN_ARGS_MODE_ALLOW_FREEPARAM |
		     GWEN_ARGS_MODE_STOP_AT_FREEPARAM,
		     args,
		     db);
  if (rv==GWEN_ARGS_RESULT_ERROR) {
    fprintf(stderr, "ERROR: Could not parse arguments main\n");
    GWEN_DB_Group_free(db);
    return 1;
  }
  else if (rv==GWEN_ARGS_RESULT_HELP) {
    GWEN_BUFFER *ubuf;

    ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
    GWEN_Buffer_AppendString(ubuf, I18N("This is version "));
    GWEN_Buffer_AppendString(ubuf, AQHBCI_VERSION_STRING "\n");
    GWEN_Buffer_AppendString(ubuf,
                             I18N("Usage: "));
    GWEN_Buffer_AppendString(ubuf, argv[0]);
    GWEN_Buffer_AppendString(ubuf,
                             I18N(" [GLOBAL OPTIONS] COMMAND "
                                  "[LOCAL OPTIONS]\n"));
    GWEN_Buffer_AppendString(ubuf,
                             I18N("\nGlobal Options:\n"));
    if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
      fprintf(stderr, "ERROR: Could not create help string\n");
      GWEN_DB_Group_free(db);
      return 1;
    }
    GWEN_Buffer_AppendString(ubuf,
                             I18N("\nCommands:\n"));
    cmdAddHelpStr(ubuf, "senddtazv",
                  I18N("Sends a DTAZV file to the bank"));

    cmdAddHelpStr(ubuf, "listaccs",
                  I18N("Prints the list of accounts"));

    cmdAddHelpStr(ubuf, "listbal",
                  I18N("Export balances from a context file."));

    cmdAddHelpStr(ubuf, "listtrans",
                  I18N("Export transactions from a context file."));

    cmdAddHelpStr(ubuf, "listtransfers",
                  I18N("Export transactions from a context file which match certain status."));

    cmdAddHelpStr(ubuf, "request",
                  I18N("Requests transactions, balances, standing orders etc."));

    cmdAddHelpStr(ubuf, "chkacc",
                  I18N("Check a combination of bank id and account number"));

    cmdAddHelpStr(ubuf, "chkiban",
                  I18N("Check an IBAN"));

    cmdAddHelpStr(ubuf, "import",
                  I18N("Import a file into an import context file"));

    cmdAddHelpStr(ubuf, "transfer",
                  I18N("Issue a single transfer (data from command line)"));

    cmdAddHelpStr(ubuf, "transfers",
                  I18N("Issue a number of transfers (data from a file)"));

    cmdAddHelpStr(ubuf, "sepatransfer",
                  I18N("Issue a single SEPA transfer (data from command line)"));

    cmdAddHelpStr(ubuf, "sepatransfers",
                  I18N("Issue a number of SEPA transfers (data from a file)"));

    cmdAddHelpStr(ubuf, "debitnote",
                  I18N("Issue a single debit note (data from command line)"));

    cmdAddHelpStr(ubuf, "debitnotes",
                  I18N("Issue a number of debit notes (data from a file)"));

    cmdAddHelpStr(ubuf, "sepadebitnote",
                  I18N("Issue a single SEPA debit note (data from command line)"));

    cmdAddHelpStr(ubuf, "sepaflashdebitnote",
                  I18N("Issue a single flash SEPA debit note COR1 (data from command line)"));

    cmdAddHelpStr(ubuf, "sepadebitnotes",
                  I18N("Issue a number of SEPA debit notes (data from a file)"));

    cmdAddHelpStr(ubuf, "addtrans",
                  I18N("Add a transfer to an existing import context file"));

    cmdAddHelpStr(ubuf, "addsepadebitnote",
                  I18N("Add a SEPA debit note to an existing import context file"));

    cmdAddHelpStr(ubuf, "sepasto",
                  I18N("Manage SEPA standing orders"));

    cmdAddHelpStr(ubuf, "fillgaps",
                  I18N("Fill gaps in an import context file from configuration settings"));

    cmdAddHelpStr(ubuf, "updateconf",
                  I18N("Update configuration from previous AqBanking versions"));

    cmdAddHelpStr(ubuf, "listprofiles",
                  I18N("Print existing profiles"));

    cmdAddHelpStr(ubuf, "versions",
                  I18N("Print the program and library versions"));

    GWEN_Buffer_AppendString(ubuf, "\n");

    fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
    GWEN_Buffer_free(ubuf);
    GWEN_DB_Group_free(db);
    return 0;
  }
  if (rv) {
    argc-=rv-1;
    argv+=rv-1;
  }

  nonInteractive=GWEN_DB_GetIntValue(db, "nonInteractive", 0, 0);
  acceptValidCerts=GWEN_DB_GetIntValue(db, "acceptValidCerts", 0, 0);
  cfgDir=GWEN_DB_GetCharValue(db, "cfgdir", 0, 0);

  cmd=GWEN_DB_GetCharValue(db, "params", 0, 0);
  if (!cmd) {
    fprintf(stderr, "ERROR: Command needed.\n");
    GWEN_DB_Group_free(db);
    return 1;
  }

  gui=GWEN_Gui_CGui_new();
  s=GWEN_DB_GetCharValue(db, "charset", 0, NULL);
  if (s && *s)
    GWEN_Gui_SetCharSet(gui, s);

  if (nonInteractive)
    GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE);
  else
    GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE);

  if (acceptValidCerts)
    GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS);
  else
    GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS);

  pinFile=GWEN_DB_GetCharValue(db, "pinFile", 0, NULL);
  if (pinFile) {
    GWEN_DB_NODE *dbPins;

    dbPins=GWEN_DB_Group_new("pins");
    if (GWEN_DB_ReadFile(dbPins, pinFile,
			 GWEN_DB_FLAGS_DEFAULT |
			 GWEN_PATH_FLAGS_CREATE_GROUP)) {
      fprintf(stderr, "Error reading pinfile \"%s\"\n", pinFile);
      GWEN_DB_Group_free(dbPins);
      GWEN_DB_Group_free(db);
      return 2;
    }
    GWEN_Gui_SetPasswordDb(gui, dbPins, 1);
  }
				    
  GWEN_Gui_SetGui(gui);

  ab=AB_Banking_new("aqbanking-cli", cfgDir, 0);
  AB_Gui_Extend(gui, ab);

  if (strcasecmp(cmd, "senddtazv")==0) {
    rv=sendDtazv(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "listaccs")==0) {
    rv=listAccs(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "listbal")==0) {
    rv=listBal(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "listtrans")==0) {
    rv=listTrans(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "listtransfers")==0) {
    rv=listTransfers(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "request")==0) {
    rv=request(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "chkacc")==0) {
    rv=chkAcc(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "chkiban")==0) {
    rv=chkIban(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "import")==0) {
    rv=import(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "transfer")==0) {
    rv=transfer(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "transfers")==0) {
    rv=transfers(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "sepatransfer")==0) {
    rv=sepaTransfer(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "sepatransfers")==0) {
    rv=sepaMultiJobs(ab, db, argc, argv, AQBANKING_TOOL_SEPA_TRANSFERS);
  }
  else if (strcasecmp(cmd, "debitnote")==0) {
    rv=debitNote(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "debitnotes")==0) {
    rv=debitNotes(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "sepadebitnote")==0) {
    rv=sepaDebitNote(ab, db, argc, argv, 0);
  }
  else if (strcasecmp(cmd, "sepaFlashDebitNote")==0) {
    rv=sepaDebitNote(ab, db, argc, argv, 1);
  }
  else if (strcasecmp(cmd, "sepadebitnotes")==0) {
    rv=sepaMultiJobs(ab, db, argc, argv, AQBANKING_TOOL_SEPA_DEBITNOTES);
  }
  else if (strcasecmp(cmd, "addtrans")==0) {
    rv=addTransaction(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "addsepadebitnote")==0) {
    rv=addSepaDebitNote(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "sepasto")==0) {
    rv=sepaRecurTransfer(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "fillgaps")==0) {
    rv=fillGaps(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "updateconf")==0) {
    rv=updateConf(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "listprofiles")==0) {
    rv=listProfiles(ab, db, argc, argv);
  }
  else if (strcasecmp(cmd, "versions")==0) {
    rv=versions(ab, db, argc, argv);
  }
  else {
    fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd);
    rv=1;
  }

  GWEN_DB_Group_free(db);
  return rv;
}