Mercurial > prosody-modules
comparison mod_http_admin_api/mod_http_admin_api.lua @ 4516:5bc706c2db8f
mod_http_admin_api: allow updating the user nickname via API
| author | Jonas Schäfer <jonas@wielicki.name> |
|---|---|
| date | Mon, 22 Mar 2021 17:52:28 +0100 |
| parents | de55e1475808 |
| children | d6a3201a65c0 |
comparison
equal
deleted
inserted
replaced
| 4515:2e33eeafe962 | 4516: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; |
