Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package aqbanking for openSUSE:Factory checked in at 2021-09-21 21:12:51 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/aqbanking (Old) and /work/SRC/openSUSE:Factory/.aqbanking.new.1899 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "aqbanking" Tue Sep 21 21:12:51 2021 rev:89 rq:920512 version:6.3.2 Changes: -------- --- /work/SRC/openSUSE:Factory/aqbanking/aqbanking.changes 2021-06-06 22:40:59.671435438 +0200 +++ /work/SRC/openSUSE:Factory/.aqbanking.new.1899/aqbanking.changes 2021-09-21 21:13:43.778678464 +0200 @@ -1,0 +2,12 @@ +Tue Sep 21 06:28:02 UTC 2021 - Johannes Engel <[email protected]> + +- Update to 6.3.2 + + Bugfixes + +------------------------------------------------------------------- +Tue Sep 14 14:45:18 UTC 2021 - Johannes Engel <[email protected]> + +- Update to 6.3.1 + + Bugfixes and small enhancements + +------------------------------------------------------------------- Old: ---- aqbanking-6.3.0.tar.gz aqbanking-6.3.0.tar.gz.asc New: ---- aqbanking-6.3.2.tar.gz aqbanking-6.3.2.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ aqbanking.spec ++++++ --- /var/tmp/diff_new_pack.L7xBr8/_old 2021-09-21 21:13:44.254679002 +0200 +++ /var/tmp/diff_new_pack.L7xBr8/_new 2021-09-21 21:13:44.258679006 +0200 @@ -28,15 +28,17 @@ %define fronts_datadir %{_datadir}/%{_name}/frontends %define qb_cfgmoddir %{fronts_libdir}/qbanking/cfgmodules %define q4b_cfgmoddir %{fronts_libdir}/q4banking/cfgmodules +%define releasever 386 +%define ascreleasever 385 Name: aqbanking -Version: 6.3.0 +Version: 6.3.2 Release: 0 Summary: Library for Online Banking Functions and Financial Data Import and Export License: GPL-2.0-only OR GPL-3.0-only Group: Productivity/Office/Finance URL: https://www.aquamaniac.de/aqbanking/ -Source: https://www.aquamaniac.de/rdm/attachments/download/372/aqbanking-%{version}.tar.gz -Source1: https://www.aquamaniac.de/rdm/attachments/download/371/aqbanking-%{version}.tar.gz.asc +Source: https://www.aquamaniac.de/rdm/attachments/download/%{releasever}/aqbanking-%{version}.tar.gz +Source1: https://www.aquamaniac.de/rdm/attachments/download/%{ascreleasever}/aqbanking-%{version}.tar.gz.asc Source2: aqbanking6-handbook-20190221.pdf BuildRequires: cmake BuildRequires: doxygen ++++++ aqbanking-6.3.0.tar.gz -> aqbanking-6.3.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/ChangeLog new/aqbanking-6.3.2/ChangeLog --- old/aqbanking-6.3.0/ChangeLog 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/ChangeLog 2021-09-18 17:36:20.000000000 +0200 @@ -1,4 +1,91 @@ ------------------------------------------------------------------ +2021-09-18 17:36:09 +0200 Martin Preuss +Prepared release 6.3.2. + +------------------------------------------------------------------ +2021-09-11 19:56:57 +0200 Martin Preuss +aqebics: Use aqbanking-specific macro "AQBANKING_DEPRECATED" instead of "DEPRECATED". + +------------------------------------------------------------------ +2021-09-11 19:55:58 +0200 Martin Preuss +aqhbci: Fns GWEN_Gui_ShowBox() and GWEN_Gui_HideBox() are deprecated, don't use them. + +------------------------------------------------------------------ +2021-09-10 16:25:13 +0200 Martin Preuss +Released 6.3.1 + +------------------------------------------------------------------ +2021-09-10 14:17:52 +0200 Martin Preuss +Prepared release 6.3.1. + +------------------------------------------------------------------ +2021-07-14 18:56:58 +0200 Martin Preuss +Decreased verbosity. + +------------------------------------------------------------------ +2021-04-01 16:04:13 +0200 Tobias Deiminger +Send acknowledgements (HKQTG) +FinTS 3.0 defines an acknowledge workflow (C.9.4, "Empfangsquittung"): +> By sending this segment, the customer acknowledges they have +> correctly received a bank response. The acknowledgement always +> relates to the direclty preceding bank response. +> Optionally, the acknowledgement can be supplemented by a code +> ("Quittungscode", e.g. a hash value), which allows the bank to draw +> addtional conclusion about the job to be acknowledged. + +In practice, this means you can mark documents in the inbox of a +banking web client as "read", and prevent your bank from sending +you printed documents by post. + +FinTS defines acknwoledgement only for a subset of jobs +- HIEKA "Quittungscode" + BPD HIEKAS "Parameter Kontoauszug":"Quittierung benoetig" +- HIECA "Quittungscode" + BPD HIEKAS "Parameter Kontoauszug camt":"Quittierung benoetig" +- HIEKP "Quittungscode" + BPD HIEKPS "Parameter Kontoauszug PDF":"Quittierung benoetig" +- HIKAA "Quittungscode" + BPD HIKAA "Postfach Nachricht abrufen":"Quittierung (fallweise) + benoetigt" + +This commit adds some generic handling, and fully enables acknowledgment +for HIEKA and HIEKP, i.e. AB_Transaction_CommandGetEStatements. + +Users can enable acknowledgement with a new CLI option for the request +command: +$ aqbanking-cli -P /tmp/pinfile request --estatements -a 1234567 -c est.ctx --fromdate=20200101 --docnumber=10 --acknowledge + +or they enable it via API by +AB_Transaction_SetAcknowledge(myTransaction, AB_Transaction_AckJobsWithAckCode). + +Disclaimer: I don't understand the spec in how "preceding response" is +supposed to be interpreted for multi-segment responses and if the optional +acknowledge code was not sent by the bank. Seems the spec leaves some doubt +there, it could mean +- ack all segments from the preceding multi-segment response +- ack only the first segment from the preceding multi-segment response +- ack only the last segement +- ... whatever, you get it + +Therefore I'm only implementing cases where an acknowledgement code was +given, because it allows to definitely identify the segment we mean. + +------------------------------------------------------------------ +2021-06-06 19:01:53 +0200 Martin Preuss +aqbanking-cli: Fixed argument for document number +- minnum and maxnum specify the minimum and maximum *occurrence* of an + argument, not the allowed range for values +- changed argument name to "--docnumber=xxx" + +------------------------------------------------------------------ +2021-06-06 18:53:40 +0200 Martin Preuss +aqbanking-cli: Fixed a bug. + +------------------------------------------------------------------ +2021-05-05 17:31:21 +0200 Martin Preuss +Prepared release 6.3.0 + +------------------------------------------------------------------ 2021-05-05 16:37:57 +0200 Martin Preuss Prepared release 6.3.0stable. @@ -452,59 +539,3 @@ ------------------------------------------------------------------ 2021-02-15 18:51:25 +0100 Martin Preuss XML: Improved OFX import handling (needs latest gwen). - ------------------------------------------------------------------- -2021-02-15 15:04:03 +0100 Martin Preuss -Simplified ofx1 description file. - ------------------------------------------------------------------- -2021-02-15 14:38:31 +0100 Martin Preuss -XML: Added parameter "xmlFlags" which can now contain "sgml" for OFX files. -Requires latest Gwen sources from git (>=5.5.1.1). - ------------------------------------------------------------------- -2021-02-15 14:05:23 +0100 Martin Preuss -OFX: Minor change. - ------------------------------------------------------------------- -2021-02-15 14:01:46 +0100 Martin Preuss -OFX: Prepared complete move to XML-based importer also for OFX v1. -We can now safely read OFX v1 files with the XML importer, however, this -needed small changes to libgwenhywfar. - -Now we just need a profile file for OFXv1 which I already started. -This is much easier than the old OFX v1 importer which will soon be removed. - -Adding the ability to read new OFX structures to the old parser is extremely -painful, this is now much much easier with the generic XML importer (which -wasn't available when the old OFX parser was created). - ------------------------------------------------------------------- -2021-02-14 20:41:40 +0100 Martin Preuss -Fixed a bug. - ------------------------------------------------------------------- -2021-02-14 18:22:25 +0100 Christian Stimming -i18n: Update German translation -Still 83f, 314u to go, though. - ------------------------------------------------------------------- -2021-02-14 18:03:42 +0100 Christian Stimming -AqHBCI: Reduce log level of non-error messages back to "notice" - ------------------------------------------------------------------- -2021-02-13 02:12:35 +0100 Martin Preuss -Released version 6.2.6. - ------------------------------------------------------------------- -2021-02-13 01:06:23 +0100 Martin Preuss -Prepared release 6.2.6. - ------------------------------------------------------------------- -2021-02-10 18:06:44 +0100 Thomas Baumgart -Provide setting of includedir -Set includedir to AqBanking value because it it is not declared in -aqbanking-config.cmake cmake will pick up the one defined in -gwenhywfar's. - -Patch provided by Dawid Wr??bel diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/Makefile.in new/aqbanking-6.3.2/Makefile.in --- old/aqbanking-6.3.0/Makefile.in 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/Makefile.in 2021-09-18 17:35:03.000000000 +0200 @@ -1087,8 +1087,8 @@ @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -@IF_MAKE_I18N_FILES_FALSE@install-data-local: @IF_MAKE_I18N_FILES_FALSE@uninstall-local: +@IF_MAKE_I18N_FILES_FALSE@install-data-local: clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/aqbanking.iss new/aqbanking-6.3.2/aqbanking.iss --- old/aqbanking-6.3.0/aqbanking.iss 2021-05-05 16:39:52.000000000 +0200 +++ new/aqbanking-6.3.2/aqbanking.iss 2021-09-18 17:35:14.000000000 +0200 @@ -8,7 +8,7 @@ [Setup] ; Using the name here directly because we want it capitalized AppName=AqBanking -AppVerName=AqBanking 6.3.0 +AppVerName=AqBanking 6.3.2 AppPublisher=AqBanking Development Team AppPublisherURL=http://sourceforge.net/projects/aqbanking AppSupportURL=http://sourceforge.net/support/getsupport.php?group_id=115695 @@ -18,7 +18,7 @@ DirExistsWarning=no InfoAfterFile=README LicenseFile=COPYING -OutputBaseFilename=aqbanking-6.3.0-setup +OutputBaseFilename=aqbanking-6.3.2-setup OutputDir=. UninstallFilesDir={app}\uninstall\aqbanking @@ -151,7 +151,7 @@ StringChange(FileString, '@'+'aqbanking_pkgdatadir@', pkgdatadir); StringChange(FileString, '@'+'AQBANKING_VERSION_MAJOR@', '6'); StringChange(FileString, '@'+'AQBANKING_VERSION_MINOR@', '3'); - StringChange(FileString, '@'+'AQBANKING_VERSION_PATCHLEVEL@', '0'); + StringChange(FileString, '@'+'AQBANKING_VERSION_PATCHLEVEL@', '2'); StringChange(FileString, '@'+'AQBANKING_VERSION_BUILD@', '0'); StringChange(FileString, '@'+'AQBANKING_VERSION_TAG@', 'stable'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/aqbanking.spec new/aqbanking-6.3.2/aqbanking.spec --- old/aqbanking-6.3.0/aqbanking.spec 2021-05-05 16:39:52.000000000 +0200 +++ new/aqbanking-6.3.2/aqbanking.spec 2021-09-18 17:35:14.000000000 +0200 @@ -2,7 +2,7 @@ # neededforbuild gwenhywfar gwenhywfar-devel python python-ctypes pyyxml libchipcard2-devel libchipcard2 pkgconfig gettext-devel libacl-devel libacl libattr-devel libattr %define name aqbanking -%define version 6.3.0 +%define version 6.3.2 %define dist Ubuntu %define disttag ubuntu diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/configure new/aqbanking-6.3.2/configure --- old/aqbanking-6.3.0/configure 2021-05-05 16:39:46.000000000 +0200 +++ new/aqbanking-6.3.2/configure 2021-09-18 17:35:06.000000000 +0200 @@ -2678,7 +2678,7 @@ AQBANKING_VERSION_MAJOR=6 AQBANKING_VERSION_MINOR=3 -AQBANKING_VERSION_PATCHLEVEL=0 +AQBANKING_VERSION_PATCHLEVEL=2 AQBANKING_VERSION_BUILD=0 AQBANKING_VERSION_TAG="stable" @@ -2695,7 +2695,7 @@ AQBANKING_SO_CURRENT=47 AQBANKING_SO_AGE=3 -AQBANKING_SO_REVISION=0 +AQBANKING_SO_REVISION=2 AQBANKING_SO_EFFECTIVE="`echo \$(($AQBANKING_SO_CURRENT-$AQBANKING_SO_AGE))`" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/configure.ac new/aqbanking-6.3.2/configure.ac --- old/aqbanking-6.3.0/configure.ac 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/configure.ac 2021-09-18 17:34:57.000000000 +0200 @@ -16,7 +16,7 @@ AQBANKING_VERSION_MAJOR=6 AQBANKING_VERSION_MINOR=3 -AQBANKING_VERSION_PATCHLEVEL=0 +AQBANKING_VERSION_PATCHLEVEL=2 AQBANKING_VERSION_BUILD=0 dnl "stable", "rcX", "betaX", "svn" AQBANKING_VERSION_TAG="stable" @@ -34,7 +34,7 @@ AQBANKING_SO_CURRENT=47 AQBANKING_SO_AGE=3 -AQBANKING_SO_REVISION=0 +AQBANKING_SO_REVISION=2 AQBANKING_SO_EFFECTIVE="`echo \$(($AQBANKING_SO_CURRENT-$AQBANKING_SO_AGE))`" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/mksymlinks.sh new/aqbanking-6.3.2/mksymlinks.sh --- old/aqbanking-6.3.0/mksymlinks.sh 2021-05-05 16:39:50.000000000 +0200 +++ new/aqbanking-6.3.2/mksymlinks.sh 2021-09-18 17:35:11.000000000 +0200 @@ -91,7 +91,7 @@ #symlinkFolder "src/libs/aqbankingpp" "aqbanking6/aqbankingpp" # symlink all headers from src/libs/plugins/backends/ -#dirlist='aqhbci aqofxconnect aqebics aqpaypal' # list might be empty +#dirlist='aqfints aqhbci aqofxconnect aqnone aqpaypal aqebics' # list might be empty dirlist='aqebics aqofxconnect aqpaypal' for backend in ${dirlist} ; do mkdir -p aqbanking6/${backend} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/backendsupport/swiftdescr.c new/aqbanking-6.3.2/src/libs/aqbanking/backendsupport/swiftdescr.c --- old/aqbanking-6.3.0/src/libs/aqbanking/backendsupport/swiftdescr.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/backendsupport/swiftdescr.c 2021-09-10 14:17:00.000000000 +0200 @@ -424,7 +424,7 @@ AB_SWIFT_DESCR *AB_SwiftDescr_List__FindInternal(AB_SWIFT_DESCR *d, const char *wantedFamily, int wantedVersion1, int wantedVersion2, int wantedVersion3){ if (!wantedFamily) wantedFamily="*"; while(d) { if (1==AB_SwiftDescr_Matches(d, wantedFamily, wantedVersion1, wantedVersion2, wantedVersion3)) break; d=AB_SwiftDescr_List_Next(d); } /* while */ return d; } AB_SWIFT_DESCR *AB_SwiftDescr_List_FindFirst(const AB_SWIFT_DESCR_LIST *dl, const char *wantedFamily, int wantedVersion1, int wantedVersion2, int wantedVersion3) { AB_SWIFT_DESCR *d; if (AB_SwiftDescr_List_GetCount(dl)==0) { DBG_INFO(AQBANKING_LOGDOMAIN, "empty list"); return NULL; } d=AB_SwiftDescr_List_First(dl); assert(d); return AB_SwiftDescr_List__FindInternal(d, wantedFamily, wantedVersion1, wantedVersion2, wantedVersion3); } AB_SWIFT_DESCR *AB_SwiftDescr_List_FindNext(AB_SWIFT_DESCR *d, const char *wantedFamily, int wantedVersion1, int wantedVersion2, int wantedVersion3){ assert(d); d=AB_SwiftDescr_List_Next(d); if (d==NULL) { DBG_INFO(AQBANKING_LOGDOMAIN, "No more entries in list"); return NULL; } return AB_SwiftDescr_List__FindInternal(d, wantedFamily, wantedVersion1, wantedVersion2, wantedVersion3); } -AB_SWIFT_DESCR *AB_SwiftDescr_FromString(const char *inputName) { GWEN_STRINGLIST *slist; int count; /* add delimiters here if needed */ slist=GWEN_StringList_fromString(inputName, ":._- \t", 0); if (slist==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not parse string [%s] into list", inputName); return NULL; } count=GWEN_StringList_Count(slist); if (count>2) { int i; for (i=count-1; i>=0; i--) { const char *s; s=GWEN_StringList_StringAt(slist, i); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Handling string[%d of %d]: \"%s\"", i, count, s?s:"<empty>"); if (s && (strcasecmp(s, "camt")==0 || strcasecmp(s, "pain")==0)) { if ((count-i)<4) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few entries left in string list (source: [%s])", inputName); break; } else { const char *family; int version1; int version2; int version3; AB_SWIFT_DESCR *d; family=s; i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version1))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version1 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version2))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version2 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version3))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version3 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; DBG_INFO(AQBANKING_LOGDOMAIN, "Creating descriptor %s.%03d.%03d.%02d", family?family:"<empty>", version1, version2, version3); d=AB_SwiftDescr_new(); AB_SwiftDescr_SetFamily(d, family); AB_SwiftDescr_SetVersion1(d, version1); AB_SwiftDescr_SetVersion2(d, version2); AB_SwiftDescr_SetVersion3(d, version3); GWEN_StringList_free(slist); return d; } } /* if camt or pain */ } /* for */ } /* if enough entries in string list to be a valid descriptor */ else { DBG_ERROR(AQBANKING_LOGDOM AIN, "Too few entries in string list (source: [%s])", inputName); } GWEN_StringList_free(slist); return NULL; } +AB_SWIFT_DESCR *AB_SwiftDescr_FromString(const char *inputName) { GWEN_STRINGLIST *slist; int count; /* add delimiters here if needed */ slist=GWEN_StringList_fromString(inputName, ":._- \t", 0); if (slist==NULL) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not parse string [%s] into list", inputName); return NULL; } count=GWEN_StringList_Count(slist); if (count>2) { int i; for (i=count-1; i>=0; i--) { const char *s; s=GWEN_StringList_StringAt(slist, i); DBG_DEBUG(AQBANKING_LOGDOMAIN, "Handling string[%d of %d]: \"%s\"", i, count, s?s:"<empty>"); if (s && (strcasecmp(s, "camt")==0 || strcasecmp(s, "pain")==0)) { if ((count-i)<4) { DBG_INFO(AQBANKING_LOGDOMAIN, "Too few entries left in string list (source: [%s])", inputName); break; } else { const char *family; int version1; int version2; int version3; AB_SWIFT_DESCR *d; family=s; i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version1))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version1 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version2))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version2 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; s=GWEN_StringList_StringAt(slist, i); if (!(s && *s && 1==sscanf(s, "%d", &version3))) { DBG_ERROR(AQBANKING_LOGDOMAIN, "No valid string for version3 [%s] ", s?s:"<empty>"); GWEN_StringList_free(slist); return NULL; } i++; DBG_INFO(AQBANKING_LOGDOMAIN, "Creating descriptor %s.%03d.%03d.%02d", family?family:"<empty>", version1, version2, version3); d=AB_SwiftDescr_new(); AB_SwiftDescr_SetFamily(d, family); AB_SwiftDescr_SetVersion1(d, version1); AB_SwiftDescr_SetVersion2(d, version2); AB_SwiftDescr_SetVersion3(d, version3); GWEN_StringList_free(slist); return d; } } /* if camt or pain */ } /* for */ } /* if enough entries in string list to be a valid descriptor */ else { DBG_INFO(AQBANKING_LOGDOMAI N, "Too few entries in string list (source: [%s])", inputName); } GWEN_StringList_free(slist); return NULL; } /* code headers */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/backendsupport/swiftdescr.xml new/aqbanking-6.3.2/src/libs/aqbanking/backendsupport/swiftdescr.xml --- old/aqbanking-6.3.0/src/libs/aqbanking/backendsupport/swiftdescr.xml 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/backendsupport/swiftdescr.xml 2021-09-10 16:24:38.000000000 +0200 @@ -289,7 +289,7 @@ DBG_DEBUG(AQBANKING_LOGDOMAIN, "Handling string[%d of %d]: \"%s\"", i, count, s?s:"<empty>"); if (s && (strcasecmp(s, "camt")==0 || strcasecmp(s, "pain")==0)) { if ((count-i)<4) { - DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few entries left in string list (source: [%s])", inputName); + DBG_INFO(AQBANKING_LOGDOMAIN, "Too few entries left in string list (source: [%s])", inputName); break; } else { @@ -341,7 +341,7 @@ } /* if enough entries in string list to be a valid descriptor */ else { - DBG_ERROR(AQBANKING_LOGDOMAIN, "Too few entries in string list (source: [%s])", inputName); + DBG_INFO(AQBANKING_LOGDOMAIN, "Too few entries in string list (source: [%s])", inputName); } GWEN_StringList_free(slist); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/banking_imex.c new/aqbanking-6.3.2/src/libs/aqbanking/banking_imex.c --- old/aqbanking-6.3.0/src/libs/aqbanking/banking_imex.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/banking_imex.c 2021-09-10 16:24:38.000000000 +0200 @@ -1169,7 +1169,7 @@ descr=AB_SwiftDescr_FromString(name); if (descr) { - DBG_ERROR(AQBANKING_LOGDOMAIN, "Adding matching profile [%s]", name); + DBG_INFO(AQBANKING_LOGDOMAIN, "Adding matching profile [%s]", name); AB_SwiftDescr_SetAlias1(descr, name); AB_SwiftDescr_List_Add(descr, descrList); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.c new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.c --- old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.c 2021-09-10 14:16:59.000000000 +0200 @@ -212,6 +212,16 @@ return AB_Transaction_SequenceUnknown; } +AB_TRANSACTION_ACK AB_Transaction_Ack_fromString(const char *p_s) { + if (p_s && *p_s) { + if (strcasecmp(p_s, "never")==0) + return AB_Transaction_AckNever; + else if (strcasecmp(p_s, "jobsWithAckCode")==0) + return AB_Transaction_AckJobsWithAckCode; + } + return AB_Transaction_AckUnknown; +} + const char *AB_Transaction_Type_toString(AB_TRANSACTION_TYPE p_i) { switch(p_i) { case AB_Transaction_TypeNone: return "none"; @@ -335,6 +345,15 @@ } } +const char *AB_Transaction_Ack_toString(AB_TRANSACTION_ACK p_i) { + switch(p_i) { + case AB_Transaction_AckNever: return "never"; + case AB_Transaction_AckJobsWithAckCode: return "jobsWithAckCode"; + case AB_Transaction_AckUnknown: + default: return "unknown"; + } +} + AB_TRANSACTION *AB_Transaction_new(void) { AB_TRANSACTION *p_struct; @@ -347,6 +366,7 @@ p_struct->command=AB_Transaction_CommandNone; p_struct->status=AB_Transaction_StatusUnknown; p_struct->uniqueAccountId=0; + p_struct->acknowledge=AB_Transaction_AckNever; p_struct->uniqueId=0; p_struct->refUniqueId=0; p_struct->idForApplication=0; @@ -517,6 +537,9 @@ /* member "uniqueAccountId" */ p_struct->uniqueAccountId=p_src->uniqueAccountId; + /* member "acknowledge" */ + p_struct->acknowledge=p_src->acknowledge; + /* member "uniqueId" */ p_struct->uniqueId=p_src->uniqueId; @@ -1081,6 +1104,9 @@ /* member "uniqueAccountId" */ p_struct->uniqueAccountId=p_src->uniqueAccountId; + /* member "acknowledge" */ + p_struct->acknowledge=p_src->acknowledge; + /* member "uniqueId" */ p_struct->uniqueId=p_src->uniqueId; @@ -1652,6 +1678,11 @@ return p_struct->uniqueAccountId; } +AB_TRANSACTION_ACK AB_Transaction_GetAcknowledge(const AB_TRANSACTION *p_struct) { + assert(p_struct); + return p_struct->acknowledge; +} + uint32_t AB_Transaction_GetUniqueId(const AB_TRANSACTION *p_struct) { assert(p_struct); return p_struct->uniqueId; @@ -2027,6 +2058,11 @@ p_struct->uniqueAccountId=p_src; } +void AB_Transaction_SetAcknowledge(AB_TRANSACTION *p_struct, AB_TRANSACTION_ACK p_src) { + assert(p_struct); + p_struct->acknowledge=p_src; +} + void AB_Transaction_SetUniqueId(AB_TRANSACTION *p_struct, uint32_t p_src) { assert(p_struct); p_struct->uniqueId=p_src; @@ -2858,6 +2894,9 @@ /* member "uniqueAccountId" */ p_struct->uniqueAccountId=GWEN_DB_GetIntValue(p_db, "uniqueAccountId", 0, 0); + /* member "acknowledge" */ + { const char *s; s=GWEN_DB_GetCharValue(p_db, "acknowledge", 0, NULL); if (s) p_struct->acknowledge=AB_Transaction_Ack_fromString(s); else p_struct->acknowledge=AB_Transaction_AckNever; } + /* member "uniqueId" */ p_struct->uniqueId=GWEN_DB_GetIntValue(p_db, "uniqueId", 0, 0); @@ -3385,6 +3424,13 @@ return p_rv; } + /* member "acknowledge" */ + p_rv=GWEN_DB_SetCharValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "acknowledge", AB_Transaction_Ack_toString(p_struct->acknowledge)); + if (p_rv<0) { + DBG_INFO(GWEN_LOGDOMAIN, "here (%d)\n", p_rv); + return p_rv; + } + /* member "uniqueId" */ p_rv=GWEN_DB_SetIntValue(p_db, GWEN_DB_FLAGS_OVERWRITE_VARS, "uniqueId", p_struct->uniqueId); if (p_rv<0) { @@ -3901,6 +3947,9 @@ /* member "uniqueAccountId" */ p_struct->uniqueAccountId=GWEN_XMLNode_GetIntValue(p_db, "uniqueAccountId", 0); + /* member "acknowledge" */ + { const char *s; s=GWEN_XMLNode_GetCharValue(p_db, "acknowledge", NULL); if (s) p_struct->acknowledge=AB_Transaction_Ack_fromString(s); else p_struct->acknowledge=AB_Transaction_AckNever; } + /* member "uniqueId" */ p_struct->uniqueId=GWEN_XMLNode_GetIntValue(p_db, "uniqueId", 0); @@ -4461,6 +4510,9 @@ /* member "uniqueAccountId" */ GWEN_XMLNode_SetIntValue(p_db, "uniqueAccountId", p_struct->uniqueAccountId); + /* member "acknowledge" */ + GWEN_XMLNode_SetCharValue(p_db, "acknowledge", AB_Transaction_Ack_toString(p_struct->acknowledge)); + /* member "uniqueId" */ GWEN_XMLNode_SetIntValue(p_db, "uniqueId", p_struct->uniqueId); @@ -4748,6 +4800,9 @@ /* member "uniqueAccountId" */ { char numbuf[32]; snprintf(numbuf, sizeof(numbuf)-1, "%d", p_struct->uniqueAccountId); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(p_buffer, numbuf); } GWEN_Buffer_AppendByte(p_buffer, ':'); + /* member "acknowledge" */ + { char numbuf[32]; snprintf(numbuf, sizeof(numbuf)-1, "%d", p_struct->acknowledge); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(p_buffer, numbuf); } + GWEN_Buffer_AppendByte(p_buffer, ':'); /* member "uniqueId" */ { char numbuf[32]; snprintf(numbuf, sizeof(numbuf)-1, "%d", p_struct->uniqueId); numbuf[sizeof(numbuf)-1]=0; GWEN_Buffer_AppendString(p_buffer, numbuf); } GWEN_Buffer_AppendByte(p_buffer, ':'); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.h new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.h --- old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.h 2021-09-10 14:16:59.000000000 +0200 @@ -71,6 +71,12 @@ <p>Set this property with @ref AB_Transaction_SetUniqueAccountId(), get it with @ref AB_Transaction_GetUniqueAccountId().</p> +@anchor AB_TRANSACTION_acknowledge +<h3>acknowledge</h3> + +<p>Set this property with @ref AB_Transaction_SetAcknowledge(), get it with @ref AB_Transaction_GetAcknowledge().</p> + + <h2>Identifiers</h2> @@ -777,6 +783,13 @@ } AB_TRANSACTION_SEQUENCE; +typedef enum { + AB_Transaction_AckUnknown = -1, + AB_Transaction_AckNever = 0, + AB_Transaction_AckJobsWithAckCode +} AB_TRANSACTION_ACK; + + /* post-headers */ @@ -794,6 +807,8 @@ AQBANKING_API AB_TRANSACTION_SEQUENCE AB_Transaction_Sequence_fromString(const char *p_s); +AQBANKING_API AB_TRANSACTION_ACK AB_Transaction_Ack_fromString(const char *p_s); + AQBANKING_API const char *AB_Transaction_Type_toString(AB_TRANSACTION_TYPE p_i); AQBANKING_API const char *AB_Transaction_SubType_toString(AB_TRANSACTION_SUBTYPE p_i); @@ -808,6 +823,8 @@ AQBANKING_API const char *AB_Transaction_Sequence_toString(AB_TRANSACTION_SEQUENCE p_i); +AQBANKING_API const char *AB_Transaction_Ack_toString(AB_TRANSACTION_ACK p_i); + /** Constructor. */ AQBANKING_API AB_TRANSACTION *AB_Transaction_new(void); @@ -846,6 +863,11 @@ AQBANKING_API uint32_t AB_Transaction_GetUniqueAccountId(const AB_TRANSACTION *p_struct); /** Getter. + * Use this function to get the member "acknowledge" (see @ref AB_TRANSACTION_acknowledge) +*/ +AQBANKING_API AB_TRANSACTION_ACK AB_Transaction_GetAcknowledge(const AB_TRANSACTION *p_struct); + +/** Getter. * Use this function to get the member "uniqueId" (see @ref AB_TRANSACTION_uniqueId) */ AQBANKING_API uint32_t AB_Transaction_GetUniqueId(const AB_TRANSACTION *p_struct); @@ -1221,6 +1243,11 @@ AQBANKING_API void AB_Transaction_SetUniqueAccountId(AB_TRANSACTION *p_struct, uint32_t p_src); /** Setter. + * Use this function to set the member "acknowledge" (see @ref AB_TRANSACTION_acknowledge) +*/ +AQBANKING_API void AB_Transaction_SetAcknowledge(AB_TRANSACTION *p_struct, AB_TRANSACTION_ACK p_src); + +/** Setter. * Use this function to set the member "uniqueId" (see @ref AB_TRANSACTION_uniqueId) */ AQBANKING_API void AB_Transaction_SetUniqueId(AB_TRANSACTION *p_struct, uint32_t p_src); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.xml new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.xml --- old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction.xml 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction.xml 2021-09-10 16:24:38.000000000 +0200 @@ -908,6 +908,11 @@ <item name="final"/> </enum> + <enum id="AB_TRANSACTION_ACK" prefix="AB_Transaction_Ack" type="AB_TRANSACTION_ACK"> + <item name="never" value="0"/> + <item name="jobsWithAckCode"/> + </enum> + </enums> <defines> @@ -971,6 +976,15 @@ </descr> </member> + <member name="acknowledge" type="int" maxlen="32" enum="AB_TRANSACTION_ACK" > + <default>AB_Transaction_AckNever</default> + <preset>AB_Transaction_AckNever</preset> + <access>public</access> + <flags>enum with_hash</flags> + <setflags>none</setflags> + <getflags>none</getflags> + </member> + </group> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction_p.h new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction_p.h --- old/aqbanking-6.3.0/src/libs/aqbanking/types/transaction_p.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/types/transaction_p.h 2021-09-10 14:16:59.000000000 +0200 @@ -23,6 +23,7 @@ AB_TRANSACTION_COMMAND command; AB_TRANSACTION_STATUS status; uint32_t uniqueAccountId; + AB_TRANSACTION_ACK acknowledge; uint32_t uniqueId; uint32_t refUniqueId; uint32_t idForApplication; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/aqbanking/version.h new/aqbanking-6.3.2/src/libs/aqbanking/version.h --- old/aqbanking-6.3.0/src/libs/aqbanking/version.h 2021-05-05 16:39:50.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/aqbanking/version.h 2021-09-18 17:35:11.000000000 +0200 @@ -13,15 +13,15 @@ #define AQBANKING_VERSION_MAJOR 6 #define AQBANKING_VERSION_MINOR 3 -#define AQBANKING_VERSION_PATCHLEVEL 0 +#define AQBANKING_VERSION_PATCHLEVEL 2 #define AQBANKING_VERSION_BUILD 0 #define AQBANKING_VERSION_TAG "stable" -#define AQBANKING_VERSION_FULL_STRING "6.3.0.0stable" -#define AQBANKING_VERSION_STRING "6.3.0" +#define AQBANKING_VERSION_FULL_STRING "6.3.2.0stable" +#define AQBANKING_VERSION_STRING "6.3.2" #define AQBANKING_SO_CURRENT 47 -#define AQBANKING_SO_REVISION 0 +#define AQBANKING_SO_REVISION 2 #define AQBANKING_SO_AGE 3 #define AQBANKING_SO_EFFECTIVE 44 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqebics/msg/msg.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqebics/msg/msg.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqebics/msg/msg.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqebics/msg/msg.h 2021-09-11 19:53:44.000000000 +0200 @@ -50,7 +50,7 @@ xmlNodePtr EB_Msg_GetRootNode(EB_MSG *m); xmlNodeSetPtr EB_Msg_GetNodes(EB_MSG *m, const char *xpathExpr); -DEPRECATED int EB_Msg_BuildHash(EB_MSG *m, GWEN_BUFFER *hbuf); +AQBANKING_DEPRECATED int EB_Msg_BuildHash(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashSha1(EB_MSG *m, GWEN_BUFFER *hbuf); int EB_Msg_BuildHashSha256(EB_MSG *m, GWEN_BUFFER *hbuf); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/parser/segment.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/parser/segment.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/parser/segment.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/parser/segment.h 2021-09-10 14:17:00.000000000 +0200 @@ -119,7 +119,7 @@ /* post-headers */ -#include "parser/element.h" +#include "libaqfints/parser/element.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpd.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpd.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpd.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpd.h 2021-09-10 14:17:00.000000000 +0200 @@ -85,12 +85,12 @@ /* post-headers */ -#include "service/bpd/bankdata.h" -#include "service/bpd/bpdjob.h" -#include "service/bpd/bpdaddr.h" -#include "service/bpd/bpdsecprofile.h" -#include "service/bpd/taninfo.h" -#include "service/bpd/tanmethod.h" +#include "libaqfints/service/bpd/bankdata.h" +#include "libaqfints/service/bpd/bpdjob.h" +#include "libaqfints/service/bpd/bpdaddr.h" +#include "libaqfints/service/bpd/bpdsecprofile.h" +#include "libaqfints/service/bpd/taninfo.h" +#include "libaqfints/service/bpd/tanmethod.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpdaddr.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpdaddr.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpdaddr.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/bpdaddr.h 2021-09-10 14:17:00.000000000 +0200 @@ -73,7 +73,7 @@ /* post-headers */ -#include "service/bpd/bpdaddrservice.h" +#include "libaqfints/service/bpd/bpdaddrservice.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/taninfo.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/taninfo.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/taninfo.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/bpd/taninfo.h 2021-09-10 14:17:00.000000000 +0200 @@ -104,7 +104,7 @@ /* post-headers */ -#include "service/bpd/tanjobinfo.h" +#include "libaqfints/service/bpd/tanjobinfo.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/upd/accountdata.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/upd/accountdata.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/upd/accountdata.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/upd/accountdata.h 2021-09-10 14:17:00.000000000 +0200 @@ -145,7 +145,7 @@ /* post-headers */ -#include "service/upd/updjob.h" +#include "libaqfints/service/upd/updjob.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/upd/userdata.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/upd/userdata.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqfints/libaqfints/service/upd/userdata.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqfints/libaqfints/service/upd/userdata.h 2021-09-10 14:17:00.000000000 +0200 @@ -85,7 +85,7 @@ /* post-headers */ -#include "service/upd/accountdata.h" +#include "libaqfints/service/upd/accountdata.h" /** Constructor. */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/ajobs/jobgetestatements.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/ajobs/jobgetestatements.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/ajobs/jobgetestatements.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/ajobs/jobgetestatements.c 2021-09-10 16:24:38.000000000 +0200 @@ -111,6 +111,18 @@ GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "maxEntries", maxEntries); } } + + /* + * If the user reqeusted to acknowledge this job, + * and the bank also wants to acknowledge the job, flag it for acknowledgement. + */ + if (AB_Transaction_GetAcknowledge(t) == AB_Transaction_AckJobsWithAckCode) { + s=GWEN_DB_GetCharValue(dbParams, "ackNeeded", 0, 0); + if (s && !strcmp(s, "J")) { + AH_Job_AddFlags(j, AH_JOB_FLAGS_ACKNOWLEDGE); + } + } + return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/applayer/cbox_queue.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/applayer/cbox_queue.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/applayer/cbox_queue.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/applayer/cbox_queue.c 2021-09-10 16:24:38.000000000 +0200 @@ -15,6 +15,7 @@ #include "cbox_queue.h" +#include "aqhbci/admjobs/jobacknowledge_l.h" #include "aqhbci/admjobs/jobtan_l.h" #include "aqhbci/applayer/cbox_send.h" @@ -33,6 +34,7 @@ * ------------------------------------------------------------------------------------------------ */ +static AH_JOBQUEUE *_createAckQueueFromTodoList(AB_USER *user, AH_JOB_LIST *jl, uint32_t jqFlags); static AH_JOBQUEUE *_createNextQueueFromTodoList(AB_USER *user, AH_JOB_LIST *jl, uint32_t jqFlags, AH_JOB_LIST *finishedJobs); static int _performQueue(AH_OUTBOX_CBOX *cbox, AH_DIALOG *dlg, AH_JOBQUEUE *jq); @@ -131,33 +133,124 @@ finishedJobs=AH_OutboxCBox_GetFinishedJobs(cbox); for (;;) { + AH_JOBQUEUE *jqAck; AH_JOBQUEUE *jqTodo; AH_JOB_LIST *jl; jl=AH_JobQueue_TakeJobList(jq); assert(jl); + jqAck=_createAckQueueFromTodoList(user, jl, AH_JobQueue_GetFlags(jq)); jqTodo=_createNextQueueFromTodoList(user, jl, AH_JobQueue_GetFlags(jq), finishedJobs); AH_Job_List_free(jl); AH_JobQueue_free(jq); + + if (jqAck != NULL) { + rv=AH_OutboxCBox_SendAndRecvQueue(cbox, dlg, jqAck); + if (rv) { + _handleQueueError(cbox, jqAck, "Error performing acknowledge queue"); + return rv; + } /* if error during acknowledgement (jqAck freed by _handleQueueError */ + AH_JobQueue_free(jqAck); + } + if (jqTodo==NULL) { DBG_INFO(AQHBCI_LOGDOMAIN, "No more jobs left"); break; } - jq=jqTodo; - - /* jq now contains all jobs to be executed */ - rv=AH_OutboxCBox_SendAndRecvQueue(cbox, dlg, jq); - if (rv) { - _handleQueueError(cbox, jq, "Error performing queue"); /* frees jobQueue */ - return rv; - } /* if error */ + else { + jq=jqTodo; + /* jq now contains all jobs to be executed */ + // Execute NEXT send-recv round, syhcnrounously. + rv=AH_OutboxCBox_SendAndRecvQueue(cbox, dlg, jq); + if (rv) { + _handleQueueError(cbox, jq, "Error performing queue"); /* frees jobQueue */ + return rv; + } /* if error */ + } } /* for */ return 0; } +AH_JOBQUEUE *_createAckQueueFromTodoList(AB_USER *user, AH_JOB_LIST *jl, uint32_t jqFlags) +{ + AH_JOB *j; + AH_JOBQUEUE *jqAck; + + jqAck=AH_JobQueue_new(user); + /* copy some flags */ + jqFlags&=~(AH_JOBQUEUE_FLAGS_CRYPT | + AH_JOBQUEUE_FLAGS_SIGN | + AH_JOBQUEUE_FLAGS_NOSYSID | + AH_JOBQUEUE_FLAGS_NOITAN); + AH_JobQueue_SetFlags(jqAck, (jqFlags&AH_JOBQUEUE_FLAGS_COPYMASK)); + + /* insert intermediate round for possible acknowledgements */ + j=AH_Job_List_First(jl); + while (j) { + const char *jobName; + + jobName=AH_Job_GetName(j); + if (!(jobName && *jobName)) + jobName="<unnamed>"; + + if (AH_Job_GetStatus(j)==AH_JobStatusAnswered) { + /* Should we send an acknowledgement for the previously executed job? */ + const void* ackCode = NULL; + AH_JOB* jAck = NULL; + unsigned int lenAckCode = 0; + GWEN_DB_NODE *args = AH_Job_GetArguments(j); + + DBG_INFO(AQHBCI_LOGDOMAIN, + "Job \"%s\" with status \"answered\", checking whether it needs acknowledgement", + jobName); + ackCode = GWEN_DB_GetBinValue(args, "_tmpAckCode", 0, 0, 0, &lenAckCode); + if (ackCode != NULL && lenAckCode > 0) { + jAck = AH_Job_Acknowledge_new(AH_Job_GetProvider(j), AH_Job_GetUser(j), ackCode, lenAckCode); + DBG_NOTICE(AQHBCI_LOGDOMAIN, "Job \"%s\" received acknowledge code, prepare acknowledge job", jobName); + if (GWEN_DB_DeleteVar(args, "_tmpAckCode")) { + DBG_DEBUG(AQHBCI_LOGDOMAIN, "Temporary acknowledge code removed"); + } + } + else { + DBG_DEBUG(AQHBCI_LOGDOMAIN, "Job \"%s\" didn't receive an acknowledge code, no acknowledge job needed.", jobName); + } + + /* Job received acknowledge code in previous response and acknowledge is allowed by BPD and user wants to acknowledge - so do it. */ + if (jAck != NULL) { + /* copy signers to new job */ + if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_SIGN) { + GWEN_STRINGLISTENTRY *se; + se=GWEN_StringList_FirstEntry(AH_Job_GetSigners(j)); + while (se) { + AH_Job_AddSigner(jAck, GWEN_StringListEntry_Data(se)); + se=GWEN_StringListEntry_Next(se); + } /* while */ + } + + if (AH_JobQueue_AddJob(jqAck, jAck)!=AH_JobQueueAddResultOk) { + DBG_DEBUG(AQHBCI_LOGDOMAIN, "Couldn't add ack job to todo list."); + AH_Job_SetStatus(j, AH_JobStatusError); + } + else { + AH_Job_Log(j, GWEN_LoggerLevel_Info, "Acknwoledge Job enqueued"); + } + } + } + j=AH_Job_List_Next(j); + } + + if (AH_JobQueue_GetCount(jqAck)==0) { + DBG_INFO(AQHBCI_LOGDOMAIN, "No acknwoledge jobs enqueued."); + AH_JobQueue_free(jqAck); + return NULL; + } + + return jqAck; +} + AH_JOBQUEUE *_createNextQueueFromTodoList(AB_USER *user, AH_JOB_LIST *jl, uint32_t jqFlags, AH_JOB_LIST *finishedJobs) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/job_l.h new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/job_l.h --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/job_l.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/job_l.h 2021-09-10 16:24:38.000000000 +0200 @@ -13,6 +13,7 @@ typedef struct AH_JOB AH_JOB; +#define AH_JOB_FLAGS_ACKNOWLEDGE 0x00000200 #define AH_JOB_FLAGS_IGNOREACCOUNTS 0x00000400 #define AH_JOB_FLAGS_SIGNSEQONE 0x00000800 #define AH_JOB_FLAGS_IGNORE_ERROR 0x00001000 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/job_swift.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/job_swift.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/job_swift.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/job_swift.c 2021-09-10 16:24:38.000000000 +0200 @@ -187,7 +187,7 @@ if (s && *s) { AB_SWIFT_DESCR *tmpDescr; - DBG_ERROR(AQHBCI_LOGDOMAIN, "Checking user supported param [%s] (job \"%s\")", s, AH_Job_GetName(j)); + DBG_INFO(AQHBCI_LOGDOMAIN, "Checking user supported param [%s] (job \"%s\")", s, AH_Job_GetName(j)); tmpDescr=AB_SwiftDescr_FromString(s); if (tmpDescr) { if (AB_SwiftDescr_Matches(tmpDescr, family, version1, 0, 0)) { @@ -204,17 +204,17 @@ /* store name of selected profile */ AB_SwiftDescr_SetAlias2(descrFromList, s); - DBG_ERROR(AQHBCI_LOGDOMAIN, - "Adding matching profile [%s] (%s)", - AB_SwiftDescr_GetAlias1(descrFromList), - AB_SwiftDescr_GetAlias2(descrFromList)); + DBG_INFO(AQHBCI_LOGDOMAIN, + "Adding matching profile [%s] (%s)", + AB_SwiftDescr_GetAlias1(descrFromList), + AB_SwiftDescr_GetAlias2(descrFromList)); /* copy to return list */ descrCopy=AB_SwiftDescr_dup(descrFromList); AB_SwiftDescr_List_Add(descrCopy, returnDescrList); } } else { - DBG_ERROR(AQHBCI_LOGDOMAIN, "Param [%s] does not match family %s.%03d", s, family, version1); + DBG_INFO(AQHBCI_LOGDOMAIN, "Param [%s] does not match family %s.%03d", s, family, version1); } } else { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_addjob.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_addjob.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_addjob.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_addjob.c 2021-09-10 16:24:38.000000000 +0200 @@ -229,7 +229,7 @@ AH_JOBQUEUE_ADDRESULT _checkJobFlags(AH_JOBQUEUE *jq, AH_JOB *jobToAdd) { - if (strcasecmp(AH_Job_GetName(jobToAdd), "JobTan")!=0) { + if (strcasecmp(AH_Job_GetName(jobToAdd), "JobTan")!=0 && strcasecmp(AH_Job_GetName(jobToAdd), "JobAcknowledge")!=0) { uint32_t flagsInJobToAdd; uint32_t flagsInFirstJob; AH_JOB *firstJob; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_dispatch.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_dispatch.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_dispatch.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/joblayer/jobqueue_dispatch.c 2021-09-10 16:24:38.000000000 +0200 @@ -34,6 +34,7 @@ static void _setUsedTanStatusInJobs(const AH_JOBQUEUE *jq); static void _adjustSystemTanStatus(AH_JOBQUEUE *jq, uint32_t guiid); static AH_JOB *_findReferencedJob(AH_JOBQUEUE *jq, int refMsgNum, int refSegNum); +static void _possiblyExtractJobAckCode(AH_JOB *j, GWEN_DB_NODE *dbSegment); static void _possiblyExtractAttachPoint(AH_JOB *j, GWEN_DB_NODE *dbSegment); static void _handleSegmentResultForAllJobs(AH_JOBQUEUE *jq, GWEN_DB_NODE *dbSegment); static void _handleSegmentResult(AH_JOBQUEUE *jq, AH_JOB *j, GWEN_DB_NODE *dbSegment); @@ -371,6 +372,22 @@ } +void _possiblyExtractJobAckCode(AH_JOB *j, GWEN_DB_NODE *dbSegment) { + if (AH_Job_GetFlags(j) & AH_JOB_FLAGS_ACKNOWLEDGE) { + const char *responseName=AH_Job_GetResponseName(j); + if (strcasecmp(GWEN_DB_GroupName(dbSegment), responseName)==0) { + unsigned int byteSize = 0; + const void* ackCode; + ackCode = GWEN_DB_GetBinValue(dbSegment, "ackCode", 0, NULL, 0, &byteSize); + if (ackCode) { + GWEN_DB_NODE *args = AH_Job_GetArguments(j); + GWEN_DB_SetBinValue(args, GWEN_DB_FLAGS_OVERWRITE_VARS, "_tmpAckCode", ackCode, byteSize); + DBG_DEBUG(AQHBCI_LOGDOMAIN, "Found acknoledge code in job response, storing it."); + } + } + } +} + void _possiblyExtractAttachPoint(AH_JOB *j, GWEN_DB_NODE *dbSegment) { @@ -527,7 +544,9 @@ GWEN_DB_GroupName(dbCurr), AH_Msg_GetMsgRef(msg), refSegNum); - _possiblyExtractAttachPoint(j, dbCurr); + + _possiblyExtractJobAckCode(j, dbCurr); + _possiblyExtractAttachPoint(j, dbCurr); /* check for segment results */ if (strcasecmp(GWEN_DB_GroupName(dbCurr), "SegResult")==0) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/tan/tan_chiptan_opt.c new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/tan/tan_chiptan_opt.c --- old/aqbanking-6.3.0/src/libs/plugins/backends/aqhbci/tan/tan_chiptan_opt.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/libs/plugins/backends/aqhbci/tan/tan_chiptan_opt.c 2021-09-11 19:48:33.000000000 +0200 @@ -162,7 +162,7 @@ bufToken=GWEN_Buffer_new(0, 256, 0, 1); AH_User_MkTanName(u, (const char *) challengePtr, bufToken); - rv = GWEN_Gui_ShowBox(0, title, text, 0); + rv=GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, text); /* TODO: hmm, this should probably be changed to a more typesafe way... * Maybe we need to add a virtual function for CryptTokens... @@ -204,8 +204,6 @@ rv = ((GetTanfromUSB_GeneratorFn)p)(HHDCommand, fullHHD_Len, &ATC, passwordBuffer, passwordMaxLen, &Cardnummber[0], &EndDate[0], &IssueDate[0]); - GWEN_Gui_HideBox(0); - if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(bufToken); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/tools/aqbanking-cli/globals.h new/aqbanking-6.3.2/src/tools/aqbanking-cli/globals.h --- old/aqbanking-6.3.0/src/tools/aqbanking-cli/globals.h 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/tools/aqbanking-cli/globals.h 2021-09-10 16:24:38.000000000 +0200 @@ -49,6 +49,7 @@ #define AQBANKING_TOOL_REQUEST_ESTATEMENTS 0x0008 #define AQBANKING_TOOL_REQUEST_DEPOT 0x0010 +#define AQBANKING_TOOL_REQUEST_ACKNOWLEDGE 0x4000 #define AQBANKING_TOOL_REQUEST_IGNORE_UNSUP 0x8000 @@ -106,6 +107,7 @@ const GWEN_DATE *fromDate, const GWEN_DATE *toDate, int ignoreUnsupported, + AB_TRANSACTION_ACK ackMethod, uint32_t number); /** diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/tools/aqbanking-cli/request.c new/aqbanking-6.3.2/src/tools/aqbanking-cli/request.c --- old/aqbanking-6.3.0/src/tools/aqbanking-cli/request.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/tools/aqbanking-cli/request.c 2021-09-10 16:24:38.000000000 +0200 @@ -68,6 +68,8 @@ requestFlags|=AQBANKING_TOOL_REQUEST_DEPOT; if (GWEN_DB_GetIntValue(db, "ignoreUnsupported", 0, 0)) requestFlags|=AQBANKING_TOOL_REQUEST_IGNORE_UNSUP; + if (GWEN_DB_GetIntValue(db, "acknowledge", 0, 0)) + requestFlags|=AQBANKING_TOOL_REQUEST_ACKNOWLEDGE; /* read command line arguments */ ctxFile=GWEN_DB_GetCharValue(db, "ctxfile", 0, 0); @@ -360,6 +362,17 @@ "Request depot (security list)" /* long description */ }, { + 0, /* flags */ + GWEN_ArgsType_Int, /* type */ + "acknowledge", /* name */ + 0, /* minnum */ + 1, /* maxnum */ + 0, /* short option */ + "acknowledge", /* long option */ + "Acknowledge jobs", /* short description */ + "Acknowledge each job where the bank supports." /* long description */ + }, + { 0, GWEN_ArgsType_Int, "ignoreUnsupported", @@ -396,11 +409,11 @@ GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Int, /* type */ "number", /* name */ - 1, /* minnum */ - 99999, /* maxnum */ + 0, /* minnum */ + 0, /* maxnum */ 0, /* short option */ - "number", /* long option */ - "Document number", /* short description */ + "docnumber", /* long option */ + "Document number", /* short description */ "Fetch a specific document number" /* long description */ }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/aqbanking-6.3.0/src/tools/aqbanking-cli/util.c new/aqbanking-6.3.2/src/tools/aqbanking-cli/util.c --- old/aqbanking-6.3.0/src/tools/aqbanking-cli/util.c 2021-05-05 16:39:06.000000000 +0200 +++ new/aqbanking-6.3.2/src/tools/aqbanking-cli/util.c 2021-09-10 16:24:38.000000000 +0200 @@ -981,6 +981,7 @@ const GWEN_DATE *fromDate, const GWEN_DATE *toDate, int ignoreUnsupported, + AB_TRANSACTION_ACK ackMethod, uint32_t number) { uint32_t aid; @@ -1003,6 +1004,7 @@ if (number>0) AB_Transaction_SetEstatementNumber(j, number); } + AB_Transaction_SetAcknowledge(j, ackMethod); AB_Transaction_List2_PushBack(tList, j); return 0; } @@ -1038,39 +1040,44 @@ uint32_t number) { int ignoreUnsupported=requestFlags & AQBANKING_TOOL_REQUEST_IGNORE_UNSUP; + int ackMethod=AB_Transaction_AckNever; int rv; assert(ab); assert(tList); assert(as); + if (requestFlags & AQBANKING_TOOL_REQUEST_ACKNOWLEDGE) { + ackMethod=AB_Transaction_AckJobsWithAckCode; + } + /* create and add requests */ if (requestFlags & AQBANKING_TOOL_REQUEST_BALANCE) { - rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetBalance, fromDate, toDate, ignoreUnsupported, number); + rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetBalance, fromDate, toDate, ignoreUnsupported, ackMethod, number); if (rv) return rv; } if (requestFlags & AQBANKING_TOOL_REQUEST_STATEMENTS) { - rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetTransactions, fromDate, toDate, ignoreUnsupported, number); + rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetTransactions, fromDate, toDate, ignoreUnsupported, ackMethod, number); if (rv) return rv; } if (requestFlags & AQBANKING_TOOL_REQUEST_SEPASTO) { - rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandSepaGetStandingOrders, fromDate, toDate, ignoreUnsupported, number); + rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandSepaGetStandingOrders, fromDate, toDate, ignoreUnsupported, ackMethod, number); if (rv) return rv; } if (requestFlags & AQBANKING_TOOL_REQUEST_ESTATEMENTS) { - rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetEStatements, fromDate, toDate, ignoreUnsupported, number); + rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetEStatements, fromDate, toDate, ignoreUnsupported, ackMethod, number); if (rv) return rv; } if (requestFlags & AQBANKING_TOOL_REQUEST_DEPOT) { - rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetDepot, fromDate, toDate, ignoreUnsupported, number); + rv=createAndAddRequest(ab, tList, as, AB_Transaction_CommandGetDepot, fromDate, toDate, ignoreUnsupported, ackMethod, number); if (rv) return rv; }
