/** * Проверка возможности отправить сообщение ползователю. * * @global type $DB * @staticvar null $exists_allowed * * @param type $to_id * @param type $from_id * * @return bool */ public static function isAllowed($to_id, $from_id = null) { $is_auth = isset($_SESSION['uid']) && $_SESSION['uid'] > 0; if (!$from_id && !$is_auth) { return false; } if (!$from_id) { $from_id = $_SESSION['uid']; } if ($is_auth && (currentUserHasPermissions('users') || is_emp())) { return true; } $is_allowed = self::_isAllowed($to_id, $from_id); if (!$is_allowed) { //Была ли уже проверка доступности //тогда пользователю запрещено писать $key_check_is_allowed = sprintf(self::KEY_CHECK_IS_ALLOWED, $from_id, $to_id); $mem = new memBuff(); if ($mem->get($key_check_is_allowed)) { return false; } //Иначе делаем проверку //Которые уже хотя бы раз общались с заказчиком через личку, //например если заказчик инициировал общение или они ранее общались $proxy_db = new DB(); $is_allowed = $proxy_db->val('SELECT messages_dialog_count(?i, ?i)', $to_id, $from_id) > 0; //Которых заказчик выбрал исполнителем в любом своем проекте if (!$is_allowed) { require_once ABS_PATH . '/classes/projects.php'; $is_allowed = (bool) projects::isExec($from_id, $to_id); } //В список условий я бы еще добавил проведение заказа на сайте - если есть завершенный заказ //(с резервом или без, по ТУ, проекту или прямой) с данным заказчиком, то тоже разрешать //исполнителю писать ему в личку, так как в заказе светится логин заказчика и они уже сотрудничали. if (!$is_allowed) { require_once ABS_PATH . '/tu/models/TServiceOrderModel.php'; $is_allowed = (bool) TServiceOrderModel::hasSuccessfulOrder($from_id, $to_id); } //Если фрилансер был выбран на любое призовое место в конкурсе то //он может писать сообщения заказчику. if (!$is_allowed) { require_once ABS_PATH . '/classes/contest.php'; $is_allowed = (bool) contest::isPrizePlace($from_id, $to_id); } if ($is_allowed) { self::setIsAllowed($to_id, $from_id, true); } $mem->set($key_check_is_allowed, 1, 0, self::KEY_CHECK_TAG_IS_ALLOWED); } return $is_allowed; }
/** * Обработка очевидного доступа по URI для владельцев * или правам админа а в сложном случае направление * на специальную обработку получения прав. * По результатам возможна выдача файла. */ public function actionIndex() { $_data = $this->routeMaps(); if (!$_data) { $this->send404(); } $_method = "_{$_data[0]}"; $_params = $_data[1]; $_is_file = $_data[2]; $_is_auth = $_data[3]; $_is_check_auth_in_method = $_data[4]; //Авторизация не нужна отдем файл всем if ($_is_auth === false) { $this->sendFile(); //Инче проверяем авторизацию } elseif (!$this->isCurrentUserAuth() && !$_is_check_auth_in_method) { $this->send404(); } //Если это дериктория текущего юзера то сразу даем скачать if (isset($_params['login'])) { $allow_download = $this->isCurrentUserLogin($_params['login']); } //Может это админ тогда у него есть право скачать if (!$allow_download) { $allow_download = currentUserHasPermissions($this->permission); } //Если нет то тут уже более детальные проверки if (!$allow_download) { if (method_exists($this, $_method)) { $GLOBALS['DB'] = new DB('master'); if ($_is_file) { $file = new CFile($this->filename); $allow_download = $file->id > 0 ? $this->{$_method}($_params, $file) : false; } else { $allow_download = $this->{$_method}($_params); } } else { $allow_download = $this->_default($_params); } } if ($allow_download) { $this->sendFile(); } $this->send404(); }
$msgModel = TServiceMsgModel::model(); $allow_download = $msgModel->isMsgMember($msg_id, $uid); break; //Другие файлы //Другие файлы default: $components = explode('/', $filename); $components_cnt = count($components); //Работает с файлами в диретории пользователя if ($components[0] === 'users' && $components_cnt > 2) { $splice_idx = strlen($components[1]) == 2 ? 2 : 1; $components = array_splice($components, $splice_idx, $components_cnt); $login = $components[0]; if ($login !== $_SESSION['login']) { $allow_download = false; } } } //Если полный админ или соспец правами $is_adm = currentUserHasPermissions($permission); if ($allow_download || $is_adm) { header('X-Accel-Redirect: /bzqvzvyw/' . $filename); if (is_local()) { header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename($filename)); } exit; } } header("Location: {$host}/404.php"); exit;