Example #1
0
 public function execute()
 {
     $user = Loader::get_user();
     $user->get_module('secret_key')->unset_secret_key();
     Session::destroy(Session::get_sid());
     $user->reset(0);
     self::set_client_command('unset_secret_key', array());
     self::set_client_command('refresh', array('url' => 'self'));
 }
Example #2
0
 public static function check_signature($client_sig)
 {
     $user = Loader::get_user();
     if (!$client_sig) {
         return FALSE;
     }
     if (!$user->get_module(User::M_SECRET_KEY)->check_secret_key()) {
         $user->get_module(User::M_SECRET_KEY)->unset_secret_key();
         Session::destroy(Session::get_sid(), Session::ST_INCORRECT);
         return FALSE;
     }
     //Создаём серверную сигнатуру
     //1. получаем все параметры и удаляем параметр с сигнатурой
     $all_params = Buffer::get_post();
     unset($all_params['sig']);
     $elements_sig = array();
     //2. извлекаем значения из пришедших параметров в обязательный список параметров на серврере
     $params = config('web', 'sig_params');
     foreach ($params as $param) {
         //некоторые параметрый дублируем в ручную, по тем правилам, по которомы они дложны были создаваться на клиенте
         switch ($param) {
             case Session::COOKIE_ID:
                 $elements_sig[$param] = Session::get_sid();
                 break;
             case 'location':
                 $elements_sig[$param] = get_full_url();
                 $elements_sig[$param] = str_replace('/www.', '/', $elements_sig[$param]);
                 break;
             default:
                 $elements_sig[$param] = isset($all_params[$param]) ? $all_params[$param] : '';
         }
         if (isset($all_params[$param])) {
             unset($all_params[$param]);
         }
     }
     //Если в запросе остались какие-то параметры то добавляем их в конец массива
     if (!empty($all_params)) {
         $elements_sig = array_merge($elements_sig, $all_params);
     }
     //3. получаем секретный ключ текущего пользователя
     $elements_sig[self::NAME_SECRET_KEY] = $user->get_secret_key();
     //4. Сортируем и собираем в строку элементы запроса
     $server_sig = array();
     ksort($elements_sig);
     foreach ($elements_sig as $key => $value) {
         $server_sig[] = $key . '=' . $value;
     }
     //5. Формируем сигнатуру сервера
     $server_sig = md5(implode('&', $server_sig));
     //6. Сравниваем результаты
     if ($server_sig == $client_sig) {
         return TRUE;
     }
     return FALSE;
 }
Example #3
0
 public static function log_error($exc, $tag = '')
 {
     $uid = Session::get_uid();
     if ($uid > 0) {
         $uid = 'UID: ' . $uid;
     } else {
         $uid = 'SID:' . Session::get_sid();
     }
     $uid .= ' ;IP: ' . get_ip();
     if (is_a($exc, 'Exception')) {
         $sql_query = sprintf(self::Q_INSERT_ERROR, $exc->getCode(), $exc->getLine(), $uid, $tag, addslashes($exc->getFile()), addslashes($exc->getMessage()), addslashes($exc->getTraceAsString()));
     } elseif (is_array($exc)) {
         $sql_query = sprintf(self::Q_INSERT_ERROR, isset($exc['type']) ? $exc['type'] : 0, isset($exc['line']) ? $exc['line'] : 0, $uid, $tag, addslashes(isset($exc['file']) ? $exc['file'] : ''), addslashes(isset($exc['message']) ? $exc['message'] : ''), addslashes(isset($exc['trace']) ? $exc['trace'] : ''));
     } else {
         $sql_query = sprintf(self::Q_INSERT_ERROR, 0, __LINE__, $uid, 'MESSAGE', addslashes(__FILE__), '', addslashes(print_r($exc, true)));
     }
     db::simple_query($sql_query);
 }
Example #4
0
 public function regenerate_secret_key()
 {
     $id = $this->_user->get_id();
     if (!$id or $this->_user->is_visitor()) {
         return FALSE;
     }
     $sc =& $this->_special_chars;
     $salt0 = uniqid('wx__');
     $salt1 = $sc[array_rand($sc)];
     $salt2 = $sc[array_rand($sc)];
     $salt3 = $sc[array_rand($sc)];
     $session_id = Session::get_sid();
     $lifetime = get_time() + config('session', 'lifetime_secret_key');
     $raw_data = array($salt0, $id, time(), $session_id, $lifetime, $salt1, $salt2 . $salt1, $salt2 . $salt1 . $salt3);
     shuffle($raw_data);
     $non_format_key = md5(implode(uniqid(), $raw_data));
     //Заменяем повторяющиеся символы в коде на спец символы
     $length = strlen($non_format_key);
     for ($i = 0; $i < $length; $i++) {
         $test_char = $non_format_key[$i];
         for ($j = 0; $j < $length; $j++) {
             if ($i == $j) {
                 continue;
             }
             if ($test_char == $non_format_key[$j]) {
                 if (!is_numeric($non_format_key[$j]) and mt_rand(0, 100) >= 50) {
                     $non_format_key[$j] = ucfirst($non_format_key[$j]);
                     continue;
                 }
                 $key = array_rand($sc);
                 $non_format_key[$j] = $sc[$key];
             }
         }
     }
     $secret_key = $non_format_key;
     $secret_data = array('secret_key' => $secret_key);
     Session::set_server_data($secret_data);
     db::simple_query(self::Q_UPDATE_USER_KEY, array('%user_id' => $id, '%secret_key' => $secret_key));
     return $secret_data['secret_key'];
 }