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