pithos-dispatcher --exchange=pithos --key=pithos.object --callback=pithos.api.dispatch.update_md5
+To send sharing notifications::
+
+ pithos-dispatcher --exchange=pithos --key=pithos.sharing --callback=pithos.api.dispatch.send_sharing_notification
+
Administrator functions
-----------------------
from pithos.backends import connect_backend
from pithos.api.util import hashmap_md5
+from django.core.mail import send_mail
+from django.utils.translation import ugettext as _
+
+from astakos.im.settings import DEFAULT_FROM_EMAIL
+
def update_md5(m):
if m['resource'] != 'object' or m['details']['action'] != 'object update':
return
print 'WARNING: Can not update checksum for path "%s" (%s)' % (path, e)
backend.close()
+
+def send_sharing_notification(m):
+ if m['resource'] != 'sharing':
+ return
+
+ members = m['details']['members']
+ user = m['details']['user']
+ path = m['value']
+ account, container, name = path.split('/', 2)
+
+ subject = 'Invitation to a Pithos+ shared object'
+ from_email = DEFAULT_FROM_EMAIL
+ recipient_list = members
+ message = 'User %s has invited you to a Pithos+ shared object. You can view it under "Shared to me" at "%s".' %(user, path)
+ try:
+ send_mail(subject, message, from_email, recipient_list)
+ print 'INFO: Sharing notification sent for path "%s" to %s' % (path, ','.join(recipient_list))
+ except (SMTPException, socket.error) as e:
+ print 'WARNING: Can not update send email for sharing "%s" (%s)' % (path, e)
del(permissions[WRITE])
return permissions
+ def access_members(self, path):
+ feature = self.xfeature_get(path)
+ if not feature:
+ return []
+ permissions = self.feature_dict(feature)
+ members = set()
+ members.update(permissions.get(READ, []))
+ members.update(permissions.get(WRITE, []))
+ for m in set(members):
+ parts = m.split(':', 1)
+ if len(parts) != 2:
+ continue
+ user, group = parts
+ members.remove(m)
+ members.update(self.group_members(user, group))
+ return list(members)
+
def access_clear(self, path):
"""Revoke access to path (both permissions and public)."""
del(permissions[WRITE])
return permissions
+ def access_members(self, path):
+ feature = self.xfeature_get(path)
+ if not feature:
+ return []
+ permissions = self.feature_dict(feature)
+ members = set()
+ members.update(permissions.get(READ, []))
+ members.update(permissions.get(WRITE, []))
+ for m in set(members):
+ parts = m.split(':', 1)
+ if len(parts) != 2:
+ continue
+ user, group = parts
+ members.remove(m)
+ members.update(self.group_members(user, group))
+ return members
+
def access_clear(self, path):
"""Revoke access to path (both permissions and public)."""
try:
self.messages = []
ret = func(self, *args, **kw)
- self.wrapper.commit()
for m in self.messages:
self.queue.send(*m)
+ self.wrapper.commit()
return ret
except:
self.wrapper.rollback()
path = self._lookup_object(account, container, name)[0]
self._check_permissions(path, permissions)
self.permissions.access_set(path, permissions)
+ self._report_sharing_change(user, account, path, {'members':self.permissions.access_members(path)})
@backend_method
def get_object_public(self, user, account, container, name):
if permissions is not None:
self.permissions.access_set(path, permissions)
+ self._report_sharing_change(user, account, path, {'members':self.permissions.access_members(path)})
self._report_object_change(user, account, path, details={'version': dest_version_id, 'action': 'object update'})
return dest_version_id
details.update({'user': user})
self.messages.append((QUEUE_MESSAGE_KEY_PREFIX % ('object',), account, QUEUE_INSTANCE_ID, 'object', path, details))
+ def _report_sharing_change(self, user, account, path, details={}):
+ logger.debug("_report_permissions_change: %s %s %s %s", user, account, path, details)
+ details.update({'user': user})
+ self.messages.append((QUEUE_MESSAGE_KEY_PREFIX % ('sharing',), account, QUEUE_INSTANCE_ID, 'sharing', path, details))
+
# Policy functions.
def _check_policy(self, policy):