Software / code / prosody
Comparison
plugins/mod_pubsub/pubsub.lib.lua @ 9247:26854d7a4947
mod_pubsub: Fix dataforms error handling
The :data method returns the table holding parsed values always. The
second return value is a table in case some fields had problems.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 01 Sep 2018 21:18:30 +0200 |
| parent | 9245:cc32aae5c7da |
| child | 9274:1712e366b081 |
comparison
equal
deleted
inserted
replaced
| 9246:397e8e5a2f1f | 9247:26854d7a4947 |
|---|---|
| 40 end | 40 end |
| 41 return reply; | 41 return reply; |
| 42 end | 42 end |
| 43 _M.pubsub_error_reply = pubsub_error_reply; | 43 _M.pubsub_error_reply = pubsub_error_reply; |
| 44 | 44 |
| 45 local function dataform_error_message(err) -- ({ string : string }) -> string? | |
| 46 local out = {}; | |
| 47 for field, errmsg in pairs(err) do | |
| 48 table.insert(out, ("%s: %s"):format(field, errmsg)) | |
| 49 end | |
| 50 return table.concat(out, "; "); | |
| 51 end | |
| 52 | |
| 45 -- Note: If any config options are added that are of complex types, | 53 -- Note: If any config options are added that are of complex types, |
| 46 -- (not simply strings/numbers) then the publish-options code will | 54 -- (not simply strings/numbers) then the publish-options code will |
| 47 -- need to be revisited | 55 -- need to be revisited |
| 48 local node_config_form = dataform { | 56 local node_config_form = dataform { |
| 49 { | 57 { |
| 398 if not config_form then | 406 if not config_form then |
| 399 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing dataform")); | 407 origin.send(st.error_reply(stanza, "modify", "bad-request", "Missing dataform")); |
| 400 return true; | 408 return true; |
| 401 end | 409 end |
| 402 local form_data, err = node_config_form:data(config_form); | 410 local form_data, err = node_config_form:data(config_form); |
| 403 if not form_data then | 411 if err then |
| 404 origin.send(st.error_reply(stanza, "modify", "bad-request", err)); | 412 origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(err))); |
| 405 return true; | 413 return true; |
| 406 end | 414 end |
| 407 config = form_data; | 415 config = form_data; |
| 408 end | 416 end |
| 409 if node then | 417 if node then |
| 455 origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid")); | 463 origin.send(pubsub_error_reply(stanza, jid and "nodeid-required" or "invalid-jid")); |
| 456 return true; | 464 return true; |
| 457 end | 465 end |
| 458 local options_tag, options = stanza.tags[1]:get_child("options"), nil; | 466 local options_tag, options = stanza.tags[1]:get_child("options"), nil; |
| 459 if options_tag then | 467 if options_tag then |
| 460 options = subscribe_options_form:data(options_tag.tags[1]); | 468 -- FIXME form parsing errors ignored here, why? |
| 469 local err | |
| 470 options, err = subscribe_options_form:data(options_tag.tags[1]); | |
| 471 if err then | |
| 472 origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(err))); | |
| 473 return true | |
| 474 end | |
| 461 end | 475 end |
| 462 local ok, ret = service:add_subscription(node, stanza.attr.from, jid, options); | 476 local ok, ret = service:add_subscription(node, stanza.attr.from, jid, options); |
| 463 local reply; | 477 local reply; |
| 464 if ok then | 478 if ok then |
| 465 reply = st.reply(stanza) | 479 reply = st.reply(stanza) |
| 531 origin.send(pubsub_error_reply(stanza, "not-subscribed")); | 545 origin.send(pubsub_error_reply(stanza, "not-subscribed")); |
| 532 return true; | 546 return true; |
| 533 end | 547 end |
| 534 local old_subopts = ret; | 548 local old_subopts = ret; |
| 535 local new_subopts, err = subscribe_options_form:data(options.tags[1], old_subopts); | 549 local new_subopts, err = subscribe_options_form:data(options.tags[1], old_subopts); |
| 536 if not new_subopts then | 550 if err then |
| 537 origin.send(pubsub_error_reply(stanza, ret)); | 551 origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(err))); |
| 538 return true; | 552 return true; |
| 539 end | 553 end |
| 540 local ok, err = service:add_subscription(node, stanza.attr.from, jid, new_subopts); | 554 local ok, err = service:add_subscription(node, stanza.attr.from, jid, new_subopts); |
| 541 if not ok then | 555 if not ok then |
| 542 origin.send(pubsub_error_reply(stanza, err)); | 556 origin.send(pubsub_error_reply(stanza, err)); |
| 555 local required_config = nil; | 569 local required_config = nil; |
| 556 local publish_options = stanza.tags[1]:get_child("publish-options"); | 570 local publish_options = stanza.tags[1]:get_child("publish-options"); |
| 557 if publish_options then | 571 if publish_options then |
| 558 -- Ensure that the node configuration matches the values in publish-options | 572 -- Ensure that the node configuration matches the values in publish-options |
| 559 local publish_options_form = publish_options:get_child("x", "jabber:x:data"); | 573 local publish_options_form = publish_options:get_child("x", "jabber:x:data"); |
| 560 required_config = node_config_form:data(publish_options_form); | 574 local err; |
| 575 required_config, err = node_config_form:data(publish_options_form); | |
| 576 if err then | |
| 577 origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(err))); | |
| 578 return true | |
| 579 end | |
| 561 end | 580 end |
| 562 local item = publish:get_child("item"); | 581 local item = publish:get_child("item"); |
| 563 local id = (item and item.attr.id); | 582 local id = (item and item.attr.id); |
| 564 if not id then | 583 if not id then |
| 565 id = uuid_generate(); | 584 id = uuid_generate(); |
| 665 if not ok then | 684 if not ok then |
| 666 origin.send(pubsub_error_reply(stanza, old_config)); | 685 origin.send(pubsub_error_reply(stanza, old_config)); |
| 667 return true; | 686 return true; |
| 668 end | 687 end |
| 669 local new_config, err = node_config_form:data(config_form, old_config); | 688 local new_config, err = node_config_form:data(config_form, old_config); |
| 670 if not new_config then | 689 if err then |
| 671 origin.send(st.error_reply(stanza, "modify", "bad-request", err)); | 690 origin.send(st.error_reply(stanza, "modify", "bad-request", dataform_error_message(err))); |
| 672 return true; | 691 return true; |
| 673 end | 692 end |
| 674 local ok, err = service:set_node_config(node, stanza.attr.from, new_config); | 693 local ok, err = service:set_node_config(node, stanza.attr.from, new_config); |
| 675 if not ok then | 694 if not ok then |
| 676 origin.send(pubsub_error_reply(stanza, err)); | 695 origin.send(pubsub_error_reply(stanza, err)); |