Add triggers before updateVotedCount/Cancel

문서 및 댓글 추천 액션에 after 트리거만 있고 before 트리거가 없어서
서드파티 자료에서 추천을 미리 막거니 변조하기가 어려웠음.
before 트리거를 추가하여 이 문제를 해결함.

추천 취소 액션에도 마찬가지로 before 트리거를 추가하고,
댓글 추천/취소시 document_srl 값도 받아올 수 있도록 개선함.
This commit is contained in:
Kijin Sung 2018-11-30 15:05:47 +09:00
parent a228f0888b
commit bf0014a7d9
2 changed files with 108 additions and 67 deletions

View file

@ -164,6 +164,27 @@ class commentController extends comment
{
$logged_info = Context::get('logged_info');
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oComment->get('member_srl');
$trigger_obj->module_srl = $oComment->get('module_srl');
$trigger_obj->document_srl = $oComment->get('document_srl');
$trigger_obj->comment_srl = $oComment->get('comment_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point - $point;
$trigger_obj->cancel = true;
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
$args = new stdClass();
$d_args = new stdClass();
$args->comment_srl = $d_args->comment_srl = $comment_srl;
@ -183,22 +204,10 @@ class commentController extends comment
//session reset
$_SESSION['voted_comment'][$comment_srl] = false;
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
$obj = new stdClass();
$obj->member_srl = $oComment->get('member_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->comment_srl = $oComment->get('comment_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
$obj->cancel = 1;
ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'after', $obj);
// Call a trigger (after)
ModuleHandler::triggerCall('comment.updateVotedCountCancel', 'after', $trigger_obj);
$oDB->commit();
return $output;
}
@ -1357,12 +1366,10 @@ class commentController extends comment
if($point > 0)
{
$failed_voted = 'failed_voted';
$success_message = 'success_voted';
}
else
{
$failed_voted = 'failed_blamed';
$success_message = 'success_blamed';
}
// invalid vote if vote info exists in the session info.
@ -1371,23 +1378,24 @@ class commentController extends comment
return new BaseObject(-1, $failed_voted);
}
// Get the original comment
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl, FALSE, FALSE);
// invalid vote if both ip addresses between author's and the current user are same.
// Pass if the author's IP address is as same as visitor's.
if($oComment->get('ipaddress') == $_SERVER['REMOTE_ADDR'])
{
$_SESSION['voted_comment'][$comment_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Create a member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// if the comment author is a member
if($oComment->get('member_srl'))
{
// create the member model object
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// session registered if the author information matches to the current logged-in user's.
if($member_srl && $member_srl == abs($oComment->get('member_srl')))
{
@ -1396,9 +1404,8 @@ class commentController extends comment
}
}
$args = new stdClass();
// If logged-in, use the member_srl. otherwise use the ipaddress.
$args = new stdClass();
if($member_srl)
{
$args->member_srl = $member_srl;
@ -1407,22 +1414,38 @@ class commentController extends comment
{
$args->ipaddress = $_SERVER['REMOTE_ADDR'];
}
$args->comment_srl = $comment_srl;
$output = executeQuery('comment.getCommentVotedLogInfo', $args);
// session registered if log info contains recommendation vote log.
// Pass after registering a session if log information has vote-up logs
if($output->data->count)
{
$_SESSION['voted_comment'][$comment_srl] = false;
return new BaseObject(-1, $failed_voted);
}
// Call a trigger (before)
$trigger_obj = new stdClass;
$trigger_obj->member_srl = $oComment->get('member_srl');
$trigger_obj->module_srl = $oComment->get('module_srl');
$trigger_obj->document_srl = $oComment->get('document_srl');
$trigger_obj->comment_srl = $oComment->get('comment_srl');
$trigger_obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$trigger_obj->point = $point;
$trigger_obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$trigger_obj->after_point = $trigger_obj->before_point + $point;
$trigger_obj->cancel = false;
$trigger_output = ModuleHandler::triggerCall('comment.updateVotedCount', 'before', $trigger_obj);
if(!$trigger_output->toBool())
{
return $trigger_output;
}
// begin transaction
$oDB = DB::getInstance();
$oDB->begin();
// update the number of votes
// Update the voted count
if($point < 0)
{
// leave into session information
@ -1441,27 +1464,21 @@ class commentController extends comment
$args->point = $point;
$output = executeQuery('comment.insertCommentVotedLog', $args);
$obj = new stdClass();
$obj->member_srl = $oComment->get('member_srl');
$obj->module_srl = $oComment->get('module_srl');
$obj->comment_srl = $oComment->get('comment_srl');
$obj->update_target = ($point < 0) ? 'blamed_count' : 'voted_count';
$obj->point = $point;
$obj->before_point = ($point < 0) ? $oComment->get('blamed_count') : $oComment->get('voted_count');
$obj->after_point = ($point < 0) ? $args->blamed_count : $args->voted_count;
ModuleHandler::triggerCall('comment.updateVotedCount', 'after', $obj);
// Call a trigger (after)
ModuleHandler::triggerCall('comment.updateVotedCount', 'after', $trigger_obj);
$oDB->commit();
// Return the result
$output = new BaseObject(0, $success_message);
$output = new BaseObject();
if($point > 0)
{
$output->add('voted_count', $obj->after_point);
$output->setMessage('success_voted');
$output->add('voted_count', $trigger_obj->after_point);
}
else
{
$output->add('blamed_count', $obj->after_point);
$output->setMessage('success_blamed');
$output->add('blamed_count', $trigger_obj->after_point);
}
return $output;