diff --git a/common/lang/lang.xml b/common/lang/lang.xml index 6bba46e45..fdad62d8f 100644 --- a/common/lang/lang.xml +++ b/common/lang/lang.xml @@ -3272,6 +3272,10 @@ + + + + diff --git a/modules/comment/comment.model.php b/modules/comment/comment.model.php index c04ebae67..78de2f844 100644 --- a/modules/comment/comment.model.php +++ b/modules/comment/comment.model.php @@ -1054,6 +1054,44 @@ class commentModel extends comment } } + /** + * Get the total number of comments in corresponding with member_srl. + * @param int $member_srl + * @return int + */ + function getCommentCountByMemberSrl($member_srl) + { + $args = new stdClass(); + $args->member_srl = $member_srl; + $output = executeQuery('comment.getCommentCountByMemberSrl', $args); + return (int) $output->data->count; + } + + + /** + * Get comment list of the doc in corresponding woth member_srl. + * @param int $member_srl + * @param array $columnList + * @param int $page + * @param bool $is_admin + * @param int $count + * @return object + */ + function getCommentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0) + { + $args = new stdClass(); + $args->member_srl = $member_srl; + $args->list_count = $count; + $output = executeQuery('comment.getCommentListByMemberSrl', $args, $columnList); + $comment_list = $output->data; + + if(!$comment_list) return array(); + if(!is_array($comment_list)) $comment_list = array($comment_list); + + return $comment_list; + + } + } /* End of file comment.model.php */ /* Location: ./modules/comment/comment.model.php */ diff --git a/modules/comment/queries/getCommentCountByMemberSrl.xml b/modules/comment/queries/getCommentCountByMemberSrl.xml new file mode 100644 index 000000000..f81db4647 --- /dev/null +++ b/modules/comment/queries/getCommentCountByMemberSrl.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/modules/comment/queries/getCommentListByMemberSrl.xml b/modules/comment/queries/getCommentListByMemberSrl.xml new file mode 100644 index 000000000..60c344eac --- /dev/null +++ b/modules/comment/queries/getCommentListByMemberSrl.xml @@ -0,0 +1,19 @@ + + +
+ + + + + + + + + + + + + + + + diff --git a/modules/document/document.model.php b/modules/document/document.model.php index 03fe68923..22b66cce8 100644 --- a/modules/document/document.model.php +++ b/modules/document/document.model.php @@ -1491,6 +1491,42 @@ class documentModel extends document } } } + + /** + * Get the total number of Document in corresponding with member_srl. + * @param int $member_srl + * @return int + */ + function getDocumentCountByMemberSrl($member_srl) + { + $args = new stdClass(); + $args->member_srl = $member_srl; + $output = executeQuery('document.getDocumentCountByMemberSrl', $args); + return (int) $output->data->count; + } + + /** + * Get document list of the doc in corresponding woth member_srl. + * @param int $member_srl + * @param array $columnList + * @param int $page + * @param bool $is_admin + * @param int $count + * @return object + */ + function getDocumentListByMemberSrl($member_srl, $columnList = array(), $page = 0, $is_admin = FALSE, $count = 0 ) + { + $args = new stdClass(); + $args->member_srl = $member_srl; + $args->list_count = $count; + $output = executeQuery('document.getDocumentListByMemberSrl', $args, $columnList); + $document_list = $output->data; + + if(!$document_list) return array(); + if(!is_array($document_list)) $document_list = array($document_list); + + return $document_list; + } } /* End of file document.model.php */ /* Location: ./modules/document/document.model.php */ diff --git a/modules/document/document.view.php b/modules/document/document.view.php index 788708bf9..497050daa 100644 --- a/modules/document/document.view.php +++ b/modules/document/document.view.php @@ -176,6 +176,7 @@ class documentView extends document $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('saved_list_popup'); } + } /* End of file document.view.php */ /* Location: ./modules/document/document.view.php */ diff --git a/modules/document/queries/getDocumentCountByMemberSrl.xml b/modules/document/queries/getDocumentCountByMemberSrl.xml new file mode 100644 index 000000000..ed457fbf8 --- /dev/null +++ b/modules/document/queries/getDocumentCountByMemberSrl.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/document/queries/getDocumentListByMemberSrl.xml b/modules/document/queries/getDocumentListByMemberSrl.xml new file mode 100644 index 000000000..49e80353b --- /dev/null +++ b/modules/document/queries/getDocumentListByMemberSrl.xml @@ -0,0 +1,17 @@ + + +
+ + + + + + + + + + + + + + diff --git a/modules/member/conf/module.xml b/modules/member/conf/module.xml index 5cbe43300..a2f7f2baf 100644 --- a/modules/member/conf/module.xml +++ b/modules/member/conf/module.xml @@ -20,6 +20,7 @@ + @@ -68,6 +69,7 @@ + diff --git a/modules/member/lang/lang.xml b/modules/member/lang/lang.xml index 0a9eced35..c6a0072eb 100644 --- a/modules/member/lang/lang.xml +++ b/modules/member/lang/lang.xml @@ -2619,5 +2619,21 @@ - + + + + + + 지정된 회원을 차단하고, 회원이 남긴 글과 댓글을 삭제합니다. 회원이 작성한 게시물의 양에 따라 오래걸릴 수 있습니다.

]]>
+ Spam user management. This function denied user login and remove all of documents, comments

]]>
+
+ + + + + + + + + diff --git a/modules/member/member.class.php b/modules/member/member.class.php index 482242817..c38692d29 100644 --- a/modules/member/member.class.php +++ b/modules/member/member.class.php @@ -144,6 +144,10 @@ class member extends ModuleObject { FileHandler::makeDir('./files/member_extra_info/profile_image'); FileHandler::makeDir('./files/member_extra_info/signature'); + // 2013. 11. 22 add menu when popup document menu called + $oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after'); + $oModuleController->insertTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after'); + return new Object(); } @@ -208,6 +212,10 @@ class member extends ModuleObject { if(!is_readable('./files/ruleset/login.xml')) return true; if(!is_readable('./files/ruleset/find_member_account_by_question.xml')) return true; + // 2013. 11. 22 add menu when popup document menu called + if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after')) return true; + if(!$oModuleModel->getTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after')) return true; + return false; } @@ -345,6 +353,12 @@ class member extends ModuleObject { if(!is_readable('./files/ruleset/find_member_account_by_question.xml')) $oMemberAdminController->_createFindAccountByQuestion($config->identifier); + // 2013. 11. 22 add menu when popup document menu called + if(!$oModuleModel->getTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after')) + $oModuleController->insertTrigger('document.getDocumentMenu', 'member', 'controller', 'triggerGetDocumentMenu', 'after'); + if(!$oModuleModel->getTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after')) + $oModuleController->insertTrigger('comment.getCommentMenu', 'member', 'controller', 'triggerGetCommentMenu', 'after'); + return new Object(0, 'success_updated'); } diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index fb98f54bb..95a6c26c8 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -1962,8 +1962,10 @@ class memberController extends member /** * Modify member information + * + * @param bool $is_admin , modified 2013-11-22 */ - function updateMember($args) + function updateMember($args, $is_admin = FALSE) { // Call a trigger (before) $output = ModuleHandler::triggerCall('member.updateMember', 'before', $args); @@ -1986,8 +1988,9 @@ class memberController extends member else { unset($args->is_admin); - unset($args->denied); - if($logged_info->member_srl != $args->member_srl) + if($is_admin == false) + unset($args->denied); + if($logged_info->member_srl != $args->member_srl && $is_admin == false) { return $this->stop('msg_invalid_request'); } @@ -2354,6 +2357,206 @@ class memberController extends member $this->setTemplatePath($this->module_path.'tpl'); $this->setTemplateFile('msg_success_modify_email_address'); } + + /** + * trigger for document.getDocumentMenu. Append to popup menu a button for procMemberSpammerManage() + * + * @param array &$menu_list + * + * @return object + **/ + function triggerGetDocumentMenu(&$menu_list) + { + if(!Context::get('is_logged')) return new Object(); + + $logged_info = Context::get('logged_info'); + $document_srl = Context::get('target_srl'); + + $oDocumentModel = &getModel('document'); + $columnList = array('document_srl', 'module_srl', 'member_srl', 'ipaddress'); + $oDocument = $oDocumentModel->getDocument($document_srl, false, false, $columnList); + $member_srl = $oDocument->get('member_srl'); + $module_srl = $oDocument->get('module_srl'); + + if(!$member_srl) return new Object(); + if($oDocumentModel->grant->manager != 1 || $member_srl==$logged_info->member_srl) return new Object(); + + $oDocumentController = &getController('document'); + $url = getUrl('','module','member','act','dispMemberSpammer','member_srl',$member_srl,'module_srl',$module_srl); + $oDocumentController->addDocumentPopupMenu($url,'cmd_spammer','','popup'); + + return new Object(); + } + + /** + * trigger for comment.getCommentMenu. Append to popup menu a button for procMemberSpammerManage() + * + * @param array &$menu_list + * + * @return object + **/ + function triggerGetCommentMenu(&$menu_list) + { + if(!Context::get('is_logged')) return new Object(); + + $logged_info = Context::get('logged_info'); + $comment_srl = Context::get('target_srl'); + + $oCommentModel = &getModel('comment'); + $columnList = array('comment_srl', 'module_srl', 'member_srl', 'ipaddress'); + $oComment = $oCommentModel->getComment($comment_srl, FALSE, $columnList); + $module_srl = $oComment->get('module_srl'); + $member_srl = $oComment->get('member_srl'); + + if(!$member_srl) return new Object(); + if($oCommentModel->grant->manager != 1 || $member_srl==$logged_info->member_srl) return new Object(); + + $oCommentController = &getController('comment'); + $url = getUrl('','module','member','act','dispMemberSpammer','member_srl',$member_srl,'module_srl',$module_srl); + $oCommentController->addCommentPopupMenu($url,'cmd_spammer','','popup'); + + return new Object(); + } + + /** + * Spammer manage. Denied user login. And delete or trash all documents. Response Ajax string + * + * @return object + **/ + function procMemberSpammerManage() + { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + + $logged_info = Context::get('logged_info'); + $member_srl = Context::get('member_srl'); + $module_srl = Context::get('module_srl'); + $cnt_loop = Context::get('cnt_loop'); + $proc_type = Context::get('proc_type'); + $isMoveToTrash = true; + if($proc_type == "delete") + $isMoveToTrash = false; + + // check grant + $oModuleModel = &getModel('module'); + $columnList = array('module_srl', 'module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList); + $grant = $oModuleModel->getGrant($module_info, $logged_info); + + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $proc_msg = ""; + + $oDocumentModel = &getModel('document'); + $oCommentModel = &getModel('comment'); + + // delete or trash destination + // proc member + if($cnt_loop == 1) + $this->_spammerMember($member_srl); + // proc document and comment + elseif($cnt_loop>1) + $this->_spammerDocuments($member_srl, $isMoveToTrash); + + // get destination count + $cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl); + $cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl); + + $total_count = Context::get('total_count'); + $remain_count = $cnt_document + $cnt_comment; + if($cnt_loop == 1) $total_count = $remain_count; + + // get progress percent + if($total_count > 0) + $progress = intval( ( ( $total_count - $remain_count ) / $total_count ) * 100 ); + else + $progress = 100; + + $this->add('total_count', $total_count); + $this->add('remain_count', $remain_count); + $this->add('progress', $progress); + $this->add('member_srl', $member_srl); + $this->add('module_srl', $module_srl); + $this->add('cnt_loop', ++$cnt_loop); + $this->add('proc_type', $proc_type); + + return new Object(0); + } + + /** + * Denied user login and write description + * + * @param int $member_srl + * + * @return object + **/ + private function _spammerMember($member_srl) { + $logged_info = Context::get('logged_info'); + $spam_description = trim( Context::get('spam_description') ); + + $oMemberModel = &getModel('member'); + $columnList = array('member_srl', 'description'); + // get member current infomation + $member_info = $oMemberModel->getMemberInfoByMemberSrl($member_srl, 0, $columnList); + + $oDocumentModel = &getModel('document'); + $oCommentModel = &getModel('comment'); + $cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl); + $cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl); + $total_count = $cnt_comment + $cnt_document; + + $args = new stdClass(); + $args->member_srl= $member_info->member_srl; + $args->denied = "Y"; + $args->description = trim( $member_info->description ); + if( $args->description != "" ) $args->description .= "\n"; // add new line + + $args->description .= Context::getLang('cmd_spammer') . "[" . date("Y-m-d H:i:s") . " from:" . $logged_info->user_id . " info:" . $spam_description . " docuemnts count:" . $total_count . "]"; + + return $this->updateMember($args, true); + } + + /** + * Delete or trash all documents + * + * @param int $member_srl + * @param bool $isMoveToTrash + * + * @return object + **/ + private function _spammerDocuments($member_srl, $isMoveToTrash) { + $oDocumentController = &getController('document'); + $oDocumentModel = &getModel('document'); + $oCommentController = &getController('comment'); + $oCommentModel = &getModel('comment'); + + // delete count by one request + $getContentsCount = 10; + + // 1. proc comment, 2. proc document + $cnt_comment = $oCommentModel->getCommentCountByMemberSrl($member_srl); + $cnt_document = $oDocumentModel->getDocumentCountByMemberSrl($member_srl); + if($cnt_comment > 0) + { + $columnList = array(); + $commentList = $oCommentModel->getCommentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount); + if($commentList) { + foreach($commentList as $v) { + $oCommentController->deleteComment($v->comment_srl, true, $isMoveToTrash); + } + } + } elseif($cnt_document > 0) { + $columnList = array(); + $documentList = $oDocumentModel->getDocumentListByMemberSrl($member_srl, $columnList, 0, false, $getContentsCount); + if($documentList) { + foreach($documentList as $v) { + if($isMoveToTrash) $oDocumentController->moveDocumentToTrash($v); + else $oDocumentController->deleteDocument($v->document_srl); + } + } + } + + return array(); + } } /* End of file member.controller.php */ /* Location: ./modules/member/member.controller.php */ diff --git a/modules/member/member.view.php b/modules/member/member.view.php index 380cecffd..28ce8ce85 100644 --- a/modules/member/member.view.php +++ b/modules/member/member.view.php @@ -611,6 +611,41 @@ class memberView extends member Context::addHtmlHeader($js_code); } + + /** + * Spammer manage popup + * + * @return void + **/ + function dispMemberSpammer() + { + if(!Context::get('is_logged')) return new Object(-1,'msg_not_permitted'); + + $member_srl = Context::get('member_srl'); + $module_srl = Context::get('module_srl'); + + // check grant + $oModuleModel = &getModel('module'); + $columnList = array('module_srl', 'module'); + $module_info = $oModuleModel->getModuleInfoByModuleSrl($module_srl, $columnList); + $grant = $oModuleModel->getGrant($module_info, Context::get('logged_info')); + + if(!$grant->manager) return new Object(-1,'msg_not_permitted'); + + $oMemberModel = &getModel('member'); + + Context::loadLang('modules/document/lang/'); + Context::set('spammer_info', $oMemberModel->getMemberInfoByMemberSrl($member_srl)); + Context::set('module_srl', $module_srl); + + // Select Pop-up layout + $this->setLayoutPath('./common/tpl'); + $this->setLayoutFile('popup_layout'); + + $this->setTemplatePath($this->module_path.'tpl'); + $this->setTemplateFile('spammer'); + } + } /* End of file member.view.php */ /* Location: ./modules/member/member.view.php */ diff --git a/modules/member/skins/default/js/member.js b/modules/member/skins/default/js/member.js index 9422cfd66..41c8e720c 100644 --- a/modules/member/skins/default/js/member.js +++ b/modules/member/skins/default/js/member.js @@ -160,3 +160,4 @@ function doDeleteSavedDocument(document_srl, confirm_message) { function insertSelectedModule(id, module_srl, mid, browser_title) { location.href = current_url.setQuery('selected_module_srl',module_srl); } + diff --git a/modules/member/tpl/spammer.html b/modules/member/tpl/spammer.html new file mode 100644 index 000000000..42b8278b7 --- /dev/null +++ b/modules/member/tpl/spammer.html @@ -0,0 +1,119 @@ + + + +
+

{$lang->cmd_spammer}

+
+ +
+ + + + + + +
+
{$lang->spammer_description}
+
{$lang->nick_name} : {$spammer_info->nick_name}
+ +
+

{$lang->about_member_description}

+ +
+
+ + +
+ +
+
{$lang->cmd_complete}
+
+
+
+
+
+
+
{$lang->success_declare_canceled}
+
+ +