686 instance._get_user_xml = assert(options.get_user_xml); |
686 instance._get_user_xml = assert(options.get_user_xml); |
687 end |
687 end |
688 return instance; |
688 return instance; |
689 end |
689 end |
690 |
690 |
|
691 local function get_store_names_from_xml(self, user_xml) |
|
692 local stores = set.new(); |
|
693 for handler_name, handler_funcs in pairs(handlers) do |
|
694 if handler_funcs._stores then |
|
695 stores:include(handler_funcs._stores(self, user_xml)); |
|
696 else |
|
697 stores:include(handler_name); |
|
698 end |
|
699 end |
|
700 return stores; |
|
701 end |
|
702 |
691 local function get_store_names(self, path) |
703 local function get_store_names(self, path) |
692 local stores = set.new(); |
704 local stores = set.new(); |
693 local f, err = io_open(paths.join(prosody.paths.data, path)); |
705 local f, err = io_open(paths.join(prosody.paths.data, path)); |
694 if not f then |
706 if not f then |
695 module:log("warn", "Unable to load XML file for <%s>: %s", "store listing", err); |
707 module:log("warn", "Unable to load XML file for <%s>: %s", "store listing", err); |
696 return stores; |
708 return stores; |
697 end |
709 end |
698 module:log("info", "Loaded %s", path); |
710 module:log("info", "Loaded %s", path); |
699 local s = f:read("*a"); |
711 local s = f:read("*a"); |
700 f:close(); |
712 f:close(); |
701 local xml = parse_xml_real(s); |
713 local user_xml = parse_xml_real(s); |
702 for _, handler_funcs in pairs(handlers) do |
714 return get_store_names_from_xml(self, user_xml); |
703 if handler_funcs._stores then |
|
704 stores:include(handler_funcs._stores(self, xml)); |
|
705 end |
|
706 end |
|
707 return stores; |
|
708 end |
715 end |
709 |
716 |
710 function driver:stores(username) |
717 function driver:stores(username) |
711 local store_dir = prosody.paths.data; |
718 local store_dir = prosody.paths.data; |
712 |
719 |
731 end |
738 end |
732 |
739 |
733 return store_names:items(); |
740 return store_names:items(); |
734 end |
741 end |
735 |
742 |
|
743 function driver:xep0227_user_stores(username, host) |
|
744 local user_xml = self:_get_user_xml(username, host); |
|
745 if not user_xml then |
|
746 return nil; |
|
747 end |
|
748 local store_names = get_store_names_from_xml(username, host); |
|
749 return store_names:items(); |
|
750 end |
|
751 |
736 module:provides("storage", driver); |
752 module:provides("storage", driver); |