From 04c094593041c6377b4139f35d8776fd55909097 Mon Sep 17 00:00:00 2001 From: paweldomas Date: Tue, 10 Mar 2020 16:41:50 -0500 Subject: [PATCH] add mod_websocket_smacks.patch The patch and Prosody 0.11 is required for the XMPP stream resume --- .../mod_websocket_smacks.patch | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 resources/prosody-plugins/mod_websocket_smacks.patch diff --git a/resources/prosody-plugins/mod_websocket_smacks.patch b/resources/prosody-plugins/mod_websocket_smacks.patch new file mode 100644 index 000000000..665b3047d --- /dev/null +++ b/resources/prosody-plugins/mod_websocket_smacks.patch @@ -0,0 +1,101 @@ +--- mod_websocket.lua ++++ mod_websocket.lua +@@ -163,34 +163,34 @@ function handle_request(event) + return 403; + end + +- local function websocket_close(code, message) ++ local function websocket_close(conn, code, message) + conn:write(build_close(code, message)); + conn:close(); + end + + local dataBuffer; +- local function handle_frame(frame) ++ local function handle_frame(conn, frame) + local opcode = frame.opcode; + local length = frame.length; + module:log("debug", "Websocket received frame: opcode=%0x, %i bytes", frame.opcode, #frame.data); + + -- Error cases + if frame.RSV1 or frame.RSV2 or frame.RSV3 then -- Reserved bits non zero +- websocket_close(1002, "Reserved bits not zero"); ++ websocket_close(conn, 1002, "Reserved bits not zero"); + return false; + end + + if opcode == 0x8 then -- close frame + if length == 1 then +- websocket_close(1002, "Close frame with payload, but too short for status code"); ++ websocket_close(conn, 1002, "Close frame with payload, but too short for status code"); + return false; + elseif length >= 2 then + local status_code = parse_close(frame.data) + if status_code < 1000 then +- websocket_close(1002, "Closed with invalid status code"); ++ websocket_close(conn, 1002, "Closed with invalid status code"); + return false; + elseif ((status_code > 1003 and status_code < 1007) or status_code > 1011) and status_code < 3000 then +- websocket_close(1002, "Closed with reserved status code"); ++ websocket_close(conn, 1002, "Closed with reserved status code"); + return false; + end + end +@@ -198,28 +198,28 @@ function handle_request(event) + + if opcode >= 0x8 then + if length > 125 then -- Control frame with too much payload +- websocket_close(1002, "Payload too large"); ++ websocket_close(conn, 1002, "Payload too large"); + return false; + end + + if not frame.FIN then -- Fragmented control frame +- websocket_close(1002, "Fragmented control frame"); ++ websocket_close(conn, 1002, "Fragmented control frame"); + return false; + end + end + + if (opcode > 0x2 and opcode < 0x8) or (opcode > 0xA) then +- websocket_close(1002, "Reserved opcode"); ++ websocket_close(conn, 1002, "Reserved opcode"); + return false; + end + + if opcode == 0x0 and not dataBuffer then +- websocket_close(1002, "Unexpected continuation frame"); ++ websocket_close(conn, 1002, "Unexpected continuation frame"); + return false; + end + + if (opcode == 0x1 or opcode == 0x2) and dataBuffer then +- websocket_close(1002, "Continuation frame expected"); ++ websocket_close(conn, 1002, "Continuation frame expected"); + return false; + end + +@@ -229,11 +229,11 @@ function handle_request(event) + elseif opcode == 0x1 then -- Text frame + dataBuffer = {frame.data}; + elseif opcode == 0x2 then -- Binary frame +- websocket_close(1003, "Only text frames are supported"); ++ websocket_close(conn, 1003, "Only text frames are supported"); + return; + elseif opcode == 0x8 then -- Close request +- websocket_close(1000, "Goodbye"); +- return; ++ websocket_close(conn, 1000, "Goodbye"); ++ return ""; + elseif opcode == 0x9 then -- Ping frame + frame.opcode = 0xA; + conn:write(build_frame(frame)); +@@ -276,7 +276,7 @@ function handle_request(event) + + while frame do + frameBuffer = frameBuffer:sub(length + 1); +- local result = handle_frame(frame); ++ local result = handle_frame(session.conn, frame); + if not result then return; end + cache[#cache+1] = filter_open_close(result); + frame, length = parse_frame(frameBuffer);