Example #1
0
 /**
  * Проверка возможности отправить сообщение ползователю.
  * 
  * @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();
 }
Example #3
0
            $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;