mirror of
https://github.com/Lastorder-DC/rhymix.git
synced 2026-04-02 01:52:10 +09:00
* pr/1615: Force start session if SSO is used Improve and simplify session status detection Improve handling of session variables related to validator Start session automatically if an addon uses the session and exits If cache-friendly behavior is enabled, don't skip updateReadedCount() If cache-friendly behavior is enabled, don't update session when reading document or comment Add option to enable/disable cache-friendly behavior Improve the setCacheControl() method Context::setCacheControl() method added etc. do not always set mobile/user-agent cookies 선택적 세션 시작 + 서드파티 자료 호환성 (Proof of Concept)
707 lines
15 KiB
PHP
707 lines
15 KiB
PHP
<?php
|
|
/* Copyright (C) NAVER <http://www.navercorp.com> */
|
|
|
|
/**
|
|
* commentItem class
|
|
* comment Object
|
|
*
|
|
* @author NAVER (developers@xpressengine.com)
|
|
* @package /modules/comment
|
|
* @version 0.1
|
|
*/
|
|
class commentItem extends Object
|
|
{
|
|
|
|
/**
|
|
* comment number
|
|
* @var int
|
|
*/
|
|
var $comment_srl = 0;
|
|
|
|
/**
|
|
* Get the column list int the table
|
|
* @var array
|
|
*/
|
|
var $columnList = array();
|
|
|
|
/**
|
|
* Constructor
|
|
* @param int $comment_srl
|
|
* @param array $columnList
|
|
* @return void
|
|
*/
|
|
function __construct($comment_srl = 0, $columnList = array())
|
|
{
|
|
$this->comment_srl = $comment_srl;
|
|
$this->columnList = $columnList;
|
|
$this->_loadFromDB();
|
|
}
|
|
|
|
function setComment($comment_srl)
|
|
{
|
|
$this->comment_srl = $comment_srl;
|
|
$this->_loadFromDB();
|
|
}
|
|
|
|
/**
|
|
* Load comment data from DB and set to commentItem object
|
|
* @return void
|
|
*/
|
|
function _loadFromDB()
|
|
{
|
|
if(!$this->comment_srl)
|
|
{
|
|
return;
|
|
}
|
|
|
|
$args = new stdClass();
|
|
$args->comment_srl = $this->comment_srl;
|
|
$output = executeQuery('comment.getComment', $args, $this->columnList);
|
|
|
|
$this->setAttribute($output->data);
|
|
}
|
|
|
|
/**
|
|
* Comment attribute set to Object object
|
|
* @return void
|
|
*/
|
|
function setAttribute($attribute)
|
|
{
|
|
if(!$attribute->comment_srl)
|
|
{
|
|
$this->comment_srl = NULL;
|
|
return;
|
|
}
|
|
|
|
$this->comment_srl = $attribute->comment_srl;
|
|
$this->adds($attribute);
|
|
|
|
// define vars on the object for backward compatibility of skins
|
|
if(count($attribute))
|
|
{
|
|
foreach($attribute as $key => $val)
|
|
{
|
|
$this->{$key} = $val;
|
|
}
|
|
}
|
|
}
|
|
|
|
function isExists()
|
|
{
|
|
return $this->comment_srl ? TRUE : FALSE;
|
|
}
|
|
|
|
function isGranted()
|
|
{
|
|
if($_SESSION['own_comment'][$this->comment_srl])
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if(!Context::get('is_logged'))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
$logged_info = Context::get('logged_info');
|
|
if($logged_info->is_admin == 'Y')
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
$grant = Context::get('grant');
|
|
if($grant->manager)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if($this->get('member_srl') && ($this->get('member_srl') == $logged_info->member_srl || $this->get('member_srl') * -1 == $logged_info->member_srl))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
function setGrant()
|
|
{
|
|
$_SESSION['own_comment'][$this->comment_srl] = TRUE;
|
|
$this->is_granted = TRUE;
|
|
}
|
|
|
|
function setAccessible()
|
|
{
|
|
if(Context::getSessionStatus())
|
|
{
|
|
$_SESSION['accessibled_comment'][$this->comment_srl] = TRUE;
|
|
}
|
|
}
|
|
|
|
function isEditable()
|
|
{
|
|
if($this->isGranted() || !$this->get('member_srl'))
|
|
{
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
function isSecret()
|
|
{
|
|
return $this->get('is_secret') == 'Y' ? TRUE : FALSE;
|
|
}
|
|
|
|
function isAccessible()
|
|
{
|
|
if($_SESSION['accessibled_comment'][$this->comment_srl])
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if($this->isGranted() || !$this->isSecret())
|
|
{
|
|
$this->setAccessible();
|
|
return TRUE;
|
|
}
|
|
|
|
$oDocumentModel = getModel('document');
|
|
$oDocument = $oDocumentModel->getDocument($this->get('document_srl'));
|
|
if($oDocument->isGranted())
|
|
{
|
|
$this->setAccessible();
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
function useNotify()
|
|
{
|
|
return $this->get('notify_message') == 'Y' ? TRUE : FALSE;
|
|
}
|
|
|
|
/**
|
|
* Notify to comment owner
|
|
* @return void
|
|
*/
|
|
function notify($type, $content)
|
|
{
|
|
// return if not useNotify
|
|
if(!$this->useNotify())
|
|
{
|
|
return;
|
|
}
|
|
|
|
// pass if the author is not logged-in user
|
|
if(!$this->get('member_srl'))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// return if the currently logged-in user is an author of the comment.
|
|
$logged_info = Context::get('logged_info');
|
|
if($logged_info->member_srl == $this->get('member_srl'))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// get where the comment belongs to
|
|
$oDocumentModel = getModel('document');
|
|
$oDocument = $oDocumentModel->getDocument($this->get('document_srl'));
|
|
|
|
// Variables
|
|
if($type)
|
|
{
|
|
$title = "[" . $type . "] ";
|
|
}
|
|
|
|
$title .= cut_str(strip_tags($content), 30, '...');
|
|
$content = sprintf('%s<br /><br />from : <a href="%s#comment_%s" target="_blank">%s</a>', $content, getFullUrl('', 'document_srl', $this->get('document_srl')), $this->get('comment_srl'), getFullUrl('', 'document_srl', $this->get('document_srl')));
|
|
$receiver_srl = $this->get('member_srl');
|
|
$sender_member_srl = $logged_info->member_srl;
|
|
|
|
// send a message
|
|
$oCommunicationController = getController('communication');
|
|
$oCommunicationController->sendMessage($sender_member_srl, $receiver_srl, $title, $content, FALSE);
|
|
}
|
|
|
|
function getIpAddress()
|
|
{
|
|
if($this->isGranted())
|
|
{
|
|
return $this->get('ipaddress');
|
|
}
|
|
|
|
return '*' . strstr($this->get('ipaddress'), '.');
|
|
}
|
|
|
|
function isExistsHomepage()
|
|
{
|
|
if(trim($this->get('homepage')))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
function getHomepageUrl()
|
|
{
|
|
$url = trim($this->get('homepage'));
|
|
if(!$url)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(strncasecmp('http://', $url, 7) !== 0)
|
|
{
|
|
$url = "http://" . $url;
|
|
}
|
|
|
|
return htmlspecialchars($url, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
|
}
|
|
|
|
function getMemberSrl()
|
|
{
|
|
return $this->get('member_srl');
|
|
}
|
|
|
|
function getUserID()
|
|
{
|
|
return htmlspecialchars($this->get('user_id'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
|
}
|
|
|
|
function getUserName()
|
|
{
|
|
return htmlspecialchars($this->get('user_name'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
|
}
|
|
|
|
function getNickName()
|
|
{
|
|
return htmlspecialchars($this->get('nick_name'), ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
|
}
|
|
|
|
/**
|
|
* Return content with htmlspecialchars
|
|
* @return string
|
|
*/
|
|
function getContentText($strlen = 0)
|
|
{
|
|
if($this->isSecret() && !$this->isAccessible())
|
|
{
|
|
return Context::getLang('msg_is_secret');
|
|
}
|
|
|
|
$content = $this->get('content');
|
|
|
|
if($strlen)
|
|
{
|
|
return cut_str(strip_tags($content), $strlen, '...');
|
|
}
|
|
|
|
return htmlspecialchars($content, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
|
|
}
|
|
|
|
/**
|
|
* Return content after filter
|
|
* @return string
|
|
*/
|
|
function getContent($add_popup_menu = TRUE, $add_content_info = TRUE, $add_xe_content_class = TRUE)
|
|
{
|
|
if($this->isSecret() && !$this->isAccessible())
|
|
{
|
|
return Context::getLang('msg_is_secret');
|
|
}
|
|
|
|
$content = $this->get('content');
|
|
stripEmbedTagForAdmin($content, $this->get('member_srl'));
|
|
|
|
// when displaying the comment on the pop-up menu
|
|
if($add_popup_menu && Context::get('is_logged'))
|
|
{
|
|
$content = sprintf(
|
|
'%s<div class="comment_popup_menu"><a href="#popup_menu_area" class="comment_%d" onclick="return false">%s</a></div>', $content, $this->comment_srl, Context::getLang('cmd_comment_do')
|
|
);
|
|
}
|
|
|
|
// if additional information which can access contents is set
|
|
if($add_content_info)
|
|
{
|
|
$memberSrl = $this->get('member_srl');
|
|
if($memberSrl < 0)
|
|
{
|
|
$memberSrl = 0;
|
|
}
|
|
$content = sprintf(
|
|
'<!--BeforeComment(%d,%d)--><div class="comment_%d_%d xe_content">%s</div><!--AfterComment(%d,%d)-->', $this->comment_srl, $memberSrl, $this->comment_srl, $memberSrl, $content, $this->comment_srl, $memberSrl
|
|
);
|
|
// xe_content class name should be specified although content access is not necessary.
|
|
}
|
|
else
|
|
{
|
|
if($add_xe_content_class)
|
|
{
|
|
$content = sprintf('<div class="xe_content">%s</div>', $content);
|
|
}
|
|
}
|
|
|
|
return $content;
|
|
}
|
|
|
|
/**
|
|
* Return summary content
|
|
* @return string
|
|
*/
|
|
function getSummary($str_size = 50, $tail = '...')
|
|
{
|
|
$content = $this->getContent(FALSE, FALSE);
|
|
|
|
// for newline, insert a blank.
|
|
$content = preg_replace('!(<br[\s]*/{0,1}>[\s]*)+!is', ' ', $content);
|
|
|
|
// replace tags such as </p> , </div> , </li> by blanks.
|
|
$content = str_replace(array('</p>', '</div>', '</li>', '-->'), ' ', $content);
|
|
|
|
// Remove tags
|
|
$content = preg_replace('!<([^>]*?)>!is', '', $content);
|
|
|
|
// replace < , >, "
|
|
$content = str_replace(array('<', '>', '"', ' '), array('<', '>', '"', ' '), $content);
|
|
|
|
// delete a series of blanks
|
|
$content = preg_replace('/ ( +)/is', ' ', $content);
|
|
|
|
// truncate strings
|
|
$content = trim(cut_str($content, $str_size, $tail));
|
|
|
|
// restore >, <, , "\
|
|
$content = str_replace(array('<', '>', '"'), array('<', '>', '"'), $content);
|
|
|
|
return $content;
|
|
}
|
|
|
|
function getRegdate($format = 'Y.m.d H:i:s')
|
|
{
|
|
return zdate($this->get('regdate'), $format);
|
|
}
|
|
|
|
function getRegdateTime()
|
|
{
|
|
$regdate = $this->get('regdate');
|
|
$year = substr($regdate, 0, 4);
|
|
$month = substr($regdate, 4, 2);
|
|
$day = substr($regdate, 6, 2);
|
|
$hour = substr($regdate, 8, 2);
|
|
$min = substr($regdate, 10, 2);
|
|
$sec = substr($regdate, 12, 2);
|
|
return mktime($hour, $min, $sec, $month, $day, $year);
|
|
}
|
|
|
|
function getRegdateGM()
|
|
{
|
|
return $this->getRegdate('D, d M Y H:i:s') . ' ' . $GLOBALS['_time_zone'];
|
|
}
|
|
|
|
function getUpdate($format = 'Y.m.d H:i:s')
|
|
{
|
|
return zdate($this->get('last_update'), $format);
|
|
}
|
|
|
|
function getPermanentUrl()
|
|
{
|
|
return getFullUrl('', 'document_srl', $this->get('document_srl')) . '#comment_' . $this->get('comment_srl');
|
|
}
|
|
|
|
function getUpdateTime()
|
|
{
|
|
$year = substr($this->get('last_update'), 0, 4);
|
|
$month = substr($this->get('last_update'), 4, 2);
|
|
$day = substr($this->get('last_update'), 6, 2);
|
|
$hour = substr($this->get('last_update'), 8, 2);
|
|
$min = substr($this->get('last_update'), 10, 2);
|
|
$sec = substr($this->get('last_update'), 12, 2);
|
|
return mktime($hour, $min, $sec, $month, $day, $year);
|
|
}
|
|
|
|
function getUpdateGM()
|
|
{
|
|
return gmdate("D, d M Y H:i:s", $this->getUpdateTime());
|
|
}
|
|
|
|
function hasUploadedFiles()
|
|
{
|
|
if(($this->isSecret() && !$this->isAccessible()) && !$this->isGranted())
|
|
{
|
|
return FALSE;
|
|
}
|
|
return $this->get('uploaded_count') ? TRUE : FALSE;
|
|
}
|
|
|
|
function getUploadedFiles()
|
|
{
|
|
if(($this->isSecret() && !$this->isAccessible()) && !$this->isGranted())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if(!$this->get('uploaded_count'))
|
|
{
|
|
return;
|
|
}
|
|
|
|
$oFileModel = getModel('file');
|
|
$file_list = $oFileModel->getFiles($this->comment_srl, array(), 'file_srl', TRUE);
|
|
return $file_list;
|
|
}
|
|
|
|
/**
|
|
* Return the editor html
|
|
* @return string
|
|
*/
|
|
function getEditor()
|
|
{
|
|
$module_srl = $this->get('module_srl');
|
|
if(!$module_srl)
|
|
{
|
|
$module_srl = Context::get('module_srl');
|
|
}
|
|
$oEditorModel = getModel('editor');
|
|
return $oEditorModel->getModuleEditor('comment', $module_srl, $this->comment_srl, 'comment_srl', 'content');
|
|
}
|
|
|
|
/**
|
|
* Return author's profile image
|
|
* @return object
|
|
*/
|
|
function getProfileImage()
|
|
{
|
|
if(!$this->isExists() || !$this->get('member_srl'))
|
|
{
|
|
return;
|
|
}
|
|
$oMemberModel = getModel('member');
|
|
$profile_info = $oMemberModel->getProfileImage($this->get('member_srl'));
|
|
if(!$profile_info)
|
|
{
|
|
return;
|
|
}
|
|
|
|
return $profile_info->src;
|
|
}
|
|
|
|
/**
|
|
* Return author's signiture
|
|
* @return string
|
|
*/
|
|
function getSignature()
|
|
{
|
|
// pass if the posting not exists.
|
|
if(!$this->isExists() || !$this->get('member_srl'))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// get the signiture information
|
|
$oMemberModel = getModel('member');
|
|
$signature = $oMemberModel->getSignature($this->get('member_srl'));
|
|
|
|
// check if max height of the signiture is specified on the member module
|
|
if(!isset($GLOBALS['__member_signature_max_height']))
|
|
{
|
|
$oModuleModel = getModel('module');
|
|
$member_config = $oModuleModel->getModuleConfig('member');
|
|
$GLOBALS['__member_signature_max_height'] = $member_config->signature_max_height;
|
|
}
|
|
|
|
$max_signature_height = $GLOBALS['__member_signature_max_height'];
|
|
|
|
if($max_signature_height)
|
|
{
|
|
$signature = sprintf('<div style="max-height:%dpx;overflow:auto;overflow-x:hidden;height:expression(this.scrollHeight > %d ? \'%dpx\': \'auto\')">%s</div>', $max_signature_height, $max_signature_height, $max_signature_height, $signature);
|
|
}
|
|
|
|
return $signature;
|
|
}
|
|
|
|
function thumbnailExists($width = 80, $height = 0, $type = '')
|
|
{
|
|
if(!$this->comment_srl)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if(!$this->getThumbnail($width, $height, $type))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
function getThumbnail($width = 80, $height = 0, $thumbnail_type = '')
|
|
{
|
|
// return false if no doc exists
|
|
if(!$this->comment_srl)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if($this->isSecret() && !$this->isGranted())
|
|
{
|
|
return;
|
|
}
|
|
|
|
// If signiture height setting is omitted, create a square
|
|
if(!$height)
|
|
{
|
|
$height = $width;
|
|
}
|
|
|
|
// return false if neigher attached file nor image;
|
|
if(!$this->hasUploadedFiles() && !preg_match("!<img!is", $this->get('content')))
|
|
{
|
|
return;
|
|
}
|
|
|
|
// get thumbail generation info on the doc module configuration.
|
|
if(!in_array($thumbnail_type, array('crop', 'ratio')))
|
|
{
|
|
$thumbnail_type = 'crop';
|
|
}
|
|
|
|
// Define thumbnail information
|
|
$thumbnail_path = sprintf('files/thumbnails/%s', getNumberingPath($this->comment_srl, 3));
|
|
$thumbnail_file = sprintf('%s%dx%d.%s.jpg', $thumbnail_path, $width, $height, $thumbnail_type);
|
|
$thumbnail_url = Context::getRequestUri() . $thumbnail_file;
|
|
|
|
// return false if a size of existing thumbnail file is 0. otherwise return the file path
|
|
if(file_exists($thumbnail_file))
|
|
{
|
|
if(filesize($thumbnail_file) < 1)
|
|
{
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
return $thumbnail_url;
|
|
}
|
|
}
|
|
|
|
// Target file
|
|
$source_file = NULL;
|
|
$is_tmp_file = FALSE;
|
|
|
|
// find an image file among attached files
|
|
if($this->hasUploadedFiles())
|
|
{
|
|
$file_list = $this->getUploadedFiles();
|
|
|
|
$first_image = null;
|
|
foreach($file_list as $file)
|
|
{
|
|
if($file->direct_download !== 'Y') continue;
|
|
|
|
if($file->cover_image === 'Y' && file_exists($file->uploaded_filename))
|
|
{
|
|
$source_file = $file->uploaded_filename;
|
|
break;
|
|
}
|
|
|
|
if($first_image) continue;
|
|
|
|
if(preg_match("/\.(jpe?g|png|gif|bmp)$/i", $file->source_filename))
|
|
{
|
|
if(file_exists($file->uploaded_filename))
|
|
{
|
|
$first_image = $file->uploaded_filename;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!$source_file && $first_image)
|
|
{
|
|
$source_file = $first_image;
|
|
}
|
|
}
|
|
|
|
// get an image file from the doc content if no file attached.
|
|
if(!$source_file)
|
|
{
|
|
$content = $this->get('content');
|
|
$target_src = NULL;
|
|
|
|
preg_match_all("!src=(\"|')([^\"' ]*?)(\"|')!is", $content, $matches, PREG_SET_ORDER);
|
|
|
|
$cnt = count($matches);
|
|
|
|
for($i = 0; $i < $cnt; $i++)
|
|
{
|
|
$target_src = $matches[$i][2];
|
|
if(preg_match('/\/(common|modules|widgets|addons|layouts)\//i', $target_src))
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
if(!preg_match('/^(http|https):\/\//i', $target_src))
|
|
{
|
|
$target_src = Context::getRequestUri() . $target_src;
|
|
}
|
|
|
|
$tmp_file = sprintf('./files/cache/tmp/%d', md5(rand(111111, 999999) . $this->comment_srl));
|
|
|
|
FileHandler::makeDir('./files/cache/tmp');
|
|
|
|
FileHandler::getRemoteFile($target_src, $tmp_file);
|
|
|
|
if(!file_exists($tmp_file))
|
|
{
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
list($_w, $_h, $_t, $_a) = @getimagesize($tmp_file);
|
|
|
|
if($_w < $width || $_h < $height)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
$source_file = $tmp_file;
|
|
$is_tmp_file = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$output = FileHandler::createImageFile($source_file, $thumbnail_file, $width, $height, 'jpg', $thumbnail_type);
|
|
|
|
if($is_tmp_file)
|
|
{
|
|
FileHandler::removeFile($source_file);
|
|
}
|
|
|
|
// return the thumbnail path if successfully generated.
|
|
if($output)
|
|
{
|
|
return $thumbnail_url;
|
|
}
|
|
|
|
// create an empty file not to attempt to generate the thumbnail afterwards
|
|
else
|
|
{
|
|
FileHandler::writeFile($thumbnail_file, '', 'w');
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
function isCarted()
|
|
{
|
|
return $_SESSION['comment_management'][$this->comment_srl];
|
|
}
|
|
|
|
}
|
|
/* End of file comment.item.php */
|
|
/* Location: ./modules/comment/comment.item.php */
|