mod_vjud/mod_vjud.lua
author Kim Alvefur <zash@zash.se>
Sun, 02 Feb 2014 18:12:42 +0100
changeset 1296 b1a92a87309c
parent 882 4939788a47ea
child 1318 5d49dc72b732
permissions -rw-r--r--
mod_vjud: Move instructions into a config option
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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";
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
module:add_feature("jabber:iq:search");
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
local vCard_mt = {
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
	__index = function(t, k)
734
81de1e446bfe mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents: 733
diff changeset
    47
		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
    48
		for i=1,#t do
734
81de1e446bfe mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents: 733
diff changeset
    49
			local t_i = rawget(t, i);
81de1e446bfe mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents: 733
diff changeset
    50
			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
    51
				rawset(t, k, t_i);
81de1e446bfe mod_vjud: Don't break on undefined properties.
Kim Alvefur <zash@zash.se>
parents: 733
diff changeset
    52
				return t_i;
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
			end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
		end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
	end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
};
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    57
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
    58
local function get_user_vcard(user, 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
    59
	local vCard = dm_load(user, host or base_host, "vcard");
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    60
	if vCard then
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    61
		vCard = st.deserialize(vCard);
732
317e142fe6f1 mod_vjud: Update util.vcard from verse
Kim Alvefur <zash@zash.se>
parents: 730
diff changeset
    62
		vCard = vcard.from_xep54(vCard);
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
		return setmetatable(vCard, vCard_mt);
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
	end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
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
    67
local at_host = "@"..base_host;
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
881
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
    69
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
    70
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    71
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
    72
	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
    73
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
    74
	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
    75
		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
    76
		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
    77
	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
    78
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    79
	if stanza.attr.type == "get" then
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    80
		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
    81
	else -- type == "set"
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    82
		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
    83
		local first, last, nick, email =
879
3a17fc0127b1 mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents: 789
diff changeset
    84
			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
    85
			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
    86
			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
    87
			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
    88
879
3a17fc0127b1 mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents: 789
diff changeset
    89
		first = #first >= 2 and first;
3a17fc0127b1 mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents: 789
diff changeset
    90
		last  = #last  >= 2 and last;
3a17fc0127b1 mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents: 789
diff changeset
    91
		nick  = #nick  >= 2 and nick;
3a17fc0127b1 mod_vjud: Enforce minimal length of search parameters
Kim Alvefur <zash@zash.se>
parents: 789
diff changeset
    92
		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
    93
		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
    94
			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
    95
			return true;
274bb1a96122 mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents: 715
diff changeset
    96
		end
274bb1a96122 mod_vjud: Missing fields should not match everyone. (Thanks Pidgin)
Kim Alvefur <zash@zash.se>
parents: 715
diff changeset
    97
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    98
		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
    99
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   100
		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
   101
		if hostname == base_host and username and usermanager.user_exists(username, hostname) then
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   102
			local vCard = get_user_vcard(username);
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   103
			if vCard then
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   104
				reply:add_child(item_template.apply{
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
					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
   106
					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
   107
					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
   108
					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
   109
					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
   110
				});
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   111
			end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   112
		else
881
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   113
			for username in users() do
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   114
				local vCard = get_user_vcard(username);
880
312602605269 mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents: 879
diff changeset
   115
				if vCard
312602605269 mod_vjud: Do case-insensitive matching
Kim Alvefur <zash@zash.se>
parents: 879
diff changeset
   116
				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
   117
				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
   118
				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
   119
				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
   120
					reply:add_child(item_template.apply{
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
						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
   122
						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
   123
						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
   124
						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
   125
						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
   126
					});
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   127
				end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   128
			end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   129
		end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   130
		origin.send(reply);
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   131
	end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
	return true;
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
881
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   135
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
   136
	function users()
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   137
		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
   138
	end
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   139
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
   140
	local opted_in;
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   141
	function module.load()
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   142
		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
   143
	end
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   144
	function module.unload()
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   145
		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
   146
	end
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   147
	function users()
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   148
		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
   149
	end
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   150
	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
   151
		title = "Search settings";
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   152
		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
   153
		{
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   154
			name = "searchable",
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   155
			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
   156
			type = "boolean",
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   157
		},
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
	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
   160
		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
   161
		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
   162
			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
   163
				return { status = "canceled" };
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   164
			end
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   165
881
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   166
			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
   167
				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
   168
				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
   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
			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
   172
			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
   173
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   174
			return { status = "completed" }
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   175
		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
   176
			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
   177
			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
   178
		end
715
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   179
	end
b1268d3aa6ce mod_vjud: Add. Thanks waqas for the base code.
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   180
881
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   181
	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
   182
	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
   183
	module:depends"adhoc";
4b06d6c79b15 mod_vjud: Add non-default mode where we search all users
Kim Alvefur <zash@zash.se>
parents: 880
diff changeset
   184
	module:provides("adhoc", adhoc_vjudsetup);
715
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
end