Mercurial > prosody-modules
annotate mod_vjud/mod_vjud.lua @ 3503:882180b459a0
mod_pubsub_post: Restructure authentication and authorization (BC)
This deprecates the default "superuser" actor model and makes the
default equivalent to the previous "request.id".
A single actor and secret per node is supported because HTTP and
WebHooks don't normally include any authorization identity.
Allowing authentication bypass when no secret is given should be
relatively safe when the actor is unprivileged, as will be unless
explicitly configured otherwise.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 30 Mar 2019 21:16:13 +0100 |
parents | a90c7d7e7413 |
children | 5dffb85e62c4 |
rev | line source |
---|---|
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
1 local dm_load = require "util.datamanager".load; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 local dm_store = require "util.datamanager".store; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 local usermanager = require "core.usermanager"; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local dataforms_new = require "util.dataforms".new; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 local jid_split = require "util.jid".prepped_split; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 local vcard = module:require "vcard"; |
734
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
8 local rawget, rawset = rawget, rawset; |
880
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
9 local s_lower = string.lower; |
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
10 local s_find = string.find; |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 local st = require "util.stanza"; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 local template = require "util.template"; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
1296
b1a92a87309c
mod_vjud: Move instructions into a config option
Kim Alvefur <zash@zash.se>
parents:
882
diff
changeset
|
15 local instructions = module:get_option_string("vjud_instructions", "Fill in one or more fields to search for any matching Jabber users."); |
b1a92a87309c
mod_vjud: Move instructions into a config option
Kim Alvefur <zash@zash.se>
parents:
882
diff
changeset
|
16 |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 local get_reply = template[[ |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 <query xmlns="jabber:iq:search"> |
1296
b1a92a87309c
mod_vjud: Move instructions into a config option
Kim Alvefur <zash@zash.se>
parents:
882
diff
changeset
|
19 <instructions>{instructions}</instructions> |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 <first/> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 <last/> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 <nick/> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 <email/> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 </query> |
1296
b1a92a87309c
mod_vjud: Move instructions into a config option
Kim Alvefur <zash@zash.se>
parents:
882
diff
changeset
|
25 ]].apply({ instructions = instructions }); |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 local item_template = template[[ |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 <item xmlns="jabber:iq:search" jid="{jid}"> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 <first>{first}</first> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 <last>{last}</last> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 <nick>{nick}</nick> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 <email>{email}</email> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 </item> |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 ]]; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
35 local search_mode = module:get_option_string("vjud_mode", "opt-in"); |
882
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
36 local allow_remote = module:get_option_boolean("allow_remote_searches", search_mode ~= "all"); |
789
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
37 local base_host = module:get_option_string("vjud_search_domain", |
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
38 module:get_host_type() == "component" |
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
39 and module.host:gsub("^[^.]+%.","") |
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
40 or module.host); |
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
41 |
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
42 module:depends"disco"; |
1319 | 43 if module:get_host_type() == "component" then |
1318
5d49dc72b732
mod_vjud: Add an <identity> if loaded as a component (thanks gryffus)
Kim Alvefur <zash@zash.se>
parents:
1296
diff
changeset
|
44 module:add_identity("directory", "user", module:get_option_string("name", "User search")); |
5d49dc72b732
mod_vjud: Add an <identity> if loaded as a component (thanks gryffus)
Kim Alvefur <zash@zash.se>
parents:
1296
diff
changeset
|
45 end |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 module:add_feature("jabber:iq:search"); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 local vCard_mt = { |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 __index = function(t, k) |
734
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
50 if type(k) ~= "string" then return nil end |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 for i=1,#t do |
734
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
52 local t_i = rawget(t, i); |
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
53 if t_i and t_i.name == k then |
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
54 rawset(t, k, t_i); |
81de1e446bfe
mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents:
733
diff
changeset
|
55 return t_i; |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
56 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
59 }; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 |
789
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
61 local function get_user_vcard(user, host) |
2179
a90c7d7e7413
mod_vjud: Fix missing comma (thanks Tobias)
Kim Alvefur <zash@zash.se>
parents:
2008
diff
changeset
|
62 local vCard, err = dm_load(user, host or base_host, "vcard"); |
2008
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
63 if not vCard then return nil, err; end |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
64 vCard = st.deserialize(vCard); |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
65 vCard, err = vcard.from_xep54(vCard); |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
66 if not vCard then return nil, err; end |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
67 return setmetatable(vCard, vCard_mt); |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
69 |
789
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
70 local at_host = "@"..base_host; |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
71 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
72 local users; -- The user iterator |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
73 |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 module:hook("iq/host/jabber:iq:search:query", function(event) |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 local origin, stanza = event.origin, event.stanza; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 |
882
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
77 if not (allow_remote or origin.type == "c2s") then |
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
78 origin.send(st.error_reply(stanza, "cancel", "not-allowed")) |
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
79 return true; |
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
80 end |
4939788a47ea
mod_vjud: Disallow searching from remote hosts by default in search-all-users mode
Kim Alvefur <zash@zash.se>
parents:
881
diff
changeset
|
81 |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 if stanza.attr.type == "get" then |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 origin.send(st.reply(stanza):add_child(get_reply)); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 else -- type == "set" |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 local query = stanza.tags[1]; |
730
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
86 local first, last, nick, email = |
879
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
87 s_lower(query:get_child_text"first" or ""), |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
88 s_lower(query:get_child_text"last" or ""), |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
89 s_lower(query:get_child_text"nick" or ""), |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
90 s_lower(query:get_child_text"email" or ""); |
730
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
91 |
879
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
92 first = #first >= 2 and first; |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
93 last = #last >= 2 and last; |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
94 nick = #nick >= 2 and nick; |
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
95 email = #email >= 2 and email; |
730
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
96 if not ( first or last or nick or email ) then |
879
3a17fc0127b1
mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents:
789
diff
changeset
|
97 origin.send(st.error_reply(stanza, "modify", "not-acceptable", "All fields were empty or too short")); |
730
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
98 return true; |
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
99 end |
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
100 |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
101 local reply = st.reply(stanza):query("jabber:iq:search"); |
730
274bb1a96122
mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents:
715
diff
changeset
|
102 |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
103 local username, hostname = jid_split(email); |
789
7e40d6680093
mod_vjud: Allow working as a component, in which case the parent domain is searched.
Kim Alvefur <zash@zash.se>
parents:
787
diff
changeset
|
104 if hostname == base_host and username and usermanager.user_exists(username, hostname) then |
2008
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
105 local vCard, err = get_user_vcard(username); |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
106 if not vCard then |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
107 module:log("debug", "Couldn't get vCard for user %s: %s", username, err or "unknown error"); |
cf3bdcb633f0
mod_vjud: Handle vCard decoding errors by logging them (Thanks Roi)
Kim Alvefur <zash@zash.se>
parents:
1319
diff
changeset
|
108 else |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
109 reply:add_child(item_template.apply{ |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
110 jid = username..at_host; |
733
dd3b30c0dc8a
mod_vjud: Switch first and last name in results to be correct.
Kim Alvefur <zash@zash.se>
parents:
732
diff
changeset
|
111 first = vCard.N and vCard.N[2] or nil; |
dd3b30c0dc8a
mod_vjud: Switch first and last name in results to be correct.
Kim Alvefur <zash@zash.se>
parents:
732
diff
changeset
|
112 last = vCard.N and vCard.N[1] or nil; |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
113 nick = vCard.NICKNAME and vCard.NICKNAME[1] or username; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
114 email = vCard.EMAIL and vCard.EMAIL[1] or nil; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
115 }); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
116 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
117 else |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
118 for username in users() do |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
119 local vCard = get_user_vcard(username); |
880
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
120 if vCard |
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
121 and ((first and vCard.N and s_find(s_lower(vCard.N[2]), first, nil, true)) |
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
122 or (last and vCard.N and s_find(s_lower(vCard.N[1]), last, nil, true)) |
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
123 or (nick and vCard.NICKNAME and s_find(s_lower(vCard.NICKNAME[1]), nick, nil, true)) |
312602605269
mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents:
879
diff
changeset
|
124 or (email and vCard.EMAIL and s_find(s_lower(vCard.EMAIL[1]), email, nil, true))) then |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
125 reply:add_child(item_template.apply{ |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
126 jid = username..at_host; |
733
dd3b30c0dc8a
mod_vjud: Switch first and last name in results to be correct.
Kim Alvefur <zash@zash.se>
parents:
732
diff
changeset
|
127 first = vCard.N and vCard.N[2] or nil; |
dd3b30c0dc8a
mod_vjud: Switch first and last name in results to be correct.
Kim Alvefur <zash@zash.se>
parents:
732
diff
changeset
|
128 last = vCard.N and vCard.N[1] or nil; |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
129 nick = vCard.NICKNAME and vCard.NICKNAME[1] or username; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 email = vCard.EMAIL and vCard.EMAIL[1] or nil; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 }); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
134 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 origin.send(reply); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 return true; |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 end); |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
139 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
140 if search_mode == "all" then |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
141 function users() |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
142 return usermanager.users(base_host); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
143 end |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
144 else -- if "opt-in", default |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
145 local opted_in; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
146 function module.load() |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
147 opted_in = dm_load(nil, module.host, "user_index") or {}; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
148 end |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
149 function module.unload() |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
150 dm_store(nil, module.host, "user_index", opted_in); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
151 end |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
152 function users() |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
153 return pairs(opted_in); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
154 end |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
155 local opt_in_layout = dataforms_new{ |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
156 title = "Search settings"; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
157 instructions = "Do you want to appear in search results?"; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
158 { |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
159 name = "searchable", |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
160 label = "Appear in search results?", |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
161 type = "boolean", |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
162 }, |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
163 }; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
164 local function opt_in_handler(self, data, state) |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
165 local username, hostname = jid_split(data.from); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
166 if state then -- the second return value |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
167 if data.action == "cancel" then |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
168 return { status = "canceled" }; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
169 end |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
170 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
171 if not username or not hostname or hostname ~= base_host then |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
172 return { status = "error", error = { type = "cancel", |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
173 condition = "forbidden", message = "Invalid user or hostname." } }; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
174 end |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
176 local fields = opt_in_layout:data(data.form); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
177 opted_in[username] = fields.searchable or nil |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
178 |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
179 return { status = "completed" } |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
180 else -- No state, send the form. |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
181 return { status = "executing", actions = { "complete" }, |
787
cec49ee88c23
mod_vjud: Correctly pass current state to form (Thanks Florob)
Kim Alvefur <zash@zash.se>
parents:
742
diff
changeset
|
182 form = { layout = opt_in_layout, values = { searchable = opted_in[username] } } }, true; |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
183 end |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
184 end |
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
185 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
186 local adhoc_new = module:require "adhoc".new; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
187 local adhoc_vjudsetup = adhoc_new("Search settings", "vjudsetup", opt_in_handler);--, "self");-- and nil); |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
188 module:depends"adhoc"; |
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
189 module:provides("adhoc", adhoc_vjudsetup); |
715
b1268d3aa6ce
mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
190 |
881
4b06d6c79b15
mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents:
880
diff
changeset
|
191 end |