diff -u ejabberd-2.0.0/src/configure Tipic-Ejabberd-NG/trunk/src/configure --- ejabberd-2.0.0/src/configure 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/configure 2008-04-02 17:53:50.662350441 +0200 @@ -697,6 +697,7 @@ make_ejabberd_zlib hipe roster_gateway_workaround +flash_hack db_type transient_supervisors full_xml @@ -1293,6 +1294,7 @@ --enable-ejabberd_zlib enable ejabberd_zlib (default: yes) --enable-hipe Compile natively with HiPE, not recommended (default: no) --enable-roster-gateway-workaround Turn on workaround for processing gateway subscriptions (default: no) + --enable-flash-hack Enable hack for Flash clients --enable-mssql Use Microsoft SQL Server database (default: no, requires --enable-odbc) --enable-transient_supervisors Use Erlang supervision for transient process (default: yes) --enable-full-xml Use XML features in XMPP stream (ex: CDATA) (default: no, requires XML compliant clients) @@ -5415,6 +5417,21 @@ +# Check whether --enable-flash_hack was given. +if test "${enable_flash_hack+set}" = set; then + enableval=$enable_flash_hack; case "${enableval}" in + yes) flash_hack=true ;; + no) flash_hack=false ;; + *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-flash-hack" >&5 +echo "$as_me: error: bad value ${enableval} for --enable-flash-hack" >&2;} + { (exit 1); exit 1; }; } ;; +esac +else + flash_hack=false +fi + + + # Check whether --enable-mssql was given. if test "${enable_mssql+set}" = set; then enableval=$enable_mssql; case "${enableval}" in @@ -6575,6 +6593,7 @@ make_ejabberd_zlib!$make_ejabberd_zlib$ac_delim hipe!$hipe$ac_delim roster_gateway_workaround!$roster_gateway_workaround$ac_delim +flash_hack!$flash_hack$ac_delim db_type!$db_type$ac_delim transient_supervisors!$transient_supervisors$ac_delim full_xml!$full_xml$ac_delim diff -u ejabberd-2.0.0/src/configure.ac Tipic-Ejabberd-NG/trunk/src/configure.ac --- ejabberd-2.0.0/src/configure.ac 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/configure.ac 2008-03-28 12:52:19.642350128 +0100 @@ -62,6 +62,15 @@ esac],[roster_gateway_workaround=false]) AC_SUBST(roster_gateway_workaround) +AC_ARG_ENABLE(flash_hack, +[ --enable-flash-hack Enable hack for Flash clients], +[case "${enableval}" in + yes) flash_hack=true ;; + no) flash_hack=false ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-flash-hack) ;; +esac],[flash_hack=false]) +AC_SUBST(flash_hack) + AC_ARG_ENABLE(mssql, [ --enable-mssql Use Microsoft SQL Server database (default: no, requires --enable-odbc)], [case "${enableval}" in diff -u ejabberd-2.0.0/src/ejabberd_c2s.erl Tipic-Ejabberd-NG/trunk/src/ejabberd_c2s.erl --- ejabberd-2.0.0/src/ejabberd_c2s.erl 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/ejabberd_c2s.erl 2008-04-07 11:36:22.282350144 +0200 @@ -33,7 +33,7 @@ %% External exports -export([start/2, start_link/2, - send_text/2, + send_text/2, send_element/2, socket_type/0, get_presence/1, @@ -87,7 +87,10 @@ privacy_list = none, conn = unknown, ip, - lang}). + lang, + flash_connection = false +}). + %-define(DBGFSM, true). @@ -118,6 +121,13 @@ "id='~s' from='~s'~s~s>" ). +-define(FLASH_STREAM_HEADER, + "" + "" + ). + -define(STREAM_TRAILER, ""). -define(INVALID_NS_ERR, @@ -209,15 +219,25 @@ %% {stop, Reason, NewStateData} %%---------------------------------------------------------------------- -wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) -> +wait_for_stream({xmlstreamstart, Name, Attrs}, StateData) -> DefaultLang = case ?MYLANG of undefined -> " xml:lang='en'"; DL -> " xml:lang='" ++ DL ++ "'" end, - case xml:get_attr_s("xmlns:stream", Attrs) of - ?NS_STREAM -> + + case {xml:get_attr_s("xmlns:stream", Attrs), + xml:get_attr_s("xmlns:flash", Attrs), + ?FLASH_HACK, + StateData#state.flash_connection} of + {_, ?NS_FLASH_STREAM, true, false} -> + %% Flash client connecting - attention! + %% Some of them don't provide an xmlns:stream attribute - + %% compensate for that. + wait_for_stream({xmlstreamstart, Name, [{"xmlns:stream", ?NS_STREAM}|Attrs]}, + StateData#state{flash_connection = true}); + {?NS_STREAM, _, _, _} -> Server = jlib:nameprep(xml:get_attr_s("to", Attrs)), case lists:member(Server, ?MYHOSTS) of true -> @@ -225,7 +245,11 @@ change_shaper(StateData, jlib:make_jid("", Server, "")), case xml:get_attr_s("version", Attrs) of "1.0" -> - Header = io_lib:format(?STREAM_HEADER, + Header = io_lib:format(if StateData#state.flash_connection -> + ?FLASH_STREAM_HEADER; + true -> + ?STREAM_HEADER + end, [StateData#state.streamid, Server, " version='1.0'", @@ -630,6 +654,8 @@ end end; _ -> + %% jabber:iq:auth packet? + AuthPacket = is_auth_packet(El), if (SockMod == gen_tcp) and TLSRequired -> Lang = StateData#state.lang, @@ -638,6 +664,10 @@ "Use of STARTTLS required") ++ ?STREAM_TRAILER), {stop, normal, StateData}; + AuthPacket /= false -> + %% Accept legacy authentication, even though + %% client advertised SASL support. + wait_for_auth({xmlstreamelement, El}, StateData); true -> process_unauthenticated_stanza(StateData, El), fsm_next_state(wait_for_feature_request, StateData) @@ -1333,7 +1363,13 @@ send_text(StateData, Text) -> ?DEBUG("Send XML on stream = ~p", [lists:flatten(Text)]), - (StateData#state.sockmod):send(StateData#state.socket, Text). + if ?FLASH_HACK and StateData#state.flash_connection -> + %% send a null byte after each stanza to Flash clients + Text1 = [Text, 0]; + true -> + Text1 = Text + end, + (StateData#state.sockmod):send(StateData#state.socket, Text1). send_element(StateData, El) -> send_text(StateData, xml:element_to_string(El)). diff -u ejabberd-2.0.0/src/ejabberd.hrl Tipic-Ejabberd-NG/trunk/src/ejabberd.hrl --- ejabberd-2.0.0/src/ejabberd.hrl 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/ejabberd.hrl 2008-03-28 12:52:19.666350317 +0100 @@ -53,4 +53,11 @@ -define(PRIVACY_SUPPORT, true). +-ifdef(ENABLE_FLASH_HACK). +-define(FLASH_HACK, true). +-else. +-define(FLASH_HACK, false). +-endif. + + -define(EJABBERD_URI, "http://www.process-one.net/en/ejabberd/"). diff -u ejabberd-2.0.0/src/expat_erl.c Tipic-Ejabberd-NG/trunk/src/expat_erl.c --- ejabberd-2.0.0/src/expat_erl.c 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/expat_erl.c 2008-03-28 12:52:19.658350254 +0100 @@ -211,6 +211,35 @@ case PARSE_COMMAND: case PARSE_FINAL_COMMAND: ei_x_new_with_version(&event_buf); +#ifdef ENABLE_FLASH_HACK + /* Flash hack - Flash clients send a null byte after the stanza. Remove that... */ + { + int i; + int found_null = 0; + + /* Maybe the Flash client sent many stanzas in one packet. + If so, there is a null byte between every stanza. */ + for (i = 0; i < len; i++) { + if (buf[i] == '\0') { + buf[i] = ' '; + found_null = 1; + } + } + + /* And also remove the closing slash if this is a + flash:stream element. Assume that flash:stream is the + last element in the packet, and entirely contained in + it. This requires that a null byte has been found. */ + if (found_null && strstr(buf, " + buf[len - 3] is / (maybe) + */ + if (buf[len - 3] == '/') + buf[len - 3] = ' '; + } +#endif /* ENABLE_FLASH_HACK */ + res = XML_Parse(d->parser, buf, len, command == PARSE_FINAL_COMMAND); if(!res) diff -u ejabberd-2.0.0/src/jlib.hrl Tipic-Ejabberd-NG/trunk/src/jlib.hrl --- ejabberd-2.0.0/src/jlib.hrl 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/jlib.hrl 2008-03-28 12:52:19.674350380 +0100 @@ -57,6 +57,7 @@ -define(NS_EJABBERD_CONFIG, "ejabberd:config"). -define(NS_STREAM, "http://etherx.jabber.org/streams"). +-define(NS_FLASH_STREAM, "http://www.jabber.com/streams/flash"). -define(NS_STANZAS, "urn:ietf:params:xml:ns:xmpp-stanzas"). -define(NS_STREAMS, "urn:ietf:params:xml:ns:xmpp-streams"). diff -u ejabberd-2.0.0/src/Makefile.in Tipic-Ejabberd-NG/trunk/src/Makefile.in --- ejabberd-2.0.0/src/Makefile.in 2008-02-21 11:02:12.000000000 +0100 +++ Tipic-Ejabberd-NG/trunk/src/Makefile.in 2008-03-28 12:52:19.630351431 +0100 @@ -40,9 +40,14 @@ ERLC_FLAGS+=-DNO_TRANSIENT_SUPERVISORS endif +ifeq (@flash_hack@, true) + ERLC_FLAGS+=-DENABLE_FLASH_HACK + CPPFLAGS+=-DENABLE_FLASH_HACK +endif + prefix = @prefix@ -SUBDIRS = @mod_irc@ @mod_pubsub@ @mod_muc@ @mod_proxy65@ @eldap@ @pam@ @web@ stringprep @tls@ @odbc@ @ejabberd_zlib@ +SUBDIRS = @mod_irc@ @mod_pubsub@ @mod_muc@ @mod_proxy65@ @eldap@ @pam@ @web@ stringprep @tls@ @odbc@ @ejabberd_zlib@ ERLSHLIBS = expat_erl.so ERLBEHAVS = cyrsasl.erl gen_mod.erl p1_fsm.erl SOURCES = $(ERLBEHAVS) $(wildcard *.erl) @@ -89,7 +94,7 @@ @ERLC@ -W $(ERLC_FLAGS) $*.erl $(ERLSHLIBS): %.so: %.c - $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) \ + $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(LIBS) \ $(subst ../,,$(subst .so,.c,$@)) \ $(EXPAT_LIBS) $(EXPAT_CFLAGS) \ $(ERLANG_LIBS) $(ERLANG_CFLAGS) \