[#13664] accept event to Horde CalDAV calendar from Thunderbird Lightning parses Attendees
Summary accept event to Horde CalDAV calendar from Thunderbird Lightning parses Attendees
Queue Kronolith
Queue Version 4.2.2
Type Bug
State Duplicate
Priority 2. Medium
Requester willem.verbruggen (at) anagky (dot) be
Created 2014-11-05 (2038 days ago)
Updated 2019-09-27 (251 days ago)
Resolved 2014-11-05 (2038 days ago)
Patch No

2019-09-27 03:09:53 admin (at) natirar (dot) com (dot) au Comment #17 Reply to this comment
Is it likely this will be fixed?  I have just started using this and 
it's embarrasing when my clients invite me to a meeting and it looks 
like I have hijacked fheir meeting.
2019-07-16 14:13:15 fabiojsousa (at) gmail (dot) com Comment #16 Reply to this comment
I 've to leave the Horde Groupware Webmail Edition solution because 
this problem :(

I've approximately 300 users and this bug cause some spam issues with 
the invites duplication.
2019-07-05 14:52:11 per (at) frennbro (dot) com Comment #15 Reply to this comment
Any news about the release date ? I have my entire company
prevented from using the calendar activity... Can I put this fix 
directly to my code?
I would not expect anything.
This is an error that is now 5 years old.
Abandon ship is the signal!
2019-07-05 14:50:55 per (at) frennbro (dot) com Comment #14 Reply to this comment
Any news about the release date ? I have my entire company
prevented from using the calendar activity... Can I put this fix 
directly to my code?
2019-07-05 14:43:52 fabiojsousa (at) gmail (dot) com Comment #13 Reply to this comment
Any news about the release date ? I have my entire company
prevented from using the calendar activity... Can I put this fix 
directly to my code?
2018-10-17 10:47:26 Michael Rubinsky Comment #12 Reply to this comment
2018-10-17 09:04:47 rl (at) rlit (dot) nl Comment #11 Reply to this comment
The opposed fix is not fixing the issue completely. The problem is 
more complicated as stated earlier.
When an event is received and accepted in either Thunderbird or 
Outlook the event is hijacked and the ORGANIZER is now me. It should 
just Accept the event, notify the sender and add it to my calendar 
without changing the ORGANIZER, since i am just an ATTENDEE.
Also i can't understand that this issue still exists, i am wondering 
if it is a setting since this is such trivial behavior of a calendar 
and there are far more complicated parts in Horde. Hope this will be 
fixed since it is a showstopper at the moment for using Horde.
2018-02-26 20:08:04 carto (at) corridorappalachien (dot) ca Comment #9 Reply to this comment
Same thing is happening here.

I send an invite with Outlook, and the CalDav server also sends an 
invite to the attendees, resulting in duplicate invites.

horde 5.2.14
2018-01-20 05:51:33 per (at) frennbro (dot) com Comment #8 Reply to this comment
I have been in the same situation where I was happy to have CALDAV, 
but I sadly now have to abandon the solution.
I have had events popping up in Thunderbird every hour almost and I 
have to dismiss the events, with the result that also lawyers are now 
contacting me due to it is spamming the whole world also into the past.

This is completely unacceptable from a calendar that should be seen as 
more than competitive to Microsoft Outlook.

Another thing is the Shared address book which is like a donald duck 
implementation of any other existing address book.
I cannot put names on people and I cannot put proper addresses or 
nothing in it.
If this is what Horde is capable of delivering stay with Donald u k 
and mickey mouse for kids.

The current implementation has to either step up or you have to shut 
it down. It is not possible to use it in a professional evironment
2017-12-29 09:18:46 maxwhiskysync (at) gmail (dot) com Comment #7 Reply to this comment
Same here. The flood of emails is not acceptable. Can you please 
include a patch for this bug in some of the next versions? That would 
be great.
2017-07-06 13:48:07 horde (at) nagler-ihlein (dot) de Comment #6 Reply to this comment
Same with us. We changed to a provider using horde for CalDAV 
calendars and experience the same problem using Lightning to accept 
event invitations. Instead of simply adding the event the calender 
owner becomes the organizer.

Unbelievable that so little users experience this problem. Have really 
all turned to all-web applications and support for stand-alone and 
offline-possible solutions are treated as a poor cousin...?
2017-03-28 20:48:49 guygreg (at) openmailbox (dot) org Comment #5 Reply to this comment
We recently moved our mail server to a new provider and were so 
excited to use the CalDAV functionality bundled into cPanel (Horde) 
instead of the separate software we'd been using previously.

A few days in, we're drowning under a flood of emails generated as 
people accept invitations to events, and yet more as people change 
their reminders, or hit snooze, or decide they can't go.  And they all 
insist the sender is the organizer.

Now I find out that this has been known about for years, and not 
fixed?  The product is unusable like this, we can't be sending all 
these emails out to our clients stating we've taken over every meeting 
we've accepted an invitation to.

What a horrible letdown!

2014-12-03 17:38:52 kevin (at) kevin-online (dot) com Comment #4 Reply to this comment
Same here using Kontact and Lightning. Considering that Horde sends a 
duplicate of the event to business partners, I think the priority is 
more than just "medium". Also it is not a duplicate, as mentioned 
before: tracking the organizer is something different.

What confuses me a bit: how do others work with Kronolith? Did we 
maybe miss something important in the configuration? Or is adding 
events received by mail using CalDAV simply not supported and one must 
use IMP?
2014-11-05 10:21:01 willem (dot) verbruggen (at) anagky (dot) be Comment #3 Reply to this comment
Basically a duplicate of request #3965, please add your information 
there. See also request #13027.
We saw 3965 before and it is related: still the error is the parsing 
of the attendees thereby creating a meeting in your calendar with 
seemingly a wrong organizer.  BUT when doing the same from IMP, it 
works the same way with yourself also as organizer with the difference 
that there are no attendees .  So an enhancement to set the correct 
organizer is another step  forward (and as we saw in the code and the 
icalendar RFC an elaborate one) but not the problem here as IMP works 
the same way regarding organizer.  So for me this is not a duplicate.

Request 13027 has state resolved?
The parsing of attendees works correctly when creating new items via 
CalDAV from Lightning and has to keep on working this way.  Still 
there is a need NOT to parse the attendees when we are only accepting 
an externally received invite which we still want to take time in our 
own calendar after accepting.  This will have to be coded per client 
as I am not aware of a header/standard in the RFC that the clients 
might use.  Disclaimer: I am not a specialist in this icalendar RFC.

2014-11-05 09:49:44 Jan Schneider Comment #2
State ⇒ Duplicate
Reply to this comment
Basically a duplicate of request #3965, please add your information 
there. See also request #13027.
2014-11-05 09:32:32 willem (dot) verbruggen (at) anagky (dot) be Comment #1
Type ⇒ Bug
State ⇒ Unconfirmed
Priority ⇒ 2. Medium
Summary ⇒ accept event to Horde CalDAV calendar from Thunderbird Lightning parses Attendees
Queue ⇒ Kronolith
Milestone ⇒
Patch ⇒ No
Reply to this comment

A meeting request arrives by e-mail in Thunderbird 31.2.0 with 
Lightning 3.3.1 installed from an external calendar application.  On 
accepting the meeting request putting it into a Kronolith calendar 
installed/connected from Lightning using CalDAV, Horde parses the 
attendees and puts them into the newly created request.

As a result Kronolith:
-> sends notifications to all the attendees from the organizers 
meeting as it is seen as a new meeting in Horde, effectively 
duplicating and hijacking someone else's meeting.
-> this happens for everyone accepting, and possibly also accepting 
the wrongly newly created meeting, with a mailing spree through the 
organization and towards the external partner as a result.
-> Horde treats accepting requests from Thunderbird differently than 
from within IMP with totally different meetings in Kronolith as a 
result, not working consistently.
-> Ligthing cannot be used as a mail client for accepting invites.

Thunderbird/Ligthning adds a header X-MOZ-RECEIVED-SEQUENCE to a 
meeting request being an accept on a received invite compared to a new 
meeting request created in LIghtning directly.

We could get a working, yes ugly but still a solution, patched up 
Kronolith with the following code changes whereby we check for the 
X-MOZ-RECEIVED-SEQUENCE header.  Hope it is any help to you.

vi /var/www/horde/kronolith/lib/Event.php

  363     /**
  364      * The cached event duration, split up in time units.
  365      *
  366      * @see getDuration()
  367      * @var stdClass
  368      */
  369     protected $_duration;
   371     //OpenOutsourcing added properties
   372     //public $organizer;
   373     public $x_moz_received_sequence;
   374     public $x_moz_received_attendees = array();
  376     /**
  377      * Constructor.
  378      *
  379      * @param Kronolith_Driver $driver  The backend driver that 
this event is
  380      *                                  stored in.
  381      * @param mixed $eventObject        Backend specific event object
  382      *                                  that this will represent.
  383      */
  384     public function __construct(Kronolith_Driver $driver, 
$eventObject = null)

1052     /**
1053      * Updates the properties of this event from a Horde_Icalendar_Vevent
1054      * object.
1055      *
1056      * @param Horde_Icalendar_Vevent $vEvent  The iCalendar data 
to update
1057      *                                        from.
1058      * @param boolean $parseAttendees         Parse attendees too?
1059      *                                        @since Kronolith 4.2
1060      */
1061     public function fromiCalendar($vEvent, $parseAttendees = false)
1062     {
  1064         // OpenOutsourcing
  1065         // Add X-MOZ-RECEIVED-SEQUENCE to object
  1066         try {
  1067             $this->x_moz_received_sequence = False;
  1068             // This call throws exception when attribute does not exist
  1069             $moz_received = 
  1070             $this->x_moz_received_sequence = True;
  1071         } catch (Horde_Icalendar_Exception $e) {}

2659     public function addAttendee($email, $attendance, $response, 
$name = null)
2660     {
2661         if ($attendance == Kronolith::PART_IGNORE) {
2662             if (isset($this->attendees[$email])) {
2663                 $attendance = $this->attendees[$email]['attendance'];
2664             } else {
2665                 $attendance = Kronolith::PART_REQUIRED;
2666             }
2667         }
2668         if (empty($name) && isset($this->attendees[$email]) &&
2669             !empty($this->attendees[$email]['name'])) {
2670             $name = $this->attendees[$email]['name'];
2671         }
  2673         // OpenOutsourcing
  2674         // Add IF and wrap existing code into ELSE
  2675         if ($this->x_moz_received_sequence == True) {
  2676             $this->x_moz_received_attendees[$email] = array(
  2677                 'attendance' => $attendance,
  2678                 'response' => $response,
  2679                 'name' => $name
  2680             );
  2681         }
  2682         else {
  2683             $this->attendees[$email] = array(
  2684                 'attendance' => $attendance,
  2685                 'response' => $response,
  2686                 'name' => $name
  2687             );
  2688         }
2689     }

vi /var/www/horde/kronolith/lib/Application.php
800     public function davPutObject($collection, $object, $data)
854             // Save entry.
855             $id = $event->save();
857             if (!$existing_event) {
858                 $dav->addObjectMap($id, $object, $internal);
859             }
  861             // OpenOutsourcing
  862             // Send ACCEPT and DECLINE messages on 
  863             if($event->x_moz_received_sequence == True) {
  865                 $ident_user = 
  866                 $reply_to = $ident_user->getValue('from_addr');
  868                 /** Invitation responses */
  869                 $RESPONSE_NONE      = 1;
  870                 $RESPONSE_ACCEPTED  = 2;
  871                 $RESPONSE_DECLINED  = 3;
  872                 $RESPONSE_TENTATIVE = 4;
  874                 $response = $RESPONSE_NONE;
  875                 foreach ($event->x_moz_received_attendees as 
$email => $status) {
  876                     if ($email == $reply_to) {
  877                         $response = $status['response'];
  878                     }
  879                 }
  881                 $resource = new Horde_Itip_Resource_Identity(
  882                     $GLOBALS['injector']->getInstance('IMP_Identity'),
  883                     $content->getAttribute('ATTENDEE'),
  884                     $reply_to
  885                 );
  887                 switch ($response) {
  888                     case $RESPONSE_ACCEPTED:
  889                         $type = new 
  890                         break;
  891                     case $RESPONSE_TENTATIVE:
  892                         $type = new 
  893                         break;
  894                     case $RESPONSE_DECLINED:
  895                         $type = new 
  896                         break;
  897                     default:
  898                         $type = new 
  899                         break;
  900                 }
  902                 try {
  903                     Horde_Itip::factory($content, 
  904                         $type,
  905                         new Horde_Itip_Response_Options_Horde(
  906                             'UTF-8',
  907                             array(
  908                                 'dns' => 
  909                                 'server' => 
  910                             )
  911                         ),
  912                         $GLOBALS['injector']->getInstance('IMP_Mail')
  913                     );
  914                 } catch (Horde_Itip_Exception $e) {
  915                     system("echo SENT ERROR >> /tmp/willem");
  916                 }
  917                 //$type = new 
  918             }
920             // Send iTip messages.



Saved Queries