2 * This module implements a notifier for Funambol push email.
5 #define FUNAMBOL_WS "/funambol/services/admin"
14 #include <sys/types.h>
16 #if TIME_WITH_SYS_TIME
17 # include <sys/time.h>
21 # include <sys/time.h>
30 #include <sys/socket.h>
33 #include "sysdep_decls.h"
34 #include "citserver.h"
38 #include "serv_extensions.h"
45 #include "internet_addressing.h"
47 #include "clientsocket.h"
52 * Connect to the Funambol server and scan a message.
54 int notify_funambol(struct CtdlMessage *msg) {
60 /* W means 'Wireless'... */
61 if ( msg->cm_fields['W'] == NULL) {
64 /* Are we allowed to push? */
65 if ( strlen(config.c_funambol_host) == 0) {
68 lprintf(CTDL_INFO, "Push enabled\n");
70 sprintf(port, "%d", config.c_funambol_port);
71 lprintf(CTDL_INFO, "Connecting to Funambol at <%s>\n", config.c_funambol_host);
72 sock = sock_connect(config.c_funambol_host, port, "tcp");
73 if (sock >= 0) lprintf(CTDL_DEBUG, "Connected!\n");
76 /* If the service isn't running, just pass the mail
77 * through. Potentially throwing away mails isn't good.
82 /* Build a SOAP message, delicately, by hand */
83 strcat(SOAPData, "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">");
84 strcat(SOAPData, "<soapenv:Body><sendNotificationMessages soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">");
85 strcat(SOAPData, "<arg0 xsi:type=\"soapenc:string\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">");
86 strcat(SOAPData, msg->cm_fields['W']);
87 strcat(SOAPData, "</arg0>");
88 strcat(SOAPData, "<arg1 xsi:type=\"soapenc:string\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\"><?xml version="1.0" encoding="UTF-8"?>\r\n");
89 strcat(SOAPData, "<java version="1.5.0_10" class="java.beans.XMLDecoder"> \r\n");
90 strcat(SOAPData, " <array class="com.funambol.framework.core.Alert" length="1">\r\n");
91 strcat(SOAPData, " <void index="0">\r\n");
92 strcat(SOAPData, " <object class="com.funambol.framework.core.Alert">\r\n");
93 strcat(SOAPData, " <void property="cmdID">\r\n");
94 strcat(SOAPData, " <object class="com.funambol.framework.core.CmdID"/>\r\n");
95 strcat(SOAPData, " </void>");
96 strcat(SOAPData, " <void property="data">\r\n");
97 strcat(SOAPData, " <int>210</int>\r\n");
98 strcat(SOAPData, " </void>\r\n");
99 strcat(SOAPData, " <void property="items">\r\n");
100 strcat(SOAPData, " <void method="add">\r\n");
101 strcat(SOAPData, " <object class="com.funambol.framework.core.Item">\r\n");
102 strcat(SOAPData, " <void property="meta">\r\n");
103 strcat(SOAPData, " <object class="com.funambol.framework.core.Meta">\r\n");
104 strcat(SOAPData, " <void property="metInf">\r\n");
105 strcat(SOAPData, " <void property="type">\r\n");
106 strcat(SOAPData, " <string>application/vnd.omads-email+xml</string>\r\n");
107 strcat(SOAPData, " </void>\r\n");
108 strcat(SOAPData, " </void>\r\n");
109 strcat(SOAPData, " </object>\r\n");
110 strcat(SOAPData, " </void>\r\n");
111 strcat(SOAPData, " <void property="target">\r\n");
112 strcat(SOAPData, " <object class="com.funambol.framework.core.Target">\r\n");
113 strcat(SOAPData, " <void property="locURI">\r\n");
114 strcat(SOAPData, " <string>");
115 strcat(SOAPData, config.c_funambol_source);
116 strcat(SOAPData, "</string>\r\n");
117 strcat(SOAPData, " </void>\r\n");
118 strcat(SOAPData, " </object>\r\n");
119 strcat(SOAPData, " </void>\r\n");
120 strcat(SOAPData, " </object>\r\n");
121 strcat(SOAPData, " </void>\r\n");
122 strcat(SOAPData, " </void>\r\n");
123 strcat(SOAPData, " </object>\r\n");
124 strcat(SOAPData, " </void>\r\n");
125 strcat(SOAPData, " </array>\r\n");
126 strcat(SOAPData, "</java>");
127 strcat(SOAPData,"</arg1><arg2 href=\"#id0\"/></sendNotificationMessages><multiRef id=\"id0\" soapenc:root=\"0\"\r\n");
128 strcat(SOAPData,"soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xsi:type=\"soapenc:int\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\">1</multiRef></soapenv:Body></soapenv:Envelope>");
131 lprintf(CTDL_DEBUG, "Transmitting command\n");
132 sprintf(buf, "POST %s HTTP/1.0\r\nContent-type: text/xml; charset=utf-8\r\n",
134 strcat(SOAPHeader,buf);
135 strcat(SOAPHeader,"Accept: application/soap+xml, application/dime, multipart/related, text/*\r\n");
136 sprintf(buf, "User-Agent: %s/%d\r\nHost: %s:%d\r\nCache-control: no-cache\r\n",
139 config.c_funambol_host,
140 config.c_funambol_port
142 strcat(SOAPHeader,buf);
143 strcat(SOAPHeader,"Pragma: no-cache\r\nSOAPAction: \"\"\r\n");
144 sprintf(buf, "Content-Length: %d\r\n",
146 strcat(SOAPHeader, buf);
147 sprintf(buf, "Authorization: Basic %s\r\n\r\n",
148 config.c_funambol_auth);
149 strcat(SOAPHeader, buf);
151 sock_write(sock, SOAPHeader, strlen(SOAPHeader));
152 sock_write(sock, SOAPData, strlen(SOAPData));
153 sock_shutdown(sock, SHUT_WR);
156 lprintf(CTDL_DEBUG, "Awaiting response\n");
157 if (sock_gets(sock, buf) < 0) {
160 lprintf(CTDL_DEBUG, "<%s\n", buf);
161 if (strncasecmp(buf, "HTTP/1.1 200 OK", strlen("HTTP/1.1 200 OK"))) {
164 lprintf(CTDL_DEBUG, "Funambol notified\n");
172 char *serv_funambol_init(void)
174 CtdlRegisterMessageHook(notify_funambol, EVT_AFTERSAVE);
175 return "$Id: serv_funambol.c $";