Merge branch 'develop' into pr/session-class

This commit is contained in:
Kijin Sung 2016-10-05 17:26:12 +09:00
commit a1618c236f
60 changed files with 1564 additions and 195 deletions

View file

@ -713,7 +713,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('view.minify_scripts', $vars->minify_scripts ?: 'common');
Rhymix\Framework\Config::set('view.concat_scripts', $vars->concat_scripts ?: 'none');
Rhymix\Framework\Config::set('view.server_push', $vars->use_server_push === 'Y');
Rhymix\Framework\Config::set('view.gzip', $vars->use_gzip === 'Y');
Rhymix\Framework\Config::set('view.use_gzip', $vars->use_gzip === 'Y');
// Save
Rhymix\Framework\Config::save();
@ -737,6 +737,7 @@ class adminAdminController extends admin
Rhymix\Framework\Config::set('debug.log_slow_remote_requests', max(0, floatval($vars->debug_log_slow_remote_requests)));
Rhymix\Framework\Config::set('debug.display_type', strval($vars->debug_display_type) ?: 'comment');
Rhymix\Framework\Config::set('debug.display_to', strval($vars->debug_display_to) ?: 'admin');
Rhymix\Framework\Config::set('debug.write_error_log', strval($vars->debug_write_error_log) ?: 'fatal');
// Debug content
$debug_content = array_values($vars->debug_display_content);

View file

@ -538,7 +538,7 @@ class adminAdminView extends admin
Context::set('minify_scripts', Rhymix\Framework\Config::get('view.minify_scripts'));
Context::set('concat_scripts', Rhymix\Framework\Config::get('view.concat_scripts'));
Context::set('use_server_push', Rhymix\Framework\Config::get('view.server_push'));
Context::set('use_gzip', Rhymix\Framework\Config::get('view.gzip'));
Context::set('use_gzip', Rhymix\Framework\Config::get('view.use_gzip'));
$this->setTemplateFile('config_advanced');
}
@ -559,6 +559,7 @@ class adminAdminView extends admin
Context::set('debug_display_type', Rhymix\Framework\Config::get('debug.display_type'));
Context::set('debug_display_content', Rhymix\Framework\Config::get('debug.display_content'));
Context::set('debug_display_to', Rhymix\Framework\Config::get('debug.display_to'));
Context::set('debug_write_error_log', Rhymix\Framework\Config::get('debug.write_error_log'));
// IP access control
$allowed_ip = Rhymix\Framework\Config::get('debug.allow');

View file

@ -160,6 +160,10 @@ $lang->debug_display_to_admin = 'Administrator only';
$lang->debug_display_to_ip = 'Visitors from IP adresses listed below';
$lang->debug_display_to_everyone = 'Everyone';
$lang->debug_log_filename = 'Log filename';
$lang->debug_write_error_log = 'Write to Error Log';
$lang->debug_write_error_log_all = 'All errors';
$lang->debug_write_error_log_fatal = 'Fatal errors only';
$lang->debug_write_error_log_none = 'None';
$lang->about_debug_log_filename = 'YYYYMMDD in the filename will be replaced with the current date.<br>It is recommended to split the log file by date to prevent it from getting too large.';
$lang->msg_debug_log_filename_not_writable = 'Rhymix cannot write log files in the specified path.';
$lang->debug_allowed_ip = 'Allowed IP addresses';

View file

@ -155,6 +155,10 @@ $lang->debug_display_to_admin = '관리자에게만 표시';
$lang->debug_display_to_ip = '아래 IP의 방문자에게만 표시';
$lang->debug_display_to_everyone = '모두에게 표시';
$lang->debug_log_filename = '디버그 정보 기록 파일';
$lang->debug_write_error_log = '에러 로그에 기록';
$lang->debug_write_error_log_all = '모든 에러를 기록';
$lang->debug_write_error_log_fatal = '치명적인 에러만 기록';
$lang->debug_write_error_log_none = '기록하지 않음';
$lang->about_debug_log_filename = '파일명에 YYYYMMDD가 포함된 경우 날짜별로 파일을 분리하여 기록합니다.<br>파일을 분리하지 않으면 용량이 매우 커질 수 있으니 주의하십시오.';
$lang->msg_debug_log_filename_not_writable = '지정한 경로에 로그 파일을 작성할 수 없습니다.';
$lang->debug_allowed_ip = '디버그 허용 IP';

View file

@ -84,6 +84,14 @@
<textarea name="debug_allowed_ip" id="debug_allowed_ip" rows="4" cols="42" placeholder="{$remote_addr} ({$lang->local_ip_address})" style="margin-right:10px">{$debug_allowed_ip}</textarea>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="debug_log_slow_widgets">{$lang->debug_write_error_log}</label>
<div class="x_controls">
<label for="debug_write_error_log_all" class="x_inline"><input type="radio" name="debug_write_error_log" id="debug_write_error_log_all" value="all" checked="checked"|cond="$debug_write_error_log=='all'" /> {$lang->debug_write_error_log_all}</label>
<label for="debug_write_error_log_fatal" class="x_inline"><input type="radio" name="debug_write_error_log" id="debug_write_error_log_fatal" value="fatal" checked="checked"|cond="$debug_write_error_log=='fatal' || !$debug_write_error_log" /> {$lang->debug_write_error_log_fatal}</label>
<label for="debug_write_error_log_none" class="x_inline"><input type="radio" name="debug_write_error_log" id="debug_write_error_log_none" value="none" checked="checked"|cond="$debug_write_error_log=='none'" /> {$lang->debug_write_error_log_none}</label>
</div>
</div>
<div class="x_clearfix btnArea">
<div class="x_pull-right">
<button type="submit" class="x_btn x_btn-primary">{$lang->cmd_save}</button>

View file

@ -38,7 +38,7 @@
<label for="default_lang" class="x_control-label">{$lang->default_lang}</label>
<div class="x_controls">
<select name="default_lang" id="default_lang">
<option value="{$key}" loop="$enabled_lang=>$key" selected="selected"|cond="$key==$default_lang">{$supported_lang[$key]}</option>
<option value="{$key}" loop="$enabled_lang=>$key" selected="selected"|cond="$key==$default_lang">{$supported_lang[$key]['name']}</option>
</select>
</div>
</div>

View file

@ -32,6 +32,10 @@ class board extends ModuleObject
$ssl_actions = array('dispBoardWrite', 'dispBoardWriteComment', 'dispBoardReplyComment', 'dispBoardModifyComment', 'dispBoardDelete', 'dispBoardDeleteComment', 'procBoardInsertDocument', 'procBoardDeleteDocument', 'procBoardInsertComment', 'procBoardDeleteComment', 'procBoardVerificationPassword');
Context::addSSLActions($ssl_actions);
}
if(!Context::isExistsSSLAction('dispTempSavedList') && Context::getSslStatus() == 'optional')
{
Context::addSSLAction('dispTempSavedList');
}
}
/**

View file

@ -297,10 +297,13 @@ class boardController extends board
if($this->module_info->trash_use == 'Y')
{
// move the trash
$output = $oDocumentController->moveDocumentToTrash($oDocument);
if(!$output->toBool())
if($oDocument->isGranted() === true)
{
return $output;
$output = $oDocumentController->moveDocumentToTrash($oDocument);
if(!$output->toBool())
{
return $output;
}
}
}
else

View file

@ -13,7 +13,7 @@ class boardMobile extends boardView
if($this->module_info->list_count) $this->list_count = $this->module_info->list_count;
if($this->module_info->mobile_list_count) $this->list_count = $this->module_info->mobile_list_count;
if($this->module_info->search_list_count) $this->search_list_count = $this->module_info->search_list_count;
if($this->module_info->mobile_search_list_count) $this->list_count = $this->module_info->mobile_search_list_count;
if($this->module_info->mobile_search_list_count) $this->search_list_count = $this->module_info->mobile_search_list_count;
if($this->module_info->page_count) $this->page_count = $this->module_info->page_count;
if($this->module_info->mobile_page_count) $this->page_count = $this->module_info->mobile_page_count;
$this->except_notice = $this->module_info->except_notice == 'N' ? false : true;

View file

@ -323,7 +323,7 @@ class boardView extends board
Context::setBrowserTitle($seo_title, array(
'site_title' => Context::getSiteTitle(),
'site_subtitle' => Context::getSiteSubtitle(),
'subpage_title' => $module_info->browser_title,
'subpage_title' => $this->module_info->browser_title,
'document_title' => $oDocument->getTitleText(),
'page' => Context::get('page') ?: 1,
));

View file

@ -1272,7 +1272,7 @@ class commentController extends comment
$member_srl = $oMemberModel->getLoggedMemberSrl();
// session registered if the author information matches to the current logged-in user's.
if($member_srl && $member_srl == $oComment->get('member_srl'))
if($member_srl && $member_srl == abs($oComment->get('member_srl')))
{
$_SESSION['voted_comment'][$comment_srl] = false;
return new Object(-1, $failed_voted);
@ -1405,7 +1405,7 @@ class commentController extends comment
$member_srl = $oMemberModel->getLoggedMemberSrl();
// session registered if the author information matches to the current logged-in user's.
if($member_srl && $member_srl == $oComment->get('member_srl'))
if($member_srl && $member_srl == abs($oComment->get('member_srl')))
{
$_SESSION['declared_comment'][$comment_srl] = TRUE;
return new Object(-1, 'failed_declared');

View file

@ -211,10 +211,6 @@ class commentModel extends comment
$oComment = NULL;
$oComment = new commentItem();
$oComment->setAttribute($attribute);
if($is_admin)
{
$oComment->setGrant();
}
$result[$attribute->comment_srl] = $oComment;
}

View file

@ -951,7 +951,6 @@ class documentController extends document
return new Object(-1, 'msg_admin_document_no_move_to_trash');
}
$trash_args->module_srl = $oDocument->get('module_srl');
$obj->module_srl = $oDocument->get('module_srl');
// Cannot throw data from the trash to the trash
@ -1300,7 +1299,7 @@ class documentController extends document
if($oDocument->get('member_srl'))
{
// Pass after registering a session if author's information is same as the currently logged-in user's.
if($member_srl && $member_srl == $oDocument->get('member_srl'))
if($member_srl && $member_srl == abs($oDocument->get('member_srl')))
{
$_SESSION['voted_document'][$document_srl] = false;
return new Object(-1, $failed_voted);
@ -1437,7 +1436,7 @@ class documentController extends document
$oMemberModel = getModel('member');
$member_srl = $oMemberModel->getLoggedMemberSrl();
// Pass after registering a session if author's information is same as the currently logged-in user's.
if($member_srl && $member_srl == $oDocument->get('member_srl'))
if($member_srl && $member_srl == abs($oDocument->get('member_srl')))
{
$_SESSION['declared_document'][$document_srl] = true;
return new Object(-1, 'failed_declared');

View file

@ -20,6 +20,11 @@ class documentItem extends Object
* @var string
*/
var $lang_code = null;
/**
* grant
* @var bool
*/
var $grant_cache = null;
/**
* Status of allow trackback
* @var bool
@ -157,25 +162,44 @@ class documentItem extends Object
function isGranted()
{
if($_SESSION['own_document'][$this->document_srl]) return true;
if(!Context::get('is_logged')) return false;
if ($_SESSION['own_document'][$this->document_srl])
{
return $this->grant_cache = true;
}
if ($this->grant_cache !== null)
{
return $this->grant_cache;
}
$logged_info = Context::get('logged_info');
if($logged_info->is_admin == 'Y') return true;
if (!$logged_info->member_srl)
{
return $this->grant_cache = false;
}
if ($logged_info->is_admin == 'Y')
{
return $this->grant_cache = true;
}
if ($this->get('member_srl') && abs($this->get('member_srl')) == $logged_info->member_srl)
{
return $this->grant_cache = true;
}
$oModuleModel = getModel('module');
$grant = $oModuleModel->getGrant($oModuleModel->getModuleInfoByModuleSrl($this->get('module_srl')), $logged_info);
if($grant->manager) return true;
if ($grant->manager)
{
return $this->grant_cache = 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;
return $this->grant_cache = false;
}
function setGrant()
{
$_SESSION['own_document'][$this->document_srl] = true;
$this->grant_cache = true;
}
function isAccessible()
@ -914,7 +938,7 @@ class documentItem extends Object
$source_file = null;
$is_tmp_file = false;
// Find an iamge file among attached files if exists
// Find an image file among attached files if exists
if($this->hasUploadedFiles())
{
$file_list = $this->getUploadedFiles();

View file

@ -221,10 +221,29 @@ class documentModel extends document
$sort_check = $this->_setSortIndex($obj, $load_extra_vars);
$obj->sort_index = $sort_check->sort_index;
$obj->isExtraVars = $sort_check->isExtraVars;
unset($obj->use_alternate_output);
$this->_setSearchOption($obj, $args, $query_id, $use_division);
// Call trigger (before)
// This trigger can be used to set an alternative output using a different search method
$output = ModuleHandler::triggerCall('document.getDocumentList', 'before', $obj);
if($output instanceof Object && !$output->toBool())
{
return $output;
}
if ($sort_check->isExtraVars && substr_count($obj->search_target,'extra_vars'))
// If an alternate output is set, use it instead of running the default queries
$use_alternate_otuput = (isset($obj->use_alternate_output) && $obj->use_alternate_output instanceof Object);
if (!$use_alternate_otuput)
{
$this->_setSearchOption($obj, $args, $query_id, $use_division);
}
if ($use_alternate_otuput)
{
$output = $obj->use_alternate_output;
unset($obj->use_alternate_output);
}
elseif ($sort_check->isExtraVars && substr_count($obj->search_target,'extra_vars'))
{
$query_id = 'document.getDocumentListWithinExtraVarsExtraSort';
$args->sort_index = str_replace('documents.','',$args->sort_index);
@ -319,6 +338,9 @@ class documentModel extends document
}
}
// Call trigger (after)
// This trigger can be used to modify search results
ModuleHandler::triggerCall('document.getDocumentList', 'after', $output);
return $output;
}

View file

@ -164,6 +164,18 @@ class editorAdminController extends editor
$config->font_defined = $configVars->font_defined = 'N';
$config->content_font = $configVars->content_font;
}
if ($configVars->additional_css)
{
$additional_css = array_map('trim', explode("\n", $configVars->additional_css));
$additional_css = array_filter($additional_css, function($str) { return !empty($str); });
$config->additional_css = $additional_css;
}
else
{
$config->additional_css = array();
}
$config->content_font_size = trim($configVars->content_font_size);
$config->content_font_size = ctype_digit($config->content_font_size) ? ($config->content_font_size . 'px') : $config->content_font_size;
$config->content_line_height = trim($configVars->content_line_height);

View file

@ -87,6 +87,7 @@ class editorAdminView extends editor
$option->content_line_height = $config->content_line_height;
$option->content_paragraph_spacing = $config->content_paragraph_spacing;
$option->content_word_break = $config->content_word_break;
$option->additional_css = $config->additional_css ?: array();
$option->enable_autosave = false;
$option->enable_default_component = true;
$option->enable_component = true;
@ -108,6 +109,7 @@ class editorAdminView extends editor
$option_com->content_line_height = $config->content_line_height;
$option_com->content_paragraph_spacing = $config->content_paragraph_spacing;
$option_com->content_word_break = $config->content_word_break;
$option_com->additional_css = $config->additional_css ?: array();
$option_com->enable_autosave = false;
$option_com->enable_default_component = true;
$option_com->enable_component = true;
@ -130,6 +132,11 @@ class editorAdminView extends editor
Context::set('component_list', $component_list);
Context::set('component_count', $component_count);
Context::set('editor_config_default', $editor_config_default);
foreach ($config->additional_css as $additional_css_url)
{
Context::loadFile(array($additional_css_url));
}
$security = new Security();
$security->encodeHTML('component_list....');

View file

@ -107,6 +107,10 @@ class editorModel extends editor
{
$editor_config->comment_content_style = ($editor_default_config->comment_content_style) ? $editor_default_config->comment_content_style : 'ckeditor_light';
}
if((!$editor_config->additional_css && $editor_default_config->additional_css) || $editor_config->default_editor_settings === 'Y')
{
$editor_config->additional_css = $editor_default_config->additional_css ?: array();
}
return $editor_config;
}
@ -235,6 +239,7 @@ class editorModel extends editor
Context::set('content_line_height', $option->content_line_height);
Context::set('content_paragraph_spacing', $option->content_paragraph_spacing);
Context::set('content_word_break', $option->content_word_break);
Context::set('editor_additional_css', $option->additional_css);
// Option setting to allow auto-save
if(!$option->enable_autosave) $enable_autosave = false;
@ -404,6 +409,7 @@ class editorModel extends editor
$config->enable_html_grant = $editor_config->enable_html_grant;
$config->editor_height = $editor_config->editor_height;
$config->enable_autosave = $editor_config->enable_autosave;
$config->additional_css = $editor_config->additional_css;
}
else
{
@ -421,6 +427,7 @@ class editorModel extends editor
$config->enable_html_grant = $editor_config->enable_comment_html_grant;
$config->editor_height = $editor_config->comment_editor_height;
$config->enable_autosave = 'N';
$config->additional_css = $editor_config->additional_css;
}
// Check a group_list of the currently logged-in user for permission check
if(Context::get('is_logged'))
@ -442,6 +449,7 @@ class editorModel extends editor
$option->content_line_height = $config->content_line_height;
$option->content_paragraph_spacing = $config->content_paragraph_spacing;
$option->content_word_break = $config->content_word_break;
$option->additional_css = $config->additional_css;
$option->colorset = $config->sel_editor_colorset;
// Permission check for file upload
$option->allow_fileupload = false;

View file

@ -7,6 +7,8 @@ $lang->guide_choose_main_editor = 'Main editor';
$lang->guide_set_height_main_editor = 'Main editor height';
$lang->guide_choose_comment_editor = 'Comment editor';
$lang->guide_set_height_comment_editor = 'Comment editor height';
$lang->guide_additional_css = 'Additional CSS Files';
$lang->about_additional_css = 'To load additional CSS files inside the editor, such as web fonts, please enter one URL per line.';
$lang->guide_choose_text_formatting = 'Text formatting style';
$lang->guide_choose_font_preview = 'Preview';
$lang->guide_choose_font_body = 'Default font';

View file

@ -8,6 +8,8 @@ $lang->guide_choose_main_editor = '본문 에디터';
$lang->guide_set_height_main_editor = '본문 에디터 높이';
$lang->guide_choose_comment_editor = '댓글 에디터';
$lang->guide_set_height_comment_editor = '댓글 에디터 높이';
$lang->guide_additional_css = 'CSS 파일 추가';
$lang->about_additional_css = '웹폰트 등의 CSS를 에디터 내부에서 추가로 로딩하려면 한 줄에 하나씩 URL을 입력해 주십시오.';
$lang->guide_choose_text_formatting = '본문 서식';
$lang->guide_choose_font_preview = '미리보기';
$lang->guide_choose_font_body = '본문 글꼴';

13
modules/editor/skins/ckeditor/editor.html Executable file → Normal file
View file

@ -12,6 +12,11 @@
var auto_saved_msg = "{$lang->msg_auto_saved}";
</script>
{@ $css_file_list = array(Context::getRequestUri() . $content_style_path . '/editor.css?' . date("YmdHis", @filemtime($content_style_path."/editor.css")))}
<!--@foreach($editor_additional_css as $additional_css_url)-->
{@ $css_file_list[] = $additional_css_url}
<!--@endforeach-->
{@ $css_content = null }
<!--@if($content_font || $content_font_size)-->
{@ $css_content .= ' .xe_content.editable { '}
@ -31,7 +36,7 @@ var auto_saved_msg = "{$lang->msg_auto_saved}";
<input type="hidden" name="_saved_doc_message" value="{$lang->msg_load_saved_doc}" />
<!--@end-->
<div id="ckeditor_instance_{$editor_sequence}" data-editor-sequence="{$editor_sequence}" data-editor-primary-key-name="{$editor_primary_key_name}" data-editor-content-key-name="{$editor_content_key_name}" style="min-height:{$editor_height}px;"></div>
<div id="ckeditor_instance_{$editor_sequence}" data-editor-sequence="{$editor_sequence}" data-editor-primary-key-name="{$editor_primary_key_name}" data-editor-content-key-name="{$editor_content_key_name}" style="min-height:{$m ? 160 : $editor_height}px;"></div>
<p cond="$enable_autosave" class="editor_autosaved_message autosave_message" id="editor_autosaved_message_{$editor_sequence}">&nbsp;</p>
@ -86,9 +91,9 @@ var auto_saved_msg = "{$lang->msg_auto_saved}";
var settings = {
ckeconfig: {
height: '{$editor_height}',
height: '{$m ? 160 : $editor_height}',
skin: '{$colorset}',
contentsCss: '{$content_style_path}/editor.css?{date("YmdHis", @filemtime($content_style_path."/editor.css"))}',
contentsCss: {json_encode($css_file_list)},
xe_editor_sequence: {$editor_sequence},
font_defaultLabel: default_font_name,
font_names: font_list,
@ -121,7 +126,7 @@ var auto_saved_msg = "{$lang->msg_auto_saved}";
settings.loadXeComponent = false;
<!--@endif-->
<!--@if($module_type === 'comment'||Mobile::isMobileCheckByAgent())-->
<!--@if($module_type === 'comment' || $m)-->
settings.ckeconfig.toolbarStartupExpanded = false;
<!--@endif-->

View file

@ -113,6 +113,13 @@
</label>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label">{$lang->guide_additional_css}</label>
<div class="x_controls">
<textarea id="additional_css" name="additional_css" style="width:90%" rows="4" cols="42">{escape(implode("\n", $editor_config->additional_css ?: array()))}</textarea>
<p class="x_help-block">{$lang->about_additional_css}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="font_size">{$lang->guide_choose_font_size_body}</label>
<div class="x_controls">

View file

@ -175,7 +175,12 @@ class fileModel extends file
if(!$config->allow_outlink) $config->allow_outlink = 'Y';
if(!$config->download_grant) $config->download_grant = array();
$size = preg_replace('/[a-z]/is', '', ini_get('upload_max_filesize'));
$size = ini_get('upload_max_filesize');
$unit = strtolower($size[strlen($size) - 1]);
$size = (float)$size;
if($unit == 'g') $size *= 1024;
if($unit == 'k') $size /= 1024;
if($config->allowed_filesize > $size)
{
$config->allowed_filesize = $size;

View file

@ -948,6 +948,7 @@ class memberModel extends member
if(file_exists($image_mark_file))
{
list($width, $height, $type, $attrs) = getimagesize($image_mark_file);
$info = new stdClass;
$info->width = $width;
$info->height = $height;
$info->src = Context::getRequestUri().$image_mark_file . '?' . date('YmdHis', filemtime($image_mark_file));

View file

@ -131,7 +131,7 @@
<!--@end-->
</select>
<select name="search_target" style="margin-right:4px" title="{$lang->search_target}">
{@$lang->search_target_list = array_merge($usedIdentifiers, $lang->search_target_list->getArrayCopy())}
{@ $lang->search_target_list = array_merge($usedIdentifiers, lang('member.search_target_list')->getArrayCopy())}
<option value="{$key}" loop="$lang->search_target_list=>$key,$val" selected="selected"|cond="$search_target==$key">{$val}</option>
</select>
<input type="search" name="search_keyword" value="{htmlspecialchars($search_keyword, ENT_COMPAT | ENT_HTML401, 'UTF-8', false)}" style="width:140px">

View file

@ -1601,25 +1601,23 @@ class menuAdminController extends menu
$oModuleModel = getModel('module');
//$info = $oModuleModel->getModuleInfoXml($moduleName);
$info = $oModuleModel->getModuleActionXml($moduleName);
$url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->menu->{$menuName}->index);
if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin', 'act', $info->admin_index_act);
if(empty($url)) $url = getNotEncodedFullUrl('', 'module', 'admin');
$args = new stdClass();
$args->url = 'index.php?module=admin';
if($info->menu->{$menuName}->index)
{
$args->url .= '&act=' . $info->menu->{$menuName}->index;
}
else if($info->admin_index_act)
{
$args->url .= '&act=' . $info->admin_index_act;
}
$args->menu_item_srl = (!$requestArgs->menu_item_srl) ? getNextSequence() : $requestArgs->menu_item_srl;
$args->parent_srl = $requestArgs->parent_srl;
$args->menu_srl = $requestArgs->menu_srl;
$args->name = sprintf('{$lang->menu_gnb_sub[\'%s\']}', $menuName);
//if now page is https...
if(strpos($url, 'https') !== false)
{
$args->url = str_replace('https'.substr(Context::getDefaultUrl(), 4), '', $url);
}
else
{
$args->url = str_replace(Context::getDefaultUrl(), '', $url);
}
$args->open_window = 'N';
$args->expand = 'N';
$args->normal_btn = '';

View file

@ -352,6 +352,8 @@ class moduleAdminController extends module
if(!$output->toBool()) return $output;
}
}
Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl");
$this->setMessage('success_registed');
}
@ -632,7 +634,10 @@ class moduleAdminController extends module
}
}
}
Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl");
$this->setMessage('success_registed');
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON')))
{
if(Context::get('success_return_url'))

View file

@ -827,6 +827,7 @@ class moduleController extends module
$output = executeQueryArray('module.insertSiteAdmin', $args);
if(!$output->toBool()) return $output;
}
Rhymix\Framework\Cache::delete("site_and_module:site_admins:$site_srl");
return new Object();
}
@ -842,8 +843,11 @@ class moduleController extends module
$member_info = $oMemberModel->getMemberInfoByEmailAddress($admin_id);
else
$member_info = $oMemberModel->getMemberInfoByUserID($admin_id);
if(!$member_info->member_srl) return;
Rhymix\Framework\Cache::delete("site_and_module:module_admins:$module_srl");
$args = new stdClass();
$args->module_srl = $module_srl;
$args->member_srl = $member_info->member_srl;
@ -864,6 +868,9 @@ class moduleController extends module
$member_info = $oMemberModel->getMemberInfoByUserID($admin_id);
if($member_info->member_srl) $args->member_srl = $member_info->member_srl;
}
Rhymix\Framework\Cache::delete("site_and_module:module_admins:$module_srl");
return executeQuery('module.deleteAdminId', $args);
}
@ -1046,6 +1053,8 @@ class moduleController extends module
executeQuery('module.insertModuleGrant', $args);
}
}
Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl");
}
/**
@ -1055,7 +1064,10 @@ class moduleController extends module
{
$args = new stdClass();
$args->module_srl = $module_srl;
return executeQuery('module.deleteModuleGrants', $args);
$output = executeQuery('module.deleteModuleGrants', $args);
Rhymix\Framework\Cache::delete("site_and_module:module_grants:$module_srl");
return $output;
}
/**

View file

@ -1594,25 +1594,36 @@ class moduleModel extends module
*/
function isSiteAdmin($member_info, $site_srl = null)
{
if(!$member_info->member_srl) return false;
if($member_info->is_admin == 'Y') return true;
$args = new stdClass();
if(!isset($site_srl))
if (!$member_info || !$member_info->member_srl)
{
return false;
}
if ($member_info->is_admin == 'Y')
{
return true;
}
if ($site_srl === null)
{
$site_module_info = Context::get('site_module_info');
if(!$site_module_info) return;
$args->site_srl = $site_module_info->site_srl;
if(!$site_module_info) return false;
$site_srl = $site_module_info->site_srl;
}
else
$site_srl = $site_srl ?: 0;
$site_admins = Rhymix\Framework\Cache::get("site_and_module:site_admins:$site_srl");
if ($site_admins === null)
{
$args = new stdClass;
$args->site_srl = $site_srl;
$output = executeQueryArray('module.isSiteAdmin', $args);
$site_admins = array();
foreach ($output->data as $site_admin)
{
$site_admins[$site_admin->member_srl] = true;
}
Rhymix\Framework\Cache::set("site_and_module:site_admins:$site_srl", $site_admins, 0, true);
}
$args->member_srl = $member_info->member_srl;
$output = executeQuery('module.isSiteAdmin', $args);
if($output->data->member_srl == $args->member_srl) return true;
return false;
return isset($site_admins[$member_info->member_srl]);
}
/**
@ -1626,6 +1637,43 @@ class moduleModel extends module
return $output->data;
}
/**
* @brief Check if a member is a module administrator
*/
function isModuleAdmin($member_info, $module_srl = null)
{
if (!$member_info || !$member_info->member_srl)
{
return false;
}
if ($member_info->is_admin == 'Y')
{
return true;
}
if ($module_srl === null)
{
$site_module_info = Context::get('site_module_info');
if(!$site_module_info) return false;
$module_srl = $site_module_info->module_srl;
}
$module_srl = $module_srl ?: 0;
$module_admins = Rhymix\Framework\Cache::get("site_and_module:module_admins:$module_srl");
if ($module_admins === null)
{
$args = new stdClass;
$args->module_srl = $module_srl;
$output = executeQueryArray('module.getModuleAdmin', $args);
$module_admins = array();
foreach ($output->data as $module_admin)
{
$module_admins[$module_admin->member_srl] = true;
}
Rhymix\Framework\Cache::set("site_and_module:module_admins:$module_srl", $module_admins, 0, true);
}
return isset($module_admins[$member_info->member_srl]);
}
/**
* @brief Get admin ID of the module
*/
@ -1862,13 +1910,18 @@ class moduleModel extends module
*/
function getGrant($module_info, $member_info, $xml_info = '')
{
if (!$xml_info && isset($GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)]))
{
return $GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)];
}
$grant = new stdClass();
if(!$xml_info)
{
$module = $module_info->module;
$xml_info = $this->getModuleActionXml($module);
}
// Set variables to grant group permission
$module_srl = $module_info->module_srl;
$grant_info = $xml_info->grant;
@ -1898,15 +1951,13 @@ class moduleModel extends module
// Get a type of granted permission
$grant->access = $grant->manager = $grant->is_site_admin = ($member_info->is_admin=='Y'||$this->isSiteAdmin($member_info, $module_info->site_srl))?true:false;
$grant->is_admin = ($member_info->is_admin == 'Y') ? true : false;
// If a just logged-in member is, check if the member is a module administrator
if(!$grant->manager && $member_info->member_srl)
if (!$grant->manager && $member_info->member_srl && $this->isModuleAdmin($member_info, $module_srl))
{
$args = new stdClass();
$args->module_srl = $module_srl;
$args->member_srl = $member_info->member_srl;
$output = executeQuery('module.getModuleAdmin',$args);
if($output->data && $output->data->member_srl == $member_info->member_srl) $grant->manager = true;
$grant->manager = true;
}
// If not an administrator, get information from the DB and grant manager privilege.
if(!$grant->manager)
{
@ -1918,9 +1969,7 @@ class moduleModel extends module
}
else
{
$args = new stdClass;
$args->module_srl = $module_srl;
$output = executeQueryArray('module.getModuleGrants', $args);
$output = $this->getModuleGrants($module_srl);
}
$grant_exists = $granted = array();
@ -2014,9 +2063,28 @@ class moduleModel extends module
}
}
}
$GLOBALS['__MODULE_GRANT__'][intval($module_info->module_srl)][intval($member_info->member_srl)] = $grant;
return $grant;
}
/**
* @brief Get module grants
*/
function getModuleGrants($module_srl)
{
$output = Rhymix\Framework\Cache::get("site_and_module:module_grants:$module_srl");
if ($output === null)
{
$args = new stdClass;
$args->module_srl = $module_srl;
$output = executeQueryArray('module.getModuleGrants', $args);
Rhymix\Framework\Cache::set("site_and_module:module_grants:$module_srl", $output, 0, true);
}
return $output;
}
function getModuleFileBox($module_filebox_srl)
{
$args = new stdClass();

View file

@ -3,7 +3,7 @@
<table name="module_admins" />
</tables>
<conditions>
<condition operation="equal" column="module_srl" var="module_srl" notnull="notnull" filter="number" />
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="module_srl" var="module_srl" filter="number" />
<condition operation="equal" column="member_srl" var="member_srl" pipe="and" />
</conditions>
</query>

View file

@ -12,4 +12,11 @@
<condition operation="equal" column="called_method" var="called_method" pipe="and" />
<condition operation="equal" column="called_position" var="called_position" pipe="and" />
</conditions>
<navigation>
<index default="trigger_name" order="asc" />
<index default="called_position" order="asc" />
<index default="module" order="asc" />
<index default="type" order="asc" />
<index default="called_method" order="asc" />
</navigation>
</query>

View file

@ -9,4 +9,11 @@
<condition operation="equal" column="trigger_name" var="trigger_name" />
<condition operation="equal" column="called_position" var="called_position" pipe="and" />
</conditions>
<navigation>
<index default="trigger_name" order="asc" />
<index default="called_position" order="asc" />
<index default="module" order="asc" />
<index default="type" order="asc" />
<index default="called_method" order="asc" />
</navigation>
</query>

View file

@ -6,7 +6,7 @@
<column name="member_srl" />
</columns>
<conditions>
<condition operation="equal" column="site_srl" var="site_srl" notnull="notnull" />
<condition operation="equal" column="member_srl" var="member_srl" notnull="notnull" pipe="and" />
<condition operation="equal" column="site_srl" var="site_srl" filter="number" />
<condition operation="equal" column="member_srl" var="member_srl" pipe="and" />
</conditions>
</query>

View file

@ -4,8 +4,8 @@
<title xml:lang="en">Notification Center Lite</title>
<description xml:lang="ko">사이트 사용자간의 커뮤니케이션에 대한 정보를 알려주는 모듈입니다.</description>
<description xml:lang="en">This module notify users of information about new documents, comments and/or messages that call them. This module will enhance communication beween site users.</description>
<version>3.0.0</version>
<date>2016-04-17</date>
<version>3.1</version>
<date>2016-09-10</date>
<category>content</category>
<author link="http://github.com/xe-public">
<name xml:lang="ko">XE Public</name>

View file

@ -63,6 +63,10 @@ class ncenterliteController extends ncenterlite
{
return $output;
}
else
{
self::removeFlagFile($args->member_srl);
}
return new Object();
}
@ -411,9 +415,30 @@ class ncenterliteController extends ncenterlite
return new Object();
}
$notify_list = $oNcenterliteModel->getNotifyMemberSrlByCommentSrl($obj->comment_srl);
// 대댓글의 대댓글일 경우 혹은 중복적으로 받는 경우 comment_srl 당 2개이상 notify가 생성될 수 있다.
$member_srls = array();
foreach($notify_list as $value)
{
if(!in_array($value->member_srl, $member_srls))
{
$member_srls[] = $value->member_srl;
}
}
$args = new stdClass();
$args->srl = $obj->comment_srl;
$output = executeQuery('ncenterlite.deleteNotifyBySrl', $args);
if($output->toBool())
{
foreach($member_srls as $member_srl)
{
//Remove flag files
self::removeFlagFile($member_srl);
}
}
return new Object();
}
@ -429,12 +454,27 @@ class ncenterliteController extends ncenterlite
$args = new stdClass();
$args->srl = $obj->document_srl;
$output = executeQuery('ncenterlite.deleteNotifyBySrl', $args);
if(!$output->toBool())
{
return $output;
}
return new Object();
}
function triggerAfterMoveToTrash(&$obj)
{
$oNcenterliteModel = getModel('ncenterlite');
$notify_list = $oNcenterliteModel->getNotifyListByDocumentSrl($obj->document_srl);
$member_srls = array();
foreach($notify_list as $value)
{
if(!in_array($value->member_srl, $member_srls))
{
$member_srls[] = $value->member_srl;
}
}
$config = $oNcenterliteModel->getConfig();
if(empty($config->use))
@ -445,6 +485,14 @@ class ncenterliteController extends ncenterlite
$args = new stdClass();
$args->srl = $obj->document_srl;
$output = executeQuery('ncenterlite.deleteNotifyBySrl', $args);
if($output->toBool())
{
foreach($member_srls as $member_srl)
{
//Remove flag files
self::removeFlagFile($member_srl);
}
}
return new Object();
}
@ -489,6 +537,11 @@ class ncenterliteController extends ncenterlite
$args->target_srl = $comment_srl;
$args->member_srl = $logged_info->member_srl;
$output_update = executeQuery('ncenterlite.updateNotifyReadedByTargetSrl', $args);
if($output_update->toBool())
{
//Remove flag files
self::removeFlagFile($args->member_srl);
}
}
}
else if($oModule->act == 'dispBoardContent')
@ -498,11 +551,20 @@ class ncenterliteController extends ncenterlite
$oDocument = Context::get('oDocument');
$logged_info = Context::get('logged_info');
if($document_srl && $logged_info && $config->document_read == 'Y')
if($document_srl && Context::get('is_logged') && $config->document_read == 'Y')
{
$args->srl = $document_srl;
$args->member_srl = $logged_info->member_srl;
$outputs = executeQuery('ncenterlite.updateNotifyReadedBySrl', $args);
$notify_count = getModel('ncenterlite')->_getNewCount();
if($notify_count)
{
$args->srl = $document_srl;
$args->member_srl = $logged_info->member_srl;
$outputs = executeQuery('ncenterlite.updateNotifyReadedBySrl', $args);
if($outputs->toBool())
{
//Remove flag files
self::removeFlagFile($args->member_srl);
}
}
}
if($comment_srl && $document_srl && $oDocument)
@ -513,7 +575,6 @@ class ncenterliteController extends ncenterlite
if(array_key_exists($comment_srl, $_comment_list))
{
$url = getNotEncodedUrl('_comment_srl', '') . '#comment_' . $comment_srl;
$need_check_socialxe = true;
}
else
{
@ -521,7 +582,6 @@ class ncenterliteController extends ncenterlite
if($cpage > 1)
{
$url = getNotEncodedUrl('cpage', $cpage - 1) . '#comment_' . $comment_srl;
$need_check_socialxe = true;
}
else
{
@ -529,35 +589,6 @@ class ncenterliteController extends ncenterlite
}
}
if($need_check_socialxe)
{
$oDB = &DB::getInstance();
if($oDB->isTableExists('socialxe'))
{
$args = new stdClass();
$oModuleModel = getModel('module');
$module_info = $oModuleModel->getModuleInfoByDocumentSrl($document_srl);
$args->module_srl = $module_info->module_srl;
$output = executeQuery('ncenterlite.getSocialxeCount', $args);
if($output->data->cnt)
{
$socialxe_comment_srl = $comment_srl;
$args = new stdClass();
$args->comment_srl = $comment_srl;
$oCommentModel = getModel('comment');
$oComment = $oCommentModel->getComment($comment_srl);
$parent_srl = $oComment->get('parent_srl');
if($parent_srl)
{
$socialxe_comment_srl = $parent_srl;
}
$url = getNotEncodedUrl('_comment_srl', '', 'cpage', '', 'comment_srl', $socialxe_comment_srl) . '#comment_' . $comment_srl;
}
}
}
$url = str_replace('&amp;', '&', $url);
header('location: ' . $url);
Context::close();
@ -574,7 +605,12 @@ class ncenterliteController extends ncenterlite
$args = new stdClass();
$args->target_srl = $message_srl;
$args->member_srl = $logged_info->member_srl;
executeQuery('ncenterlite.updateNotifyReadedByTargetSrl', $args);
$update_output = executeQuery('ncenterlite.updateNotifyReadedByTargetSrl', $args);
if($update_output->toBool())
{
//Remove flag files
self::removeFlagFile($args->member_srl);
}
}
}
@ -631,6 +667,11 @@ class ncenterliteController extends ncenterlite
$args->srl = $vars->document_srl;
$args->type = $this->_TYPE_DOCUMENT;
$output = executeQuery('ncenterlite.updateNotifyReadedBySrl', $args);
if($output->toBool())
{
//Remove flag files
self::removeFlagFile($args->member_srl);
}
}
}
else if($oModule->act == 'getKinComments')
@ -640,6 +681,11 @@ class ncenterliteController extends ncenterlite
$args->member_srl = $logged_info->member_srl;
$args->target_srl = $vars->parent_srl;
$output = executeQuery('ncenterlite.updateNotifyReadedByTargetSrl', $args);
if($output->toBool())
{
//Remove flag files
self::removeFlagFile($args->member_srl);
}
}
return new Object();
@ -869,11 +915,7 @@ class ncenterliteController extends ncenterlite
//$output = executeQuery('ncenterlite.deleteNotify', $args);
//Remove flag files
$flag_path = \RX_BASEDIR . 'files/cache/ncenterlite/new_notify/' . getNumberingPath($args->member_srl) . $args->member_srl . '.php';
if(file_exists($flag_path))
{
FileHandler::removeFile($flag_path);
}
self::removeFlagFile($args->member_srl);
return $output;
}
@ -886,11 +928,7 @@ class ncenterliteController extends ncenterlite
//$output = executeQuery('ncenterlite.deleteNotifyByTargetSrl', $args);
//Remove flag files
$flag_path = \RX_BASEDIR . 'files/cache/ncenterlite/new_notify/' . getNumberingPath($args->member_srl) . $args->member_srl . '.php';
if(file_exists($flag_path))
{
FileHandler::removeFile($flag_path);
}
self::removeFlagFile($args->member_srl);
return $output;
}
@ -902,11 +940,7 @@ class ncenterliteController extends ncenterlite
//$output = executeQuery('ncenterlite.deleteNotifyByMemberSrl', $args);
//Remove flag files
$flag_path = \RX_BASEDIR . 'files/cache/ncenterlite/new_notify/' . getNumberingPath($args->member_srl) . $args->member_srl . '.php';
if(file_exists($flag_path))
{
FileHandler::removeFile($flag_path);
}
self::removeFlagFile($args->member_srl);
return $output;
}
@ -1051,12 +1085,7 @@ class ncenterliteController extends ncenterlite
}
}
$flag_path = \RX_BASEDIR . 'files/cache/ncenterlite/new_notify/' . getNumberingPath($args->member_srl) . $args->member_srl . '.php';
if(file_exists($flag_path))
{
//remove flag files
FileHandler::removeFile($flag_path);
}
self::removeFlagFile($args->member_srl);
return $output;
}
@ -1078,6 +1107,19 @@ class ncenterliteController extends ncenterlite
FileHandler::writeFile($flag_path, $buff);
}
public static function removeFlagFile($member_srl = null)
{
if($member_srl === null)
{
return;
}
$flag_path = \RX_BASEDIR . 'files/cache/ncenterlite/new_notify/' . getNumberingPath($member_srl) . $member_srl . '.php';
if(file_exists($flag_path))
{
FileHandler::removeFile($flag_path);
}
}
/**
* @brief 노티 ID 반환

View file

@ -457,4 +457,38 @@ class ncenterliteModel extends ncenterlite
return zdate($datetime, 'Y-m-d');
}
function getNotifyListByDocumentSrl($document_srl = null)
{
if($document_srl === null)
{
return false;
}
$args = new stdClass();
$args->document_srl = $document_srl;
$output = executeQueryArray('ncenterlite.getNotifyListByDocumentSrl', $args);
if(!$output->toBool())
{
return $output;
}
return $output->data;
}
function getNotifyMemberSrlByCommentSrl($comment_srl)
{
if(!$comment_srl === null)
{
return false;
}
$args = new stdClass();
$args->srl = $comment_srl;
$output = executeQueryArray('ncenterlite.getNotifyMemberSrlByCommentSrl', $args);
if(!$output->toBool())
{
return $output;
}
return $output->data;
}
}

View file

@ -0,0 +1,11 @@
<query id="getNotifyListByDocumentSrl" action="select">
<tables>
<table name="ncenterlite_notify" />
</tables>
<columns>
<column name="*" />
</columns>
<conditions>
<condition operation="equal" column="srl" var="document_srl" filter="number" notnull="notnull" />
</conditions>
</query>

View file

@ -0,0 +1,12 @@
<query id="getNotifyMemberSrlBySrl" action="select">
<tables>
<table name="ncenterlite_notify" />
</tables>
<columns>
<column name="member_srl" />
</columns>
<conditions>
<condition operation="equal" column="srl" var="srl" filter="number" notnull="notnull" />
<condition operation="equal" column="target_srl" var="srl" filter="number" notnull="notnull" pipe="or" />
</conditions>
</query>

View file

@ -1,7 +1,11 @@
<query id="getTrashList" action="select">
<tables>
<table name="trash" alias="T" />
<table name="member" alias="M" />
<table name="member" alias="M" type="left join">
<conditions>
<condition operation="equal" column="T.remover_srl" default="M.member_srl" />
</conditions>
</table>
</tables>
<columns>
<column name="T.*" />
@ -9,8 +13,7 @@
<column name="M.nick_name" />
</columns>
<conditions>
<condition operation="equal" column="T.remover_srl" default="M.member_srl" notnull="notnull" />
<condition operation="in" column="trash_srl" var="trashSrl" filter="number" pipe="and" />
<condition operation="in" column="trash_srl" var="trashSrl" filter="number" />
<condition operation="in" column="origin_module" var="originModule" pipe="and" />
<group pipe="and">
<condition operation="like" column="T.title" var="s_title" />

View file

@ -17,11 +17,6 @@ class trashAdminController extends trash
*/
function insertTrash($obj)
{
if(!Context::get('is_logged'))
{
return new Object(-1, 'msg_not_permitted');
}
$logged_info = Context::get('logged_info');
$oTrashVO = new TrashVO();