def test_delegate_permissions_owner(publicfolder, session3, kind, rights, folder_access, message_access): print(kind) access = publicfolder.GetProps([PR_ACCESS], 0)[0].Value defaultAccess = MAPI_ACCESS_MODIFY | MAPI_ACCESS_READ | MAPI_ACCESS_DELETE | MAPI_ACCESS_CREATE_HIERARCHY | MAPI_ACCESS_CREATE_CONTENTS assert defaultAccess == access store = GetDefaultStore(session3) userid = session3.QueryIdentity() folderid = publicfolder.GetProps([PR_ENTRYID], 0)[0].Value acls = publicfolder.OpenProperty(PR_ACL_TABLE, IID_IExchangeModifyTable, 0, MAPI_MODIFY) rowlist = [ ROWENTRY(ROW_ADD, [ SPropValue(PR_MEMBER_ENTRYID, userid), SPropValue(PR_MEMBER_RIGHTS, rights) ]) ] acls.ModifyTable(ROWLIST_REPLACE, rowlist) message = publicfolder.CreateMessage(None, 0) message.SetProps([SPropValue(PR_SUBJECT, b'acl test')]) message.SaveChanges(0) eid = message.GetProps([PR_ENTRYID], 0)[0].Value access = message.GetProps([PR_ACCESS], 0)[0].Value assert access == MAPI_ACCESS_MODIFY | MAPI_ACCESS_READ | MAPI_ACCESS_DELETE # as user3, open public and get folder access public = GetPublicStore(session3) folder = public.OpenEntry(folderid, None, MAPI_BEST_ACCESS) access = folder.GetProps([PR_ACCESS], 0)[0].Value assert access == folder_access message = folder.OpenEntry(eid, None, 0) access = message.GetProps([PR_ACCESS], 0)[0].Value assert access == message_access
def public_store(self): """Company public :class:`store <Store>`.""" if not self._public_store: if self._name == u'Default': # XXX pubstore = GetPublicStore(self.server.mapisession) if pubstore is None: self._public_store = None else: self._public_store = _store.Store(mapiobj=pubstore, server=self.server) else: try: entryid = self.server.ems.CreateStoreEntryID(None, self._name, MAPI_UNICODE) except MAPIErrorNotFound: self._public_store = None else: self._public_store = _store.Store(entryid=_hex(entryid), server=self.server) return self._public_store
def publicstore(session): return GetPublicStore(session)
def publicstore(providersession): return GetPublicStore(providersession)
def PreDelivery(self, session, addrbook, store, folder, message): """ Original code from movetopublic.py with call to self.publicfolder(). Change type modification. """ props = message.GetProps([PR_RECEIVED_BY_EMAIL_ADDRESS_W], 0) if props[0].ulPropTag != PR_RECEIVED_BY_EMAIL_ADDRESS_W: self.logger.logError("!--- Not received by emailaddress") return MP_CONTINUE, recipient = props[0].Value.lower() if not recipient: self.logger.logError("!--- No recipient in props {}".format(props)) return MP_CONTINUE, recipfolder = self.publicfolder(recipient) if not recipfolder: self.logger.logDebug( ("*--- No public folder for recipient {}".format( recipient.encode('utf-8')))) return MP_CONTINUE, publicstore = GetPublicStore(session) if not publicstore: storeprops = store.GetProps([PR_MAILBOX_OWNER_ENTRYID], 0) if storeprops[0].ulPropTag == PR_MAILBOX_OWNER_ENTRYID: user = addrbook.OpenEntry(storeprops[0].Value, None, 0) userprops = user.GetProps([PR_EC_COMPANY_NAME_W], 0) if userprops[0].ulPropTag == PR_EC_COMPANY_NAME_W: companyname = userprops[0].Value else: companyname = None if not companyname: self.logger.logError(("!--- Cannot open a public store." ' Use "kopano-storeadm -P"' " to create one if it is missing.")) return MP_CONTINUE, ema = store.QueryInterface(IID_IExchangeManageStore) publicstoreid = ema.CreateStoreEntryID(None, companyname, MAPI_UNICODE) publicstore = session.OpenMsgStore(0, publicstoreid, None, MDB_WRITE) publicfolders = publicstore.OpenEntry( publicstore.GetProps([PR_IPM_PUBLIC_FOLDERS_ENTRYID], 0)[0].Value, None, MAPI_MODIFY) folderlist = recipfolder.split('/') folder = publicfolders for foldername in folderlist: if len(foldername) > 0: if hexversion >= 0x03000000: folder = folder.CreateFolder( 0, foldername, "Create by Move to Public plugin", None, OPEN_IF_EXISTS | MAPI_UNICODE) else: folder = folder.CreateFolder( 0, foldername, "Create by Move to Public plugin", None, OPEN_IF_EXISTS) msgnew = folder.CreateMessage(None, 0) tags = message.GetPropList(MAPI_UNICODE) message.CopyProps(tags, 0, None, IID_IMessage, msgnew, 0) msgnew.SaveChanges(0) folderid = folder.GetProps([PR_ENTRYID], 0)[0].Value msgid = msgnew.GetProps([PR_ENTRYID], 0)[0].Value publicstore.NotifyNewMail( NEWMAIL_NOTIFICATION(msgid, folderid, 0, None, 0)) self.logger.logInfo( ("*--- Message moved to public folder {}".format(recipfolder))) return MP_STOP_SUCCESS,
def PreDelivery(self, session, addrbook, store, folder, message): props = message.GetProps([PR_RECEIVED_BY_EMAIL_ADDRESS_W], 0) if props[0].ulPropTag != PR_RECEIVED_BY_EMAIL_ADDRESS_W: self.logger.logError("!--- No received by emailaddress") return MP_CONTINUE, recipient = props[0].Value.lower() if recipient not in self.rulelist: self.logger.logInfo("*--- No rule for recipient '%s'" % recipient.encode('utf-8')) return MP_CONTINUE, publicstore = GetPublicStore(session) if publicstore is None: # check for company public companyname = None storeprops = store.GetProps([PR_MAILBOX_OWNER_ENTRYID], 0) if storeprops[0].ulPropTag == PR_MAILBOX_OWNER_ENTRYID: user = addrbook.OpenEntry(storeprops[0].Value, None, 0) userprops = user.GetProps([PR_EC_COMPANY_NAME_W], 0) if userprops[0].ulPropTag == PR_EC_COMPANY_NAME_W: companyname = userprops[0].Value if companyname is None: self.logger.logError("!--- Can not open a public store") return MP_CONTINUE, ema = store.QueryInterface(IID_IExchangeManageStore) publicstoreid = ema.CreateStoreEntryID(None, companyname, MAPI_UNICODE) publicstore = session.OpenMsgStore(0, publicstoreid, None, MDB_WRITE) publicfolders = publicstore.OpenEntry( publicstore.GetProps([PR_IPM_PUBLIC_FOLDERS_ENTRYID], 0)[0].Value, None, MAPI_MODIFY) folderlist = self.rulelist[recipient].split('/') if len(folderlist) == 0: self.logger.logWarn( "!--- No folders in the rule of recipient '%s'" % recipient.encode('utf-8')) return MP_CONTINUE, folder = publicfolders for foldername in folderlist: if len(foldername) > 0: if hexversion >= 0x03000000: folder = folder.CreateFolder( 0, foldername, "Create by Move to Public plugin", None, OPEN_IF_EXISTS | MAPI_UNICODE) else: folder = folder.CreateFolder( 0, foldername, "Create by Move to Public plugin", None, OPEN_IF_EXISTS) msgnew = folder.CreateMessage(None, 0) tags = message.GetPropList(MAPI_UNICODE) message.CopyProps(tags, 0, None, IID_IMessage, msgnew, 0) msgnew.SaveChanges(0) folderid = folder.GetProps([PR_ENTRYID], 0)[0].Value msgid = msgnew.GetProps([PR_ENTRYID], 0)[0].Value publicstore.NotifyNewMail( NEWMAIL_NOTIFICATION(msgid, folderid, 0, None, 0)) self.logger.logInfo("*--- Message moved to public folder '%s'" % (self.rulelist[recipient].encode('utf-8'))) return MP_STOP_SUCCESS,