Revision 4f24c68e
Von Ludolf Holzheid vor fast 6 Jahren hinzugefügt
src/libs/aqbanking/gui/abgui.c | ||
---|---|---|
#include <gwenhywfar/text.h>
|
||
#include <gwenhywfar/misc.h>
|
||
#include <gwenhywfar/debug.h>
|
||
#include <gwenhywfar/directory.h>
|
||
|
||
#ifdef OS_WIN32
|
||
# include <io.h>
|
||
#endif
|
||
|
||
GWEN_INHERIT(GWEN_GUI, AB_GUI)
|
||
|
||
static int GWENHYWFAR_CB getPasswordCli(GWEN_GUI *gui,
|
||
uint32_t flags,
|
||
const char *token,
|
||
const char *title,
|
||
const char *text,
|
||
char *buffer,
|
||
int minLen,
|
||
int maxLen,
|
||
GWEN_GUI_PASSWORD_METHOD methodId,
|
||
GWEN_DB_NODE *methodParams,
|
||
uint32_t guiid)
|
||
{
|
||
|
||
# ifndef MAX_PATH
|
||
# define MAX_PATH 256
|
||
# endif
|
||
|
||
const char *challenge;
|
||
char imageFile [MAX_PATH];
|
||
int ret;
|
||
AB_GUI *xgui;
|
||
|
||
assert(gui);
|
||
xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui);
|
||
assert(xgui);
|
||
|
||
challenge = NULL;
|
||
|
||
if ((NULL != xgui->opticalTanTool)
|
||
&& (0 != (flags & GWEN_GUI_INPUT_FLAGS_TAN))
|
||
&& (GWEN_Gui_PasswordMethod_OpticalHHD == methodId)) {
|
||
|
||
int tanMethod;
|
||
const char *mimeType;
|
||
const char *imageData;
|
||
uint32_t imageSize;
|
||
|
||
tanMethod = GWEN_DB_GetIntValue(methodParams, "tanMethodId", 0,
|
||
AB_BANKING_TANMETHOD_TEXT);
|
||
switch (tanMethod) {
|
||
case AB_BANKING_TANMETHOD_CHIPTAN_OPTIC:
|
||
mimeType = "text/x-flickercode";
|
||
challenge = GWEN_DB_GetCharValue(methodParams, "challenge", 0, NULL);
|
||
|
||
if ((NULL == challenge) || ('\0' == challenge [0])) {
|
||
DBG_WARN(AQBANKING_LOGDOMAIN, "no flicker code found");
|
||
challenge = NULL;
|
||
}
|
||
break;
|
||
|
||
case AB_BANKING_TANMETHOD_CHIPTAN_QR:
|
||
case AB_BANKING_TANMETHOD_PHOTOTAN:
|
||
mimeType = GWEN_DB_GetCharValue(methodParams, "mimeType", 0, NULL);
|
||
imageData = GWEN_DB_GetBinValue(methodParams, "imageData", 0, NULL,
|
||
0, &imageSize);
|
||
|
||
if ((NULL == mimeType) || (NULL == imageData) || (0 == imageSize)) {
|
||
DBG_WARN(AQBANKING_LOGDOMAIN, "no optical challenge found");
|
||
}
|
||
else {
|
||
|
||
int fd;
|
||
FILE *fp;
|
||
|
||
GWEN_Directory_GetTmpDirectory(imageFile, sizeof(imageFile) - 14);
|
||
|
||
#ifdef OS_WIN32
|
||
|
||
strncat(imageFile, "\\image.XXXXXX", 14);
|
||
mktemp(imageFile);
|
||
fp = fopen(imageFile, "wb");
|
||
#else
|
||
strncat(imageFile, "/image.XXXXXX", 14);
|
||
fd = mkstemp(imageFile);
|
||
if (0 > fd) {
|
||
fp = NULL;
|
||
}
|
||
else {
|
||
fp = fdopen(fd, "wb");
|
||
}
|
||
#endif
|
||
if (NULL == fp) {
|
||
DBG_ERROR(AQBANKING_LOGDOMAIN, "can't open %s", imageFile);
|
||
}
|
||
else {
|
||
if (imageSize != fwrite(imageData, 1, imageSize, fp)) {
|
||
DBG_ERROR(AQBANKING_LOGDOMAIN, "can't write %s", imageFile);
|
||
}
|
||
else {
|
||
challenge = imageFile;
|
||
}
|
||
fclose(fp);
|
||
}
|
||
}
|
||
break;
|
||
|
||
default:
|
||
mimeType = NULL;
|
||
challenge = NULL;
|
||
break;
|
||
}
|
||
|
||
if ((NULL != mimeType) && (NULL != challenge)) {
|
||
|
||
size_t size;
|
||
char *cmd;
|
||
|
||
size = strlen(xgui->opticalTanTool) + strlen(mimeType) + strlen(challenge) + 7;
|
||
cmd = malloc(size);
|
||
if (NULL == cmd) {
|
||
DBG_ERROR(AQBANKING_LOGDOMAIN, "malloc (%u) failed",
|
||
(unsigned int) size);
|
||
}
|
||
else {
|
||
snprintf(cmd, size, "%s \"%s\" \"%s\"",
|
||
xgui->opticalTanTool, mimeType, challenge);
|
||
|
||
ret = system(cmd);
|
||
if (0 != ret) {
|
||
DBG_ERROR(AQBANKING_LOGDOMAIN, "system (%s) returned %d",
|
||
cmd, ret);
|
||
}
|
||
free(cmd);
|
||
}
|
||
}
|
||
}
|
||
|
||
ret = xgui->getPasswordFn(gui, flags, token, title, text, buffer,
|
||
minLen, maxLen, methodId, methodParams, guiid);
|
||
if (challenge == imageFile) {
|
||
remove(imageFile);
|
||
}
|
||
return (ret);
|
||
}
|
||
|
||
|
||
GWEN_GUI *AB_Gui_new(AB_BANKING *ab)
|
||
... | ... | |
xgui->checkCertFn=GWEN_Gui_SetCheckCertFn(gui, AB_Gui_CheckCert);
|
||
xgui->readDialogPrefsFn=GWEN_Gui_SetReadDialogPrefsFn(gui, AB_Gui_ReadDialogPrefs);
|
||
xgui->writeDialogPrefsFn=GWEN_Gui_SetWriteDialogPrefsFn(gui, AB_Gui_WriteDialogPrefs);
|
||
xgui->getPasswordFn = NULL;
|
||
xgui->opticalTanTool = NULL;
|
||
|
||
return gui;
|
||
}
|
||
... | ... | |
xgui->checkCertFn=GWEN_Gui_SetCheckCertFn(gui, AB_Gui_CheckCert);
|
||
xgui->readDialogPrefsFn=GWEN_Gui_SetReadDialogPrefsFn(gui, AB_Gui_ReadDialogPrefs);
|
||
xgui->writeDialogPrefsFn=GWEN_Gui_SetWriteDialogPrefsFn(gui, AB_Gui_WriteDialogPrefs);
|
||
xgui->getPasswordFn = NULL;
|
||
xgui->opticalTanTool = NULL;
|
||
}
|
||
|
||
|
||
... | ... | |
DBG_INFO(AQBANKING_LOGDOMAIN, "Unlinking GUI from banking object");
|
||
GWEN_Gui_SetReadDialogPrefsFn(gui, xgui->readDialogPrefsFn);
|
||
GWEN_Gui_SetWriteDialogPrefsFn(gui, xgui->writeDialogPrefsFn);
|
||
|
||
if (NULL != xgui->getPasswordFn) {
|
||
GWEN_Gui_SetGetPasswordFn(gui, xgui->getPasswordFn);
|
||
}
|
||
GWEN_INHERIT_UNLINK(GWEN_GUI, AB_GUI, gui);
|
||
GWEN_FREE_OBJECT(xgui);
|
||
}
|
||
|
||
|
||
int AB_Gui_SetCliCallbackForOpticalTan(GWEN_GUI *gui, const char *tool)
|
||
{
|
||
AB_GUI *xgui;
|
||
GWEN_GUI_GETPASSWORD_FN originalGetPassword;
|
||
|
||
assert(gui);
|
||
assert(tool);
|
||
xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, AB_GUI, gui);
|
||
assert(xgui);
|
||
|
||
xgui->opticalTanTool = tool;
|
||
originalGetPassword = GWEN_Gui_SetGetPasswordFn(gui, getPasswordCli);
|
||
|
||
if (NULL == xgui->getPasswordFn) {
|
||
xgui->getPasswordFn = originalGetPassword;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
void GWENHYWFAR_CB AB_Gui_FreeData(void *bp, void *p)
|
||
{
|
src/libs/aqbanking/gui/abgui.h | ||
---|---|---|
*/
|
||
AQBANKING_API void AB_Gui_Unextend(GWEN_GUI *gui);
|
||
|
||
/**
|
||
* This function extends Gwen's GetPassword function and registers an
|
||
* external tool to show the graphics used as challenge for optical
|
||
* TAN mechanisms.
|
||
*/
|
||
AQBANKING_API int AB_Gui_SetCliCallbackForOpticalTan(GWEN_GUI *gui, const char *tool);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
src/libs/aqbanking/gui/abgui_p.h | ||
---|---|---|
|
||
GWEN_GUI_READ_DIALOG_PREFS_FN readDialogPrefsFn;
|
||
GWEN_GUI_WRITE_DIALOG_PREFS_FN writeDialogPrefsFn;
|
||
GWEN_GUI_GETPASSWORD_FN getPasswordFn;
|
||
const char *opticalTanTool;
|
||
};
|
||
|
||
static void GWENHYWFAR_CB AB_Gui_FreeData(void *bp, void *p);
|
src/tools/aqbanking-cli/aqhbci-tool.c | ||
---|---|---|
"Specify the PIN file", /* short description */
|
||
"Specify the PIN file" /* long description */
|
||
},
|
||
{
|
||
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
||
GWEN_ArgsType_Char, /* type */
|
||
"opticalTan", /* name */
|
||
0, /* minnum */
|
||
1, /* maxnum */
|
||
NULL, /* short option */
|
||
"opticaltan", /* long option */
|
||
"Tool for optical TAN challenges", /* short description */
|
||
"Specify an external tool to display optical TAN challenges" /* long description */
|
||
},
|
||
{
|
||
GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */
|
||
GWEN_ArgsType_Int, /* type */
|
||
... | ... | |
|
||
AB_Gui_Extend(gui, ab);
|
||
|
||
s = GWEN_DB_GetCharValue(db, "opticalTan", 0, NULL);
|
||
if ((NULL != s) && ('\0' != s [0]) && (0 != AB_Gui_SetCliCallbackForOpticalTan(gui, s))) {
|
||
fprintf(stderr, "Error registering \"%s\".\n", s);
|
||
GWEN_DB_Group_free(db);
|
||
return 2;
|
||
}
|
||
|
||
rv=doControl(ab, db, argc, argv);
|
||
|
||
AB_Gui_Unextend(gui);
|
src/tools/aqbanking-cli/main.c | ||
---|---|---|
"Specify the PIN file", /* short description */
|
||
"Specify the PIN file" /* long description */
|
||
},
|
||
{
|
||
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
||
GWEN_ArgsType_Char, /* type */
|
||
"opticalTan", /* name */
|
||
0, /* minnum */
|
||
1, /* maxnum */
|
||
NULL, /* short option */
|
||
"opticaltan", /* long option */
|
||
"Tool for optical TAN challenges", /* short description */
|
||
"Specify an external tool to display optical TAN challenges" /* long description */
|
||
},
|
||
{
|
||
GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
|
||
GWEN_ArgsType_Char, /* type */
|
||
... | ... | |
|
||
AB_Gui_Extend(gui, ab);
|
||
|
||
s = GWEN_DB_GetCharValue(db, "opticalTan", 0, NULL);
|
||
if ((NULL != s) && ('\0' != s [0]) && (0 != AB_Gui_SetCliCallbackForOpticalTan(gui, s))) {
|
||
fprintf(stderr, "Error registering \"%s\".\n", s);
|
||
GWEN_DB_Group_free(db);
|
||
return 2;
|
||
}
|
||
|
||
if (ctrlBackend && *ctrlBackend) {
|
||
rv=control(ab, ctrlBackend, db, argc, argv);
|
||
}
|
Auch abrufbar als: Unified diff
Enable optical TAN methods for aqanking-cli and aqhbci-tool4
This is based on a patch from Wolfgang Hamann.
If a TAN is to be generated via an optical mechanism, an external tool
is called to show the graphics, if the name of the external tool has
been specified on the command line.