load->library(array('querystring')); if ( ! function_exists('password_hash')) { $this->load->helper('password'); } } /** * 이메일 인증 함수입니다. */ public function confirmemail() { $view = array(); $view['view'] = array(); if ( ! $this->input->get('code')) { show_404(); } if ( ! $this->input->get('user')) { show_404(); } if ($this->userlib->is_user()) { redirect(); } if ( ! $this->configlib->item('use_register_email_auth')) { alert('이 웹사이트는 이메일 인증 기능을 사용하고 있지 않습니다'); } $where = array( 'uae_key' => $this->input->get('code'), ); $result = $this->User_auth_email_model->get_one('', '', $where); if ( ! element('uae_id', $result)) { $view['view']['message'] = '잘못된 접근입니다'; } elseif ( ! (element('uae_type', $result) === '1' OR element('uae_type', $result) === '2')) { $view['view']['message'] = '잘못된 접근입니다'; } elseif ( ! empty($result['uae_use_datetime']) && element('uae_use_datetime', $result) !== '0000-00-00 00:00:00') { $view['view']['message'] = '회원님은 이미 인증을 받으셨습니다'; } elseif (strtotime(element('uae_generate_datetime', $result)) < ctimestamp()- 86400) { $view['view']['message'] = '24 시간 이내에 인증을 받으셔야 합니다'; } elseif (element('uae_expired', $result)) { $view['view']['message'] = '잘못된 접근입니다'; } else { $select = 'user_id, user_email, user_denied, user_email_cert'; $dbuser = $this->User_model->get_by_id(element('user_id', $result), $select); if ( ! element('user_id', $dbuser)) { $view['view']['message'] = '잘못된 접근입니다'; } elseif (element('user_id', $dbuser) !== $this->input->get('user')) { $view['view']['message'] = '잘못된 접근입니다'; } elseif (element('user_denied', $dbuser)) { $view['view']['message'] = '접근이 금지된 아이디입니다'; } elseif (element('user_email_cert', $dbuser)) { $view['view']['message'] = '회원님은 이미 인증을 받으셨습니다'; } else { $updatedata = array( 'user_email_cert' => 1, ); $this->User_model->update(element('user_id', $result), $updatedata); $metadata = array( 'meta_email_cert_datetime' => cdate('Y-m-d H:i:s'), ); $this->load->model('User_meta_model'); $this->User_meta_model->save(element('user_id', $result), $metadata); $updateemail = array( 'uae_use_datetime' => cdate('Y-m-d H:i:s'), 'uae_expired' => 1 ); $view['view']['message'] = '이메일 인증이 완료되었습니다.
감사합니다'; $this->User_auth_email_model->update(element('uae_id', $result), $updateemail); $this->session->set_userdata('user_id', element('user_id', $dbuser)); } } /** * 레이아웃을 정의합니다 */ $layoutconfig = array( 'path' => 'findaccount', 'layout' => 'layout', 'skin' => 'verifyemail', ); $view['layout'] = $this->layoutlib->front($layoutconfig, $this->configlib->get_device_view_type()); $this->data = $view; $this->layout = element('layout_skin_file', element('layout', $view)); $this->view = element('view_skin_file', element('layout', $view)); } /** * 패스워드 리셋위한 함수입니다. */ public function resetpassword() { $view = array(); $view['view'] = array(); if ( ! $this->input->get('code')) { show_404(); } if ( ! $this->input->get('user')) { show_404(); } if ($this->userlib->is_user()) { redirect(); } $this->load->library(array('form_validation')); $password_length = $this->configlib->item('password_length'); $view['view']['password_length'] = $password_length; $where = array( 'uae_key' => $this->input->get('code'), ); $result = $this->User_auth_email_model->get_one('', '', $where); $view['view']['error_message'] = ''; $view['view']['successs_message'] = ''; if ( ! element('uae_id', $result)) { $view['view']['error_message'] = '잘못된 접근입니다'; } elseif ( ! empty($result['uae_use_datetime']) && element('uae_use_datetime', $result) !== '0000-00-00 00:00:00') { $view['view']['error_message'] = '회원님은 이미 패스워드 변경을 하셨습니다'; } elseif (strtotime(element('uae_generate_datetime', $result)) < ctimestamp()- 86400) { $view['view']['message'] = '24 시간 이내에 인증을 받으셔야 합니다'; } elseif (element('uae_type', $result) !== '3') { $view['view']['error_message'] = '잘못된 접근입니다'; } else { $select = 'user_id, user_email, user_denied, user_email_cert'; $dbuser = $this->User_model->get_by_id(element('user_id', $result), $select); if ( ! element('user_id', $dbuser)) { $view['view']['error_message'] = '잘못된 접근입니다'; } elseif (element('user_id', $dbuser) !== $this->input->get('user')) { $view['view']['error_message'] = '잘못된 접근입니다'; } elseif (element('user_denied', $dbuser)) { $view['view']['error_message'] = '회원님의 계정은 접근이 금지되어 있습니다'; } elseif ($this->configlib->item('use_register_email_auth') && ! element('user_email_cert', $dbuser)) { $view['view']['error_message'] = '회원님은 회원가입 후, 또는 이메일 정보 변경후 아직 이메일 인증을 받지 않으셨습니다'; } $view['view']['user_email'] = element('user_email', $dbuser); } $config = array( array( 'field' => 'new_password', 'label' => '패스워드', 'rules' => 'trim|required|min_length[' . $password_length . ']|callback__user_password_check', ), array( 'field' => 'new_password_re', 'label' => '패스워드', 'rules' => 'trim|required|min_length[' . $password_length . ']', ), ); $this->form_validation->set_rules($config); /** * 유효성 검사를 하지 않는 경우, 또는 유효성 검사에 실패한 경우입니다. * 즉 글쓰기나 수정 페이지를 보고 있는 경우입니다 */ if ($this->form_validation->run() === false) { } else { if (empty($view['view']['error_message'])) { $hash = password_hash($this->input->post('new_password'), PASSWORD_BCRYPT); $updatedata = array( 'user_password' => $hash, ); $this->User_model->update(element('user_id', $result), $updatedata); $metadata = array( 'meta_change_pw_datetime' => cdate('Y-m-d H:i:s'), ); $this->load->model('User_meta_model'); $this->User_meta_model->save(element('user_id', $result), $metadata); $updateemail = array( 'uae_use_datetime' => cdate('Y-m-d H:i:s'), 'uae_expired' => 1 ); $this->User_auth_email_model->update(element('uae_id', $result), $updateemail); $view['view']['success_message'] = '회원님의 패스워드가 변경되었습니다.
감사합니다'; $this->session->set_userdata('user_id', element('user_id', $result)); } } $password_description = '비밀번호는 ' . $password_length . '자리 이상이어야 '; if ($this->configlib->item('password_uppercase_length') OR $this->configlib->item('password_numbers_length') OR $this->configlib->item('password_specialchars_length')) { $password_description .= '하며 '; if ($this->configlib->item('password_uppercase_length')) { $password_description .= ', ' . $this->configlib->item('password_uppercase_length') . '개의 대문자'; } if ($this->configlib->item('password_numbers_length')) { $password_description .= ', ' . $this->configlib->item('password_numbers_length') . '개의 숫자'; } if ($this->configlib->item('password_specialchars_length')) { $password_description .= ', ' . $this->configlib->item('password_specialchars_length') . '개의 특수문자'; } $password_description .= '를 포함해야 '; } $password_description .= '합니다'; $view['view']['info'] = $password_description; /** * 레이아웃을 정의합니다 */ $layoutconfig = array( 'path' => 'findaccount', 'layout' => 'layout', 'skin' => 'findaccount_change_pw', ); $view['layout'] = $this->layoutlib->front($layoutconfig, $this->configlib->get_device_view_type()); $this->data = $view; $this->layout = element('layout_skin_file', element('layout', $view)); $this->view = element('view_skin_file', element('layout', $view)); } /** * 새로 입력한 패스워드가 규약에 맞는지 체크합니다. */ public function _user_password_check($str) { $uppercase = $this->configlib->item('password_uppercase_length'); $number = $this->configlib->item('password_numbers_length'); $specialchar = $this->configlib->item('password_specialchars_length'); $this->load->helper('chkstring'); $str_uc = count_uppercase($str); $str_num = count_numbers($str); $str_spc = count_specialchars($str); if ($str_uc < $uppercase OR $str_num < $number OR $str_spc < $specialchar) { $description = '비밀번호는 '; if ($str_uc < $uppercase) { $description .= ' ' . $uppercase . '개 이상의 대문자'; } if ($str_num < $number) { $description .= ' ' . $number . '개 이상의 숫자'; } if ($str_spc < $specialchar) { $description .= ' ' . $specialchar . '개 이상의 특수문자'; } $description .= '를 포함해야 합니다'; $this->form_validation->set_message( '_user_password_check', $description ); return false; } return true; } }