1 /***************************************************************************
2 begin : Mon Mar 01 2004
3 copyright : (C) 2018 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10
11 /*
12 * This file is included by job.c
13 */
14
15
16
17
18 /* ========================================================================
19 * Virtual Functions
20 * ======================================================================== */
21
22
23
AH_Job_Process(AH_JOB * j,AB_IMEXPORTER_CONTEXT * ctx)24 int AH_Job_Process(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx)
25 {
26
27 assert(j);
28 assert(j->usage);
29
30 DBG_INFO(AQHBCI_LOGDOMAIN, "Processing job \"%s\" (%llu)", AH_Job_GetName(j), (unsigned long long int) AH_Job_GetId(j));
31
32 AH_Job_SampleResults(j);
33
34 if (j->processFn)
35 return j->processFn(j, ctx);
36 else {
37 DBG_INFO(AQHBCI_LOGDOMAIN, "No processFn set");
38 return AH_Job_DefaultProcessHandler(j);
39 }
40 }
41
42
43
AH_Job_Commit(AH_JOB * j,int doLock)44 int AH_Job_Commit(AH_JOB *j, int doLock)
45 {
46 assert(j);
47 assert(j->usage);
48 if (j->commitFn)
49 return j->commitFn(j, doLock);
50 else {
51 DBG_DEBUG(AQHBCI_LOGDOMAIN, "No commitFn set");
52 return AH_Job_DefaultCommitHandler(j, doLock);
53 }
54 }
55
56
57
AH_Job_Prepare(AH_JOB * j)58 int AH_Job_Prepare(AH_JOB *j)
59 {
60 assert(j);
61 assert(j->usage);
62 if (j->prepareFn)
63 return j->prepareFn(j);
64 else {
65 DBG_DEBUG(AQHBCI_LOGDOMAIN, "No prepareFn set");
66 return GWEN_ERROR_NOT_SUPPORTED;
67 }
68 }
69
70
71
AH_Job_AddChallengeParams(AH_JOB * j,int hkTanVer,GWEN_DB_NODE * dbMethod)72 int AH_Job_AddChallengeParams(AH_JOB *j, int hkTanVer, GWEN_DB_NODE *dbMethod)
73 {
74 assert(j);
75 assert(j->usage);
76 if (j->addChallengeParamsFn)
77 return j->addChallengeParamsFn(j, hkTanVer, dbMethod);
78 else {
79 DBG_ERROR(AQHBCI_LOGDOMAIN, "No addChallengeParamsFn set");
80 return GWEN_ERROR_NOT_SUPPORTED;
81 }
82 }
83
84
85
AH_Job_GetLimits(AH_JOB * j,AB_TRANSACTION_LIMITS ** pLimits)86 int AH_Job_GetLimits(AH_JOB *j, AB_TRANSACTION_LIMITS **pLimits)
87 {
88 assert(j);
89 assert(j->usage);
90 if (j->getLimitsFn)
91 return j->getLimitsFn(j, pLimits);
92 else {
93 DBG_ERROR(AQHBCI_LOGDOMAIN, "No getLimitsFn set");
94 return GWEN_ERROR_NOT_SUPPORTED;
95 }
96 }
97
98
99
AH_Job_HandleCommand(AH_JOB * j,const AB_TRANSACTION * t)100 int AH_Job_HandleCommand(AH_JOB *j, const AB_TRANSACTION *t)
101 {
102 assert(j);
103 assert(j->usage);
104 if (j->handleCommandFn)
105 return j->handleCommandFn(j, t);
106 else {
107 DBG_ERROR(AQHBCI_LOGDOMAIN, "No handleCommandFn set");
108 return GWEN_ERROR_NOT_SUPPORTED;
109 }
110 }
111
112
113
AH_Job_HandleResults(AH_JOB * j,AB_IMEXPORTER_CONTEXT * ctx)114 int AH_Job_HandleResults(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx)
115 {
116 assert(j);
117 assert(j->usage);
118 if (j->handleResultsFn)
119 return j->handleResultsFn(j, ctx);
120 else {
121 DBG_INFO(AQHBCI_LOGDOMAIN, "No handleResultsFn set in job \"%s\"", (j->name)?(j->name):"(unnamed)");
122 return GWEN_ERROR_NOT_SUPPORTED;
123 }
124 }
125
126
127
128
129
130 /* ========================================================================
131 * Setters for Virtual Functions
132 * ======================================================================== */
133
134
135
AH_Job_SetProcessFn(AH_JOB * j,AH_JOB_PROCESS_FN f)136 void AH_Job_SetProcessFn(AH_JOB *j, AH_JOB_PROCESS_FN f)
137 {
138 assert(j);
139 assert(j->usage);
140 j->processFn=f;
141 }
142
143
144
AH_Job_SetCommitFn(AH_JOB * j,AH_JOB_COMMIT_FN f)145 void AH_Job_SetCommitFn(AH_JOB *j, AH_JOB_COMMIT_FN f)
146 {
147 assert(j);
148 assert(j->usage);
149 j->commitFn=f;
150 }
151
152
153
AH_Job_SetNextMsgFn(AH_JOB * j,AH_JOB_NEXTMSG_FN f)154 void AH_Job_SetNextMsgFn(AH_JOB *j, AH_JOB_NEXTMSG_FN f)
155 {
156 assert(j);
157 assert(j->usage);
158 j->nextMsgFn=f;
159 }
160
161
162
AH_Job_SetPrepareFn(AH_JOB * j,AH_JOB_PREPARE_FN f)163 void AH_Job_SetPrepareFn(AH_JOB *j, AH_JOB_PREPARE_FN f)
164 {
165 assert(j);
166 assert(j->usage);
167 j->prepareFn=f;
168 }
169
170
171
AH_Job_SetAddChallengeParamsFn(AH_JOB * j,AH_JOB_ADDCHALLENGEPARAMS_FN f)172 void AH_Job_SetAddChallengeParamsFn(AH_JOB *j, AH_JOB_ADDCHALLENGEPARAMS_FN f)
173 {
174 assert(j);
175 assert(j->usage);
176 j->addChallengeParamsFn=f;
177 }
178
179
180
AH_Job_SetGetLimitsFn(AH_JOB * j,AH_JOB_GETLIMITS_FN f)181 void AH_Job_SetGetLimitsFn(AH_JOB *j, AH_JOB_GETLIMITS_FN f)
182 {
183 assert(j);
184 assert(j->usage);
185 j->getLimitsFn=f;
186 }
187
188
189
AH_Job_SetHandleCommandFn(AH_JOB * j,AH_JOB_HANDLECOMMAND_FN f)190 void AH_Job_SetHandleCommandFn(AH_JOB *j, AH_JOB_HANDLECOMMAND_FN f)
191 {
192 assert(j);
193 assert(j->usage);
194 j->handleCommandFn=f;
195 }
196
197
198
AH_Job_SetHandleResultsFn(AH_JOB * j,AH_JOB_HANDLERESULTS_FN f)199 void AH_Job_SetHandleResultsFn(AH_JOB *j, AH_JOB_HANDLERESULTS_FN f)
200 {
201 assert(j);
202 assert(j->usage);
203 j->handleResultsFn=f;
204 }
205
206
207
208
209
210 /* ========================================================================
211 * Defaults or Offers for Virtual Functions
212 * ======================================================================== */
213
214
215
AH_Job_DefaultProcessHandler(AH_JOB * j)216 int AH_Job_DefaultProcessHandler(AH_JOB *j)
217 {
218 assert(j);
219 assert(j->usage);
220 if (j->flags & AH_JOB_FLAGS_PROCESSED) {
221 DBG_WARN(AQHBCI_LOGDOMAIN, "Already processed job \"%s\"", j->name);
222 return 0;
223 }
224 return 0;
225 }
226
227
228
AH_Job_DefaultCommitHandler(AH_JOB * j,int doLock)229 int AH_Job_DefaultCommitHandler(AH_JOB *j, int doLock)
230 {
231 int rv;
232
233 assert(j);
234 assert(j->usage);
235 if (j->flags & AH_JOB_FLAGS_COMMITTED) {
236 DBG_WARN(AQHBCI_LOGDOMAIN, "Already committed job \"%s\"", j->name);
237 return 0;
238 }
239 rv=AH_Job_CommitSystemData(j, doLock);
240 j->flags|=AH_JOB_FLAGS_COMMITTED;
241 return rv;
242 }
243
244
245
AH_Job_GetLimits_EmptyLimits(AH_JOB * j,AB_TRANSACTION_LIMITS ** pLimits)246 int AH_Job_GetLimits_EmptyLimits(AH_JOB *j, AB_TRANSACTION_LIMITS **pLimits)
247 {
248 AB_TRANSACTION_LIMITS *tl;
249
250 tl=AB_TransactionLimits_new();
251 AB_TransactionLimits_SetCommand(tl, AH_Job_GetSupportedCommand(j));
252 *pLimits=tl;
253 return 0;
254 }
255
256
257
AH_Job_HandleCommand_Accept(AH_JOB * j,const AB_TRANSACTION * t)258 int AH_Job_HandleCommand_Accept(AH_JOB *j, const AB_TRANSACTION *t)
259 {
260 return 0;
261 }
262
263
264
AH_Job_HandleResults_Empty(AH_JOB * j,AB_IMEXPORTER_CONTEXT * ctx)265 int AH_Job_HandleResults_Empty(AH_JOB *j, AB_IMEXPORTER_CONTEXT *ctx)
266 {
267 AH_RESULT_LIST *rl;
268 AH_RESULT *r;
269 AB_TRANSACTION_STATUS tStatus;
270
271 assert(j);
272 assert(j->usage);
273
274 rl=AH_Job_GetSegResults(j);
275 assert(rl);
276
277 r=AH_Result_List_First(rl);
278 if (!r) {
279 DBG_ERROR(AQHBCI_LOGDOMAIN, "No segment results");
280 tStatus=AB_Transaction_StatusError;
281 }
282 else {
283 int has10=0;
284 int has20=0;
285
286 while (r) {
287 int rcode;
288
289 rcode=AH_Result_GetCode(r);
290 if (rcode>=10 && rcode<=19) {
291 DBG_INFO(AQBANKING_LOGDOMAIN, "Has10: %d (%s)", rcode, AH_Result_GetText(r));
292 has10=1;
293 }
294 else if ((rcode>=20 && rcode <=29) || rcode==3010) {
295 DBG_INFO(AQBANKING_LOGDOMAIN, "Has20: %d (%s)", rcode, AH_Result_GetText(r));
296 has20=1;
297 }
298 else {
299 DBG_INFO(AQBANKING_LOGDOMAIN, "Other: %d (%s)", rcode, AH_Result_GetText(r));
300 }
301 r=AH_Result_List_Next(r);
302 }
303
304 if (has20)
305 tStatus=AB_Transaction_StatusAccepted;
306 else if (has10)
307 tStatus=AB_Transaction_StatusPending;
308 else
309 tStatus=AB_Transaction_StatusRejected;
310 }
311
312 AH_Job_SetStatusOnCommands(j, tStatus);
313 return 0;
314 }
315
316
317
318
319
320