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