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