Integration.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Integration\Model\Plugin;
  7. use Magento\Authorization\Model\Acl\AclRetriever;
  8. use Magento\Authorization\Model\UserContextInterface;
  9. use Magento\Integration\Model\Integration as IntegrationModel;
  10. use Magento\Integration\Api\AuthorizationServiceInterface;
  11. use Magento\Integration\Api\IntegrationServiceInterface;
  12. use Magento\Integration\Model\IntegrationConfig;
  13. use Magento\Integration\Model\ConsolidatedConfig;
  14. /**
  15. * Plugin for \Magento\Integration\Model\IntegrationService.
  16. */
  17. class Integration
  18. {
  19. /**
  20. * @var \Magento\Integration\Api\AuthorizationServiceInterface
  21. */
  22. protected $integrationAuthorizationService;
  23. /**
  24. * @var \Magento\Authorization\Model\Acl\AclRetriever
  25. */
  26. protected $aclRetriever;
  27. /**
  28. * @var \Magento\Integration\Model\IntegrationConfig
  29. */
  30. protected $integrationConfig;
  31. /**
  32. * @var \Magento\Integration\Model\ConsolidatedConfig
  33. */
  34. protected $consolidatedConfig;
  35. /**
  36. * Initialize dependencies.
  37. *
  38. * @param AuthorizationServiceInterface $integrationAuthorizationService
  39. * @param AclRetriever $aclRetriever
  40. * @param IntegrationConfig $integrationConfig
  41. * @param ConsolidatedConfig $consolidatedConfig
  42. */
  43. public function __construct(
  44. AuthorizationServiceInterface $integrationAuthorizationService,
  45. AclRetriever $aclRetriever,
  46. IntegrationConfig $integrationConfig,
  47. ConsolidatedConfig $consolidatedConfig
  48. ) {
  49. $this->integrationAuthorizationService = $integrationAuthorizationService;
  50. $this->aclRetriever = $aclRetriever;
  51. $this->integrationConfig = $integrationConfig;
  52. $this->consolidatedConfig = $consolidatedConfig;
  53. }
  54. /**
  55. * Persist API permissions.
  56. *
  57. * @param IntegrationServiceInterface $subject
  58. * @param IntegrationModel $integration
  59. *
  60. * @return IntegrationModel
  61. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  62. */
  63. public function afterCreate(IntegrationServiceInterface $subject, $integration)
  64. {
  65. if ($integration->getSetupType() == IntegrationModel::TYPE_CONFIG) {
  66. $this->_addAllowedResources($integration);
  67. }
  68. $this->_saveApiPermissions($integration);
  69. return $integration;
  70. }
  71. /**
  72. * Persist API permissions.
  73. *
  74. * @param IntegrationServiceInterface $subject
  75. * @param IntegrationModel $integration
  76. *
  77. * @return IntegrationModel
  78. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  79. */
  80. public function afterUpdate(IntegrationServiceInterface $subject, $integration)
  81. {
  82. if ($integration->getSetupType() == IntegrationModel::TYPE_CONFIG) {
  83. $this->_addAllowedResources($integration);
  84. }
  85. $this->_saveApiPermissions($integration);
  86. return $integration;
  87. }
  88. /**
  89. * Add API permissions to integration data.
  90. *
  91. * @param IntegrationServiceInterface $subject
  92. * @param IntegrationModel $integration
  93. *
  94. * @return IntegrationModel
  95. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  96. */
  97. public function afterGet(IntegrationServiceInterface $subject, $integration)
  98. {
  99. $this->_addAllowedResources($integration);
  100. return $integration;
  101. }
  102. /**
  103. * Add the list of allowed resources to the integration object data by 'resource' key.
  104. *
  105. * @param IntegrationModel $integration
  106. * @return void
  107. */
  108. protected function _addAllowedResources(IntegrationModel $integration)
  109. {
  110. $integrations = array_merge(
  111. $this->integrationConfig->getIntegrations(),
  112. $this->consolidatedConfig->getIntegrations()
  113. );
  114. if ($integration->getId()) {
  115. if ($integration->getSetupType() == IntegrationModel::TYPE_CONFIG) {
  116. $integration->setData(
  117. 'resource',
  118. $integrations[$integration->getData('name')]['resource']
  119. );
  120. } else {
  121. $integration->setData(
  122. 'resource',
  123. $this->aclRetriever->getAllowedResourcesByUser(
  124. UserContextInterface::USER_TYPE_INTEGRATION,
  125. (int)$integration->getId()
  126. )
  127. );
  128. }
  129. }
  130. }
  131. /**
  132. * Persist API permissions.
  133. *
  134. * Permissions are expected to be set to integration object by 'resource' key.
  135. * If 'all_resources' is set and is evaluated to true, permissions to all resources will be granted.
  136. *
  137. * @param IntegrationModel $integration
  138. * @return void
  139. */
  140. protected function _saveApiPermissions(IntegrationModel $integration)
  141. {
  142. if ($integration->getId()) {
  143. if ($integration->getData('all_resources')) {
  144. $this->integrationAuthorizationService->grantAllPermissions($integration->getId());
  145. } elseif (is_array($integration->getData('resource'))) {
  146. $this->integrationAuthorizationService
  147. ->grantPermissions($integration->getId(), $integration->getData('resource'));
  148. } else {
  149. $this->integrationAuthorizationService->grantPermissions($integration->getId(), []);
  150. }
  151. }
  152. }
  153. /**
  154. * Process integration resource permissions after the integration is created
  155. *
  156. * @param IntegrationServiceInterface $subject
  157. * @param array $integrationData Data of integration deleted
  158. *
  159. * @return array $integrationData
  160. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  161. */
  162. public function afterDelete(IntegrationServiceInterface $subject, array $integrationData)
  163. {
  164. //No check needed for integration data since it cannot be empty in the parent invocation - delete
  165. $integrationId = (int)$integrationData[IntegrationModel::ID];
  166. $this->integrationAuthorizationService->removePermissions($integrationId);
  167. return $integrationData;
  168. }
  169. }