33 static $instance = null;
34 if ( $instance === null ){
156 public static function view(&$perms, $params=array()){
168 public static function edit(&$perms, $params=array()){
180 public static function delete(&$perms, $params=array()){
218 public static function ALL(){
325 if ( $conf === null ){
326 import(
'Dataface/ConfigTool.php');
328 $conf = $configTool->loadConfig(
'permissions');
353 if ( isset($this->contextMasks) ){
354 $destRecords = $contextRecord->
toRecords();
356 foreach ($destRecords as $destRecord){
357 $id = $destRecord->getId();
358 if ( isset($this->contextMasks[$id]) ){
360 unset($this->contextMasks[$destRecord->getId()]);
364 $this->_cache = array();
387 if ( !isset($this->contextMasks) ) $this->contextMasks = array();
388 $parentPerms = $contextRecord->
getParent()->getPermissions(array(
'relationship'=>$contextRecord->_relationshipName));
390 if ( @$parentPerms[
'add new related record'] or @$parentPerms[
'add existing related record'] ){
393 if ( @$parentPerms[
'delete related record'] ){
394 $perms[
'delete'] = 1;
395 }
else if ( isset($parentPerms[
'delete related record']) and !@$parentPerms[
'delete related record'] ){
396 $perms[
'delete'] = 0;
397 }
if ( @$parentPerms[
'edit related records'] ){
399 }
else if ( isset($parentPerms[
'edit related records']) and !@$parentPerms[
'edit related records'] ){
402 if ( @$parentPerms[
'view related records'] ){
404 }
else if ( isset($parentPerms[
'view related records']) and !@$parentPerms[
'view related records'] ){
407 if ( @$parentPerms[
'find related records'] ){
409 }
else if ( isset($parentPerms[
'find related records']) and !@$parentPerms[
'find related records'] ){
412 if ( @$parentPerms[
'link related records'] ){
414 }
else if ( isset($parentPerms[
'link related records']) and !@$parentPerms[
'link related records'] ){
418 $recordPerms = $perms;
420 $domainTable = $contextRecord->_relationship->getDomainTable();
421 $destRecords = $contextRecord->
toRecords();
422 $numDest = count($destRecords);
423 $destRecordIndex = array();
424 $destRecordIds = array();
425 foreach ($destRecords as $destRecord){
426 $destRecordIndex[$destRecord->table()->tablename] = $destRecord;
427 $id = $destRecord->getId();
428 $destRecordIds[$destRecord->table()->tablename] = $id;
429 $this->contextMasks[$id] = $recordPerms;
432 if ( strcmp($destRecord->table()->tablename,$domainTable)===0 ){
436 if ( !@$parentPerms[
'add new related record'] ){
437 unset($this->contextMasks[$id][
'new']);
439 unset($this->contextMasks[$id][
'edit']);
440 unset($this->contextMasks[$id][
'link']);
444 if ( @$parentPerms[
'remove related record'] ){
445 $this->contextMasks[$id][
'delete'] = 1;
447 }
else if ( isset($parentPerms[
'remove related record']) and !@$parentPerms[
'remove related record'] ){
448 $this->contextMasks[$id][
'delete'] = 0;
453 $relationship = $contextRecord->_relationship;
454 $fields = $relationship->fields(
true,
true);
457 $fieldTable = $relationship->getTable($field);
458 $fieldTableName = $fieldTable->tablename;
459 $rec = $destRecordIndex[$fieldTableName];
461 if ( strpos($field,
'.') !==
false ) list($junk,
$fieldname) = explode(
'.', $field);
463 $perms = $rec->getPermissions(array(
'field'=>
$fieldname,
'nobubble'=>1));
464 if ( !$perms ) $perms = array();
465 $rfperms = $contextRecord->
getParent()->getPermissions(array(
'relationship'=>$contextRecord->_relationshipName,
'field'=>
$fieldname,
'nobubble'=>1));
468 foreach ($rfperms as $k=>$v){
472 if ( isset($constrainedFields[$fieldTableName.
'.'.
$fieldname]) ){
476 $id = $destRecordIds[$fieldTableName];
477 $this->contextMasks[$id.
'#'.
$fieldname] = $perms;
483 $this->_cache = array();
563 if ( !isset($this->contextMasks) ){
564 $this->contextMasks = array();
566 $contextRecord =
$app->getRecordContext();
567 if ( $contextRecord ){
570 if ( is_a($contextRecord,
'Dataface_RelatedRecord') ){
594 if ( isset($masks[$id]) )
return $masks[$id];
624 $this->delegate = $del;
629 if ( isset($this->context) ) unset($this->context);
634 $this->context = null;
638 static $pcontext = 0;
639 if ( !is_object($pcontext) ){
651 $this->_cache = array();
652 foreach ( array_keys($conf) as $key ){
654 if ( is_array($conf[$key]) ){
661 $this->rolePermissions[$key] =& $conf[$key];
667 $this->permissions[$key] = $conf[$key];
681 if ( isset($me->context) ){
682 return $me->context->getPermissions($obj, $params);
685 is_a($obj,
'Dataface_Table') or
686 is_a($obj,
'Dataface_Record') or
687 is_a($obj,
'Dataface_RelatedRecord') or
688 is_a($obj,
'Dataface_Relationship') ){
690 $perms = $obj->getPermissions($params);
691 $me->filterPermissions($obj, $perms, $params);
696 'scripts.Dataface.PermissionsTool.getPermissions.ERROR_PARAMETER_1',
697 'In Dataface_PermissionsTool, expected first argument to be Dataface_Table, Dataface_Record, or Dataface_Relationship, but received '.get_class($obj).
"\n<br>",
698 array(
'class'=>get_class($obj))
703 if ( isset($this->delegate) and method_exists($this->delegate,
'filterPermissions') ) $this->delegate->filterPermissions($obj, $perms, $params);
716 if ( is_array($perms) ){
718 return (isset( $perms[$permissionName]) and $perms[$permissionName]);
722 throw new Exception($perms->toString(), E_USER_ERROR);
725 if ( !is_object($perms) ){
732 return $me->checkPermission($permissionName, $me->getPermissions($perms, $params) );
742 function view(&$perms, $params=array()){
744 return $me->checkPermission(
'view', $perms, $params);
755 function edit(&$perms, $params=array()){
757 return $me->checkPermission(
'edit', $perms, $params);
768 function delete(&$perms, $params=array()){
771 return $me->checkPermission(
'delete',$perms,$params);
776 if ( isset($me->_cache[
'mask'] ) )
return $me->_cache[
'mask'];
781 $perms = $me->permissions;
782 foreach (array_keys($perms) as $key){
785 $me->_cache[
'mask'] = $perms;
803 static $no_access = 0;
804 if ( $no_access === 0 ){
817 if ( isset($me->_cache[
'read_only']) )
return $me->_cache[
'read_only'];
820 $read_only = $me->getRolePermissions(
'READ ONLY');
821 $read_only = array_map(
'intval', $read_only);
822 $me->_cache[
'read_only'] = $read_only;
834 if ( isset($me->_cache[
'all']) )
return $me->_cache[
'all'];
836 foreach ( array_keys($me->permissions) as $key){
839 $me->_cache[
'all'] = $perms;
850 if ( isset($me->_cache[
'read_edit']) )
return $me->_cache[
'read_edit'];
851 $read_and_edit = $me->getRolePermissions(
'EDIT');
852 $read_and_edit = array_map(
'intval', $read_and_edit);
853 $me->_cache[
'read_edit'] = $read_and_edit;
854 return $read_and_edit;
877 if ( !isset($me->rolePermissions[$roleName]) ){
882 'The role "'.$roleName.
'" is not a registered role.',
883 array(
'role'=>$roleName)
888 return $me->rolePermissions[$roleName];
894 return isset($this->rolePermissions[$roleName]);
902 if ( !is_array(
$permissions) )
throw new Exception(
"namesAsArray expects array.");
923 if (!isset($record) ){
924 if ( isset($params[
'table']) ){
925 $record_id = $params[
'table'];
927 $record_id=
'__null__';
930 else $record_id = $record->
getId();
932 if ( count($params) > 0 ){
934 foreach ( $params as $key=>$value ){
935 if ( is_object($value) or is_array($value) )
return null;
936 $qstr[] = urlencode($key).
'='.urlencode($value);
938 $qstr = implode(
'&', $qstr);
943 $this->_cache[
'__permissions'][$record_id][$qstr] = $perms;
948 if (!isset($record) ){
949 if ( isset($params[
'table']) ){
950 $record_id = $params[
'table'];
952 $record_id=
'__null__';
955 else $record_id = $record->
getId();
957 if ( count($params) > 0 ){
959 foreach ( $params as $key=>$value ){
960 if ( is_object($value) or is_array($value) )
return null;
961 $qstr[] = urlencode($key).
'='.urlencode($value);
963 $qstr = implode(
'&', $qstr);
968 if (isset($this->_cache[
'__permissions'][$record_id][$qstr]) ){
969 return $this->_cache[
'__permissions'][$record_id][$qstr];