Server : Apache/2.4.58 (Ubuntu) System : Linux yumsem00.cafe24.com 5.4.0-131-generic #147-Ubuntu SMP Fri Oct 14 17:07:22 UTC 2022 x86_64 User : root ( 0) PHP Version : 8.2.14 Disable Function : NONE Directory : /var/www/html/wp-content/plugins/kboard-comments/class/ |
Upload File : |
<?php /** * KBoard Comments Controller * @link www.cosmosfarm.com * @copyright Copyright 2021 Cosmosfarm. All rights reserved. * @license http://www.gnu.org/licenses/gpl.html */ class KBCommentController { private $abspath; // 스킨에서 사용 할 첨부파일 input[type=file] 이름의 prefix를 정의한다. var $skin_attach_prefix = 'comment_attach_'; // 스킨에서 사용 할 사용자 정의 옵션 input, textarea, select 이름의 prefix를 정의한다. var $skin_option_prefix = 'comment_option_'; public function __construct(){ $this->abspath = untrailingslashit(ABSPATH); $action = isset($_GET['action'])?$_GET['action']:''; switch($action){ case 'kboard_comment_insert': add_action('wp_loaded', array($this, 'insert')); break; case 'kboard_comment_delete': add_action('wp_loaded', array($this, 'delete')); break; case 'kboard_comment_update': add_action('wp_loaded', array($this, 'update')); break; } add_action('wp_ajax_kboard_comments_list_update', array($this, 'comments_list_update')); add_action('wp_ajax_kboard_comment_like', array($this, 'commentLike')); add_action('wp_ajax_nopriv_kboard_comment_like', array($this, 'commentLike')); add_action('wp_ajax_kboard_comment_unlike', array($this, 'commentUnlike')); add_action('wp_ajax_nopriv_kboard_comment_unlike', array($this, 'commentUnlike')); } /** * 댓글 입력 */ public function insert(){ global $wpdb; $content_uid = isset($_POST['content_uid'])?intval($_POST['content_uid']):''; if(isset($_POST['kboard-comments-execute-nonce']) && wp_verify_nonce($_POST['kboard-comments-execute-nonce'], "kboard-comments-execute-{$content_uid}")){ header("Content-Type: text/html; charset=UTF-8"); // 되돌아오는 페이지 주소 깨지는 버그 해결 $_SERVER['HTTP_REFERER'] = preg_replace('/\{[^}]*\}/', '%', wp_get_raw_referer()); if(!wp_get_referer()){ wp_die(__('This page is restricted from external access.', 'kboard-comments')); } $_POST = stripslashes_deep($_POST); $content = isset($_POST['content'])?$_POST['content']:''; $comment_content = isset($_POST['comment_content'])?$_POST['comment_content']:''; $content = $content?$content:$comment_content; $comment_hide = isset($_POST['comment_option_hide'])?sanitize_text_field($_POST['comment_option_hide']):''; $comment_anonymous = isset($_POST['comment_option_anonymous'])?sanitize_text_field($_POST['comment_option_anonymous']):''; $parent_uid = isset($_POST['parent_uid'])?intval($_POST['parent_uid']):''; $member_uid = isset($_POST['member_uid'])?intval($_POST['member_uid']):''; $member_display = isset($_POST['member_display'])?sanitize_text_field($_POST['member_display']):''; $status = isset($_POST['status'])?sanitize_key($_POST['status']):''; $password = isset($_POST['password'])?sanitize_text_field($_POST['password']):''; if(is_user_logged_in()){ $current_user = wp_get_current_user(); $member_uid = $current_user->ID; $member_display = $member_display ? $member_display : $current_user->display_name; } $option = new stdClass(); foreach($_POST as $key=>$value){ if(strpos($key, $this->skin_option_prefix) !== false){ $key = sanitize_key(str_replace($this->skin_option_prefix, '', $key)); $value = kboard_safeiframe(kboard_xssfilter($value)); $option->{$key} = $value; } } $document = new KBContent(); $document->initWithUID($content_uid); $board = new KBoard($document->board_id); // 임시저장 $temporary = new stdClass(); $temporary->member_display = $member_display; $temporary->content = $content; $temporary->option = $option; $temporary->comment_hide = $comment_hide; $temporary->comment_anonymous = $comment_anonymous; $_SESSION['kboard_temporary_comments'] = $temporary; if(!$board->id){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!$document->uid){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!is_user_logged_in() && $board->meta->permission_comment_write){ die('<script>alert("'.__('You do not have permission.', 'kboard-comments').'");history.go(-1);</script>'); } else if(!is_user_logged_in() && !$member_display){ die("<script>alert('".__('Please enter the author.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!is_user_logged_in() && !$password){ die("<script>alert('".__('Please enter the password.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!$content){ die("<script>alert('".__('Please enter the content.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!$content_uid){ die("<script>alert('".__('content_uid is required.', 'kboard-comments')."');history.go(-1);</script>"); } // 금지단어 체크 if(!$board->isAdmin()){ $replace = array(' ', '「', '」', '『', '』', '-', '_', '.', '(', ')', '[', ']', ',', '~', '*', '+', '^', '♥', '★', '!', '#', '=', '', '[', ']', '/', '▶', '▷', '<', '>', '%', ':', 'ღ', '$', '*', '♣', '♧', '☞'); // 작성자 금지단어 체크 $name_filter = kboard_name_filter(true); if($name_filter){ $subject = urldecode($member_display); $subject = strtolower($subject); $subject = str_replace($replace, '', $subject); $name_filter_message = get_option('kboard_name_filter_message', ''); foreach($name_filter as $filter){ if($filter && strpos($subject, $filter) !== false){ if(!$name_filter_message){ $name_filter_message = sprintf(__('%s is not available.', 'kboard'), $filter); } $name_filter_message = apply_filters('kboard_comments_name_filter_message', $name_filter_message, $filter, $subject, $board); die("<script>alert('".$name_filter_message."');history.go(-1);</script>"); } } } // 본문/제목/댓글 금지단어 체크 $content_filter = kboard_content_filter(true); if($content_filter){ $subject = urldecode($content); $subject = strtolower($subject); $subject = str_replace($replace, '', $subject); $content_filter_message = get_option('kboard_content_filter_message', ''); foreach($content_filter as $filter){ if($filter && strpos($subject, $filter) !== false){ if(!$content_filter_message){ $content_filter_message = sprintf(__('%s is not available.', 'kboard'), $filter); } $content_filter_message = apply_filters('kboard_comments_content_filter_message', $content_filter_message, $filter, $subject, $board); die("<script>alert('".$content_filter_message."');history.go(-1);</script>"); } } } } // Captcha 검증 if($board->useCAPTCHA()){ if(!class_exists('KBCaptcha')){ include_once KBOARD_DIR_PATH.'/class/KBCaptcha.class.php'; } $captcha = new KBCaptcha(); if(!$captcha->validate()){ die("<script>alert('".__('CAPTCHA is invalid.', 'kboard-comments')."');history.go(-1);</script>"); } } // 댓글쓰기 감소 포인트 if($board->meta->comment_insert_down_point && (!$board->meta->point_applied_to || !$board->isAdmin())){ if(function_exists('mycred_add')){ if(!is_user_logged_in()){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } else{ $balance = mycred_get_users_balance(get_current_user_id()); if($board->meta->comment_insert_down_point > $balance){ die('<script>alert("'.__('You have not enough points.', 'kboard-comments').'");history.go(-1);</script>'); } else{ $point = intval(get_user_meta(get_current_user_id(), 'kboard_comments_mycred_point', true)); update_user_meta(get_current_user_id(), 'kboard_comments_mycred_point', $point + ($board->meta->comment_insert_down_point*-1)); mycred_add('comment_insert_down_point', get_current_user_id(), ($board->meta->comment_insert_down_point*-1), __('Writing comment decrease points', 'kboard-comments')); } } } } do_action('kboard_comments_pre_insert', 0, $content_uid, $board); // 업로드된 파일이 있는지 확인한다. (없으면 중단) $upload_checker = false; foreach($_FILES as $key=>$value){ if(strpos($key, $this->skin_attach_prefix) === false) continue; if($_FILES[$key]['tmp_name']){ $upload_checker = true; break; } } $upload_attach_files = array(); if($upload_checker){ $upload_dir = wp_upload_dir(); $attach_store_path = str_replace($this->abspath, '', $upload_dir['basedir']) . "/kboard_attached/{$board->id}/" . date('Ym', current_time('timestamp')) . '/'; $file = new KBFileHandler(); $file->setPath($attach_store_path); foreach($_FILES as $key=>$value){ if(strpos($key, $this->skin_attach_prefix) === false) continue; $key = str_replace($this->skin_attach_prefix, '', $key); $key = sanitize_key($key); $upload = $file->upload($this->skin_attach_prefix . $key); $file_path = $upload['path'] . $upload['stored_name']; $file_name = $upload['original_name']; $metadata = $upload['metadata']; if($file_name){ $filetype = wp_check_filetype($this->abspath . $file_path, array('jpg|jpeg|jpe'=>'image/jpeg', 'png'=>'image/png')); if(in_array($filetype['type'], array('image/jpeg', 'image/png'))){ $image_optimize_width = intval(get_option('kboard_image_optimize_width')); $image_optimize_height = intval(get_option('kboard_image_optimize_height')); $image_optimize_quality = intval(get_option('kboard_image_optimize_quality')); $image_editor = wp_get_image_editor($this->abspath . $file_path); if(!is_wp_error($image_editor)){ $is_save = false; if($image_optimize_width && $image_optimize_height){ $image_editor->resize($image_optimize_width, $image_optimize_height); $is_save = true; } if(0 < $image_optimize_quality && $image_optimize_quality < 100){ $image_editor->set_quality($image_optimize_quality); $is_save = true; } if($is_save){ $image_editor->save($this->abspath . $file_path); } } } $attach_file = new stdClass(); $attach_file->key = $key; $attach_file->path = $file_path; $attach_file->name = $file_name; $attach_file->metadata = $metadata; $upload_attach_files[] = $attach_file; } } } if($board->meta->comment_permit){ $status = 'pending_approval'; } $comment_list = new KBCommentList($content_uid); $comment_list->board = $board; $comment_uid = $comment_list->add($parent_uid, $member_uid, $member_display, $content, $status, $password); if($comment_uid && $upload_attach_files && is_array($upload_attach_files)){ foreach($upload_attach_files as $attach_file){ $file_key = esc_sql($attach_file->key); $file_path = esc_sql($attach_file->path); $file_name = esc_sql($attach_file->name); $file_size = intval(filesize($this->abspath . $file_path)); $metadata = apply_filters('kboard_comments_file_metadata', $attach_file->metadata, $attach_file, $this); $metadata = serialize($metadata); $metadata = esc_sql($metadata); $present_file = $wpdb->get_var("SELECT `file_path` FROM `{$wpdb->prefix}kboard_board_attached` WHERE `comment_uid`='$comment_uid' AND `file_key`='$file_key'"); if($present_file){ @unlink($this->abspath . $present_file); $wpdb->query("UPDATE `{$wpdb->prefix}kboard_board_attached` SET `file_path`='$file_path', `file_name`='$file_name', `file_size`='$file_size', `metadata`='$metadata' WHERE `comment_uid`='$comment_uid' AND `file_key`='$file_key'"); } else{ $date = date('YmdHis', current_time('timestamp')); $wpdb->query("INSERT INTO `{$wpdb->prefix}kboard_board_attached` (`content_uid`, `comment_uid`, `file_key`, `date`, `file_path`, `file_name`, `file_size`, `download_count`, `metadata`) VALUES ('0', '$comment_uid', '$file_key', '$date', '$file_path', '$file_name', '$file_size', '0', '$metadata')"); } } } else if($upload_attach_files && is_array($upload_attach_files)){ foreach($upload_attach_files as $attach_file){ kbaord_delete_resize($this->abspath . $attach_file->path); @unlink($this->abspath . $attach_file->path); } } // 댓글과 미디어의 관계를 입력한다. $media = new KBCommentMedia(); $media->board_id = $board->id; $media->comment_uid = $comment_uid; $media->media_group = isset($_POST['media_group']) ? sanitize_key($_POST['media_group']) : ''; $media->createRelationships(); $comment_option = new KBCommentOption($comment_uid); foreach($option as $key=>$value){ $comment_option->{$key} = $value; } // 댓글쓰기 증가 포인트 if($board->meta->comment_insert_up_point && (!$board->meta->point_applied_to || !$board->isAdmin())){ if(function_exists('mycred_add')){ if(is_user_logged_in()){ $point = intval(get_user_meta(get_current_user_id(), 'kboard_comments_mycred_point', true)); update_user_meta(get_current_user_id(), 'kboard_comments_mycred_point', $point + $board->meta->comment_insert_up_point); mycred_add('comment_insert_up_point', get_current_user_id(), $board->meta->comment_insert_up_point, __('Writing comment increase points', 'kboard-comments')); } } } if($comment_uid){ unset($_SESSION['kboard_temporary_comments']); } $next_page_url = wp_get_referer() . "#kboard-comments-{$content_uid}"; $next_page_url = apply_filters('kboard_comments_after_executing_url', $next_page_url, $comment_uid, $content_uid); $comment = new KBComment(); $comment->initWithUID($comment_uid); do_action('kboard_comments_execute_pre_redirect', $next_page_url, $comment, $content, $board); wp_redirect($next_page_url); exit; } wp_die(__('You do not have permission.', 'kboard-comments')); } /** * 댓글 삭제 */ public function delete(){ header("Content-Type: text/html; charset=UTF-8"); // 되돌아오는 페이지 주소 깨지는 버그 해결 $_SERVER['HTTP_REFERER'] = preg_replace('/\{[^}]*\}/', '%', wp_get_raw_referer()); if(!wp_get_referer()){ wp_die(__('This page is restricted from external access.', 'kboard-comments')); } $uid = isset($_GET['uid'])?intval($_GET['uid']):''; $password = isset($_POST['password'])?sanitize_text_field($_POST['password']):''; if(!$uid){ die("<script>alert('".__('uid is required.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!is_user_logged_in() && !$password){ die("<script>alert('".__('Please log in to continue.', 'kboard-comments')."');history.go(-1);</script>"); } $comment = new KBComment(); $comment->initWithUID($uid); $board = $comment->getBoard(); if(!$comment->isEditor() && $comment->password != $password){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } if(!isset($_REQUEST['kboard-comments-delete-nonce'])){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } if($password){ if(!wp_verify_nonce($_REQUEST['kboard-comments-delete-nonce'], "kboard-comments-delete-{$comment->password}")){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } } else{ if(!wp_verify_nonce($_REQUEST['kboard-comments-delete-nonce'], "kboard-comments-delete-{$comment->uid}")){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } } do_action('kboard_comments_pre_delete', $comment->uid, $comment->content_uid, $board); $comment->delete(); if($comment->password && $comment->password == $password){ // 팝업창으로 비밀번호 확인 후 opener 윈도우를 새로고침 한다. echo '<script>'; echo 'opener.window.location.reload();'; echo 'window.close();'; echo '</script>'; } else{ // 삭제권한이 있는 사용자일 경우 팝업창은 없기 때문에 페이지 이동한다. wp_redirect(wp_get_referer()); } exit; } /** * 댓글 수정 */ public function update(){ header("Content-Type: text/html; charset=UTF-8"); // 되돌아오는 페이지 주소 깨지는 버그 해결 $_SERVER['HTTP_REFERER'] = preg_replace('/\{[^}]*\}/', '%', wp_get_raw_referer()); if(!wp_get_referer()){ wp_die(__('This page is restricted from external access.', 'kboard-comments')); } $_POST = stripslashes_deep($_POST); $content = isset($_POST['content'])?$_POST['content']:''; $comment_content = isset($_POST['comment_content'])?$_POST['comment_content']:''; $content = $content?$content:$comment_content; $uid = isset($_GET['uid'])?intval($_GET['uid']):''; $password = isset($_POST['password'])?sanitize_text_field($_POST['password']):''; if(!$uid){ die("<script>alert('".__('uid is required.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!$content){ die("<script>alert('".__('Please enter the content.', 'kboard-comments')."');history.go(-1);</script>"); } else if(!is_user_logged_in() && !$password){ die("<script>alert('".__('Please log in to continue.', 'kboard-comments')."');history.go(-1);</script>"); } $comment = new KBComment(); $comment->initWithUID($uid); $board = $comment->getBoard(); if(!$comment->isEditor() && $comment->password != $password){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } if(!isset($_REQUEST['kboard-comments-update-nonce'])){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } if($password){ if(!wp_verify_nonce($_REQUEST['kboard-comments-update-nonce'], "kboard-comments-update-{$comment->password}")){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } } else{ if(!wp_verify_nonce($_REQUEST['kboard-comments-update-nonce'], "kboard-comments-update-{$comment->uid}")){ die("<script>alert('".__('You do not have permission.', 'kboard-comments')."');history.go(-1);</script>"); } } do_action('kboard_comments_pre_update', $comment->uid, $comment->content_uid, $board); $comment->content = $content; $comment = apply_filters('kboard_comments_update_data', $comment, $board->id); $comment->update(); $option = new stdClass(); foreach($_POST as $key=>$value){ if(strpos($key, $this->skin_option_prefix) !== false){ $key = sanitize_key(str_replace($this->skin_option_prefix, '', $key)); $value = kboard_safeiframe(kboard_xssfilter($value)); $comment->option->{$key} = $value; } } echo '<script>'; echo 'opener.window.location.reload();'; echo 'window.close();'; echo '</script>'; exit; } /** * 댓글 정보 업데이트 */ public function comments_list_update(){ if(current_user_can('manage_kboard')){ $status = isset($_POST['status']) ? $_POST['status'] : array(); if($status){ foreach($status as $uid=>$status){ $comment = new KBComment(); $comment->initWithUID($uid); $comment->status = $status; $comment->update(); } } } exit; } /** * 댓글 좋아요 */ public function commentLike(){ check_ajax_referer('kboard_ajax_security', 'security'); if(isset($_POST['comment_uid']) && intval($_POST['comment_uid'])){ $comment = new KBComment(); $comment->initWithUID($_POST['comment_uid']); if($comment->uid){ $board = $comment->getBoard(); if($board->isVote()){ $args['target_uid'] = $comment->uid; $args['target_type'] = KBVote::$TYPE_COMMENT; $args['target_vote'] = KBVote::$VOTE_LIKE; $vote = new KBVote(); if($vote->isExists($args) === 0){ if($vote->insert($args)){ $comment->like += 1; $comment->vote = $comment->like - $comment->unlike; $comment->update(); do_action('kboard_comment_like', $comment, $board); wp_send_json(array('result'=>'success', 'data'=>array('vote'=>intval($comment->vote), 'like'=>intval($comment->vote), 'unlike'=>intval($comment->unlike)))); } } else{ wp_send_json(array('result'=>'error', 'message'=>__('You have already voted.', 'kboard-comments'))); } } else if(!is_user_logged_in()){ wp_send_json(array('result'=>'error', 'message'=>__('Please log in to continue.', 'kboard-comments'))); } } } wp_send_json(array('result'=>'error', 'message'=>__('You do not have permission.', 'kboard-comments'))); } /** * 댓글 싫어요 */ public function commentUnlike(){ check_ajax_referer('kboard_ajax_security', 'security'); if(isset($_POST['comment_uid']) && intval($_POST['comment_uid'])){ $comment = new KBComment(); $comment->initWithUID($_POST['comment_uid']); if($comment->uid){ $board = $comment->getBoard(); if($board->isVote()){ $args['target_uid'] = $comment->uid; $args['target_type'] = KBVote::$TYPE_COMMENT; $args['target_vote'] = KBVote::$VOTE_UNLIKE; $vote = new KBVote(); if($vote->isExists($args) === 0){ if($vote->insert($args)){ $comment->unlike += 1; $comment->vote = $comment->like - $comment->unlike; $comment->update(); do_action('kboard_comment_unlike', $comment, $board); wp_send_json(array('result'=>'success', 'data'=>array('vote'=>intval($comment->vote), 'like'=>intval($comment->vote), 'unlike'=>intval($comment->unlike)))); } } else{ wp_send_json(array('result'=>'error', 'message'=>__('You have already voted.', 'kboard-comments'))); } } else if(!is_user_logged_in()){ wp_send_json(array('result'=>'error', 'message'=>__('Please log in to continue.', 'kboard-comments'))); } } } wp_send_json(array('result'=>'error', 'message'=>__('You do not have permission.', 'kboard-comments'))); } } ?>