From b213fc196885af2a4f96fc7e2d882e8ed8b11df9 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 13 Mar 2025 22:38:05 +0900
Subject: [PATCH 01/41] Fix module_srl not being updated for files attached to
comments, when a document is moved to a different module
---
modules/file/file.controller.php | 12 ++++++++++--
modules/file/queries/updateFileModuleComment.xml | 10 +++++-----
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php
index fb8c9a076..3bdd7c785 100644
--- a/modules/file/file.controller.php
+++ b/modules/file/file.controller.php
@@ -1971,8 +1971,16 @@ class FileController extends File
function triggerMoveDocument($obj)
{
$obj->upload_target_srls = $obj->document_srls;
- executeQuery('file.updateFileModule', $obj);
- executeQuery('file.updateFileModuleComment', $obj);
+ $output = executeQuery('file.updateFileModule', $obj);
+ if (!$output->toBool())
+ {
+ return $output;
+ }
+ $output = executeQuery('file.updateFileModuleComment', $obj);
+ if (!$output->toBool())
+ {
+ return $output;
+ }
}
function triggerAddCopyDocument(&$obj)
diff --git a/modules/file/queries/updateFileModuleComment.xml b/modules/file/queries/updateFileModuleComment.xml
index f053a1d4b..52c4e4b47 100644
--- a/modules/file/queries/updateFileModuleComment.xml
+++ b/modules/file/queries/updateFileModuleComment.xml
@@ -1,13 +1,13 @@
From beec50f217f63f8d3c1dc9d4b319c8c8cf7fc24e Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 13 Mar 2025 22:57:38 +0900
Subject: [PATCH 02/41] Prevent files from being deleted upon module deletion
if they belong to documents or comments that have since been moved to a
different module
---
modules/file/file.controller.php | 12 ++++---
modules/file/queries/getModuleFilesProper.xml | 31 +++++++++++++++++++
2 files changed, 39 insertions(+), 4 deletions(-)
create mode 100644 modules/file/queries/getModuleFilesProper.xml
diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php
index 3bdd7c785..f77462546 100644
--- a/modules/file/file.controller.php
+++ b/modules/file/file.controller.php
@@ -1723,14 +1723,18 @@ class FileController extends File
// Get a full list of attachments
$args = new stdClass;
$args->module_srl = $module_srl;
- $output = executeQueryArray('file.getModuleFiles', $args);
- if(!$output->toBool() || empty($file_list = $output->data))
+ $output = executeQueryArray('file.getModuleFilesProper', $args);
+ if (!$output->toBool())
{
return $output;
}
+ if (!$output->data)
+ {
+ return;
+ }
- // Delete the file
- return $this->deleteFile($file_list);
+ // Delete each file.
+ return $this->deleteFile($output->data);
}
/**
diff --git a/modules/file/queries/getModuleFilesProper.xml b/modules/file/queries/getModuleFilesProper.xml
new file mode 100644
index 000000000..bbfb72108
--- /dev/null
+++ b/modules/file/queries/getModuleFilesProper.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From fd103ba67d3062f87746a3e44a15a3255329326d Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 13 Mar 2025 23:21:33 +0900
Subject: [PATCH 03/41] Fix #2522 browser titles for member pages not following
admin template
---
classes/module/ModuleHandler.class.php | 7 +--
modules/communication/communication.view.php | 14 +++---
modules/member/member.view.php | 50 +++++++++++++-------
modules/ncenterlite/ncenterlite.view.php | 8 ++--
4 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php
index 8d5ebfe70..0a00ad038 100644
--- a/classes/module/ModuleHandler.class.php
+++ b/classes/module/ModuleHandler.class.php
@@ -848,15 +848,10 @@ class ModuleHandler extends Handler
$seo_title = config('seo.subpage_title') ?: '$SITE_TITLE - $SUBPAGE_TITLE';
}
$seo_title = Context::replaceUserLang($seo_title);
- $subpage_title = $module_info->browser_title;
- if (in_array($module_info->module, ['member']))
- {
- $subpage_title = '';
- }
Context::setBrowserTitle($seo_title, array(
'site_title' => Context::getSiteTitle(),
'site_subtitle' => Context::getSiteSubtitle(),
- 'subpage_title' => $subpage_title,
+ 'subpage_title' => $module_info->browser_title,
'page' => Context::get('page') ?: 1,
));
diff --git a/modules/communication/communication.view.php b/modules/communication/communication.view.php
index f5b6cb1e4..22b90a54c 100644
--- a/modules/communication/communication.view.php
+++ b/modules/communication/communication.view.php
@@ -139,11 +139,11 @@ class CommunicationView extends communication
if ($message)
{
- Context::addBrowserTitle($message->title);
+ MemberView::setMemberPageBrowserTitle($message->title);
}
else
{
- Context::addBrowserTitle(lang('communication.message_box.' . $message_type));
+ MemberView::setMemberPageBrowserTitle(lang('communication.message_box.' . $message_type));
}
$this->setTemplateFile($template_filename);
@@ -186,7 +186,7 @@ class CommunicationView extends communication
Context::set('message', $message);
}
- Context::addBrowserTitle($message->title ?? lang('cmd_view_message_box'));
+ MemberView::setMemberPageBrowserTitle($message->title ?? lang('cmd_view_message_box'));
$this->setTemplateFile('new_message');
}
@@ -313,7 +313,7 @@ class CommunicationView extends communication
$editor = $oEditorModel->getEditor(getNextSequence(), $option);
$editor = $editor . "\n" . '' . "\n";
Context::set('editor', $editor);
- Context::addBrowserTitle(lang('cmd_send_message'));
+ MemberView::setMemberPageBrowserTitle(lang('cmd_send_message'));
$this->setTemplateFile('send_message');
// Fix for skins that don't support window_type=self
@@ -387,7 +387,7 @@ class CommunicationView extends communication
Context::set('friend_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
- Context::addBrowserTitle(lang('cmd_view_friend'));
+ MemberView::setMemberPageBrowserTitle(lang('cmd_view_friend'));
$this->setTemplateFile('friends');
}
@@ -460,7 +460,7 @@ class CommunicationView extends communication
$friend_group_list = $oCommunicationModel->getFriendGroups();
Context::set('friend_group_list', $friend_group_list);
- Context::addBrowserTitle(lang('cmd_add_friend'));
+ MemberView::setMemberPageBrowserTitle(lang('cmd_add_friend'));
$this->setTemplateFile('add_friend');
// Fix for skins that don't support window_type=self
@@ -524,7 +524,7 @@ class CommunicationView extends communication
}
}
- Context::addBrowserTitle(lang('cmd_add_friend_group'));
+ MemberView::setMemberPageBrowserTitle(lang('cmd_add_friend_group'));
$this->setTemplateFile('add_friend_group');
// Fix for skins that don't support window_type=self
diff --git a/modules/member/member.view.php b/modules/member/member.view.php
index 19727f83f..d6afba4af 100644
--- a/modules/member/member.view.php
+++ b/modules/member/member.view.php
@@ -114,6 +114,24 @@ class MemberView extends Member
}
}
+ /**
+ * Set the browser title for a page belonging to the member menu.
+ *
+ * @param string $title
+ * @return void
+ */
+ public static function setMemberPageBrowserTitle(string $title): void
+ {
+ $seo_title = config('seo.subpage_title') ?: '$SITE_TITLE - $SUBPAGE_TITLE';
+ $seo_title = Context::replaceUserLang($seo_title);
+ Context::setBrowserTitle($seo_title, array(
+ 'site_title' => Context::getSiteTitle(),
+ 'site_subtitle' => Context::getSiteSubtitle(),
+ 'subpage_title' => $title,
+ 'page' => Context::get('page') ?: 1,
+ ));
+ }
+
/**
* Module index
*/
@@ -181,7 +199,7 @@ class MemberView extends Member
$member_info->group_list[$key] = Context::replaceUserLang($val, true);
}
- Context::addBrowserTitle(lang('cmd_view_member_info'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_member_info'));
Context::set('memberInfo', get_object_vars($member_info));
$extendForm = MemberModel::getCombineJoinForm($member_info);
@@ -376,7 +394,7 @@ class MemberView extends Member
$member_config->agreement = $member_config->agreements[1]->content ?? '';
// Set a template file
- Context::addBrowserTitle(lang('cmd_signup'));
+ self::setMemberPageBrowserTitle(lang('cmd_signup'));
$this->setTemplateFile('signup_form');
}
@@ -413,7 +431,7 @@ class MemberView extends Member
Context::set('identifierValue', $logged_info->user_id);
}
- Context::addBrowserTitle(lang('cmd_modify_member_info'));
+ self::setMemberPageBrowserTitle(lang('cmd_modify_member_info'));
$this->setTemplateFile('rechecked_password');
}
@@ -499,7 +517,7 @@ class MemberView extends Member
$this->addExtraFormValidatorMessage();
// Set a template file
- Context::addBrowserTitle(lang('cmd_modify_member_info'));
+ self::setMemberPageBrowserTitle(lang('cmd_modify_member_info'));
$this->setTemplateFile('modify_info');
}
@@ -550,7 +568,7 @@ class MemberView extends Member
$oSecurity = new Security();
$oSecurity->encodeHTML('document_list...title', 'search_target', 'search_keyword');
- Context::addBrowserTitle(lang('cmd_view_own_document'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_own_document'));
$this->setTemplateFile('document_list');
}
@@ -598,7 +616,7 @@ class MemberView extends Member
$oSecurity = new Security();
$oSecurity->encodeHTML('search_target', 'search_keyword');
- Context::addBrowserTitle(lang('cmd_view_own_comment'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_own_comment'));
$this->setTemplateFile('comment_list');
}
@@ -708,7 +726,7 @@ class MemberView extends Member
$security = new Security($output->data);
$security->encodeHTML('..nick_name');
- Context::addBrowserTitle(lang('cmd_view_scrapped_document'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_scrapped_document'));
$this->setTemplateFile('scrapped_list');
}
@@ -743,7 +761,7 @@ class MemberView extends Member
Context::set('document_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
- Context::addBrowserTitle(lang('cmd_view_saved_document'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_saved_document'));
$this->setTemplateFile('saved_list');
}
@@ -783,7 +801,7 @@ class MemberView extends Member
$output = executeQueryArray('member.getMemberDevice', $args);
Context::set('registered_devices', $output->data);
- Context::addBrowserTitle(lang('cmd_view_active_logins'));
+ self::setMemberPageBrowserTitle(lang('cmd_view_active_logins'));
$this->setTemplateFile('active_logins');
}
@@ -822,7 +840,7 @@ class MemberView extends Member
}
// Set a template file
- Context::addBrowserTitle(lang('cmd_login'));
+ self::setMemberPageBrowserTitle(lang('cmd_login'));
$this->setTemplateFile('login_form');
}
@@ -858,7 +876,7 @@ class MemberView extends Member
Context::set('formValue', $member_info->email_address);
}
// Set a template file
- Context::addBrowserTitle(lang('cmd_modify_member_password'));
+ self::setMemberPageBrowserTitle(lang('cmd_modify_member_password'));
$this->setTemplateFile('modify_password');
}
@@ -893,7 +911,7 @@ class MemberView extends Member
Context::set('formValue', $member_info->email_address);
}
// Set a template file
- Context::addBrowserTitle(lang('msg_leave_member'));
+ self::setMemberPageBrowserTitle(lang('msg_leave_member'));
$this->setTemplateFile('leave_form');
}
@@ -948,7 +966,7 @@ class MemberView extends Member
Context::set('identifier', $this->member_config->identifier);
Context::set('enable_find_account_question', 'N');
- Context::addBrowserTitle(lang('cmd_find_member_account'));
+ self::setMemberPageBrowserTitle(lang('cmd_find_member_account'));
$this->setTemplateFile('find_member_account');
}
@@ -967,7 +985,7 @@ class MemberView extends Member
return;
}
- Context::addBrowserTitle(lang('cmd_resend_auth_mail'));
+ self::setMemberPageBrowserTitle(lang('cmd_resend_auth_mail'));
$this->setTemplateFile('resend_auth_mail');
}
@@ -987,7 +1005,7 @@ class MemberView extends Member
$_SESSION['rechecked_password_step'] = 'INPUT_DATA';
- Context::addBrowserTitle(lang('cmd_modify_member_email_address'));
+ self::setMemberPageBrowserTitle(lang('cmd_modify_member_email_address'));
$this->setTemplateFile('modify_email_address');
}
@@ -1106,7 +1124,7 @@ class MemberView extends Member
Context::set('nickname_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
- Context::addBrowserTitle(lang('cmd_modify_nickname_log'));
+ self::setMemberPageBrowserTitle(lang('cmd_modify_nickname_log'));
$this->setTemplateFile('member_nick');
}
}
diff --git a/modules/ncenterlite/ncenterlite.view.php b/modules/ncenterlite/ncenterlite.view.php
index 9d5954a20..72d090eca 100644
--- a/modules/ncenterlite/ncenterlite.view.php
+++ b/modules/ncenterlite/ncenterlite.view.php
@@ -28,7 +28,7 @@ class NcenterliteView extends Ncenterlite
Context::set('ncenterlite_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
- Context::addBrowserTitle(lang('ncenterlite_my_list'));
+ MemberView::setMemberPageBrowserTitle(lang('ncenterlite_my_list'));
$this->setTemplateFileOrDefault('NotifyList');
}
@@ -86,7 +86,7 @@ class NcenterliteView extends Ncenterlite
Context::set('sms_available', Rhymix\Framework\SMS::getDefaultDriver()->getName() !== 'Dummy');
Context::set('push_available', count(Rhymix\Framework\Config::get('push.types') ?? []) > 0);
- Context::addBrowserTitle(lang('ncenterlite_my_settings'));
+ MemberView::setMemberPageBrowserTitle(lang('ncenterlite_my_settings'));
$this->setTemplateFileOrDefault('userconfig');
}
@@ -140,7 +140,7 @@ class NcenterliteView extends Ncenterlite
Context::set('unsubscribe_list', $output->data);
Context::set('page_navigation', $output->page_navigation);
- Context::addBrowserTitle(lang('unsubscribe_list'));
+ MemberView::setMemberPageBrowserTitle(lang('unsubscribe_list'));
$this->setTemplateFileOrDefault('unsubscribeList');
}
@@ -230,7 +230,7 @@ class NcenterliteView extends Ncenterlite
Context::set('text', $text);
Context::set('type', $type);
- Context::addBrowserTitle(lang('unsubscribe_list'));
+ MemberView::setMemberPageBrowserTitle(lang('unsubscribe_list'));
$this->setTemplateFileOrDefault('unsubscribe');
}
From bb3ea5c9aa2f6be5f56e51e681dba5a4a5dd2b3d Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Fri, 14 Mar 2025 01:22:32 +0900
Subject: [PATCH 04/41] Fix overlapping pagination links #2521
---
modules/admin/tpl/css/admin.css | 5 +++++
modules/comment/tpl/comment_list.html | 1 -
modules/document/tpl/document_list.html | 15 +++++++--------
3 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/modules/admin/tpl/css/admin.css b/modules/admin/tpl/css/admin.css
index c3a09a36a..8ef7ff6a5 100644
--- a/modules/admin/tpl/css/admin.css
+++ b/modules/admin/tpl/css/admin.css
@@ -185,6 +185,11 @@ body>.x,
height: 24px;
padding: 0 6px;
}
+@media screen and (max-width: 800px) {
+ .x .x_pagination {
+ clear: both;
+ }
+}
.x .btn {
color: #333;
}
diff --git a/modules/comment/tpl/comment_list.html b/modules/comment/tpl/comment_list.html
index 838df8911..ff14e4691 100644
--- a/modules/comment/tpl/comment_list.html
+++ b/modules/comment/tpl/comment_list.html
@@ -83,7 +83,6 @@ xe.lang.msg_empty_search_keyword = '{$lang->msg_empty_search_keyword}';
-
+
+
+
+Hello <"world"> ('string') variable.jpg
+
+
+
+
+
+
+
+ - Hello <"world"> ('string') variable.jpg
+ - Hello <"world"> ('string') variable.jpg
+
diff --git a/tests/_data/template/v2contextual.html b/tests/_data/template/v2contextual.html
new file mode 100644
index 000000000..7ca89745a
--- /dev/null
+++ b/tests/_data/template/v2contextual.html
@@ -0,0 +1,30 @@
+@version(2)
+
+
+ {{ $var }}
+
+
+
+
+ {{ $var }}
+
+
+
+
+
+
+
+
+ - {{ $var }}
+ - {{ $var|noescape }}
+
diff --git a/tests/unit/framework/parsers/TemplateParserV2Test.php b/tests/unit/framework/parsers/TemplateParserV2Test.php
index 4892fbb87..75a9e4bb5 100644
--- a/tests/unit/framework/parsers/TemplateParserV2Test.php
+++ b/tests/unit/framework/parsers/TemplateParserV2Test.php
@@ -1220,6 +1220,24 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$this->assertStringContainsString('/tests/_data/template/css/style.scss', array_first($list)['file']);
}
+ public function testCompileContextualEscape()
+ {
+ // Contextual escape
+ $tmpl = new \Rhymix\Framework\Template('./tests/_data/template', 'v2contextual.html');
+ $tmpl->disableCache();
+ $tmpl->setVars([
+ 'var' => 'Hello <"world"> (\'string\') variable.jpg'
+ ]);
+
+ $executed_output = $tmpl->compile();
+ //Rhymix\Framework\Storage::write(\RX_BASEDIR . 'tests/_data/template/v2contextual.executed.html', $executed_output);
+ $expected = file_get_contents(\RX_BASEDIR . 'tests/_data/template/v2contextual.executed.html');
+ $this->assertEquals(
+ $this->_normalizeWhitespace($expected),
+ $this->_normalizeWhitespace($executed_output)
+ );
+ }
+
public function testCompileLang()
{
// Lang
From 3e052d2d0087369f95855006897bb4c4435eab9a Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Wed, 19 Mar 2025 12:44:17 +0900
Subject: [PATCH 18/41] Improve detection of template v1-style syntax in CSS/JS
contexts
---
common/framework/parsers/template/TemplateParser_v2.php | 6 ++++--
tests/_data/template/v2contextual.executed.html | 9 ++++-----
tests/_data/template/v2contextual.html | 9 ++++-----
3 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php
index be9d4088c..84b010e5d 100644
--- a/common/framework/parsers/template/TemplateParser_v2.php
+++ b/common/framework/parsers/template/TemplateParser_v2.php
@@ -824,8 +824,10 @@ class TemplateParser_v2
// Exclude {single} curly braces in non-HTML contexts.
$content = preg_replace_callback('#(<\?php \$this->config->context = \'(?:CSS|JS)\'; \?>)(.*?)(<\?php \$this->config->context = \'HTML\'; \?>)#s', function($match) {
- $warning = '';
- $match[2] = preg_replace('#(?' : '';
+ return '{' . $warning . $m[1] . '}';
+ }, $match[2]);
return $match[1] . $match[2] . $match[3];
}, $content);
diff --git a/tests/_data/template/v2contextual.executed.html b/tests/_data/template/v2contextual.executed.html
index 69847da11..f36d54714 100644
--- a/tests/_data/template/v2contextual.executed.html
+++ b/tests/_data/template/v2contextual.executed.html
@@ -8,17 +8,16 @@ Hello <"world"> ('string') variable.jpg
diff --git a/tests/_data/template/v2contextual.html b/tests/_data/template/v2contextual.html
index 7ca89745a..e8c690844 100644
--- a/tests/_data/template/v2contextual.html
+++ b/tests/_data/template/v2contextual.html
@@ -11,17 +11,16 @@
From e192bc0ff68903d47e025d0293abf2a8e091ab70 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 20 Mar 2025 14:01:56 +0900
Subject: [PATCH 19/41] Add widget directive for Template v2
---
.../parsers/template/TemplateParser_v2.php | 5 ++++-
modules/widget/widget.controller.php | 19 +++++++++++++------
.../parsers/TemplateParserV2Test.php | 5 +++++
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php
index 84b010e5d..ff4dd6bde 100644
--- a/common/framework/parsers/template/TemplateParser_v2.php
+++ b/common/framework/parsers/template/TemplateParser_v2.php
@@ -760,6 +760,7 @@ class TemplateParser_v2
* @dd($var, $var, ...)
* @stack('name')
* @url(['mid' => $mid, 'act' => $act])
+ * @widget('name', $args)
*
* @param string $content
* @return string
@@ -773,7 +774,7 @@ class TemplateParser_v2
// Insert JSON, lang codes, and dumps.
$parentheses = self::_getRegexpForParentheses(2);
- $content = preg_replace_callback('#(?', $args);
case 'url':
return sprintf('config->context === \'HTML\' ? getUrl(%s) : $this->_v2_escape(getNotEncodedUrl(%s)); ?>', $args, $args);
+ case 'widget':
+ return sprintf('execute(%s); ?>', $args);
default:
return $match[0];
}
diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php
index 9c8275062..ec0244638 100644
--- a/modules/widget/widget.controller.php
+++ b/modules/widget/widget.controller.php
@@ -450,14 +450,21 @@ class WidgetController extends Widget
// Save for debug run-time widget
$start = microtime(true);
- // urldecode the value of args haejum
- $object_vars = get_object_vars($args);
- if(count($object_vars))
+ // Type juggling
+ if (is_array($args))
{
- foreach($object_vars as $key => $val)
+ $args = (object)$args;
+ }
+
+ // Apply urldecode for backward compatibility
+ if ($escaped)
+ {
+ foreach (get_object_vars($args) ?: [] as $key => $val)
{
- if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue;
- if($escaped) $args->{$key} = utf8RawUrlDecode($val);
+ if (!in_array($key, ['body', 'class', 'style', 'document_srl', 'widget', 'widget_sequence', 'widgetstyle', 'widgetbox_content', 'widget_padding_left', 'widget_padding_top', 'widget_padding_bottom', 'widget_padding_right']))
+ {
+ $args->{$key} = utf8RawUrlDecode($val);
+ }
}
}
diff --git a/tests/unit/framework/parsers/TemplateParserV2Test.php b/tests/unit/framework/parsers/TemplateParserV2Test.php
index 75a9e4bb5..ce6e68ab7 100644
--- a/tests/unit/framework/parsers/TemplateParserV2Test.php
+++ b/tests/unit/framework/parsers/TemplateParserV2Test.php
@@ -1031,6 +1031,11 @@ class TemplateParserV2Test extends \Codeception\Test\Unit
$source = "@url('', 'mid', \$mid, 'act', \$act])";
$target = "config->context === 'HTML' ? getUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act]) : \$this->_v2_escape(getNotEncodedUrl('', 'mid', \$__Context->mid, 'act', \$__Context->act])); ?>";
$this->assertEquals($target, $this->_parse($source));
+
+ // Widget
+ $source = "@widget('login_info', ['skin' => 'default'])";
+ $target = "execute('login_info', ['skin' => 'default']); ?>";
+ $this->assertEquals($target, $this->_parse($source));
}
public function testComments()
From 6ead6ae434ac95eafcdf92f391ed40a92672047f Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Sun, 23 Mar 2025 20:50:48 +0900
Subject: [PATCH 20/41] Increase length of password columns for document and
comment tables #2530
---
modules/comment/schemas/comments.xml | 2 +-
modules/document/schemas/documents.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/comment/schemas/comments.xml b/modules/comment/schemas/comments.xml
index 6c6a6f34a..b689a2fe9 100644
--- a/modules/comment/schemas/comments.xml
+++ b/modules/comment/schemas/comments.xml
@@ -8,7 +8,7 @@
-
+
diff --git a/modules/document/schemas/documents.xml b/modules/document/schemas/documents.xml
index b53452ec9..bbfa6311e 100644
--- a/modules/document/schemas/documents.xml
+++ b/modules/document/schemas/documents.xml
@@ -14,7 +14,7 @@
-
+
From 3003c3118902f6972d82293cca753909a1c1581b Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Sun, 23 Mar 2025 20:58:28 +0900
Subject: [PATCH 21/41] Update copyright notice #2436
---
common/composer.json | 2 +-
common/functions.php | 2 +-
index.php | 2 +-
modules/install/tpl/license_text.en.html | 2 +-
modules/install/tpl/license_text.ko.html | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/common/composer.json b/common/composer.json
index 72e948084..7e515f2bd 100644
--- a/common/composer.json
+++ b/common/composer.json
@@ -5,7 +5,7 @@
"license": "GPL-2.0-or-later",
"type": "project",
"authors": [
- { "name": "Rhymix Developers and Contributors", "email": "devops@rhymix.org" },
+ { "name": "Poesis Inc. and Contributors", "email": "devops@rhymix.org" },
{ "name": "NAVER", "email": "developers@xpressengine.com" }
],
"config": {
diff --git a/common/functions.php b/common/functions.php
index 8680c6f39..7ddb59b59 100644
--- a/common/functions.php
+++ b/common/functions.php
@@ -3,7 +3,7 @@
/**
* Function library for Rhymix
*
- * Copyright (c) Rhymix Developers and Contributors
+ * Copyright (c) Poesis Inc. and Contributors
*/
/**
diff --git a/index.php b/index.php
index d5df354aa..fe4bb0a06 100644
--- a/index.php
+++ b/index.php
@@ -8,7 +8,7 @@
*
* -----------------------------------------------------------------------------
*
- * Copyright (c) Rhymix Developers and Contributors
+ * Copyright (c) Poesis Inc. and Contributors
* Copyright (c) NAVER
*
* This program is free software: you can redistribute it and/or modify it
diff --git a/modules/install/tpl/license_text.en.html b/modules/install/tpl/license_text.en.html
index cea59fb5e..0f19905f4 100644
--- a/modules/install/tpl/license_text.en.html
+++ b/modules/install/tpl/license_text.en.html
@@ -1,5 +1,5 @@
- Copyright © Rhymix Developers and Contributors
+ Copyright © Poesis Inc. and Contributors
Copyright © NAVER & XEHub
diff --git a/modules/install/tpl/license_text.ko.html b/modules/install/tpl/license_text.ko.html
index f41eb4de0..fc1e40b0f 100644
--- a/modules/install/tpl/license_text.ko.html
+++ b/modules/install/tpl/license_text.ko.html
@@ -1,5 +1,5 @@
- Copyright © Rhymix Developers and Contributors
+ Copyright © Poesis Inc. and Contributors
Copyright © NAVER & XEHub
From 0b0b8f58a36b6cad1fc2cea77ae1b27419a6a8bf Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Sun, 23 Mar 2025 20:58:47 +0900
Subject: [PATCH 22/41] Remove unnecessary method overload
---
.../integration_search.mobile.php | 18 ++----------------
1 file changed, 2 insertions(+), 16 deletions(-)
diff --git a/modules/integration_search/integration_search.mobile.php b/modules/integration_search/integration_search.mobile.php
index 9608f0700..51bace717 100644
--- a/modules/integration_search/integration_search.mobile.php
+++ b/modules/integration_search/integration_search.mobile.php
@@ -1,20 +1,6 @@
*/
-/**
- * The view class of the integration_search module
- *
- * @author Rhymix Developers and Contributors
- */
class integration_searchMobile extends integration_searchView
{
- /**
- * Search Result
- *
- * @return Object
- */
- function IS()
- {
- parent::IS();
- }
-}
\ No newline at end of file
+
+}
From b9014efb9ddc05e69e319526613088379121c02f Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Tue, 25 Mar 2025 19:36:55 +0900
Subject: [PATCH 23/41] Fix condition for displaying update log button in
xedition skin #2488
---
modules/board/skins/xedition/_read.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/board/skins/xedition/_read.html b/modules/board/skins/xedition/_read.html
index 7a48f42eb..5c676a658 100644
--- a/modules/board/skins/xedition/_read.html
+++ b/modules/board/skins/xedition/_read.html
@@ -117,7 +117,7 @@
{$lang->cmd_document_vote_user}
-
+
{$lang->update_log}
{$lang->cmd_modify}
From 1be734edc123cd71d85c978ebdfa92069f3029a7 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Tue, 25 Mar 2025 19:46:50 +0900
Subject: [PATCH 24/41] Clean up procBoardRevertDocument #2515
---
modules/board/board.controller.php | 39 ++++++++++++++++++------------
1 file changed, 24 insertions(+), 15 deletions(-)
diff --git a/modules/board/board.controller.php b/modules/board/board.controller.php
index 830a70f85..e8bc4aec4 100644
--- a/modules/board/board.controller.php
+++ b/modules/board/board.controller.php
@@ -290,30 +290,30 @@ class BoardController extends Board
public function procBoardRevertDocument()
{
$update_id = Context::get('update_id');
- $logged_info = Context::get('logged_info');
- if(!$update_id)
+ if (!$update_id)
{
throw new Rhymix\Framework\Exception('msg_no_update_id');
}
- $oDocumentController = DocumentController::getInstance();
$update_log = DocumentModel::getUpdateLog($update_id);
-
- if($logged_info->is_admin != 'Y')
- {
- $Exists_log = DocumentModel::getUpdateLogAdminisExists($update_log->document_srl);
- if($Exists_log === true)
- {
- throw new Rhymix\Framework\Exception('msg_admin_update_log');
- }
- }
-
- if(!$update_log)
+ if (!$update_log)
{
throw new Rhymix\Framework\Exception('msg_no_update_log');
}
$oDocument = DocumentModel::getDocument($update_log->document_srl);
+ if (!$oDocument->isGranted())
+ {
+ throw new Rhymix\Framework\Exceptions\NotPermitted();
+ }
+ if (!$this->user->isAdmin())
+ {
+ if (DocumentModel::getUpdateLogAdminisExists($update_log->document_srl))
+ {
+ throw new Rhymix\Framework\Exception('msg_admin_update_log');
+ }
+ }
+
$obj = new stdClass();
$obj->title = $update_log->title;
$obj->document_srl = $update_log->document_srl;
@@ -322,10 +322,19 @@ class BoardController extends Board
$obj->content = $update_log->content;
$obj->update_log_setting = 'Y';
$obj->reason_update = lang('board.revert_reason_update');
+ $oDocumentController = DocumentController::getInstance();
$output = $oDocumentController->updateDocument($oDocument, $obj);
- $this->setRedirectUrl(getNotEncodedUrl('', 'mid', Context::get('mid'),'act', '', 'document_srl', $update_log->document_srl));
+ if (!$output->toBool())
+ {
+ return $output;
+ }
+
$this->add('mid', Context::get('mid'));
$this->add('document_srl', $update_log->document_srl);
+ $this->setRedirectUrl(getNotEncodedUrl([
+ 'mid' => Context::get('mid'),
+ 'document_srl' => $update_log->document_srl,
+ ]));
}
/**
From f01923697609eeda01891913e575fee727dde524 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Tue, 25 Mar 2025 21:11:18 +0900
Subject: [PATCH 25/41] Fix undefined variable #2534
---
modules/point/point.model.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/point/point.model.php b/modules/point/point.model.php
index 2aaceb1e1..1220f37a8 100644
--- a/modules/point/point.model.php
+++ b/modules/point/point.model.php
@@ -57,10 +57,10 @@ class PointModel extends Point
}
// Get from file cache
+ $cache_path = sprintf(RX_BASEDIR . 'files/member_extra_info/point/%s', getNumberingPath($member_srl));
+ $cache_filename = sprintf('%s/%d.cache.txt', $cache_path, $member_srl);
if (!$from_db && !$use_cache)
{
- $cache_path = sprintf(RX_BASEDIR . 'files/member_extra_info/point/%s', getNumberingPath($member_srl));
- $cache_filename = sprintf('%s/%d.cache.txt', $cache_path, $member_srl);
if (file_exists($cache_filename))
{
$point = trim(Rhymix\Framework\Storage::read($cache_filename));
From df1c3658723d3d2f1d2e42053c067468007f5daf Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 27 Mar 2025 10:28:13 +0900
Subject: [PATCH 26/41] Enable logging in FrontEndFileHandler
---
.../FrontEndFileHandler.class.php | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php
index a09a69142..d428d4099 100644
--- a/classes/frontendfile/FrontEndFileHandler.class.php
+++ b/classes/frontendfile/FrontEndFileHandler.class.php
@@ -53,6 +53,12 @@ class FrontEndFileHandler extends Handler
*/
public $jsBodyMapIndex = array();
+ /**
+ * Logging
+ */
+ protected $_log_enabled = false;
+ protected $_log_entries = [];
+
/**
* Check SSL
*
@@ -92,6 +98,10 @@ class FrontEndFileHandler extends Handler
{
$args = array($args);
}
+ if ($this->_log_enabled)
+ {
+ $this->_log_entries[] = $args;
+ }
// Replace obsolete paths with current paths.
$args[0] = preg_replace(array_keys(HTMLDisplayHandler::$replacements), array_values(HTMLDisplayHandler::$replacements), $args[0]);
@@ -252,6 +262,26 @@ class FrontEndFileHandler extends Handler
return $file;
}
+ /**
+ * Start logging.
+ */
+ public function startLog()
+ {
+ $this->_log_enabled = true;
+ $this->_log_entries = [];
+ }
+
+ /**
+ * End logging and return the log entries.
+ *
+ * @return array
+ */
+ public function endLog(): array
+ {
+ $this->_log_enabled = false;
+ return $this->_log_entries;
+ }
+
/**
* Process CSS and JS file
*
From 5ccd4f68d9f0a081b443cf3b21f0073c4dbfb214 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 27 Mar 2025 10:46:09 +0900
Subject: [PATCH 27/41] Use FrontEndFileHandler as a singleton
---
classes/context/Context.class.php | 2 +-
.../FrontEndFileHandler.class.php | 21 ++++++++++++++++++-
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php
index 9dde027fd..95b5b8776 100644
--- a/classes/context/Context.class.php
+++ b/classes/context/Context.class.php
@@ -163,7 +163,7 @@ class Context
{
// Create a singleton instance and initialize static properties.
self::$_instance = new Context();
- self::$_oFrontEndFileHandler = self::$_instance->oFrontEndFileHandler = new FrontEndFileHandler();
+ self::$_oFrontEndFileHandler = self::$_instance->oFrontEndFileHandler = FrontEndFileHandler::getInstance();
self::$_user_vars = self::$_user_vars ?: new stdClass;
}
return self::$_instance;
diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php
index d428d4099..f98958256 100644
--- a/classes/frontendfile/FrontEndFileHandler.class.php
+++ b/classes/frontendfile/FrontEndFileHandler.class.php
@@ -59,13 +59,32 @@ class FrontEndFileHandler extends Handler
protected $_log_enabled = false;
protected $_log_entries = [];
+ /**
+ * Singleton
+ */
+ protected static $_instance = null;
+
+ /**
+ * Get singleton instance
+ *
+ * @return self
+ */
+ public static function getInstance(): self
+ {
+ if (self::$_instance === null)
+ {
+ self::$_instance = new self();
+ }
+ return self::$_instance;
+ }
+
/**
* Check SSL
*
* @return bool If using ssl returns true, otherwise returns false.
* @deprecated
*/
- public function isSsl()
+ public static function isSsl()
{
return \RX_SSL;
}
From efaeda640d3315c56c6143c06cf326a67799beb7 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 27 Mar 2025 10:58:48 +0900
Subject: [PATCH 28/41] Fix widget cache for all assets loaded from all types
of templates
https://rhymix.org/community/1905161
---
modules/widget/widget.controller.php | 60 +++++++++++-----------------
1 file changed, 24 insertions(+), 36 deletions(-)
diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php
index ec0244638..77a51a8ce 100644
--- a/modules/widget/widget.controller.php
+++ b/modules/widget/widget.controller.php
@@ -383,60 +383,48 @@ class WidgetController extends Widget
$widget_cache = intval(floatval($widget_cache) * 60);
}
- /**
- * Even if the cache number and value of the cache and return it to extract data
- */
+ // If widget cache is disabled, just execute the widget and return the result.
if(!$ignore_cache && !$widget_cache)
{
$oWidget = $this->getWidgetObject($widget);
- if(!$oWidget || !method_exists($oWidget, 'proc')) return;
+ if (!$oWidget || !method_exists($oWidget, 'proc'))
+ {
+ return;
+ }
$widget_content = $oWidget->proc($args);
- $widget_content = Context::replaceUserLang($widget_content);
- return $widget_content;
+ return Context::replaceUserLang($widget_content);
}
+ // If cached data exists, return it.
$cache_data = Rhymix\Framework\Cache::get('widget_cache:' . $widget_sequence);
- if ($cache_data)
+ if (is_object($cache_data) && isset($cache_data->assets))
{
- // Load the variables, need to load the LESS or SCSS files.
- if(is_object($cache_data))
+ foreach ($cache_data->assets as $asset)
{
- foreach ($cache_data->variables as $key => $value)
- {
- Context::set($key, $value);
- }
- $cache_data = $cache_data->content;
+ Context::loadFile($asset);
}
- return str_replace('/is', $widget_content, $widget_var_matches, PREG_SET_ORDER))
- {
- $cache_content = new stdClass();
- $cache_content->content = $widget_content;
- $cache_content->variables = new stdClass();
- foreach($widget_var_matches as $matches)
- {
- if(isset($matches[2]) && $matches[2])
- {
- $key = str_replace('?$__Context->', '', $matches[2]);
- $cache_content->variables->{$key} = Context::get($key);
- }
- }
- Rhymix\Framework\Cache::set('widget_cache:' . $widget_sequence, $cache_content, $widget_cache, true);
- }
-
- return $widget_content;
+ return Context::replaceUserLang($widget_content);
}
/**
From b4098ce804ce877eb01767580890fd30a24261da Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 27 Mar 2025 11:02:46 +0900
Subject: [PATCH 29/41] Separate widget cache by lang type
---
modules/widget/widget.controller.php | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php
index 77a51a8ce..0ba27cf30 100644
--- a/modules/widget/widget.controller.php
+++ b/modules/widget/widget.controller.php
@@ -397,7 +397,8 @@ class WidgetController extends Widget
}
// If cached data exists, return it.
- $cache_data = Rhymix\Framework\Cache::get('widget_cache:' . $widget_sequence);
+ $cache_key = 'widget_cache:' . $widget_sequence . ':' . $lang_type;
+ $cache_data = Rhymix\Framework\Cache::get($cache_key);
if (is_object($cache_data) && isset($cache_data->assets))
{
foreach ($cache_data->assets as $asset)
@@ -422,7 +423,7 @@ class WidgetController extends Widget
$cache_data = new stdClass;
$cache_data->assets = $oFrontEndFileHandler->endLog();
$cache_data->content = $widget_content;
- Rhymix\Framework\Cache::set('widget_cache:' . $widget_sequence, $cache_data, $widget_cache, true);
+ Rhymix\Framework\Cache::set($cache_key, $cache_data, $widget_cache, true);
return Context::replaceUserLang($widget_content);
}
@@ -805,10 +806,14 @@ class WidgetController extends Widget
if($vars->widget_sequence)
{
- Rhymix\Framework\Cache::delete('widget_cache:' . $vars->widget_sequence);
+ $lang_type = Context::getLangType();
+ Rhymix\Framework\Cache::delete('widget_cache:' . $vars->widget_sequence . ':' . $lang_type);
}
- if($vars->widget_cache>0) $vars->widget_sequence = getNextSequence();
+ if($vars->widget_cache > 0)
+ {
+ $vars->widget_sequence = getNextSequence();
+ }
$attribute = array();
foreach($vars as $key => $val)
From f613841a1b443819421b4ee2b734102e4afdbb0a Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Thu, 27 Mar 2025 16:40:40 +0900
Subject: [PATCH 30/41] Version 2.1.22
---
common/constants.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/common/constants.php b/common/constants.php
index 800b3ff22..b5842403a 100644
--- a/common/constants.php
+++ b/common/constants.php
@@ -3,7 +3,7 @@
/**
* RX_VERSION is the version number of the Rhymix CMS.
*/
-define('RX_VERSION', '2.1.21');
+define('RX_VERSION', '2.1.22');
/**
* RX_MICROTIME is the startup time of the current script, in microseconds since the Unix epoch.
From b94b16d081fe04b8b7569328a8e41b71939617f6 Mon Sep 17 00:00:00 2001
From: dewekk <60457472+dewekk@users.noreply.github.com>
Date: Sun, 30 Mar 2025 14:13:02 +0900
Subject: [PATCH 31/41] =?UTF-8?q?=EA=B0=80=EC=9E=85=20=ED=8F=BC=20?=
=?UTF-8?q?=EC=9D=B4=EB=8F=99=20=EC=8B=9C=20=ED=95=98=EC=9C=84=20input=20i?=
=?UTF-8?q?d,=20name=20=EC=86=8D=EC=84=B1=20=EC=A0=9C=EA=B1=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
가입 폼 이동 시 복제되는 input의 id, name 속성을 제거하여, 중복을 방지합니다.
---
modules/admin/tpl/js/admin.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/admin/tpl/js/admin.js b/modules/admin/tpl/js/admin.js
index 02d6ae0c8..f3152ef88 100644
--- a/modules/admin/tpl/js/admin.js
+++ b/modules/admin/tpl/js/admin.js
@@ -1299,7 +1299,7 @@ jQuery(function($){
position = {x:event.pageX, y:event.pageY};
offset = getOffset($tr.get(0), ofspar);
- $clone = $tr.attr('target', true).clone(true).appendTo($table);
+ $clone = $tr.attr('target', true).clone(true).find('input').removeAttr('id name').end().appendTo($table);
// get colspan
cols = ($th=$table.find('thead th')).length;
From ba74b47a292fef10ab2d5d9a4e1b24063ee40ea0 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Mon, 31 Mar 2025 01:11:51 +0900
Subject: [PATCH 32/41] Fix matching of partial attribute names #2537
---
common/framework/parsers/template/TemplateParser_v2.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/common/framework/parsers/template/TemplateParser_v2.php b/common/framework/parsers/template/TemplateParser_v2.php
index ff4dd6bde..501845a2a 100644
--- a/common/framework/parsers/template/TemplateParser_v2.php
+++ b/common/framework/parsers/template/TemplateParser_v2.php
@@ -260,7 +260,7 @@ class TemplateParser_v2
$basepath = \RX_BASEURL . $this->template->relative_dirname;
// Convert all src and srcset attributes.
- $regexp = '#(<(?:img|audio|video|script|input|source|link)\s[^>]*)(src|srcset|poster)="([^"]+)"#';
+ $regexp = '#(<(?:img|audio|video|script|input|source|link)\s[^>]*)(?<=\s)(src|srcset|poster)="([^"]+)"#';
$content = preg_replace_callback($regexp, function($match) use ($basepath) {
if ($match[2] !== 'srcset')
{
From fc2bdd7253fb168fdbc548dc955fd9698304e012 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Mon, 31 Mar 2025 15:14:58 +0900
Subject: [PATCH 33/41] Make _v2_escape() more lenient about types
---
common/framework/Template.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/common/framework/Template.php b/common/framework/Template.php
index 49ffb831b..f5919beab 100644
--- a/common/framework/Template.php
+++ b/common/framework/Template.php
@@ -961,12 +961,12 @@ class Template
* @param string $str
* @return string
*/
- protected function _v2_escape(string $str): string
+ protected function _v2_escape($str): string
{
switch ($this->config->context)
{
- case 'JS': return escape_js($str);
- default: return escape($str);
+ case 'JS': return escape_js(strval($str));
+ default: return escape(strval($str));
}
}
From a6fbf6e2e52815e7e535fde63b1e26d03b6175c0 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Mon, 31 Mar 2025 23:06:07 +0900
Subject: [PATCH 34/41] Fix unfilled sprintf code in msg_user_not_confirmed
https://rhymix.org/qna/1905384
---
modules/member/member.controller.php | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php
index d02a9821f..9e2a488e8 100644
--- a/modules/member/member.controller.php
+++ b/modules/member/member.controller.php
@@ -1792,7 +1792,10 @@ class MemberController extends Member
$chk_args = new stdClass;
$chk_args->member_srl = $member_info->member_srl;
$output = executeQuery('member.chkAuthMail', $chk_args);
- if($output->toBool() && $output->data->count != '0') throw new Rhymix\Framework\Exception('msg_user_not_confirmed');
+ if ($output->toBool() && $output->data->count > 0)
+ {
+ throw new Rhymix\Framework\Exception(sprintf('msg_user_not_confirmed', $member_info->email_address));
+ }
}
// Get password reset method
From 0a3fa5c77bc0ddd8b6cd38726edcd00f2de6ab0c Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Wed, 16 Apr 2025 12:06:57 +0900
Subject: [PATCH 35/41] Prevent unnecessary length calculation if
minlength/maxlength are not set
---
.../parsers/dbquery/VariableBase.php | 24 +++++++++++++++----
1 file changed, 19 insertions(+), 5 deletions(-)
diff --git a/common/framework/parsers/dbquery/VariableBase.php b/common/framework/parsers/dbquery/VariableBase.php
index 5d20ffe00..0c5f984dd 100644
--- a/common/framework/parsers/dbquery/VariableBase.php
+++ b/common/framework/parsers/dbquery/VariableBase.php
@@ -450,14 +450,28 @@ class VariableBase
}
// Check minimum and maximum lengths.
- $length = is_scalar($value) ? iconv_strlen($value, 'UTF-8') : (is_countable($value) ? count($value) : 1);
- if (isset($this->minlength) && $this->minlength > 0 && $length < $this->minlength)
+ $length = null;
+ if (isset($this->minlength) && $this->minlength > 0)
{
- throw new \Rhymix\Framework\Exceptions\QueryError('Variable ' . $this->var . ' for column ' . $column . ' must contain no less than ' . $this->minlength . ' characters');
+ if ($length === null)
+ {
+ $length = is_scalar($value) ? mb_strlen($value, 'UTF-8') : (is_countable($value) ? count($value) : 1);
+ }
+ if ($length < $this->minlength)
+ {
+ throw new \Rhymix\Framework\Exceptions\QueryError('Variable ' . $this->var . ' for column ' . $column . ' must contain no less than ' . $this->minlength . ' characters');
+ }
}
- if (isset($this->maxlength) && $this->maxlength > 0 && $length > $this->maxlength)
+ if (isset($this->maxlength) && $this->maxlength > 0)
{
- throw new \Rhymix\Framework\Exceptions\QueryError('Variable ' . $this->var . ' for column ' . $column . ' must contain no more than ' . $this->maxlength . ' characters');
+ if ($length === null)
+ {
+ $length = is_scalar($value) ? mb_strlen($value, 'UTF-8') : (is_countable($value) ? count($value) : 1);
+ }
+ if ($length > $this->maxlength)
+ {
+ throw new \Rhymix\Framework\Exceptions\QueryError('Variable ' . $this->var . ' for column ' . $column . ' must contain no more than ' . $this->maxlength . ' characters');
+ }
}
}
From cac3ec1165e34fc10186a5d8c77e90d5d1f0c4b6 Mon Sep 17 00:00:00 2001
From: Kijin
Date: Mon, 28 Apr 2025 21:46:45 +0900
Subject: [PATCH 36/41] Fix potentially erroneous response size in debug output
#2546
---
classes/display/DisplayHandler.class.php | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php
index d9ed8241c..1d2fd8194 100644
--- a/classes/display/DisplayHandler.class.php
+++ b/classes/display/DisplayHandler.class.php
@@ -9,7 +9,6 @@ class DisplayHandler extends Handler
{
public static $response_size = 0;
public static $debug_printed = 0;
- public $content_size = 0;
public $handler = NULL;
/**
@@ -140,12 +139,15 @@ class DisplayHandler extends Handler
$buff = ltrim($buff, "\n\r\t\v\x00\x20\u{FEFF}");
// call a trigger after display
- self::$response_size = $this->content_size = strlen($output);
ModuleHandler::triggerCall('display', 'after', $output);
+ // Measure the response size.
+ self::$response_size = strlen((string)$output);
+
// Output buffered content only if the current page is HTML.
if ($handler instanceof HTMLDisplayHandler)
{
+ self::$response_size += strlen($buff);
echo $buff;
}
From 67c0066f90fa2c43b6c8222480d3f710f26bf1ca Mon Sep 17 00:00:00 2001
From: Kijin
Date: Mon, 28 Apr 2025 22:04:50 +0900
Subject: [PATCH 37/41] Allow page skin to contain content_modify.blade.php or
content_modify.html #2500
---
modules/page/page.admin.view.php | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/modules/page/page.admin.view.php b/modules/page/page.admin.view.php
index f9baef8ae..bbf4c5c4e 100644
--- a/modules/page/page.admin.view.php
+++ b/modules/page/page.admin.view.php
@@ -305,8 +305,17 @@ class PageAdminView extends Page
Context::set('oDocument', $oDocument);
Context::set('mid', $this->module_info->mid);
- $this->setLayoutFile('');
- $this->setTemplateFile('article_content_modify');
+ $this->setLayoutAndTemplatePaths($isMobile ? 'M' : 'P', $this->module_info);
+ $skin_path = rtrim($this->getTemplatePath(), '/') . '/';
+ if (file_exists($skin_path . 'content_modify.blade.php') || file_exists($skin_path . 'content_modify.html'))
+ {
+ $this->setTemplateFile('content_modify');
+ }
+ else
+ {
+ $this->setTemplatePath($this->module_path . 'tpl');
+ $this->setTemplateFile('article_content_modify');
+ }
}
/**
From b77fcb747d5cd0ec1fbfc6940d748e9516b73f46 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Tue, 29 Apr 2025 23:39:15 +0900
Subject: [PATCH 38/41] Fix missing default value when extravar is not migrated
from previous version
---
modules/extravar/models/Value.php | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/modules/extravar/models/Value.php b/modules/extravar/models/Value.php
index efe3f2752..033ca15c9 100644
--- a/modules/extravar/models/Value.php
+++ b/modules/extravar/models/Value.php
@@ -190,10 +190,15 @@ class Value
{
return $this->default;
}
- elseif (is_array($this->options))
+
+ if (is_array($this->options))
{
return $this->default;
}
+ elseif ($this->default)
+ {
+ return array_first($this->getOptions());
+ }
else
{
return null;
From 197295ba437ebb22bab19636ee18dd649cc178e3 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Tue, 29 Apr 2025 23:56:02 +0900
Subject: [PATCH 39/41] Improve filtering of user layout image filename
---
modules/layout/layout.admin.controller.php | 25 ++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/modules/layout/layout.admin.controller.php b/modules/layout/layout.admin.controller.php
index a60ce6ea5..bfdb30de3 100644
--- a/modules/layout/layout.admin.controller.php
+++ b/modules/layout/layout.admin.controller.php
@@ -390,6 +390,7 @@ class LayoutAdminController extends Layout
if(!is_dir($path)) FileHandler::makeDir($path);
$filename = strtolower($source['name']);
+ $filename = Rhymix\Framework\Filters\FilenameFilter::clean($filename);
if($filename != urlencode($filename))
{
$ext = substr(strrchr($filename,'.'),1);
@@ -407,9 +408,19 @@ class LayoutAdminController extends Layout
*/
function procLayoutAdminUserImageDelete()
{
- $filename = Context::get('filename');
$layout_srl = Context::get('layout_srl');
- $this->removeUserLayoutImage($layout_srl,$filename);
+ if (!$layout_srl)
+ {
+ throw new Rhymix\Framework\Exceptions\InvalidRequest();
+ }
+
+ $filename = Context::get('filename');
+ if (preg_match('!(\.\.|[/\\\\])!', $filename))
+ {
+ throw new Rhymix\Framework\Exceptions\InvalidRequest();
+ }
+
+ $this->removeUserLayoutImage($layout_srl, $filename);
$this->setMessage('success_deleted');
$this->setRedirectUrl(Context::get('error_return_url'));
}
@@ -418,13 +429,19 @@ class LayoutAdminController extends Layout
* delete image into user layout
* @param int $layout_srl
* @param string $filename
- * @return void
+ * @return bool
*/
function removeUserLayoutImage($layout_srl,$filename)
{
$oLayoutModel = getModel('layout');
$path = $oLayoutModel->getUserLayoutImagePath($layout_srl);
- @unlink($path . $filename);
+ $path = FileHandler::getRealPath($path . Rhymix\Framework\Filters\FilenameFilter::clean($filename));
+ if (!Rhymix\Framework\Storage::exists($path))
+ {
+ throw new Rhymix\Framework\Exceptions\TargetNotFound();
+ }
+
+ return Rhymix\Framework\Storage::delete($path);
}
// deprecated
From e2040b881d62ad72dec7c94ce5aa1c994537324d Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Wed, 30 Apr 2025 09:50:07 +0900
Subject: [PATCH 40/41] Version 2.1.23
---
common/constants.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/common/constants.php b/common/constants.php
index b5842403a..3589e734d 100644
--- a/common/constants.php
+++ b/common/constants.php
@@ -3,7 +3,7 @@
/**
* RX_VERSION is the version number of the Rhymix CMS.
*/
-define('RX_VERSION', '2.1.22');
+define('RX_VERSION', '2.1.23');
/**
* RX_MICROTIME is the startup time of the current script, in microseconds since the Unix epoch.
From b09477a87314247d64ca2124560c399615e11130 Mon Sep 17 00:00:00 2001
From: Kijin Sung
Date: Fri, 2 May 2025 11:30:35 +0900
Subject: [PATCH 41/41] Fix incorrect extension when old file module config is
used without updating
---
modules/file/file.controller.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php
index f77462546..5c252c20a 100644
--- a/modules/file/file.controller.php
+++ b/modules/file/file.controller.php
@@ -1194,7 +1194,7 @@ class FileController extends File
{
$adjusted['type'] = 'mp4';
}
- elseif (!empty($config->image_autoconv[$image_info['type']]))
+ elseif (!empty($config->image_autoconv[$image_info['type']]) && tobool($config->image_autoconv[$image_info['type']]))
{
$adjusted['type'] = $config->image_autoconv[$image_info['type']];
}