| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830 |
- <?php defined('BX_DOL') or die('hack attempt');
- /**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup UnaCore UNA Core
- * @{
- */
- define('BX_DOL_PG_HIDDEN', '1');
- define('BX_DOL_PG_MEONLY', '2');
- define('BX_DOL_PG_ALL', '3');
- define('BX_DOL_PG_MEMBERS', '4');
- define('BX_DOL_PG_FRIENDS', '5');
- define('BX_DOL_PG_FRIENDS_SELECTED', '6');
- define('BX_DOL_PG_RELATIONS', '7');
- define('BX_DOL_PG_RELATIONS_SELECTED', '8');
- define('BX_DOL_PG_MEMBERSHIPS_SELECTED', '9');
- define('BX_DOL_PG_CUSTOM', '99');
- define('BX_DOL_PG_DEFAULT', BX_DOL_PG_ALL);
- /**
- * Privacy settings for any content.
- *
- * Integration of the content with privacy engine allows site member
- * to organize the access to his content.
- *
- * In addition to regular privacy groups (Public, Friends), spaces are supported.
- * When some space (usually some another profile) is specified as privacy,
- * then another profile visibility is used to check the privacy.
- *
- * Related classes:
- * BxDolPrivacyQuery - database queries.
- *
- * Example of usage:
- * 1. Register your privacy actions in `sys_privacy_actions` database table.
- * 2. Add one privacy field(with INT type) in the table with your items for each action.
- * For example, for action 'comment', the field name should be 'allow_comment_to'.
- * 3. Add group choosers for necessary actions in the form, which is used to add new items.
- * @code
- * $oPrivacy = new BxDolPrivacy();
- * $oPrivacy->getGroupChooser($iItemOwnerId, $sModuleUri, $sModuleAction);
- * @endcode
- *
- * 4. Check privacy when any user tries to view an item.
- * @code
- * $oPrivacy = new BxDolPrivacy($sTable, $sFieldId, $sFieldOwnerId);
- * if($oPrivacy->check($sAction, $iObjectId, $iViewerId)) {
- * //show necessary content
- * }
- * @endcode
- *
- * @see an example of integration in BoonEx modules, for example: Posts
- *
- *
- * Memberships/ACL:
- * Doesn't depend on user's membership.
- *
- *
- * Alerts:
- * no alerts available
- *
- */
- class BxDolPrivacy extends BxDolFactory implements iBxDolFactoryObject
- {
- protected $_oDb;
- protected $_sObject;
- protected $_aObject;
- protected $_aGroupsSettings;
- protected $_aGroupsExclude;
-
- protected $_sFormGroupCustom;
- protected $_sFormDisplayGcMembers;
- protected $_sFormDisplayGcMemberships;
- /**
- * Constructor
- * @param $aObject array of grid options
- */
- protected function __construct($aObject)
- {
- parent::__construct();
- $this->_aObject = $aObject;
- $this->_sObject = $aObject['object'];
- $this->_oDb = new BxDolPrivacyQuery();
- $this->_oDb->init($this->_aObject);
- $this->_aGroupsSettings = [
- BX_DOL_PG_FRIENDS_SELECTED => [
- 'name' => 'friends',
- 'is_allowed' => '',
- 'connection' => 'sys_profiles_friends',
- 'js_method_create_group' => 'selectMembers',
- 'db_table_items' => 'sys_privacy_groups_custom_members',
- 'db_field_item' => 'member_id',
- 'uri_get_items' => 'users_list',
- ],
- BX_DOL_PG_RELATIONS_SELECTED => [
- 'name' => 'relations',
- 'is_allowed' => '',
- 'connection' => 'sys_profiles_relations',
- 'js_method_create_group' => 'selectMembers',
- 'db_table_items' => 'sys_privacy_groups_custom_members',
- 'db_field_item' => 'member_id',
- 'uri_get_items' => 'users_list',
- ],
- BX_DOL_PG_MEMBERSHIPS_SELECTED => [
- 'name' => 'memberships',
- 'is_allowed' => 'isAllowedMemberships',
- 'connection' => '',
- 'js_method_create_group' => 'selectMemberships',
- 'db_table_items' => 'sys_privacy_groups_custom_memberships',
- 'db_field_item' => 'membership_id',
- 'uri_get_items' => 'memberships_list',
- ]
- ];
- $this->_aGroupsExclude = array();
- $this->_sFormGroupCustom = 'sys_privacy_group_custom';
- $this->_sFormDisplayGcMembers = 'sys_privacy_group_custom_members';
- $this->_sFormDisplayGcMemberships = 'sys_privacy_group_custom_memberships';
- }
- /**
- * Get privacy object instance by object name
- * @param $sObject object name
- * @return object instance or false on error
- */
- public static function getObjectInstance($sObject)
- {
- if(isset($GLOBALS['bxDolClasses']['BxDolPrivacy!' . $sObject]))
- return $GLOBALS['bxDolClasses']['BxDolPrivacy!' . $sObject];
- $aObject = BxDolPrivacyQuery::getPrivacyObject($sObject);
- if(!$aObject || !is_array($aObject))
- return false;
- $sClass = 'BxTemplPrivacy';
- if(!empty($aObject['override_class_name'])) {
- $sClass = $aObject['override_class_name'];
- if(!empty($aObject['override_class_file']))
- require_once(BX_DIRECTORY_PATH_ROOT . $aObject['override_class_file']);
- }
- $o = new $sClass($aObject);
- return ($GLOBALS['bxDolClasses']['BxDolPrivacy!' . $sObject] = $o);
- }
- /**
- * Get Select element with available groups.
- *
- * @param string $sObject privacy object name.
- * @param integer $iOwnerId object's owner ID.
- * @param array $aParams an array of custom selector's params (dynamic_groups - an array of arrays('key' => group_id, 'value' => group_title), title - the title to be used for generated field).
- * @return an array with Select element description.
- */
- public static function getGroupChooser($sObject, $iOwnerId = 0, $aParams = array())
- {
- $oPrivacy = BxDolPrivacy::getObjectInstance($sObject);
- if(empty($oPrivacy))
- return array();
- $sModule = $oPrivacy->_aObject['module'];
- $sAction = $oPrivacy->_aObject['action'];
- if($iOwnerId == 0)
- $iOwnerId = bx_get_logged_profile_id();
- $sValue = $oPrivacy->_oDb->getDefaultGroupByUser($sModule, $sAction, $iOwnerId);
- if(empty($sValue))
- $sValue = $oPrivacy->_oDb->getDefaultGroup($sModule, $sAction);
- $aValues = $oPrivacy->getGroups($iOwnerId, $aParams);
- $aValues = $oPrivacy->addDynamicGroups($aValues, $iOwnerId, $aParams);
- $aValues = $oPrivacy->addSpaces($aValues, $iOwnerId, $aParams);
- $sName = $oPrivacy->convertActionToField($sAction);
- $sTitle = isset($aParams['title']) && !empty($aParams['title']) ? $aParams['title'] : '';
- if(empty($sTitle)) {
- $sTitle = $oPrivacy->_oDb->getTitle($sModule, $sAction);
- $sTitle = _t(!empty($sTitle) ? $sTitle : '_' . $sName);
- }
- $bDynamicMode = (isset($aParams['dynamic_mode']) && (bool)$aParams['dynamic_mode'] === true) || bx_is_dynamic_request();
- return array(
- 'type' => 'select',
- 'name' => $sName,
- 'caption' => $sTitle,
- 'value' => $sValue,
- 'values' => $aValues,
- 'attrs' => array(
- 'class' => 'sys-privacy-group',
- 'onchange' => 'javascript: ' . $oPrivacy->getJsObjectName() . '.selectGroup(this);'
- ),
- 'checker' => array(
- 'func' => 'avail',
- 'error' => _t('_sys_ps_ferr_incorrect_select')
- ),
- 'db' => array(
- 'pass' => 'Int'
- ),
- 'content' => $oPrivacy->addCssJs($bDynamicMode)
- );
- }
- public static function initGroupChooser($sObject, $iOwnerId = 0, $aParams = array())
- {
- $sResult = '';
- $oPrivacy = BxDolPrivacy::getObjectInstance($sObject);
- if(empty($oPrivacy))
- return $sResult;
- $iOwnerId = !empty($iOwnerId) ? (int)$iOwnerId : bx_get_logged_profile_id();
- $iContentId = !empty($aParams['content_id']) ? (int)$aParams['content_id'] : 0;
- $iGroupId = !empty($aParams['group_id']) ? (int)$aParams['group_id'] : 0;
- $bDynamicMode = (isset($aParams['dynamic_mode']) && (bool)$aParams['dynamic_mode'] === true) || bx_is_dynamic_request();
- $sJsCodeAdd = '';
- if($oPrivacy->isGroupsCustom())
- $sJsCodeAdd = $oPrivacy->getLoadGroupCustom($iOwnerId, $iContentId, $iGroupId, isset($aParams['html_ids']) ? $aParams['html_ids'] : array());
- return $oPrivacy->getJsScript($sJsCodeAdd, $bDynamicMode);
- }
-
- public static function getIcon($iVisibility)
- {
- $aIcons =array(
- BX_DOL_PG_MEONLY => 'lock',
- BX_DOL_PG_ALL => 'globe',
- BX_DOL_PG_FRIENDS => 'user-friends',
- BX_DOL_PG_FRIENDS => 'user-friends'
- );
- return isset($aIcons[$iVisibility]) ? $aIcons[$iVisibility] : 'eye';
- }
-
-
- public function actionLoadGroupCustom()
- {
- $iProfileId = (int)bx_get('profile_id');
- $iContentId = (int)bx_get('content_id');
- $iGroupId = (int)bx_get('group_id');
- $oForm = BxDolForm::getObjectInstance($this->_sFormGroupCustom, $this->_sFormDisplayGcMembers);
- return echoJson(array('eval' => $this->getJsObjectName() . '.onSelectGroup(oData);', 'content' => $oForm->getElementGroupCustom(array(
- 'profile_id' => $iProfileId,
- 'content_id' => $iContentId,
- 'object' => $this->_sObject,
- 'group_id' => $iGroupId
- ))));
- }
- public function actionSelectMembers()
- {
- $aValues = array(
- 'profile_id' => (int)bx_get('profile_id'),
- 'content_id' => (int)bx_get('content_id'),
- 'object' => $this->_sObject,
- 'group_id' => (int)bx_get('group_id')
- );
- $aParams = array(
- 'popup_only' => (bool)bx_get('popup_only')
- );
- if(!isset($this->_aGroupsSettings[$aValues['group_id']]))
- return echoJson(array());
- if($aValues['profile_id'] != bx_get_logged_profile_id())
- return echoJson(array('msg' => _t('_sys_ps_ferr_incorrect_gc_owner')));
- if(($mixedResult = $this->isSelectGroupCustomUsers($aValues)) !== true)
- return echoJson(array('msg' => $mixedResult));
- return echoJson($this->getSelectGroup($aValues, $aParams));
- }
- public function actionSelectMemberships()
- {
- $aValues = array(
- 'profile_id' => (int)bx_get('profile_id'),
- 'content_id' => (int)bx_get('content_id'),
- 'object' => $this->_sObject,
- 'group_id' => (int)bx_get('group_id')
- );
- $aParams = array(
- 'popup_only' => (bool)bx_get('popup_only')
- );
- if(!isset($this->_aGroupsSettings[$aValues['group_id']]))
- return echoJson(array());
- if($aValues['profile_id'] != bx_get_logged_profile_id())
- return echoJson(array('msg' => _t('_sys_ps_ferr_incorrect_gc_owner')));
- if(($mixedResult = $this->isSelectGroupCustomMemberships($aValues)) !== true)
- return echoJson(array('msg' => $mixedResult));
- return echoJson($this->getSelectMemberships($aValues, $aParams));
- }
- public function actionUsersList()
- {
- $iGroup = (int)bx_get('group');
- if(!isset($this->_aGroupsSettings[$iGroup]))
- return echoJson(array());
- $oConnection = BxDolConnection::getObjectInstance($this->_aGroupsSettings[$iGroup]['connection']);
- if(!$oConnection)
- return echoJson(array());
- $iProfileId = bx_get_logged_profile_id();
- $aConnectedIds = $oConnection->getConnectedContent($iProfileId, true);
- if(empty($aConnectedIds) || !is_array($aConnectedIds))
- return echoJson(array());
- $sTerm = bx_get('term');
- $aProfiles = BxDolService::call('system', 'profiles_search', array($sTerm), 'TemplServiceProfiles');
- if(empty($aProfiles))
- return echoJson(array());
-
- $aResult = array();
- foreach($aProfiles as $aProfile)
- if(in_array($aProfile['value'], $aConnectedIds))
- $aResult[] = $aProfile;
- echoJson($aResult);
- }
- public function getGroupSettings($iGroup)
- {
- if(empty($this->_aGroupsSettings[$iGroup]) || !is_array($this->_aGroupsSettings[$iGroup]))
- return false;
- return $this->_aGroupsSettings[$iGroup];
- }
- public function isGroupsCustom()
- {
- $aGroups = $this->_oDb->getGroupsBy(array('type' => 'active_list'));
- return in_array(BX_DOL_PG_FRIENDS_SELECTED, $aGroups) || in_array(BX_DOL_PG_RELATIONS_SELECTED, $aGroups) || in_array(BX_DOL_PG_MEMBERSHIPS_SELECTED, $aGroups);
- }
-
- public function getGroupsBy($aParams)
- {
- return $this->_oDb->getGroupsBy($aParams);
- }
- public function getGroupCustom($aParams)
- {
- return $this->_oDb->getGroupCustom($aParams);
- }
- public function updateGroupCustom($aParamsSet, $aParamsWhere)
- {
- return $this->_oDb->updateGroupCustom($aParamsSet, $aParamsWhere);
- }
- public function deleteGroupCustom($aParamsWhere)
- {
- return $this->_oDb->deleteGroupCustom($aParamsWhere);
- }
- public function associateGroupCustomWithContent($iProfileId, $iContentId, $iGroupId)
- {
- return $this->updateGroupCustom(array('content_id' => $iContentId), array(
- 'profile_id' => $iProfileId,
- 'content_id' => 0,
- 'object' => $this->_sObject,
- 'group_id' => $iGroupId
- ));
- }
- public function reassociateGroupCustomWithContent($iProfileId, $iContentId, $iGroupId)
- {
- $aGroupCustom = $this->getGroupCustom(array(
- 'type' => 'pco',
- 'profile_id' => $iProfileId,
- 'content_id' => $iContentId,
- 'object' => $this->_sObject
- ));
- if(!empty($aGroupCustom) && is_array($aGroupCustom) && $aGroupCustom['group_id'] != $iGroupId) {
- $this->deleteGroupCustom(array('id' => $aGroupCustom['id']));
- $this->associateGroupCustomWithContent($iProfileId, $iContentId, $iGroupId);
- }
- }
- public function deleteGroupCustomByContentId($iContentId)
- {
- return $this->_oDb->deleteGroupCustom(array('content_id' => $iContentId, 'object' => $this->_sObject));
- }
- public function deleteGroupCustomByProfileId($iProfileId)
- {
- $aGroups = $this->_oDb->getGroupCustom(array('type' => 'profile_id', 'profile_id' => $iProfileId));
- if(empty($aGroups) || !is_array($aGroups))
- return true;
- foreach($aGroups as $aGroup)
- $this->_oDb->deleteGroupCustom(array('id' => $aGroup['id']));
- return true;
- }
- public function addDynamicGroups($aValues, $iOwnerId, $aParams)
- {
- if (isset($aParams['dynamic_groups']) && is_array($aParams['dynamic_groups']))
- $aValues = array_merge($aValues, $aParams['dynamic_groups']);
- return $aValues;
- }
- public function addSpaces($aValues, $iOwnerId, $aParams)
- {
- if (!$this->_aObject['spaces'])
- return $aValues;
- if (!($oProfile = BxDolProfile::getInstance($iOwnerId)))
- return $aValues;
- if (!($aModules = BxDolModuleQuery::getInstance()->getModules()))
- return $aValues;
-
- $aExcludeModules = explode(',', getParam('sys_hide_post_to_context_for_privacy'));
-
- foreach ($aModules as $aModule) {
- if (!$aModule['enabled'])
- continue;
- if ('all' != $this->_aObject['spaces'] && false === stripos($this->_aObject['spaces'], $aModule['name']))
- continue;
- if (!BxDolRequest::serviceExists($aModule['name'], 'act_as_profile'))
- continue;
-
- if (in_array($aModule['name'], $aExcludeModules))
- continue;
- $oModule = BxDolModule::getInstance($aModule['name']);
-
- $a = BxDolService::call($aModule['name'], 'get_participating_profiles', array($oProfile->id()));
- // for an organization we should treat the organization profile itself as a participant of itself
- // to be able to post into an organization's context while being logged as that organization
- if ($aModule['name'] == 'bx_organizations' && $oProfile->getModule() == 'bx_organizations') $a = array_merge($a, [$oProfile->id()]);
- $aSpaces = array();
- foreach ($a as $iProfileId) {
- if (!($o = BxDolProfile::getInstance($iProfileId)))
- continue;
- // check whether a profile is allowed to post this type of content to a context
- $oConnectedProfile = BxDolProfile::getInstance($iProfileId);
- if (bx_srv($aModule['name'], 'check_allowed_post_in_profile', array($oConnectedProfile->getContentId(), $this->_aObject['module'])) !== CHECK_ACTION_RESULT_ALLOWED)
- continue;
- $aSpaces[-$iProfileId] = array('key' => -$iProfileId, 'value' => $o->getDisplayName());
- }
- if ($aSpaces) {
- $aItemStart = array(array('type' => 'group_header', 'value' => mb_strtoupper(BxDolService::call($aModule['name'], 'get_space_title'))));
- $aItemEnd = array(array('type' => 'group_end'));
- $aValues = array_merge($aValues, $aItemStart, array_values($aSpaces), $aItemEnd);
- }
- }
-
- return $aValues;
- }
-
- /**
- * Get database field name for action.
- *
- * @param string $sObject privacy object name.
- * @param string $sAction action name.
- * @return string with field name.
- */
- public static function getFieldName($sObject, $sAction = '')
- {
- $oPrivacy = BxDolPrivacy::getObjectInstance($sObject);
- if(empty($oPrivacy))
- return '';
- if(empty($sAction))
- $sAction = $oPrivacy->_aObject['action'];
- return $oPrivacy->convertActionToField($sAction);
- }
- /**
- * Get necessary condition array to use privacy in search classes
- * @param $mixedGroupId group ID or array of group IDs
- * @return array of conditions, for now with 'restriction' part only is returned
- */
- public function getContentByGroupAsCondition($mixedGroupId)
- {
- $aResult = array(
- 'restriction' => array (
- 'privacy_' . $this->_sObject => array(
- 'value' => $mixedGroupId,
- 'field' => $this->convertActionToField($this->_aObject['action']),
- 'operator' => is_array($mixedGroupId) ? 'in' : '=',
- 'table' => $this->_aObject['table'],
- ),
- ),
- );
- bx_alert('system', 'privacy_condition', 0, false, array(
- 'group_id' => $mixedGroupId,
- 'field' => $this->convertActionToField($this->_aObject['action']),
- 'object' => $this->_aObject,
- 'privacy_object' => $this,
- 'result' => &$aResult
- )
- );
- return $aResult;
- }
- /**
- * Get necessary condition array to use privacy in search classes
- * @param $iProfileIdOwner owner profile ID
- * @return array of conditions, for now with 'restriction' part only is returned
- */
- public function getContentPublicAsCondition($iProfileIdOwner = 0, $aCustomGroups = array())
- {
- $mixedPrivacyGroups = $this->getPrivacyGroupsForContentPublic($iProfileIdOwner, $aCustomGroups);
- if($mixedPrivacyGroups === true)
- return array();
- return $this->getContentByGroupAsCondition($mixedPrivacyGroups);
- }
- /**
- * Get necessary parts of SQL query to use privacy in other queries
- * @param $mixedGroupId group ID or array of group IDs
- * @return array of SQL string parts, for now 'where' part only is returned
- */
- public function getContentByGroupAsSQLPart($mixedGroupId)
- {
- $sField = $this->convertActionToField($this->_aObject['action']);
- return $this->_oDb->getContentByGroupAsSQLPart($sField, $mixedGroupId);
- }
- /**
- * Get necessary parts of SQL query to use privacy in other queries
- * @param $iProfileIdOwner owner profile ID
- * @return array of SQL string parts, for now 'where' part only is returned
- */
- public function getContentPublicAsSQLPart($iProfileIdOwner = 0, $aCustomGroups = array())
- {
- $mixedPrivacyGroups = $this->getPrivacyGroupsForContentPublic($iProfileIdOwner, $aCustomGroups);
- if($mixedPrivacyGroups === true)
- return array();
- return $this->getContentByGroupAsSQLPart($mixedPrivacyGroups);
- }
- /**
- * Check whether the viewer can make requested action.
- *
- * @param integer $iObjectId object ID the action to be performed with.
- * @param integer $iViewerId viewer ID.
- * @return boolean result of operation.
- */
- public function check($iObjectId, $iViewerId = 0)
- {
- $aObject = $this->getObjectInfo($this->convertActionToField($this->_aObject['action']), $iObjectId);
- $bRv = $this->_check($iObjectId, $iViewerId, $aObject);
- bx_alert('system', 'check_privacy', 0, 0, array(
- 'object_id' => $iObjectId,
- 'viewer_id' => $iViewerId,
- 'object' => $aObject,
- 'object_privacy' => $this->_aObject,
- 'result' => &$bRv
- ));
- return $bRv;
- }
-
- public function checkSpace($aObject, $iViewerId)
- {
- $oProfile = BxDolProfile::getInstance(-$aObject['group_id']);
- if (!$oProfile)
- return false;
- return CHECK_ACTION_RESULT_ALLOWED === BxDolService::call($oProfile->getModule(), 'check_space_privacy', array($oProfile->getContentId()));
- }
- public function checkMeOnly($iOwnerId, $iViewerId)
- {
- return false;
- }
- public function checkPublic($iOwnerId, $iViewerId)
- {
- return true;
- }
- public function checkMembers($iOwnerId, $iViewerId)
- {
- return isMember();
- }
- public function checkFriends($iOwnerId, $iViewerId)
- {
- return BxDolConnection::getObjectInstance('sys_profiles_friends')->isConnected($iOwnerId, $iViewerId, true);
- }
- public function checkFriendsSelectedByObject($aObject, $iViewerId)
- {
- if(!$this->checkFriends($aObject['owner_id'], $iViewerId))
- return false;
- $aGroupCustom = $this->getGroupCustom(array(
- 'type' => 'pcog_ext',
- 'profile_id' => $aObject['owner_id'],
- 'content_id' => $aObject['id'],
- 'object' => $this->_sObject,
- 'group_id' => $aObject['group_id'],
- 'group_items_table' => $this->_aGroupsSettings[$aObject['group_id']]['db_table_items'],
- 'group_items_field' => $this->_aGroupsSettings[$aObject['group_id']]['db_field_item']
- ));
- return !empty($aGroupCustom['items']) && is_array($aGroupCustom['items']) && in_array($iViewerId, $aGroupCustom['items']);
- }
- public function checkRelations($iOwnerId, $iViewerId)
- {
- return BxDolConnection::getObjectInstance('sys_profiles_relations')->isConnected($iOwnerId, $iViewerId, true);
- }
- public function checkRelationsSelectedByObject($aObject, $iViewerId)
- {
- if(!$this->checkRelations($aObject['owner_id'], $iViewerId))
- return false;
- $aGroupCustom = $this->getGroupCustom(array(
- 'type' => 'pcog_ext',
- 'profile_id' => $aObject['owner_id'],
- 'content_id' => $aObject['id'],
- 'object' => $this->_sObject,
- 'group_id' => $aObject['group_id'],
- 'group_items_table' => $this->_aGroupsSettings[$aObject['group_id']]['db_table_items'],
- 'group_items_field' => $this->_aGroupsSettings[$aObject['group_id']]['db_field_item']
- ));
- return !empty($aGroupCustom['items']) && is_array($aGroupCustom['items']) && in_array($iViewerId, $aGroupCustom['items']);
- }
- public function checkMembershipsSelectedByObject($aObject, $iViewerId)
- {
- $aGroupCustom = $this->getGroupCustom(array(
- 'type' => 'pcog_ext',
- 'profile_id' => $aObject['owner_id'],
- 'content_id' => $aObject['id'],
- 'object' => $this->_sObject,
- 'group_id' => $aObject['group_id'],
- 'group_items_table' => $this->_aGroupsSettings[$aObject['group_id']]['db_table_items'],
- 'group_items_field' => $this->_aGroupsSettings[$aObject['group_id']]['db_field_item']
- ));
- return !empty($aGroupCustom['items']) && is_array($aGroupCustom['items']) && BxDolAcl::getInstance()->isMemberLevelInSet($aGroupCustom['items'], $iViewerId);
- }
- public function checkCustomByObject($aObject, $iViewerId)
- {
- return '';
- }
- public function setTableFieldAuthor($sValue)
- {
- $this->_aObject['table_field_author'] = $sValue;
- $this->_oDb->init($this->_aObject);
- }
- protected function getObjectInfo($sAction, $iObjectId)
- {
- return $this->_oDb->getObjectInfo($sAction, $iObjectId);
- }
- protected function getPrivacyGroupsForContentPublic($iProfileIdOwner = 0, $aCustomGroups = array())
- {
- $aGroups = array(BX_DOL_PG_ALL);
- if(isLogged()) {
- $iProfileIdLogged = bx_get_logged_profile_id();
- if($iProfileIdLogged == $iProfileIdOwner)
- return true;
- $aGroups[] = BX_DOL_PG_MEMBERS;
- if($iProfileIdOwner && $this->checkFriends($iProfileIdOwner, $iProfileIdLogged))
- $aGroups[] = BX_DOL_PG_FRIENDS;
- }
- return array_merge($aGroups, $aCustomGroups);
- }
- protected function getCheckMethod($s)
- {
- if(substr($s, 0, 1) != '@')
- return false;
- return bx_gen_method_name(str_replace('@', 'check_', $s));
- }
- protected function convertActionToField($sAction)
- {
- return 'allow_' . strtolower(str_replace(' ', '-', $sAction)) . '_to';
- }
- /**
- * Check whethere viewer is a member of dynamic group.
- *
- * @param mixed $mixedGroupId dynamic group ID.
- * @param integer $iObjectOwnerId object owner ID.
- * @param integer $iViewerId viewer ID.
- * @return boolean result of operation.
- */
- protected function isDynamicGroupMember($mixedGroupId, $iObjectOwnerId, $iViewerId, $iObjectId)
- {
- return false;
- }
- /**
- * get privacy groups for getGroupChooser
- */
- protected function getGroups($iOwnerId = 0, $aParams = [])
- {
- $aValues = array();
- $aGroups = $this->_oDb->getGroupsBy(array('type' => 'active'));
- foreach($aGroups as $aGroup) {
- $iGroupId = (int)$aGroup['id'];
- if((int)$aGroup['active'] == 0 || in_array($iGroupId, $this->_aGroupsExclude))
- continue;
- if(isset($this->_aGroupsSettings[$iGroupId]) && !empty($this->_aGroupsSettings[$iGroupId]['is_allowed'])) {
- $sMethodIsAllowed = $this->_aGroupsSettings[$iGroupId]['is_allowed'];
- if(method_exists($this, $sMethodIsAllowed) && $this->$sMethodIsAllowed($iOwnerId) !== true)
- continue;
- }
- $aValues[] = array('key' => $aGroup['id'], 'value' => _t($aGroup['title']));
- }
- return $aValues;
- }
- /**
- * Check whethere a custom group (based on users list) is allowed in current circumstances.
- * NOTE. Can be overwritten if it's needed.
- *
- * @param type $aParams an array of parameters.
- * @return boolean result of operation.
- */
- protected function isSelectGroupCustomUsers($aParams)
- {
- return true;
- }
- /**
- * Check whethere a custom group (based on memberships list) is allowed in current circumstances.
- * NOTE. Can be overwritten if it's needed.
- *
- * @param type $aParams an array of parameters.
- * @return boolean result of operation.
- */
- protected function isSelectGroupCustomMemberships($aParams)
- {
- return true;
- }
- public function isAllowedMemberships($iUserId)
- {
- $aCheck = checkActionModule($iUserId, 'show membership levels in privacy groups', 'system', false);
- return $aCheck[CHECK_ACTION_RESULT] === CHECK_ACTION_RESULT_ALLOWED;
- }
- /**
- * Check whether the viewer can make requested action.
- *
- * @param integer $iObjectId object ID the action to be performed with.
- * @param integer $iViewerId viewer ID.
- * @return boolean result of operation.
- */
- protected function _check($iObjectId, $iViewerId, $aObject)
- {
- if(empty($iViewerId))
- $iViewerId = (int)bx_get_logged_profile_id();
- if(empty($aObject) || !is_array($aObject))
- return false;
- if($aObject['group_id'] == BX_DOL_PG_HIDDEN)
- return false;
- $aViewer = BxDolProfileQuery::getInstance()->getInfoById($iViewerId);
- if(($aViewer && isAdmin($aViewer['account_id'])) || $iViewerId == $aObject['owner_id'])
- return true;
- if(strncmp($aObject['group_id'], 'ml', 2) === 0) {
- $iLevel = (int)substr($aObject['group_id'], 2);
- return (bool)BxDolAcl::getInstance()->isMemberLevelInSet(array($iLevel), $iViewerId);
- }
- if($aObject['group_id'] < 0)
- return $this->checkSpace($aObject, $iViewerId);
- $aGroup = $this->_oDb->getGroupsBy(array('type' => 'id', 'id' => $aObject['group_id']));
- if(!empty($aGroup) && is_array($aGroup) && (int)$aGroup['active'] == 1 && !empty($aGroup['check'])) {
- $sCheckMethod = $this->getCheckMethod($aGroup['check']);
- if(method_exists($this, $sCheckMethod) && $this->$sCheckMethod((substr($sCheckMethod, -8) == 'ByObject' ? $aObject : $aObject['owner_id']), $iViewerId))
- return true;
- }
- return $this->isDynamicGroupMember($aObject['group_id'], $aObject['owner_id'], $iViewerId, $iObjectId);
- }
- }
- /** @} */
|