ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilFileObjectRBACDatabaseSteps.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
27 {
28  public const EDIT_FILE = "edit_file";
30 
31  public function prepare(ilDBInterface $db): void
32  {
33  $this->database = $db;
34  }
35 
36  protected function getOpsID(ilDBInterface $db, string $operation): ?int
37  {
38  $res = $db->queryF(
39  "SELECT ops_id FROM rbac_operations WHERE operation = %s",
40  ["text"],
41  [self::EDIT_FILE]
42  );
43 
44  return $db->fetchAssoc($res)['ops_id'] ?? null;
45  }
46 
50  public function step_1(): void
51  {
52  $edit_file_ops_id = $this->getOpsID($this->database, self::EDIT_FILE);
53 
54  $q = "SELECT
55  rbac_pa.rol_id,
56  rbac_pa.ops_id,
57  rbac_pa.ref_id
58  FROM rbac_pa
59  JOIN object_reference ON rbac_pa.ref_id = object_reference.ref_id
60  JOIN object_data ON object_reference.obj_id = object_data.obj_id
61  WHERE object_data.type = 'file';
62  ";
63 
64  $res = $this->database->query($q);
65  while ($row = $this->database->fetchAssoc($res)) {
66  $ops_ids = unserialize($row['ops_id'], ['allowed_classes' => false]);
67  if (in_array(4, $ops_ids, false) && !in_array($edit_file_ops_id, $ops_ids, false)) {
68  $ops_ids[] = $edit_file_ops_id;
69  $ops_ids = array_unique($ops_ids);
70  $new_ops_ids = serialize($ops_ids);
71  $this->database->update(
72  "rbac_pa",
73  [
74  'ops_id' => ['text', $new_ops_ids]
75  ],
76  [
77  'rol_id' => ['integer', $row['rol_id']],
78  'ref_id' => ['integer', $row['ref_id']]
79  ]
80  );
81  }
82  }
83  }
84 
88  public function step_2(): void
89  {
90  $edit_file_ops_id = $this->getOpsID($this->database, self::EDIT_FILE);
91 
92  $q = "SELECT * from rbac_templates WHERE type = %s AND ops_id = %s";
93  $res = $this->database->queryF(
94  $q,
95  ['text', 'integer'],
96  ['file', 4]
97  );
98  while ($row = $this->database->fetchAssoc($res)) {
99  try {
100  $this->database->insert(
101  "rbac_templates",
102  [
103  'type' => ['text', 'file'],
104  'ops_id' => ['integer', $edit_file_ops_id],
105  'rol_id' => ['integer', $row['rol_id']],
106  'parent' => ['integer', $row['parent']]
107  ]
108  );
109  } catch (Throwable) {
110  };
111  }
112  }
113 
114  public function step_3(): void
115  {
116  $read_position = $this->database->fetchAssoc(
117  $this->database->queryF(
118  "SELECT op_order FROM rbac_operations WHERE operation = %s",
119  ['text'],
120  [Permissions::READ->value]
121  )
122  )['op_order'] ?? 2000;
123 
124  // update position of view_content operation
125  $this->database->update(
126  "rbac_operations",
127  [
128  'op_order' => ['integer', $read_position + 1]
129  ],
130  [
131  'operation' => ['text', Permissions::VIEW_CONTENT->value]
132  ]
133  );
134  }
135 }
getOpsID(ilDBInterface $db, string $operation)
$res
Definition: ltiservices.php:66
fetchAssoc(ilDBStatement $statement)
step_2()
add to all templates which already have the "edit" operation assigned fo files
step_1()
assign to all roles which already have the "edit" operation assigned fo files
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
queryF(string $query, array $types, array $values)
$q
Definition: shib_logout.php:23