Add support for XEP-0100 jabber:iq:gateway

This commit is contained in:
Luca Matei Pintilie
2026-08-02 18:12:11 +02:00
parent ad14748a30
commit dbafe37e13
17 changed files with 323 additions and 5 deletions
+1
View File
@@ -46,6 +46,7 @@ def match(stanza, xpath):
'disco_info': 'http://jabber.org/protocol/disco#info',
'muc_traffic': 'http://jabber.org/protocol/muc#traffic',
'disco_items': 'http://jabber.org/protocol/disco#items',
'gateway': 'jabber:iq:gateway',
'commands': 'http://jabber.org/protocol/commands',
'dataform': 'jabber:x:data',
'version': 'jabber:iq:version',
@@ -0,0 +1,36 @@
from scenarios import *
conf = 'fixed_server'
def _test_case(input: str, output: str):
return (
send_stanza(f"<iq type='set' to='{{biboumi_host}}' from='{{jid_one}}/{{resource_one}}' id='iq1' xmlns='jabber:client'><query xmlns='jabber:iq:gateway'><prompt>{input}</prompt></query></iq>"),
expect_stanza(f"/iq[@type='result'][@to='{{jid_one}}/{{resource_one}}'][@from='{{biboumi_host}}']/gateway:query/gateway:jid[text()='{output}']"),
)
def _error_case(input: str):
return (
send_stanza(f"<iq type='set' to='{{biboumi_host}}' from='{{jid_one}}/{{resource_one}}' id='iq1' xmlns='jabber:client'><query xmlns='jabber:iq:gateway'><prompt>{input}</prompt></query></iq>"),
expect_stanza(f"/iq[@type='error'][@to='{{jid_one}}/{{resource_one}}'][@from='{{biboumi_host}}']/error[@type='modify']/stanza:bad-request"),
)
scenario = (
*_test_case("ircs://{irc_host_one}/%23test", "#test@{biboumi_host}"),
*_test_case("ircs://{irc_host_one}/#test", "#test@{biboumi_host}"),
*_test_case("irc://{irc_host_one}/%23test", "#test@{biboumi_host}"),
*_test_case("irc://{irc_host_one}/#test", "#test@{biboumi_host}"),
*_test_case("ircs:///#test", "#test@{biboumi_host}"),
*_test_case("irc:///#test", "#test@{biboumi_host}"),
# TODO: Some applications use the following URL scheme which should be supported
# *_test_case("ircs:///user,isuser", "user@{biboumi_host}"),
# *_test_case("irc:///user,isuser", "user@{biboumi_host}"),
*_test_case("#test", "#test@{biboumi_host}"),
*_test_case("#test%{irc_host_one}", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("nick", "nick@{biboumi_host}"),
*_test_case("{nick_one}%{irc_host_one}", "{lower_nick_one}%{irc_host_one}@{biboumi_host}"),
*_error_case(""),
*_error_case("irc://"),
*_error_case("irc:// asdf"),
*_error_case("ircs://"),
*_error_case("ircs:// asdf"),
)
+31
View File
@@ -0,0 +1,31 @@
from scenarios import *
def _test_case(input: str, output: str):
return (
send_stanza(f"<iq type='set' to='{{biboumi_host}}' from='{{jid_one}}/{{resource_one}}' id='iq1' xmlns='jabber:client'><query xmlns='jabber:iq:gateway'><prompt>{input}</prompt></query></iq>"),
expect_stanza(f"/iq[@type='result'][@to='{{jid_one}}/{{resource_one}}'][@from='{{biboumi_host}}']/gateway:query/gateway:jid[text()='{output}']"),
)
def _error_case(input: str):
return (
send_stanza(f"<iq type='set' to='{{biboumi_host}}' from='{{jid_one}}/{{resource_one}}' id='iq1' xmlns='jabber:client'><query xmlns='jabber:iq:gateway'><prompt>{input}</prompt></query></iq>"),
expect_stanza(f"/iq[@type='error'][@to='{{jid_one}}/{{resource_one}}'][@from='{{biboumi_host}}']/error[@type='modify']/stanza:bad-request"),
)
scenario = (
*_test_case("ircs://{irc_host_one}/%23test", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("ircs://{irc_host_one}/#test", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("irc://{irc_host_one}/%23test", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("irc://{irc_host_one}/#test", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("#test%{irc_host_one}", "#test%{irc_host_one}@{biboumi_host}"),
*_test_case("{nick_one}%{irc_host_one}", "{lower_nick_one}%{irc_host_one}@{biboumi_host}"),
*_error_case(""),
*_error_case("#test"),
*_error_case("{lower_nick_one}"),
*_error_case("irc:///#test"),
*_error_case("irc://"),
*_error_case("irc:// asdf"),
*_error_case("ircs:///#test"),
*_error_case("ircs://"),
*_error_case("ircs:// asdf"),
)
+31
View File
@@ -0,0 +1,31 @@
#include <biboumi.h>
#include "catch2/catch_test_macros.hpp"
#include "catch2/generators/catch_generators.hpp"
#include <irc/irc_uri.hpp>
#include <optional>
#ifdef CURL_FOUND
TEST_CASE("URI") {
auto scheme = GENERATE("irc", "ircs");
auto i = GENERATE("%23channame", "%23channame,ischannel", "#channame",
"#channame,ischannel");
const std::string input =
std::string(scheme) + "://irc.example.com/" + std::string(i);
IrcUri uri(input);
CHECK(uri.get_server() == "irc.example.com");
CHECK(uri.get_entity() == "#channame");
}
#else
TEST_CASE("No CURL") {
auto scheme = GENERATE("irc", "ircs");
auto i = GENERATE("%23channame", "%23channame,ischannel", "#channame",
"#channame,ischannel");
const std::string input =
std::string(scheme) + "://irc.example.com/" + std::string(i);
IrcUri uri(input);
CHECK(uri.get_server() == std::nullopt);
CHECK(uri.get_entity() == std::nullopt);
}
#endif // CURL_FOUND