mirror of
https://github.com/farmOS/farmOS.git
synced 2024-02-23 11:37:38 +01:00
Temporarily allow access to private file referencing during migration.
This commit is contained in:
parent
09ed36b10b
commit
53dc64258e
22
modules/core/migrate/farm_migrate.module
Normal file
22
modules/core/migrate/farm_migrate.module
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Hooks and customizations for the farm_migrate module.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Drupal\Core\Access\AccessResult;
|
||||||
|
use Drupal\Core\Entity\EntityInterface;
|
||||||
|
use Drupal\Core\Session\AccountInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implements hook_ENTITY_TYPE_access().
|
||||||
|
*/
|
||||||
|
function farm_migrate_file_access(EntityInterface $entity, $operation, AccountInterface $account) {
|
||||||
|
|
||||||
|
// Allow access to private file referencing during migration.
|
||||||
|
// @see FarmMigrationSubscriber::allowPrivateFileReferencing()
|
||||||
|
if (\Drupal::state()->get('farm_migrate_allow_file_referencing')) {
|
||||||
|
return AccessResult::allowed();
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,6 @@ services:
|
||||||
farm_migrate_event_subscriber:
|
farm_migrate_event_subscriber:
|
||||||
class: Drupal\farm_migrate\EventSubscriber\FarmMigrationSubscriber
|
class: Drupal\farm_migrate\EventSubscriber\FarmMigrationSubscriber
|
||||||
arguments:
|
arguments:
|
||||||
[ '@database', '@datetime.time', '@entity_type.manager' ]
|
[ '@database', '@datetime.time', '@entity_type.manager', '@state' ]
|
||||||
tags:
|
tags:
|
||||||
- { name: 'event_subscriber' }
|
- { name: 'event_subscriber' }
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace Drupal\farm_migrate\EventSubscriber;
|
||||||
use Drupal\Component\Datetime\TimeInterface;
|
use Drupal\Component\Datetime\TimeInterface;
|
||||||
use Drupal\Core\Database\Connection;
|
use Drupal\Core\Database\Connection;
|
||||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||||
|
use Drupal\Core\State\StateInterface;
|
||||||
use Drupal\migrate\Event\MigrateEvents;
|
use Drupal\migrate\Event\MigrateEvents;
|
||||||
use Drupal\migrate\Event\MigrateImportEvent;
|
use Drupal\migrate\Event\MigrateImportEvent;
|
||||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
@ -42,6 +43,13 @@ class FarmMigrationSubscriber implements EventSubscriberInterface {
|
||||||
*/
|
*/
|
||||||
protected $roleStorage;
|
protected $roleStorage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The state key/value store.
|
||||||
|
*
|
||||||
|
* @var \Drupal\Core\State\StateInterface
|
||||||
|
*/
|
||||||
|
protected $state;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FarmMigrationSubscriber Constructor.
|
* FarmMigrationSubscriber Constructor.
|
||||||
*
|
*
|
||||||
|
@ -51,12 +59,15 @@ class FarmMigrationSubscriber implements EventSubscriberInterface {
|
||||||
* The time service.
|
* The time service.
|
||||||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
|
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
|
||||||
* The entity type manager service.
|
* The entity type manager service.
|
||||||
|
* @param \Drupal\Core\State\StateInterface $state
|
||||||
|
* The state key/value store.
|
||||||
*/
|
*/
|
||||||
public function __construct(Connection $database, TimeInterface $time, EntityTypeManagerInterface $entity_type_manager) {
|
public function __construct(Connection $database, TimeInterface $time, EntityTypeManagerInterface $entity_type_manager, StateInterface $state) {
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
$this->time = $time;
|
$this->time = $time;
|
||||||
$this->entityTypeManager = $entity_type_manager;
|
$this->entityTypeManager = $entity_type_manager;
|
||||||
$this->roleStorage = $entity_type_manager->getStorage('user_role');
|
$this->roleStorage = $entity_type_manager->getStorage('user_role');
|
||||||
|
$this->state = $state;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -78,6 +89,7 @@ class FarmMigrationSubscriber implements EventSubscriberInterface {
|
||||||
*/
|
*/
|
||||||
public function onMigratePreImport(MigrateImportEvent $event) {
|
public function onMigratePreImport(MigrateImportEvent $event) {
|
||||||
$this->grantTextFormatPermission($event);
|
$this->grantTextFormatPermission($event);
|
||||||
|
$this->allowPrivateFileReferencing($event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,6 +100,7 @@ class FarmMigrationSubscriber implements EventSubscriberInterface {
|
||||||
*/
|
*/
|
||||||
public function onMigratePostImport(MigrateImportEvent $event) {
|
public function onMigratePostImport(MigrateImportEvent $event) {
|
||||||
$this->revokeTextFormatPermission($event);
|
$this->revokeTextFormatPermission($event);
|
||||||
|
$this->preventPrivateFileReferencing($event);
|
||||||
$this->addRevisionLogMessage($event);
|
$this->addRevisionLogMessage($event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +146,56 @@ class FarmMigrationSubscriber implements EventSubscriberInterface {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temporarily allow private files to be referenced by entities.
|
||||||
|
*
|
||||||
|
* @param \Drupal\migrate\Event\MigrateImportEvent $event
|
||||||
|
* The import event object.
|
||||||
|
*/
|
||||||
|
public function allowPrivateFileReferencing(MigrateImportEvent $event) {
|
||||||
|
|
||||||
|
// During farmOS 1.x -> 2.x migrations, Drupal's FileAccessControlHandler
|
||||||
|
// will not allow file entities to be referenced unless they were originally
|
||||||
|
// uploaded by the same user that created the entity that references them.
|
||||||
|
// In farmOS, it is common for an entity to be created by one user, and
|
||||||
|
// photos to be uploaded to it later by a different user. With entity
|
||||||
|
// validation enabled on the migration, this throws a validation error and
|
||||||
|
// doesn't allow the file to be referenced.
|
||||||
|
// We work around this by setting a Drupal state variable during our
|
||||||
|
// migrations, and check for it in hook_ENTITY_TYPE_access(), so we can
|
||||||
|
// explicitly grant access to the files.
|
||||||
|
// This state is removed post-migration.
|
||||||
|
// @see \Drupal\file\FileAccessControlHandler
|
||||||
|
// @see farm_migrate_file_access()
|
||||||
|
// @see preventPrivateFileReferencing()
|
||||||
|
$migration_groups = [
|
||||||
|
'farm_migrate_area',
|
||||||
|
'farm_migrate_asset',
|
||||||
|
'farm_migrate_log',
|
||||||
|
'farm_migrate_plan',
|
||||||
|
'farm_migrate_taxonomy',
|
||||||
|
];
|
||||||
|
$migration = $event->getMigration();
|
||||||
|
if (isset($migration->migration_group) && in_array($migration->migration_group, $migration_groups)) {
|
||||||
|
$this->state->set('farm_migrate_allow_file_referencing', TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent private files from being referenced by entities.
|
||||||
|
*
|
||||||
|
* @param \Drupal\migrate\Event\MigrateImportEvent $event
|
||||||
|
* The import event object.
|
||||||
|
*/
|
||||||
|
public function preventPrivateFileReferencing(MigrateImportEvent $event) {
|
||||||
|
|
||||||
|
// Unset the Drupal state variable that was set to temporarily allow private
|
||||||
|
// files to be referenced by entities.
|
||||||
|
// @see farm_migrate_file_access()
|
||||||
|
// @see allowPrivateFileReferencing()
|
||||||
|
$this->state->delete('farm_migrate_allow_file_referencing');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a revision log message to imported entities.
|
* Add a revision log message to imported entities.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue