diff --git a/addressbook/inc/class.addressbook_ui.inc.php b/addressbook/inc/class.addressbook_ui.inc.php index f0a4e03016..ef579fea64 100644 --- a/addressbook/inc/class.addressbook_ui.inc.php +++ b/addressbook/inc/class.addressbook_ui.inc.php @@ -162,14 +162,21 @@ class addressbook_ui extends addressbook_bo { $success = $failed = $action_msg = null; if ($this->action($_content['nm']['action'],$_content['nm']['selected'],$_content['nm']['select_all'], - $success,$failed,$action_msg,'index',$msg,$_content['nm']['checkboxes'])) + $success,$failed,$action_msg,'index',$msg,$_content['nm']['checkboxes'], $error_msg)) { $msg .= lang('%1 contact(s) %2',$success,$action_msg); Framework::message($msg); } elseif(is_null($msg)) { - $msg .= lang('%1 contact(s) %2, %3 failed because of insufficent rights !!!',$success,$action_msg,$failed); + if (empty($error_msg)) + { + $msg .= lang('%1 contact(s) %2, %3 failed because of insufficent rights !!!', $success, $action_msg, $failed); + } + else + { + $msg .= lang('%1 contact(s) %2, %3 failed because of %4 !!!', $success, $action_msg, $failed, $error_msg); + } Framework::message($msg,'error'); } $msg = ''; @@ -1213,12 +1220,14 @@ class addressbook_ui extends addressbook_bo * @param int &$failed number of failed actions (not enought permissions) * @param string &$action_msg translated verb for the actions, to be used in a message like %1 contacts 'deleted' * @param string/array $session_name 'index' or array with session-data depending if we are in the main list or the popup + * @param ?string& $error_msg on return optional error-message * @return boolean true if all actions succeded, false otherwise */ - function action($action,$checked,$use_all,&$success,&$failed,&$action_msg,$session_name,&$msg, $checkboxes = NULL) + function action($action, $checked, $use_all, &$success, &$failed, &$action_msg, $session_name, &$msg, $checkboxes = NULL, &$error_msg=null) { //echo "

uicontacts::action('$action',".print_r($checked,true).','.(int)$use_all.",...)

\n"; $success = $failed = 0; + $error_msg = null; if ($use_all || in_array($action,array('remove_from_list','delete_list','unshare'))) { // get the whole selection @@ -1509,8 +1518,10 @@ class addressbook_ui extends addressbook_bo 'shared_at' => new Api\DateTime('now'), // only allow to share writable, if user has edit-rights! 'shared_writable' => (int)($checkboxes['writable'] && $this->check_perms(Acl::EDIT, $contact)), + 'contact_id' => $id, + 'contact' => $contact, ]]; - if ($this->check_shared_with($new_shared_with)) // returns [] if OK + if ($this->check_shared_with($new_shared_with, $error_msg)) // returns [] if OK { $Ok = false; } @@ -2765,7 +2776,7 @@ class addressbook_ui extends addressbook_bo /** * Check if user has right to share with / into given AB * - * @param array $_data values for keys "shared_writable" and "shared_values" + * @param array $_data values for keys "shared_writable", "shared_values" and "contact" * @return array of entries removed from $shared_with because current user is not allowed to share into */ public function ajax_check_shared(array $_data) @@ -2787,11 +2798,12 @@ class addressbook_ui extends addressbook_bo { $shared[$value] = array_combine(['shared_id', 'shared_with', 'shared_by', 'shared_writable'], explode(':', $value)); } + $shared[$value]['contact'] = $_data['contact']; } - if (($failed = $this->check_shared_with($shared))) + if (($failed = $this->check_shared_with($shared, $error))) { $response->data(array_keys($failed)); - $response->message(lang('You are not allowed to share into the addressbook of %1', + $response->message($error ?: lang('You are not allowed to share into the addressbook of %1', implode(', ', array_map(function ($data) { return Api\Accounts::username($data['shared_with']); }, $failed))), 'error'); diff --git a/addressbook/js/app.js b/addressbook/js/app.js index e31c24b66c..1d193399ce 100644 --- a/addressbook/js/app.js +++ b/addressbook/js/app.js @@ -1229,6 +1229,7 @@ var AddressbookApp = /** @class */ (function (_super) { var value = (_a = shared) === null || _a === void 0 ? void 0 : _a.get_value(); if (value) { this.egw.json('addressbook.addressbook_ui.ajax_check_shared', [{ + contact: this.et2.getInstanceManager().getValues(this.et2), shared_values: value, shared_writable: this.et2.getInputWidgetById('shared_writable').get_value() }], function (_data) { diff --git a/addressbook/js/app.ts b/addressbook/js/app.ts index 95c3954b4d..18db4b1d86 100644 --- a/addressbook/js/app.ts +++ b/addressbook/js/app.ts @@ -1488,6 +1488,7 @@ class AddressbookApp extends EgwApp if (value) { this.egw.json('addressbook.addressbook_ui.ajax_check_shared', [{ + contact: this.et2.getInstanceManager().getValues(this.et2), // for sharing policy shared_values: value, shared_writable: this.et2.getInputWidgetById('shared_writable').get_value() }], _data => { diff --git a/addressbook/lang/egw_de.lang b/addressbook/lang/egw_de.lang index 53724700f1..db83580086 100644 --- a/addressbook/lang/egw_de.lang +++ b/addressbook/lang/egw_de.lang @@ -1,6 +1,7 @@ %1 added addressbook de %1 hinzugefügt %1 contact(s) %2 addressbook de %1 Kontakt(e) %2 -%1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook de %1 Kontakt(e) %2, %3 nicht wegen fehlender Rechte !!! +%1 contact(s) %2, %3 failed because of %4 !!! addressbook de %1 Kontakt(e) %2, %3 nicht da %4! +%1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook de %1 Kontakt(e) %2, %3 nicht wegen fehlender Rechte! %1 contacts updated (%2 errors). addressbook de %1 Kontakte aktualisiert (%2 Fehler). %1 fields in %2 other organisation member(s) changed addressbook de %1 Felder in %2 Mitglied(ern) der Organisation geändert %1 key(s) added to public keyserver "%2". addressbook de %1 Schlüssel wurden dem öffentlichen Schlüsselserver "%2" eingetragen. @@ -433,7 +434,6 @@ replacements for inserting contacts into documents addressbook de Platzhalter f required fields * addressbook de unbedingt auszufüllende Felder * role addressbook de Beruf room addressbook de Raum -schedule a video conference addressbook de Videokonferenz planen search letter addressbook de Suche nach Buchstaben select a portrait format jpeg photo. it will be resized to 60 pixel width. addressbook de Wählen Sie ein hochformatiges jpeg Foto. Es wird 60 Pixel breit skaliert. select a source address to be used in geolocation routing system addressbook de Legen Sie fest, wie der Startpunkt für die Routenplanung gesetzt wird. diff --git a/addressbook/lang/egw_en.lang b/addressbook/lang/egw_en.lang index 8b38d377ea..df1006285f 100644 --- a/addressbook/lang/egw_en.lang +++ b/addressbook/lang/egw_en.lang @@ -1,5 +1,6 @@ %1 added addressbook en %1 added %1 contact(s) %2 addressbook en %1 contact(s) %2 +%1 contact(s) %2, %3 failed because of %4 !!! addressbook en %1 contact(s) %2, %3 failed because of %4 !!! %1 contact(s) %2, %3 failed because of insufficent rights !!! addressbook en %1 contact(s) %2, %3 failed because of insufficient rights! %1 contacts updated (%2 errors). addressbook en %1 contacts updated (%2 errors). %1 fields in %2 other organisation member(s) changed addressbook en %1 fields in %2 other organization member(s) changed. @@ -433,7 +434,6 @@ replacements for inserting contacts into documents addressbook en Replacements f required fields * addressbook en Required fields * role addressbook en Occupation room addressbook en Room -schedule a video conference addressbook en Schedule a video conference search letter addressbook en Search letter select a portrait format jpeg photo. it will be resized to 60 pixel width. addressbook en Select a portrait format jpeg photo. It will be re-sized to 60 pixel width. select a source address to be used in geolocation routing system addressbook en Select a source address to be used in GeoLocation routing system diff --git a/admin/inc/class.admin_cmd.inc.php b/admin/inc/class.admin_cmd.inc.php index b95b98c965..3e2456285b 100644 --- a/admin/inc/class.admin_cmd.inc.php +++ b/admin/inc/class.admin_cmd.inc.php @@ -606,6 +606,10 @@ abstract class admin_cmd $class = 'EGroupware\\' . $class; $label = $class::name(); } + else + { + unset($labels[$class]); + } } // sort them alphabetic diff --git a/api/src/Contacts.php b/api/src/Contacts.php index 906c354dc8..b67b09a4ac 100755 --- a/api/src/Contacts.php +++ b/api/src/Contacts.php @@ -1283,9 +1283,10 @@ class Contacts extends Contacts\Storage * Check if user has right to share with / into given AB * * @param array[]& $shared_with array of arrays with values for keys "shared_with", "shared_by", ... + * @param ?string& $error on return error-message * @return array entries removed from $shared_with because current user is not allowed to share into (key is preserved) */ - function check_shared_with(array &$shared_with=null) + function check_shared_with(array &$shared_with=null, &$error=null) { $removed = []; foreach((array)$shared_with as $key => $shared) @@ -1304,6 +1305,21 @@ class Contacts extends Contacts\Storage unset($shared_with[$key]); } } + // allow apps to modifiy + $results = []; + foreach(Hooks::process([ + 'location' => 'check_shared_with', + 'shared_with' => &$shared_with, + 'removed' => &$removed, + ], true) as $result) + { + if ($result) + { + $results = array_merge($results, $result); + } + } + if ($results) $error = implode("\n", $results); + return $removed; }