diff --git a/src/Controller/AdminPages/AttachmentTypeController.php b/src/Controller/AdminPages/AttachmentTypeController.php index b65b406d..1d439a86 100644 --- a/src/Controller/AdminPages/AttachmentTypeController.php +++ b/src/Controller/AdminPages/AttachmentTypeController.php @@ -56,9 +56,22 @@ class AttachmentTypeController extends BaseAdminController protected $route_base = 'attachment_type'; protected $attachment_class = AttachmentTypeAttachment::class; + /** + * @Route("/{id}", name="attachment_type_delete", methods={"DELETE"}) + * @param Request $request + * @param AttachmentType $entity + * @param StructuralElementRecursionHelper $recursionHelper + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function delete(Request $request, AttachmentType $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="attachment_type_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) * @param AttachmentType $entity * @param Request $request * @param EntityManagerInterface $em @@ -83,18 +96,6 @@ class AttachmentTypeController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="attachment_type_delete", methods={"DELETE"}) - * @param Request $request - * @param AttachmentType $entity - * @param StructuralElementRecursionHelper $recursionHelper - * @return \Symfony\Component\HttpFoundation\RedirectResponse - */ - public function delete(Request $request, AttachmentType $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="attachment_type_export_all") * @param Request $request diff --git a/src/Controller/AdminPages/BaseAdminController.php b/src/Controller/AdminPages/BaseAdminController.php index 2f47e6a8..df7fb4e8 100644 --- a/src/Controller/AdminPages/BaseAdminController.php +++ b/src/Controller/AdminPages/BaseAdminController.php @@ -264,6 +264,8 @@ abstract class BaseAdminController extends AbstractController $entityManager->flush(); $this->addFlash('success', 'attachment_type.deleted'); + } else { + $this->addFlash('error', 'csfr_invalid'); } return $this->redirectToRoute($this->route_base . '_new'); diff --git a/src/Controller/AdminPages/CategoryController.php b/src/Controller/AdminPages/CategoryController.php index 6b32a794..d26bd6a1 100644 --- a/src/Controller/AdminPages/CategoryController.php +++ b/src/Controller/AdminPages/CategoryController.php @@ -56,9 +56,21 @@ class CategoryController extends BaseAdminController protected $route_base = 'category'; protected $attachment_class = CategoryAttachment::class; + /** + * @Route("/{id}", name="category_delete", methods={"DELETE"}) + * @param Request $request + * @param Category $entity + * @param StructuralElementRecursionHelper $recursionHelper + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function delete(Request $request, Category $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="category_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) * @param Category $entity * @param Request $request * @param EntityManagerInterface $em @@ -83,18 +95,6 @@ class CategoryController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="category_delete", methods={"DELETE"}) - * @param Request $request - * @param Category $entity - * @param StructuralElementRecursionHelper $recursionHelper - * @return \Symfony\Component\HttpFoundation\RedirectResponse - */ - public function delete(Request $request, Category $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="category_export_all") * @param EntityManagerInterface $em diff --git a/src/Controller/AdminPages/CurrencyController.php b/src/Controller/AdminPages/CurrencyController.php index 03c8d5c9..79695268 100644 --- a/src/Controller/AdminPages/CurrencyController.php +++ b/src/Controller/AdminPages/CurrencyController.php @@ -57,9 +57,21 @@ class CurrencyController extends BaseAdminController protected $route_base = 'currency'; protected $attachment_class = CurrencyAttachment::class; + /** + * @Route("/{id}", name="currency_delete", methods={"DELETE"}) + * @param Request $request + * @param Currency $entity + * @param StructuralElementRecursionHelper $recursionHelper + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function delete(Request $request, Currency $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="currency_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) * @param Currency $entity * @param Request $request * @param EntityManagerInterface $em @@ -84,18 +96,6 @@ class CurrencyController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="currency_delete", methods={"DELETE"}) - * @param Request $request - * @param Currency $entity - * @param StructuralElementRecursionHelper $recursionHelper - * @return \Symfony\Component\HttpFoundation\RedirectResponse - */ - public function delete(Request $request, Currency $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="currency_export_all") * @param EntityManagerInterface $em diff --git a/src/Controller/AdminPages/DeviceController.php b/src/Controller/AdminPages/DeviceController.php index 26f48509..6149d523 100644 --- a/src/Controller/AdminPages/DeviceController.php +++ b/src/Controller/AdminPages/DeviceController.php @@ -56,9 +56,21 @@ class DeviceController extends BaseAdminController protected $route_base = 'device'; protected $attachment_class = DeviceAttachment::class; + /** + * @Route("/{id}", name="device_delete", methods={"DELETE"}) + * @param Request $request + * @param Device $entity + * @param StructuralElementRecursionHelper $recursionHelper + * @return \Symfony\Component\HttpFoundation\RedirectResponse + */ + public function delete(Request $request, Device $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="device_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) * @param Device $entity * @param Request $request * @param EntityManagerInterface $em @@ -83,18 +95,6 @@ class DeviceController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="device_delete", methods={"DELETE"}) - * @param Request $request - * @param Device $entity - * @param StructuralElementRecursionHelper $recursionHelper - * @return \Symfony\Component\HttpFoundation\RedirectResponse - */ - public function delete(Request $request, Device $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="device_export_all") * @param EntityManagerInterface $em diff --git a/src/Controller/AdminPages/FootprintController.php b/src/Controller/AdminPages/FootprintController.php index 3bc41386..29044236 100644 --- a/src/Controller/AdminPages/FootprintController.php +++ b/src/Controller/AdminPages/FootprintController.php @@ -60,9 +60,18 @@ class FootprintController extends BaseAdminController protected $route_base = 'footprint'; protected $attachment_class = FootprintAttachment::class; + /** + * @Route("/{id}", name="footprint_delete", methods={"DELETE"}) + */ + public function delete(Request $request, Footprint $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="footprint_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) */ public function edit(Footprint $entity, Request $request, EntityManagerInterface $em) { @@ -80,14 +89,6 @@ class FootprintController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="footprint_delete", methods={"DELETE"}) - */ - public function delete(Request $request, Footprint $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="footprint_export_all") * @param Request $request diff --git a/src/Controller/AdminPages/ManufacturerController.php b/src/Controller/AdminPages/ManufacturerController.php index 895e8088..66dc9336 100644 --- a/src/Controller/AdminPages/ManufacturerController.php +++ b/src/Controller/AdminPages/ManufacturerController.php @@ -58,9 +58,17 @@ class ManufacturerController extends BaseAdminController protected $route_base = 'manufacturer'; protected $attachment_class = ManufacturerAttachment::class; + /** + * @Route("/{id}", name="manufacturer_delete", methods={"DELETE"}) + */ + public function delete(Request $request, Manufacturer $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="manufacturer_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) */ public function edit(Manufacturer $entity, Request $request, EntityManagerInterface $em) { @@ -78,13 +86,7 @@ class ManufacturerController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="manufacturer_delete", methods={"DELETE"}) - */ - public function delete(Request $request, Manufacturer $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } + /** * @Route("/export", name="manufacturer_export_all") diff --git a/src/Controller/AdminPages/MeasurementUnitController.php b/src/Controller/AdminPages/MeasurementUnitController.php index 790e401d..9eb0ed5a 100644 --- a/src/Controller/AdminPages/MeasurementUnitController.php +++ b/src/Controller/AdminPages/MeasurementUnitController.php @@ -58,9 +58,17 @@ class MeasurementUnitController extends BaseAdminController protected $route_base = 'measurement_unit'; protected $attachment_class = MeasurementUnitAttachment::class; + /** + * @Route("/{id}", name="measurement_unit_delete", methods={"DELETE"}) + */ + public function delete(Request $request, MeasurementUnit $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="measurement_unit_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) */ public function edit(MeasurementUnit $entity, Request $request, EntityManagerInterface $em) { @@ -78,14 +86,6 @@ class MeasurementUnitController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="measurement_unit_delete", methods={"DELETE"}) - */ - public function delete(Request $request, MeasurementUnit $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="measurement_unit_export_all") * @param Request $request diff --git a/src/Controller/AdminPages/StorelocationController.php b/src/Controller/AdminPages/StorelocationController.php index cf4f80f0..5d86593b 100644 --- a/src/Controller/AdminPages/StorelocationController.php +++ b/src/Controller/AdminPages/StorelocationController.php @@ -57,9 +57,18 @@ class StorelocationController extends BaseAdminController protected $route_base = 'store_location'; protected $attachment_class = StorelocationAdminForm::class; + /** + * @Route("/{id}", name="store_location_delete", methods={"DELETE"}) + */ + public function delete(Request $request, Storelocation $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="store_location_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) */ public function edit(Storelocation $entity, Request $request, EntityManagerInterface $em) { @@ -77,14 +86,6 @@ class StorelocationController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="store_location_delete", methods={"DELETE"}) - */ - public function delete(Request $request, Storelocation $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } - /** * @Route("/export", name="store_location_export_all") * @param Request $request diff --git a/src/Controller/AdminPages/SupplierController.php b/src/Controller/AdminPages/SupplierController.php index d11a915a..ed5400eb 100644 --- a/src/Controller/AdminPages/SupplierController.php +++ b/src/Controller/AdminPages/SupplierController.php @@ -57,9 +57,17 @@ class SupplierController extends BaseAdminController protected $route_base = 'supplier'; protected $attachment_class = SupplierAttachment::class; + /** + * @Route("/{id}", name="supplier_delete", methods={"DELETE"}) + */ + public function delete(Request $request, Supplier $entity, StructuralElementRecursionHelper $recursionHelper) + { + return $this->_delete($request, $entity, $recursionHelper); + } + /** * @Route("/{id}/edit", requirements={"id"="\d+"}, name="supplier_edit") - * @Route("/{id}/", requirements={"id"="\d+"}) + * @Route("/{id}", requirements={"id"="\d+"}) */ public function edit(Supplier $entity, Request $request, EntityManagerInterface $em) { @@ -77,13 +85,6 @@ class SupplierController extends BaseAdminController return $this->_new($request, $em, $importer); } - /** - * @Route("/{id}", name="supplier_delete", methods={"DELETE"}) - */ - public function delete(Request $request, Supplier $entity, StructuralElementRecursionHelper $recursionHelper) - { - return $this->_delete($request, $entity, $recursionHelper); - } /** * @Route("/export", name="supplier_export_all") diff --git a/src/DataFixtures/DataStructureFixtures.php b/src/DataFixtures/DataStructureFixtures.php new file mode 100644 index 00000000..19dea904 --- /dev/null +++ b/src/DataFixtures/DataStructureFixtures.php @@ -0,0 +1,128 @@ +em = $entityManager; + } + + /** + * Load data fixtures with the passed EntityManager + * + * @param ObjectManager $manager + */ + public function load(ObjectManager $manager) + { + //Reset autoincrement + $types = [AttachmentType::class, Device::class, Category::class, Footprint::class, Manufacturer::class, + MeasurementUnit::class, Storelocation::class, Supplier::class]; + + foreach ($types as $type) { + $this->createNodesForClass($type, $manager); + } + + $manager->flush(); + } + + /** + * Creates a datafixture with serveral nodes for the given class. + * @param string $class The class for which the nodes should be generated (must be a StructuralDBElement child) + * @param ObjectManager $manager The ObjectManager that should be used to persist the nodes + */ + public function createNodesForClass(string $class, ObjectManager $manager) + { + if (!new $class() instanceof StructuralDBElement) { + throw new \InvalidArgumentException('$class must be a StructuralDBElement!'); + } + + $table_name = $this->em->getClassMetadata($class)->getTableName(); + $this->em->getConnection()->exec("ALTER TABLE `$table_name` AUTO_INCREMENT = 1;"); + + /** @var StructuralDBElement $node1 */ + $node1 = new $class(); + $node1->setName('Node 1'); + + /** @var StructuralDBElement $node2 */ + $node2 = new $class(); + $node2->setName('Node 2'); + + /** @var StructuralDBElement $node3 */ + $node3 = new $class(); + $node3->setName('Node 3'); + + $node1_1 = new $class(); + $node1_1->setName('Node 1.1'); + $node1_1->setParent($node1); + + $node1_2 = new $class(); + $node1_2->setName('Node 1.2'); + $node1_2->setParent($node1); + + $node2_1 = new $class(); + $node2_1->setName('Node 2.1'); + $node2_1->setParent($node2); + + $node1_1_1 = new $class(); + $node1_1_1->setName('Node 1.1.1'); + $node1_1_1->setParent($node1_1); + + $manager->persist($node1); + $manager->persist($node2); + $manager->persist($node3); + $manager->persist($node1_1); + $manager->persist($node1_2); + $manager->persist($node2_1); + $manager->persist($node1_1_1); + } +} \ No newline at end of file diff --git a/src/DataFixtures/GroupFixtures.php b/src/DataFixtures/GroupFixtures.php index 8c1a3065..74251bb6 100644 --- a/src/DataFixtures/GroupFixtures.php +++ b/src/DataFixtures/GroupFixtures.php @@ -16,19 +16,50 @@ class GroupFixtures extends Fixture { $admins = new Group(); $admins->setName('admins'); - + //Perm values taken from Version 1 + $admins->getPermissions()->setRawPermissionValues([ + 'system' => '21','groups' => '1365','users' => '87381','self' => '85','config' => '85', + 'database' => '21','parts' => '1431655765','parts_name' => '5','parts_description' => '5', + 'parts_footprint' => '5','parts_manufacturer' => '5','parts_comment' => '5','parts_order' => '5', + 'parts_orderdetails' => '341','parts_prices' => '341','parts_attachments' => '341','devices' => '5461', + 'devices_parts' => '325','storelocations' => '5461','footprints' => '5461','categories' => '5461', + 'suppliers' => '5461','manufacturers' => '5461','attachment_types' => '1365','tools' => '1365', + 'labels' => '21','parts_category' => '5','parts_minamount' => '5','parts_lots' => '85','parts_tags' => '5', + 'parts_unit' => '5','parts_mass' => '5','parts_status' => '5','parts_mpn' => '5','currencies' => '5461', + 'measurement_units' => '5461' + ]); $this->setReference(self::ADMINS, $admins); $manager->persist($admins); $readonly = new Group(); $readonly->setName('readonly'); - + $readonly->getPermissions()->setRawPermissionValues([ + 'system' => '2','groups' => '2730','users' => '43690','self' => '25','config' => '170', + 'database' => '42','parts' => '2778027689','parts_name' => '9','parts_description' => '9', + 'parts_footprint' => '9','parts_manufacturer' => '9','parts_comment' => '9','parts_order' => '9', + 'parts_orderdetails' => '681','parts_prices' => '681','parts_attachments' => '681','devices' => '1705', + 'devices_parts' => '649','storelocations' => '1705','footprints' => '1705','categories' => '1705', + 'suppliers' => '1705','manufacturers' => '1705','attachment_types' => '681','tools' => '1366', + 'labels' => '165','parts_category' => '9','parts_minamount' => '9','parts_lots' => '169','parts_tags' => '9', + 'parts_unit' => '9','parts_mass' => '9','parts_status' => '9','parts_mpn' => '9','currencies' => '9897', + 'measurement_units' => '9897' + ]); $this->setReference(self::READONLY, $readonly); $manager->persist($readonly); $users = new Group(); $users->setName('users'); - + $users->getPermissions()->setRawPermissionValues([ + 'system' => '42','groups' => '2730','users' => '43690','self' => '89','config' => '105', + 'database' => '41','parts' => '1431655765','parts_name' => '5','parts_description' => '5', + 'parts_footprint' => '5','parts_manufacturer' => '5','parts_comment' => '5','parts_order' => '5', + 'parts_orderdetails' => '341','parts_prices' => '341','parts_attachments' => '341','devices' => '5461', + 'devices_parts' => '325','storelocations' => '5461','footprints' => '5461','categories' => '5461', + 'suppliers' => '5461','manufacturers' => '5461','attachment_types' => '1365','tools' => '1365', + 'labels' => '85','parts_category' => '5','parts_minamount' => '5','parts_lots' => '85','parts_tags' => '5', + 'parts_unit' => '5','parts_mass' => '5','parts_status' => '5','parts_mpn' => '5','currencies' => '5461', + 'measurement_units' => '5461' + ]); $this->setReference(self::USERS, $users); $manager->persist($users); diff --git a/src/DataFixtures/UserFixtures.php b/src/DataFixtures/UserFixtures.php index 613d37dd..d0da46bd 100644 --- a/src/DataFixtures/UserFixtures.php +++ b/src/DataFixtures/UserFixtures.php @@ -28,12 +28,14 @@ class UserFixtures extends Fixture $anonymous = new User(); $anonymous->setName('anonymous'); $anonymous->setGroup($this->getReference(GroupFixtures::READONLY)); - + $anonymous->setNeedPwChange(false); + $anonymous->setPassword($this->encoder->encodePassword($anonymous, 'test')); $manager->persist($anonymous); $admin = new User(); $admin->setName('admin'); $admin->setPassword($this->encoder->encodePassword($admin, 'test')); + $admin->setNeedPwChange(false); $admin->setGroup($this->getReference(GroupFixtures::ADMINS)); $manager->persist($admin); @@ -45,6 +47,12 @@ class UserFixtures extends Fixture $user->setGroup($this->getReference(GroupFixtures::USERS)); $manager->persist($user); + $noread = new User(); + $noread->setName('noread'); + $noread->setNeedPwChange(false); + $noread->setPassword($this->encoder->encodePassword($noread, 'test')); + $manager->persist($noread); + $manager->flush(); } } diff --git a/src/Entity/Attachments/AttachmentType.php b/src/Entity/Attachments/AttachmentType.php index c831109a..4b77eae3 100644 --- a/src/Entity/Attachments/AttachmentType.php +++ b/src/Entity/Attachments/AttachmentType.php @@ -92,7 +92,7 @@ class AttachmentType extends StructuralDBElement * @var string * @ORM\Column(type="text") */ - protected $filetype_filter; + protected $filetype_filter = ""; /** * Get all attachements ("Attachement" objects) with this type. diff --git a/src/Entity/UserSystem/PermissionsEmbed.php b/src/Entity/UserSystem/PermissionsEmbed.php index cb1e552f..2d81b39c 100644 --- a/src/Entity/UserSystem/PermissionsEmbed.php +++ b/src/Entity/UserSystem/PermissionsEmbed.php @@ -320,7 +320,7 @@ class PermissionsEmbed */ public function getBitValue(string $permission_name, int $bit_n): int { - if(!$this->isValidPermissionName($permission_name)) { + if (!$this->isValidPermissionName($permission_name)) { throw new \InvalidArgumentException(sprintf('No permission with the name "%s" is existing!', $permission_name)); } @@ -364,9 +364,9 @@ class PermissionsEmbed public function setPermissionValue(string $permission_name, int $bit_n, ?bool $new_value) : self { //Determine which bit value the given value is. - if($new_value === true) { + if ($new_value === true) { $bit_value = static::ALLOW; - } elseif($new_value === false) { + } elseif ($new_value === false) { $bit_value = static::DISALLOW; } else { $bit_value = static::INHERIT; @@ -386,7 +386,7 @@ class PermissionsEmbed */ public function setBitValue(string $permission_name, int $bit_n, int $new_value) : self { - if(!$this->isValidPermissionName($permission_name)) { + if (!$this->isValidPermissionName($permission_name)) { throw new \InvalidArgumentException('No permission with the given name is existing!'); } @@ -395,6 +395,58 @@ class PermissionsEmbed return $this; } + /** + * Returns the given permission as raw int (all bit at once) + * @param string $permission_name The name of the permission, which should be retrieved. + * If this is not existing an exception is thrown. + * @return int The raw permission value. + */ + public function getRawPermissionValue(string $permission_name) : int + { + if (!$this->isValidPermissionName($permission_name)) { + throw new \InvalidArgumentException('No permission with the given name is existing!'); + } + + return $this->$permission_name; + } + + /** + * Sets the given permission to the value. + * @param string $permission_name The name of the permission to that should be set. + * @param int $value The new value of the permsission + * @return $this + */ + public function setRawPermissionValue(string $permission_name, int $value) : self + { + if (!$this->isValidPermissionName($permission_name)) { + throw new \InvalidArgumentException( + sprintf('No permission with the given name %s is existing!', $permission_name) + ); + } + + $this->$permission_name = $value; + return $this; + } + + /** + * Sets multiple permissions at once. + * @param array $values An array in the form ['perm_name' => $value], containing the new data + * @param array|null $values2 If this array is not null, the first array will treated of list of perm names, + * and this array as an array of new values. + * @return $this + */ + public function setRawPermissionValues(array $values, array $values2 = null) : self + { + if (!empty($values2)) { + $values = array_combine($values, $values2); + } + + foreach ($values as $key => $value) { + $this->setRawPermissionValue($key, $value); + } + return $this; + } + /** * Reads a bit pair from $data. * diff --git a/templates/base.html.twig b/templates/base.html.twig index 5187fb42..40156b78 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -19,7 +19,7 @@ - {% if not app.user.theme %} + {% if not app.user.theme is defined %} {% set theme = global_theme %} {% else %} {% set theme = app.user.theme %} diff --git a/tests/Controller/AdminPages/AbstractAdminControllerTest.php b/tests/Controller/AdminPages/AbstractAdminControllerTest.php new file mode 100644 index 00000000..49661861 --- /dev/null +++ b/tests/Controller/AdminPages/AbstractAdminControllerTest.php @@ -0,0 +1,131 @@ + $user, + 'PHP_AUTH_PW' => 'test', + ]); + + //Test read/list access by access /new overview page + $crawler = $client->request('GET', static::$base_path . '/new'); + $this->assertFalse($client->getResponse()->isRedirect()); + $this->assertEquals($read, $client->getResponse()->isSuccessful(), "Controller was not successful!"); + $this->assertEquals($read, !$client->getResponse()->isForbidden(), "Permission Checking not working!"); + } + + /** + * @dataProvider readDataProvider + * Tests if it possible to access an specific entity. Checks if permissions are working. + */ + public function testReadEntity(string $user, bool $read) + { + //Test read access + $client = static::createClient([], [ + 'PHP_AUTH_USER' => $user, + 'PHP_AUTH_PW' => 'test', + ]); + + //Test read/list access by access /new overview page + $crawler = $client->request('GET', static::$base_path . '/1'); + $this->assertFalse($client->getResponse()->isRedirect()); + $this->assertEquals($read, $client->getResponse()->isSuccessful(), "Controller was not successful!"); + $this->assertEquals($read, !$client->getResponse()->isForbidden(), "Permission Checking not working!"); + } + + public function deleteDataProvider() + { + return [ + ['noread', false], + ['anonymous', false], + ['user', true], + ['admin', true] + ]; + } + + /** + * Tests if deleting an entity is working. + * @dataProvider deleteDataProvider + */ + public function testDeleteEntity(string $user, bool $delete) + { + //Test read access + $client = static::createClient([], [ + 'PHP_AUTH_USER' => $user, + 'PHP_AUTH_PW' => 'test', + ]); + + //Test read/list access by access /new overview page + $crawler = $client->request('DELETE', static::$base_path . '/7'); + + //Page is redirected to '/new', when delete was successful + $this->assertEquals($delete, $client->getResponse()->isRedirect(static::$base_path . '/new')); + $this->assertEquals($delete, !$client->getResponse()->isForbidden(), "Permission Checking not working!"); + } + +} \ No newline at end of file diff --git a/tests/Controller/AdminPages/AttachmentTypeControllerTest.php b/tests/Controller/AdminPages/AttachmentTypeControllerTest.php new file mode 100644 index 00000000..092f79b8 --- /dev/null +++ b/tests/Controller/AdminPages/AttachmentTypeControllerTest.php @@ -0,0 +1,41 @@ +assertEquals($embed, $embed->setPermissionValue(PermissionsEmbed::PARTS, 0, $value)); $this->assertEquals($value, $embed->getPermissionValue(PermissionsEmbed::PARTS, 0)); + } + + public function testSetRawPermissionValue() + { + $embed = new PermissionsEmbed(); + $embed->setRawPermissionValue(PermissionsEmbed::PARTS, 10); + $this->assertEquals(10, $embed->getRawPermissionValue(PermissionsEmbed::PARTS)); + } + + public function testSetRawPermissionValues() + { + $embed = new PermissionsEmbed(); + $embed->setRawPermissionValues([ + PermissionsEmbed::PARTS => 0, + PermissionsEmbed::USERS => 100, + PermissionsEmbed::CATEGORIES => 1304 + ]); + + $this->assertEquals(0, $embed->getRawPermissionValue(PermissionsEmbed::PARTS)); + $this->assertEquals(100, $embed->getRawPermissionValue(PermissionsEmbed::USERS)); + $this->assertEquals(1304, $embed->getRawPermissionValue(PermissionsEmbed::CATEGORIES)); + + //Test second method to pass perm names and values + $embed->setRawPermissionValues( + [PermissionsEmbed::PARTS, PermissionsEmbed::USERS, PermissionsEmbed::CATEGORIES], + [0, 100, 1304] + ); + + $this->assertEquals(0, $embed->getRawPermissionValue(PermissionsEmbed::PARTS)); + $this->assertEquals(100, $embed->getRawPermissionValue(PermissionsEmbed::USERS)); + $this->assertEquals(1304, $embed->getRawPermissionValue(PermissionsEmbed::CATEGORIES)); } diff --git a/tests/Services/PermissionResolverTest.php b/tests/Services/PermissionResolverTest.php index bb8ff6fd..ab0950b9 100644 --- a/tests/Services/PermissionResolverTest.php +++ b/tests/Services/PermissionResolverTest.php @@ -47,6 +47,7 @@ class PermissionResolverTest extends WebTestCase protected $service; protected $user; + protected $user_withoutGroup; protected $group; public function setUp() @@ -68,6 +69,10 @@ class PermissionResolverTest extends WebTestCase $this->user = $this->createMock(User::class); $this->user->method('getPermissions')->willReturn($user_embed); + $this->user_withoutGroup = $this->createMock(User::class); + $this->user_withoutGroup->method('getPermissions')->willReturn($user_embed); + $this->user_withoutGroup->method('getGroup')->willReturn(null); + //Set up a faked group $group1_embed = new PermissionsEmbed(); $group1_embed->setPermissionValue('parts', 6, true) @@ -92,7 +97,6 @@ class PermissionResolverTest extends WebTestCase $parent_group->method('getPermissions')->willReturn($parent_group_embed); $this->group->method('getParent')->willReturn($parent_group); - } @@ -167,15 +171,22 @@ class PermissionResolverTest extends WebTestCase $this->assertNull($this->service->dontInherit($this->user, 'parts', 'create')); $this->assertNull($this->service->dontInherit($this->user, 'parts', 'show_history')); $this->assertNull($this->service->dontInherit($this->user, 'parts', 'delete')); + + //Test for user without group + $this->assertTrue($this->service->dontInherit($this->user_withoutGroup, 'parts', 'read')); + $this->assertFalse($this->service->dontInherit($this->user_withoutGroup, 'parts', 'edit')); + $this->assertNull($this->service->dontInherit($this->user_withoutGroup, 'parts', 'create')); + $this->assertNull($this->service->dontInherit($this->user_withoutGroup, 'parts', 'show_history')); + $this->assertNull($this->service->dontInherit($this->user_withoutGroup, 'parts', 'delete')); } public function testInherit() { //Not inherited values should be same as dont inherit: - $this->assertTrue($this->service->Inherit($this->user, 'parts', 'read')); - $this->assertFalse($this->service->Inherit($this->user, 'parts', 'edit')); + $this->assertTrue($this->service->inherit($this->user, 'parts', 'read')); + $this->assertFalse($this->service->inherit($this->user, 'parts', 'edit')); //When thing can not be resolved null should be returned - $this->assertNull($this->service->Inherit($this->user, 'parts', 'create')); + $this->assertNull($this->service->inherit($this->user, 'parts', 'create')); //Check for inherit from group $this->assertTrue($this->service->inherit($this->user, 'parts', 'show_history')); @@ -186,6 +197,13 @@ class PermissionResolverTest extends WebTestCase $this->assertTrue($this->service->inherit($this->user, 'parts', 'all_parts')); $this->assertFalse($this->service->inherit($this->user, 'parts', 'no_price_parts')); $this->assertNull($this->service->inherit($this->user, 'parts', 'obsolete_parts')); + + //Test for user without group + $this->assertTrue($this->service->inherit($this->user_withoutGroup, 'parts', 'read')); + $this->assertFalse($this->service->inherit($this->user_withoutGroup, 'parts', 'edit')); + $this->assertNull($this->service->inherit($this->user_withoutGroup, 'parts', 'create')); + $this->assertNull($this->service->inherit($this->user_withoutGroup, 'parts', 'show_history')); + $this->assertNull($this->service->inherit($this->user_withoutGroup, 'parts', 'delete')); } } \ No newline at end of file