spec/util_iterators_spec.lua
author Jonas Schäfer <jonas@wielicki.name>
Mon, 10 Jan 2022 18:23:54 +0100
branch0.11
changeset 12185 783056b4e448
parent 9331 a9592107021b
child 12748 e894677359e5
permissions -rw-r--r--
util.xml: Do not allow doctypes, comments or processing instructions Yes. This is as bad as it sounds. CVE pending. In Prosody itself, this only affects mod_websocket, which uses util.xml to parse the <open/> frame, thus allowing unauthenticated remote DoS using Billion Laughs. However, third-party modules using util.xml may also be affected by this. This commit installs handlers which disallow the use of doctype declarations and processing instructions without any escape hatch. It, by default, also introduces such a handler for comments, however, there is a way to enable comments nontheless. This is because util.xml is used to parse human-facing data, where comments are generally a desirable feature, and also because comments are generally harmless.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8805
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
local iter = require "util.iterators";
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
describe("util.iterators", function ()
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
	describe("join", function ()
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
		it("should produce a joined iterator", function ()
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
			local expect = { "a", "b", "c", 1, 2, 3 };
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
			local output = {};
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
			for x in iter.join(iter.values({"a", "b", "c"})):append(iter.values({1, 2, 3})) do
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     9
				table.insert(output, x);
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    10
			end
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    11
			assert.same(output, expect);
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    12
		end);
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
	end);
9330
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    14
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    15
	describe("sorted_pairs", function ()
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    16
		it("should produce sorted pairs", function ()
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    17
			local orig = { b = 1, c = 2, a = "foo", d = false };
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    18
			local n, last_key = 0, nil;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    19
			for k, v in iter.sorted_pairs(orig) do
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    20
				n = n + 1;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    21
				if last_key then
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    22
					assert(k > last_key, "Expected "..k.." > "..last_key)
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    23
				end
9331
a9592107021b util.iterators tests: Check value matches expected [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 9330
diff changeset
    24
				assert.equal(orig[k], v);
9330
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    25
				last_key = k;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    26
			end
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    27
			assert.equal("d", last_key);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    28
			assert.equal(4, n);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    29
		end);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    30
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    31
		it("should allow a custom sort function", function ()
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    32
			local orig = { b = 1, c = 2, a = "foo", d = false };
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    33
			local n, last_key = 0, nil;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    34
			for k, v in iter.sorted_pairs(orig, function (a, b) return a > b end) do
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    35
				n = n + 1;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    36
				if last_key then
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    37
					assert(k < last_key, "Expected "..k.." > "..last_key)
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    38
				end
9331
a9592107021b util.iterators tests: Check value matches expected [luacheck]
Matthew Wild <mwild1@gmail.com>
parents: 9330
diff changeset
    39
				assert.equal(orig[k], v);
9330
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    40
				last_key = k;
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    41
			end
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    42
			assert.equal("a", last_key);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    43
			assert.equal(4, n);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    44
		end);
f6f1dec164b5 util.iterators: Add sorted_pairs() method
Matthew Wild <mwild1@gmail.com>
parents: 8808
diff changeset
    45
	end);
8805
befffddf1b25 Fix wrong tests committed with 7b621a4a2e8d
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    46
end);