1616use OCA \Mail \Db \MessageMapper ;
1717use OCA \Mail \Exception \ServiceException ;
1818use OCA \Mail \Model \IMAPMessage ;
19+ use OCA \Mail \Util \ServerVersion ;
1920use OCP \AppFramework \Db \DoesNotExistException ;
2021use OCP \Calendar \IManager ;
2122use Psr \Log \LoggerInterface ;
@@ -30,6 +31,7 @@ class IMipService {
3031 private MailboxMapper $ mailboxMapper ;
3132 private MailManager $ mailManager ;
3233 private MessageMapper $ messageMapper ;
34+ private ServerVersion $ serverVersion ;
3335
3436 public function __construct (
3537 AccountService $ accountService ,
@@ -38,13 +40,15 @@ public function __construct(
3840 MailboxMapper $ mailboxMapper ,
3941 MailManager $ mailManager ,
4042 MessageMapper $ messageMapper ,
43+ ServerVersion $ serverVersion ,
4144 ) {
4245 $ this ->accountService = $ accountService ;
4346 $ this ->calendarManager = $ manager ;
4447 $ this ->logger = $ logger ;
4548 $ this ->mailboxMapper = $ mailboxMapper ;
4649 $ this ->mailManager = $ mailManager ;
4750 $ this ->messageMapper = $ messageMapper ;
51+ $ this ->serverVersion = $ serverVersion ;
4852 }
4953
5054 public function process (): void {
@@ -115,8 +119,10 @@ public function process(): void {
115119 continue ;
116120 }
117121
118- $ principalUri = ' principals/users/ ' . $ account ->getUserId ();
122+ $ userId = $ account ->getUserId ();
119123 $ recipient = $ account ->getEmail ();
124+ $ imipCreate = $ account ->getImipCreate ();
125+ $ systemVersion = $ this ->serverVersion ->getMajorVersion ();
120126
121127 foreach ($ filteredMessages as $ message ) {
122128 /** @var IMAPMessage $imapMessage */
@@ -138,20 +144,35 @@ public function process(): void {
138144 try {
139145 // an IMAP message could contain more than one iMIP object
140146 foreach ($ imapMessage ->scheduling as $ schedulingInfo ) {
141- if ($ schedulingInfo ['method ' ] === 'REQUEST ' ) {
142- $ processed = $ this ->calendarManager ->handleIMipRequest ($ principalUri , $ sender , $ recipient , $ schedulingInfo ['contents ' ]);
143- $ message ->setImipProcessed ($ processed );
144- $ message ->setImipError (!$ processed );
145- } elseif ($ schedulingInfo ['method ' ] === 'REPLY ' ) {
146- $ processed = $ this ->calendarManager ->handleIMipReply ($ principalUri , $ sender , $ recipient , $ schedulingInfo ['contents ' ]);
147- $ message ->setImipProcessed ($ processed );
148- $ message ->setImipError (!$ processed );
149- } elseif ($ schedulingInfo ['method ' ] === 'CANCEL ' ) {
150- $ replyTo = $ imapMessage ->getReplyTo ()->first ()?->getEmail();
151- $ processed = $ this ->calendarManager ->handleIMipCancel ($ principalUri , $ sender , $ replyTo , $ recipient , $ schedulingInfo ['contents ' ]);
152- $ message ->setImipProcessed ($ processed );
153- $ message ->setImipError (!$ processed );
147+ $ processed = false ;
148+ if ($ systemVersion < 33 ) {
149+ $ principalUri = 'principals/users/ ' . $ userId ;
150+ if ($ schedulingInfo ['method ' ] === 'REQUEST ' ) {
151+ $ processed = $ this ->calendarManager ->handleIMipRequest ($ principalUri , $ sender , $ recipient , $ schedulingInfo ['contents ' ]);
152+ } elseif ($ schedulingInfo ['method ' ] === 'REPLY ' ) {
153+ $ processed = $ this ->calendarManager ->handleIMipReply ($ principalUri , $ sender , $ recipient , $ schedulingInfo ['contents ' ]);
154+ } elseif ($ schedulingInfo ['method ' ] === 'CANCEL ' ) {
155+ $ replyTo = $ imapMessage ->getReplyTo ()->first ()?->getEmail();
156+ $ processed = $ this ->calendarManager ->handleIMipCancel ($ principalUri , $ sender , $ replyTo , $ recipient , $ schedulingInfo ['contents ' ]);
157+ }
158+ } else {
159+ if (!method_exists ($ this ->calendarManager , 'handleIMip ' )) {
160+ $ this ->logger ->error ('iMIP handling is not supported by server version installed. ' );
161+ continue ;
162+ }
163+ $ processed = $ this ->calendarManager ->handleIMip (
164+ $ userId ,
165+ $ schedulingInfo ['contents ' ],
166+ [
167+ 'recipient ' => $ recipient ,
168+ 'absent ' => $ imipCreate ? 'create ' : 'ignore ' ,
169+ 'absentCreateStatus ' => 'tentative ' ,
170+ ],
171+ );
154172 }
173+
174+ $ message ->setImipProcessed ($ processed );
175+ $ message ->setImipError (!$ processed );
155176 }
156177 } catch (Throwable $ e ) {
157178 $ this ->logger ->error ('iMIP message processing failed ' , [
0 commit comments