1 /***************************************************************************
2 begin : Mon Mar 01 2004
3 copyright : (C) 2019 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14
15 #include "r_hpd_l.h"
16
17 #include "aqebics/aqebics_l.h"
18 #include "aqebics/msg/msg.h"
19 #include "aqebics/msg/keys.h"
20 #include "aqebics/msg/zip.h"
21 #include "aqebics/msg/xml.h"
22 #include "aqebics/client/user_l.h"
23
24 #include "aqebics/requests/r_download_l.h"
25
26 #include <gwenhywfar/base64.h>
27 #include <gwenhywfar/gui.h>
28 #include <gwenhywfar/httpsession.h>
29
30
31
EBC_Provider_XchgHpdRequest(AB_PROVIDER * pro,GWEN_HTTP_SESSION * sess,AB_USER * u)32 int EBC_Provider_XchgHpdRequest(AB_PROVIDER *pro,
33 GWEN_HTTP_SESSION *sess,
34 AB_USER *u)
35 {
36 int rv;
37 GWEN_BUFFER *buf;
38
39 buf=GWEN_Buffer_new(0, 1024, 0, 1);
40 rv=EBC_Provider_XchgDownloadRequest(pro, sess, u, "HPD", buf, 0, NULL, NULL);
41 if (rv<0 || rv>=300) {
42 DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv);
43 GWEN_Buffer_free(buf);
44 return rv;
45 }
46 else {
47 xmlDocPtr orderDoc=NULL;
48 xmlNodePtr root_node=NULL;
49 xmlNodePtr node=NULL;
50 xmlNodePtr nodeX=NULL;
51 const char *s;
52 uint32_t uflags=0;
53
54 /* parse XML document */
55 rv=EB_Xml_DocFromBuffer(GWEN_Buffer_GetStart(buf),
56 GWEN_Buffer_GetUsedBytes(buf),
57 &orderDoc);
58 GWEN_Buffer_free(buf);
59 if (rv<0) {
60 DBG_INFO(AQEBICS_LOGDOMAIN, "here (%d)", rv);
61 return rv;
62 }
63
64 /* get keys */
65 root_node=xmlDocGetRootElement(orderDoc);
66
67 /* get auth key */
68 node=EB_Xml_GetNode(root_node, "ProtocolParams",
69 GWEN_PATH_FLAGS_NAMEMUSTEXIST);
70 if (node==NULL) {
71 DBG_ERROR(AQEBICS_LOGDOMAIN,
72 "No ProtocolParams found");
73 xmlFreeDoc(orderDoc);
74 return GWEN_ERROR_BAD_DATA;
75 }
76 nodeX=EB_Xml_GetNode(node, "ClientDataDownload",
77 GWEN_PATH_FLAGS_NAMEMUSTEXIST);
78 if (nodeX) {
79 s=(const char *)xmlGetProp(nodeX, BAD_CAST "supported");
80 if (s && strcasecmp(s, "true")==0) {
81 DBG_INFO(AQEBICS_LOGDOMAIN, "Client data download supported");
82 uflags|=EBC_USER_FLAGS_CLIENT_DATA_DOWNLOAD_SPP;
83 }
84 }
85
86 nodeX=EB_Xml_GetNode(node, "PreValidation",
87 GWEN_PATH_FLAGS_NAMEMUSTEXIST);
88 if (nodeX) {
89 s=(const char *)xmlGetProp(nodeX, BAD_CAST "supported");
90 if (s && strcasecmp(s, "true")==0) {
91 DBG_INFO(AQEBICS_LOGDOMAIN, "Prevalidation supported");
92 uflags|=EBC_USER_FLAGS_PREVALIDATION_SPP;
93 }
94 }
95
96 nodeX=EB_Xml_GetNode(node, "Recovery",
97 GWEN_PATH_FLAGS_NAMEMUSTEXIST);
98 if (nodeX) {
99 s=(const char *)xmlGetProp(nodeX, BAD_CAST "supported");
100 if (s && strcasecmp(s, "true")==0) {
101 DBG_INFO(AQEBICS_LOGDOMAIN, "Recovery supported");
102 uflags|=EBC_USER_FLAGS_RECOVERY_SPP;
103 }
104 }
105
106 EBC_User_AddFlags(u, uflags);
107
108 xmlFreeDoc(orderDoc);
109 return 0;
110 }
111
112
113 }
114
115
116
117