PageRenderTime 41ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/184.168.182.1/admin/old/ckfinder/core/connector/php/php4/Core/AccessControlConfig.php

https://gitlab.com/endomorphosis/falkenstein
PHP | 225 lines | 135 code | 31 blank | 59 comment | 22 complexity | 088032d28c7de8da917f606173e1544b MD5 | raw file
  1. <?php
  2. /*
  3. * CKFinder
  4. * ========
  5. * http://ckfinder.com
  6. * Copyright (C) 2007-2012, CKSource - Frederico Knabben. All rights reserved.
  7. *
  8. * The software, this file and its contents are subject to the CKFinder
  9. * License. Please read the license.txt file before using, installing, copying,
  10. * modifying or distribute this file or part of its contents. The contents of
  11. * this file is part of the Source Code of CKFinder.
  12. */
  13. if (!defined('IN_CKFINDER')) exit;
  14. /**
  15. * @package CKFinder
  16. * @subpackage Config
  17. * @copyright CKSource - Frederico Knabben
  18. */
  19. /**
  20. * Folder view mask
  21. */
  22. define('CKFINDER_CONNECTOR_ACL_FOLDER_VIEW',1);
  23. define('CKFINDER_CONNECTOR_ACL_FOLDER_CREATE',2);
  24. define('CKFINDER_CONNECTOR_ACL_FOLDER_RENAME',4);
  25. define('CKFINDER_CONNECTOR_ACL_FOLDER_DELETE',8);
  26. define('CKFINDER_CONNECTOR_ACL_FILE_VIEW',16);
  27. define('CKFINDER_CONNECTOR_ACL_FILE_UPLOAD',32);
  28. define('CKFINDER_CONNECTOR_ACL_FILE_RENAME',64);
  29. define('CKFINDER_CONNECTOR_ACL_FILE_DELETE',128);
  30. /**
  31. * This class keeps ACL configuration
  32. *
  33. * @package CKFinder
  34. * @subpackage Config
  35. * @copyright CKSource - Frederico Knabben
  36. */
  37. class CKFinder_Connector_Core_AccessControlConfig
  38. {
  39. /**
  40. * array with ACL entries
  41. *
  42. * @var array[string]string
  43. * @access private
  44. */
  45. var $_aclEntries = array();
  46. function CKFinder_Connector_Core_AccessControlConfig($accessControlNodes)
  47. {
  48. foreach ($accessControlNodes as $node) {
  49. $_folderView = isset($node['folderView']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['folderView']) : false;
  50. $_folderCreate = isset($node['folderCreate']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['folderCreate']) : false;
  51. $_folderRename = isset($node['folderRename']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['folderRename']) : false;
  52. $_folderDelete = isset($node['folderDelete']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['folderDelete']) : false;
  53. $_fileView = isset($node['fileView']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['fileView']) : false;
  54. $_fileUpload = isset($node['fileUpload']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['fileUpload']) : false;
  55. $_fileRename = isset($node['fileRename']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['fileRename']) : false;
  56. $_fileDelete = isset($node['fileDelete']) ? CKFinder_Connector_Utils_Misc::booleanValue($node['fileDelete']) : false;
  57. $_role = isset($node['role']) ? $node['role'] : "*";
  58. $_resourceType = isset($node['resourceType']) ? $node['resourceType'] : "*";
  59. $_folder = isset($node['folder']) ? $node['folder'] : "/";
  60. $this->addACLEntry($_role, $_resourceType, $_folder,
  61. array(
  62. $_folderView ? CKFINDER_CONNECTOR_ACL_FOLDER_VIEW : 0,
  63. $_folderCreate ? CKFINDER_CONNECTOR_ACL_FOLDER_CREATE : 0,
  64. $_folderRename ? CKFINDER_CONNECTOR_ACL_FOLDER_RENAME : 0,
  65. $_folderDelete ? CKFINDER_CONNECTOR_ACL_FOLDER_DELETE : 0,
  66. $_fileView ? CKFINDER_CONNECTOR_ACL_FILE_VIEW : 0,
  67. $_fileUpload ? CKFINDER_CONNECTOR_ACL_FILE_UPLOAD : 0,
  68. $_fileRename ? CKFINDER_CONNECTOR_ACL_FILE_RENAME : 0,
  69. $_fileDelete ? CKFINDER_CONNECTOR_ACL_FILE_DELETE : 0,
  70. ),
  71. array(
  72. $_folderView ? 0 : CKFINDER_CONNECTOR_ACL_FOLDER_VIEW,
  73. $_folderCreate ? 0 : CKFINDER_CONNECTOR_ACL_FOLDER_CREATE,
  74. $_folderRename ? 0 : CKFINDER_CONNECTOR_ACL_FOLDER_RENAME,
  75. $_folderDelete ? 0 : CKFINDER_CONNECTOR_ACL_FOLDER_DELETE,
  76. $_fileView ? 0 : CKFINDER_CONNECTOR_ACL_FILE_VIEW,
  77. $_fileUpload ? 0 : CKFINDER_CONNECTOR_ACL_FILE_UPLOAD,
  78. $_fileRename ? 0 : CKFINDER_CONNECTOR_ACL_FILE_RENAME,
  79. $_fileDelete ? 0 : CKFINDER_CONNECTOR_ACL_FILE_DELETE,
  80. )
  81. );
  82. }
  83. }
  84. /**
  85. * Add ACL entry
  86. *
  87. * @param string $role role
  88. * @param string $resourceType resource type
  89. * @param string $folderPath folder path
  90. * @param int $allowRulesMask allow rules mask
  91. * @param int $denyRulesMask deny rules mask
  92. * @access private
  93. */
  94. function addACLEntry($role, $resourceType, $folderPath, $allowRulesMask, $denyRulesMask)
  95. {
  96. if (!strlen($folderPath)) {
  97. $folderPath = '/';
  98. }
  99. else {
  100. if (substr($folderPath,0,1) != '/') {
  101. $folderPath = '/' . $folderPath;
  102. }
  103. if (substr($folderPath,-1,1) != '/') {
  104. $folderPath .= '/';
  105. }
  106. }
  107. $_entryKey = $role . "#@#" . $resourceType;
  108. if (array_key_exists($folderPath,$this->_aclEntries)) {
  109. if (array_key_exists($_entryKey, $this->_aclEntries[$folderPath])) {
  110. $_rulesMasks = $this->_aclEntries[$folderPath][$_entryKey];
  111. foreach ($_rulesMasks[0] as $key => $value) {
  112. $allowRulesMask[$key] |= $value;
  113. }
  114. foreach ($_rulesMasks[1] as $key => $value) {
  115. $denyRulesMask[$key] |= $value;
  116. }
  117. }
  118. }
  119. else {
  120. $this->_aclEntries[$folderPath] = array();
  121. }
  122. $this->_aclEntries[$folderPath][$_entryKey] = array($allowRulesMask, $denyRulesMask);
  123. }
  124. /**
  125. * Get computed mask
  126. *
  127. * @param string $resourceType
  128. * @param string $folderPath
  129. * @return int
  130. */
  131. function getComputedMask($resourceType, $folderPath)
  132. {
  133. $_computedMask = 0;
  134. $_config =& CKFinder_Connector_Core_Factory::getInstance("Core_Config");
  135. $_roleSessionVar = $_config->getRoleSessionVar();
  136. $_userRole = null;
  137. if (strlen($_roleSessionVar) && isset($_SESSION[$_roleSessionVar])) {
  138. $_userRole = (string)$_SESSION[$_roleSessionVar];
  139. }
  140. if (!is_null($_userRole) && !strlen($_userRole)) {
  141. $_userRole = null;
  142. }
  143. $folderPath = trim($folderPath, "/");
  144. $_pathParts = explode("/", $folderPath);
  145. $_currentPath = "/";
  146. for($i = -1; $i < sizeof($_pathParts); $i++) {
  147. if ($i >= 0) {
  148. if (!strlen($_pathParts[$i])) {
  149. continue;
  150. }
  151. if (array_key_exists($_currentPath . '*/', $this->_aclEntries))
  152. $_computedMask = $this->mergePathComputedMask( $_computedMask, $resourceType, $_userRole, $_currentPath . '*/' );
  153. $_currentPath .= $_pathParts[$i] . '/';
  154. }
  155. if (array_key_exists($_currentPath, $this->_aclEntries)) {
  156. $_computedMask = $this->mergePathComputedMask( $_computedMask, $resourceType, $_userRole, $_currentPath );
  157. }
  158. }
  159. return $_computedMask;
  160. }
  161. /**
  162. * merge current mask with folder entries
  163. *
  164. * @access private
  165. * @param int $currentMask
  166. * @param string $resourceType
  167. * @param string $userRole
  168. * @param string $path
  169. * @return int
  170. */
  171. function mergePathComputedMask( $currentMask, $resourceType, $userRole, $path )
  172. {
  173. $_folderEntries = $this->_aclEntries[$path];
  174. $_possibleEntries = array();
  175. $_possibleEntries[0] = "*#@#*";
  176. $_possibleEntries[1] = "*#@#" . $resourceType;
  177. if (!is_null($userRole))
  178. {
  179. $_possibleEntries[2] = $userRole . "#@#*";
  180. $_possibleEntries[3] = $userRole . "#@#" . $resourceType;
  181. }
  182. for ($r = 0; $r < sizeof($_possibleEntries); $r++)
  183. {
  184. $_possibleKey = $_possibleEntries[$r];
  185. if (array_key_exists($_possibleKey, $_folderEntries))
  186. {
  187. $_rulesMasks = $_folderEntries[$_possibleKey];
  188. $currentMask |= array_sum($_rulesMasks[0]);
  189. $currentMask ^= ($currentMask & array_sum($_rulesMasks[1]));
  190. }
  191. }
  192. return $currentMask;
  193. }
  194. }