/usr/lib/python2.7/dist-packages/kopano/delegation.py is in python-kopano 8.5.5-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | """
Part of the high-level python bindings for Kopano
Copyright 2017 - Kopano and its licensors (see LICENSE file for details)
"""
from MAPI import (
ROW_REMOVE, FL_PREFIX, RELOP_NE, ROW_ADD, ROW_MODIFY, MAPI_BEST_ACCESS,
MAPI_UNICODE,
)
from MAPI.Tags import (
PR_RULE_CONDITION, PR_RULE_ACTIONS, PR_RULE_PROVIDER_W, ACTTYPE, PR_ENTRYID,
PR_RULE_ID, PR_RULES_TABLE, IID_IExchangeModifyTable, PR_RULE_LEVEL,
PR_RULE_NAME_W, PR_RULE_SEQUENCE, PR_RULE_STATE, PR_RULE_PROVIDER_DATA,
PR_MESSAGE_CLASS_W, PR_DELEGATED_BY_RULE, PR_SENSITIVITY, PR_ADDRTYPE_W,
PR_EMAIL_ADDRESS_W, PR_DISPLAY_NAME_W, PR_SEARCH_KEY, PR_SMTP_ADDRESS_W,
PR_OBJECT_TYPE, PR_DISPLAY_TYPE, PR_RECIPIENT_TYPE,
)
from MAPI.Defs import (
PpropFindProp
)
from MAPI.Struct import (
ROWENTRY, SPropValue, ACTION, actFwdDelegate, ACTIONS, SAndRestriction,
SOrRestriction, SNotRestriction, SContentRestriction, SPropertyRestriction,
SExistRestriction,
)
from .compat import (
hex as _hex, unhex as _unhex, repr as _repr,
)
from .defs import *
from .errors import NotFoundError
USERPROPS = [
PR_ENTRYID,
PR_ADDRTYPE_W,
PR_EMAIL_ADDRESS_W,
PR_DISPLAY_NAME_W,
PR_SEARCH_KEY,
PR_SMTP_ADDRESS_W,
PR_OBJECT_TYPE,
PR_DISPLAY_TYPE,
PR_RECIPIENT_TYPE,
]
class Delegation(object):
"""Delegation class"""
def __init__(self, store, user):
self.store = store
self.user = user
@property
def see_private(self):
fbmsg, (entryids, names, flags) = self.store._fbmsg_delgs()
pos = entryids.Value.index(_unhex(self.user.userid))
return bool(flags.Value[pos] & 1)
@see_private.setter
def see_private(self, b):
fbmsg, (entryids, names, flags) = self.store._fbmsg_delgs()
pos = entryids.Value.index(_unhex(self.user.userid))
if b:
flags.Value[pos] |= 1
else:
flags.Value[pos] &= ~1
fbmsg.SetProps([flags])
fbmsg.SaveChanges(0)
@staticmethod
def _parse_rule(store):
userids, deletion = [], False
for rule in store.inbox.rules():
if PR_RULE_PROVIDER_W in rule.mapirow and PR_RULE_ACTIONS in rule.mapirow:
if rule.mapirow[PR_RULE_PROVIDER_W] == u'Schedule+ EMS Interface':
actions = rule.mapirow[PR_RULE_ACTIONS].lpAction
if actions and actions[0].acttype == ACTTYPE.OP_DELEGATE:
for addrentry in actions[0].actobj.lpadrlist:
entryid = PpropFindProp(addrentry, PR_ENTRYID)
if entryid:
userids.append(entryid.Value)
if len(actions) >= 2 and actions[1].acttype == ACTTYPE.OP_DELETE:
deletion = True
return userids, deletion
@staticmethod
def _save_rule(store, userids, deletion):
# remove existing rule # XXX update
for rule in store.inbox.rules():
if rule.mapirow[PR_RULE_PROVIDER_W] == u'Schedule+ EMS Interface' and \
PR_RULE_ID in rule.mapirow:
pr_rule_id = rule.mapirow[PR_RULE_ID]
rulerows = [ROWENTRY(ROW_REMOVE, [SPropValue(PR_RULE_ID, pr_rule_id)])]
table = store.inbox.mapiobj.OpenProperty(PR_RULES_TABLE, IID_IExchangeModifyTable, 0, 0)
table.ModifyTable(0, rulerows)
# create new rule
row = [
SPropValue(PR_RULE_LEVEL, 0),
SPropValue(PR_RULE_NAME_W, u"Delegate Meetingrequest service"),
SPropValue(PR_RULE_PROVIDER_W, u"Schedule+ EMS Interface"),
SPropValue(PR_RULE_SEQUENCE, 0),
SPropValue(PR_RULE_STATE, 1),
SPropValue(PR_RULE_PROVIDER_DATA, b''),
]
actions = []
userprops = []
for userid in userids:
user = store.server.gab.OpenEntry(userid, None, MAPI_BEST_ACCESS)
userprops.append(user.GetProps(USERPROPS, MAPI_UNICODE))
actions.append(ACTION( ACTTYPE.OP_DELEGATE, 0, None, None, 0, actFwdDelegate(userprops)))
if deletion:
actions.append(ACTION( ACTTYPE.OP_DELETE, 0, None, None, 0, None))
row.append(SPropValue(PR_RULE_ACTIONS, ACTIONS(1, actions)))
cond = SAndRestriction([SContentRestriction(FL_PREFIX, PR_MESSAGE_CLASS_W, SPropValue(PR_MESSAGE_CLASS_W, u"IPM.Schedule.Meeting")),
SNotRestriction( SExistRestriction(PR_DELEGATED_BY_RULE) ),
SOrRestriction([SNotRestriction( SExistRestriction(PR_SENSITIVITY)),
SPropertyRestriction(RELOP_NE, PR_SENSITIVITY, SPropValue(PR_SENSITIVITY, 2))])
])
row.append(SPropValue(PR_RULE_CONDITION, cond))
rulerows = [ROWENTRY(ROW_ADD, row)]
table = store.inbox.mapiobj.OpenProperty(PR_RULES_TABLE, IID_IExchangeModifyTable, 0, 0)
table.ModifyTable(0, rulerows)
@property
def send_copy(self):
"""Delegate receives copies of meeting requests."""
userids, deletion = self._parse_rule(self.store)
return _unhex(self.user.userid) in userids
@send_copy.setter
def send_copy(self, value):
userids, deletion = self._parse_rule(self.store)
if value:
userids.append(_unhex(self.user.userid)) # XXX dupe
else:
userids = [u for u in userids if u != _unhex(self.user.userid)]
self._save_rule(self.store, userids, deletion)
@property
def flags(self):
flags = []
if self.see_private:
flags.append('see_private')
if self.send_copy:
flags.append('send_copy')
return flags
@flags.setter
def flags(self, value):
self.see_private = ('see_private' in value)
self.send_copy = ('send_copy' in value)
@staticmethod
def _send_only_to_delegates(store):
"""Delete meetingrequests after copying them to delegates."""
_, deletion = Delegation._parse_rule(store)
return deletion
@staticmethod
def _set_send_only_to_delegates(store, value):
userids, deletion = Delegation._parse_rule(store)
Delegation._save_rule(store, userids, value)
def _delete(self):
# XXX update delegate rule
fbmsg, (entryids, names, flags) = self.store._fbmsg_delgs()
try:
pos = entryids.Value.index(_unhex(self.user.userid))
except ValueError:
raise NotFoundError("no delegation for user '%s'" % self.user.name)
del entryids.Value[pos]
del names.Value[pos]
del flags.Value[pos]
fbmsg.SetProps([entryids, names, flags])
fbmsg.SaveChanges(0)
def __unicode__(self):
return u"Delegation('%s')" % self.user.name
def __repr__(self):
return _repr(self)
|