109 end |
109 end |
110 end |
110 end |
111 end); |
111 end); |
112 end |
112 end |
113 |
113 |
114 module:hook("muc-config-form", function(event) |
|
115 local room, form = event.room, event.form; |
|
116 local mam_query = room._data.mam_query or 'anyone'; |
|
117 table.insert(form, { |
|
118 name = muc_form_allow_who, |
|
119 type = 'list-single', |
|
120 label = 'Who may query the archive?', |
|
121 value = { |
|
122 { value = 'moderators', label = 'Moderators Only', default = mam_query == 'moderators' }, |
|
123 { value = 'members', label = 'Members', default = mam_query == 'members' }, |
|
124 { value = 'anyone', label = 'Anyone who can join', default = mam_query == 'anyone' }, |
|
125 } |
|
126 } |
|
127 ); |
|
128 end); |
|
129 |
|
130 module:hook("muc-config-submitted", function(event) |
|
131 local room, fields, changed = event.room, event.fields, event.changed; |
|
132 local new = fields[muc_form_allow_who]; |
|
133 if new ~= room._data.mam_query then |
|
134 room._data.mam_query = new; |
|
135 if type(changed) == "table" then |
|
136 changed[muc_form_allow_who] = true; |
|
137 else |
|
138 event.changed = true; |
|
139 end |
|
140 end |
|
141 end); |
|
142 |
|
143 |
|
144 -- Handle archive queries |
114 -- Handle archive queries |
145 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) |
115 module:hook("iq-get/bare/"..xmlns_mam..":query", function(event) |
146 local origin, stanza = event.origin, event.stanza; |
116 local origin, stanza = event.origin, event.stanza; |
147 local room = stanza.attr.to; |
117 local room = stanza.attr.to; |
148 local room_node = jid_split(room); |
118 local room_node = jid_split(room); |
154 end |
124 end |
155 local from = jid_bare(stanza.attr.from); |
125 local from = jid_bare(stanza.attr.from); |
156 |
126 |
157 -- Banned or not a member of a members-only room? |
127 -- Banned or not a member of a members-only room? |
158 local from_affiliation = room_obj:get_affiliation(from); |
128 local from_affiliation = room_obj:get_affiliation(from); |
159 local allowed_to_query = room_obj._data.mam_query or "anyone"; |
|
160 if from_affiliation == "outcast" -- banned |
129 if from_affiliation == "outcast" -- banned |
161 or room_obj:get_members_only() and not from_affiliation -- members-only, not a member |
130 or room_obj:get_members_only() and not from_affiliation then -- members-only, not a member |
162 or allowed_to_query == "moderators" and not (from_affiliation == "owner" or from_affiliation == "admin" ) |
|
163 or allowed_to_query ~= "anyone" then |
|
164 return origin.send(st.error_reply(stanza, "auth", "forbidden")) |
131 return origin.send(st.error_reply(stanza, "auth", "forbidden")) |
165 end |
132 end |
166 |
133 |
167 local qid = query.attr.queryid; |
134 local qid = query.attr.queryid; |
168 |
135 |