Mercurial > prosody-modules
comparison mod_firewall/test.lib.lua @ 2585:02c6ae745c4f
mod_firewall: Add 'test' subcommand to read stanzas from stdin and test them against rules
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Sun, 26 Feb 2017 09:58:07 +0000 |
| parents | |
| children | b50f7b9fdbbb |
comparison
equal
deleted
inserted
replaced
| 2584:d64fc9c3cffd | 2585:02c6ae745c4f |
|---|---|
| 1 local set = require "util.set"; | |
| 2 | |
| 3 local xmppstream = require "util.xmppstream"; | |
| 4 | |
| 5 local function stderr(...) | |
| 6 io.stderr:write("** ", table.concat({...}, "\t", 1, select("#", ...)), "\n"); | |
| 7 end | |
| 8 | |
| 9 return function (arg) | |
| 10 require "net.http".request = function (url, ex, cb) | |
| 11 stderr("Making HTTP request to "..url); | |
| 12 local body_table = {}; | |
| 13 local ok, response_status, response_headers = require "ssl.https".request({ | |
| 14 url = url; | |
| 15 headers = ex.headers; | |
| 16 method = ex.body and "POST" or "GET"; | |
| 17 sink = ltn12.sink.table(body_table); | |
| 18 source = ex.body and ltn12.source.string(ex.body) or nil; | |
| 19 }); | |
| 20 stderr("HTTP response "..response_status); | |
| 21 cb(table.concat(body_table), response_status, { headers = response_headers }); | |
| 22 return true; | |
| 23 end; | |
| 24 | |
| 25 local stats_dropped, stats_passed = 0, 0; | |
| 26 | |
| 27 load_unload_scripts(set.new(arg)); | |
| 28 local session = { notopen = true }; | |
| 29 local stream_callbacks = { default_ns = "jabber:client" }; | |
| 30 | |
| 31 function stream_callbacks.streamopened() | |
| 32 session.notopen = nil; | |
| 33 end | |
| 34 function stream_callbacks.streamclosed() | |
| 35 end | |
| 36 function stream_callbacks.error(session, error_name, error_message) | |
| 37 stderr("Fatal error parsing XML stream: "..error_name..": "..tostring(error_message)) | |
| 38 assert(false); | |
| 39 end | |
| 40 function stream_callbacks.handlestanza(session, stanza) | |
| 41 if not module:fire_event("firewall/chains/deliver", { origin = session, stanza = stanza }) then | |
| 42 stats_passed = stats_passed + 1; | |
| 43 print(stanza); | |
| 44 print(""); | |
| 45 else | |
| 46 stats_dropped = stats_dropped + 1; | |
| 47 end | |
| 48 end | |
| 49 | |
| 50 local stream = xmppstream.new(session, stream_callbacks); | |
| 51 stream:feed("<stream:stream xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client'>"); | |
| 52 local line_count = 0; | |
| 53 for line in io.lines() do | |
| 54 line_count = line_count + 1; | |
| 55 local ok, err = stream:feed(line.."\n"); | |
| 56 if not ok then | |
| 57 stderr("Fatal XML parse error on line "..line_count..": "..err); | |
| 58 return 1; | |
| 59 end | |
| 60 end | |
| 61 | |
| 62 stderr("Summary"); | |
| 63 stderr("-------"); | |
| 64 stderr(""); | |
| 65 stderr(stats_dropped + stats_passed, "processed"); | |
| 66 stderr(stats_passed, "passed"); | |
| 67 stderr(stats_dropped, "droppped"); | |
| 68 stderr(line_count, "input lines"); | |
| 69 stderr(""); | |
| 70 end |
