File

spec/util_xml_spec.lua @ 12686:5f182bccf33f

mod_component: Require 'from' attribute on stanzas by default The old behaviour of falling back to the component domain when it is missing has been merged into the logic for the existing "validate_from_addresses" option (which is strict by default). ejabberd already rejects component stanzas with no 'from' (as the XEP requires), and this has led to compatibility issues for components that were seemingly working fine with Prosody.
author Matthew Wild <mwild1@gmail.com>
date Sun, 28 Aug 2022 07:51:50 +0100
parent 12270:c78639ee6ccb
line wrap: on
line source


local xml = require "util.xml";

describe("util.xml", function()
	describe("#parse()", function()
		it("should work", function()
			local x =
[[<x xmlns:a="b">
	<y xmlns:a="c"> <!-- this overwrites 'a' -->
	    <a:z/>
	</y>
	<a:z/> <!-- prefix 'a' is nil here, but should be 'b' -->
</x>
]]
			local stanza = xml.parse(x, {allow_comments = true});
			assert.are.equal(stanza.tags[2].attr.xmlns, "b");
			assert.are.equal(stanza.tags[2].namespaces["a"], "b");
		end);

		it("should reject doctypes", function()
			local x = "<!DOCTYPE foo []><foo/>";
			local ok = xml.parse(x);
			assert.falsy(ok);
		end);

		it("should reject comments by default", function()
			local x = "<foo><!-- foo --></foo>";
			local ok = xml.parse(x);
			assert.falsy(ok);
		end);

		it("should allow comments if asked nicely", function()
			local x = "<foo><!-- foo --></foo>";
			local stanza = xml.parse(x, {allow_comments = true});
			assert.are.equal(stanza.name, "foo");
			assert.are.equal(#stanza, 0);
		end);

		it("should reject processing instructions", function()
			local x = "<foo><?php die(); ?></foo>";
			local ok = xml.parse(x);
			assert.falsy(ok);
		end);

		it("should allow processing instructions if asked nicely", function()
			local x = "<?xml-stylesheet href='make-fancy.xsl'?><foo/>";
			local stanza = xml.parse(x, {allow_processing_instructions = true});
			assert.truthy(stanza);
			assert.are.equal(stanza.name, "foo");
		end);

		it("should allow an xml declaration", function()
			local x = "<?xml version='1.0'?><foo/>";
			local stanza = xml.parse(x);
			assert.truthy(stanza);
			assert.are.equal(stanza.name, "foo");
		end);
	end);
end);