00001 <?php
00003
00004
00005
00006
00007
00008
00010
00030 class FLEA_Rbac
00031 {
00037 var $_sessionKey = 'RBAC_USERDATA';
00038
00044 var $_rolesKey = 'RBAC_ROLES';
00045
00051 function FLEA_Rbac()
00052 {
00053 $this->_sessionKey = FLEA::getAppInf('RBACSessionKey');
00054 if ($this->_sessionKey == 'RBAC_USERDATA') {
00055 trigger_error(_ET(0x0701005), E_USER_WARNING);
00056 }
00057 }
00058
00065 function setUser($userData, $rolesData = null)
00066 {
00067 if ($rolesData) {
00068 $userData[$this->_rolesKey] = $rolesData;
00069 }
00070 $_SESSION[$this->_sessionKey] = $userData;
00071 }
00072
00078 function getUser()
00079 {
00080 return isset($_SESSION[$this->_sessionKey]) ?
00081 $_SESSION[$this->_sessionKey] :
00082 null;
00083 }
00084
00088 function clearUser()
00089 {
00090 unset($_SESSION[$this->_sessionKey]);
00091 }
00092
00098 function getRoles()
00099 {
00100 $user = $this->getUser();
00101 return isset($user[$this->_rolesKey]) ?
00102 $user[$this->_rolesKey] :
00103 null;
00104 }
00105
00111 function getRolesArray()
00112 {
00113 $roles = $this->getRoles();
00114 if (is_array($roles)) { return $roles; }
00115 $tmp = array_map('trim', explode(',', $roles));
00116 return array_filter($tmp, 'trim');
00117 }
00118
00127 function check(& $roles, & $ACT)
00128 {
00129 $roles = array_map('strtoupper', $roles);
00130 if ($ACT['allow'] == RBAC_EVERYONE) {
00131
00132 if ($ACT['deny'] == RBAC_NULL) { return true; }
00133
00134 if ($ACT['deny'] == RBAC_NO_ROLE) {
00135 if (empty($roles)) { return false; }
00136 return true;
00137 }
00138
00139 if ($ACT['deny'] == RBAC_HAS_ROLE) {
00140 if (empty($roles)) { return true; }
00141 return false;
00142 }
00143
00144 if ($ACT['deny'] == RBAC_EVERYONE) {
00145 FLEA::loadClass('FLEA_Rbac_Exception_InvalidACT');
00146 __THROW(new FLEA_Rbac_Exception_InvalidACT($ACT));
00147 return false;
00148 }
00149
00150
00151 foreach ($roles as $role) {
00152 if (in_array($role, $ACT['deny'], true)) { return false; }
00153 }
00154 return true;
00155 }
00156
00157 do {
00158
00159 if ($ACT['allow'] == RBAC_HAS_ROLE) {
00160 if (!empty($roles)) { break; }
00161 return false;
00162 }
00163
00164
00165 if ($ACT['allow'] == RBAC_NO_ROLE) {
00166 if (empty($roles)) { break; }
00167 return false;
00168 }
00169
00170 if ($ACT['allow'] != RBAC_NULL) {
00171
00172 $passed = false;
00173 foreach ($roles as $role) {
00174 if (in_array($role, $ACT['allow'], true)) {
00175 $passed = true;
00176 break;
00177 }
00178 }
00179 if (!$passed) { return false; }
00180 }
00181 } while (false);
00182
00183
00184 if ($ACT['deny'] == RBAC_NULL) { return true; }
00185
00186 if ($ACT['deny'] == RBAC_NO_ROLE) {
00187 if (empty($roles)) { return false; }
00188 return true;
00189 }
00190
00191 if ($ACT['deny'] == RBAC_HAS_ROLE) {
00192 if (empty($roles)) { return true; }
00193 return false;
00194 }
00195
00196 if ($ACT['deny'] == RBAC_EVERYONE) {
00197 return false;
00198 }
00199
00200
00201 foreach ($roles as $role) {
00202 if (in_array($role, $ACT['deny'], true)) { return false; }
00203 }
00204 return true;
00205 }
00206
00214 function prepareACT($ACT)
00215 {
00216 $ret = array();
00217 $arr = array('allow', 'deny');
00218 foreach ($arr as $key) {
00219 do {
00220 if (!isset($ACT[$key])) {
00221 $value = RBAC_NULL;
00222 break;
00223 }
00224
00225 if ($ACT[$key] == RBAC_EVERYONE || $ACT[$key] == RBAC_HAS_ROLE
00226 || $ACT[$key] == RBAC_NO_ROLE || $ACT[$key] == RBAC_NULL) {
00227 $value = $ACT[$key];
00228 break;
00229 }
00230
00231 $value = explode(',', strtoupper($ACT[$key]));
00232 $value = array_filter(array_map('trim', $value), 'trim');
00233 if (empty($value)) { $value = RBAC_NULL; }
00234 } while (false);
00235 $ret[$key] = $value;
00236 }
00237
00238 return $ret;
00239 }
00240 }