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 
AB_Provider_ReadUser(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,AB_USER * user)18 int AB_Provider_ReadUser(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, AB_USER *user)
19 {
20   int rv;
21   GWEN_DB_NODE *db=NULL;
22   uint32_t uidInDb;
23 
24   DBG_INFO(AQBANKING_LOGDOMAIN, "Reading user (%u)", (unsigned int) uid);
25 
26   rv=AB_Banking_Read_UserConfig(AB_Provider_GetBanking(pro), uid, doLock, doUnlock, &db);
27   if (rv<0) {
28     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
29     return rv;
30   }
31 
32   uidInDb=GWEN_DB_GetIntValue(db, "uniqueId", 0, 0);
33   if (uidInDb==0) {
34     DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id in config, so no user with id %" PRIu32, uid);
35     GWEN_DB_Group_free(db);
36     return GWEN_ERROR_NOT_FOUND;
37   }
38 
39   rv=AB_User_ReadFromDb(user, db);
40   if (rv<0) {
41     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
42     GWEN_DB_Group_free(db);
43     return rv;
44   }
45   GWEN_DB_Group_free(db);
46 
47   return 0;
48 }
49 
50 
51 
AB_Provider_GetUser(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,AB_USER ** pUser)52 int AB_Provider_GetUser(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, AB_USER **pUser)
53 {
54   int rv;
55   AB_USER *u;
56 
57   u=AB_Provider_CreateUserObject(pro);
58   assert(u);
59   rv=AB_Provider_ReadUser(pro, uid, doLock, doUnlock, u);
60   if (rv<0) {
61     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
62     AB_User_free(u);
63     return rv;
64   }
65 
66   *pUser=u;
67 
68   return 0;
69 }
70 
71 
72 
AB_Provider_HasUser(AB_PROVIDER * pro,uint32_t uid)73 int AB_Provider_HasUser(AB_PROVIDER *pro, uint32_t uid)
74 {
75   int rv;
76 
77   rv=AB_Banking_Has_UserConfig(AB_Provider_GetBanking(pro), uid);
78   if (rv<0) {
79     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
80     return rv;
81   }
82 
83   return 0;
84 }
85 
86 
87 
AB_Provider_ReadUsers(AB_PROVIDER * pro,AB_USER_LIST * userList)88 int AB_Provider_ReadUsers(AB_PROVIDER *pro, AB_USER_LIST *userList)
89 {
90   int rv;
91   GWEN_DB_NODE *dbAll=NULL;
92   GWEN_DB_NODE *db;
93 
94   DBG_INFO(AQBANKING_LOGDOMAIN, "Reading users");
95 
96   /* read all config groups for users which have a unique id and which belong to this backend */
97   rv=AB_Banking_ReadConfigGroups(AB_Provider_GetBanking(pro), AB_CFG_GROUP_USERS, "uniqueId",
98                                  "backendName", pro->name, &dbAll);
99   if (rv<0) {
100     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
101     return rv;
102   }
103 
104   db=GWEN_DB_GetFirstGroup(dbAll);
105   while (db) {
106     AB_USER *u=NULL;
107 
108     u=AB_Provider_CreateUserObject(pro);
109     if (u==NULL) {
110       DBG_ERROR(AQBANKING_LOGDOMAIN, "Error creating user for backend [%s], ignoring", pro->name);
111     }
112     else {
113       DBG_INFO(AQBANKING_LOGDOMAIN, "Reading user %u", (unsigned int) GWEN_DB_GetIntValue(db, "uniqueId", 0, 0));
114       rv=AB_User_ReadFromDb(u, db);
115       if (rv<0) {
116         DBG_INFO(AQBANKING_LOGDOMAIN, "Error reading user (%d), ignoring", rv);
117         AB_User_free(u);
118       }
119       else
120         AB_User_List_Add(u, userList);
121     }
122     /* next */
123     db=GWEN_DB_GetNextGroup(db);
124   }
125   GWEN_DB_Group_free(dbAll);
126 
127   return 0;
128 }
129 
130 
131 
132 
AB_Provider_WriteUser(AB_PROVIDER * pro,uint32_t uid,int doLock,int doUnlock,const AB_USER * user)133 int AB_Provider_WriteUser(AB_PROVIDER *pro, uint32_t uid, int doLock, int doUnlock, const AB_USER *user)
134 {
135   int rv;
136   GWEN_DB_NODE *db;
137 
138   db=GWEN_DB_Group_new("user");
139   rv=AB_User_WriteToDb(user, db);
140   if (rv<0) {
141     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
142     return rv;
143   }
144 
145   rv=AB_Banking_Write_UserConfig(AB_Provider_GetBanking(pro), uid, doLock, doUnlock, db);
146   if (rv<0) {
147     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
148     GWEN_DB_Group_free(db);
149     return rv;
150   }
151   GWEN_DB_Group_free(db);
152 
153   return 0;
154 }
155 
156 
157 
AB_Provider_AddUser(AB_PROVIDER * pro,AB_USER * u)158 int AB_Provider_AddUser(AB_PROVIDER *pro, AB_USER *u)
159 {
160   uint32_t uid;
161   int rv;
162 
163   uid=AB_Banking_GetNamedUniqueId(AB_Provider_GetBanking(pro), "user", 1); /* startAtStdUniqueId=1 */
164   AB_User_SetUniqueId(u, uid);
165   rv=AB_Provider_WriteUser(pro, uid, 1, 1, u); /* lock, unlock */
166   if (rv<0) {
167     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
168     return rv;
169   }
170   return 0;
171 }
172 
173 
174 
AB_Provider_DeleteUser(AB_PROVIDER * pro,uint32_t uid)175 int AB_Provider_DeleteUser(AB_PROVIDER *pro, uint32_t uid)
176 {
177   int rv;
178   AB_ACCOUNT_LIST *al;
179 
180   al=AB_Account_List_new();
181   rv=AB_Provider_ReadAccounts(pro, al);
182   if (rv<0 && rv!=GWEN_ERROR_NOT_FOUND) {
183     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
184     AB_Account_List_free(al);
185     return rv;
186   }
187   else {
188     AB_ACCOUNT *a;
189     int cnt=0;
190 
191     a=AB_Account_List_First(al);
192     while (a) {
193       if (AB_Account_GetUserId(a)==uid) {
194         DBG_ERROR(AQBANKING_LOGDOMAIN, "Account %lu still uses this user", (unsigned long int) AB_Account_GetUniqueId(a));
195         cnt++;
196       }
197       a=AB_Account_List_Next(a);
198     }
199     if (cnt>0) {
200       DBG_ERROR(AQBANKING_LOGDOMAIN, "%d accounts using this user", cnt);
201       AB_Account_List_free(al);
202       return GWEN_ERROR_INVALID;
203     }
204   }
205   AB_Account_List_free(al);
206 
207   rv=AB_Banking_Delete_UserConfig(AB_Provider_GetBanking(pro), uid);
208   if (rv<0) {
209     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
210     return rv;
211   }
212   return 0;
213 }
214 
215 
216 
217 
218 
AB_Provider_BeginExclUseUser(AB_PROVIDER * pro,AB_USER * u)219 int AB_Provider_BeginExclUseUser(AB_PROVIDER *pro, AB_USER *u)
220 {
221   int rv;
222   uint32_t uid;
223 
224   uid=AB_User_GetUniqueId(u);
225   if (uid==0) {
226     DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id!");
227     return GWEN_ERROR_INVALID;
228   }
229   DBG_INFO(AQBANKING_LOGDOMAIN, "Locking customer \"%lu\"", (unsigned long int) AB_User_GetUniqueId(u));
230 
231   rv=AB_Provider_ReadUser(pro, uid, 1, 0, u);
232   if (rv<0) {
233     DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
234     return rv;
235   }
236   return 0;
237 }
238 
239 
240 
AB_Provider_EndExclUseUser(AB_PROVIDER * pro,AB_USER * u,int abandon)241 int AB_Provider_EndExclUseUser(AB_PROVIDER *pro, AB_USER *u, int abandon)
242 {
243   int rv;
244   uint32_t uid;
245 
246   uid=AB_User_GetUniqueId(u);
247   if (uid==0) {
248     DBG_ERROR(AQBANKING_LOGDOMAIN, "No unique id!");
249     return GWEN_ERROR_INVALID;
250   }
251 
252   DBG_INFO(AQBANKING_LOGDOMAIN, "Unlocking customer \"%lu\"", (unsigned long int) AB_User_GetUniqueId(u));
253 
254   if (abandon) {
255     rv=AB_Banking_Unlock_UserConfig(AB_Provider_GetBanking(pro), uid);
256     if (rv<0) {
257       DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
258       return rv;
259     }
260   }
261   else {
262     rv=AB_Provider_WriteUser(pro, uid, 0, 1, u);
263     if (rv<0) {
264       DBG_INFO(AQBANKING_LOGDOMAIN, "here (%d)", rv);
265       return rv;
266     }
267   }
268 
269   return 0;
270 }
271 
272 
273 
274