AccountsServiceProvider.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. /**
  3. * @package Grav\Common\Service
  4. *
  5. * @copyright Copyright (c) 2015 - 2023 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Service;
  9. use Grav\Common\Config\Config;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Page\Header;
  12. use Grav\Common\Page\Interfaces\PageInterface;
  13. use Grav\Common\User\DataUser;
  14. use Grav\Common\User\User;
  15. use Grav\Events\PermissionsRegisterEvent;
  16. use Grav\Framework\Acl\Permissions;
  17. use Grav\Framework\Acl\PermissionsReader;
  18. use Grav\Framework\Flex\Flex;
  19. use Grav\Framework\Flex\Interfaces\FlexIndexInterface;
  20. use Pimple\Container;
  21. use Pimple\ServiceProviderInterface;
  22. use RocketTheme\Toolbox\Event\Event;
  23. use SplFileInfo;
  24. use Symfony\Component\EventDispatcher\EventDispatcher;
  25. use function define;
  26. use function defined;
  27. use function is_array;
  28. /**
  29. * Class AccountsServiceProvider
  30. * @package Grav\Common\Service
  31. */
  32. class AccountsServiceProvider implements ServiceProviderInterface
  33. {
  34. /**
  35. * @param Container $container
  36. * @return void
  37. */
  38. public function register(Container $container)
  39. {
  40. $container['permissions'] = static function (Grav $container) {
  41. /** @var Config $config */
  42. $config = $container['config'];
  43. $permissions = new Permissions();
  44. $permissions->addTypes($config->get('permissions.types', []));
  45. $array = $config->get('permissions.actions');
  46. if (is_array($array)) {
  47. $actions = PermissionsReader::fromArray($array, $permissions->getTypes());
  48. $permissions->addActions($actions);
  49. }
  50. $event = new PermissionsRegisterEvent($permissions);
  51. $container->dispatchEvent($event);
  52. return $permissions;
  53. };
  54. $container['accounts'] = function (Container $container) {
  55. $type = $this->initialize($container);
  56. return $type === 'flex' ? $this->flexAccounts($container) : $this->regularAccounts($container);
  57. };
  58. $container['user_groups'] = static function (Container $container) {
  59. /** @var Flex $flex */
  60. $flex = $container['flex'];
  61. $directory = $flex->getDirectory('user-groups');
  62. return $directory ? $directory->getIndex() : null;
  63. };
  64. $container['users'] = $container->factory(static function (Container $container) {
  65. user_error('Grav::instance()[\'users\'] is deprecated since Grav 1.6, use Grav::instance()[\'accounts\'] instead', E_USER_DEPRECATED);
  66. return $container['accounts'];
  67. });
  68. }
  69. /**
  70. * @param Container $container
  71. * @return string
  72. */
  73. protected function initialize(Container $container): string
  74. {
  75. $isDefined = defined('GRAV_USER_INSTANCE');
  76. $type = strtolower($isDefined ? GRAV_USER_INSTANCE : $container['config']->get('system.accounts.type', 'regular'));
  77. if ($type === 'flex') {
  78. if (!$isDefined) {
  79. define('GRAV_USER_INSTANCE', 'FLEX');
  80. }
  81. /** @var EventDispatcher $dispatcher */
  82. $dispatcher = $container['events'];
  83. // Stop /admin/user from working, display error instead.
  84. $dispatcher->addListener(
  85. 'onAdminPage',
  86. static function (Event $event) {
  87. $grav = Grav::instance();
  88. $admin = $grav['admin'];
  89. [$base,$location,] = $admin->getRouteDetails();
  90. if ($location !== 'user' || isset($grav['flex_objects'])) {
  91. return;
  92. }
  93. /** @var PageInterface $page */
  94. $page = $event['page'];
  95. $page->init(new SplFileInfo('plugin://admin/pages/admin/error.md'));
  96. $page->routable(true);
  97. $header = $page->header();
  98. $header->title = 'Please install missing plugin';
  99. $page->content("## Please install and enable **[Flex Objects]({$base}/plugins/flex-objects)** plugin. It is required to edit **Flex User Accounts**.");
  100. /** @var Header $header */
  101. $header = $page->header();
  102. $directory = $grav['accounts']->getFlexDirectory();
  103. $menu = $directory->getConfig('admin.menu.list');
  104. $header->access = $menu['authorize'] ?? ['admin.super'];
  105. },
  106. 100000
  107. );
  108. } elseif (!$isDefined) {
  109. define('GRAV_USER_INSTANCE', 'REGULAR');
  110. }
  111. return $type;
  112. }
  113. /**
  114. * @param Container $container
  115. * @return DataUser\UserCollection
  116. */
  117. protected function regularAccounts(Container $container)
  118. {
  119. // Use User class for backwards compatibility.
  120. return new DataUser\UserCollection(User::class);
  121. }
  122. /**
  123. * @param Container $container
  124. * @return FlexIndexInterface|null
  125. */
  126. protected function flexAccounts(Container $container)
  127. {
  128. /** @var Flex $flex */
  129. $flex = $container['flex'];
  130. $directory = $flex->getDirectory('user-accounts');
  131. return $directory ? $directory->getIndex() : null;
  132. }
  133. }