int AH_NewKeyFileDialog_DoIt(GWEN_DIALOG *dlg) { AH_NEWKEYFILE_DIALOG *xdlg; AB_USER *u; GWEN_URL *url; int rv; uint32_t pid; AB_IMEXPORTER_CONTEXT *ctx; AB_PROVIDER *pro; GWEN_PLUGIN_MANAGER *pm; GWEN_PLUGIN *pl; GWEN_CRYPT_TOKEN *ct; assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AH_NEWKEYFILE_DIALOG, dlg); assert(xdlg); rv=AH_NewKeyFileDialog_GetFilePageData(dlg); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No file?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } pro=AB_Banking_GetProvider(xdlg->banking, "aqhbci"); if (pro==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } u=AB_Banking_CreateUser(xdlg->banking, "aqhbci"); if (u==NULL) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create user, maybe backend missing?"); GWEN_Gui_ShowError(I18N("Error"), "%s", I18N("Could not find HBCI backend, maybe some plugins are not installed?")); return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); if (xdlg->customerId && *(xdlg->customerId)) AB_User_SetCustomerId(u, xdlg->customerId); else AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, xdlg->bankCode); /* HBCI setup */ AH_User_SetTokenType(u, "ohbci"); AH_User_SetTokenName(u, AH_NewKeyFileDialog_GetFileName(dlg)); AH_User_SetTokenContextId(u, 1); AH_User_SetCryptMode(u, AH_CryptMode_Rdh); AH_User_SetStatus(u, AH_UserStatusPending); AH_User_SetHbciVersion(u, xdlg->hbciVersion); AH_User_SetRdhType(u, xdlg->rdhVersion); AH_User_SetFlags(u, xdlg->flags); /* create CryptToken */ pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); if (pm==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin manager not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME); return 3; } pl=GWEN_PluginManager_GetPlugin(pm, AH_User_GetTokenType(u)); if (pl==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Plugin not found"); GWEN_Gui_ShowError(I18N("Error"), I18N("CryptToken plugin for type %s is not available. Did you install all necessary packages?"), AH_User_GetTokenType(u)); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } ct=GWEN_Crypt_Token_Plugin_CreateToken(pl, AH_User_GetTokenName(u)); if (ct==0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create crypt token"); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* create crypt token */ rv=GWEN_Crypt_Token_Create(ct, 0); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not create token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be created. Maybe there already is a file of that name (%d)."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } /* close crypt token */ rv=GWEN_Crypt_Token_Close(ct, 0, 0); if (rv) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not close token"); GWEN_Gui_ShowError(I18N("Error"), I18N("The keyfile %s could not be closed. Please check disc space."), GWEN_Crypt_Token_GetTokenName(ct), rv); AB_User_free(u); unlink(AH_User_GetTokenName(u)); return GWEN_DialogEvent_ResultHandled; } url=GWEN_Url_fromString(xdlg->url); assert(url); GWEN_Url_SetProtocol(url, "hbci"); if (GWEN_Url_GetPort(url)==0) GWEN_Url_SetPort(url, 3000); AH_User_SetServerUrl(u, url); GWEN_Url_free(url); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user (%d)", rv); GWEN_Gui_ShowError(I18N("Error"), I18N("Could not add HBCI user, maybe there already is a user of that id (%d)"), rv); AB_User_free(u); DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not add user, maybe there already is a user of the same id (%d)?", rv); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Keyfile User"), I18N("The server keys will now be retrieved, keys created and sent to the bank."), 3, /* getkeys, mkKeys, sendKeys */ 0); /* lock new user */ rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users (%d)"), rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* get server keys id */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving server keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_GetServerKeys(pro, u, ctx, 0, 1, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=AH_NewKeyFileDialog_CheckBankIniLetter(dlg, u); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Bad bank keys, you should contact your bank.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* generate keys */ rv=AH_Provider_CreateKeys(pro, u, 0); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Error generating keys: %d"), rv); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* send user keys */ GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Sending user keys")); ctx=AB_ImExporterContext_new(); rv=AH_Provider_SendUserKeys2(pro, u, ctx, 0, 0, 1, 0); /* withAuthKey, withProgress, nounmount, doLock */ if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); //unlink(AH_NewKeyFileDialog_GetFileName(dlg)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQHBCI_LOGDOMAIN, "Could not unlock customer [%s] (%d)", AB_User_GetCustomerId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AH_NewKeyFileDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; }
int APY_NewUserDialog_DoIt(GWEN_DIALOG *dlg) { APY_NEWUSER_DIALOG *xdlg; AB_USER *u; int rv; uint32_t pid; AB_PROVIDER *pro; DBG_INFO(0, "Doit"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, APY_NEWUSER_DIALOG, dlg); assert(xdlg); pro=AB_Banking_GetProvider(xdlg->banking, "aqpaypal"); if (pro==NULL) { DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not find backend, maybe some plugins are not installed?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } DBG_INFO(0, "Creating user"); u=AB_Banking_CreateUser(xdlg->banking, "aqpaypal"); if (u==NULL) { DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not create user, maybe backend missing?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "de"); AB_User_SetBankCode(u, "PAYPAL"); APY_User_SetServerUrl(u, xdlg->url); APY_User_SetHttpVMajor(u, xdlg->httpVMajor); APY_User_SetHttpVMinor(u, xdlg->httpVMinor); DBG_INFO(0, "Adding user"); rv=AB_Banking_AddUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up Paypal User"), I18N("The user will be created."), 3, 0); /* lock new user */ DBG_INFO(0, "Locking user"); rv=AB_Banking_BeginExclUseUser(xdlg->banking, u); if (rv<0) { DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users")); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } #if 0 DBG_INFO(0, "Getting certs (%08x)", AH_User_GetFlags(u)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving SSL certificate")); rv=APY_Provider_GetCert(pro, u, 0, 1, 0); if (rv<0) { // TODO: retry with SSLv3 if necessary AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_ERROR(AQPAYPAL_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQPAYPAL_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } #endif GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Creating API credentials file")); rv=APY_User_SetApiSecrets(u, xdlg->apiPassword, xdlg->apiSignature, xdlg->apiUserId); if (rv<0) { AB_Banking_EndExclUseUser(xdlg->banking, u, 1); DBG_INFO(AQPAYPAL_LOGDOMAIN, "here (%d)", rv); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ DBG_INFO(0, "Unlocking user"); rv=AB_Banking_EndExclUseUser(xdlg->banking, u, 0); if (rv<0) { DBG_INFO(AQPAYPAL_LOGDOMAIN, "Could not unlock user [%s] (%d)", AB_User_GetUserId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Banking_EndExclUseUser(xdlg->banking, u, 1); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } if (1) { AB_ACCOUNT *account; int rv; static char accountname[256]; account=AB_Banking_CreateAccount(xdlg->banking, APY_PROVIDER_NAME); assert(account); #if 0 AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); #endif AB_Account_SetOwnerName(account, AB_User_GetUserName(u)); AB_Account_SetAccountNumber(account, AB_User_GetUserId(u)); AB_Account_SetBankCode(account, "PAYPAL"); AB_Account_SetBankName(account, "PAYPAL"); strcpy(accountname, "PP "); strcat(accountname, AB_User_GetUserName(u)); AB_Account_SetAccountName(account, accountname); AB_Account_SetUser(account, u); AB_Account_SetSelectedUser(account, u); rv=AB_Banking_AddAccount(xdlg->banking, account); if (rv<0) { DBG_INFO(AQPAYPAL_LOGDOMAIN, "Error adding account (%d)", rv); AB_Account_free(account); AB_Banking_DeleteUser(xdlg->banking, u); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } } GWEN_Dialog_SetCharProperty(dlg, "wiz_end_label", GWEN_DialogProperty_Title, 0, I18N("The user has been successfully setup."), 0); GWEN_Gui_ProgressEnd(pid); APY_NewUserDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; }
/* --------------------------------------------------------------- FUNCTION */ AH_JOB *AH_AccountJob_new(const char *name, AB_USER *u, AB_ACCOUNT *account){ AH_ACCOUNTJOB *aj; AH_JOB *j; GWEN_DB_NODE *dbArgs; const char *s; int jobVersion=0; assert(name); assert(u); assert(account); if (!(AH_Account_GetFlags(account) & AH_BANK_FLAGS_KTV2)) { int maxVer=0; /* no account suffix, so we try to determine the highest usable * version of the job which still doesn't need the suffix */ if (strcasecmp(name, "JobGetTransactions")==0) maxVer=4; else if (strcasecmp(name, "JobGetBalance")==0) maxVer=4; else if (strcasecmp(name, "JobSingleTransfer")==0) maxVer=3; else if (strcasecmp(name, "JobSingleDebitNote")==0) maxVer=3; else if (strcasecmp(name, "JobInternalTransfer")==0 || strcasecmp(name, "JobLoadCellPhone")==0) /* this job needs a suffix, so if there is none you don't get it */ maxVer=-1; else if (strcasecmp(name, "JobGetDatedTransfers")==0) maxVer=1; else if (strcasecmp(name, "JobCreateDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobModifyDatedTransfer")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteDatedTransfer")==0) maxVer=1; else if (strcasecmp(name, "JobCreateStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobModifyStandingOrder")==0) maxVer=2; else if (strcasecmp(name, "JobDeleteStandingOrder")==0) maxVer=1; if (maxVer==-1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "This job needs an account suffix, but your bank didn't provide one. " "Therefore this job is not supported with your account."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("This job needs an account suffix, but your bank did not provide one. " "Therefore this job is not supported with your account.\n" "Setting a higher HBCI version in the user settings might fix " "the problem.")); return NULL; } if (maxVer>0) { jobVersion=AH_Job_GetMaxVersionUpUntil(name, u, maxVer); if (jobVersion<1) { DBG_ERROR(AQHBCI_LOGDOMAIN, "No job [%s] below version %d, falling back to 0", name, maxVer); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Warning, "No version for job [%s] up to %d found, falling back to 0", name, maxVer); jobVersion=0; } else { DBG_INFO(AQHBCI_LOGDOMAIN, "Reducing version of job [%s] to %d", name, jobVersion); } } } j=AH_Job_new(name, u, AB_Account_GetAccountNumber(account), AB_Account_GetSubAccountId(account), jobVersion); if (!j) return 0; GWEN_NEW_OBJECT(AH_ACCOUNTJOB, aj); GWEN_INHERIT_SETDATA(AH_JOB, AH_ACCOUNTJOB, j, aj, AH_AccountJob_FreeData); aj->account=account; /* set some known arguments */ dbArgs=AH_Job_GetArguments(j); assert(dbArgs); s=AB_Account_GetAccountNumber(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountId", s); s=AB_Account_GetSubAccountId(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "accountSubId", s); s=AB_Account_GetBankCode(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bankCode", s); GWEN_DB_SetIntValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "country", 280); /* new for SEPA jobs */ s=AB_Account_GetIBAN(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "iban", s); s=AB_Account_GetBIC(account); if (s && *s) GWEN_DB_SetCharValue(dbArgs, GWEN_DB_FLAGS_DEFAULT, "bic", s); return j; }
int AO_NewUserDialog_DoIt(GWEN_DIALOG *dlg) { AO_NEWUSER_DIALOG *xdlg; AB_USER *u; int rv; uint32_t pid; DBG_ERROR(0, "Doit"); assert(dlg); xdlg=GWEN_INHERIT_GETDATA(GWEN_DIALOG, AO_NEWUSER_DIALOG, dlg); assert(xdlg); DBG_ERROR(0, "Creating user"); u=AB_Provider_CreateUserObject(xdlg->provider); if (u==NULL) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not create user, maybe backend missing?"); // TODO: show error message return GWEN_DialogEvent_ResultHandled; } /* generic setup */ AB_User_SetUserName(u, xdlg->userName); AB_User_SetUserId(u, xdlg->userId); AB_User_SetCustomerId(u, xdlg->userId); AB_User_SetCountry(u, "us"); AO_User_SetBankName(u, xdlg->bankName); AB_User_SetBankCode(u, "0000000000"); AO_User_SetFlags(u, xdlg->flags); AO_User_SetBrokerId(u, xdlg->brokerId); AO_User_SetOrg(u, xdlg->org); AO_User_SetFid(u, xdlg->fid); AO_User_SetAppId(u, xdlg->appId); AO_User_SetAppVer(u, xdlg->appVer); AO_User_SetHeaderVer(u, xdlg->headerVer); AO_User_SetClientUid(u, xdlg->clientUid); AO_User_SetSecurityType(u, xdlg->securityType); AO_User_SetServerAddr(u, xdlg->url); AO_User_SetHttpVMajor(u, xdlg->httpVMajor); AO_User_SetHttpVMinor(u, xdlg->httpVMinor); DBG_ERROR(0, "Adding user"); rv=AB_Provider_AddUser(xdlg->provider, u); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not add user (%d)", rv); AB_User_free(u); return GWEN_DialogEvent_ResultHandled; } pid=GWEN_Gui_ProgressStart(GWEN_GUI_PROGRESS_DELAY | GWEN_GUI_PROGRESS_ALLOW_EMBED | GWEN_GUI_PROGRESS_SHOW_PROGRESS | GWEN_GUI_PROGRESS_SHOW_ABORT, I18N("Setting Up OFX DirectConnect User"), I18N("The user will be created and the certificate retrieved."), 1, 0); /* lock new user */ DBG_ERROR(0, "Locking user"); rv=AB_Provider_BeginExclUseUser(xdlg->provider, u); if (rv<0) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not lock user (%d)", rv); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Unable to lock users")); AB_Provider_DeleteUser(xdlg->provider, AB_User_GetUniqueId(u)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Notice, I18N("Retrieving SSL certificate")); rv=AO_Provider_GetCert(xdlg->provider, u); if (rv<0) { AB_Provider_EndExclUseUser(xdlg->provider, u, 1); DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); AB_Provider_DeleteUser(xdlg->provider, AB_User_GetUniqueId(u)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } rv=GWEN_Gui_ProgressAdvance(pid, GWEN_GUI_PROGRESS_ONE); if (rv==GWEN_ERROR_USER_ABORTED) { AB_Provider_EndExclUseUser(xdlg->provider, u, 1); DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); AB_Provider_DeleteUser(xdlg->provider, AB_User_GetUniqueId(u)); GWEN_Gui_ProgressLog(pid, GWEN_LoggerLevel_Error, I18N("Aborted by user.")); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } /* unlock user */ DBG_ERROR(0, "Unlocking user"); rv=AB_Provider_EndExclUseUser(xdlg->provider, u, 0); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Could not unlock user [%s] (%d)", AB_User_GetUserId(u), rv); GWEN_Gui_ProgressLog2(pid, GWEN_LoggerLevel_Error, I18N("Could not unlock user %s (%d)"), AB_User_GetUserId(u), rv); AB_Provider_EndExclUseUser(xdlg->provider, u, 1); AB_Provider_DeleteUser(xdlg->provider, AB_User_GetUniqueId(u)); GWEN_Gui_ProgressEnd(pid); return GWEN_DialogEvent_ResultHandled; } GWEN_Gui_ProgressEnd(pid); AO_NewUserDialog_EnterPage(dlg, PAGE_END, 1); xdlg->user=u; return GWEN_DialogEvent_ResultHandled; }
int AO_Provider_SendAndReceive(AB_PROVIDER *pro, AB_USER *u, const uint8_t *p, unsigned int plen, GWEN_BUFFER **pRbuf) { AO_PROVIDER *dp; GWEN_HTTP_SESSION *sess=NULL; GWEN_BUFFER *rbuf; int rv; assert(pro); dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AO_PROVIDER, pro); assert(dp); if (getenv("AQOFX_LOG_COMM")) { FILE *f; DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Saving response in \"/tmp/ofx.log\" ..."); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning, I18N("Saving communication log to /tmp/ofx.log")); f=fopen("/tmp/ofx.log", "a+"); if (!f) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fopen: %s", strerror(errno)); } else { fprintf(f, "\n\nSending:\n"); fprintf(f, "-------------------------------------\n"); if (fwrite(p, plen, 1, f)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } /* setup connection */ rv=AO_Provider_CreateConnection(pro, u, &sess); if (rv) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Could not create connection"); GWEN_Gui_ProgressLog2(0, GWEN_LoggerLevel_Error, I18N("Could not create connection (%d)"), rv); return rv; } /* send request */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Sending request...")); rv=GWEN_HttpSession_SendPacket(sess, "POST", p, plen); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } /* wait for response */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Waiting for response...")); rbuf=GWEN_Buffer_new(0, 1024, 0, 1); rv=GWEN_HttpSession_RecvPacket(sess, rbuf); if (rv<0) { DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "Error receiving packet (%d)", rv); GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Error, I18N("Network error while waiting for response")); GWEN_Buffer_free(rbuf); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } else if (!(rv>=200 && rv<=299)) { /* not a HTTP: ok code */ DBG_INFO(AQOFXCONNECT_LOGDOMAIN, "here (%d)", rv); GWEN_Buffer_free(rbuf); GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); return rv; } /* disconnect (ignore result) */ GWEN_HttpSession_Fini(sess); GWEN_HttpSession_free(sess); /* found a response, transform it */ GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Info, I18N("Parsing response...")); *pRbuf=rbuf; if (getenv("AQOFX_LOG_COMM")) { FILE *f; DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "Saving response in \"/tmp/ofx.log\" ..."); f=fopen("/tmp/ofx.log", "a+"); if (!f) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fopen: %s", strerror(errno)); } else { fprintf(f, "\n\nReceived:\n"); fprintf(f, "-------------------------------------\n"); if (fwrite(GWEN_Buffer_GetStart(rbuf), GWEN_Buffer_GetUsedBytes(rbuf), 1, f)!=1) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fwrite: %s", strerror(errno)); } if (fclose(f)) { DBG_ERROR(AQOFXCONNECT_LOGDOMAIN, "fclose: %s", strerror(errno)); } } } return 0; }