Hi,
wallace is ignoring itip requests if the appointment is addressed to a static kolab group instead of an individual.
wallace-0.8.7-2.5.el7.kolab_16.noarch
pykolab-0.8.7-2.5.el7.kolab_16.noarch
This patch should fix this by adding the individual attendee to this itip message if it is addressed indirectly via a kolab group:
---/usr/lib/python2.7/site-packages/wallace/module_invitationpolicy.py.orig 2018-03-19 11:12:55.321272385 +0100 +++ /usr/lib/python2.7/site-packages/wallace/module_invitationpolicy.py 2018-03-19 11:13:05.062383549 +0100 @@ -28,6 +28,7 @@ import re from email import message_from_string +from email import message_from_file from email.parser import Parser from email.utils import formataddr from email.utils import getaddresses @@ -165,7 +166,16 @@ cleanup() os.rename(filepath, new_filepath) filepath = new_filepath - exec('modules.cb_action_ACCEPT(%r, %r)' % ('invitationpolicy',filepath)) + + # Adding invitation policy header + message = message_from_file(open(filepath, 'r')) + message.add_header("X-Wallace-InvitationPolicy_Processed", "YES") + (fp, new_filepath) = tempfile.mkstemp(dir="/var/spool/pykolab/wallace/footer/ACCEPT") + os.write(fp, message.as_string()) + os.close(fp) + os.unlink(filepath) + + exec('modules.cb_action_ACCEPT(%r, %r)' % ('invitationpolicy',new_filepath)) def reject(filepath): new_filepath = os.path.join( @@ -323,10 +333,37 @@ user_attendees = [organizer_mailto] if organizer_mailto in recipient_emails else [] else: - # Limit the attendees to the one that is actually invited with the current message. + # If attendee is a group, add all group members to the attendee list attendees = [str(a).split(':')[-1] for a in (itip_event['attendees'] if itip_event.has_key('attendees') else [])] - user_attendees = [a for a in attendees if a in recipient_emails] + itip_attendees = list(attendees) + + group_member_attr = conf.get_list('ldap', 'group_member_attribute') + if not group_member_attr: + group_member_attr = "uniquemember" + + for attendee in attendees: + attendee_dn = auth.find_recipient(attendee) + if attendee_dn: + members = auth.get_entry_attributes(None, attendee_dn, [group_member_attr]) + if members and members.has_key(group_member_attr): + members_emails = [] + for member_dn in members[group_member_attr]: + member = auth.get_entry_attributes(None, member_dn, ['mail']) + if member: + members_emails.append(member['mail']) + if members_emails: + log.debug(_("Adding members for %s : %r") % (attendee,members_emails),level=8) + attendees += members_emails + # Limit the attendees to the one that is actually invited with the current message. + user_attendees = [a for a in attendees if a in recipient_emails] + + # make sure that the attendee is in xml attendee list (need to add this attendee if it comes from a group substitute) + if 0 < len(user_attendees): + if not user_attendees[0] in itip_attendees: + log.debug(_("Adding user substitute: %r into %r") % (user_attendees,itip_attendees),level=9) + itip_event['xml'].add_attendee(user_attendees[0]) + if itip_event.has_key('organizer'): sender_email = itip_event['xml'].get_organizer().email() @@ -1238,6 +1275,9 @@ msg['Subject'] = utils.str2unicode(_('"%s" has been updated') % (object.get_summary())) msg['From'] = Header(utils.str2unicode('%s' % orgname) if orgname else '') msg['From'].append("<%s>" % orgemail) + + msg.add_header("X-Wallace-InvitationPolicy_Processed", "YES") + msg.add_header("X-Wallace-InvitationPolicy_CalendarAction", "YES") smtp = smtplib.SMTP("localhost", 10027) @@ -1320,6 +1360,9 @@ msg['Subject'] = utils.str2unicode(_('"%s" has been cancelled') % (object.get_summary())) msg['From'] = Header(utils.str2unicode('%s' % orgname) if orgname else '') msg['From'].append("<%s>" % orgemail) + + msg.add_header("X-Wallace-InvitationPolicy_Processed", "YES") + msg.add_header("X-Wallace-InvitationPolicy_CalendarAction", "YES") smtp = smtplib.SMTP("localhost", 10027)
Kind Regards,
Jürgen