From 2cb10075255d4c33606e5196d34f233e1e12696d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 08:58:32 +0100 Subject: [PATCH 01/15] fix PHP Error: Undefined constant "title" --- home/templates/default/index.xet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/templates/default/index.xet b/home/templates/default/index.xet index 445015471c..0210403daa 100644 --- a/home/templates/default/index.xet +++ b/home/templates/default/index.xet @@ -20,7 +20,7 @@ - + From a7e796a66b589c34ae26037c9bd9d4e05cfa3b2c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 11:22:58 +0100 Subject: [PATCH 02/15] fix PHP 8.0 TypeError: Unsupported operand types: EGroupware\Api\DateTime - EGroupware\Api\DateTime --- calendar/inc/class.calendar_ical.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 330bcdafdc..08ecee35ec 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -600,8 +600,8 @@ class calendar_ical extends calendar_boupdate if (empty($event['whole_day'])) { // Hack for CalDAVTester to export duration instead of endtime - if ($tzid == 'UTC' && $event['end'] - $event['start'] <= 86400) - $attributes['duration'] = $event['end'] - $event['start']; + if ($tzid == 'UTC' && ($duration = Api\DateTime::to($event['end'], 'ts') - Api\DateTime::to($event['start'], 'ts')) <= 86400) + $attributes['duration'] = $duration; else $attributes['DTEND'] = self::getDateTime($event['end'],$tzid,$parameters['DTEND']); } From dc24bb7e37d7ef32d1c84b3349a5f6e8df85d448 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 11:28:30 +0100 Subject: [PATCH 03/15] fix PHP 8.0 TypeError: Unsupported operand types: int + string --- resources/inc/class.resources_bo.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/inc/class.resources_bo.inc.php b/resources/inc/class.resources_bo.inc.php index 6f873c0733..3fdbaea1f6 100755 --- a/resources/inc/class.resources_bo.inc.php +++ b/resources/inc/class.resources_bo.inc.php @@ -750,7 +750,7 @@ class resources_bo $end = $start->format('ts') + 86399; } else { $start = $start->format('ts'); - $end = $start + ($cal_info['duration']); + $end = $start + (int)$cal_info['duration']; } // search events matching our timestamps From ed9b735456ea7e59dd83e66068badf5fcf81b0c9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 11:38:06 +0100 Subject: [PATCH 04/15] fix PHP 8.0 TypeError: explode() expects parameter 2 to be string, array given --- addressbook/inc/class.addressbook_ui.inc.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addressbook/inc/class.addressbook_ui.inc.php b/addressbook/inc/class.addressbook_ui.inc.php index 3f50d10406..b13390e367 100644 --- a/addressbook/inc/class.addressbook_ui.inc.php +++ b/addressbook/inc/class.addressbook_ui.inc.php @@ -1855,7 +1855,10 @@ class addressbook_ui extends addressbook_bo if ($query['grouped_view']) // view the contacts of one organisation only { if (strpos($query['grouped_view'],'*AND*') !== false) $query['grouped_view'] = str_replace('*AND*','&',$query['grouped_view']); - $fields = explode(',',$GLOBALS['egw_info']['user']['preferences']['addressbook']['duplicate_fields']); + if (!is_array($fields = $GLOBALS['egw_info']['user']['preferences']['addressbook']['duplicate_fields'] ?? [])) + { + $fields = explode(',', $fields); + } foreach(explode('|||',$query['grouped_view']) as $part) { list($name,$value) = explode(':',$part,2); @@ -2911,7 +2914,10 @@ class addressbook_ui extends addressbook_bo */ public function ajax_check_values($values, $name, $own_id=0) { - $fields = explode(',',$GLOBALS['egw_info']['user']['preferences']['addressbook']['duplicate_fields']); + if (!is_array($fields = $GLOBALS['egw_info']['user']['preferences']['addressbook']['duplicate_fields'] ?? [])) + { + $fields = explode(',', $fields); + } $threshold = (int)$GLOBALS['egw_info']['user']['preferences']['addressbook']['duplicate_threshold']; $ret = array('doublicates' => array(), 'msg' => null); From 7b042f72594b73f5f441e6428cedb2e4e88d1e27 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 11:44:42 +0100 Subject: [PATCH 05/15] fix PHP 8.0 TypeError: key(): Argument #1 ($array) must be of type array, null given --- calendar/inc/class.calendar_uiforms.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index c1863bc176..659b2a4482 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -2192,7 +2192,7 @@ class calendar_uiforms extends calendar_ui break; case 'cancel': // first participant is the (external) organizer (our iCal parser adds owner first!) - $parts = $event['participants']; + $parts = $event['participants'] ?? []; unset($parts[$existing_event['owner']]); $event['ical_sender_uid'] = key($parts); if (empty($existing_event['id']) || !$this->bo->check_perms(Acl::DELETE, $existing_event['id'])) From 2d7da57e60894a9c911239dda9aa123cd73ab060 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 11:54:18 +0100 Subject: [PATCH 06/15] fix PHP 8.0 TypeError: Cannot access offset of type string on string --- calendar/inc/class.calendar_so.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index d8a19748f1..51591bf7c0 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -779,6 +779,7 @@ class calendar_so } if(isset($params['sql_filter']['cal_id'])) { + if (!is_array($params['query'])) $params['query'] = []; $params['query']['cal_id'] = $params['sql_filter']['cal_id']; $where[] = $this->db->column_data_implode(", ", [$this->cal_table.'.cal_id' => $params['sql_filter']['cal_id']], True, False); unset($params['sql_filter']['cal_id']); From 03835c0247c039b3794d5df2017e55e06447b258 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 12:14:58 +0100 Subject: [PATCH 07/15] fix PHP 8.0 TypeError: strpos(): Argument #1 ($haystack) must be of type string, array given --- api/src/Storage/History.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/src/Storage/History.php b/api/src/Storage/History.php index 6868d73241..4a9f8ff45d 100644 --- a/api/src/Storage/History.php +++ b/api/src/Storage/History.php @@ -403,8 +403,8 @@ class History */ public static function needs_diff($name, $value) { - // No diff on encrypted content - if(strpos($value, static::BEGIN_PGP) == 0 && strpos($value, static::END_PGP) !== FALSE) + // No diff on arrays or encrypted content + if (is_array($value) || strpos($value, static::BEGIN_PGP) == 0 && strpos($value, static::END_PGP) !== FALSE) { return false; } From 43ae41cae75b7869fd84a6a7e387f80b23e269ff Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 12:24:08 +0100 Subject: [PATCH 08/15] fix PHP 8.0 TypeError: count(): Argument #1 ($value) must be of type Countable|array, null given --- mail/inc/class.mail_zpush.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mail/inc/class.mail_zpush.inc.php b/mail/inc/class.mail_zpush.inc.php index 75b8e14842..067a33c0f7 100644 --- a/mail/inc/class.mail_zpush.inc.php +++ b/mail/inc/class.mail_zpush.inc.php @@ -806,7 +806,7 @@ class mail_zpush implements activesync_plugin_write, activesync_plugin_sendmail, } } //$BCCmail=''; - if (count($mailAddr)>0) $mailObject->forceBccHeader(); + if (!empty($mailAddr)) $mailObject->forceBccHeader(); //$BCCmail = $mailObject->AddrAppend("Bcc",$mailAddr); foreach($folderArray as $folderName) { if($this->mail->isSentFolder($folderName)) { From 1ea91d8721f43c14e2cb5c014e9c087c6a52f930 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 12:43:03 +0100 Subject: [PATCH 09/15] fix/catch PHP 8.0 ValueError: mb_convert_encoding(): Argument #3 ($from_encoding) contains invalid encoding "cp1250" --- api/src/Translation.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/api/src/Translation.php b/api/src/Translation.php index 9fefc4f2d1..961177f7aa 100644 --- a/api/src/Translation.php +++ b/api/src/Translation.php @@ -947,9 +947,14 @@ class Translation { return utf8_decode($data); } - if (self::$mbstring && !$prefer_iconv && ($data = @mb_convert_encoding($data,$to,$from)) != '') - { - return $data; + try { + if (self::$mbstring && !$prefer_iconv && ($data = @mb_convert_encoding($data, $to, $from)) != '') + { + return $data; + } + } + catch (\ValueError $e) { + // ignore encodings unknown to mb_convert_encoding } if (function_exists('iconv')) { From c1dfa685ec0beb34cc9dc59b7ee50e0d29f2b372 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 12:47:05 +0100 Subject: [PATCH 10/15] fix PHP 8.0 TypeError: array_merge(): Argument #2 must be of type array, null given --- api/src/Etemplate/Widget/Customfields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/Etemplate/Widget/Customfields.php b/api/src/Etemplate/Widget/Customfields.php index 466ff5f5bc..51c975e7a0 100644 --- a/api/src/Etemplate/Widget/Customfields.php +++ b/api/src/Etemplate/Widget/Customfields.php @@ -405,7 +405,7 @@ class Customfields extends Transformer $all_readonly = $this->is_readonly($cname, $form_name); $value_in = self::get_array($content, $form_name); // if we have no id / use self::GLOBAL_ID, we have to set $value_in in global namespace for regular widgets validation to find - if (!$this->id) $content = array_merge($content, $value_in); + if (!$this->id) $content = array_merge($content, (array)$value_in); //error_log(__METHOD__."($cname, ...) form_name=$form_name, use-private={$this->attrs['use-private']}, value_in=".array2string($value_in)); if($this->getElementAttribute($form_name, 'customfields')) { From f74b3be7a870e8099de44ffba0a9f0ef6dd3c448 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 12:56:04 +0100 Subject: [PATCH 11/15] fix PHP 8.0 TypeError: Illegal offset type in Api\Categories::id2name() --- infolog/inc/class.infolog_tracking.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/infolog/inc/class.infolog_tracking.inc.php b/infolog/inc/class.infolog_tracking.inc.php index 23f3cfb302..59eee80294 100644 --- a/infolog/inc/class.infolog_tracking.inc.php +++ b/infolog/inc/class.infolog_tracking.inc.php @@ -212,6 +212,10 @@ class infolog_tracking extends Api\Storage\Tracking { $id = ' #'.$data['info_id']; } + if (is_array($data['info_cat'])) + { + $data['info_cat'] = array_shift($data['info_cat']); + } foreach(array( 'info_type' => lang($this->infolog->enums['type'][$data['info_type']]).$id, 'info_from' => $data['info_from'], From 3534ed9040c837d295964d38258ad472881f052c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 13:00:59 +0100 Subject: [PATCH 12/15] fix PHP 8.0 TypeError: calendar_tracking::track(): Argument #1 ($data) must be of type array, null given --- calendar/inc/class.calendar_boupdate.inc.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/calendar/inc/class.calendar_boupdate.inc.php b/calendar/inc/class.calendar_boupdate.inc.php index 320c409d28..fb664d3426 100644 --- a/calendar/inc/class.calendar_boupdate.inc.php +++ b/calendar/inc/class.calendar_boupdate.inc.php @@ -1829,12 +1829,13 @@ class calendar_boupdate extends calendar_bo } // Update history - $event = $this->read($cal_id, $recur_date, $ignore_acl, 'server'); - $tracking = new calendar_tracking($this); - $tracking->track($event, $old_event); - + if (($event = $this->read($cal_id, $recur_date, $ignore_acl, 'server'))) + { + $tracking = new calendar_tracking($this); + $tracking->track($event, $old_event); + } // notify the link-class about the update, as other apps may be subscribed to it - Link::notify_update('calendar',$event['id'],$event,"update"); + Link::notify_update('calendar', $cal_id, $event, "update"); } return $Ok; } From 577ff9dd26bd2354e1f58cad0dd9252ee98df9bb Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 13:55:48 +0100 Subject: [PATCH 13/15] fix unrelated XML errors sometimes shown parsing eTemplates --- api/src/Etemplate/Widget.php | 1 + 1 file changed, 1 insertion(+) diff --git a/api/src/Etemplate/Widget.php b/api/src/Etemplate/Widget.php index 35524bd8b3..ba144038dc 100644 --- a/api/src/Etemplate/Widget.php +++ b/api/src/Etemplate/Widget.php @@ -168,6 +168,7 @@ class Widget else { libxml_use_internal_errors(true); + libxml_clear_errors(); $reader = new XMLReader(); if (!$reader->XML($xml)) { From 519114ea1ac30ed256ea154ae2312824a91451f1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 15:23:25 +0100 Subject: [PATCH 14/15] fix PHP 8.0 TypeError: strlen(): Argument #1 ($str) must be of type string, array given --- admin/inc/class.admin_mail.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/admin/inc/class.admin_mail.inc.php b/admin/inc/class.admin_mail.inc.php index bcfe428a49..60a07707a3 100644 --- a/admin/inc/class.admin_mail.inc.php +++ b/admin/inc/class.admin_mail.inc.php @@ -431,12 +431,13 @@ class admin_mail 'acc_folder_archive' => array('', 'archive'), ) as $name => $common_names) { + unset($content[$name]); // first check special-use attributes if (($special_use = array_shift($common_names))) { foreach((array)$attributes[$special_use] as $mailbox) { - if (empty($content[$name]) || strlen($mailbox) < strlen($content[$name])) + if (empty($content[$name]) || is_string($mailbox) && strlen($mailbox) < strlen($content[$name])) { $content[$name] = $mailbox; } @@ -450,7 +451,7 @@ class admin_mail $delimiter = !empty($data['delimiter']) ? $data['delimiter'] : '.'; $name_parts = explode($delimiter, strtolower($mailbox)); if (array_intersect($name_parts, $common_names) && - (empty($content[$name]) || strlen($mailbox) < strlen($content[$name]) && substr($content[$name], 0, 6) != 'INBOX'.$delimiter)) + (empty($content[$name]) || is_string($mailbox) && strlen($mailbox) < strlen($content[$name]) && substr($content[$name], 0, 6) != 'INBOX'.$delimiter)) { //error_log(__METHOD__."() $mailbox --> ".substr($name, 11).' folder'); $content[$name] = $mailbox; From 2944a00e02de93458375156231456daa464a7be2 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 10 Nov 2021 16:59:47 +0100 Subject: [PATCH 15/15] fix PHP 8.0 TypeError: Cannot access offset of type string on string, when iCal exporting a GEO attributes --- calendar/inc/class.calendar_ical.inc.php | 18 ++++++++++++++++ infolog/inc/class.infolog_ical.inc.php | 27 +++++++++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 08ecee35ec..e0dfec10cb 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -871,6 +871,24 @@ class calendar_ical extends calendar_boupdate { $attr_name = 'X-EGROUPWARE-'.$attr_name; } + // fix certain stock fields like GEO, which are not in EGroupware schema, but Horde Icalendar requires a certain format + switch($name) + { + case '##GEO': + if (!is_array($value)) + { + if (strpos($value, ';')) + { + list($lat, $long) = explode(';', $value); + } + else + { + list($long, $lat) = explode(',', $value); + } + $value = ['latitude' => $lat, 'logitude' => $long]; + } + break; + } if ($value[0] === '{' && ($attr = json_decode($value, true)) && is_array($attr)) { // check if attribute was stored compressed --> uncompress it diff --git a/infolog/inc/class.infolog_ical.inc.php b/infolog/inc/class.infolog_ical.inc.php index 8b50ab690f..382baedea2 100644 --- a/infolog/inc/class.infolog_ical.inc.php +++ b/infolog/inc/class.infolog_ical.inc.php @@ -412,9 +412,30 @@ class infolog_ical extends infolog_bo { if (substr($name, 0, 2) == '##') { + if (($v = json_php_unserialize($value)) && is_array($v)) + { + $value = $v; + } + // fix certain stock fields like GEO, which are not in EGroupware schema, but Horde Icalendar requires a certain format + switch($name) + { + case '##GEO': + if (!is_array($value)) + { + if (strpos($value, ';') !== false) + { + list($lat, $long) = explode(';', $value); + } + else + { + list($long, $lat) = explode(',', $value); + } + $value = ['latitude' => $lat, 'logitude' => $long]; + } + break; + } if ($name[2] == ':') { - if (($v = json_php_unserialize($value)) && is_array($v)) $value = $v; foreach((array)$value as $compvData) { $comp = Horde_Icalendar::newComponent(substr($name,3), $vevent); @@ -422,9 +443,9 @@ class infolog_ical extends infolog_bo $vevent->addComponent($comp); } } - elseif (($attr = json_php_unserialize($value)) && is_array($attr)) + elseif (is_array($value)) { - $vevent->setAttribute(substr($name, 2), $attr['value'], $attr['params'], true, $attr['values']); + $vevent->setAttribute(substr($name, 2), $value['value'], $value['params'], true, $value['values']); } else {