Mercurial > prosody-modules
comparison mod_http_admin_api/mod_http_admin_api.lua @ 4382:0d6b69777bc1
mod_http_admin_api: port to use new mod_groups_internal module
Matthew Wild contributed much of the code, so I can only take
partial credit.
| author | Jonas Schäfer <jonas@wielicki.name> |
|---|---|
| date | Mon, 25 Jan 2021 18:33:49 +0100 |
| parents | d4e0e4d22fc7 |
| children | 17d44ba8fde2 |
comparison
equal
deleted
inserted
replaced
| 4381:a1256e376dca | 4382:0d6b69777bc1 |
|---|---|
| 1 local usermanager = require "core.usermanager"; | 1 local usermanager = require "core.usermanager"; |
| 2 | 2 |
| 3 local id = require "util.id"; | |
| 4 local json = require "util.json"; | 3 local json = require "util.json"; |
| 5 | 4 |
| 6 module:depends("http"); | 5 module:depends("http"); |
| 7 | 6 |
| 8 local invites = module:depends("invites"); | 7 local invites = module:depends("invites"); |
| 9 local tokens = module:depends("tokenauth"); | 8 local tokens = module:depends("tokenauth"); |
| 10 local mod_pep = module:depends("pep"); | 9 local mod_pep = module:depends("pep"); |
| 11 | 10 local mod_groups = module:depends("groups_internal"); |
| 12 local group_info_store = module:open_store("group_info"); | 11 |
| 13 local group_members_store = module:open_store("groups"); | |
| 14 local group_memberships = module:open_store("groups", "map"); | |
| 15 local push_errors = module:shared("cloud_notify/push_errors"); | 12 local push_errors = module:shared("cloud_notify/push_errors"); |
| 16 | 13 |
| 17 local site_name = module:get_option_string("site_name", module.host); | 14 local site_name = module:get_option_string("site_name", module.host); |
| 18 | 15 |
| 19 local json_content_type = "application/json"; | 16 local json_content_type = "application/json"; |
| 353 debug_info.omemo = get_user_omemo_info(username); | 350 debug_info.omemo = get_user_omemo_info(username); |
| 354 | 351 |
| 355 return debug_info; | 352 return debug_info; |
| 356 end | 353 end |
| 357 | 354 |
| 358 local function get_user_groups(username) | |
| 359 local groups; | |
| 360 do | |
| 361 local group_set = group_memberships:get_all(username); | |
| 362 if group_set and next(group_set) then | |
| 363 groups = {}; | |
| 364 for group_id in pairs(group_set) do | |
| 365 table.insert(groups, group_id); | |
| 366 end | |
| 367 end | |
| 368 end | |
| 369 return groups; | |
| 370 end | |
| 371 | |
| 372 function list_users(event) | 355 function list_users(event) |
| 373 local user_list = {}; | 356 local user_list = {}; |
| 374 for username in usermanager.users(module.host) do | 357 for username in usermanager.users(module.host) do |
| 375 table.insert(user_list, get_user_info(username)); | 358 table.insert(user_list, get_user_info(username)); |
| 376 end | 359 end |
| 389 end | 372 end |
| 390 end | 373 end |
| 391 | 374 |
| 392 if property == "groups" then | 375 if property == "groups" then |
| 393 event.response.headers["Content-Type"] = json_content_type; | 376 event.response.headers["Content-Type"] = json_content_type; |
| 394 return json.encode(get_user_groups(username)); | 377 return json.encode(mod_groups.get_user_groups(username)); |
| 395 elseif property == "debug" then | 378 elseif property == "debug" then |
| 396 event.response.headers["Content-Type"] = json_content_type; | 379 event.response.headers["Content-Type"] = json_content_type; |
| 397 return json.encode(get_user_debug_info(username)); | 380 return json.encode(get_user_debug_info(username)); |
| 398 end | 381 end |
| 399 | 382 |
| 413 return 200; | 396 return 200; |
| 414 end | 397 end |
| 415 | 398 |
| 416 function list_groups(event) | 399 function list_groups(event) |
| 417 local group_list = {}; | 400 local group_list = {}; |
| 418 for group_id in group_info_store:users() do | 401 for group_id in mod_groups.groups() do |
| 419 local group_info = group_info_store:get(group_id); | 402 local group_info = mod_groups.get_info(group_id); |
| 420 table.insert(group_list, { | 403 table.insert(group_list, { |
| 421 id = group_id; | 404 id = group_id; |
| 422 name = group_info.name; | 405 name = group_info.name; |
| 423 members = group_members_store:get(group_id); | 406 members = mod_groups.get_members(group_id); |
| 424 }); | 407 }); |
| 425 end | 408 end |
| 426 | 409 |
| 427 event.response.headers["Content-Type"] = json_content_type; | 410 event.response.headers["Content-Type"] = json_content_type; |
| 428 return json.encode_array(group_list); | 411 return json.encode_array(group_list); |
| 429 end | 412 end |
| 430 | 413 |
| 431 function get_group_by_id(event, group_id) | 414 function get_group_by_id(event, group_id) |
| 432 local group = group_info_store:get(group_id); | 415 local group = mod_groups.get_info(group_id); |
| 433 if not group then | 416 if not group then |
| 434 return 404; | 417 return 404; |
| 435 end | 418 end |
| 436 | 419 |
| 437 event.response.headers["Content-Type"] = json_content_type; | 420 event.response.headers["Content-Type"] = json_content_type; |
| 438 | 421 |
| 439 return json.encode({ | 422 return json.encode({ |
| 440 id = group_id; | 423 id = group_id; |
| 441 name = group.name; | 424 name = group.name; |
| 442 members = group_members_store:get(group_id); | 425 members = mod_groups.get_members(group_id); |
| 443 }); | 426 }); |
| 444 end | 427 end |
| 445 | 428 |
| 446 function create_group(event) | 429 function create_group(event) |
| 447 local request = event.request; | 430 local request = event.request; |
| 457 if not group.name then | 440 if not group.name then |
| 458 module:log("warn", "Group missing name property"); | 441 module:log("warn", "Group missing name property"); |
| 459 return 400; | 442 return 400; |
| 460 end | 443 end |
| 461 | 444 |
| 462 local group_id = id.short(); | 445 local group_id = mod_groups.create({ |
| 463 | |
| 464 local ok = group_info_store:set(group_id, { | |
| 465 name = group.name; | 446 name = group.name; |
| 466 }); | 447 }); |
| 467 if not ok then | 448 if not group_id then |
| 468 return 500; | 449 return 500; |
| 469 end | 450 end |
| 470 | 451 |
| 471 event.response.headers["Content-Type"] = json_content_type; | 452 event.response.headers["Content-Type"] = json_content_type; |
| 472 return json.encode({ | 453 return json.encode({ |
| 475 members = {}; | 456 members = {}; |
| 476 }); | 457 }); |
| 477 end | 458 end |
| 478 | 459 |
| 479 function update_group(event, group) --luacheck: ignore 212/event | 460 function update_group(event, group) --luacheck: ignore 212/event |
| 461 -- Add member | |
| 480 local group_id, member_name = group:match("^([^/]+)/members/([^/]+)$"); | 462 local group_id, member_name = group:match("^([^/]+)/members/([^/]+)$"); |
| 481 if group_id and member_name then | 463 if group_id and member_name then |
| 482 if not group_info_store:get(group_id) then | 464 if not mod_groups.add_member(group_id, member_name) then |
| 483 return 404; | |
| 484 elseif not group_memberships:set(group_id, member_name, true) then | |
| 485 return 500; | 465 return 500; |
| 486 end | 466 end |
| 487 return 204; | 467 return 204; |
| 488 end | 468 end |
| 489 | 469 |
| 490 local group_id = group:match("^([^/]+)$") | 470 local group_id = group:match("^([^/]+)$") |
| 491 if group_id then | 471 if group_id then |
| 492 local request = event.request; | 472 local request = event.request; |
| 493 if request.headers.content_type ~= json_content_type | 473 if request.headers.content_type ~= json_content_type or (not request.body or #request.body == 0) then |
| 494 or (not request.body or #request.body == 0) then | |
| 495 return 400; | 474 return 400; |
| 496 end | 475 end |
| 497 | 476 |
| 498 local update = json.decode(event.request.body); | 477 local update = json.decode(event.request.body); |
| 499 if not update then | 478 if not update then |
| 500 return 400; | 479 return 400; |
| 501 end | 480 end |
| 502 | 481 |
| 503 local group_info = group_info_store:get(group_id); | 482 local group_info = mod_groups.get_info(group_id); |
| 504 if not group_info then | 483 if not group_info then |
| 505 return 404; | 484 return 404; |
| 506 end | 485 end |
| 507 | 486 |
| 508 if update.name then | 487 if update.name then |
| 509 group_info["name"] = update.name | 488 group_info["name"] = update.name; |
| 510 end | 489 end |
| 511 group_info_store:set(group_id, group_info); | 490 if mod_groups.set_info(group_id, group_info) then |
| 512 return 204; | 491 return 204; |
| 513 end | 492 else |
| 514 return 400; | 493 return 500; |
| 494 end | |
| 495 end | |
| 496 return 404; | |
| 515 end | 497 end |
| 516 | 498 |
| 517 function delete_group(event, subpath) --luacheck: ignore 212/event | 499 function delete_group(event, subpath) --luacheck: ignore 212/event |
| 518 -- Check if this is a membership deletion and handle it | 500 -- Check if this is a membership deletion and handle it |
| 519 local group_id, member_name = subpath:match("^([^/]+)/members/([^/]+)$"); | 501 local group_id, member_name = subpath:match("^([^/]+)/members/([^/]+)$"); |
| 520 if group_id and member_name then | 502 if group_id and member_name then |
| 521 if not group_info_store:get(group_id) then | 503 if mod_groups.remove_member(group_id, member_name) then |
| 522 return 404; | 504 return 204; |
| 523 end | |
| 524 if group_memberships:set(group_id, member_name, nil) then | |
| 525 return 200; | |
| 526 else | 505 else |
| 527 return 500; | 506 return 500; |
| 528 end | 507 end |
| 529 else | 508 else |
| 509 -- Action refers to the group | |
| 530 group_id = subpath; | 510 group_id = subpath; |
| 531 end | 511 end |
| 532 | 512 |
| 533 if not group_id then | 513 if not group_id then |
| 534 return 400; | 514 return 400; |
| 535 end | 515 end |
| 536 | 516 |
| 537 if not group_info_store:get(group_id) then | 517 if not mod_groups.exists(group_id) then |
| 538 return 404; | 518 return 404; |
| 539 end | 519 end |
| 540 | 520 |
| 541 if not group_members_store:set(group_id, nil) then | 521 if not mod_groups.delete(group_id) then |
| 542 return 500; | 522 return 500; |
| 543 else | 523 end |
| 544 if not group_info_store:set(group_id, nil) then | 524 return 204; |
| 545 return 500; | |
| 546 end | |
| 547 end | |
| 548 return 200; | |
| 549 end | 525 end |
| 550 | 526 |
| 551 local function get_server_info(event) | 527 local function get_server_info(event) |
| 552 event.response.headers["Content-Type"] = json_content_type; | 528 event.response.headers["Content-Type"] = json_content_type; |
| 553 return json.encode({ | 529 return json.encode({ |
