void AB_Banking_ActivateAllProviders(AB_BANKING *ab) { GWEN_PLUGIN_DESCRIPTION_LIST2 *descrs; GWEN_PLUGIN_MANAGER *pm; pm=GWEN_PluginManager_FindPluginManager("provider"); if (!pm) { DBG_ERROR(AQBANKING_LOGDOMAIN, "Could not find plugin manager for \"%s\"", "provider"); return; } descrs=GWEN_PluginManager_GetPluginDescrs(pm); if (descrs) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *it; GWEN_PLUGIN_DESCRIPTION *pd; it=GWEN_PluginDescription_List2_First(descrs); assert(it); pd=GWEN_PluginDescription_List2Iterator_Data(it); assert(pd); while(pd) { const char *pname=GWEN_PluginDescription_GetName(pd); AB_PROVIDER *pro; pro=AB_Banking_GetProvider(ab, pname); if (!pro) { DBG_WARN(AQBANKING_LOGDOMAIN, "Could not load backend \"%s\", ignoring", pname); } else { GWEN_StringList_AppendString(ab->activeProviders, pname, 0, 1); } pd=GWEN_PluginDescription_List2Iterator_Next(it); } /* while */ GWEN_PluginDescription_List2Iterator_free(it); GWEN_PluginDescription_List2_freeAll(descrs); } }
int GWEN_Crypt_Token_PluginManager_CheckToken(GWEN_PLUGIN_MANAGER *pm, GWEN_CRYPT_TOKEN_DEVICE devt, GWEN_BUFFER *typeName, GWEN_BUFFER *tokenName, uint32_t guiid) { GWEN_PLUGIN_DESCRIPTION_LIST2 *pdl; assert(pm); pdl=GWEN_Crypt_Token_PluginManager_GetPluginDescrs(pm, devt); if (pdl==NULL) { DBG_ERROR(GWEN_LOGDOMAIN, "No plugin descriptions found for this device type"); GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Error, I18N("No plugin found for this device type")); GWEN_Gui_ProgressLog(guiid, GWEN_LoggerLevel_Error, I18N("If you're using a Debian/Ubuntu based system " "please consider to install package " LIBCHIPCARD_GWENHYWFAR_PLUGIN_PACKAGE)); return GWEN_ERROR_NOT_FOUND; } else { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; pit=GWEN_PluginDescription_List2_First(pdl); if (pit) { GWEN_PLUGIN_DESCRIPTION *pd; uint32_t progressId; unsigned int pdcount; unsigned int cnt=0; pdcount=GWEN_PluginDescription_List2_GetSize(pdl); progressId=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_LOG | GWEN_GUI_PROGRESS_ALWAYS_SHOW_LOG | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Determining plugin module..."), NULL, pdcount, guiid); pd=GWEN_PluginDescription_List2Iterator_Data(pit); assert(pd); while (pd) { GWEN_XMLNODE *n; int err; GWEN_PLUGIN *pl; char logbuffer[256]; n=GWEN_PluginDescription_GetXmlNode(pd); assert(n); snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Loading plugin \"%s\""), GWEN_PluginDescription_GetName(pd)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Notice, logbuffer); /* device type matches, check this plugin */ pl=GWEN_PluginManager_GetPlugin(pm, GWEN_PluginDescription_GetName(pd)); if (pl) { GWEN_BUFFER *lTokenName; int rv; lTokenName=GWEN_Buffer_dup(tokenName); snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Checking plugin \"%s\""), GWEN_Plugin_GetName(pl)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Notice, logbuffer); DBG_INFO(GWEN_LOGDOMAIN, "Checking plugin \"%s\" for [%s]", GWEN_Plugin_GetName(pl), GWEN_Buffer_GetStart(lTokenName)); rv=GWEN_Crypt_Token_Plugin_CheckToken(pl, lTokenName); switch (rv) { case 0: /* responsive plugin found */ snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Plugin \"%s\" supports this token"), GWEN_Plugin_GetName(pl)); logbuffer[sizeof(logbuffer)-1]=0; err=GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Notice, logbuffer); if (err==GWEN_ERROR_USER_ABORTED) { GWEN_Gui_ProgressEnd(progressId); GWEN_Buffer_free(lTokenName); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pdl); return err; } GWEN_Buffer_Reset(typeName); GWEN_Buffer_AppendString(typeName, GWEN_Plugin_GetName(pl)); GWEN_Buffer_Reset(tokenName); GWEN_Buffer_AppendBuffer(tokenName, lTokenName); GWEN_Buffer_free(lTokenName); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pdl); GWEN_Gui_ProgressEnd(progressId); return 0; case GWEN_ERROR_NOT_IMPLEMENTED: snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Plugin \"%s\": Function not implemented"), GWEN_Plugin_GetName(pl)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Notice, logbuffer); break; case GWEN_ERROR_NOT_SUPPORTED: snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Plugin \"%s\" does not support this token"), GWEN_Plugin_GetName(pl)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Info, logbuffer); break; case GWEN_ERROR_BAD_NAME: snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Plugin \"%s\" supports this token, but the name " "did not match"), GWEN_Plugin_GetName(pl)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Info, logbuffer); break; default: snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Plugin \"%s\": Unexpected error (%d)"), GWEN_Plugin_GetName(pl), rv); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Info, logbuffer); break; } /* switch */ } /* if plugin loaded */ else { snprintf(logbuffer, sizeof(logbuffer)-1, I18N("Could not load plugin \"%s\""), GWEN_PluginDescription_GetName(pd)); logbuffer[sizeof(logbuffer)-1]=0; GWEN_Gui_ProgressLog(progressId, GWEN_LoggerLevel_Warning, logbuffer); } cnt++; err=GWEN_Gui_ProgressAdvance(progressId, cnt); if (err) { DBG_INFO(GWEN_LOGDOMAIN, "User aborted"); GWEN_Gui_ProgressEnd(progressId); GWEN_PluginDescription_List2Iterator_free(pit); GWEN_PluginDescription_List2_freeAll(pdl); GWEN_Gui_ProgressEnd(progressId); return err; } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } GWEN_Gui_ProgressEnd(progressId); GWEN_PluginDescription_List2Iterator_free(pit); } GWEN_PluginDescription_List2_freeAll(pdl); } return GWEN_ERROR_NOT_SUPPORTED; }
GWEN_PLUGIN_DESCRIPTION_LIST2 *GWEN_Crypt_Token_PluginManager_GetPluginDescrs(GWEN_PLUGIN_MANAGER *pm, GWEN_CRYPT_TOKEN_DEVICE devt) { GWEN_PLUGIN_DESCRIPTION_LIST2 *pl1; pl1=GWEN_PluginManager_GetPluginDescrs(pm); if (pl1) { GWEN_PLUGIN_DESCRIPTION_LIST2_ITERATOR *pit; GWEN_PLUGIN_DESCRIPTION_LIST2 *pl2; pl2=GWEN_PluginDescription_List2_new(); pit=GWEN_PluginDescription_List2_First(pl1); if (pit) { GWEN_PLUGIN_DESCRIPTION *pd; const char *ts; if (devt==GWEN_Crypt_Token_Device_Any) ts=NULL; else ts=GWEN_Crypt_Token_Device_toString(devt); pd=GWEN_PluginDescription_List2Iterator_Data(pit); while (pd) { GWEN_XMLNODE *node; const char *nts; int match=0; node=GWEN_PluginDescription_GetXmlNode(pd); assert(node); nts=GWEN_XMLNode_GetProperty(node, "device", 0); if (nts) { if (!ts || (ts && strcasecmp(ts, nts)==0)) match=1; } else if (!ts) match=1; if (match) { GWEN_PLUGIN_DESCRIPTION *pd2; pd2=GWEN_PluginDescription_dup(pd); GWEN_PluginDescription_List2_PushBack(pl2, pd2); } pd=GWEN_PluginDescription_List2Iterator_Next(pit); } GWEN_PluginDescription_List2Iterator_free(pit); } GWEN_PluginDescription_List2_freeAll(pl1); if (GWEN_PluginDescription_List2_GetSize(pl2)==0) { GWEN_PluginDescription_List2_freeAll(pl2); DBG_ERROR(GWEN_LOGDOMAIN, "No matching plugin descriptions for the given device type"); return NULL; } return pl2; } else { DBG_ERROR(GWEN_LOGDOMAIN, "No plugin descriptions at all"); } return NULL; }