1
--- /home/wolpert/src/jabberd-2.0cvs/c2s/c2s.c 2005-01-07 07:39:20.000000000 -0700
2
+++ c2s/c2s.c 2005-02-10 10:48:51.835153956 -0700
8
+ * M.Bootsma, LogicaCMG Hoofddorp, Netherlands
11
+ * Added a patch for flash:stream support
13
+ * Flash is not 100% compatible with the XML stream standard:
14
+ * 1. it terminates every XML message with a '\0'
15
+ * 2. it terminates the stream header with a /
16
+ * (this would close the stream)
17
+ * 3. it starts the stream with a flash:stream header instead of
18
+ * a stream:stream header.
20
+ * The patch checks the first message of a starting session stream
21
+ * for any '\0'. If found it flags the session as a Flash session
22
+ * and replases the complete header with a Jabber compatible
24
+ * After that every incoming message is filtered and '\0' is
25
+ * replaced with ' '.
26
+ * For every outgoing message, a '\0' is appended and the response
27
+ * of the header is replaced for a flash friendly version
29
+ * The whole flash patch can be switched off by undefining CP2005_FLASH_PATCH
33
+#ifdef CP2005_FLASH_PATCH
35
+#define FLASH_BUFFER_SIZE 256
37
+static const char caStreamHeader [] = "<?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' to='%s' >";
38
+static const char caFlashHeader [] = "<?xml version='1.0'?><flash:stream xmlns:flash='http://www.jabber.com/streams/flash' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' from='%s' id='%s' />";
40
+static void ExtractValue(char *pMessage, char *pVariable, char *pValue) {
46
+ * extract the value of an attribute from a XML message
47
+ * eg: <.... id='1234567890' ....> returns 1234567890
50
+ p = strstr(pMessage, pVariable);
52
+ p += (strlen(pVariable) + 1);
53
+ /* find end of value, search for closing ' or " */
54
+ pEnd = strchr(p, p [-1]);
56
+ if (iLen < FLASH_BUFFER_SIZE) {
57
+ memcpy(pValue, p, iLen);
58
+ pValue[iLen] = '\0';
59
+ log_debug(ZONE, "++++ Extracted Var %s: [%s]\n", pVariable, pValue);
66
static int _c2s_client_sx_callback(sx_t s, sx_event_t e, void *data, void *arg) {
67
sess_t sess = (sess_t) arg;
68
sx_buf_t buf = (sx_buf_t) data;
73
+#ifdef CP2005_FLASH_PATCH
75
+ char caHost[FLASH_BUFFER_SIZE];
76
+ char caID[FLASH_BUFFER_SIZE];
81
log_debug(ZONE, "want read");
86
- log_debug(ZONE, "read %d bytes", len);
90
+#ifdef CP2005_FLASH_PATCH
91
+ /* check for 0 bytes in the first packet
92
+ * if found it must be a flash client
93
+ * remove any 0 in the data and
94
+ * the / that ends the <?xml... header
97
+ pEnd = &buf->data[len];
99
+ if (sess->s->state == state_NONE) {
100
+ /* stream is new, look for flash signature */
101
+ if (strstr(buf->data,"flash:stream")){
102
+ log_debug(ZONE, "++++ Flash Stream detected\n%.*s", buf->len, buf->data);
103
+ sess->flash_client = 1;
105
+ /* extract destination host */
106
+ ExtractValue(buf->data, "to=", caHost);
108
+ /* create normal stream:stream header, resize data buffer first */
109
+ _sx_buffer_alloc_margin(buf, 0, sizeof(caStreamHeader) + strlen(caHost) + 8);
110
+ sprintf(buf->data, caStreamHeader, caHost);
111
+ buf->len = strlen(buf->data);
113
+ log_debug(ZONE, "++++ Converted to\n%.*s", buf->len, buf->data);
117
+ /* Check all other messages in the stream to remove \0's etc */
118
+ if (sess->flash_client)
119
+ /* remove 0's from flash packets */
120
+ for (p = buf->data; p < pEnd; p++)
124
+ log_debug(ZONE, "read %d bytes", len);
129
log_debug(ZONE, "writing to %d", sess->fd);
131
+#ifdef CP2005_FLASH_PATCH
132
+ if (sess->flash_client) {
133
+ /* look for the header <? xml ...*/
134
+ if (strncmp(buf->data, "<?xml ", 6) == 0) {
135
+ /* replace normal stream header with flash friendly header */
136
+ log_debug(ZONE, "++++ Found <?xml..., \n%.*s", buf->len, buf->data);
138
+ /* extract id from id="123456567778765" or id='45454545454' */
139
+ ExtractValue(buf->data, "from=", caHost);
140
+ ExtractValue(buf->data, "id=", caID);
142
+ /* create flash:stream header, realloc buffer first */
143
+ _sx_buffer_alloc_margin(buf, 0, sizeof(caFlashHeader) + strlen(caHost) + strlen(caID) + 8);
144
+ sprintf(buf->data, caFlashHeader, caHost, caID);
145
+ buf->len = strlen(buf->data);
147
+ log_debug(ZONE, "++++ Converted to %s", buf->data);
150
+ /* add a 0 to flash packets */
151
+ buf->data[buf->len] = '\0';
156
len = send(sess->fd, buf->data, buf->len, 0);
158
log_debug(ZONE, "%d bytes written", len);
159
--- /home/wolpert/src/jabberd-2.0cvs/c2s/c2s.h 2004-12-07 08:38:02.000000000 -0700
160
+++ c2s/c2s.h 2005-01-11 14:57:42.000000000 -0700
165
+#ifdef CP2005_FLASH_PATCH
171
int sasl_authd; /* 1 = they did a sasl auth */