mod_http_admin_api/mod_http_admin_api.lua
changeset 4520 5bc706c2db8f
parent 4400 de55e1475808
child 4521 d6a3201a65c0
equal deleted inserted replaced
4519:2e33eeafe962 4520:5bc706c2db8f
     1 local usermanager = require "core.usermanager";
     1 local usermanager = require "core.usermanager";
     2 
     2 
     3 local json = require "util.json";
     3 local json = require "util.json";
       
     4 local st = require "util.stanza";
     4 
     5 
     5 module:depends("http");
     6 module:depends("http");
     6 
     7 
     7 local invites = module:depends("invites");
     8 local invites = module:depends("invites");
     8 local tokens = module:depends("tokenauth");
     9 local tokens = module:depends("tokenauth");
    14 local site_name = module:get_option_string("site_name", module.host);
    15 local site_name = module:get_option_string("site_name", module.host);
    15 
    16 
    16 local json_content_type = "application/json";
    17 local json_content_type = "application/json";
    17 
    18 
    18 local www_authenticate_header = ("Bearer realm=%q"):format(module.host.."/"..module.name);
    19 local www_authenticate_header = ("Bearer realm=%q"):format(module.host.."/"..module.name);
       
    20 
       
    21 local xmlns_pubsub = "http://jabber.org/protocol/pubsub";
       
    22 local xmlns_nick = "http://jabber.org/protocol/nick";
    19 
    23 
    20 local function check_credentials(request)
    24 local function check_credentials(request)
    21 	local auth_type, auth_data = string.match(request.headers.authorization or "", "^(%S+)%s(.+)$");
    25 	local auth_type, auth_data = string.match(request.headers.authorization or "", "^(%S+)%s(.+)$");
    22 	if not (auth_type and auth_data) then
    26 	if not (auth_type and auth_data) then
    23 		return false;
    27 		return false;
   162 		return nil;
   166 		return nil;
   163 	end
   167 	end
   164 	local display_name;
   168 	local display_name;
   165 	do
   169 	do
   166 		local pep_service = mod_pep.get_pep_service(username);
   170 		local pep_service = mod_pep.get_pep_service(username);
   167 		local ok, _, nick_item = pep_service:get_last_item("http://jabber.org/protocol/nick", true);
   171 		local ok, _, nick_item = pep_service:get_last_item(xmlns_nick, true);
   168 		if ok and nick_item then
   172 		if ok and nick_item then
   169 			display_name = nick_item:get_child_text("nick", "http://jabber.org/protocol/nick");
   173 			display_name = nick_item:get_child_text("nick", xmlns_nick);
   170 		end
   174 		end
   171 	end
   175 	end
   172 
   176 
   173 	return {
   177 	return {
   174 		username = username;
   178 		username = username;
   355 
   359 
   356 	event.response.headers["Content-Type"] = json_content_type;
   360 	event.response.headers["Content-Type"] = json_content_type;
   357 	return json.encode(user_info);
   361 	return json.encode(user_info);
   358 end
   362 end
   359 
   363 
       
   364 function update_user(event, username)
       
   365 	local current_user = get_user_info(username);
       
   366 
       
   367 	local request = event.request;
       
   368 	if request.headers.content_type ~= json_content_type
       
   369 	or (not request.body or #request.body == 0) then
       
   370 		return 400;
       
   371 	end
       
   372 	local new_user = json.decode(event.request.body);
       
   373 	if not new_user then
       
   374 		return 400;
       
   375 	end
       
   376 
       
   377 	if new_user.username and new_user.username ~= username then
       
   378 		return 400;
       
   379 	end
       
   380 
       
   381 	local final_user = {};
       
   382 
       
   383 	if new_user.display_name then
       
   384 		local pep_service = mod_pep.get_pep_service(username);
       
   385 		-- TODO: publish
       
   386 		local nick_item = st.stanza("item", { xmlns = xmlns_pubsub, id = "current" })
       
   387 			:text_tag("nick", new_user.display_name, { xmlns = xmlns_nick });
       
   388 		if pep_service:publish(xmlns_nick, true, "current", nick_item, {
       
   389 			access_model = "open";
       
   390 			_defaults_only = true;
       
   391 		}) then
       
   392 			final_user.display_name = new_user.display_name;
       
   393 		end
       
   394 	end
       
   395 	return 200;
       
   396 end
       
   397 
   360 function delete_user(event, username) --luacheck: ignore 212/event
   398 function delete_user(event, username) --luacheck: ignore 212/event
   361 	if not usermanager.delete_user(username, module.host) then
   399 	if not usermanager.delete_user(username, module.host) then
   362 		return 404;
   400 		return 404;
   363 	end
   401 	end
   364 	return 200;
   402 	return 200;
   517 		["POST /invites/*"] = create_invite_type;
   555 		["POST /invites/*"] = create_invite_type;
   518 		["DELETE /invites/*"] = delete_invite;
   556 		["DELETE /invites/*"] = delete_invite;
   519 
   557 
   520 		["GET /users"] = list_users;
   558 		["GET /users"] = list_users;
   521 		["GET /users/*"] = get_user_by_name;
   559 		["GET /users/*"] = get_user_by_name;
       
   560 		["PUT /users/*"] = update_user;
   522 		["DELETE /users/*"] = delete_user;
   561 		["DELETE /users/*"] = delete_user;
   523 
   562 
   524 		["GET /groups"] = list_groups;
   563 		["GET /groups"] = list_groups;
   525 		["GET /groups/*"] = get_group_by_id;
   564 		["GET /groups/*"] = get_group_by_id;
   526 		["POST /groups"] = create_group;
   565 		["POST /groups"] = create_group;