Further modules included.
[yaffs-website] / web / modules / contrib / filefield_sources / src / Controller / ImceController.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\imce\Controller\ImceController.
6  */
7
8 namespace Drupal\filefield_sources\Controller;
9
10 use Symfony\Component\HttpFoundation\Request;
11 use Drupal\Core\Controller\ControllerBase;
12 use Drupal\imce\Imce;
13 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
14 use Drupal\Core\Render\BubbleableMetadata;
15
16 /**
17  * Controller routines for imce routes.
18  */
19 class ImceController extends ControllerBase {
20
21   /**
22    * Outputs the IMCE browser for FileField.
23    */
24   public function page($entity_type, $bundle_name, $field_name, Request $request) {
25     // Check access.
26     if (!\Drupal::moduleHandler()->moduleExists('imce') || !Imce::access() || !$instance = entity_load('field_config', $entity_type . '.' . $bundle_name . '.' . $field_name)) {
27       throw new AccessDeniedHttpException();
28     }
29
30     $settings = $instance->getSettings();
31     $imceFM = Imce::userFM(\Drupal::currentUser(), $settings['uri_scheme'], $request);
32
33     // Override scanner.
34     if (!empty($imceFM)) {
35       $scanner = \Drupal::service('filefield_sources.imce_scanner');
36       $widget = entity_get_form_display($entity_type, $bundle_name, 'default')->getComponent($field_name);
37       // Full mode.
38       if (!empty($widget['third_party_settings']['filefield_sources']['filefield_sources']['source_imce']['imce_mode'])) {
39         $imceFM->setConf('scanner', array($scanner, 'customScanFull'));
40         // Set context.
41         $scanner->setContext(array(
42           'scheme' => $imceFM->getConf('scheme'),
43         ));
44       }
45       // Restricted mode.
46       else {
47         $imceFM->setConf('scanner', array($scanner, 'customScanRestricted'));
48
49         // Make field directory the only accessible one.
50         $field_uri = static::getUploadLocation($settings);
51         static::disablePerms($imceFM, $field_uri, array('browse_files'));
52
53         // Set context.
54         $scanner->setContext(array(
55           'entity_type' => $entity_type,
56           'field_name' => $field_name,
57           'uri' => $field_uri,
58           'is_rool' => $is_root,
59         ));
60       }
61
62       // Disable absolute URLs.
63       \Drupal::configFactory()->getEditable('imce.settings')->set('abs_urls', FALSE);
64
65       return $imceFM->pageResponse();
66     }
67   }
68
69   /**
70    * Determines the URI for a file field.
71    *
72    * @param array $data
73    *   An array of token objects to pass to token_replace().
74    *
75    * @return string
76    *   A file directory URI with tokens replaced.
77    *
78    * @see token_replace()
79    */
80   protected static function getUploadLocation($settings, $data = array()) {
81     $destination = trim($settings['file_directory'], '/');
82
83     // Replace tokens. To ensure that render context is empty, pass a bubbleable
84     // metadata object to the replace method.
85     $bubbleable_metadata = new BubbleableMetadata();
86     $destination = \Drupal::token()->replace($destination, $data, [], $bubbleable_metadata);
87
88     return $settings['uri_scheme'] . '://' . $destination;
89   }
90
91   /**
92    * Disable IMCE profile permissions.
93    */
94   protected static function disablePerms($imceFM, $field_uri, $exceptions = array()) {
95     $scheme = $imceFM->getConf('scheme');
96     $root = $scheme . '://';
97     $is_root = $field_uri == $root;
98     $path = $is_root ? '.' : substr($field_uri, strlen($root));
99
100     $folders = $imceFM->getConf('folders');
101     $perms = \Drupal::service('plugin.manager.imce.plugin')->permissionInfo();
102     $folders['.']['permissions']['all'] = FALSE;
103     $folders[$path]['permissions']['all'] = FALSE;
104     foreach ($perms as $perm => $title) {
105       $folders['.']['permissions'][$perm] = FALSE;
106       $folders[$path]['permissions'][$perm] = in_array($perm, array('browse_files')) ? TRUE : FALSE;
107     }
108     $imceFM->setConf('folders', $folders);
109   }
110
111 }