$data['allow_create_new_comuser'] = true; // явно разрешить регистрацию $data['die'] = false; // получаем результат в случае ошибки $data['password'] = $vreg_password; $data['comusers_nik'] = $vreg_nik; $data['comusers_url'] = $vreg_url; $data['email'] = $vreg_email; if (isset($post['freg_redirect_url'])) { $data['redirect'] = $post['freg_redirect_url']; } else { $data['redirect'] = getinfo('siteurl') . 'registration'; } // функция сама средиректит куда нужно // из-за этого форма ниже не будет отображена в случае успеха $res = mso_comuser_auth($data); // если ошибка, то выводим сообщение echo '<div class="mso-message-alert">' . $res . '</div>'; } } // форма регистрации $action = getinfo('siteurl') . 'registration'; if ($rules = mso_get_option('rules_site', 'general', '')) { $rules = ' (<a href="' . $rules . '" target="_blank">' . tf('Правила сайта') . '</a>)'; } else { $rules = ''; } eval(mso_tmpl_ts('type/registration/units/registration-tmpl.php')); } echo NR . '</div><!-- class="mso-type-loginform" -->' . NR; if ($fn = mso_find_ts_file('main/main-end.php')) {
function mso_comuser_lost($args = array()) { global $MSO; if (!isset($args['css_ok'])) { $args['css_ok'] = 'comment-ok'; } if (!isset($args['css_error'])) { $args['css_error'] = 'comment-error'; } // если нет опции password_recovery, значит восстанавливаем с учетом номера комюзера во втором сегмента адреса // если опция есть, значит восстанавливаем без учета id комюзера if (!isset($args['password_recovery'])) { $password_recovery = false; } else { $password_recovery = true; } # id комюзера, который в сессии - какой комюзер # если комюзер залогинен, то будет $id_session # если нет, то залогиненности нет if (isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser']) { $id_session = $MSO->data['session']['comuser']['comusers_id']; } else { $id_session = false; } if ($post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_email'))) { # защита рефера mso_checkreferer(); # защита сессии - если не нужно закомментировать строчку! if ($MSO->data['session']['session_id'] != $post['f_session_id']) { mso_redirect(); } if (!$password_recovery) { // получаем номер юзера id из f_submit[] $id = (int) mso_array_get_key($post['f_submit']); if (!$id) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибочный номер пользователя') . '!</div>'; } # проверяем id в сессии с сабмитом if ($id_session and $id != $id_session) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибочный номер пользователя2') . '</div>'; } } $comusers_email = trim($post['f_comusers_email']); if (!$comusers_email) { return '<div class="' . $args['css_error'] . '">' . tf('Нужно указать email') . '</div>'; } if (!mso_valid_email($comusers_email)) { return '<div class="' . $args['css_error'] . '">' . tf('Ошибочный email') . '</div>'; } $CI =& get_instance(); // проверим есть ли вообще такой юзер $CI->db->select('comusers_id'); if (!$password_recovery) { $CI->db->where('comusers_id', $id); } // если явно указан id, то ищем по нему $CI->db->where('comusers_email', $comusers_email); $query = $CI->db->get('comusers'); if ($query->num_rows() == 0) { // нет такого комментатора return '<div class="' . $args['css_error'] . '">' . tf('Неверный email или номер пользователя') . '!</div>'; } if ($password_recovery) { // получим id этого комюзера $res = $query->result_array(); $id = $res[0]['comusers_id']; } $comusers_new_password = trim($post['f_comusers_password']); $comusers_activate_key = trim($post['f_comusers_activate_key']); if ($comusers_email and !$comusers_activate_key and !$comusers_new_password) { // проверим есть ли активация $CI->db->select('comusers_id, comusers_activate_key'); $CI->db->where('comusers_id', $id); $CI->db->where('comusers_activate_string=comusers_activate_key', '', false); $CI->db->where('comusers_email', $comusers_email); $CI->db->limit(1); $query = $CI->db->get('comusers'); if ($query->num_rows() > 0) { $comuser = $query->result_array(); // данные комюзера mso_email_message_new_comuser($id, array('comusers_email' => $comusers_email, 'comusers_activate_key' => $comuser[0]['comusers_activate_key'])); return '<div class="' . $args['css_ok'] . '">' . tf('Код активации отправлен на ваш email') . '!</div>'; } else { return '<div class="' . $args['css_error'] . '">' . tf('Данный email не зарегистрирован или не активирован') . '</div>'; } } elseif ($comusers_email and $comusers_new_password and !$comusers_activate_key) { return '<div class="' . $args['css_error'] . '">' . tf('Для установки нового пароля нужно заполнить все поля!') . '</div>'; } elseif ($comusers_email and !$comusers_new_password and $comusers_activate_key) { // указан email и код активации, но не указан новый пароль return '<div class="' . $args['css_error'] . '">' . tf('Для установки нового пароля нужно заполнить все поля!') . '</div>'; } // если указано поле активации и новый пароль, то сверяем код активации с базой + email + id и если все верно, // то обновляем пароль // если же поле активации не указано, то высылаем его на указанный email $CI->db->select('comusers_id'); $CI->db->where('comusers_id', $id); $CI->db->where('comusers_activate_key', $comusers_activate_key); $CI->db->where('comusers_activate_string', $comusers_activate_key); $CI->db->where('comusers_email', $comusers_email); $CI->db->limit(1); $query = $CI->db->get('comusers'); if ($query->num_rows() > 0) { $CI->db->where('comusers_id', $id); $CI->db->where('comusers_email', $comusers_email); $res = $CI->db->update('comusers', array('comusers_password' => mso_md5($comusers_new_password))) ? '1' : '0'; $CI->db->cache_delete_all(); if ($res) { // сразу логиним и редиректим на страницу комюзера $data = array('email' => $comusers_email, 'password' => $comusers_new_password, 'redirect' => getinfo('siteurl') . 'users/' . $id, 'allow_create_new_comuser' => false); mso_comuser_auth($data); exit; // return '<div class="' . $args['css_ok']. '">'. t('Новый пароль установлен!'). '</div>'; } else { return '<div class="' . $args['css_error'] . '">' . tf('Ошибка БД при смене пароля...') . '</div>'; } } else { return '<div class="' . $args['css_error'] . '">' . tf('Данные указаны неверно!') . '</div>'; } } }
function loginza_auth_init($arg = array()) { if (mso_segment(1) == 'maxsite-loginza-auth') { // тут придет token if (!empty($_POST['token'])) { // token пришел? делаем редрект на страницу авторизации $auth_url = "http://loginza.ru/api/authinfo?token=" . $_POST['token']; $profile = loginza_auth_request($auth_url); $profile = json_decode($profile); if (!is_object($profile) || !empty($profile->error_message) || !empty($profile->error_type)) { $res_profile = (array) $profile['error_type']; die($res_profile['error_type']); } $curpage = mso_url_get(); if ($curpage == getinfo('site_url')) { $curpage = false; } $email = (isset($profile->email) and mso_valid_email($profile->email)) ? $profile->email : null; $nick = isset($profile->name->full_name) ? $profile->name->full_name : null; if (isset($profile->email) and mso_valid_email($profile->email)) { require_once getinfo('common_dir') . 'comments.php'; mso_comuser_auth(array('email' => $email, 'comusers_nik' => $nick, 'redirect' => $curpage)); mso_redirect(getinfo('site_url'), true, 301); } else { // ссылка на главную или на предыдущую // pr( $profile ); $txt = t('Не удалось авторизоваться с помощью выбранного сервиса.<br>Возможно это связано с тем, что в ответ на запрос сервис не возратил Ваш e-mail') . '<br>'; $txt .= t('Вернуться на') . ' <a href="' . getinfo('site_url') . $curpage . '">' . t('предыдущую страницу') . '</a><br>'; $txt .= t('Вернуться на') . ' <a href="' . getinfo('site_url') . '">' . t('главную страницу') . '</a><br>'; die($txt); } die; } } return $arg; }
function maxsite_auth_custom($args = array()) { if (mso_segment(1) == 'maxsite-auth-form') { // здесь формируется форма для отправки запроса // данные отправляются POST // посетитель должен указать только адрес своего сайта // в hidden указываем нужные данные $redirect_url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : getinfo('siteurl'); echo '<html><head> <title>Авторизация</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head><body> <form method="post" action="' . getinfo('site_url') . 'maxsite-auth-form-post"> <input type="hidden" name="redirect_url" value="' . urlencode($redirect_url) . '"> Укажите адрес сайта (с http://): <input type="text" name="url" value="" size="80"> <button type="submit">' . tf('Перейти к сайту') . '</button> </form> </body></html>'; die; // Форма ОК } elseif (mso_segment(1) == 'maxsite-auth-form-post') { // здесь происходит приём указанного адреса сайта и редирект на него с нужными данными if ($post = mso_check_post(array('redirect_url', 'url'))) { $url = mb_strtolower($post['url']); $url = trim(str_replace('/', ' ', $url)); $url = trim(str_replace(' ', ' ', $url)); $url = trim(str_replace(' ', '/', $url)); $url = str_replace('http:/', 'http://', $url); $url = $url . '/maxsite-auth-receive/' . base64_encode(getinfo('siteurl') . '##' . urldecode($post['redirect_url']) . '##' . substr(mso_md5(getinfo('siteurl')), 1, 5)); mso_redirect($url, true); } else { mso_redirect('maxsite-auth-form'); } // ошибочная форма - возвращаемся } elseif (mso_segment(1) == 'maxsite-auth-receive') { // принимаем входящие данные от другого сайта // здесь запрос на авторизацию // нужно проверить все входящие данные // проверить is_login // и сформировать форму с отправкой на входящий_сайт/maxsite-auth-reply if (!is_login()) { echo '<html><head> <title>Авторизация</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head><body> <div class="loginform">' . tf('Для авторизации необходимо войти на сайт') . '<br>'; mso_login_form(array('login' => tf('Логин:') . ' ', 'password' => tf('Пароль:') . ' ', 'submit' => ''), getinfo('siteurl') . mso_current_url()); echo '</div></body></html>'; die; // выходим ОК } else { //проверяем разрешения группы if (!mso_check_allow('maxsite_auth_edit')) { die(tf('Доступ к авторизации запрещен')); } $options = mso_get_option('plugin_maxsite_auth', 'plugins', array()); if (!isset($options['email']) or !$options['email']) { die(tf('Не задан ответный email')); } if (!isset($options['password']) or !$options['password']) { die(tf('Не задан ответный пароль')); } // смотрятся входные get-данные (расшифровка из base64) адрес-сайт1 $data64 = mso_segment(2); if (!$data64) { die(tf('Нет данных')); } // отладка // echo (getinfo('siteurl') . '##'. 'page/about' . '##' . substr(mso_md5(getinfo('siteurl')), 1, 5)); // echo '<br>'. base64_encode((getinfo('siteurl') . '##'. 'page/about' . '##' . substr(mso_md5(getinfo('siteurl')), 1, 5))); // echo '<br>'; // распаковываем данные $data = @base64_decode($data64); if (!$data) { die(tf('Ошибочные данные')); } // адрес-сайт1##адрес текущей страницы1##открытый ключ $data = explode('##', $data); // обработаем предварительно массив $data_1 = array(); foreach ($data as $element) { if ($d = trim($element)) { $data_1[] = $d; } } // должно быть 3 элемента if (count($data_1) != 3) { die(tf('Неверное количество данных')); } // pr($data_1); $data_siteurl = $data_1[0]; $data_redirect = $data_1[1]; $data_key = $data_1[2]; // все проверки пройдены // выводим форму с кнопкой Разрешить // данные для ответа // - адрес исходный // - адрес ответ - текущий // - адрес текущей страницы1 - редирект // - открытый ключ сайта2 // - зашифрованный «email##пароль» на основе открытых ключей сайт1 и сайт2 $CI =& get_instance(); $CI->load->library('encrypt'); // подключим библиотеку для шифрования // ключ строится по этому алгоритму // он должен быть фиксированным для одного сайта $my_key = substr(mso_md5(getinfo('siteurl')), 1, 5); // шифруем на основе двух ключей $my_email_pass = $CI->encrypt->encode($options['email'] . '##' . $options['password'], $data_key . $my_key); $data = getinfo('siteurl') . '##' . $data_siteurl . '##' . $data_redirect . '##' . $my_key . '##' . $my_email_pass; // pr($data); // pr($CI->encrypt->decode($my_email_pass, $data_key . $my_key)); echo '<html><head> <title>Авторизация</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head><body> <form method="post" action="' . $data_siteurl . 'maxsite-auth-reply"> <input type="hidden" name="data" value="' . base64_encode($data) . '"> <button type="submit">' . tf('Подтвердить авторизацию') . '</button> </form> </body></html>'; die; // выход ОК } } elseif (mso_segment(1) == 'maxsite-auth-reply') { // принимаем данные для авторизации от другого сайта // должен быть email и пароль // проверяем входящие данные // проверяем существаание такого комюзера // если его нет, то выполняем авторизацию // после выполняем автологин // и редиректимся на указанную страницу // pr($_POST); if ($post = mso_check_post(array('data'))) { // проверим referer if (!isset($_SERVER['HTTP_REFERER'])) { die(t('Ошибочный referer-сайт')); } $data = @base64_decode($post['data']); if (!$data) { die(t('Ошибочные данные')); } // ошибка распаковки // pr($data); $data = explode('##', $data); // обработаем предварительно массив $data_1 = array(); foreach ($data as $element) { if ($d = trim($element)) { $data_1[] = $d; } } // должно быть 5 элементов if (count($data_1) != 5) { die(t('Неверное количество данных')); } /* $data = getinfo('siteurl') . '##' . $data_siteurl . '##' . $data_redirect . '##' . $my_key . '##' . $my_email_pass; */ // pr($data_1); $data_siteurl = $data_1[0]; // сайт где была сделана авторизация = реферер $my_siteurl = $data_1[1]; // сайт с которого был отправлен запрос на авторизацию - должен быть равен текущему $data_redirect = $data_1[2]; // конечная страница $data_key = $data_1[3]; // открытый ключ сайта-авторизатора $data_email_pass = $data_1[4]; // email и пароль if (strpos($_SERVER['HTTP_REFERER'], $data_siteurl) === false) { die(t('Ошибочный referer-сайт')); } if ($my_siteurl != getinfo('siteurl')) { die(t('Ошибочный исходный сайт')); } $CI =& get_instance(); $CI->load->library('encrypt'); // подключим библиотеку для шифрования // ключ строится по этому алгоритму // он должен быть фиксированным для одного сайта $my_key = substr(mso_md5(getinfo('siteurl')), 1, 5); // шифруем на основе двух ключей $my_email_pass = $CI->encrypt->decode($data_email_pass, $my_key . $data_key); //_pr($my_email_pass); $email_pass = explode('##', $my_email_pass); if (count($email_pass) != 2) { die(tf('Неверные данные email-пароль')); } $email = $email_pass[0]; // email $pass = $email_pass[1]; // пароль if (!mso_valid_email($email)) { die(t('Неверный email')); } if (strlen($pass) < 6) { die(tf('Короткий пароль')); } // pr($email . ' ' . $pass); require_once getinfo('common_dir') . 'comments.php'; mso_comuser_auth(array('email' => $email, 'password' => $pass)); die; // выход ОК } else { die('Ошибочные данные'); } // нет POST } else { return $args; } }
function fbauth_init($arg = array()) { if (mso_segment(1) == 'maxsite-fbauth') { if (!function_exists('curl_init')) { die('Не найдено PHP-расширение CURL'); } if (!function_exists('json_decode')) { die('Не найдено PHP-расширение JSON'); } $options = mso_get_option('plugin_fbauth', 'plugins', array()); if (!isset($options['app_id']) or !$options['app_id']) { die(t('Не задан app_id')); } if (!isset($options['app_secret']) or !$options['app_secret']) { die(t('Не задан app_secret')); } $app_id = $options['app_id']; $app_secret = $options['app_secret']; $my_url = getinfo('site_url') . 'maxsite-fbauth'; $code = isset($_REQUEST["code"]) ? $_REQUEST["code"] : null; if (!isset($code)) { $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . '&scope=email,user_website'; mso_redirect($dialog_url, true); } $token_url = "https://graph.facebook.com/oauth/access_token?client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) . "&client_secret=" . $app_secret . "&code=" . $code; $access_token = fbauth_request($token_url); $graph_url = "https://graph.facebook.com/me?" . $access_token; $user0 = fbauth_request($graph_url); if (strpos($user0, '400 Bad Request') !== false) { die(t('Ошибка авторизации (400 Bad Request)')); } else { $user = json_decode($user0); if (isset($user->email) and mso_valid_email($user->email)) { require_once getinfo('common_dir') . 'comments.php'; mso_comuser_auth(array('email' => $user->email, 'comusers_nik' => $user->name)); // echo("Hello " . $user->name); } else { // ошибочный или отстутсвующий email die(t('Не удалось авторизоваться с помощью Facebook. Возможно это связано с тем, что в ответ на запрос сервис не возвратил ваш e-mail')); } die; } } return $arg; }