|
38 | 38 | use Calendar;
|
39 | 39 | use Change;
|
40 | 40 | use ChangeTemplate;
|
| 41 | +use ChangeValidation; |
41 | 42 | use CommonDBTM;
|
| 43 | +use CommonITILActor; |
42 | 44 | use CommonITILObject;
|
43 | 45 | use Entity;
|
44 | 46 | use Glpi\Api\HL\Doc as Doc;
|
|
54 | 56 | use PlanningEventCategory;
|
55 | 57 | use PlanningExternalEventTemplate;
|
56 | 58 | use Problem;
|
| 59 | +use Session; |
57 | 60 | use Ticket;
|
58 | 61 | use TicketTemplate;
|
| 62 | +use TicketValidation; |
59 | 63 | use User;
|
60 | 64 |
|
61 | 65 | #[Route(path: '/Assistance', requirements: [
|
@@ -201,6 +205,138 @@ public static function getRawKnownSchemas(): array
|
201 | 205 | foreach ($itil_types as $itil_type) {
|
202 | 206 | $schemas[$itil_type] = $base_schema;
|
203 | 207 | $schemas[$itil_type]['x-version-introduced'] = '2.0';
|
| 208 | + |
| 209 | + $schemas[$itil_type]['x-rights-conditions'] = [ |
| 210 | + 'read' => static function () use ($itil_type) { |
| 211 | + if (Session::haveRight($itil_type::$rightname, CommonITILObject::READALL)) { |
| 212 | + return true; // Can see all. No extra SQL conditions needed. |
| 213 | + } |
| 214 | + |
| 215 | + if ($itil_type !== Ticket::class) { |
| 216 | + if (Session::haveRight($itil_type::$rightname, CommonITILObject::READMY)) { |
| 217 | + $item = new $itil_type(); |
| 218 | + $group_table = $item->grouplinkclass::getTable(); |
| 219 | + $user_table = $item->userlinkclass::getTable(); |
| 220 | + $criteria = [ |
| 221 | + 'LEFT JOIN' => [ |
| 222 | + $user_table => [ |
| 223 | + 'ON' => [ |
| 224 | + $user_table => $itil_type::getForeignKeyField(), |
| 225 | + '_' => 'id', |
| 226 | + ], |
| 227 | + ], |
| 228 | + ], |
| 229 | + 'WHERE' => [ |
| 230 | + 'OR' => [ |
| 231 | + '_.users_id_recipient' => Session::getLoginUserID(), |
| 232 | + $user_table . '.users_id' => Session::getLoginUserID(), |
| 233 | + ], |
| 234 | + ], |
| 235 | + ]; |
| 236 | + |
| 237 | + if (!empty($_SESSION['glpigroups'])) { |
| 238 | + $criteria['LEFT JOIN'][$group_table] = [ |
| 239 | + 'ON' => [ |
| 240 | + $group_table => $itil_type::getForeignKeyField(), |
| 241 | + '_' => 'id', |
| 242 | + ], |
| 243 | + ]; |
| 244 | + $criteria['WHERE']['OR'][$group_table . '.groups_id'] = $_SESSION['glpigroups']; |
| 245 | + } |
| 246 | + return $criteria; |
| 247 | + } |
| 248 | + } else { |
| 249 | + // Tickets have expanded permissions |
| 250 | + $criteria = [ |
| 251 | + 'LEFT JOIN' => [ |
| 252 | + 'glpi_tickets_users' => [ |
| 253 | + 'ON' => [ |
| 254 | + 'glpi_tickets_users' => Ticket::getForeignKeyField(), |
| 255 | + '_' => 'id', |
| 256 | + ], |
| 257 | + ], |
| 258 | + 'glpi_groups_tickets' => [ |
| 259 | + 'ON' => [ |
| 260 | + 'glpi_groups_tickets' => Ticket::getForeignKeyField(), |
| 261 | + '_' => 'id', |
| 262 | + ], |
| 263 | + ], |
| 264 | + ], |
| 265 | + 'WHERE' => ['OR' => []], |
| 266 | + ]; |
| 267 | + if (Session::haveRight(Ticket::$rightname, CommonITILObject::READMY)) { |
| 268 | + // Permission to see tickets as direct requester, observer or writer |
| 269 | + $criteria['WHERE']['OR'][] = [ |
| 270 | + '_.users_id_recipient' => Session::getLoginUserID(), |
| 271 | + [ |
| 272 | + 'AND' => [ |
| 273 | + 'glpi_tickets_users' . '.users_id' => Session::getLoginUserID(), |
| 274 | + 'glpi_tickets_users' . '.type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER], |
| 275 | + ], |
| 276 | + ], |
| 277 | + ]; |
| 278 | + } |
| 279 | + if (!empty($_SESSION['glpigroups']) && Session::haveRight(Ticket::$rightname, Ticket::READGROUP)) { |
| 280 | + // Permission to see tickets as requester or observer group member |
| 281 | + $criteria['WHERE']['OR'][] = [ |
| 282 | + 'AND' => [ |
| 283 | + 'glpi_groups_tickets.groups_id' => $_SESSION['glpigroups'], |
| 284 | + 'glpi_groups_tickets.type' => [CommonITILActor::REQUESTER, CommonITILActor::OBSERVER], |
| 285 | + ], |
| 286 | + ]; |
| 287 | + } |
| 288 | + |
| 289 | + if (Session::haveRight(Ticket::$rightname, Ticket::OWN) || Session::haveRight(Ticket::$rightname, Ticket::READASSIGN)) { |
| 290 | + $criteria['WHERE']['OR'][] = [ |
| 291 | + 'AND' => [ |
| 292 | + 'glpi_tickets_users' . '.users_id' => Session::getLoginUserID(), |
| 293 | + 'glpi_tickets_users' . '.type' => CommonITILActor::ASSIGN, |
| 294 | + ], |
| 295 | + ]; |
| 296 | + } |
| 297 | + if (Session::haveRight(Ticket::$rightname, Ticket::READASSIGN)) { |
| 298 | + $criteria['WHERE']['OR'][] = [ |
| 299 | + 'AND' => [ |
| 300 | + 'glpi_groups_tickets.groups_id' => $_SESSION['glpigroups'], |
| 301 | + 'glpi_groups_tickets.type' => CommonITILActor::ASSIGN, |
| 302 | + ], |
| 303 | + ]; |
| 304 | + } |
| 305 | + if (Session::haveRight(Ticket::$rightname, Ticket::READNEWTICKET)) { |
| 306 | + $criteria['WHERE']['OR'][] = [ |
| 307 | + '_.status' => CommonITILObject::INCOMING, |
| 308 | + ]; |
| 309 | + } |
| 310 | + |
| 311 | + if ( |
| 312 | + Session::haveRightsOr( |
| 313 | + 'ticketvalidation', |
| 314 | + [\TicketValidation::VALIDATEINCIDENT, |
| 315 | + \TicketValidation::VALIDATEREQUEST, |
| 316 | + ] |
| 317 | + ) |
| 318 | + ) { |
| 319 | + $criteria['OR'][] = [ |
| 320 | + 'AND' => [ |
| 321 | + "glpi_ticketvalidations.itemtype_target" => User::class, |
| 322 | + "glpi_ticketvalidations.items_id_target" => Session::getLoginUserID(), |
| 323 | + ], |
| 324 | + ]; |
| 325 | + if (count($_SESSION['glpigroups'])) { |
| 326 | + $criteria['OR'][] = [ |
| 327 | + 'AND' => [ |
| 328 | + "glpi_ticketvalidations.itemtype_target" => Group::class, |
| 329 | + "glpi_ticketvalidations.items_id_target" => $_SESSION['glpigroups'], |
| 330 | + ], |
| 331 | + ]; |
| 332 | + } |
| 333 | + } |
| 334 | + return empty($criteria['WHERE']['OR']) ? false : $criteria; |
| 335 | + } |
| 336 | + return false; // Cannot see anything. |
| 337 | + }, |
| 338 | + ]; |
| 339 | + |
204 | 340 | if ($itil_type === Ticket::class) {
|
205 | 341 | $schemas[$itil_type]['properties']['type'] = [
|
206 | 342 | 'type' => Doc\Schema::TYPE_INTEGER,
|
@@ -469,12 +605,36 @@ public static function getRawKnownSchemas(): array
|
469 | 605 |
|
470 | 606 | $schemas['TicketValidation'] = $base_validation_schema;
|
471 | 607 | $schemas['TicketValidation']['x-version-introduced'] = '2.0';
|
472 |
| - $schemas['TicketValidation']['x-itemtype'] = \TicketValidation::class; |
| 608 | + $schemas['TicketValidation']['x-itemtype'] = TicketValidation::class; |
| 609 | + $schemas['TicketValidation']['x-rights-conditions'] = [ |
| 610 | + 'read' => static function () { |
| 611 | + return Session::haveRightsOr( |
| 612 | + TicketValidation::$rightname, |
| 613 | + array_merge( |
| 614 | + TicketValidation::getCreateRights(), |
| 615 | + TicketValidation::getValidateRights(), |
| 616 | + TicketValidation::getPurgeRights() |
| 617 | + ) |
| 618 | + ); |
| 619 | + }, |
| 620 | + ]; |
473 | 621 | $schemas['TicketValidation']['properties'][Ticket::getForeignKeyField()] = ['type' => Doc\Schema::TYPE_INTEGER, 'format' => Doc\Schema::FORMAT_INTEGER_INT64];
|
474 | 622 |
|
475 | 623 | $schemas['ChangeValidation'] = $base_validation_schema;
|
476 | 624 | $schemas['ChangeValidation']['x-version-introduced'] = '2.0';
|
477 |
| - $schemas['ChangeValidation']['x-itemtype'] = \ChangeValidation::class; |
| 625 | + $schemas['ChangeValidation']['x-itemtype'] = ChangeValidation::class; |
| 626 | + $schemas['ChangeValidation']['x-rights-conditions'] = [ |
| 627 | + 'read' => static function () { |
| 628 | + return Session::haveRightsOr( |
| 629 | + ChangeValidation::$rightname, |
| 630 | + array_merge( |
| 631 | + ChangeValidation::getCreateRights(), |
| 632 | + ChangeValidation::getValidateRights(), |
| 633 | + ChangeValidation::getPurgeRights() |
| 634 | + ) |
| 635 | + ); |
| 636 | + }, |
| 637 | + ]; |
478 | 638 | $schemas['ChangeValidation']['properties'][Change::getForeignKeyField()] = ['type' => Doc\Schema::TYPE_INTEGER, 'format' => Doc\Schema::FORMAT_INTEGER_INT64];
|
479 | 639 |
|
480 | 640 | $schemas['RecurringTicket'] = [
|
|
0 commit comments