vendor/pimcore/pimcore/lib/Tool/Admin.php line 55

Open in your IDE?
  1. <?php
  2. /**
  3. * Pimcore
  4. *
  5. * This source file is available under two different licenses:
  6. * - GNU General Public License version 3 (GPLv3)
  7. * - Pimcore Commercial License (PCL)
  8. * Full copyright and license information is available in
  9. * LICENSE.md which is distributed with this source code.
  10. *
  11. * @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12. * @license http://www.pimcore.org/license GPLv3 and PCL
  13. */
  14. namespace Pimcore\Tool;
  15. use Pimcore\Bundle\AdminBundle\Security\User\TokenStorageUserResolver;
  16. use Pimcore\Event\SystemEvents;
  17. use Pimcore\File;
  18. use Pimcore\Localization\LocaleServiceInterface;
  19. use Pimcore\Model\User;
  20. use Pimcore\Tool\Text\Csv;
  21. use Symfony\Component\EventDispatcher\GenericEvent;
  22. /**
  23. * @internal
  24. */
  25. class Admin
  26. {
  27. /**
  28. * Finds the translation file for a given language
  29. *
  30. * @static
  31. *
  32. * @param string $language
  33. *
  34. * @return string
  35. */
  36. public static function getLanguageFile($language)
  37. {
  38. $baseResource = \Pimcore::getContainer()->getParameter('pimcore.admin.translations.path');
  39. $languageFile = \Pimcore::getKernel()->locateResource($baseResource . '/' . $language . '.json');
  40. return $languageFile;
  41. }
  42. /**
  43. * finds installed languages
  44. *
  45. * @static
  46. *
  47. * @return array
  48. */
  49. public static function getLanguages()
  50. {
  51. $baseResource = \Pimcore::getContainer()->getParameter('pimcore.admin.translations.path');
  52. $languageDir = \Pimcore::getKernel()->locateResource($baseResource);
  53. $adminLang = \Pimcore::getContainer()->getParameter('pimcore_admin.admin_languages');
  54. $appDefaultPath = \Pimcore::getContainer()->getParameter('translator.default_path');
  55. $languages = [];
  56. $languageDirs = [$languageDir, $appDefaultPath];
  57. foreach ($languageDirs as $filesDir) {
  58. if (is_dir($filesDir)) {
  59. $files = scandir($filesDir);
  60. foreach ($files as $file) {
  61. if (is_file($filesDir . '/' . $file)) {
  62. $parts = explode('.', $file);
  63. $languageCode = $parts[0];
  64. if ($parts[0] === 'admin') {
  65. // this is for the app specific translations
  66. $languageCode = $parts[1];
  67. }
  68. if (($adminLang != null && in_array($languageCode, array_values($adminLang))) || $adminLang == null) {
  69. if ($parts[1] === 'json' || $parts[0] === 'admin') {
  70. if (\Pimcore::getContainer()->get(LocaleServiceInterface::class)->isLocale($languageCode)) {
  71. $languages[] = $languageCode;
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }
  78. }
  79. return array_unique($languages);
  80. }
  81. /**
  82. * @static
  83. *
  84. * @param string $scriptContent
  85. *
  86. * @return mixed
  87. */
  88. public static function getMinimizedScriptPath($scriptContent)
  89. {
  90. $scriptPath = 'minified_javascript_core_'.md5($scriptContent).'.js';
  91. $storage = Storage::get('admin');
  92. $storage->write($scriptPath, $scriptContent);
  93. $params = [
  94. 'storageFile' => basename($scriptPath),
  95. '_dc' => \Pimcore\Version::getRevision(),
  96. ];
  97. return $params;
  98. }
  99. /**
  100. * @param string $file
  101. *
  102. * @return \stdClass
  103. */
  104. public static function determineCsvDialect($file)
  105. {
  106. // minimum 10 lines, to be sure take more
  107. $sample = '';
  108. for ($i = 0; $i < 10; $i++) {
  109. $sample .= implode('', array_slice(file($file), 0, 11)); // grab 20 lines
  110. }
  111. try {
  112. $sniffer = new Csv();
  113. $dialect = $sniffer->detect($sample);
  114. } catch (\Exception $e) {
  115. // use default settings
  116. $dialect = new \stdClass();
  117. $dialect->delimiter = ';';
  118. $dialect->quotechar = '"';
  119. $dialect->escapechar = '\\';
  120. }
  121. // validity check
  122. if (!in_array($dialect->delimiter, [';', ',', "\t", '|', ':'])) {
  123. $dialect->delimiter = ';';
  124. }
  125. return $dialect;
  126. }
  127. /**
  128. * @static
  129. *
  130. * @return string
  131. */
  132. public static function getMaintenanceModeFile()
  133. {
  134. return PIMCORE_CONFIGURATION_DIRECTORY . '/maintenance.php';
  135. }
  136. public static function getMaintenanceModeScheduleLoginFile()
  137. {
  138. return PIMCORE_CONFIGURATION_DIRECTORY . '/maintenance-schedule-login.php';
  139. }
  140. /**
  141. * @param string|null $sessionId
  142. *
  143. * @throws \Exception
  144. */
  145. public static function activateMaintenanceMode($sessionId)
  146. {
  147. if (empty($sessionId)) {
  148. $sessionId = Session::getSessionId();
  149. }
  150. if (empty($sessionId)) {
  151. throw new \Exception("It's not possible to activate the maintenance mode without a session-id");
  152. }
  153. File::putPhpFile(self::getMaintenanceModeFile(), to_php_data_file_format([
  154. 'sessionId' => $sessionId,
  155. ]));
  156. @chmod(self::getMaintenanceModeFile(), 0666); // so it can be removed also via FTP, ...
  157. \Pimcore::getEventDispatcher()->dispatch(new GenericEvent(), SystemEvents::MAINTENANCE_MODE_ACTIVATE);
  158. }
  159. /**
  160. * @static
  161. */
  162. public static function deactivateMaintenanceMode()
  163. {
  164. @unlink(self::getMaintenanceModeFile());
  165. \Pimcore::getEventDispatcher()->dispatch(new GenericEvent(), SystemEvents::MAINTENANCE_MODE_DEACTIVATE);
  166. }
  167. /**
  168. * @static
  169. *
  170. * @return bool
  171. */
  172. public static function isInMaintenanceMode()
  173. {
  174. $file = self::getMaintenanceModeFile();
  175. if (is_file($file)) {
  176. $conf = include($file);
  177. if (isset($conf['sessionId'])) {
  178. return true;
  179. } else {
  180. @unlink($file);
  181. }
  182. }
  183. return false;
  184. }
  185. public static function isMaintenanceModeScheduledForLogin(): bool
  186. {
  187. $file = self::getMaintenanceModeScheduleLoginFile();
  188. if (is_file($file)) {
  189. $conf = include($file);
  190. if (isset($conf['schedule']) && $conf['schedule']) {
  191. return true;
  192. } else {
  193. @unlink($file);
  194. }
  195. }
  196. return false;
  197. }
  198. public static function scheduleMaintenanceModeOnLogin()
  199. {
  200. File::putPhpFile(self::getMaintenanceModeScheduleLoginFile(), to_php_data_file_format([
  201. 'schedule' => true,
  202. ]));
  203. @chmod(self::getMaintenanceModeScheduleLoginFile(), 0666); // so it can be removed also via FTP, ...
  204. \Pimcore::getEventDispatcher()->dispatch(new GenericEvent(), SystemEvents::MAINTENANCE_MODE_SCHEDULE_LOGIN);
  205. }
  206. public static function unscheduleMaintenanceModeOnLogin()
  207. {
  208. @unlink(self::getMaintenanceModeScheduleLoginFile());
  209. \Pimcore::getEventDispatcher()->dispatch(new GenericEvent(), SystemEvents::MAINTENANCE_MODE_UNSCHEDULE_LOGIN);
  210. }
  211. /**
  212. * @static
  213. *
  214. * @return \Pimcore\Model\User|null
  215. */
  216. public static function getCurrentUser()
  217. {
  218. return \Pimcore::getContainer()
  219. ->get(TokenStorageUserResolver::class)
  220. ->getUser();
  221. }
  222. /**
  223. * @return true if in EXT JS5 mode
  224. */
  225. public static function isExtJS6()
  226. {
  227. return true;
  228. }
  229. /**
  230. * @param User $user
  231. * @param string|array $languages
  232. * @param bool $returnLanguageArray
  233. *
  234. * @return string|array
  235. */
  236. public static function reorderWebsiteLanguages($user, $languages, $returnLanguageArray = false)
  237. {
  238. if (!is_array($languages)) {
  239. $languages = explode(',', $languages);
  240. }
  241. $contentLanguages = $user->getContentLanguages();
  242. if ($contentLanguages) {
  243. $contentLanguages = array_intersect($contentLanguages, $languages);
  244. $newLanguages = array_diff($languages, $contentLanguages);
  245. $languages = array_merge($contentLanguages, $newLanguages);
  246. }
  247. if (in_array('default', $languages)) {
  248. $languages = array_diff($languages, ['default']);
  249. array_unshift($languages, 'default');
  250. }
  251. if ($returnLanguageArray) {
  252. return $languages;
  253. }
  254. return implode(',', $languages);
  255. }
  256. }