diff options
Diffstat (limited to 'echoz.sed')
-rwxr-xr-x | echoz.sed | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/echoz.sed b/echoz.sed new file mode 100755 index 0000000..2a156be --- /dev/null +++ b/echoz.sed @@ -0,0 +1,102 @@ +#!/bin/sed -unrf +# read config into hold buffer +h; +# use domain as to +s#^\S+@(\S+)\s.+$#<stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="\1">#; +p;n; + +:wait-for-plain; +/^PLAIN<\/mechanism$/bauth-with-plain; +n; +bwait-for-plain; + +:auth-with-plain; +# load config +g; +s#^\S+\s+(\S+)$#<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>\1</auth>#; +p;n; +bwait-for-sasl-result; + +:wait-for-sasl-result; +/^<success\s+xmlns=['"]urn:ietf:params:xml:ns:xmpp-sasl['"]/bsasl-success; +/^<failure\s+xmlns=['"]urn:ietf:params:xml:ns:xmpp-sasl['"]/bsasl-failure; +n; +bwait-for-sasl-result; + +:sasl-success; +# restart stream: load config and send stream header +g; +s#^\S+@(\S+)\s.+$#<stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="\1">#; +p;n; +bwait-for-bind; + +:sasl-failure; +s#^.+$#</stream:stream>#; +q1; + +:wait-for-bind; +/^<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/bbind; +n; +bwait-for-bind; + +:bind; +s#^(.+)$#<iq type='set' id='sed-bind'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/></iq>#;p;n; +bwait-for-bind-result; + +:wait-for-bind-result; +/<iq.+id=['"]sed-bind['"]/bprocess-bind-result; +n; +bwait-for-bind-result; + +:process-bind-result; +/type=["']error["']/bexit-with-error; +bsend-presence; + +:exit-with-error; +s#^.+$#</stream:stream>#;p;q1; + +:send-presence; +s#^.+$#<presence/>#;p;n; +bmain-loop; + +:main-loop; +/<message/bhandle-message; +n; +bmain-loop; + +:handle-message; +/type='chat'/bhandle-chat-message; +bmain-loop; + +:handle-chat-message; +# prepare header; store it in hold space first +h; +# extract new to address +s#^.*from=(['"][^'"]+?['"]).*$#to=\1\n#; +# add copy of header and extrat new from address +G; +s#^(.+)\n.+to=(['"][^'"]+?['"]).*$#\1 from=\2#; +# write header +s#^(.+)$#<message type="chat" \1>#; +# store result in hold space +h; +bmessage-search-body-loop; + +:message-search-body-loop; +# drop message if end-of-message before body +\#</message#bmain-loop; +\#<body#bmessage-collect-body; +n; +bmessage-search-body-loop; + +:message-collect-body; +# next line must contain body +n; +s#^(.+)</body#<body>\1</body>#; +# append result to hold space +H; +# load full hold space and append </message> and send +g; +s#^(.+)$#\1</message>#; +p;n; +bmain-loop; |