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