1 /***************************************************************************
2 begin : Mon Nov 26 2018
3 copyright : (C) 2018 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * This file is part of the project "AqBanking". *
8 * Please see toplevel file COPYING of that project for license details. *
9 ***************************************************************************/
10
11
12 /*
13 * This file is included by provider.c
14 */
15
16
17
18
AB_Provider_ReadAccount(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,AB_ACCOUNT * account)19 int AB_Provider_ReadAccount(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, AB_ACCOUNT *account)
20 {
21 int rv;
22 GWEN_DB_NODE *db=NULL;
23 uint32_t uidInDb;
24
25 rv=AB_Banking_Read_AccountConfig(AB_Provider_GetBanking(pro), uid, doLock, doUnlock, &db);
26 if (rv<0) {
27 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
28 return rv;
29 }
30
31 uidInDb=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0);
32 if (uidInDb==0) {
33 DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id in config, so no account with id %" PRIu32, uid);
34 GWEN_DB_Group_free(db);
35 return GWEN_ERROR_NOT_FOUND;
36 }
37
38 rv=AB_Account_ReadFromDb(account, db);
39 if (rv<0) {
40 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
41 GWEN_DB_Group_free(db);
42 return rv;
43 }
44
45 if (1) {
46 int i;
47
48 i=AB_Account_GetAccountType(account);
49 if (i==AB_AccountType_Unknown)
50 AB_Account_SetAccountType(account, AB_AccountType_Unspecified);
51 }
52
53 if (1) {
54 const char *s;
55
56 s=AB_Account_GetBackendName(account);
57 if (!(s && *s)) {
58 DBG_ERROR(0, "Account has no backend name!! SNH!!!");
59 GWEN_DB_Dump(db, 2);
60 assert(0);
61 }
62 }
63
64 GWEN_DB_Group_free(db);
65
66 return 0;
67 }
68
69
70
AB_Provider_GetAccount(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,AB_ACCOUNT ** pAccount)71 int AB_Provider_GetAccount(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, AB_ACCOUNT **pAccount)
72 {
73 int rv;
74 AB_ACCOUNT *a;
75
76 a=AB_Provider_CreateAccountObject(pro);
77 assert(a);
78 rv=AB_Provider_ReadAccount(pro, uid, doLock, doUnlock, a);
79 if (rv<0) {
80 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
81 AB_Account_free(a);
82 return rv;
83 }
84 *pAccount=a;
85
86 return 0;
87 }
88
89
90
AB_Provider_HasAccount(AB_PROVIDER * pro,uint32_t uid)91 int AB_Provider_HasAccount(AB_PROVIDER *pro, uint32_t uid)
92 {
93 int rv;
94
95 rv=AB_Banking_Has_AccountConfig(AB_Provider_GetBanking(pro), uid);
96 if (rv<0) {
97 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
98 return rv;
99 }
100
101 return 0;
102 }
103
104
105
AB_Provider_ReadAccounts(AB_PROVIDER * pro,AB_ACCOUNT_LIST * accountList)106 int AB_Provider_ReadAccounts(AB_PROVIDER *pro, AB_ACCOUNT_LIST *accountList)
107 {
108 int rv;
109 GWEN_DB_NODE *dbAll=NULL;
110 GWEN_DB_NODE *db;
111
112 /* read all config groups for accounts which have a unique id and which belong to this provider */
113 rv=AB_Banking_ReadConfigGroups(AB_Provider_GetBanking(pro), AB_CFG_GROUP_ACCOUNTS, "uniqueId", "backendName", pro->name,
114 &dbAll);
115 if (rv<0) {
116 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
117 return rv;
118 }
119
120 db=GWEN_DB_GetFirstGroup(dbAll);
121 while (db) {
122 AB_ACCOUNT *a=NULL;
123
124 a=AB_Provider_CreateAccountObject(pro);
125 if (a==NULL) {
126 DBG_ERROR(AQBANKING_LOGDOMAIN, "Error creating account for backend [%s], ignoring", pro->name);
127 }
128 else {
129 rv=AB_Account_ReadFromDb(a, db);
130 if (rv<0) {
131 DBG_INFO(AQBANKING_LOGDOMAIN, "Error reading account (%d), ignoring", rv);
132 AB_Account_free(a);
133 }
134 else {
135 if (1) {
136 int i;
137
138 i=AB_Account_GetAccountType(a);
139 if (i==AB_AccountType_Unknown)
140 AB_Account_SetAccountType(a, AB_AccountType_Unspecified);
141 }
142 AB_Account_List_Add(a, accountList);
143 }
144 }
145
146 /* next */
147 db=GWEN_DB_GetNextGroup(db);
148 }
149 GWEN_DB_Group_free(dbAll);
150
151 return 0;
152 }
153
154
155
AB_Provider_WriteAccount(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,const AB_ACCOUNT * account)156 int AB_Provider_WriteAccount(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, const AB_ACCOUNT *account)
157 {
158 int rv;
159 GWEN_DB_NODE *db;
160
161 db=GWEN_DB_Group_new("account");
162 rv=AB_Account_WriteToDb(account, db);
163 if (rv<0) {
164 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
165 return rv;
166 }
167
168 rv=AB_Banking_Write_AccountConfig(AB_Provider_GetBanking(pro), uid, doLock, doUnlock, db);
169 if (rv<0) {
170 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
171 GWEN_DB_Group_free(db);
172 return rv;
173 }
174 GWEN_DB_Group_free(db);
175
176 return 0;
177 }
178
179
180
AB_Provider_AddAccount(AB_PROVIDER * pro,AB_ACCOUNT * a,int lockCorrespondingUser)181 int AB_Provider_AddAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, int lockCorrespondingUser)
182 {
183 uint32_t uid;
184 int rv;
185 const char *s;
186
187 s=AB_Account_GetBackendName(a);
188 assert(s && *s);
189 if (!(s && *s)) {
190 DBG_ERROR(AQBANKING_LOGDOMAIN, "Can not add account without backend name!");
191 return GWEN_ERROR_INVALID;
192 }
193 /* add account */
194 uid=AB_Banking_GetNamedUniqueId(AB_Provider_GetBanking(pro), "account", 1); /* startAtStdUniqueId=1 */
195 AB_Account_SetUniqueId(a, uid);
196 rv=AB_Provider_WriteAccount(pro, uid, 1, 1, a); /* lock, unlock */
197 if (rv<0) {
198 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
199 return rv;
200 }
201 /* write account spec */
202 rv=AB_Provider_WriteAccountSpecForAccount(pro, a, lockCorrespondingUser);
203 if (rv<0) {
204 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
205 return rv;
206 }
207
208 return 0;
209
210 }
211
212
213
AB_Provider_DeleteAccount(AB_PROVIDER * pro,uint32_t uid)214 int AB_Provider_DeleteAccount(AB_PROVIDER *pro, uint32_t uid)
215 {
216 int rv1;
217 int rv2;
218
219 rv1=AB_Banking_DeleteAccountSpec(AB_Provider_GetBanking(pro), uid);
220 if (rv1<0) {
221 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv1);
222 }
223
224 rv2=AB_Banking_Delete_AccountConfig(AB_Provider_GetBanking(pro), uid);
225 if (rv2<0) {
226 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv2);
227 }
228
229 if (rv1>0)
230 return rv1;
231 if (rv2>0)
232 return rv2;
233 return 0;
234 }
235
236
237
238
AB_Provider_BeginExclUseAccount(AB_PROVIDER * pro,AB_ACCOUNT * a)239 int AB_Provider_BeginExclUseAccount(AB_PROVIDER *pro, AB_ACCOUNT *a)
240 {
241 int rv;
242 uint32_t uid;
243
244 uid=AB_Account_GetUniqueId(a);
245 if (uid==0) {
246 DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id!");
247 return GWEN_ERROR_INVALID;
248 }
249
250 rv=AB_Provider_ReadAccount(pro, uid, 1, 0, a);
251 if (rv<0) {
252 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
253 return rv;
254 }
255 return 0;
256 }
257
258
259
AB_Provider_EndExclUseAccount(AB_PROVIDER * pro,AB_ACCOUNT * a,int abandon)260 int AB_Provider_EndExclUseAccount(AB_PROVIDER *pro, AB_ACCOUNT *a, int abandon)
261 {
262 int rv;
263 uint32_t uid;
264
265 uid=AB_Account_GetUniqueId(a);
266 if (uid==0) {
267 DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id!");
268 return GWEN_ERROR_INVALID;
269 }
270
271 if (abandon) {
272 rv=AB_Banking_Unlock_AccountConfig(AB_Provider_GetBanking(pro), uid);
273 if (rv<0) {
274 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
275 return rv;
276 }
277 }
278 else {
279 rv=AB_Provider_WriteAccount(pro, uid, 0, 1, a);
280 if (rv<0) {
281 DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
282 return rv;
283 }
284 }
285
286 return 0;
287 }
288
289
290
291
292