plugin group blog: group permissions are used if "group*" keys are found in mbdata (in data2entry and comments trigger)

This commit is contained in:
Goffi 2015-11-24 16:21:18 +01:00
commit 721f404803

View file

@ -28,6 +28,7 @@ from sat.core import exceptions
from wokkel import disco, data_form, iwokkel
from wokkel import rsm
from zope.interface import implements
from tools import common
# import uuid
try:
@ -48,7 +49,7 @@ NS_PUBSUB_AUTO_CREATE = NS_PUBSUB + "#auto-create"
ACCESS_TYPE_MAP = { 'PUBLIC': 'open',
'GROUP': 'roster',
'JID': None, #JID is not yet managed
}
}
MAX_ITEMS = 5
MAX_COMMENTS = 5
@ -60,10 +61,9 @@ PLUGIN_INFO = {
"type": "MISC",
"protocols": [],
"dependencies": ["XEP-0277"],
"recommendations": ["XEP-0059"],
"main": "GroupBlog",
"handler": "yes",
"description": _("""Implementation of microblogging with roster access""")
"description": _("""Implementation of microblogging fine permissions""")
}
@ -88,32 +88,33 @@ class GroupBlog(object):
def __init__(self, host):
log.info(_("Group blog plugin initialization"))
self.host = host
self._p = self.host.plugins["XEP-0060"]
host.bridge.addMethod("sendGroupBlog", ".plugin", in_sign='sassa{ss}s', out_sign='',
method=self.sendGroupBlog,
async=True)
# host.bridge.addMethod("sendGroupBlog", ".plugin", in_sign='sassa{ss}s', out_sign='',
# method=self.sendGroupBlog,
# async=True)
host.bridge.addMethod("deleteGroupBlog", ".plugin", in_sign='(sss)ss', out_sign='',
method=self.deleteGroupBlog,
async=True)
# host.bridge.addMethod("deleteGroupBlog", ".plugin", in_sign='(sss)ss', out_sign='',
# method=self.deleteGroupBlog,
# async=True)
host.bridge.addMethod("updateGroupBlog", ".plugin", in_sign='(sss)ssa{ss}s', out_sign='',
method=self.updateGroupBlog,
async=True)
# host.bridge.addMethod("updateGroupBlog", ".plugin", in_sign='(sss)ssa{ss}s', out_sign='',
# method=self.updateGroupBlog,
# async=True)
host.bridge.addMethod("sendGroupBlogComment", ".plugin", in_sign='ssa{ss}s', out_sign='',
method=self.sendGroupBlogComment,
async=True)
# host.bridge.addMethod("sendGroupBlogComment", ".plugin", in_sign='ssa{ss}s', out_sign='',
# method=self.sendGroupBlogComment,
# async=True)
# host.bridge.addMethod("getGroupBlogs", ".plugin",
# in_sign='sasa{ss}bs', out_sign='(aa{ss}a{ss})',
# method=self.getGroupBlogs,
# async=True)
host.bridge.addMethod("getGroupBlogsWithComments", ".plugin",
in_sign='sasa{ss}is', out_sign='(a(a{ss}(aa{ss}a{ss}))a{ss})',
method=self.getGroupBlogsWithComments,
async=True)
# host.bridge.addMethod("getGroupBlogsWithComments", ".plugin",
# in_sign='sasa{ss}is', out_sign='(a(a{ss}(aa{ss}a{ss}))a{ss})',
# method=self.getGroupBlogsWithComments,
# async=True)
# host.bridge.addMethod("getMassiveGroupBlogs", ".plugin",
# in_sign='sasa{ss}s', out_sign='a{s(aa{ss}a{ss})}',
@ -130,6 +131,8 @@ class GroupBlog(object):
# async=True)
# host.trigger.add("PubSubItemsReceived", self.pubSubItemsReceivedTrigger)
host.trigger.add("XEP-0277_data2entry", self._data2entryTrigger)
host.trigger.add("XEP-0277_comments", self._commentsTrigger)
## plugin management methods ##
@ -140,7 +143,7 @@ class GroupBlog(object):
def profileConnected(self, profile):
client = self.host.getClient(profile)
try:
yield self.host.checkFeatures((NS_PUBSUB_GROUPBLOG, NS_PUBSUB_AUTO_CREATE), profile=profile)
yield self.host.checkFeatures((NS_PUBSUB_GROUPBLOG,), profile=profile)
except exceptions.FeatureNotFound:
client.server_groupblog_available = False
log.warning(_(u"Server is not able to manage item-access pubsub, we can't use group blog"))
@ -162,6 +165,35 @@ class GroupBlog(object):
log.error("Service should be available !")
return {}
def _data2entryTrigger(self, client, mb_data, entry_elt, item_elt):
"""Build fine access permission if needed
This trigger check if "group*" key are present,
and create a fine item config to restrict view to these groups
"""
groups = list(common.dict2iter('group', mb_data))
if not groups:
return
if not client.server_groupblog_available:
raise exceptions.CancelError(u"GroupBlog is not available")
log.debug(u"This entry use group blog")
form = data_form.Form('submit', formNamespace=NS_PUBSUB_ITEM_CONFIG)
# FIXME: ACCESS_ROSTER need to be changed to a new ACCESS_PUBLISHER_ROSTER when available
access = data_form.Field(None, self._p.OPT_ACCESS_MODEL, value=self._p.ACCESS_ROSTER)
allowed = data_form.Field(None, self._p.OPT_ROSTER_GROUPS_ALLOWED, values=groups)
form.addField(access)
form.addField(allowed)
item_elt.addChild(form.toElement())
def _commentsTrigger(self, client, mb_data, options):
"""This method is called when a comments node is about to be created
It changes the access mode to roster if needed, and give the authorized groups
"""
if "group" in mb_data:
# FIXME: ACCESS_ROSTER need to be changed to a new ACCESS_PUBLISHER_ROSTER when available
options[self._p.OPT_ACCESS_MODEL] = self._p.ACCESS_ROSTER
options[self._p.OPT_ROSTER_GROUPS_ALLOWED] = list(common.dict2iter('group', mb_data))
@defer.inlineCallbacks
def _initialise(self, profile_key):