annotate mod_anti_spam/trie.lib.lua @ 6163:94399ad6b5ab

mod_invites_register_api: Use set_password() for password resets Previously the code relied on the (weird) behaviour of create_user(), which would update the password for a user account if it already existed. This has several issues, and we plan to deprecate this behaviour of create_user(). The larger issue is that this route does not trigger the user-password-changed event, which can be a security problem. For example, it did not disconnect existing user sessions (this occurs in mod_c2s in response to the event). Switching to set_password() is the right thing to do.
author Matthew Wild <mwild1@gmail.com>
date Thu, 06 Feb 2025 10:13:39 +0000
parents 82a10e21b7f9
children 76ae646563ea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6131
82a10e21b7f9 mod_anti_spam: prosody 0.12 compat
Menel <menel@snikket.de>
parents: 6090
diff changeset
1 local bit = require "util.bitcompat";
5859
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local trie_methods = {};
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local trie_mt = { __index = trie_methods };
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local function new_node()
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7 return {};
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 function trie_methods:set(item, value)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 local node = self.root;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 for i = 1, #item do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local c = item:byte(i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14 if not node[c] then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 node[c] = new_node();
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 node = node[c];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 node.terminal = true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 node.value = value;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 local function _remove(node, item, i)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 if i > #item then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 if node.terminal then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 node.terminal = nil;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 node.value = nil;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29 if next(node) ~= nil then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 return node;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 return nil;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 local c = item:byte(i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 local child = node[c];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 local ret;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 if child then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 ret = _remove(child, item, i+1);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39 node[c] = ret;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41 if ret == nil and next(node) == nil then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 return nil;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 return node;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 function trie_methods:remove(item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48 return _remove(self.root, item, 1);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 function trie_methods:get(item, partial)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 local value;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 local node = self.root;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 local len = #item;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 for i = 1, len do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 if partial and node.terminal then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 value = node.value;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 local c = item:byte(i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60 node = node[c];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 if not node then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62 return value, i - 1;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 return node.value, len;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68 function trie_methods:add(item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 return self:set(item, true);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 function trie_methods:contains(item, partial)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 return self:get(item, partial) ~= nil;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 function trie_methods:longest_prefix(item)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 return select(2, self:get(item));
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80 function trie_methods:add_subnet(item, bits)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 item = item.packed:sub(1, math.ceil(bits/8));
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 local existing = self:get(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 if not existing then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 existing = { bits };
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85 return self:set(item, existing);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 -- Simple insertion sort
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 for i = 1, #existing do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 local v = existing[i];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91 if v == bits then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 return; -- Already in there
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93 elseif v > bits then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 table.insert(existing, v, i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 function trie_methods:remove_subnet(item, bits)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101 item = item.packed:sub(1, math.ceil(bits/8));
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 local existing = self:get(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 if not existing then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 return;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 -- Simple insertion sort
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 for i = 1, #existing do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 local v = existing[i];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 if v == bits then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 table.remove(existing, i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 break;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 elseif v > bits then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 return; -- Stop search
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 if #existing == 0 then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 self:remove(item);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122
6163
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
123 local function find_match_in_descendents(node, item, len, i)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
124 for child_byte, child_node in pairs(node) do
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
125 if type(child_byte) == "number" then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
126 if child_node.terminal then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
127 local bits = child_node.value;
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
128 for j = #bits, 1, -1 do
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
129 local b = bits[j]-((i-1)*8);
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
130 if b ~= 8 then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
131 local mask = bit.bnot(2^b-1);
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
132 if bit.band(bit.bxor(c, child_byte), mask) == 0 then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
133 return true;
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
134 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
135 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
136 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
137 else
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
138
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
139 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
140 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
141 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
142 return false;
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
143 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
144
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
145 --
6090
8338f42d2bc5 mod_anti_spam: Tweak trie method name (fixes traceback)
Matthew Wild <mwild1@gmail.com>
parents: 5859
diff changeset
146 function trie_methods:contains_ip(item)
5859
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
147 item = item.packed;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
148 local node = self.root;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
149 local len = #item;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
150 for i = 1, len do
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
151 if node.terminal then
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
152 return true;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
153 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
154
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
155 local c = item:byte(i);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
156 local child = node[c];
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
157 if not child then
6163
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
158 return find_match_in_descendents(node, item, len, i);
5859
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
159 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
160 node = child;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
161 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
162 end
6163
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
163 --]]
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
164
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
165 --[[
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
166 function trie_methods:contains_ip(item)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
167 item = item.packed
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
168 local node = self.root
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
169 local len = #item
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
170
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
171 print(string.byte(item, 1, 4))
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
172
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
173 local function search(node, index)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
174 if node.terminal then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
175 print("S", "TERM")
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
176 return true
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
177 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
178
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
179 if index > len then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
180 print("S", "MAX LEN")
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
181 return false
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
182 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
183
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
184 local c = item:byte(index)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
185 local child = node[c]
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
186
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
187 print("S", (" "):rep(index), ("item[%d] = %d, has_child = %s"):format(index, c, not not child));
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
188
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
189 if child then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
190 -- Continue searching down the current path
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
191 return search(child, index + 1)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
192 else
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
193 -- Check all children for a terminal node
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
194 for child_byte, child_node in pairs(node) do
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
195 if type(child_byte) == "number" and child_byte then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
196 if search(child_node, index + 1) then
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
197 return true
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
198 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
199 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
200 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
201 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
202
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
203 return false
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
204 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
205
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
206 return search(node, 1)
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
207 end
94399ad6b5ab mod_invites_register_api: Use set_password() for password resets
Matthew Wild <mwild1@gmail.com>
parents: 6131
diff changeset
208 --]]
5859
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
209
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
210 local function new()
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
211 return setmetatable({
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
212 root = new_node();
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
213 }, trie_mt);
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
214 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
215
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
216 local function is_trie(o)
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
217 return getmetatable(o) == trie_mt;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
218 end
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
219
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
220 return {
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
221 new = new;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
222 is_trie = is_trie;
259ffdbf8906 mod_anti_spam: New module for spam filtering (pre-alpha)
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
223 };