From c6b77bea912a2a8fc0e76ba7ce161793edfc3f9b Mon Sep 17 00:00:00 2001 From: ralf Date: Thu, 24 Aug 2023 13:35:35 +0200 Subject: [PATCH] * AD: use thumbmailPhoto, if jpegPhoto is empty --- api/src/Accounts/Import.php | 6 ++++-- api/src/Contacts/Ads.php | 5 ++++- api/src/Contacts/Ldap.php | 35 +++++++++++++++++++++++++---------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/api/src/Accounts/Import.php b/api/src/Accounts/Import.php index 110a1c9ac0..9480a4b396 100644 --- a/api/src/Accounts/Import.php +++ b/api/src/Accounts/Import.php @@ -274,7 +274,7 @@ class Import do { $contact = $reconnected = null; - foreach ($this->contacts->search('', false, '', 'account_lid', '', '', 'AND', $start, $filter) as $contact) + foreach ($this->contacts->search('', false, '', ['account_lid', 'jpegphoto'], '', '', 'AND', $start, $filter) as $contact) { // if we have a regexp to filter the DN, continue on non-match if (!empty($GLOBALS['egw_info']['server']['account_import_dn_regexp']) && @@ -288,7 +288,9 @@ class Import $last_modified = $contact['modified']; } $account = $this->accounts->read($contact['account_id']); - $this->logger(++$num.'. User: '.json_encode($contact + $account, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), 'debug'); + // do NOT log binary content of image + $hide_binary = ['jpegphoto' => $contact['jpegphoto'] ? bytes($contact['jpegphoto']).' bytes binary data' : null]; + $this->logger(++$num.'. User: '.json_encode($hide_binary + $contact + $account, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE), 'debug'); // check if account exists in sql if (!($account_id = $this->accounts_sql->name2id($account['account_lid']))) { diff --git a/api/src/Contacts/Ads.php b/api/src/Contacts/Ads.php index b35e360116..f995f428bb 100644 --- a/api/src/Contacts/Ads.php +++ b/api/src/Contacts/Ads.php @@ -144,6 +144,7 @@ class Ads extends Ldap $this->all_attributes = array_merge($this->all_attributes,array_values($attributes)); } $this->all_attributes = array_values(array_unique($this->all_attributes)); + $this->all_attributes[] = 'thumbnailphoto'; // read as alternative to jpegphoto $this->charset = Api\Translation::charset(); } @@ -226,7 +227,9 @@ class Ads extends Ldap (isset ($_contact_id['id']) ? $_contact_id['id'] : $_contact_id['uid']); try { - $rows = $this->_searchLDAP($this->allContactsDN, $filter = $this->id_filter($contact_id), $this->all_attributes, Ldap::ALL); + $start = null; + $rows = $this->_searchLDAP($this->allContactsDN, $this->id_filter($contact_id), $this->all_attributes, Ldap::ALL, + null, null, $start, true); } catch (Api\Exception\AssertionFailed $e) { $rows = null; diff --git a/api/src/Contacts/Ldap.php b/api/src/Contacts/Ldap.php index f8a850d7eb..ea3d222f06 100644 --- a/api/src/Contacts/Ldap.php +++ b/api/src/Contacts/Ldap.php @@ -516,8 +516,9 @@ class Ldap if (is_array($contact_id)) $contact_id = isset ($contact_id['id']) ? $contact_id['id'] : $contact_id['uid']; $filter = $this->id_filter($contact_id); } - $rows = $this->_searchLDAP($this->allContactsDN, - $filter, $this->all_attributes, self::ALL, array('_posixaccount2egw')); + $start = null; + $rows = $this->_searchLDAP($this->allContactsDN, $filter, $this->all_attributes, self::ALL, + ['_posixaccount2egw'], null, $start, true); return $rows ? $rows[0] : false; } @@ -821,7 +822,7 @@ class Ldap function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) { //error_log(__METHOD__."(".array2string($criteria).", ".array2string($only_keys).", '$order_by', ".array2string($extra_cols).", '$wildcard', '$empty', '$op', ".array2string($start).", ".array2string($filter).")"); - unset($only_keys, $extra_cols, $empty, $join, $need_full_no_count); // not used, but required by function signature + $read_photo = $extra_cols ? in_array('jpegphoto', is_array($extra_cols) ? $extra_cols : explode(',', $extra_cols)) : false; if (is_array($filter['owner'])) { @@ -955,7 +956,7 @@ class Ldap $colFilter = $this->_colFilter($filter); $ldapFilter = "(&$objectFilter$searchFilter$colFilter$datefilter)"; //error_log(__METHOD__."(".array2string($criteria).", ".array2string($only_keys).", '$order_by', ".array2string($extra_cols).", '$wildcard', '$empty', '$op', ".array2string($start).", ".array2string($filter).") --> ldapFilter='$ldapFilter'"); - if (!($rows = $this->_searchLDAP($searchDN, $ldapFilter, $this->all_attributes, $addressbookType, [], $order_by, $start))) + if (!($rows = $this->_searchLDAP($searchDN, $ldapFilter, $this->all_attributes, $addressbookType, [], $order_by, $start, $read_photo))) { return $rows; } @@ -1212,9 +1213,10 @@ class Ldap * @param array $_skipPlugins =null schema-plugins to skip * @param string $order_by sql order string eg. "contact_email ASC" * @param null|int|array $start [$start, $num_rows], on return null, if result sorted and limited by server + * @param bool $read_photo true: return the binary content of the image, false: return true or false if there is an image or not * @return array/boolean with eGW contacts or false on error */ - function _searchLDAP($_ldapContext, $_filter, $_attributes, $_addressbooktype, array $_skipPlugins=null, $order_by=null, &$start=null) + function _searchLDAP($_ldapContext, $_filter, $_attributes, $_addressbooktype, array $_skipPlugins=null, $order_by=null, &$start=null, bool $read_photo=false) { $_attributes[] = 'entryUUID'; $_attributes[] = 'objectClass'; @@ -1300,6 +1302,11 @@ class Ldap { if (!is_int($i)) continue; // eg. count + if ($read_photo) + { + $result_entry = $i ? ldap_next_entry($this->ds, $result_entry) : ldap_first_entry($this->ds, $result); + } + $contact = array( 'id' => $entry['uid'][0] ?? $entry['entryuuid'][0], 'dn' => $entry['dn'], @@ -1329,15 +1336,23 @@ class Ldap $this->$objectclass2egw($contact,$entry); } } - // read binary jpegphoto only for one result == call by read - if ($this->total == 1 && isset($entry['jpegphoto'][0])) + // read photos from both jpegphoto and thumbnailphoto + if (isset($entry[$photo='jpegphoto'][0]) || isset($entry[$photo='thumbnailphoto'][0])) { - $bin = ldap_get_values_len($this->ds,ldap_first_entry($this->ds,$result),'jpegphoto'); - $contact['jpegphoto'] = $bin[0]; + // read binary jpegphoto only for one result == call by read + if ($read_photo) + { + $bin = ldap_get_values_len($this->ds, $result_entry, $photo); + $contact['jpegphoto'] = $bin[0]; + } + else + { + $contact['jpegphoto'] = true; + } } else { - $contact['jpegphoto'] = isset($entry['jpegphoto'][0]); + $contact['jpegphoto'] = false; } $matches = null; if(preg_match('/cn=([^,]+),'.preg_quote($this->personalContactsDN,'/').'$/i',$entry['dn'],$matches))