mod_adhoc_cmd_admin/mod_adhoc_cmd_admin.lua
changeset 124 843cadf36306
parent 123 c04443ea114c
child 128 bdd1641c159d
equal deleted inserted replaced
123:c04443ea114c 124:843cadf36306
    19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid";
    19 local st, jid, uuid = require "util.stanza", require "util.jid", require "util.uuid";
    20 local dataforms_new = require "util.dataforms".new;
    20 local dataforms_new = require "util.dataforms".new;
    21 module:log("debug", module:get_name());
    21 module:log("debug", module:get_name());
    22 local adhoc_new = module:require "adhoc".new;
    22 local adhoc_new = module:require "adhoc".new;
    23 
    23 
    24 local sessions = {};
       
    25 
       
    26 local add_user_layout = dataforms_new{
    24 local add_user_layout = dataforms_new{
    27 	title = "Adding a User";
    25 	title = "Adding a User";
    28 	instructions = "Fill out this form to add a user.";
    26 	instructions = "Fill out this form to add a user.";
    29 
    27 
    30 	{ name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" };
    28 	{ name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" };
    85 	{ name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" };
    83 	{ name = "FORM_TYPE", type = "hidden", value = "http://jabber.org/protocol/admin" };
    86 	{ name = "subject", type = "text-single", label = "Subject" };
    84 	{ name = "subject", type = "text-single", label = "Subject" };
    87 	{ name = "announcement", type = "text-multi", required = true, label = "Announcement" };
    85 	{ name = "announcement", type = "text-multi", required = true, label = "Announcement" };
    88 };
    86 };
    89 
    87 
    90 function add_user_command_handler(self, data, sessid)
    88 function add_user_command_handler(self, data, state)
    91 	if sessid and sessions[sessid] then
    89 	if state then
    92 		if data.action == "cancel" then
    90 		if data.action == "cancel" then
    93 			sessions[sessid] = nil;
    91 			return { status = "canceled" };
    94 			return { status = "canceled" }, sessid;
       
    95 		end
    92 		end
    96 		local fields = add_user_layout:data(data.form);
    93 		local fields = add_user_layout:data(data.form);
    97 		local username, host, resource = jid.split(fields.accountjid);
    94 		local username, host, resource = jid.split(fields.accountjid);
    98 		if (fields["password"] == fields["password-verify"]) and username and host and host == data.to then
    95 		if (fields["password"] == fields["password-verify"]) and username and host and host == data.to then
    99 			if usermanager_user_exists(username, host) then
    96 			if usermanager_user_exists(username, host) then
   100 				sessions[sessid] = nil;
    97 				return { status = "error", error = { type = "cancel", condition = "conflict", message = "Account already exists" } };
   101 				return { status = "error", error = { type = "cancel", condition = "conflict", message = "Account already exists" } }, sessid;
       
   102 			else
    98 			else
   103 				if usermanager_create_user(username, fields.password, host) then
    99 				if usermanager_create_user(username, fields.password, host) then
   104 					sessions[sessid] = nil;
       
   105 					module:log("info", "Created new account " .. username.."@"..host);
   100 					module:log("info", "Created new account " .. username.."@"..host);
   106 					return { status = "completed", info = "Account successfully created" }, sessid;
   101 					return { status = "completed", info = "Account successfully created" };
   107 				else
   102 				else
   108 					sessions[sessid] = nil;
       
   109 					return { status = "error", error = { type = "wait", condition = "internal-server-error",
   103 					return { status = "error", error = { type = "wait", condition = "internal-server-error",
   110 						 message = "Failed to write data to disk" } }, sessid;
   104 						 message = "Failed to write data to disk" } };
   111 				end
   105 				end
   112 			end
   106 			end
   113 		else
   107 		else
   114 			module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]);
   108 			module:log("debug", fields.accountjid .. " " .. fields.password .. " " .. fields["password-verify"]);
   115 			sessions[sessid] = nil;
       
   116 			return { status = "error", error = { type = "cancel", condition = "conflict",
   109 			return { status = "error", error = { type = "cancel", condition = "conflict",
   117 				 message = "Invalid data.\nPassword mismatch, or empty username" } }, sessid;
   110 				 message = "Invalid data.\nPassword mismatch, or empty username" } };
   118 		end
   111 		end
   119 	else
   112 	else
   120 		local sessionid=uuid.generate();
   113 		return { status = "executing", form = add_user_layout }, "executing";
   121 		sessions[sessionid] = "executing";
   114 	end
   122 		return { status = "executing", form = add_user_layout }, sessionid;
   115 end
   123 	end
   116 
   124 end
   117 function change_user_password_command_handler(self, data, state)
   125 
   118 	if state then
   126 function change_user_password_command_handler(self, data, sessid)
   119 		if data.action == "cancel" then
   127 	if sessid and sessions[sessid] then
   120 			return { status = "canceled" };
   128 		if data.action == "cancel" then
       
   129 			sessions[sessid] = nil;
       
   130 			return { status = "canceled" }, sessid;
       
   131 		end
   121 		end
   132 		local fields = change_user_password_layout:data(data.form);
   122 		local fields = change_user_password_layout:data(data.form);
   133 		local username, host, resource = jid.split(fields.accountjid);
   123 		local username, host, resource = jid.split(fields.accountjid);
   134 		if usermanager_user_exists(username, host) and usermanager_create_user(username, fields.password, host) then
   124 		if usermanager_user_exists(username, host) and usermanager_create_user(username, fields.password, host) then
   135 			return { status = "completed", info = "Password successfully changed" }, sessid;
   125 			return { status = "completed", info = "Password successfully changed" };
   136 		else
   126 		else
   137 			sessions[sessid] = nil;
   127 			return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } };
   138 			return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid;
   128 		end
   139 		end
   129 	else
   140 		sessions[sessid] = nil;
   130 		return { status = "executing", form = change_user_password_layout }, "executing";
   141 		return { status = "canceled" }, sessid;
   131 	end
   142 	else
   132 end
   143 		local sessionid=uuid.generate();
   133 
   144 		sessions[sessionid] = "executing";
   134 function delete_user_command_handler(self, data, state)
   145 		return { status = "executing", form = change_user_password_layout }, sessionid;
   135 	if state then
   146 	end
   136 		if data.action == "cancel" then
   147 end
   137 			return { status = "canceled" };
   148 
       
   149 function delete_user_command_handler(self, data, sessid)
       
   150 	if sessid and sessions[sessid] then
       
   151 		if data.action == "cancel" then
       
   152 			sessions[sessid] = nil;
       
   153 			return { status = "canceled" }, sessid;
       
   154 		end
   138 		end
   155 		local fields = delete_user_layout:data(data.form);
   139 		local fields = delete_user_layout:data(data.form);
   156 		local failed = {};
   140 		local failed = {};
   157 		local succeeded = {};
   141 		local succeeded = {};
   158 		for _, aJID in ipairs(fields.accountjids) do
   142 		for _, aJID in ipairs(fields.accountjids) do
   163 			else
   147 			else
   164 				module:log("debug", "Tried to delete non-existant user "..aJID);
   148 				module:log("debug", "Tried to delete non-existant user "..aJID);
   165 				failed[#failed+1] = aJID;
   149 				failed[#failed+1] = aJID;
   166 			end
   150 			end
   167 		end
   151 		end
   168 		sessions[sessid] = nil;
       
   169 		return {status = "completed", info = (#succeeded ~= 0 and
   152 		return {status = "completed", info = (#succeeded ~= 0 and
   170 				"The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "")..
   153 				"The following accounts were successfully deleted:\n"..t_concat(succeeded, "\n").."\n" or "")..
   171 				(#failed ~= 0 and
   154 				(#failed ~= 0 and
   172 				"The following accounts could not be deleted:\n"..t_concat(failed, "\n") or "") }, sessid;
   155 				"The following accounts could not be deleted:\n"..t_concat(failed, "\n") or "") };
   173 	else
   156 	else
   174 		local sessionid=uuid.generate();
   157 		return { status = "executing", form = delete_user_layout }, "executing";
   175 		sessions[sessionid] = "executing";
   158 	end
   176 		return { status = "executing", form = delete_user_layout }, sessionid;
   159 end
   177 	end
   160 
   178 end
   161 function get_user_password_handler(self, data, state)
   179 
   162 	if state then
   180 function get_user_password_handler(self, data, sessid)
   163 		if data.action == "cancel" then
   181 	if sessid and sessions[sessid] then
   164 			return { status = "canceled" };
   182 		if data.action == "cancel" then
       
   183 			sessions[sessid] = nil;
       
   184 			return { status = "canceled" }, sessid;
       
   185 		end
   165 		end
   186 		local fields = get_user_password_layout:data(data.form);
   166 		local fields = get_user_password_layout:data(data.form);
   187 		local user, host, resource = jid.split(fields.accountjid);
   167 		local user, host, resource = jid.split(fields.accountjid);
   188 		local accountjid = "";
   168 		local accountjid = "";
   189 		local password = "";
   169 		local password = "";
   190 		if usermanager_user_exists(user, host) then
   170 		if usermanager_user_exists(user, host) then
   191 			accountjid = fields.accountjid;
   171 			accountjid = fields.accountjid;
   192 			password = usermanager_get_password(user, host);
   172 			password = usermanager_get_password(user, host);
   193 		else
   173 		else
   194 			sessions[sessid] = nil;
   174 			return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } };
   195 			return { status = "error", error = { type = "cancel", condition = "item-not-found", message = "User does not exist" } }, sessid;
   175 		end
   196 		end
   176 		return { status = "completed", result = { layout = get_user_password_result_layout, data = {accountjid = accountjid, password = password} } };
   197 		sessions[sessid] = nil;
   177 	else
   198 		return { status = "completed", result = { layout = get_user_password_result_layout, data = {accountjid = accountjid, password = password} } }, sessid;
   178 		return { status = "executing", form = get_user_password_layout }, "executing";
   199 	else
   179 	end
   200 		local sessionid=uuid.generate();
   180 end
   201 		sessions[sessionid] = "executing";
   181 
   202 		return { status = "executing", form = get_user_password_layout }, sessionid;
   182 function get_online_users_command_handler(self, data, state)
   203 	end
   183 	if state then
   204 end
   184 		if data.action == "cancel" then
   205 
   185 			return { status = "canceled" };
   206 function get_online_users_command_handler(self, data, sessid)
       
   207 	if sessid and sessions[sessid] then
       
   208 		if data.action == "cancel" then
       
   209 			sessions[sessid] = nil;
       
   210 			return { status = "canceled" }, sessid;
       
   211 		end
   186 		end
   212 
   187 
   213 		local fields = add_user_layout:data(data.form);
   188 		local fields = add_user_layout:data(data.form);
   214 		
   189 		
   215 		local max_items = nil
   190 		local max_items = nil
   223 				break;
   198 				break;
   224 			end
   199 			end
   225 			users = ((users and users.."\n") or "")..(username.."@"..data.to);
   200 			users = ((users and users.."\n") or "")..(username.."@"..data.to);
   226 			count = count + 1;
   201 			count = count + 1;
   227 		end
   202 		end
   228 		sessions[sessid] = nil;
   203 		return { status = "completed", result = {layout = get_online_users_result_layout, data = {onlineuserjids=users}} };
   229 		return { status = "completed", result = {layout = get_online_users_result_layout, data = {onlineuserjids=users}} }, sessid;
   204 	else
   230 	else
   205 		return { status = "executing", form = get_online_users_layout }, "executing";
   231 		local sessionid=uuid.generate();
   206 	end
   232 		sessions[sessionid] = "executing";
   207 end
   233 		return { status = "executing", form = get_online_users_layout }, sessionid;
   208 
   234 	end
   209 function announce_handler(self, data, state)
   235 end
   210 	if state then
   236 
   211 		if data.action == "cancel" then
   237 function announce_handler(self, data, sessid)
   212 			return { status = "canceled" };
   238 	if sessid and sessions[sessid] then
       
   239 		if data.action == "cancel" then
       
   240 			sessions[sessid] = nil;
       
   241 			return { status = "canceled" }, sessid;
       
   242 		end
   213 		end
   243 
   214 
   244 		local fields = announce_layout:data(data.form);
   215 		local fields = announce_layout:data(data.form);
   245 
   216 
   246 		module:log("info", "Sending server announcement to all online users");
   217 		module:log("info", "Sending server announcement to all online users");
   254 			message.attr.to = user.."@"..data.to;
   225 			message.attr.to = user.."@"..data.to;
   255 			core_post_stanza(host_session, message);
   226 			core_post_stanza(host_session, message);
   256 		end
   227 		end
   257 		
   228 		
   258 		module:log("info", "Announcement sent to %d online users", c);
   229 		module:log("info", "Announcement sent to %d online users", c);
   259 		sessions[sessid] = nil;
   230 		return { status = "completed", info = "Announcement sent." };
   260 		return { status = "completed", info = "Announcement sent." }, sessid;
   231 	else
   261 	else
   232 		return { status = "executing", form = announce_layout }, "executing";
   262 		local sessionid=uuid.generate();
       
   263 		sessions[sessionid] = "executing";
       
   264 		return { status = "executing", form = announce_layout }, sessionid;
       
   265 	end
   233 	end
   266 
   234 
   267 	return true;
   235 	return true;
   268 end
   236 end
   269 
   237