mod_omemo_all_access.lua 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. -- OMEMO all access module
  2. -- Copyright (c) 2017 Daniel Gultsch
  3. --
  4. -- This module is MIT/X11 licensed
  5. --
  6. local jid_bare = require "util.jid".bare;
  7. local st = require "util.stanza"
  8. local white_listed_namespace = "eu.siacs.conversations.axolotl."
  9. local disco_feature_namespace = white_listed_namespace .. "whitelisted"
  10. local mod_pep = module:depends"pep";
  11. local pep_data = mod_pep.module.save().data;
  12. local function on_account_disco_info(event)
  13. (event.reply or event.stanza):tag("feature", {var=disco_feature_namespace}):up();
  14. end
  15. local function on_pep_request(event)
  16. local session, stanza = event.origin, event.stanza
  17. local payload = stanza.tags[1];
  18. if stanza.attr.type == 'get' then
  19. local node, requested_id;
  20. payload = payload.tags[1]
  21. if payload and payload.name == 'items' then
  22. node = payload.attr.node
  23. local item = payload.tags[1];
  24. if item and item.name == 'item' then
  25. requested_id = item.attr.id;
  26. end
  27. end
  28. if node and string.sub(node,1,string.len(white_listed_namespace)) == white_listed_namespace then
  29. local user = stanza.attr.to and jid_bare(stanza.attr.to) or session.username..'@'..session.host;
  30. local user_data = pep_data[user];
  31. if user_data and user_data[node] then
  32. local id, item = unpack(user_data[node]);
  33. if not requested_id or id == requested_id then
  34. local stanza = st.reply(stanza)
  35. :tag('pubsub', {xmlns='http://jabber.org/protocol/pubsub'})
  36. :tag('items', {node=node})
  37. :add_child(item)
  38. :up()
  39. :up();
  40. session.send(stanza);
  41. module:log("debug","provided access to omemo node",node)
  42. return true;
  43. end
  44. end
  45. module:log("debug","requested node was white listed", node)
  46. end
  47. end
  48. end
  49. module:hook("iq/bare/http://jabber.org/protocol/pubsub:pubsub", on_pep_request, 10);
  50. module:hook("account-disco-info", on_account_disco_info);