From ef108605a37741e1e6c967e5058e092fac937b1c Mon Sep 17 00:00:00 2001 From: Christian Andersson Date: Fri, 20 May 2011 16:53:47 +0200 Subject: [PATCH] tank_auth 1.0.9 --- application/config/email.php | 19 + application/config/tank_auth.php | 145 ++++ application/controllers/auth.php | 585 ++++++++++++++++ application/controllers/welcome.php | 37 +- application/helpers/recaptcha_helper.php | 277 ++++++++ .../language/chinese/tank_auth_lang.php | 40 ++ application/language/dutch/tank_auth_lang.php | 44 ++ .../language/english/tank_auth_lang.php | 40 ++ .../language/french/tank_auth_lang.php | 40 ++ .../language/german/tank_auth_lang.php | 40 ++ .../language/italian/tank_auth_lang.php | 40 ++ .../language/japanese/tank_auth_lang.php | 40 ++ .../language/portuguese/tank_auth_lang.php | 40 ++ .../language/romanian/tank_auth_lang.php | 40 ++ .../language/russian/tank_auth_lang.php | 40 ++ .../language/spanish/tank_auth_lang.php | 40 ++ application/libraries/Tank_auth.php | 645 ++++++++++++++++++ .../libraries/phpass-0.1/PasswordHash.php | 248 +++++++ application/libraries/phpass-0.1/c/Makefile | 21 + .../libraries/phpass-0.1/c/crypt_private.c | 106 +++ application/libraries/phpass-0.1/test.php | 72 ++ .../models/tank_auth/login_attempts.php | 74 ++ .../models/tank_auth/user_autologin.php | 106 +++ application/models/tank_auth/users.php | 398 +++++++++++ application/views/auth/change_email_form.php | 29 + .../views/auth/change_password_form.php | 40 ++ .../views/auth/forgot_password_form.php | 24 + application/views/auth/general_message.php | 1 + application/views/auth/login_form.php | 93 +++ application/views/auth/register_form.php | 100 +++ .../views/auth/reset_password_form.php | 29 + application/views/auth/send_again_form.php | 19 + application/views/auth/unregister_form.php | 17 + application/views/email/activate-html.php | 34 + application/views/email/activate-txt.php | 24 + application/views/email/change_email-html.php | 33 + application/views/email/change_email-txt.php | 16 + .../views/email/forgot_password-html.php | 30 + .../views/email/forgot_password-txt.php | 13 + .../views/email/reset_password-html.php | 26 + .../views/email/reset_password-txt.php | 17 + application/views/email/welcome-html.php | 32 + application/views/email/welcome-txt.php | 20 + application/views/welcome.php | 1 + htdocs/captcha/fonts/.htaccess | 4 + htdocs/captcha/fonts/1.ttf | Bin 0 -> 53168 bytes htdocs/captcha/fonts/2.ttf | Bin 0 -> 42624 bytes htdocs/captcha/fonts/3.ttf | Bin 0 -> 62524 bytes htdocs/captcha/fonts/4.ttf | Bin 0 -> 91120 bytes htdocs/captcha/fonts/5.ttf | Bin 0 -> 376200 bytes htdocs/captcha/fonts/index.html | 0 htdocs/captcha/index.html | 0 52 files changed, 3760 insertions(+), 19 deletions(-) create mode 100644 application/config/email.php create mode 100644 application/config/tank_auth.php create mode 100644 application/controllers/auth.php mode change 100755 => 100644 application/controllers/welcome.php create mode 100644 application/helpers/recaptcha_helper.php create mode 100644 application/language/chinese/tank_auth_lang.php create mode 100644 application/language/dutch/tank_auth_lang.php create mode 100644 application/language/english/tank_auth_lang.php create mode 100644 application/language/french/tank_auth_lang.php create mode 100644 application/language/german/tank_auth_lang.php create mode 100644 application/language/italian/tank_auth_lang.php create mode 100644 application/language/japanese/tank_auth_lang.php create mode 100644 application/language/portuguese/tank_auth_lang.php create mode 100644 application/language/romanian/tank_auth_lang.php create mode 100644 application/language/russian/tank_auth_lang.php create mode 100644 application/language/spanish/tank_auth_lang.php create mode 100644 application/libraries/Tank_auth.php create mode 100644 application/libraries/phpass-0.1/PasswordHash.php create mode 100644 application/libraries/phpass-0.1/c/Makefile create mode 100644 application/libraries/phpass-0.1/c/crypt_private.c create mode 100644 application/libraries/phpass-0.1/test.php create mode 100644 application/models/tank_auth/login_attempts.php create mode 100644 application/models/tank_auth/user_autologin.php create mode 100644 application/models/tank_auth/users.php create mode 100644 application/views/auth/change_email_form.php create mode 100644 application/views/auth/change_password_form.php create mode 100644 application/views/auth/forgot_password_form.php create mode 100644 application/views/auth/general_message.php create mode 100644 application/views/auth/login_form.php create mode 100644 application/views/auth/register_form.php create mode 100644 application/views/auth/reset_password_form.php create mode 100644 application/views/auth/send_again_form.php create mode 100644 application/views/auth/unregister_form.php create mode 100644 application/views/email/activate-html.php create mode 100644 application/views/email/activate-txt.php create mode 100644 application/views/email/change_email-html.php create mode 100644 application/views/email/change_email-txt.php create mode 100644 application/views/email/forgot_password-html.php create mode 100644 application/views/email/forgot_password-txt.php create mode 100644 application/views/email/reset_password-html.php create mode 100644 application/views/email/reset_password-txt.php create mode 100644 application/views/email/welcome-html.php create mode 100644 application/views/email/welcome-txt.php create mode 100644 application/views/welcome.php create mode 100644 htdocs/captcha/fonts/.htaccess create mode 100644 htdocs/captcha/fonts/1.ttf create mode 100644 htdocs/captcha/fonts/2.ttf create mode 100644 htdocs/captcha/fonts/3.ttf create mode 100644 htdocs/captcha/fonts/4.ttf create mode 100644 htdocs/captcha/fonts/5.ttf create mode 100644 htdocs/captcha/fonts/index.html create mode 100644 htdocs/captcha/index.html diff --git a/application/config/email.php b/application/config/email.php new file mode 100644 index 0000000..3b4e2bf --- /dev/null +++ b/application/config/email.php @@ -0,0 +1,19 @@ +load->helper(array('form', 'url')); + $this->load->library('form_validation'); + $this->load->library('security'); + $this->load->library('tank_auth'); + $this->lang->load('tank_auth'); + } + + function index() + { + if ($message = $this->session->flashdata('message')) { + $this->load->view('auth/general_message', array('message' => $message)); + } else { + redirect('/auth/login/'); + } + } + + /** + * Login user on the site + * + * @return void + */ + function login() + { + if ($this->tank_auth->is_logged_in()) { // logged in + redirect(''); + + } elseif ($this->tank_auth->is_logged_in(FALSE)) { // logged in, not activated + redirect('/auth/send_again/'); + + } else { + $data['login_by_username'] = ($this->config->item('login_by_username', 'tank_auth') AND + $this->config->item('use_username', 'tank_auth')); + $data['login_by_email'] = $this->config->item('login_by_email', 'tank_auth'); + + $this->form_validation->set_rules('login', 'Login', 'trim|required|xss_clean'); + $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean'); + $this->form_validation->set_rules('remember', 'Remember me', 'integer'); + + // Get login for counting attempts to login + if ($this->config->item('login_count_attempts', 'tank_auth') AND + ($login = $this->input->post('login'))) { + $login = $this->security->xss_clean($login); + } else { + $login = ''; + } + + $data['use_recaptcha'] = $this->config->item('use_recaptcha', 'tank_auth'); + if ($this->tank_auth->is_max_login_attempts_exceeded($login)) { + if ($data['use_recaptcha']) + $this->form_validation->set_rules('recaptcha_response_field', 'Confirmation Code', 'trim|xss_clean|required|callback__check_recaptcha'); + else + $this->form_validation->set_rules('captcha', 'Confirmation Code', 'trim|xss_clean|required|callback__check_captcha'); + } + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if ($this->tank_auth->login( + $this->form_validation->set_value('login'), + $this->form_validation->set_value('password'), + $this->form_validation->set_value('remember'), + $data['login_by_username'], + $data['login_by_email'])) { // success + redirect(''); + + } else { + $errors = $this->tank_auth->get_error_message(); + if (isset($errors['banned'])) { // banned user + $this->_show_message($this->lang->line('auth_message_banned').' '.$errors['banned']); + + } elseif (isset($errors['not_activated'])) { // not activated user + redirect('/auth/send_again/'); + + } else { // fail + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + } + $data['show_captcha'] = FALSE; + if ($this->tank_auth->is_max_login_attempts_exceeded($login)) { + $data['show_captcha'] = TRUE; + if ($data['use_recaptcha']) { + $data['recaptcha_html'] = $this->_create_recaptcha(); + } else { + $data['captcha_html'] = $this->_create_captcha(); + } + } + $this->load->view('auth/login_form', $data); + } + } + + /** + * Logout user + * + * @return void + */ + function logout() + { + $this->tank_auth->logout(); + + $this->_show_message($this->lang->line('auth_message_logged_out')); + } + + /** + * Register user on the site + * + * @return void + */ + function register() + { + if ($this->tank_auth->is_logged_in()) { // logged in + redirect(''); + + } elseif ($this->tank_auth->is_logged_in(FALSE)) { // logged in, not activated + redirect('/auth/send_again/'); + + } elseif (!$this->config->item('allow_registration', 'tank_auth')) { // registration is off + $this->_show_message($this->lang->line('auth_message_registration_disabled')); + + } else { + $use_username = $this->config->item('use_username', 'tank_auth'); + if ($use_username) { + $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean|min_length['.$this->config->item('username_min_length', 'tank_auth').']|max_length['.$this->config->item('username_max_length', 'tank_auth').']|alpha_dash'); + } + $this->form_validation->set_rules('email', 'Email', 'trim|required|xss_clean|valid_email'); + $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean|min_length['.$this->config->item('password_min_length', 'tank_auth').']|max_length['.$this->config->item('password_max_length', 'tank_auth').']|alpha_dash'); + $this->form_validation->set_rules('confirm_password', 'Confirm Password', 'trim|required|xss_clean|matches[password]'); + + $captcha_registration = $this->config->item('captcha_registration', 'tank_auth'); + $use_recaptcha = $this->config->item('use_recaptcha', 'tank_auth'); + if ($captcha_registration) { + if ($use_recaptcha) { + $this->form_validation->set_rules('recaptcha_response_field', 'Confirmation Code', 'trim|xss_clean|required|callback__check_recaptcha'); + } else { + $this->form_validation->set_rules('captcha', 'Confirmation Code', 'trim|xss_clean|required|callback__check_captcha'); + } + } + $data['errors'] = array(); + + $email_activation = $this->config->item('email_activation', 'tank_auth'); + + if ($this->form_validation->run()) { // validation ok + if (!is_null($data = $this->tank_auth->create_user( + $use_username ? $this->form_validation->set_value('username') : '', + $this->form_validation->set_value('email'), + $this->form_validation->set_value('password'), + $email_activation))) { // success + + $data['site_name'] = $this->config->item('website_name', 'tank_auth'); + + if ($email_activation) { // send "activate" email + $data['activation_period'] = $this->config->item('email_activation_expire', 'tank_auth') / 3600; + + $this->_send_email('activate', $data['email'], $data); + + unset($data['password']); // Clear password (just for any case) + + $this->_show_message($this->lang->line('auth_message_registration_completed_1')); + + } else { + if ($this->config->item('email_account_details', 'tank_auth')) { // send "welcome" email + + $this->_send_email('welcome', $data['email'], $data); + } + unset($data['password']); // Clear password (just for any case) + + $this->_show_message($this->lang->line('auth_message_registration_completed_2').' '.anchor('/auth/login/', 'Login')); + } + } else { + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + if ($captcha_registration) { + if ($use_recaptcha) { + $data['recaptcha_html'] = $this->_create_recaptcha(); + } else { + $data['captcha_html'] = $this->_create_captcha(); + } + } + $data['use_username'] = $use_username; + $data['captcha_registration'] = $captcha_registration; + $data['use_recaptcha'] = $use_recaptcha; + $this->load->view('auth/register_form', $data); + } + } + + /** + * Send activation email again, to the same or new email address + * + * @return void + */ + function send_again() + { + if (!$this->tank_auth->is_logged_in(FALSE)) { // not logged in or activated + redirect('/auth/login/'); + + } else { + $this->form_validation->set_rules('email', 'Email', 'trim|required|xss_clean|valid_email'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if (!is_null($data = $this->tank_auth->change_email( + $this->form_validation->set_value('email')))) { // success + + $data['site_name'] = $this->config->item('website_name', 'tank_auth'); + $data['activation_period'] = $this->config->item('email_activation_expire', 'tank_auth') / 3600; + + $this->_send_email('activate', $data['email'], $data); + + $this->_show_message(sprintf($this->lang->line('auth_message_activation_email_sent'), $data['email'])); + + } else { + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + $this->load->view('auth/send_again_form', $data); + } + } + + /** + * Activate user account. + * User is verified by user_id and authentication code in the URL. + * Can be called by clicking on link in mail. + * + * @return void + */ + function activate() + { + $user_id = $this->uri->segment(3); + $new_email_key = $this->uri->segment(4); + + // Activate user + if ($this->tank_auth->activate_user($user_id, $new_email_key)) { // success + $this->tank_auth->logout(); + $this->_show_message($this->lang->line('auth_message_activation_completed').' '.anchor('/auth/login/', 'Login')); + + } else { // fail + $this->_show_message($this->lang->line('auth_message_activation_failed')); + } + } + + /** + * Generate reset code (to change password) and send it to user + * + * @return void + */ + function forgot_password() + { + if ($this->tank_auth->is_logged_in()) { // logged in + redirect(''); + + } elseif ($this->tank_auth->is_logged_in(FALSE)) { // logged in, not activated + redirect('/auth/send_again/'); + + } else { + $this->form_validation->set_rules('login', 'Email or login', 'trim|required|xss_clean'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if (!is_null($data = $this->tank_auth->forgot_password( + $this->form_validation->set_value('login')))) { + + $data['site_name'] = $this->config->item('website_name', 'tank_auth'); + + // Send email with password activation link + $this->_send_email('forgot_password', $data['email'], $data); + + $this->_show_message($this->lang->line('auth_message_new_password_sent')); + + } else { + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + $this->load->view('auth/forgot_password_form', $data); + } + } + + /** + * Replace user password (forgotten) with a new one (set by user). + * User is verified by user_id and authentication code in the URL. + * Can be called by clicking on link in mail. + * + * @return void + */ + function reset_password() + { + $user_id = $this->uri->segment(3); + $new_pass_key = $this->uri->segment(4); + + $this->form_validation->set_rules('new_password', 'New Password', 'trim|required|xss_clean|min_length['.$this->config->item('password_min_length', 'tank_auth').']|max_length['.$this->config->item('password_max_length', 'tank_auth').']|alpha_dash'); + $this->form_validation->set_rules('confirm_new_password', 'Confirm new Password', 'trim|required|xss_clean|matches[new_password]'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if (!is_null($data = $this->tank_auth->reset_password( + $user_id, $new_pass_key, + $this->form_validation->set_value('new_password')))) { // success + + $data['site_name'] = $this->config->item('website_name', 'tank_auth'); + + // Send email with new password + $this->_send_email('reset_password', $data['email'], $data); + + $this->_show_message($this->lang->line('auth_message_new_password_activated').' '.anchor('/auth/login/', 'Login')); + + } else { // fail + $this->_show_message($this->lang->line('auth_message_new_password_failed')); + } + } else { + // Try to activate user by password key (if not activated yet) + if ($this->config->item('email_activation', 'tank_auth')) { + $this->tank_auth->activate_user($user_id, $new_pass_key, FALSE); + } + + if (!$this->tank_auth->can_reset_password($user_id, $new_pass_key)) { + $this->_show_message($this->lang->line('auth_message_new_password_failed')); + } + } + $this->load->view('auth/reset_password_form', $data); + } + + /** + * Change user password + * + * @return void + */ + function change_password() + { + if (!$this->tank_auth->is_logged_in()) { // not logged in or not activated + redirect('/auth/login/'); + + } else { + $this->form_validation->set_rules('old_password', 'Old Password', 'trim|required|xss_clean'); + $this->form_validation->set_rules('new_password', 'New Password', 'trim|required|xss_clean|min_length['.$this->config->item('password_min_length', 'tank_auth').']|max_length['.$this->config->item('password_max_length', 'tank_auth').']|alpha_dash'); + $this->form_validation->set_rules('confirm_new_password', 'Confirm new Password', 'trim|required|xss_clean|matches[new_password]'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if ($this->tank_auth->change_password( + $this->form_validation->set_value('old_password'), + $this->form_validation->set_value('new_password'))) { // success + $this->_show_message($this->lang->line('auth_message_password_changed')); + + } else { // fail + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + $this->load->view('auth/change_password_form', $data); + } + } + + /** + * Change user email + * + * @return void + */ + function change_email() + { + if (!$this->tank_auth->is_logged_in()) { // not logged in or not activated + redirect('/auth/login/'); + + } else { + $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean'); + $this->form_validation->set_rules('email', 'Email', 'trim|required|xss_clean|valid_email'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if (!is_null($data = $this->tank_auth->set_new_email( + $this->form_validation->set_value('email'), + $this->form_validation->set_value('password')))) { // success + + $data['site_name'] = $this->config->item('website_name', 'tank_auth'); + + // Send email with new email address and its activation link + $this->_send_email('change_email', $data['new_email'], $data); + + $this->_show_message(sprintf($this->lang->line('auth_message_new_email_sent'), $data['new_email'])); + + } else { + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + $this->load->view('auth/change_email_form', $data); + } + } + + /** + * Replace user email with a new one. + * User is verified by user_id and authentication code in the URL. + * Can be called by clicking on link in mail. + * + * @return void + */ + function reset_email() + { + $user_id = $this->uri->segment(3); + $new_email_key = $this->uri->segment(4); + + // Reset email + if ($this->tank_auth->activate_new_email($user_id, $new_email_key)) { // success + $this->tank_auth->logout(); + $this->_show_message($this->lang->line('auth_message_new_email_activated').' '.anchor('/auth/login/', 'Login')); + + } else { // fail + $this->_show_message($this->lang->line('auth_message_new_email_failed')); + } + } + + /** + * Delete user from the site (only when user is logged in) + * + * @return void + */ + function unregister() + { + if (!$this->tank_auth->is_logged_in()) { // not logged in or not activated + redirect('/auth/login/'); + + } else { + $this->form_validation->set_rules('password', 'Password', 'trim|required|xss_clean'); + + $data['errors'] = array(); + + if ($this->form_validation->run()) { // validation ok + if ($this->tank_auth->delete_user( + $this->form_validation->set_value('password'))) { // success + $this->_show_message($this->lang->line('auth_message_unregistered')); + + } else { // fail + $errors = $this->tank_auth->get_error_message(); + foreach ($errors as $k => $v) $data['errors'][$k] = $this->lang->line($v); + } + } + $this->load->view('auth/unregister_form', $data); + } + } + + /** + * Show info message + * + * @param string + * @return void + */ + function _show_message($message) + { + $this->session->set_flashdata('message', $message); + redirect('/auth/'); + } + + /** + * Send email message of given type (activate, forgot_password, etc.) + * + * @param string + * @param string + * @param array + * @return void + */ + function _send_email($type, $email, &$data) + { + $this->load->library('email'); + $this->email->from($this->config->item('webmaster_email', 'tank_auth'), $this->config->item('website_name', 'tank_auth')); + $this->email->reply_to($this->config->item('webmaster_email', 'tank_auth'), $this->config->item('website_name', 'tank_auth')); + $this->email->to($email); + $this->email->subject(sprintf($this->lang->line('auth_subject_'.$type), $this->config->item('website_name', 'tank_auth'))); + $this->email->message($this->load->view('email/'.$type.'-html', $data, TRUE)); + $this->email->set_alt_message($this->load->view('email/'.$type.'-txt', $data, TRUE)); + $this->email->send(); + } + + /** + * Create CAPTCHA image to verify user as a human + * + * @return string + */ + function _create_captcha() + { + $this->load->helper('captcha'); + + $cap = create_captcha(array( + 'img_path' => './'.$this->config->item('captcha_path', 'tank_auth'), + 'img_url' => base_url().$this->config->item('captcha_path', 'tank_auth'), + 'font_path' => './'.$this->config->item('captcha_fonts_path', 'tank_auth'), + 'font_size' => $this->config->item('captcha_font_size', 'tank_auth'), + 'img_width' => $this->config->item('captcha_width', 'tank_auth'), + 'img_height' => $this->config->item('captcha_height', 'tank_auth'), + 'show_grid' => $this->config->item('captcha_grid', 'tank_auth'), + 'expiration' => $this->config->item('captcha_expire', 'tank_auth'), + )); + + // Save captcha params in session + $this->session->set_flashdata(array( + 'captcha_word' => $cap['word'], + 'captcha_time' => $cap['time'], + )); + + return $cap['image']; + } + + /** + * Callback function. Check if CAPTCHA test is passed. + * + * @param string + * @return bool + */ + function _check_captcha($code) + { + $time = $this->session->flashdata('captcha_time'); + $word = $this->session->flashdata('captcha_word'); + + list($usec, $sec) = explode(" ", microtime()); + $now = ((float)$usec + (float)$sec); + + if ($now - $time > $this->config->item('captcha_expire', 'tank_auth')) { + $this->form_validation->set_message('_check_captcha', $this->lang->line('auth_captcha_expired')); + return FALSE; + + } elseif (($this->config->item('captcha_case_sensitive', 'tank_auth') AND + $code != $word) OR + strtolower($code) != strtolower($word)) { + $this->form_validation->set_message('_check_captcha', $this->lang->line('auth_incorrect_captcha')); + return FALSE; + } + return TRUE; + } + + /** + * Create reCAPTCHA JS and non-JS HTML to verify user as a human + * + * @return string + */ + function _create_recaptcha() + { + $this->load->helper('recaptcha'); + + // Add custom theme so we can get only image + $options = "\n"; + + // Get reCAPTCHA JS and non-JS HTML + $html = recaptcha_get_html($this->config->item('recaptcha_public_key', 'tank_auth')); + + return $options.$html; + } + + /** + * Callback function. Check if reCAPTCHA test is passed. + * + * @return bool + */ + function _check_recaptcha() + { + $this->load->helper('recaptcha'); + + $resp = recaptcha_check_answer($this->config->item('recaptcha_private_key', 'tank_auth'), + $_SERVER['REMOTE_ADDR'], + $_POST['recaptcha_challenge_field'], + $_POST['recaptcha_response_field']); + + if (!$resp->is_valid) { + $this->form_validation->set_message('_check_recaptcha', $this->lang->line('auth_incorrect_captcha')); + return FALSE; + } + return TRUE; + } + +} + +/* End of file auth.php */ +/* Location: ./application/controllers/auth.php */ \ No newline at end of file diff --git a/application/controllers/welcome.php b/application/controllers/welcome.php old mode 100755 new mode 100644 index 21bef43..98e53cf --- a/application/controllers/welcome.php +++ b/application/controllers/welcome.php @@ -1,25 +1,24 @@ -load->helper('url'); + $this->load->library('tank_auth'); + } - /** - * Index Page for this controller. - * - * Maps to the following URL - * http://example.com/index.php/welcome - * - or - - * http://example.com/index.php/welcome/index - * - or - - * Since this controller is set as the default controller in - * config/routes.php, it's displayed at http://example.com/ - * - * So any other public methods not prefixed with an underscore will - * map to /index.php/welcome/ - * @see http://codeigniter.com/user_guide/general/urls.html - */ - public function index() + function index() { - $this->load->view('welcome_message'); + if (!$this->tank_auth->is_logged_in()) { + redirect('/auth/login/'); + } else { + $data['user_id'] = $this->tank_auth->get_user_id(); + $data['username'] = $this->tank_auth->get_username(); + $this->load->view('welcome', $data); + } } } diff --git a/application/helpers/recaptcha_helper.php b/application/helpers/recaptcha_helper.php new file mode 100644 index 0000000..32c4f4d --- /dev/null +++ b/application/helpers/recaptcha_helper.php @@ -0,0 +1,277 @@ + $value ) + $req .= $key . '=' . urlencode( stripslashes($value) ) . '&'; + + // Cut the last '&' + $req=substr($req,0,strlen($req)-1); + return $req; +} + + + +/** + * Submits an HTTP POST to a reCAPTCHA server + * @param string $host + * @param string $path + * @param array $data + * @param int port + * @return array response + */ +function _recaptcha_http_post($host, $path, $data, $port = 80) { + + $req = _recaptcha_qsencode ($data); + + $http_request = "POST $path HTTP/1.0\r\n"; + $http_request .= "Host: $host\r\n"; + $http_request .= "Content-Type: application/x-www-form-urlencoded;\r\n"; + $http_request .= "Content-Length: " . strlen($req) . "\r\n"; + $http_request .= "User-Agent: reCAPTCHA/PHP\r\n"; + $http_request .= "\r\n"; + $http_request .= $req; + + $response = ''; + if( false == ( $fs = @fsockopen($host, $port, $errno, $errstr, 10) ) ) { + die ('Could not open socket'); + } + + fwrite($fs, $http_request); + + while ( !feof($fs) ) + $response .= fgets($fs, 1160); // One TCP-IP packet + fclose($fs); + $response = explode("\r\n\r\n", $response, 2); + + return $response; +} + + + +/** + * Gets the challenge HTML (javascript and non-javascript version). + * This is called from the browser, and the resulting reCAPTCHA HTML widget + * is embedded within the HTML form it was called from. + * @param string $pubkey A public key for reCAPTCHA + * @param string $error The error given by reCAPTCHA (optional, default is null) + * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false) + + * @return string - The HTML to be embedded in the user's form. + */ +function recaptcha_get_html ($pubkey, $error = null, $use_ssl = false) +{ + if ($pubkey == null || $pubkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($use_ssl) { + $server = RECAPTCHA_API_SECURE_SERVER; + } else { + $server = RECAPTCHA_API_SERVER; + } + + $errorpart = ""; + if ($error) { + $errorpart = "&error=" . $error; + } + return ' + + '; +} + + + + +/** + * A ReCaptchaResponse is returned from recaptcha_check_answer() + */ +class ReCaptchaResponse { + var $is_valid; + var $error; +} + + +/** + * Calls an HTTP POST function to verify if the user's guess was correct + * @param string $privkey + * @param string $remoteip + * @param string $challenge + * @param string $response + * @param array $extra_params an array of extra variables to post to the server + * @return ReCaptchaResponse + */ +function recaptcha_check_answer ($privkey, $remoteip, $challenge, $response, $extra_params = array()) +{ + if ($privkey == null || $privkey == '') { + die ("To use reCAPTCHA you must get an API key from https://www.google.com/recaptcha/admin/create"); + } + + if ($remoteip == null || $remoteip == '') { + die ("For security reasons, you must pass the remote ip to reCAPTCHA"); + } + + + + //discard spam submissions + if ($challenge == null || strlen($challenge) == 0 || $response == null || strlen($response) == 0) { + $recaptcha_response = new ReCaptchaResponse(); + $recaptcha_response->is_valid = false; + $recaptcha_response->error = 'incorrect-captcha-sol'; + return $recaptcha_response; + } + + $response = _recaptcha_http_post (RECAPTCHA_VERIFY_SERVER, "/recaptcha/api/verify", + array ( + 'privatekey' => $privkey, + 'remoteip' => $remoteip, + 'challenge' => $challenge, + 'response' => $response + ) + $extra_params + ); + + $answers = explode ("\n", $response [1]); + $recaptcha_response = new ReCaptchaResponse(); + + if (trim ($answers [0]) == 'true') { + $recaptcha_response->is_valid = true; + } + else { + $recaptcha_response->is_valid = false; + $recaptcha_response->error = $answers [1]; + } + return $recaptcha_response; + +} + +/** + * gets a URL where the user can sign up for reCAPTCHA. If your application + * has a configuration page where you enter a key, you should provide a link + * using this function. + * @param string $domain The domain where the page is hosted + * @param string $appname The name of your application + */ +function recaptcha_get_signup_url ($domain = null, $appname = null) { + return "https://www.google.com/recaptcha/admin/create?" . _recaptcha_qsencode (array ('domains' => $domain, 'app' => $appname)); +} + +function _recaptcha_aes_pad($val) { + $block_size = 16; + $numpad = $block_size - (strlen ($val) % $block_size); + return str_pad($val, strlen ($val) + $numpad, chr($numpad)); +} + +/* Mailhide related code */ + +function _recaptcha_aes_encrypt($val,$ky) { + if (! function_exists ("mcrypt_encrypt")) { + die ("To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed."); + } + $mode=MCRYPT_MODE_CBC; + $enc=MCRYPT_RIJNDAEL_128; + $val=_recaptcha_aes_pad($val); + return mcrypt_encrypt($enc, $ky, $val, $mode, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); +} + + +function _recaptcha_mailhide_urlbase64 ($x) { + return strtr(base64_encode ($x), '+/', '-_'); +} + +/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */ +function recaptcha_mailhide_url($pubkey, $privkey, $email) { + if ($pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) { + die ("To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " . + "you can do so at http://www.google.com/recaptcha/mailhide/apikey"); + } + + + $ky = pack('H*', $privkey); + $cryptmail = _recaptcha_aes_encrypt ($email, $ky); + + return "http://www.google.com/recaptcha/mailhide/d?k=" . $pubkey . "&c=" . _recaptcha_mailhide_urlbase64 ($cryptmail); +} + +/** + * gets the parts of the email to expose to the user. + * eg, given johndoe@example,com return ["john", "example.com"]. + * the email is then displayed as john...@example.com + */ +function _recaptcha_mailhide_email_parts ($email) { + $arr = preg_split("/@/", $email ); + + if (strlen ($arr[0]) <= 4) { + $arr[0] = substr ($arr[0], 0, 1); + } else if (strlen ($arr[0]) <= 6) { + $arr[0] = substr ($arr[0], 0, 3); + } else { + $arr[0] = substr ($arr[0], 0, 4); + } + return $arr; +} + +/** + * Gets html to display an email address given a public an private key. + * to get a key, go to: + * + * http://www.google.com/recaptcha/mailhide/apikey + */ +function recaptcha_mailhide_html($pubkey, $privkey, $email) { + $emailparts = _recaptcha_mailhide_email_parts ($email); + $url = recaptcha_mailhide_url ($pubkey, $privkey, $email); + + return htmlentities($emailparts[0]) . "...@" . htmlentities ($emailparts [1]); + +} + + +?> diff --git a/application/language/chinese/tank_auth_lang.php b/application/language/chinese/tank_auth_lang.php new file mode 100644 index 0000000..3103092 --- /dev/null +++ b/application/language/chinese/tank_auth_lang.php @@ -0,0 +1,40 @@ +ci =& get_instance(); + + $this->ci->load->config('tank_auth', TRUE); + + $this->ci->load->library('session'); + $this->ci->load->database(); + $this->ci->load->model('tank_auth/users'); + + // Try to autologin + $this->autologin(); + } + + /** + * Login user on the site. Return TRUE if login is successful + * (user exists and activated, password is correct), otherwise FALSE. + * + * @param string (username or email or both depending on settings in config file) + * @param string + * @param bool + * @return bool + */ + function login($login, $password, $remember, $login_by_username, $login_by_email) + { + if ((strlen($login) > 0) AND (strlen($password) > 0)) { + + // Which function to use to login (based on config) + if ($login_by_username AND $login_by_email) { + $get_user_func = 'get_user_by_login'; + } else if ($login_by_username) { + $get_user_func = 'get_user_by_username'; + } else { + $get_user_func = 'get_user_by_email'; + } + + if (!is_null($user = $this->ci->users->$get_user_func($login))) { // login ok + + // Does password match hash in database? + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + if ($hasher->CheckPassword($password, $user->password)) { // password ok + + if ($user->banned == 1) { // fail - banned + $this->error = array('banned' => $user->ban_reason); + + } else { + $this->ci->session->set_userdata(array( + 'user_id' => $user->id, + 'username' => $user->username, + 'status' => ($user->activated == 1) ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED, + )); + + if ($user->activated == 0) { // fail - not activated + $this->error = array('not_activated' => ''); + + } else { // success + if ($remember) { + $this->create_autologin($user->id); + } + + $this->clear_login_attempts($login); + + $this->ci->users->update_login_info( + $user->id, + $this->ci->config->item('login_record_ip', 'tank_auth'), + $this->ci->config->item('login_record_time', 'tank_auth')); + return TRUE; + } + } + } else { // fail - wrong password + $this->increase_login_attempt($login); + $this->error = array('password' => 'auth_incorrect_password'); + } + } else { // fail - wrong login + $this->increase_login_attempt($login); + $this->error = array('login' => 'auth_incorrect_login'); + } + } + return FALSE; + } + + /** + * Logout user from the site + * + * @return void + */ + function logout() + { + $this->delete_autologin(); + + // See http://codeigniter.com/forums/viewreply/662369/ as the reason for the next line + $this->ci->session->set_userdata(array('user_id' => '', 'username' => '', 'status' => '')); + + $this->ci->session->sess_destroy(); + } + + /** + * Check if user logged in. Also test if user is activated or not. + * + * @param bool + * @return bool + */ + function is_logged_in($activated = TRUE) + { + return $this->ci->session->userdata('status') === ($activated ? STATUS_ACTIVATED : STATUS_NOT_ACTIVATED); + } + + /** + * Get user_id + * + * @return string + */ + function get_user_id() + { + return $this->ci->session->userdata('user_id'); + } + + /** + * Get username + * + * @return string + */ + function get_username() + { + return $this->ci->session->userdata('username'); + } + + /** + * Create new user on the site and return some data about it: + * user_id, username, password, email, new_email_key (if any). + * + * @param string + * @param string + * @param string + * @param bool + * @return array + */ + function create_user($username, $email, $password, $email_activation) + { + if ((strlen($username) > 0) AND !$this->ci->users->is_username_available($username)) { + $this->error = array('username' => 'auth_username_in_use'); + + } elseif (!$this->ci->users->is_email_available($email)) { + $this->error = array('email' => 'auth_email_in_use'); + + } else { + // Hash password using phpass + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + $hashed_password = $hasher->HashPassword($password); + + $data = array( + 'username' => $username, + 'password' => $hashed_password, + 'email' => $email, + 'last_ip' => $this->ci->input->ip_address(), + ); + + if ($email_activation) { + $data['new_email_key'] = md5(rand().microtime()); + } + if (!is_null($res = $this->ci->users->create_user($data, !$email_activation))) { + $data['user_id'] = $res['user_id']; + $data['password'] = $password; + unset($data['last_ip']); + return $data; + } + } + return NULL; + } + + /** + * Check if username available for registering. + * Can be called for instant form validation. + * + * @param string + * @return bool + */ + function is_username_available($username) + { + return ((strlen($username) > 0) AND $this->ci->users->is_username_available($username)); + } + + /** + * Check if email available for registering. + * Can be called for instant form validation. + * + * @param string + * @return bool + */ + function is_email_available($email) + { + return ((strlen($email) > 0) AND $this->ci->users->is_email_available($email)); + } + + /** + * Change email for activation and return some data about user: + * user_id, username, email, new_email_key. + * Can be called for not activated users only. + * + * @param string + * @return array + */ + function change_email($email) + { + $user_id = $this->ci->session->userdata('user_id'); + + if (!is_null($user = $this->ci->users->get_user_by_id($user_id, FALSE))) { + + $data = array( + 'user_id' => $user_id, + 'username' => $user->username, + 'email' => $email, + ); + if (strtolower($user->email) == strtolower($email)) { // leave activation key as is + $data['new_email_key'] = $user->new_email_key; + return $data; + + } elseif ($this->ci->users->is_email_available($email)) { + $data['new_email_key'] = md5(rand().microtime()); + $this->ci->users->set_new_email($user_id, $email, $data['new_email_key'], FALSE); + return $data; + + } else { + $this->error = array('email' => 'auth_email_in_use'); + } + } + return NULL; + } + + /** + * Activate user using given key + * + * @param string + * @param string + * @param bool + * @return bool + */ + function activate_user($user_id, $activation_key, $activate_by_email = TRUE) + { + $this->ci->users->purge_na($this->ci->config->item('email_activation_expire', 'tank_auth')); + + if ((strlen($user_id) > 0) AND (strlen($activation_key) > 0)) { + return $this->ci->users->activate_user($user_id, $activation_key, $activate_by_email); + } + return FALSE; + } + + /** + * Set new password key for user and return some data about user: + * user_id, username, email, new_pass_key. + * The password key can be used to verify user when resetting his/her password. + * + * @param string + * @return array + */ + function forgot_password($login) + { + if (strlen($login) > 0) { + if (!is_null($user = $this->ci->users->get_user_by_login($login))) { + + $data = array( + 'user_id' => $user->id, + 'username' => $user->username, + 'email' => $user->email, + 'new_pass_key' => md5(rand().microtime()), + ); + + $this->ci->users->set_password_key($user->id, $data['new_pass_key']); + return $data; + + } else { + $this->error = array('login' => 'auth_incorrect_email_or_username'); + } + } + return NULL; + } + + /** + * Check if given password key is valid and user is authenticated. + * + * @param string + * @param string + * @return bool + */ + function can_reset_password($user_id, $new_pass_key) + { + if ((strlen($user_id) > 0) AND (strlen($new_pass_key) > 0)) { + return $this->ci->users->can_reset_password( + $user_id, + $new_pass_key, + $this->ci->config->item('forgot_password_expire', 'tank_auth')); + } + return FALSE; + } + + /** + * Replace user password (forgotten) with a new one (set by user) + * and return some data about it: user_id, username, new_password, email. + * + * @param string + * @param string + * @return bool + */ + function reset_password($user_id, $new_pass_key, $new_password) + { + if ((strlen($user_id) > 0) AND (strlen($new_pass_key) > 0) AND (strlen($new_password) > 0)) { + + if (!is_null($user = $this->ci->users->get_user_by_id($user_id, TRUE))) { + + // Hash password using phpass + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + $hashed_password = $hasher->HashPassword($new_password); + + if ($this->ci->users->reset_password( + $user_id, + $hashed_password, + $new_pass_key, + $this->ci->config->item('forgot_password_expire', 'tank_auth'))) { // success + + // Clear all user's autologins + $this->ci->load->model('tank_auth/user_autologin'); + $this->ci->user_autologin->clear($user->id); + + return array( + 'user_id' => $user_id, + 'username' => $user->username, + 'email' => $user->email, + 'new_password' => $new_password, + ); + } + } + } + return NULL; + } + + /** + * Change user password (only when user is logged in) + * + * @param string + * @param string + * @return bool + */ + function change_password($old_pass, $new_pass) + { + $user_id = $this->ci->session->userdata('user_id'); + + if (!is_null($user = $this->ci->users->get_user_by_id($user_id, TRUE))) { + + // Check if old password correct + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + if ($hasher->CheckPassword($old_pass, $user->password)) { // success + + // Hash new password using phpass + $hashed_password = $hasher->HashPassword($new_pass); + + // Replace old password with new one + $this->ci->users->change_password($user_id, $hashed_password); + return TRUE; + + } else { // fail + $this->error = array('old_password' => 'auth_incorrect_password'); + } + } + return FALSE; + } + + /** + * Change user email (only when user is logged in) and return some data about user: + * user_id, username, new_email, new_email_key. + * The new email cannot be used for login or notification before it is activated. + * + * @param string + * @param string + * @return array + */ + function set_new_email($new_email, $password) + { + $user_id = $this->ci->session->userdata('user_id'); + + if (!is_null($user = $this->ci->users->get_user_by_id($user_id, TRUE))) { + + // Check if password correct + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + if ($hasher->CheckPassword($password, $user->password)) { // success + + $data = array( + 'user_id' => $user_id, + 'username' => $user->username, + 'new_email' => $new_email, + ); + + if ($user->email == $new_email) { + $this->error = array('email' => 'auth_current_email'); + + } elseif ($user->new_email == $new_email) { // leave email key as is + $data['new_email_key'] = $user->new_email_key; + return $data; + + } elseif ($this->ci->users->is_email_available($new_email)) { + $data['new_email_key'] = md5(rand().microtime()); + $this->ci->users->set_new_email($user_id, $new_email, $data['new_email_key'], TRUE); + return $data; + + } else { + $this->error = array('email' => 'auth_email_in_use'); + } + } else { // fail + $this->error = array('password' => 'auth_incorrect_password'); + } + } + return NULL; + } + + /** + * Activate new email, if email activation key is valid. + * + * @param string + * @param string + * @return bool + */ + function activate_new_email($user_id, $new_email_key) + { + if ((strlen($user_id) > 0) AND (strlen($new_email_key) > 0)) { + return $this->ci->users->activate_new_email( + $user_id, + $new_email_key); + } + return FALSE; + } + + /** + * Delete user from the site (only when user is logged in) + * + * @param string + * @return bool + */ + function delete_user($password) + { + $user_id = $this->ci->session->userdata('user_id'); + + if (!is_null($user = $this->ci->users->get_user_by_id($user_id, TRUE))) { + + // Check if password correct + $hasher = new PasswordHash( + $this->ci->config->item('phpass_hash_strength', 'tank_auth'), + $this->ci->config->item('phpass_hash_portable', 'tank_auth')); + if ($hasher->CheckPassword($password, $user->password)) { // success + + $this->ci->users->delete_user($user_id); + $this->logout(); + return TRUE; + + } else { // fail + $this->error = array('password' => 'auth_incorrect_password'); + } + } + return FALSE; + } + + /** + * Get error message. + * Can be invoked after any failed operation such as login or register. + * + * @return string + */ + function get_error_message() + { + return $this->error; + } + + /** + * Save data for user's autologin + * + * @param int + * @return bool + */ + private function create_autologin($user_id) + { + $this->ci->load->helper('cookie'); + $key = substr(md5(uniqid(rand().get_cookie($this->ci->config->item('sess_cookie_name')))), 0, 16); + + $this->ci->load->model('tank_auth/user_autologin'); + $this->ci->user_autologin->purge($user_id); + + if ($this->ci->user_autologin->set($user_id, md5($key))) { + set_cookie(array( + 'name' => $this->ci->config->item('autologin_cookie_name', 'tank_auth'), + 'value' => serialize(array('user_id' => $user_id, 'key' => $key)), + 'expire' => $this->ci->config->item('autologin_cookie_life', 'tank_auth'), + )); + return TRUE; + } + return FALSE; + } + + /** + * Clear user's autologin data + * + * @return void + */ + private function delete_autologin() + { + $this->ci->load->helper('cookie'); + if ($cookie = get_cookie($this->ci->config->item('autologin_cookie_name', 'tank_auth'), TRUE)) { + + $data = unserialize($cookie); + + $this->ci->load->model('tank_auth/user_autologin'); + $this->ci->user_autologin->delete($data['user_id'], md5($data['key'])); + + delete_cookie($this->ci->config->item('autologin_cookie_name', 'tank_auth')); + } + } + + /** + * Login user automatically if he/she provides correct autologin verification + * + * @return void + */ + private function autologin() + { + if (!$this->is_logged_in() AND !$this->is_logged_in(FALSE)) { // not logged in (as any user) + + $this->ci->load->helper('cookie'); + if ($cookie = get_cookie($this->ci->config->item('autologin_cookie_name', 'tank_auth'), TRUE)) { + + $data = unserialize($cookie); + + if (isset($data['key']) AND isset($data['user_id'])) { + + $this->ci->load->model('tank_auth/user_autologin'); + if (!is_null($user = $this->ci->user_autologin->get($data['user_id'], md5($data['key'])))) { + + // Login user + $this->ci->session->set_userdata(array( + 'user_id' => $user->id, + 'username' => $user->username, + 'status' => STATUS_ACTIVATED, + )); + + // Renew users cookie to prevent it from expiring + set_cookie(array( + 'name' => $this->ci->config->item('autologin_cookie_name', 'tank_auth'), + 'value' => $cookie, + 'expire' => $this->ci->config->item('autologin_cookie_life', 'tank_auth'), + )); + + $this->ci->users->update_login_info( + $user->id, + $this->ci->config->item('login_record_ip', 'tank_auth'), + $this->ci->config->item('login_record_time', 'tank_auth')); + return TRUE; + } + } + } + } + return FALSE; + } + + /** + * Check if login attempts exceeded max login attempts (specified in config) + * + * @param string + * @return bool + */ + function is_max_login_attempts_exceeded($login) + { + if ($this->ci->config->item('login_count_attempts', 'tank_auth')) { + $this->ci->load->model('tank_auth/login_attempts'); + return $this->ci->login_attempts->get_attempts_num($this->ci->input->ip_address(), $login) + >= $this->ci->config->item('login_max_attempts', 'tank_auth'); + } + return FALSE; + } + + /** + * Increase number of attempts for given IP-address and login + * (if attempts to login is being counted) + * + * @param string + * @return void + */ + private function increase_login_attempt($login) + { + if ($this->ci->config->item('login_count_attempts', 'tank_auth')) { + if (!$this->is_max_login_attempts_exceeded($login)) { + $this->ci->load->model('tank_auth/login_attempts'); + $this->ci->login_attempts->increase_attempt($this->ci->input->ip_address(), $login); + } + } + } + + /** + * Clear all attempt records for given IP-address and login + * (if attempts to login is being counted) + * + * @param string + * @return void + */ + private function clear_login_attempts($login) + { + if ($this->ci->config->item('login_count_attempts', 'tank_auth')) { + $this->ci->load->model('tank_auth/login_attempts'); + $this->ci->login_attempts->clear_attempts( + $this->ci->input->ip_address(), + $login, + $this->ci->config->item('login_attempt_expire', 'tank_auth')); + } + } +} + +/* End of file Tank_auth.php */ +/* Location: ./application/libraries/Tank_auth.php */ \ No newline at end of file diff --git a/application/libraries/phpass-0.1/PasswordHash.php b/application/libraries/phpass-0.1/PasswordHash.php new file mode 100644 index 0000000..550a01b --- /dev/null +++ b/application/libraries/phpass-0.1/PasswordHash.php @@ -0,0 +1,248 @@ + in 2004-2006 and placed in +# the public domain. +# +# There's absolutely no warranty. +# +# The homepage URL for this framework is: +# +# http://www.openwall.com/phpass/ +# +# Please be sure to update the Version line if you edit this file in any way. +# It is suggested that you leave the main version number intact, but indicate +# your project name (after the slash) and add your own revision information. +# +# Please do not change the "private" password hashing method implemented in +# here, thereby making your hashes incompatible. However, if you must, please +# change the hash type identifier (the "$P$") to something different. +# +# Obviously, since this code is in the public domain, the above are not +# requirements (there can be none), but merely suggestions. +# +class PasswordHash { + var $itoa64; + var $iteration_count_log2; + var $portable_hashes; + var $random_state; + + function PasswordHash($iteration_count_log2, $portable_hashes) + { + $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; + + if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) + $iteration_count_log2 = 8; + $this->iteration_count_log2 = $iteration_count_log2; + + $this->portable_hashes = $portable_hashes; + + $this->random_state = microtime() . getmypid(); + } + + function get_random_bytes($count) + { + $output = ''; + if (($fh = @fopen('/dev/urandom', 'rb'))) { + $output = fread($fh, $count); + fclose($fh); + } + + if (strlen($output) < $count) { + $output = ''; + for ($i = 0; $i < $count; $i += 16) { + $this->random_state = + md5(microtime() . $this->random_state); + $output .= + pack('H*', md5($this->random_state)); + } + $output = substr($output, 0, $count); + } + + return $output; + } + + function encode64($input, $count) + { + $output = ''; + $i = 0; + do { + $value = ord($input[$i++]); + $output .= $this->itoa64[$value & 0x3f]; + if ($i < $count) + $value |= ord($input[$i]) << 8; + $output .= $this->itoa64[($value >> 6) & 0x3f]; + if ($i++ >= $count) + break; + if ($i < $count) + $value |= ord($input[$i]) << 16; + $output .= $this->itoa64[($value >> 12) & 0x3f]; + if ($i++ >= $count) + break; + $output .= $this->itoa64[($value >> 18) & 0x3f]; + } while ($i < $count); + + return $output; + } + + function gensalt_private($input) + { + $output = '$P$'; + $output .= $this->itoa64[min($this->iteration_count_log2 + + ((PHP_VERSION >= '5') ? 5 : 3), 30)]; + $output .= $this->encode64($input, 6); + + return $output; + } + + function crypt_private($password, $setting) + { + $output = '*0'; + if (substr($setting, 0, 2) == $output) + $output = '*1'; + + if (substr($setting, 0, 3) != '$P$') + return $output; + + $count_log2 = strpos($this->itoa64, $setting[3]); + if ($count_log2 < 7 || $count_log2 > 30) + return $output; + + $count = 1 << $count_log2; + + $salt = substr($setting, 4, 8); + if (strlen($salt) != 8) + return $output; + + # We're kind of forced to use MD5 here since it's the only + # cryptographic primitive available in all versions of PHP + # currently in use. To implement our own low-level crypto + # in PHP would result in much worse performance and + # consequently in lower iteration counts and hashes that are + # quicker to crack (by non-PHP code). + if (PHP_VERSION >= '5') { + $hash = md5($salt . $password, TRUE); + do { + $hash = md5($hash . $password, TRUE); + } while (--$count); + } else { + $hash = pack('H*', md5($salt . $password)); + do { + $hash = pack('H*', md5($hash . $password)); + } while (--$count); + } + + $output = substr($setting, 0, 12); + $output .= $this->encode64($hash, 16); + + return $output; + } + + function gensalt_extended($input) + { + $count_log2 = min($this->iteration_count_log2 + 8, 24); + # This should be odd to not reveal weak DES keys, and the + # maximum valid value is (2**24 - 1) which is odd anyway. + $count = (1 << $count_log2) - 1; + + $output = '_'; + $output .= $this->itoa64[$count & 0x3f]; + $output .= $this->itoa64[($count >> 6) & 0x3f]; + $output .= $this->itoa64[($count >> 12) & 0x3f]; + $output .= $this->itoa64[($count >> 18) & 0x3f]; + + $output .= $this->encode64($input, 3); + + return $output; + } + + function gensalt_blowfish($input) + { + # This one needs to use a different order of characters and a + # different encoding scheme from the one in encode64() above. + # We care because the last character in our encoded string will + # only represent 2 bits. While two known implementations of + # bcrypt will happily accept and correct a salt string which + # has the 4 unused bits set to non-zero, we do not want to take + # chances and we also do not want to waste an additional byte + # of entropy. + $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + $output = '$2a$'; + $output .= chr(ord('0') + $this->iteration_count_log2 / 10); + $output .= chr(ord('0') + $this->iteration_count_log2 % 10); + $output .= '$'; + + $i = 0; + do { + $c1 = ord($input[$i++]); + $output .= $itoa64[$c1 >> 2]; + $c1 = ($c1 & 0x03) << 4; + if ($i >= 16) { + $output .= $itoa64[$c1]; + break; + } + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 4; + $output .= $itoa64[$c1]; + $c1 = ($c2 & 0x0f) << 2; + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 6; + $output .= $itoa64[$c1]; + $output .= $itoa64[$c2 & 0x3f]; + } while (1); + + return $output; + } + + function HashPassword($password) + { + $random = ''; + + if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { + $random = $this->get_random_bytes(16); + $hash = + crypt($password, $this->gensalt_blowfish($random)); + if (strlen($hash) == 60) + return $hash; + } + + if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { + if (strlen($random) < 3) + $random = $this->get_random_bytes(3); + $hash = + crypt($password, $this->gensalt_extended($random)); + if (strlen($hash) == 20) + return $hash; + } + + if (strlen($random) < 6) + $random = $this->get_random_bytes(6); + $hash = + $this->crypt_private($password, + $this->gensalt_private($random)); + if (strlen($hash) == 34) + return $hash; + + # Returning '*' on error is safe here, but would _not_ be safe + # in a crypt(3)-like function used _both_ for generating new + # hashes and for validating passwords against existing hashes. + return '*'; + } + + function CheckPassword($password, $stored_hash) + { + $hash = $this->crypt_private($password, $stored_hash); + if ($hash[0] == '*') + $hash = crypt($password, $stored_hash); + + return $hash == $stored_hash; + } +} + +?> diff --git a/application/libraries/phpass-0.1/c/Makefile b/application/libraries/phpass-0.1/c/Makefile new file mode 100644 index 0000000..fe48917 --- /dev/null +++ b/application/libraries/phpass-0.1/c/Makefile @@ -0,0 +1,21 @@ +# +# Written by Solar Designer and placed in the public domain. +# See crypt_private.c for more information. +# +CC = gcc +LD = $(CC) +RM = rm -f +CFLAGS = -Wall -O2 -fomit-frame-pointer -funroll-loops +LDFLAGS = -s +LIBS = -lcrypto + +all: crypt_private-test + +crypt_private-test: crypt_private-test.o + $(LD) $(LDFLAGS) $(LIBS) crypt_private-test.o -o $@ + +crypt_private-test.o: crypt_private.c + $(CC) -c $(CFLAGS) crypt_private.c -DTEST -o $@ + +clean: + $(RM) crypt_private-test* diff --git a/application/libraries/phpass-0.1/c/crypt_private.c b/application/libraries/phpass-0.1/c/crypt_private.c new file mode 100644 index 0000000..669c4ae --- /dev/null +++ b/application/libraries/phpass-0.1/c/crypt_private.c @@ -0,0 +1,106 @@ +/* + * This code exists for the sole purpose to serve as another implementation + * of the "private" password hashing method implemened in PasswordHash.php + * and thus to confirm that these password hashes are indeed calculated as + * intended. + * + * Other uses of this code are discouraged. There are much better password + * hashing algorithms available to C programmers; one of those is bcrypt: + * + * http://www.openwall.com/crypt/ + * + * Written by Solar Designer in 2005 and placed in + * the public domain. + * + * There's absolutely no warranty. + */ + +#include +#include + +#ifdef TEST +#include +#endif + +static char *itoa64 = + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + +static void encode64(char *dst, char *src, int count) +{ + int i, value; + + i = 0; + do { + value = (unsigned char)src[i++]; + *dst++ = itoa64[value & 0x3f]; + if (i < count) + value |= (unsigned char)src[i] << 8; + *dst++ = itoa64[(value >> 6) & 0x3f]; + if (i++ >= count) + break; + if (i < count) + value |= (unsigned char)src[i] << 16; + *dst++ = itoa64[(value >> 12) & 0x3f]; + if (i++ >= count) + break; + *dst++ = itoa64[(value >> 18) & 0x3f]; + } while (i < count); +} + +char *crypt_private(char *password, char *setting) +{ + static char output[32]; + MD5_CTX ctx; + char hash[MD5_DIGEST_LENGTH]; + char *p, *salt; + int count_log2, length, count; + + strcpy(output, "*0"); + if (!strncmp(setting, output, 2)) + output[1] = '1'; + + if (strncmp(setting, "$P$", 3)) + return output; + + p = strchr(itoa64, setting[3]); + if (!p) + return output; + count_log2 = p - itoa64; + if (count_log2 < 7 || count_log2 > 31) + return output; + + salt = setting + 4; + if (strlen(salt) < 8) + return output; + + length = strlen(password); + + MD5_Init(&ctx); + MD5_Update(&ctx, salt, 8); + MD5_Update(&ctx, password, length); + MD5_Final(hash, &ctx); + + count = 1 << count_log2; + do { + MD5_Init(&ctx); + MD5_Update(&ctx, hash, MD5_DIGEST_LENGTH); + MD5_Update(&ctx, password, length); + MD5_Final(hash, &ctx); + } while (--count); + + memcpy(output, setting, 12); + encode64(&output[12], hash, MD5_DIGEST_LENGTH); + + return output; +} + +#ifdef TEST +int main(int argc, char **argv) +{ + if (argc != 3) return 1; + + puts(crypt_private(argv[1], argv[2])); + + return 0; +} +#endif diff --git a/application/libraries/phpass-0.1/test.php b/application/libraries/phpass-0.1/test.php new file mode 100644 index 0000000..36ef653 --- /dev/null +++ b/application/libraries/phpass-0.1/test.php @@ -0,0 +1,72 @@ +HashPassword($correct); + +print "Hash: " . $hash . "\n"; + +$check = $t_hasher->CheckPassword($correct, $hash); +if ($check) $ok++; +print "Check correct: '" . $check . "' (should be '1')\n"; + +$wrong = "test12346"; +$check = $t_hasher->CheckPassword($wrong, $hash); +if (!$check) $ok++; +print "Check wrong: '" . $check . "' (should be '0' or '')\n"; + +unset($t_hasher); + +# Force the use of weaker portable hashes. +$t_hasher = new PasswordHash(8, TRUE); + +$hash = $t_hasher->HashPassword($correct); + +print "Hash: " . $hash . "\n"; + +$check = $t_hasher->CheckPassword($correct, $hash); +if ($check) $ok++; +print "Check correct: '" . $check . "' (should be '1')\n"; + +$check = $t_hasher->CheckPassword($wrong, $hash); +if (!$check) $ok++; +print "Check wrong: '" . $check . "' (should be '0' or '')\n"; + +# A correct portable hash for "test12345". +# Please note the use of single quotes to ensure that the dollar signs will +# be interpreted literally. Of course, a real application making use of the +# framework won't store password hashes within a PHP source file anyway. +# We only do this for testing. +$hash = '$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'; + +print "Hash: " . $hash . "\n"; + +$check = $t_hasher->CheckPassword($correct, $hash); +if ($check) $ok++; +print "Check correct: '" . $check . "' (should be '1')\n"; + +$check = $t_hasher->CheckPassword($wrong, $hash); +if (!$check) $ok++; +print "Check wrong: '" . $check . "' (should be '0' or '')\n"; + +if ($ok == 6) + print "All tests have PASSED\n"; +else + print "Some tests have FAILED\n"; + +?> diff --git a/application/models/tank_auth/login_attempts.php b/application/models/tank_auth/login_attempts.php new file mode 100644 index 0000000..bee9995 --- /dev/null +++ b/application/models/tank_auth/login_attempts.php @@ -0,0 +1,74 @@ +table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name; + } + + /** + * Get number of attempts to login occured from given IP-address or login + * + * @param string + * @param string + * @return int + */ + function get_attempts_num($ip_address, $login) + { + $this->db->select('1', FALSE); + $this->db->where('ip_address', $ip_address); + if (strlen($login) > 0) $this->db->or_where('login', $login); + + $qres = $this->db->get($this->table_name); + return $qres->num_rows(); + } + + /** + * Increase number of attempts for given IP-address and login + * + * @param string + * @param string + * @return void + */ + function increase_attempt($ip_address, $login) + { + $this->db->insert($this->table_name, array('ip_address' => $ip_address, 'login' => $login)); + } + + /** + * Clear all attempt records for given IP-address and login. + * Also purge obsolete login attempts (to keep DB clear). + * + * @param string + * @param string + * @param int + * @return void + */ + function clear_attempts($ip_address, $login, $expire_period = 86400) + { + $this->db->where(array('ip_address' => $ip_address, 'login' => $login)); + + // Purge obsolete login attempts + $this->db->or_where('UNIX_TIMESTAMP(time) <', time() - $expire_period); + + $this->db->delete($this->table_name); + } +} + +/* End of file login_attempts.php */ +/* Location: ./application/models/auth/login_attempts.php */ \ No newline at end of file diff --git a/application/models/tank_auth/user_autologin.php b/application/models/tank_auth/user_autologin.php new file mode 100644 index 0000000..7c7b0ac --- /dev/null +++ b/application/models/tank_auth/user_autologin.php @@ -0,0 +1,106 @@ +table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name; + $this->users_table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->users_table_name; + } + + /** + * Get user data for auto-logged in user. + * Return NULL if given key or user ID is invalid. + * + * @param int + * @param string + * @return object + */ + function get($user_id, $key) + { + $this->db->select($this->users_table_name.'.id'); + $this->db->select($this->users_table_name.'.username'); + $this->db->from($this->users_table_name); + $this->db->join($this->table_name, $this->table_name.'.user_id = '.$this->users_table_name.'.id'); + $this->db->where($this->table_name.'.user_id', $user_id); + $this->db->where($this->table_name.'.key_id', $key); + $query = $this->db->get(); + if ($query->num_rows() == 1) return $query->row(); + return NULL; + } + + /** + * Save data for user's autologin + * + * @param int + * @param string + * @return bool + */ + function set($user_id, $key) + { + return $this->db->insert($this->table_name, array( + 'user_id' => $user_id, + 'key_id' => $key, + 'user_agent' => substr($this->input->user_agent(), 0, 149), + 'last_ip' => $this->input->ip_address(), + )); + } + + /** + * Delete user's autologin data + * + * @param int + * @param string + * @return void + */ + function delete($user_id, $key) + { + $this->db->where('user_id', $user_id); + $this->db->where('key_id', $key); + $this->db->delete($this->table_name); + } + + /** + * Delete all autologin data for given user + * + * @param int + * @return void + */ + function clear($user_id) + { + $this->db->where('user_id', $user_id); + $this->db->delete($this->table_name); + } + + /** + * Purge autologin data for given user and login conditions + * + * @param int + * @return void + */ + function purge($user_id) + { + $this->db->where('user_id', $user_id); + $this->db->where('user_agent', substr($this->input->user_agent(), 0, 149)); + $this->db->where('last_ip', $this->input->ip_address()); + $this->db->delete($this->table_name); + } +} + +/* End of file user_autologin.php */ +/* Location: ./application/models/auth/user_autologin.php */ \ No newline at end of file diff --git a/application/models/tank_auth/users.php b/application/models/tank_auth/users.php new file mode 100644 index 0000000..71372e4 --- /dev/null +++ b/application/models/tank_auth/users.php @@ -0,0 +1,398 @@ +table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->table_name; + $this->profile_table_name = $ci->config->item('db_table_prefix', 'tank_auth').$this->profile_table_name; + } + + /** + * Get user record by Id + * + * @param int + * @param bool + * @return object + */ + function get_user_by_id($user_id, $activated) + { + $this->db->where('id', $user_id); + $this->db->where('activated', $activated ? 1 : 0); + + $query = $this->db->get($this->table_name); + if ($query->num_rows() == 1) return $query->row(); + return NULL; + } + + /** + * Get user record by login (username or email) + * + * @param string + * @return object + */ + function get_user_by_login($login) + { + $this->db->where('LOWER(username)=', strtolower($login)); + $this->db->or_where('LOWER(email)=', strtolower($login)); + + $query = $this->db->get($this->table_name); + if ($query->num_rows() == 1) return $query->row(); + return NULL; + } + + /** + * Get user record by username + * + * @param string + * @return object + */ + function get_user_by_username($username) + { + $this->db->where('LOWER(username)=', strtolower($username)); + + $query = $this->db->get($this->table_name); + if ($query->num_rows() == 1) return $query->row(); + return NULL; + } + + /** + * Get user record by email + * + * @param string + * @return object + */ + function get_user_by_email($email) + { + $this->db->where('LOWER(email)=', strtolower($email)); + + $query = $this->db->get($this->table_name); + if ($query->num_rows() == 1) return $query->row(); + return NULL; + } + + /** + * Check if username available for registering + * + * @param string + * @return bool + */ + function is_username_available($username) + { + $this->db->select('1', FALSE); + $this->db->where('LOWER(username)=', strtolower($username)); + + $query = $this->db->get($this->table_name); + return $query->num_rows() == 0; + } + + /** + * Check if email available for registering + * + * @param string + * @return bool + */ + function is_email_available($email) + { + $this->db->select('1', FALSE); + $this->db->where('LOWER(email)=', strtolower($email)); + $this->db->or_where('LOWER(new_email)=', strtolower($email)); + + $query = $this->db->get($this->table_name); + return $query->num_rows() == 0; + } + + /** + * Create new user record + * + * @param array + * @param bool + * @return array + */ + function create_user($data, $activated = TRUE) + { + $data['created'] = date('Y-m-d H:i:s'); + $data['activated'] = $activated ? 1 : 0; + + if ($this->db->insert($this->table_name, $data)) { + $user_id = $this->db->insert_id(); + if ($activated) $this->create_profile($user_id); + return array('user_id' => $user_id); + } + return NULL; + } + + /** + * Activate user if activation key is valid. + * Can be called for not activated users only. + * + * @param int + * @param string + * @param bool + * @return bool + */ + function activate_user($user_id, $activation_key, $activate_by_email) + { + $this->db->select('1', FALSE); + $this->db->where('id', $user_id); + if ($activate_by_email) { + $this->db->where('new_email_key', $activation_key); + } else { + $this->db->where('new_password_key', $activation_key); + } + $this->db->where('activated', 0); + $query = $this->db->get($this->table_name); + + if ($query->num_rows() == 1) { + + $this->db->set('activated', 1); + $this->db->set('new_email_key', NULL); + $this->db->where('id', $user_id); + $this->db->update($this->table_name); + + $this->create_profile($user_id); + return TRUE; + } + return FALSE; + } + + /** + * Purge table of non-activated users + * + * @param int + * @return void + */ + function purge_na($expire_period = 172800) + { + $this->db->where('activated', 0); + $this->db->where('UNIX_TIMESTAMP(created) <', time() - $expire_period); + $this->db->delete($this->table_name); + } + + /** + * Delete user record + * + * @param int + * @return bool + */ + function delete_user($user_id) + { + $this->db->where('id', $user_id); + $this->db->delete($this->table_name); + if ($this->db->affected_rows() > 0) { + $this->delete_profile($user_id); + return TRUE; + } + return FALSE; + } + + /** + * Set new password key for user. + * This key can be used for authentication when resetting user's password. + * + * @param int + * @param string + * @return bool + */ + function set_password_key($user_id, $new_pass_key) + { + $this->db->set('new_password_key', $new_pass_key); + $this->db->set('new_password_requested', date('Y-m-d H:i:s')); + $this->db->where('id', $user_id); + + $this->db->update($this->table_name); + return $this->db->affected_rows() > 0; + } + + /** + * Check if given password key is valid and user is authenticated. + * + * @param int + * @param string + * @param int + * @return void + */ + function can_reset_password($user_id, $new_pass_key, $expire_period = 900) + { + $this->db->select('1', FALSE); + $this->db->where('id', $user_id); + $this->db->where('new_password_key', $new_pass_key); + $this->db->where('UNIX_TIMESTAMP(new_password_requested) >', time() - $expire_period); + + $query = $this->db->get($this->table_name); + return $query->num_rows() == 1; + } + + /** + * Change user password if password key is valid and user is authenticated. + * + * @param int + * @param string + * @param string + * @param int + * @return bool + */ + function reset_password($user_id, $new_pass, $new_pass_key, $expire_period = 900) + { + $this->db->set('password', $new_pass); + $this->db->set('new_password_key', NULL); + $this->db->set('new_password_requested', NULL); + $this->db->where('id', $user_id); + $this->db->where('new_password_key', $new_pass_key); + $this->db->where('UNIX_TIMESTAMP(new_password_requested) >=', time() - $expire_period); + + $this->db->update($this->table_name); + return $this->db->affected_rows() > 0; + } + + /** + * Change user password + * + * @param int + * @param string + * @return bool + */ + function change_password($user_id, $new_pass) + { + $this->db->set('password', $new_pass); + $this->db->where('id', $user_id); + + $this->db->update($this->table_name); + return $this->db->affected_rows() > 0; + } + + /** + * Set new email for user (may be activated or not). + * The new email cannot be used for login or notification before it is activated. + * + * @param int + * @param string + * @param string + * @param bool + * @return bool + */ + function set_new_email($user_id, $new_email, $new_email_key, $activated) + { + $this->db->set($activated ? 'new_email' : 'email', $new_email); + $this->db->set('new_email_key', $new_email_key); + $this->db->where('id', $user_id); + $this->db->where('activated', $activated ? 1 : 0); + + $this->db->update($this->table_name); + return $this->db->affected_rows() > 0; + } + + /** + * Activate new email (replace old email with new one) if activation key is valid. + * + * @param int + * @param string + * @return bool + */ + function activate_new_email($user_id, $new_email_key) + { + $this->db->set('email', 'new_email', FALSE); + $this->db->set('new_email', NULL); + $this->db->set('new_email_key', NULL); + $this->db->where('id', $user_id); + $this->db->where('new_email_key', $new_email_key); + + $this->db->update($this->table_name); + return $this->db->affected_rows() > 0; + } + + /** + * Update user login info, such as IP-address or login time, and + * clear previously generated (but not activated) passwords. + * + * @param int + * @param bool + * @param bool + * @return void + */ + function update_login_info($user_id, $record_ip, $record_time) + { + $this->db->set('new_password_key', NULL); + $this->db->set('new_password_requested', NULL); + + if ($record_ip) $this->db->set('last_ip', $this->input->ip_address()); + if ($record_time) $this->db->set('last_login', date('Y-m-d H:i:s')); + + $this->db->where('id', $user_id); + $this->db->update($this->table_name); + } + + /** + * Ban user + * + * @param int + * @param string + * @return void + */ + function ban_user($user_id, $reason = NULL) + { + $this->db->where('id', $user_id); + $this->db->update($this->table_name, array( + 'banned' => 1, + 'ban_reason' => $reason, + )); + } + + /** + * Unban user + * + * @param int + * @return void + */ + function unban_user($user_id) + { + $this->db->where('id', $user_id); + $this->db->update($this->table_name, array( + 'banned' => 0, + 'ban_reason' => NULL, + )); + } + + /** + * Create an empty profile for a new user + * + * @param int + * @return bool + */ + private function create_profile($user_id) + { + $this->db->set('user_id', $user_id); + return $this->db->insert($this->profile_table_name); + } + + /** + * Delete user profile + * + * @param int + * @return void + */ + private function delete_profile($user_id) + { + $this->db->where('user_id', $user_id); + $this->db->delete($this->profile_table_name); + } +} + +/* End of file users.php */ +/* Location: ./application/models/auth/users.php */ \ No newline at end of file diff --git a/application/views/auth/change_email_form.php b/application/views/auth/change_email_form.php new file mode 100644 index 0000000..29a3281 --- /dev/null +++ b/application/views/auth/change_email_form.php @@ -0,0 +1,29 @@ + 'password', + 'id' => 'password', + 'size' => 30, +); +$email = array( + 'name' => 'email', + 'id' => 'email', + 'value' => set_value('email'), + 'maxlength' => 80, + 'size' => 30, +); +?> +uri->uri_string()); ?> + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/auth/change_password_form.php b/application/views/auth/change_password_form.php new file mode 100644 index 0000000..bb17f67 --- /dev/null +++ b/application/views/auth/change_password_form.php @@ -0,0 +1,40 @@ + 'old_password', + 'id' => 'old_password', + 'value' => set_value('old_password'), + 'size' => 30, +); +$new_password = array( + 'name' => 'new_password', + 'id' => 'new_password', + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +$confirm_new_password = array( + 'name' => 'confirm_new_password', + 'id' => 'confirm_new_password', + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +?> +uri->uri_string()); ?> + + + + + + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/auth/forgot_password_form.php b/application/views/auth/forgot_password_form.php new file mode 100644 index 0000000..62cb70a --- /dev/null +++ b/application/views/auth/forgot_password_form.php @@ -0,0 +1,24 @@ + 'login', + 'id' => 'login', + 'value' => set_value('login'), + 'maxlength' => 80, + 'size' => 30, +); +if ($this->config->item('use_username', 'tank_auth')) { + $login_label = 'Email or login'; +} else { + $login_label = 'Email'; +} +?> +uri->uri_string()); ?> + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/auth/general_message.php b/application/views/auth/general_message.php new file mode 100644 index 0000000..498619a --- /dev/null +++ b/application/views/auth/general_message.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/application/views/auth/login_form.php b/application/views/auth/login_form.php new file mode 100644 index 0000000..9187518 --- /dev/null +++ b/application/views/auth/login_form.php @@ -0,0 +1,93 @@ + 'login', + 'id' => 'login', + 'value' => set_value('login'), + 'maxlength' => 80, + 'size' => 30, +); +if ($login_by_username AND $login_by_email) { + $login_label = 'Email or login'; +} else if ($login_by_username) { + $login_label = 'Login'; +} else { + $login_label = 'Email'; +} +$password = array( + 'name' => 'password', + 'id' => 'password', + 'size' => 30, +); +$remember = array( + 'name' => 'remember', + 'id' => 'remember', + 'value' => 1, + 'checked' => set_value('remember'), + 'style' => 'margin:0;padding:0', +); +$captcha = array( + 'name' => 'captcha', + 'id' => 'captcha', + 'maxlength' => 8, +); +?> +uri->uri_string()); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Get another CAPTCHA + + +
+
Enter the words above
+
Enter the numbers you hear
+
+

Enter the code exactly as it appears:

+ +
+ + + + config->item('allow_registration', 'tank_auth')) echo anchor('/auth/register/', 'Register'); ?> +
+ + \ No newline at end of file diff --git a/application/views/auth/register_form.php b/application/views/auth/register_form.php new file mode 100644 index 0000000..0d16a0a --- /dev/null +++ b/application/views/auth/register_form.php @@ -0,0 +1,100 @@ + 'username', + 'id' => 'username', + 'value' => set_value('username'), + 'maxlength' => $this->config->item('username_max_length', 'tank_auth'), + 'size' => 30, + ); +} +$email = array( + 'name' => 'email', + 'id' => 'email', + 'value' => set_value('email'), + 'maxlength' => 80, + 'size' => 30, +); +$password = array( + 'name' => 'password', + 'id' => 'password', + 'value' => set_value('password'), + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +$confirm_password = array( + 'name' => 'confirm_password', + 'id' => 'confirm_password', + 'value' => set_value('confirm_password'), + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +$captcha = array( + 'name' => 'captcha', + 'id' => 'captcha', + 'maxlength' => 8, +); +?> +uri->uri_string()); ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ Get another CAPTCHA + + +
+
Enter the words above
+
Enter the numbers you hear
+
+

Enter the code exactly as it appears:

+ +
+ + \ No newline at end of file diff --git a/application/views/auth/reset_password_form.php b/application/views/auth/reset_password_form.php new file mode 100644 index 0000000..7bb25cc --- /dev/null +++ b/application/views/auth/reset_password_form.php @@ -0,0 +1,29 @@ + 'new_password', + 'id' => 'new_password', + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +$confirm_new_password = array( + 'name' => 'confirm_new_password', + 'id' => 'confirm_new_password', + 'maxlength' => $this->config->item('password_max_length', 'tank_auth'), + 'size' => 30, +); +?> +uri->uri_string()); ?> + + + + + + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/auth/send_again_form.php b/application/views/auth/send_again_form.php new file mode 100644 index 0000000..024eedf --- /dev/null +++ b/application/views/auth/send_again_form.php @@ -0,0 +1,19 @@ + 'email', + 'id' => 'email', + 'value' => set_value('email'), + 'maxlength' => 80, + 'size' => 30, +); +?> +uri->uri_string()); ?> + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/auth/unregister_form.php b/application/views/auth/unregister_form.php new file mode 100644 index 0000000..bfd5ea3 --- /dev/null +++ b/application/views/auth/unregister_form.php @@ -0,0 +1,17 @@ + 'password', + 'id' => 'password', + 'size' => 30, +); +?> +uri->uri_string()); ?> + + + + + + +
+ + \ No newline at end of file diff --git a/application/views/email/activate-html.php b/application/views/email/activate-html.php new file mode 100644 index 0000000..2d743c3 --- /dev/null +++ b/application/views/email/activate-html.php @@ -0,0 +1,34 @@ + + +Welcome to <?php echo $site_name; ?>! + +
+ + + + + +
+

Welcome to !

+Thanks for joining . We listed your sign in details below, make sure you keep them safe.
+To verify your email address, please follow this link:
+
+Finish your registration...
+
+Link doesn't work? Copy the following link to your browser address bar:
+
+
+Please verify your email within hours, otherwise your registration will become invalid and you will have to register again.
+
+
+ 0) { ?>Your username:
+Your email address:
+Your password:
+
+
+Have fun!
+The Team +
+
+ + \ No newline at end of file diff --git a/application/views/email/activate-txt.php b/application/views/email/activate-txt.php new file mode 100644 index 0000000..dfa8d58 --- /dev/null +++ b/application/views/email/activate-txt.php @@ -0,0 +1,24 @@ +Welcome to , + +Thanks for joining . We listed your sign in details below, make sure you keep them safe. +To verify your email address, please follow this link: + + + + +Please verify your email within hours, otherwise your registration will become invalid and you will have to register again. + 0) { ?> + +Your username: + + +Your email address: + + +Your password: + + + + +Have fun! +The Team \ No newline at end of file diff --git a/application/views/email/change_email-html.php b/application/views/email/change_email-html.php new file mode 100644 index 0000000..224b6c6 --- /dev/null +++ b/application/views/email/change_email-html.php @@ -0,0 +1,33 @@ + + +Your new email address on <?php echo $site_name; ?> + +
+ + + + + +
+

Your new email address on

+You have changed your email address for .
+Follow this link to confirm your new email address:
+
+Confirm your new email
+
+Link doesn't work? Copy the following link to your browser address bar:
+
+
+
+Your email address:
+
+
+You received this email, because it was requested by a user. If you have received this by mistake, please DO NOT click the confirmation link, and simply delete this email. After a short time, the request will be removed from the system.
+
+
+Thank you,
+The Team +
+
+ + \ No newline at end of file diff --git a/application/views/email/change_email-txt.php b/application/views/email/change_email-txt.php new file mode 100644 index 0000000..db8c0cc --- /dev/null +++ b/application/views/email/change_email-txt.php @@ -0,0 +1,16 @@ +Hi 0) { ?> , + +You have changed your email address for . +Follow this link to confirm your new email address: + + + + +Your new email: + + +You received this email, because it was requested by a user. If you have received this by mistake, please DO NOT click the confirmation link, and simply delete this email. After a short time, the request will be removed from the system. + + +Thank you, +The Team \ No newline at end of file diff --git a/application/views/email/forgot_password-html.php b/application/views/email/forgot_password-html.php new file mode 100644 index 0000000..6cbdcc5 --- /dev/null +++ b/application/views/email/forgot_password-html.php @@ -0,0 +1,30 @@ + + +Create a new password on <?php echo $site_name; ?> + +
+ + + + + +
+

Create a new password

+Forgot your password, huh? No big deal.
+To create a new password, just follow this link:
+
+Create a new password
+
+Link doesn't work? Copy the following link to your browser address bar:
+
+
+
+You received this email, because it was requested by a user. This is part of the procedure to create a new password on the system. If you DID NOT request a new password then please ignore this email and your password will remain the same.
+
+
+Thank you,
+The Team +
+
+ + \ No newline at end of file diff --git a/application/views/email/forgot_password-txt.php b/application/views/email/forgot_password-txt.php new file mode 100644 index 0000000..5886f77 --- /dev/null +++ b/application/views/email/forgot_password-txt.php @@ -0,0 +1,13 @@ +Hi 0) { ?> , + +Forgot your password, huh? No big deal. +To create a new password, just follow this link: + + + + +You received this email, because it was requested by a user. This is part of the procedure to create a new password on the system. If you DID NOT request a new password then please ignore this email and your password will remain the same. + + +Thank you, +The Team \ No newline at end of file diff --git a/application/views/email/reset_password-html.php b/application/views/email/reset_password-html.php new file mode 100644 index 0000000..ea8bf38 --- /dev/null +++ b/application/views/email/reset_password-html.php @@ -0,0 +1,26 @@ + + +Your new password on <?php echo $site_name; ?> + +
+ + + + + +
+

Your new password on

+You have changed your password.
+Please, keep it in your records so you don't forget it.
+
+ 0) { ?>Your username:
+Your email address:
+
*/ ?> +
+
+Thank you,
+The Team +
+
+ + \ No newline at end of file diff --git a/application/views/email/reset_password-txt.php b/application/views/email/reset_password-txt.php new file mode 100644 index 0000000..83c958c --- /dev/null +++ b/application/views/email/reset_password-txt.php @@ -0,0 +1,17 @@ +Hi 0) { ?> , + +You have changed your password. +Please, keep it in your records so you don't forget it. + 0) { ?> + +Your username: + + +Your email address: + + + +*/ ?> + +Thank you, +The Team \ No newline at end of file diff --git a/application/views/email/welcome-html.php b/application/views/email/welcome-html.php new file mode 100644 index 0000000..a78a12b --- /dev/null +++ b/application/views/email/welcome-html.php @@ -0,0 +1,32 @@ + + +Welcome to <?php echo $site_name; ?>! + +
+ + + + + +
+

Welcome to !

+Thanks for joining . We listed your sign in details below, make sure you keep them safe.
+To open your homepage, please follow this link:
+
+Go to now!
+
+Link doesn't work? Copy the following link to your browser address bar:
+
+
+
+ 0) { ?>Your username:
+Your email address:
+
*/ ?> +
+
+Have fun!
+The Team +
+
+ + \ No newline at end of file diff --git a/application/views/email/welcome-txt.php b/application/views/email/welcome-txt.php new file mode 100644 index 0000000..51949ee --- /dev/null +++ b/application/views/email/welcome-txt.php @@ -0,0 +1,20 @@ +Welcome to , + +Thanks for joining . We listed your sign in details below. Make sure you keep them safe. +Follow this link to login on the site: + + + + 0) { ?> + +Your username: + + +Your email address: + + + +*/ ?> + +Have fun! +The Team \ No newline at end of file diff --git a/application/views/welcome.php b/application/views/welcome.php new file mode 100644 index 0000000..0121fdb --- /dev/null +++ b/application/views/welcome.php @@ -0,0 +1 @@ +Hi, ! You are logged in now. \ No newline at end of file diff --git a/htdocs/captcha/fonts/.htaccess b/htdocs/captcha/fonts/.htaccess new file mode 100644 index 0000000..6224851 --- /dev/null +++ b/htdocs/captcha/fonts/.htaccess @@ -0,0 +1,4 @@ + +order allow,deny +deny from all + \ No newline at end of file diff --git a/htdocs/captcha/fonts/1.ttf b/htdocs/captcha/fonts/1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..07f5e7f0ce67ed33b710c5defbf2596e10660992 GIT binary patch literal 53168 zcmb@v2VfIdx;A{y%xEOpk}X-17W0@q0f6$JNWQvr7tEoTiis~^XCgDfzSRe+` zq8*DQQyi=vOC(NA)s79sF5a&l%fupns2v+gq4*1WMI|#X&HAq%tNmAx)&8r;YX8+^ zwg2j|+JE&}?Z0}=`#-38`I?rd1q<6expVV8bt_uinwEJ+HMcC8y=-1%OQEN{w6wg~ zGhtyFe0wrX}uV_(mj<`tf~vzK{V8s{~&wzV|PS<%+$ zX=?M}8YRswo~6z6n&z)z4J+71J#7mcJ#CFGOItn7^ZAFNqb7QWHZE&ynZ3j_X2qN( zO>;f-NUwKjTY<^dao-IZJm$Ljrixm zIn87~uDl9=XKj7awgzo0@IIH{!Nc3<@o%=_xQWccU)%V%n|LqPew6TDd2p9z^r{J0 zUBmCk#<3#YQxCqekbjq5p#^8NUa~%P|79pfI1!(R;*4edtl1c?hm65>=HRFaJ@b%y z{?5*5<=307jaNUXmEUI`&YZ)0qThE29}gS*cz)mRv3tl6w5WZZjea)a(=t9IjW|}n z--7S0!W>H$m`|abC|emxXstpYR>}@ck2UpJh=fsShr6<;7W>MqQIMVlFE#tzwr8 zl1W!gMi~gOlvIVk64ZOn$8+VSuN)n=^K4IB%j|iLOJ}z%W;^CeE>L_`_jID3je9Zz zoy|AJQoOf-@#;&{edp*~sF;K(DO@?&b5hJ1?3=wX$+z&@x*}zL*H7YyhN!W+V1xzligNZ?2hh%^V^?&XG`NLW13Hv&F~9#aXQuOKfaRjM;25 ziJ~A-3eLIfN!qn#@WQ(P{{PbkX$UDeZItnPN|Nx!Q?iU#f;(;?MBE@h4_<5}lR_S9 zGKI{7QIaT;4U#ArB$*gxnFFH zhA*6bGBj>VFMIVFV(NOK*VLfhYtQl8y&FW*xk11z$j|>WV1wa#+ApWu_T@} zgi@)^7P801TZklEEmFK3C(7nHtGWBe?7p}sZfNTy#l_*9+9GdiV>hj?s0x-Rx}35v z%U^8|+9w6Gb1Euwa>`?mOvw)7LooOc$#>~9HV5OyMM9RLfzQF1PzIj^B2Wo)B1y8r zAYt%E84Dm%gEj;1niBWbqc=nuJ@wgx>{rM-azy#4qeEOozf#iaSGccCh$M;Uao;RD zD)cn<`9j&&EN@17T9P}#Zneaki~@uw70iMtNrtQ}$!ub>6CH^$#l$)tPP;uJ9`j|f zCMLRLV-wlACPDOivka0!mW>{dY?O^AlgS*}LWEiFCE z8y`mv1Pfs{VG2B%33kyS$QkL$Nlt?!E!8b1(%2ZIC<`N5suusUeuzeb;I46+wrwfa&W zto8|Oj}`q|>GM+G-}E}(=fOTF^H0U4ohm$)n0IpE33Jth{m+-Zlz&d>{{XH35IP|XQ>-X-(Q_2ouD+#XmN2j!6%dA z$PpLw5z8*8+fh|n5%32p6Wt(vEWOKD=??@G-FWp^R#aD2R|Z{)Zl6Cud$qTpxT83) z|N5yjr;Xco;_v+*_RZQb_L@oKH=gL~`(WW5@w1qg`6i{s)L84!68B4^#;@HpVxaMv zXRO~2k$#dwL)UH?JIZ+O71Ljbf{YEs0b1UO`G_TMl1c)kn(PS;q`i8DdS_Nu7UZ+v zl%$m86cAWaa&k&iQnFdfERtL~k{B-q)1WBINwS<=Dko&6B-7l~Br!ptL2X|8*VN#@ zt&{yL0Rv!@f`3;~2IeQs5`v^xduTM!yP5;7ze#b7JHZ)wmaHyr_zI#@#yjRQ}LmO7CIB;M^+bBAQ(NYd1 z#8RmOG-ZdB+!pFXgTYXRDYq{>pUQ*y;f9zhBa zxgcInFG!)(qs>=I2_`CHn&PnO;$H6FKzydu-K4Ql4+%!jS5TcVP!uLhWR&H@#Pz3D zfuPfv=r#rzTgBw~18z=NoYjKf=(a_(HoUZ?oL1B?3~fk}PR?@W?W|gKYU@jn#TC+` z$zz*W-&&S)t+;o_@M%@ko0W$0spE=Dl9%}_+geg8XVmq2W83|+odbo6#-(-r?^!dq zUuhpO!0F(b0_V^DLk=oQAp<5&V$zVYWU6nT5|ttAY=IIfa!8WO7Ql>!BS#n$1|ubv z$|`!VVH~j%cICLZP`nglHb_Q^#7JUT+?8M|*=*@oCL}KM%5m(<4qJ6XwM(|!+%CW9 zudJE&+vlJE?X(*DHO>2ohDvT8+u73DI`-xg8u|$L^(iapPQ#dp`x5QGQjAC?eHpK~ zFRZMq?n`Y(!B|;kw_(#e66wy`X}^8ph2KuAg^>C9g7SRv&0~a{h23LrE>@nuz(!m^ zvxKAK9oVmrg{DxaGvrE$lk7HC*2G!kAS)=Z(4}IB(Rx zyN=iY`b7P)yD)YqxnKC5xD`CAF;qY;mXOsT8!TchvCtTZSSp!}7$Fz;G8b*4U^eMg z5IG#qkW~)dO%s;LzFIgO_U{Z=LtA9<^IcB^W}zp!wDs%mV=s@KX#4I9zw zZn8Cw{dr{hib+#rugT4KE~*}h`vnC_m?Rv>7U~yD;JXRh9d5^VQ{-Uzs_FLxcaOX$ z-%Jh+EhzXpKNF63uRnjnJmC>3yj@C1>FRM1&M|C+E00{YVL4L$p+ z!I&Wggi2-kBlI>y17q0G&-`8Ai}S_L!IgbvbSRx>XNPhU>_qY-R<-|-O zkP3!M_;8!=^xbD!w^_zuRGX~W5uAQd*G`U~zzM<*DftF=UuesTV z#`HK%$7jc!;Pp8q`;<+P)7Cl{1WpbZVTjVmq5^XAlIR1RgEcr!+oN3IR! z(ER*RL0lfxKB)EHL<{6dx)hf!#U#rK0a;FfzMQC0ONmM?&}7(X@T19PZCr^YKXP38 zoTXrcyHx6cAZA;hkxXUK>18CuhFX~o^#+usY^o}o-F&pUb=M!Z-}vbB>oy*viPw#p z+%j_yjombJ<}i_5Q;|li<~Ma58MWx*spX5BTc5pHJ8;>yA-(SxJ7%=>!Dj3FSy?N3 zKt%#1)q3b9OhOu{B~~`D^?^trR;vi}BgPDx(%GjV5?MBz2xpJ=Khak-Hj1Fjv70Gq%g2~$B^8pD`vk+BIUSw9r~l{>sykm7b3kUwTDp0k7{r>C zq33JS^Gq@?luJFHkT=d{5(TG2Hh{}ZVwx036;P{X;p8SvBn+oo<39_#$uHH~L?-LCxo!fW?t z1}99Lv*XD*Q)$ao;Z%q6R?dpG&wi}@=l%=EX?^-Vv-5`G12FHk+6^b+&&Kk zLb-{y*ce|HUaV50BxMje!6c_-LI2YYF%XufCWpyN>w5+XMD{(P^_^*W=xVi(>Bc!a zeaSu#Xvz)5GH^Xk zGD!x3sdF525Sih71vl!!%h_(x#sq{sa!fMcCtmP#uT6ZRbH+15edl=b{KZEkCiBuT zpSOa$TX0lPt^pTfx^_vCk4Oc{Qi)yi%2JLf=UU|$mz(eX6`-o>h2zRqiN4< z7i#lbB{EL0GkWY&k!@P2&k)tB>dd#Y@arw3Ms4ZW_nK?gyuWPp)G1?^E*>{^>bS*E z+|d5anlJY6|9th+?Kg;DHLPCUFr}(uk@9`t0gDz5>es(+;lhD6oi{DH?(_$33m>@i zz4z|CziGw$kF+dd^rKua-U;3m5AHN7l*YMJrp=#YlcY?GlnBBB`Q)TTFs1MqIYas{ zcoEfEjy5=h%8NLg)eTVD2boYsA6q-VapIWeD@RQnIgH-EcinUA+jnj{z2-vS>ZL0l zUH8D*+qTo0<+W|ghSt>#Xq{g-5X5ucQy`u-O|vh3^ubrt`gh#D8~h09sze8h?{F(~ zaL7%Ql0smsP~wQ$D8?IIt_TUHan~N;R8l0NBymECz=`Y;$3sR`l-G}_s2o1LvSP%D zii#29*oqPL4@ZCUy9U!C=#Q18ld;ecGBQG$_Bh#)ln6m(P{qTEDPRlH(Ix2mBdgF!#dtw-N((AB-d z-ebkF!I6FnAy8l6`9WCsGY>0*@`pWD)%CSdARPhrv?x?ajmD5k1^R$2%7mJzAj`yH zkToO;s1sCvIc$=Yl!W!Eo~*ljFG$1~IS?Zoh*@w^@azKR5S^vO(x1c^lub(eH-h}Q zAY>w72kzC}VdT$%K%KK~jhqz->$+N3UgpacTxgMrx=!M#9zcZfm>{lYLc`RM(ErAKz?XN` zd^jlP!%U~ppD-Jy&Wn$CUi^k$PuF2S;K36<1dob^zO+14LQ6|SW&VQvB)8R4 zke`|4mL+>UDY8h`6v>}q^Z_JIlYKrhQ-H3WsWU6CGHECPEU_9@$LOhHWRlXzzLm1I zid4d@eHDQUCIIly2+`ona;aLBYHS3-(-J=j=44j{b8>>mkI-gsuhLSX@bNRprq4dS z=lvn2d+7vWN=`Y4TYqpDmL^hZai%9Fm1dNm`}oM><*)A9Hng<1@Gof-84j|e>lJyZ z;Vu#b3~4A?9SYK6!$QOBstWRR(^FG~>Vni1gUe7yq`EjMt5m9umHkFJ$u4IW$)O6l zcc?e5RYzaK_r3}eF(HnB>W0%btnjw0CBq_TU>KVLS`lE72UE&*n270Cz>ESxzm9w` z8Cg{w1dk^gV|R0LX}1xt$DL@0W@fm*-=y@S#DYPcf4}9Eo!9MMIBx?b)5>T@%$8S= zUN~{=( zH$g`*FC`IlB!NF|2SUlTH>+Tc!4{RF0})ua<``Jvc0etjNVgQRJv!1Va(Mg3(6-#_Y%+n?IgD zw@*2GZLbIEzBBX=;lOs9uwD5}=N$U8^4w$09Anf`iI;CNni%3D*<=AM_?(=OKO;?+ zQtVQOC6;NR*}fPeCkj+{#ab%&E!YOlW9^bHI`)hkQKdd;UV@jxZ zXu-SzeLMFl^Q-&MnAW#UjGMpok>4y``ug#ub1)`KvSDlfV3v-!mjcWo6%U%31JO>53IkD!fB zjkhR!Z=KiFNJliETeIo@yMZ+ce8t}2e9TQIhrC=`+rVAzwpb#$6Juj!3s}1g2)NrK zh9#uBO4f66ydB+3ye58E#(LE3Fxo4C$gZFbmD4*NPFp>cSsZJkQ${;96Nm&w2M%fHo zCl(Sw-w{!WN?Qm`vd2WRl&LC@xWypO=v*gAotK48moFF^I+XSfC9R`JzszJh^wgM` zP%P{ey;o*aM6akBJ<`x3X1cR28m4j99eoN-Bqov?VmQCkI^(nJUBT@;l$(xsu0l67 z+WZ-`nNM0mWwf9mRA{r?Xim1zke6j=+b-Xhmy!(gFGChxvc;bR`mu;2&4;`+hWB27 zwNqhygl#|cv4)8xZK{lth_k3{W%aO$o8`x z8;^{de2@|Cw7ol~Pmz`HC~Zj$F5Uprq>ONn-}~j^rj?84X>>b#*Q~+8#LgEnT1E|< zI5o`Cr~$AEoPSV1ICP@YgUQHo6B^4Dlx}JOe*{xu3{qt;Y>@igMcpBW#%;^9&i{RotS`sQ%aZ7%4i;>^mLSfMgly_2A`zXi6#;BH6 zc=|bPjd2kM5CBGZI?yR>clcn@1RGBWhC!fM_b?rBN{s}46C-ILkyEJG&K$W6 z8w;w^wyM(Zqo2}wmku9Yf8&vfW2el$;~6+v0uOxKx~gOMt&@ih*)~Tk#%kt51}5;i z+W~(R!+hbL8dd$F) zfs72LaGP0RYB0zV3;>WkoU~#6T!rn_CGOtzkmZq6sv5|g_k1GMb-E1=m!>d=gV_Rx zE4_n53u%YGV6}$gjF#9Km@-`bHLALTrWoUV3yTHAWX71W`HkR@q6oGG8$OJ{hG&Xz z3Vo9FcdDwR+U^IK6xmHHmsD(q%#>{r>igvAi*!5P{@QWnp<|Ne(vMj1KZ}lwrzK10 zEUowACG_4*7Ke&Czl1kJ>$#{8084=w z(ZlbA#m64)y!9w1^gAgD{mQuXC7V})OLxXWdmzaGk$ntKPEE1OnG%p>c+~$NkYtCB zD{vvmWI5Gg!7$H!9kTnDX_LVW!4k#dt-C)|`Q(SYx6;2sZa2-njW*+*@xw#ljyjiQ zf*kf4DDXWDgz4o|Lq0CY9kS$5b*?xobgnqiqB}M|PPAGmwRSU|9)hSF{kKMudT5lh=S^2WpvGyVja$8l2@ag04a+k z?lR8S65ZfqSBSGf4pz_Tc0n}@GGhZkQFs}J(}B^s>LOx6=Z)M(UrI_Tn6c85L@PGl z-Myq|3n!16!xvOn%!0T4x?#%P;JlUAlwPy`-Rh>06|lKdQ$uNvBsY%{NlA%?v;OL( zPGL)(oCNH*d$qB7dg>jzgPwbybs=aasgd)Ls&4YAD{lmc{N%@t^H;8Gx=CC7<~avw z&ROL<>A}vw4H&uh#^L=sM`{$Xzj;nU=MVH}aHLGgrGH|#6_aV8){>G?Xwbr_sqeznt=o{?8K`L@Se<}Yr2MJemI{MMRa#WkNl+C2B~bj%zDqXc3jzJ^_C-q ztb=*`3i%u}+0P=TnCy>*6aYsclFMn3Z8qwPjbXgiscjyRhrV^NbM%`!$<@-{5q61z zv4&aMZ>LP(v3uI&BU^X9_ukHSu>M24<}Y5-xL2HZ`SgeP96o%{ha$715R4*z%x7g0 z{9bHUBx;1xOyMMyAlHFtVaA{_8R4XWjgCKZ1y0vf85M_(+pwHs^q_5IW0Yxf&;$p9 zyy&B}&*BdrR2Cgo7C{DlPp1oKxGNF;f(~c!pkEepUuX=Mtkhzbn9q%)OfbRC<`_$? zg_z)1;V?M#5@w$pjV5$d(@h|7A%n4`Sku@Txa^qhkLWrUR`2t_duM*oZo)Q3k-0P| z`eLb145recLu&oaKaPF({R98_^@-2!{+ik1;(M2iG5y2DCod0WQrCqUhbRWda4IxO z^$;1U6UbdR78lV=@pe~WBTf=p9m2Mp#AA=k8 zF@}#{W_-9uJVCeYj)p}zpjt3ROcs6APd}r%wD1LG4ZZ1k<=x?5zC!nGRG?2N0#!P% z?Hn)2Yn7G4Z@!=}K==I_qka>kHj~y+IoCC0C>t0R(xSRK~S<{H1`e5!kz^Qu9B^L2vG)batFazPlj$o>~tcyJ624?@m^RCJ^ z&K&hkEJx`fAXf^+wUT<%#kHNIghwymC>-gWW@tEaN$EHxUgr9mvYD>ry_*usQtewa z+l>bJNMUnfGs9!YU|)omboZ!7>?yNj{;O`V$V-48M1qymA_~Or`G}ke{njuQBG*U_j{sdAqPIPwEY|`GupR?3;w?Q! zESRyI31BzyAr5l0MPOEbH^Kv{s;z;lO?8i$M4R}a+ipZ~jNLcz$I+vIyz4GQ!|-2T zAAZcRhV4~xBBuuI6FXmb#y%3MWqD25nz^B-~{c1{B-?gqoa9y>8X6kj* zca(9o;6o{mmi+;`@JPtLH{nmSLMvuI%!-Oor6=2I@VLsMKxU*{q}*a-R)U;Nk*~Q4_8!{m<%YrC!=KW5l4ZYYwE{u)L#v{r*yUO>p&-%Iu1UU8z4!&2k9B zo)ll-CoQ7IS(EQuEtK{0XZ$AX&e22qH>~b_D^a?3kUXTGW;QgmdE^9RLTp+#vjn=n zmmHW=D>%!XP##TB4`tX>6JsU2BqgP$ASPH!PJ%UHlAS5ZVv?IWDJ+8|eFjwXR8<2Q z_ydC=tYRgR^vD@Vk5sYLn9V>rpmye1XOM)wN^rJcGjYm{E$#1o(EbLkP~JWN;<}?p zSBia_=562FxbW@vEx+wh-hJb|^4r@t08;6^9W;@F)jNyTOX9xt|A>Gi1MH3m2Y++Y(#ly=Udyi&!_V@D4){eH{QB^KeJ?VG1I0iW;(%T zi;)ssPP=H690{TX*KM4PSQ+Ys0%8|2)8RNIXfc{T%R(5~TzAiOO4ONVz8qZ*50tx^ zP0Nrsbe;(Qt?#|Hb<2#YldfrhW#!SM>t1?8c@J7bpLe!yeQROk)@_YV9k&bO#nT&Z z#{k}-rRYD`!7o&xsH^XztV$#zK{i&jm!*V&&t&*!SEfs9a%ovnC7rq3No+cy;-TVH-D1pUlwP&fD+0`Mlz!UvHna zY|;F7C5^2N=x4ZLG<>>t^f8-LkZiXYtjKk-#Y@O?kwv>rwjk-kY7ro*EIR+;7Ms>d zz8GPJ#}b8L91$@LB14sZ+j|EBy?f;bdN)&V$6D#{{_3hgZdJ9?b-7B+QDeO5T+AJd z+;0Tp&0{JM*c)eY8{*KrM3-cZL+>1Nf;&;RBoMWK3ElnU+KEOkj9Spya32$*Aw3a& zL`S4X63W+Sx(_&#|iK>0kV`D~#bD3qq6psiV z6cfc{a!|J+5&9knbU&f{mnzTPK*=l0bA65;6`rCM>wkG)nJy$0DXiNV!8*KT<4`1_ zkW-Jr1vlX;PlUb&Ta;5}SiQPhM{$5rL++_wQoa)mv%vw7A&C9&^@g(25)*)U8l(g} z&^gH#pP3=0rbxWL?Dc($Iy$Cqdu`I--@QC-*b%YMswrEQG=#}dS}}E- zk|v(7n|kcn;Tu0v+t^&Oz5NMB^xxat*xuSWYW|0NTMMhaVsEc_>37$+9343FwwtC- z>=4i2aNF)JU$Cux=hVgpb9Z8EYqIWp^e~=e@HpYj%#g>)kQa;O6s1%m+e~s&61535 zRo^taBB&xw+VZB7%*ct&R3|p9OK|22(aeJ{xMYS}A#sIb%e6CRT)XA`o?W~5ysoMh zeN>$S(s?UFJooQ=tFXbzu4^i@!=v zb4yZktdx+3BqFzzl5CP)M2=5QA<0RCONgg5%(~b>)Rjtk@bF{C zKiTm3Cu=8fd+g{@v9A4-$}@b&p%>n+KZ~2iPm#5?0JF%lwo=PVvwfKvX{1^`NHs~t ze#zmL-I5#(Qp9IhN1EEdTh3&!Bwl)44GFq zWN9Vg^I(97- zN;?Xj+ZbOghAp!Rl+(=@3HGU~?r_~l*Leg99i(9=R|H>Vcs;tNGj>xHoyW_q0Oo{% z3a4c%*n{Gxjup4Q)zZ`v8uqKrLu)&(U2*fK_vj_Xu;H4f~|63KLCpbh5{T#q^-(>5B;@d zrf1;EAO8IC#nk?{-cz{{gS@7lTBbkQIZ^m^XZhp~`pj+01&r5;Rd^8NwUPs&kt%=D z(OCw_#+YIE3K~$0alwHL0Ems(iuhHy!2#7;t$@nGkdP+AqWJ-fMJi6(V40$%L$4ee z3V#kK9(G%x(V*B=fg!PMj0h0>`f}$x$^km(y^9k%-lvVL{w$tXj?$@0l9E9uUH1+B z@_sr5d!VaJStI_8(Z#`EUBh#yVoY%{h`r^YIx^?s#^)$HJA`(~G(*+DkHqFUE0XSb z0<(^GYK&D!w)BNk-}P~Xw~HJl56hicUDcm5P&r8DfbXlOKwNp5lKLE7K@(0Z)sw!q ze=Zc;*IX~I=^P`Rywv`GB&-q3idlkDm|?T2erwu|(t;M5Pe8@R!JSy-0*FvWCcAl# zs&z+VlbjVZZmf})7zHfMQ6XA*c&Jfmy!?_dr1NR9rlaF|VSdK}^sF5Dk+&c}GLsAo zB~g||VN7zy7~`c(B1m>?GN@5kw~(V&!>|T+Tm6;m))`kvL(3nCK3q?JV@q7xD)WqmRs5ntsGs)0(m_OZjf}{v znZ_gOOJ~tXh7D#s@fu~@m6@X47skpLh%}rQc15OWw0tn;&!@sML&Gn9q;5YD>cWcUG;;l?d&%OW*_7ppFxnB{n#H6tLm+>s-H?{z zzkAre;p=R^%zJzV)zTy5#`k$;;^fe*{A$wGrN*Ah8mI>wnL7nGBlR-C7?$ z`y4sig&*x~d$@fUd5UZbx3e*+SAUfpC)>j9*N5BB(_&JD_6+4Cj!*iL>7dR+2uNBN zNkuRJ&U-lwo)b0;19&fcwxgHhSucCG8p%2GT*TQ1+*Q5GF7hy0h3@}?t@DdvJlc2O z0S^#)Wj?Ob^*glw&M*Pb3rv#5JYg8- z4^bS*)X1c1X`yt7-6jG^5QSK{1|*n_afxvvf>ZUP7X1;7&x7!}WMD6vKuRWQk@`-W zh9gu$9Dv_&Rv1}{p^BCi_&ohfit7d!@p=nw_dg(YcxYxpNlk5WVePRobX42Qdk?m? z97Ion*NT0mhY>ZG2|d1uGTCL$OgBL{NJ|9}Xdv#y_&5VJg-pb;Sm1J$5|Z3ljIebG z-pIPG<$5zUng3{=PlzJg5O(fN%%l)*F1WjVl`KsM3&Cq{xFFu>p5L#YfBcS--qkl9 z|IJ6s7N0nN$C9iecZn-&KU#Q8vLWS=>Gw+)tKAP{a+ zydj9ul#$(`0kph46qL)d+>V48ffRWi2{u_0@^TF+$p!fV(Jyh+*JU)7$fo=}IAY}7 zK&qIMEoWw0pv>BIwSnacYU5*T#19$SsUyAGkh78U$Q3JRD+Zf5%av%5y;)kcQU$UI z0sSz*nkQ7joI~CSbHgH-g9#EU#F~oDV&*dC?`<1;PpR)+*NgUPGEt` zamX3D4Kbc9XT(!djAAQtT}g2+g6NHMZ-d({nTM2_r9qy2gxu9u2XX^OU)><%0IP9; zWc0<$0}7EtGe8Und+`(!CLF`t5fj4Y9cd9F41Q92FB= zQrc(qmiy*RzB9wQDw}%x1WN06)ZF-ZzfnoOuGu(pnDU6<+6w07p^wq;#p{3#SB2tu z^sJWC-<|)|9n=>shBy+A_H3IuW82o5v$hJi%)D{a^cfr0;||Dm68+G9?PNCcbeUfT zxEb@Ru#i&tPvQ_s0v%n3)eZj&qB$c0K88K1RyJQ4=BLp4B#EZSF#ib)XjcC*eRII@ zW+CmSBV&&=52_J1teD%v{VA6}rPbD^8Q63LN`YanVF+R$lfm!H$xa~7EMqi3Cp$eY z)n(0gSRF2t-=C6`<40zLTgp#OLEIA{)=a6?B*(?d0VwVMlq|U@P(*2|w)NP~11T{V zC}T1z{GYl>#tF9!xyG0Rn=cA?|gu%poO1eZtlKnHV^?U zPL+J%Qbyo4>qC9HkIHGcm<4JPjl=?1A}Wm`BG~1Oj{~i%!TiL<$lru4NTc-Nx0If9oxG&v-q#t`WeP_?nJH@Gv?b8Q<-;auN{WgWgd(TB&1@jkm$5jXdb6j+rf<59YqD5*rs=ajXhqOQ$CoTDd z@(z=5IpPDtVre(`La|yr%nOCYUd&8Fyy!CPW+u~-xH8eb&#%r2iex%D5x%CJL8Zlm z>q<%o(HV7RC4=iqO9xAdrNc%Pm(&d^EgL$lv~$&mmS)}0H(U~k-MN@Fu$?8Aj59X@}dM4DM+vv znTnjmY}OB52%&~oDaj3L&B>0Dor0X^^`z0FJf}#rb^QY41U>4WLGU{rNl{@j28XdD z9a&LjsYbck(Ok?-ec&O}In2k*jAVZf%3x?wqNS+s7LJy#s;1*>$LyMQO_lP;-7_cG z(tC%|g=22qy7R+@b5oukxog|a?=5PMalYtXxoi*h&7bqos%3kX&(_ZpM-(1BanC!- zX9$C@sJQ3u-&5a*_dd|a5n%X&m97*%m;MD$&yB#FShYgLFIdEQUO@<VG|gv2=E2B;zVr+cxsa4q$=o#UW}q28mZBGXqOQ zwG3E{gsZhoXJWz?JCgl&YfZjr)+KYvFfSc1?8Cq+9*72Ei+0||JvZ6H;sGlLXG;GM={@}es28XJvpcsn1B%jsd zkkay`{4!&8ex9+I$i?xp7nz5}y{eIiR3j(3ks2N>DHiGnB~hBzlOthw>HJq$@U;oi z(&WQS-7QJeNJAv|ZBVUMln^SWD1_mws--Z2SfC!(+r`xR3Yg$vSAJAnlX=>FUlbNZ z3rVM5P83j7WC_HgX5jjye@r=+Ee!V`zWn*Lp|obO^7-igLx=Srb^CQ|b}t-x)5(RY zEtdz4JT_sPR zJ7vi)sUK0AfBc#`dlx;Nk(jVzR^5(Sa}FF(zCNF|a^kqAscE-AJ|RAou>f;F5t2Fs zb8iH9%O;ybRg~pdC#5G?jh@UzR~+$JGcz*dOz9*eBhzTiFi1(UQkF@!336&C%nO$j z4(_a;6RlbP+ylZGJ;Fx+4ZF{Zl6#$lodadIglFM{)x-AwCT!;CYF^80I&d;fLJX?2yru@cqrhUVt#ZPVBHcN2ZJN!v;>-StZ zuY8-4(Y*7Im_??2bXQy`fVZlE78Ztz>;bUkctzjU;;Z=}%6(IP$CAIVq5B$~bOYkR1Lf(UJE(InL zd4H|okBC&2Byp~Av~!5qp!jJSG`WAF+Pnxqy8su;b;zAHn?o@&qW#sfx+q_z7C6D* z)zT*{^AmM>QMwh;ds@u5Dx$js;C0ERx$iV}MI`3PKAAZ*Vx~q2D11WU9^3vi%7bvCGP;`&zxZc_5-|527{2ck{+=j4aKrGKM;`Z|1s9(jTD-6Z}K z>l4d+#Ik0Mu*k!i12P^7pp(eI?NL-Xz)UM0Vh(@x(z8ncbLZ%-^dlwz+&S@|ic^XI z4~l|xUn_}8j6SO$?+Ld3DqcSL37aFqWUDa4LckLoY|ad>6r$a=Lj;mAr90;;GS8TmefVaL4o zhWr$4U)BFHhzz4k!|iv5+g~M5(u-(U{T92pt;}$BcnauWu@-oigv>Gq?4$rb&c2*8 zxdSQrdAWg<*2c0kpTlatJHT0y>?mzyIZhtZ=kW-SX} z7ybI~hE5hn{W#~+$l4QyYf(-2=6Vg!U(~ISo~ioqDtZO$?paf(UwhlG8Iz{Yq;mzi z^CAq94|l!r&aN%ncYpBsF0r6w{J-+Gfqa`Gj3PMz3)@s z|GDS>T_f&MDM5Y*5=w&izMNz142daADlbcR*d$_>ax#qt1x5$TROcmH<@9nSsgj~R z!HXhZIl5p9n_gVQ<^oFFPhtHtCmPfO5Yx!54ju&ovE-*26!Kk-H4ZTRQ;%SQkas7h zQ#pR(lTVFRj9Vs-9Xp|Y%jwf}O8n7ZJwNk-zROn~_{(kEmCn~UZ``oy&5L`t|Lyh7 z8-yii&YYPwy?yI7Gtabdc}BTw?SU85?wmaR(@%Hrc;oGxc3-%#XU7{*kPtIOe-`V6 z1DKK8kX?-)g#C>_uvc}Q;a#cohp1*a7APp%FaK3IaFks)nf}GFPuTara@}OZ`imQd zeaD$}^@&G>X^4HbVJ}>Z*jJ`kr1-KtnM_mlWo4!$S}ig02GL}&I|%bBhqG-oV_#=@ zIwYo}8&DV{nXX!}1u-;Gy%Mo5a34cg$Z@i;8Z@B=)xU#Ph!VfOXz;T< zq?=0X4$Vy)mra49o6=|>@yMv+dC$f8`g%)Yv6YT$UAnZPY~HgmGg9+oVyK;ELgb3~ z3zH3_;0LKhE=?}2stQ$SmK6DO+=&Uc7;{l!u0JQqooKTlkSl1&^cmCOfYxJr!J#yJ zLLZr~EU?eo*0YeR$iY={g@HqSGB7O{CpHao4^~3gWF;_I>ahN|YHc@GRJ~YUKWgke zF-{WJBR*D6=}qOFEIKSWvc6${3`#Z3u^~G$rPmO{sF7v!XI&d>ECJMOHU)D9n{Sj@ z?DGr_HqE%!V$Y}Xve_Ic5ru@DAyorFF*flC&BZJ@3G*{EoCNi1;_>T1T2aJ8ss(H# z8H*SN%y8&S$I5SGBwQidR5awkEGx<)&q%C{Phu-G=d3v)o~Fjd#%2b+3F*N$M!RX^ zGFoBCL{A1HqL%dp1v(t@F=hhv%%TUkqFz_nj?<<&K3Yc@P|T+jW?U7Y>1u!P{6JxF zWW$)n)Go|UoG$&QAlo-0IPY3I&l(@Jnqz!r138uwC;nY*F@36!EIAd-I-*Wp zY6|$X=+b3Y2`Ys%lV9V;j0p67n-tAS79pV`Yt}I~Oq(FB>RC}Z{ax8DUb<`$erAG- z6@`1FV&q76K+kr-%iE=_6Mse&x}Rx=kUP7`cjN}v4AJ|(ybA3#Mzwt}{UcC>zo306 z$Hw#;yg>iJF(NbO0ER_qkXk-13l3sNzBcXA_z|lIl^`5^s&k$i%?#9(e1lAi_b{8e ze#e^EwR%;wj?N7(E z49rrJDESf0D$AK!X-+FZS6v){QR*PG4o-Ey>xphEP{kEKzBcS7yi4;UcWItx7KUAz zIn~VOgWck0c8k$%*_@#4|rn(9^$E-TCNtR6gmLF2^1tJry~22YzcZxUAJ&j6ra7QclK$s|I! zsvkTL64f4A0n%sP?p^`pK}YtS7wV&`sz_gcb>J4JDvE;gKV*Zpl_*++AwlSfhgCM_+sUFc6O?bW+FDYSSJjoCvf9KLkhSV z0=$H2O3drTn$`IX(?T(+jT~#ON()dN+zDl+q6}j;=n60=1>gWE5Kt(96S3HufKXQI zxY}P|E$rhCdlbmZ%Y>)ilJZ=tH85bD+p`vKe0QSS%Ki86Nrr?tWs#B*mvB5m^1@-C zyFZX)jG@O9;^>$3j<|#q4j9mPUj{K^p{ zDuW|YubZTGji$ZGC3t54_bQv8DQ_4yq9ti@eB+o)_2q4-Y(BLh*SVxpG( zsy|n%9feUOGmVhGEJCW9KXM~j*^e5km~_^kkf2NF%2MX@r5~fH=%_|B%AX0Q*>-<= zDwT#Q`>ANj9$8*LdhA>#v{#Ad14;0aGA1FVCNwn`f4KyQQL`k}oL5i&Fn|si8_H`LZQN_B-WLSq_YlJ*BiJH$VsG z`9+UF8?-H>KBa>v1~5?;=BpfP#K#_nGuH*eJEwt+iQGA3uH>Qyo>9rN`?%t*d-|Y+ z=TM)S&plvQrsZ)bsCL}rK^|4&b%g^46c!Gu6Y>h`ywp=tIB4*tL8bjzM9C1rskEG? zw<5Uq{`*^39=uQSwjAkbZ98>(eu#ri`&etTbQ>%n_gt~g*k)Y5wJU~B7r>}en2u#~X<_ZYaCY8N6li!MYvi<6om zpGCVG=XQ=X(zfvV&xg<7N!QSp@cB$WtLN_`GwC1E4mb5i8h)OCr+%Q2X1kbDN` zv!@dxf~@Ncx&(6mE3}W0pANU5>w2CpL;Ii5UMjB*x9{qDh5iNYFQVNQasHsLL+pIb zetiVzt8sTbX$5Tzx3h7n?dQnzd|ax%%lfId4^>qA7JkL|;aJOtJQ`mu>)}2=`NbnTGO9CGum@TS}@CqJq93r;b2#^i8 z?v5D!zvk6PEjki(_yRC#EP}myvbP z0O_7_6MCN;PA!vaK`78mq+^1@wZ$H}{p#p7m4OLb_4faTY6ytO>tLoTDidOa0VzZH z#83{8WexNlRvA%5xi*w`M?k)oKY)G7ho!HjF-rI|fO{6ziilgfp}k@2=8rzy+&)@* zdD+azAD_7lgpMa@{zwn-b#;&-z$)4EQetH(7QxSO|4MRP94b@THU7t4D;xpV?`eN>pS^qc>o;QIf{{ZPERZhr!q1AiBSy?=96EG9>qVUM1ib-X9|DB1 z4t5r+;~EPi%YdpF1}n=y(H~0&XO%jak!s%64~=mf@t6?yTqtHA`@Z^B-oSyI9=Dg# z>tETQn_>xVOi8D;ZQF6@Drud#!SE3Ddm|YDyNXvCf{~1=1|=KAE`N{_d`g^#!iyNC z3^UyR{Sm)g^%2ci#{EkT0C@Wg<(;wk#oa0}&W^%f`GtR1e3az87|8M%5@56+8__T{~y)G2r_Sm z=zE9n-j5$QH0(%jQQl+w7sk=^=uI4=59)bVgB;5OMZh#c0O|W`U zyq9;6?qLZzLA~Z9vAjF0|$o+@Ik|~M1&hKG7EI|A-oEbh=>Xrqa~nd zm4b9G8Cg7tS1DGQ)zL zq3U`@jxlOA7JD$66~*a$?AS47oA6nuPkfX;GFa%k4^$U}yT&78c1@_7vWQtHB4g9j z04=kyBsh{KIQqmCLQjtxJrvW15C7#I1cxGFsP3-owauQQ})J-(kxG;!uGCX7LO~XKpu8iCg3h@ZqHXn z#1s=AO_!LMR9tE*Ewh!C*(`91GVCBfL3WtrETETq7aca>&UYrJI1q(a#26R@^iM1A7){6h>iQ9*r#0L- zbbsB$5A=Ox$n%Zb*mRm0R0pg$DE+w0cF~a{5cbu??xC z?izo~v%5Zfa7FXdwuhfwvAF+(O-Tdq0;Q^TtvIFDa7x`twlhlAa3V(6)3x?5@Gg*m z@}$%#J78mE!9UTTKf}_JVNXkSiVllCB{@-aS=^$8T4(Nz^aRn4kRe%ypCaDPvW#VC zdKwE)#xw0u;YN!XS9KCKCPp$t*9hNd-fwY5_l1oM9N*opd>t#NK~uY z!W1LI=B;O*YTtV5q|l^%_ttYaELT>v(Kfnc`TFNyfq?QnxwZYNC%0{Tf;PORe6dxT zee$H?(#ey`>~`fljJZU)AT5!BhQL#{9#!YFP}{_kZg;W)!xfWkNK*%#o~92tvwOhF zQAevn3LJ^*Ian5Uu5sYxXvI(d{a8^4iVt>JwW5c z3~>+Sz#XB%svKbTzF?li;|Wwmm2oUvFNVoo6p%ABZJOmJqQW8a5|OuvxI2`?lVyuw z(klz=k7Eeu9%?cTK?iznqP8m|*`zs2K?mxFWCK_SNl+S~$uGXW;_Vk!JpcNN*IpDi zz4*?`x1V3}!ugf2zsPvIYRUWtJ0qX(jMvGH^jB!-wO9-_Xdi)gnY=zX2CbROVP2aO za)Y1!2HoHFXS93K&N8qeH?;Qgyq#VB2l+X)`+56Lx`1AX^LZsBE@y^l?XV!xuAcuw z`24qtnYLbaJ|qpk#n4Ws`*-!?&9>^v+GXwQV z?Q%+9ivAP~_8bUR2b+g8e$~l;K{f2{2ZeEk}*r`)bq~5Ug!TmHg zQ~c@uaShiUJ#(~e%8dRs(+@6g*}dsmd^~wW`ycjUcUZc*qyj@d5Sulj3jV~Nw47{H zUQTuj@njm(;_!e50l_yGM4SesG+B0JdE&)5+2V9$W<(TZWsY!_V=|)zaHU?Gg$b?Rm|!M^crQN82{v)fi)nVx=Y{E4zX?HsfEjbvvtXmACzq!)Kt-X z#m9^%#3-kPOhl$6;mIFWJU$VHq71PKcBmKzA&D4lh(%OOvEx|?qKId0B0$k1qxvvv zkD}I?4ngx_>kH4dLKcOpO+|!le|7aPH>*O!>MXIM30Qa@Z0M8=Xv`D!^^b1MU73^i z#1oI*n0w@Au~$d^#>bBJE?CuZ`L!F7j7EXulwk)e*h`fmE8k0IGahQAJ2N@{u5S=A z+6LkH6~_r>A^ncmU)y*4d+*V*clPaj_r2Tico%y(9r4m4-}5SVbe4%1 zo}o3u)vMa8~`8KkwlX25vS6q+tZR8u?o~=9%uKB3O1p~+?9geeE-sG?7 z0vu(4+nz;KiJE80{(c>NDD3aUyMAWZg=+IBKGTSbL;KrZH*oICvQFQVAIA4EVzr&l zVdpDP@G2gD7Db2lH}E`9#*Kr@uX*Kc{roqmh&WvJ`dty%-%0L?xIRPa)a&mg?=qB5 z&40v7YT1(1fjm;3+y5;0MmtB*(0-D0d#b#^V}1Ro=)wC#7ZEeABP(Zx<*04pCzG{) z{(#IDkrZ;N#Oh}yBF3f(5pXQVCN?v}3xz+~-Cfx?EfuwbWSh?xrMxf4KU54Y>>P=} zl$=pwaH5y`rO;Sr~BevE0`Jm0yyg&SWPRsm!wBHzU{crX2$$2Q^`@`42 zA$6H%U; zbRvRSqC7$A{zz)U9E`+{*Xx*8z%R54yJFzL&>&B34XT;;udV4_UD>0iY41M0Wun$K z9dKn~Q@$m*h}ATWD_m!qo{>uiMrv3CnTEye{r_>1(;jp2KPh>t{4Qda{-^a%FMk&~ zhoC@J*Je9N)y>b5XZa4gQaAtqsyp)ltBNb(pSth9ed(1|z!nrxQRr?~S!8JtQBV;? zktoR82o17`K~U6=ia`W|Q8VfgKXHs2qmCM5j4@8c7!i%*f=zCNb& zbfrD=Tii+wUwoCf(89zv-2I%*^TlV}$GCrh`;~Fs-TvG>?cJX*zHPhPS%?wzO$;f8 zcQwUt8~!Zr1Fc0o$2R?ht9eG>9gImalcV1)9($E6ia!K)J=Nt&8`(O+sNCZQ+Q?SC zZ9}lk+@~(nRQD8rVeU$OFLP%!3->LN`$q6@HTN^TyBu%fNtdxOoyqZIVOv~iGdX@N zY&`Bd7N#>le<}Xa(@FSy%i*hBWBh*HefX2g;j7qUFxrQY*BO3}uvI$U6vJe zNAC28=Zgvbg6n7W?1St21vk3*+jwjII^0j`r1`1{ zM}^yP*YICRXg_E(f%JC^te>_1-MBtk@!;-d1|MGe?q?2PkX}}6Exgfh;mOy{M!yfQ zGLH{m<+{cnAzdGS4DLRBm0KK+<83>n?c335S~=#OuNphtb?-j*2Ch(DStz-lTKUj@9}Y6ERBf-RSKb^)MOf-m!=2Zr^Yn zcE%m_!tHSKmbxhjy5L#QrpH1@cBPR5Z z9Y##FAJh>OT5ePWeR!>bK0GzeYM>us(HiK(SGghKIPiN(T|>VapHL3Hch=2i+IQjV=dEAxy+x#xV zus-pRBlp^N+JdrwXr0~Rmm?<=NdKkn#(2`)(}^}f%4p?Hh+b)Vw?P1=4xc}}+aviWCF zOAo$l{K;e5mi0_1ZOd`rmTiOJfoG7>pnc;mpF^fC`p~n;tVR2=T&w)nwEgpe4O$M< zpgW#RcHj(O`INFpJJjUe(TQaTOl=|ob=TR(NF#4Ga~`YMAEI*}UAlJRw9zh|YS4YF z3VJ(g=RNX>?(VP}dVLqggmctOm6~(==xy#WlN}v5&3I+KH3x_`2deIUyhElAQseud z<2y7+t)*?dSk<`zKKmB)qT5k?4}SUO4 zp6J1cR}>vdewJ+;Uy3qr8{?KiXlf;2@P=T3E!jme*8h}?R@JxAwasry*rZA>$altbPGS#t+F?3|F*~NY`VUj zRHS%xbU?#1nqc~k`^q%$E-a={dT`g1;QFfUqv7Qfb8l(8*Zr%xtE82X7w7(7Lqlb+ z__gKG70hPeg!@L?`o;0JxNB(S2-hdPq8z>*I|r@>s;f%F>wf=I_$oIz2yky~yT?vj zEA><_x*5fPS3FRu`g%*!?2B%pQdvZ%H67hisUe-}SW&>ZODgsmdZtuk#EoN5u^uMV zsWzKo`*eb_XRrB#3Azw1Lrf3EgOCrlT$ZIC=%%IK-V*fZ6B=nwFK=1xWEdE29|4XehuXt*G_LBXZcb;8qD{ws1iO*7o53GAuQS}eV1b_3c){#2 zV0BnqYw+;4ZQFML^*4HOW7u_f*STFa-($%4+wtw?@~9|QhhL+dtnapRwZ0qqY)jjP zxF;x-f$d{7l+!bx{TMvU!SkYpH@Oh^-ff);j~p59G51sc1V3F(pnbk$7Wpxzil?$7 z{&L#6u86P5p(fi7s9}u&x-DxZUJ(x~*xQ{+=W}6&ZYE+Noka!=th&;q3L4VwOiKzc zlEElJzf^#Y`v*>>9IBuo-q@KDb2}c7<7ygfSl8dLPq4akYww}1%V#_9eJoh^53wcZ zJYU%DYIk*??&Z4b{FInrHy z;*oB5(7CQv+c6SHd_nw6)CezeRD?akt+*p`gujoyhP%oqw9MEyf_HHDUmW_ysq+XZ8sNnt2o(ezR{nz_RU(FQtNJ-giyjoI zp~tAGD&NuJ?&_yB?`%j>r)qaJvX6vq;Zs;BJv#qX6(6d6%#X z9@r~#)FP4Igz3Fc5{?=>WJ5yj5h-xgz!bfqfzkdqf(+GZ_4X9~BuwSquU9(7Qy2H34)@!=Dxz zu}S14dbp9$I}#d3%?8NpXlNdT|H-W)V|xMM90%@kZ-|U1o$)Jy>w#Us69Bl!|3+kj z09^s-nlK5t03huNTY-B3a84k<6W~cx2y_Pq0h58bz-7QTfUr%3Z6dv<4@D+IJpJ@w4Z6vct)+rnWS|Van5>QWIAb| z{eZ}fts>`SL}r0|)<+`et^s}~avtS7n>e#6tMktVRs!HTf0xJ{;(g&!kqdIb0+9=c zi_9GZ{77WpnIabn&=nX2+$l1DkH~@nzz%@AvH)5aek!tP4zO2b@lQpX!QTx2X7D#Z z0lWhIMr0|tmV#?3xRy=^<^q=i+kkt4XMp`87f%9S6Ipfv@VLnGUclWVE!ZtvL{^Z$ z6+1;%wuoFZ95@qL1Y7~&zKSwfMS5#0f&Rc)k+p+GE+zh@@NV6BfHGaT61X1N1v~+~ z0uXOq+y5C{22Eci-NV898$|wZ;PNRV|06s=7=<4Kl=}wqxPh|UZ~;I*H&7oo+yguf zyaD`4WMgN5db5#m8wt0Oa2pA?k#HLcw~=rgKcrhq0Pl)i`D5Uh06gAAo7!|7K>2N= z{5Guu$ls>BfG2@hf%iqO`isalqktK}GN2W>9e5Pj3xM|;@U?=k6@0DWYXx5`_*%i& z3cgnGwSun|d|wKH?mz=D1-J-U59|Q$1D*xm20j+KHUsnqP6DQjTsKJMdh&WbdA)uO zum!jqcnWw8_&{Vc_&0-pGhsJR2B?>tF9Ws#_X3p5X3AwV<#Ge%aziiRQ;{#@_GR2| z>;Vi0P6rkM8-Sg_1HcafXuA>GwnE!hXxj>HTcK_1Qs8Qln=S&@13Q5GfM)^XY`aTj zJ2Y>H=IzkD9h$el3cN3}BLKPs(7XehcaXmwEx=ZQusa?V`AUxvh6pAgbp>~`oD+OY z&JJ&2^Wc)^Yh?~9r-r!y&0gC6ay)OJTHFQ%zhW=&-O?DWD}ECDtMqkG zOI>)P3=EGU-tOX`nT@Uwdr3{$AeG^<(u1=oYTP$v5^;`W{&r|=AaNg;b7P}~GvnmT z;qBo;WxQf*`S0B{5ThOo`P>b-0y$E6hbt+cV&~6C4}J%U0-LD+>+> zvG<^HB`@I);C@y74|enaGI=lU*x4G;Z?i!~?&T zV`OvRBUqzQ{1xy%@T`@umT{?^wX6a681?K`_yAvG%UMl3Q2GURGRA!%h1lCN6nk(u zKwgetiGPk!@N1-R>@DgF^-6i`rpn0hyTx7PeQ4M}qW>f57soGli%i4)POGO{r?lQs zSG2xUKD|nIDr%F5v(>F5#9l6b81^cDJ)Co(yM_txmR!fMpZ7l4C7DuK?H5Y-9c}XQ zG@7i$_({7#uhnU^>#^2;wGC-I?r2AOwDv(8J=nIg@a@=H+tIeG?Wa^mCA;K)sNK`r zuhuVZ$E7mW{(&|cTwQ!M*i-xf+(B>wJ4vIyB)FX;7wAh^`M^-uvWLux9{nm)$%J9VE@8Z?PF+L6Yti{FU@icYu zE7arlG9dm6P!AuXyhFpg!QA5hGL7wd=oxSlLj0uSd&>LR9egM87E)8Z-M;PoLx+EN zD-Udg60{fcHO1I1RV^(U)-dI4mb^kLrAn&N3s`GwL%Og!s~cyT9U(pVD(%InX`Ri3 z^x^wXN1OXG{(mfEj>j{;d;+6d138Dip0pcfFkf*)S&cGWM#xDr652+~7&%$SGWR?l zF}{fvLX*(oJ6TR;H2*ZTe@$id>kK&)z2Vd4Y?;BznsXSb+jVV3X$xlrcH zJcQu+vOpHfB3Ud;q!~f>V!kJrON*?Km2!!!lGUE4U%n|1 zqCfp1c~~A{e)my%Oddy@_!IJ^d{>@guJCF3zC0s8kZ0weX_F#jB~;Q5%#ChQ$fqkfOHas0n2&Yj&?UM1z1+$F zALS1`YxhzzoAt(}UB+cy&T(RZW6zkYa@DTJpD z^mct58a_BpxgVPSk9Eg6v}w5$+=F7J9FBm%4TCGWJrg zXGPcsx6xhUu5_E+RqkqcjpK}7cdfh5UGFx#8_;OG#og$(x|`fKw>`PGrFqbxaf4Ee zmwj>Nl7{->>d-J~+=POhRDBRaOq}f>1J5zW_W!5l7^uT z_TLyeHkKkbmR(918i$m^lu$L6P&E!Od5uV{nm=#Vik8H5vph9JhDG+!#HxAo*RENZ zm~K{b#qxRc37kA5vNf~yLmPbPp^eFzD;BS4S$J`Bt+x|r``D|^%AP&HdDZ;2%NH$M zcv*IJ`+Z{On&xE-7ADr3m7H0^?d|x?Rn0An<7@RlIWF>>7un;Y^yYaxJE0wGc7FSP zVw$I;#apNP^qPHor$)G%Bir)SI4C=%J$`m+`+eeck7Sv*W_xSBS-u>GjgRaJ*;(!J zvg{<(ij%`4y#X`;eA(h@EsEQ z4yjK}^C`A?YlgShcs+8E`$ zF{;Up5lK;|321)rpTTc*^|886vb_-kDjC4H8n=hgX80ttz0tCo*GB^ z(2c_Pwj#h&TA-&^S9R0X=#MW>J_xyOGMT5cqH0N05 z3l)`B)ir2J>B0`DBYO1gb!6R9z55(}OkXzrA9wtK6HXjBsJ@|bFhkqJN1QZr)aWrM zj~zFDLes=ar%XO|3TlF;opI(_)6bqU^PE}do;UmaIbXQo!nyN|r2qEsmewylu>JLG zZ@fXicB^cbYxrK@!VC6Ak-sC}SMPY@@jEY?zjeWr3%~uHr@#Bu_ug3agYQ4{_lw`T z>4(q$(~|vf%hKkHmoIDCx#E(Qt5&aFbLqM_FI)e`%QtSg_vS0F*mTuf|H5h(3Bw%! z*^so)2CK_6P68cE-LDd#YEuuClJSu6tdty54nt>ju@G zRM%AZz)`)A>f1ZfySjI`k91B;q>eZJ{p?X60gi9Emx4Wp^#QrZ#3xb-4fURL((Gy8{XA zaby~m3AZ8@K8alTZTSw;n3u}lKuY|9NoIeKwD^wPglwh~+7hI%w_Og|u^H)cIr3wR z>_mRN1PM~*$F)e1DnGu71i2m=@^a+I4akBwBST(cQsi4mZr?EJM&%VG9F^Wo%0YHf zDbC~(bnsdS}sT_l;weI;2< zrC1a;9wINf9mu`=BDwb^B;dX7X15cak6(4S$Zbg1J4~iLNS@@YLuKuI$4u_N9|`u$#J-I>@rX&`+UDrbDqCYe=yg|Ck}xJ;JwxSuSu`9BT2pkE=lPm{^SI!iLlVNb_*7vCaH zxXd*7nKFeiGw~nJ|McQE{%1nLIeg8G<7-9Zo`?H0e78&|?)kWEQgX?qxZBelMZ;>i zSUhB3eGr5pb6F^f!Hj^l{8723jDQ8QOvnY#?j56E(YGN+t128CIoE#eIa3bGrW z_=+RRtv>2qnK$YLLM@$?1~%R#H3p?=an)6g#!YA?P+NV-4rrk>$(qSf3q77pQ&H4M zaiufyl$N_bD+~2LfDcv$5T3Nk!x4g>H=2ZAnb58b1|PK&`d2ow4E|~u zBcNhXK{CZ1vi1xewNZZM4tduXG6QP z7#!8IKfN&%X7N|UGFnUAVrscX6njh^{z0RSSevP_GUW?K8@)w}B6f&DVNrk7A*~fi zV_GRtCzUa586|{;XMY~N$>lt6l9ai1H1HkBza8it;9E z^ArUOlEI@9OK9j7m2nWx5iFoo-mvRf&y&}X$wV%+D~G{HE&J0OGhq&YHM%O2j@cWn zv0UJwv<|r-7eh{cd6QiWqS=lv!=exVMuW#R&uOqiD{=KHg+-~V(q_vKrIAX)n|wa0 z9V|(gc%z3o7y`vdA;O!S-fCu5fe|Poqa_D#aOQ@URvJ7JV<$GJ4XB&>!!8_@quv;u zII3%8s6D9IrjJ3p3S1$24rMl)qTj*cMMjh|x11 zxYfs03U%Se8>*^4!ffSDRs$<@LEs^Clk8X?dpeEC*9^ z6<5BH%xat9xx|}TJP#htNf;WI6!`E&BU6%WgHn0Jp~-q$j)qJn3vs&&7<|;SKfN&% zFW|3+@o0GCv65m+FL02#LoTWk1ZWG;Tx7_u1<`Crm!Z)Ie`CDSJZHfQPn9=3(O+<4 za7wkETYe}F*2A$CH&hAKiV5WdZ zYZ-#f*`fP1p?-Lc81rzN( z8XCNI*3^$Ioi23qm)4q$HzCuhN;KGVsli7r`_mgU@ye1fM>U}=${X^m7luOYaH$KZ zsrOWlh&Sk2@Xn}_EM4kg4|YS4EIwIiLUm!kI4Dz#YXFF39~!ZD!O7<|;SKfN)NsK#FnyveW{+8gq$7e>|1v|s8%j!8aF??jEj zR`866r0iu>U5@%)S9Kd!Br8dFBURLt*TB}XlJHGQ?HaaVX`_4CH6^dSh7?qWgOL;BSfG) zriiJ@MyH0YN!nF|!CS4Y{*_Il27fioO2ZqE6{Ud28_1*(54y+*^_ITbii_NmU4l^X zBo|%fD25N-(D5o|74%Xx7TTniK#s!7WwQkuj(vJ%vK&dus_EKV;|&>N!??a#l{fl{ zY^r0L8fZ#Cx=F*@rlgq*d<4smm;P5U!-}p>a-cTs;E8-1r$!t1`L_m$K613Vp zVvtne4KJ2lB3T7nGx?evyupv-+OpL(nM&mifwhO{RR(Wr4&e>`79B!7Q{bHnZ>WPz z7HHe?kIn`ABiYBGXSz7lW9vtAf#vLed)D+^uZ*my%j*LuSq5Av<4 zRkU+aV`>z$L1MfiNTt3>jW-&D{vu0_uV5#D@`eb>yz-_~r>rPLa%JA|VV$9v$pOam zrba)?v_njiPDPG$`xLTTa)=sPc%x2n&Yy)hl^U4BCNZ3mjnO+rMoPx+lsDc%6G8q& zbmrZhPtqV@WuX?{C<%(IrZ!Vm;tlnRjt!z}HOJORcr;WY#7=mVE$~9jW;t6ho28fW zloGa6%C1fryw%F-U)dx(;jf0Z95mX9+6?bZE;2w(KIkGNyyF1G=3Wk}TuwR6g@&KMe$T6z5|n`CGF)nqy7DHVrWy`qLf8q{P(L_YP>%;z!4ujDs~-m8MDaj_2(Sq5=h2pf~}|4-ry@94lYD zbji_fcoAnRI`W2cC>0`7K_~rShQI9k%x5bpFCIy&3dDSc=k(wOkaPMe8rtI38klC8 zgEugYUPvRWqZzwn&?)*XSE~6o;9C;8slb`4T1_iD=hJbBR^H@0b4(c;m4m_Glg8 z0p5_A11>V+d6UXQYmSp&NlXj2isYip&}cM&<9S1=Rntq+k@40c3g@sT_23Hj$-^5> zET2Lp3A;YJ<`C%PsRBI|-){{1GU&n9RIT4y^eQ!HI4f9rQ^==sg=|%!04BXSwU#$T z0#vAmEpRez-tz`OIw=w(8RZQTh^sg-MkkWlfxO{cGFx3;q1AvUR@u3b(W;xPCTiy{ zxf*?!5ZAgtnsz+ZrI4k2*LH(5U-QZv8dWZlujGXo@kVxcuxM3}giLygKw z#v6UApa3fKtzEsQdG+!Y z%s!i8$5e3`iYl6Bo;`gKE6vU5ESS6PwyC$QNL^Sl>W|XRFY9{ptLs@UDx!9AOxyIt zFA~4jG%)4=#P{1SmWGrR#}vCHei6A_5DRvzy0B*OOx6jW&J3GoZ!D_?h57Pnx;Ejz E0KB(SKL7v# literal 0 HcmV?d00001 diff --git a/htdocs/captcha/fonts/2.ttf b/htdocs/captcha/fonts/2.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a21de644dc90d233d92374312769a0065d805616 GIT binary patch literal 42624 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 Bkp2Jw literal 0 HcmV?d00001 diff --git a/htdocs/captcha/fonts/3.ttf b/htdocs/captcha/fonts/3.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c9b5f0c2c52b9a785be78e01055a8abe5ecd0243 GIT binary patch literal 62524 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

D_Hf_0S6Z-&k(}!RYu~@xGz=}a@6r( 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 literal 0 HcmV?d00001 diff --git a/htdocs/captcha/fonts/5.ttf b/htdocs/captcha/fonts/5.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c3cea1deb86440e98eafc1fd477fd426984fcfc3 GIT binary patch literal 376200 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�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 Ab6{*uMIhm|2&t+Z%|>Lh5H^<~PUI;&#lf&^x_ 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