19 declare(strict_types=1);
28 protected int $role_id,
29 protected bool $localize =
true,
36 $this->db = $db ?? $DIC->database();
37 $this->
lng = $lng ?? $DIC->language();
102 $query =
'SELECT rdat.title role_title, odat.title object_title, ' .
103 ' oref.ref_id object_ref ' .
104 'FROM object_data rdat ' .
105 'INNER JOIN role_data roledat ON roledat.role_id = rdat.obj_id ' .
106 'INNER JOIN rbac_fa fa ON fa.rol_id = rdat.obj_id AND fa.assign = ' . $this->db->quote(
'y',
ilDBConstants::T_TEXT) .
' ' .
107 'INNER JOIN tree rtree ON rtree.child = fa.parent ' .
108 'INNER JOIN object_reference oref ON oref.ref_id = rtree.child ' .
109 'INNER JOIN object_data odat ON odat.obj_id = oref.obj_id ' .
111 $res = $this->db->query($query);
112 if (($row = $this->db->fetchObject(
$res)) ===
null) {
116 $object_title = $row->object_title;
117 $object_ref = (
int) $row->object_ref;
118 $role_title = $row->role_title;
123 $domain = $object_title;
124 $local_part = $role_title;
127 $q =
'SELECT COUNT(DISTINCT dat.obj_id) AS count ' .
128 'FROM object_data dat ' .
129 'INNER JOIN object_reference ref ON ref.obj_id = dat.obj_id AND ref.deleted IS NULL ' .
130 'INNER JOIN tree ON tree.child = ref.ref_id AND tree.tree = ' . $this->db->quote(1,
ilDBConstants::T_INTEGER) .
' ' .
132 $res = $this->db->query(
$q);
133 $row = $this->db->fetchObject(
$res);
136 if ($row->count !== 1) {
144 if ($domain !==
null && preg_match(
'/[\[\]\\]|[\x00-\x1f]|[\x28-\x29]|[;]/', (
string) $domain)) {
150 if ($domain !==
null &&
151 (preg_match(
'/[()<>@,;:\\".\[\]]/', (
string) $domain) ||
152 preg_match(
'/[^\x21-\x8f]/', (
string) $domain))
154 $domain =
'[' . $domain .
']';
160 if ($domain !==
null && str_starts_with($role_title,
'il_')) {
161 $unambiguous_role_title = $role_title;
163 $pos = strpos($role_title,
'_', 3) + 1;
164 $local_part = substr(
167 strrpos($role_title,
'_') - $pos
170 $unambiguous_role_title =
'il_role_' . $this->role_id;
177 if ($domain ===
null) {
179 $q =
'SELECT COUNT(DISTINCT rdat.role_id) AS count ' .
180 'FROM object_data dat ' .
181 'INNER JOIN role_data rdat ON rdat.role_id = dat.obj_id ' .
182 'INNER JOIN rbac_fa fa ON fa.rol_id = rdat.role_id ' .
183 'INNER JOIN tree t ON t.child = fa.parent ' .
184 'INNER JOIN object_reference oref ON oref.ref_id = t.child ' .
187 $q =
'SELECT COUNT(rd.obj_id) AS count ' .
188 'FROM object_data rd ' .
189 'INNER JOIN rbac_fa fa ON fa.rol_id = rd.obj_id AND fa.assign = ' . $this->db->quote(
'y',
ilDBConstants::T_TEXT) .
' ' .
190 'INNER JOIN tree t ON t.child = fa.parent AND t.child = ' . $this->db->quote($object_ref,
ilDBConstants::T_INTEGER) .
' ' .
191 'WHERE rd.title LIKE ' . $this->db->quote(
192 '%' . preg_replace(
'/([_%])/',
'\\\\$1', $local_part) .
'%',
197 $res = $this->db->query(
$q);
198 $row = $this->db->fetchObject(
$res);
202 if ($row->count !== 1) {
203 $local_part = $unambiguous_role_title;
210 if (preg_match(
'/[\\"\x00-\x1f]/', (
string) $local_part)) {
211 $local_part = $unambiguous_role_title;
212 } elseif (!preg_match(
'/^[\\x00-\\x7E]+$/i', (
string) $local_part)) {
214 $local_part = $unambiguous_role_title;
219 $local_part =
'#' . $local_part;
222 if (preg_match(
'/[()<>@,;:.\[\]\x20]/', $local_part)) {
223 $local_part =
'"' . $local_part .
'"';
226 $mailbox = ($domain ===
null) ?
228 $local_part .
'@' . $domain;
230 if ($this->localize) {
231 if (str_starts_with($role_title,
'il_')) {
232 $phrase = $this->
lng->txt(substr($role_title, 0, strrpos($role_title,
'_')));
234 $phrase = $role_title;
241 $phrase = preg_replace(
'/\s\s+/',
' ', $phrase);
242 $phrase = preg_replace(
'/[()<>@,;:\\".\[\]]/',
'', $phrase);
244 $mailbox = $phrase .
' <' . $mailbox .
'>';
249 $parser = $this->parser_factory->getParser($mailbox);
254 $res = $this->db->query(
257 INNER JOIN role_data rd ON rd.role_id = od.obj_id 261 FROM object_data maybe_same_role_od 262 INNER JOIN role_data maybe_same_role_rd ON maybe_same_role_rd.role_id = maybe_same_role_od.obj_id 263 WHERE maybe_same_role_od.title = od.title 264 AND maybe_same_role_od.obj_id != od.obj_id 267 if (($row = $this->db->fetchObject(
$res)) !==
null) {
268 return '#' . $row->title;
271 return '#il_role_' . $this->role_id;
value()
Returns the mailbox address of a role.
ilMailRfc822AddressParserFactory $parser_factory
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
__construct(protected int $role_id, protected bool $localize=true, ?ilMailRfc822AddressParserFactory $parser_factory=null, ?ilDBInterface $db=null, ?ilLanguage $lng=null)