diff --git a/.github/workflows/setup-php.sh b/.github/workflows/setup-php.sh index e978e92a0..ef9b1656c 100644 --- a/.github/workflows/setup-php.sh +++ b/.github/workflows/setup-php.sh @@ -4,47 +4,27 @@ sudo add-apt-repository -y ppa:ondrej/php # Install all required packages -if [[ "$1" == "8.5" ]]; then - sudo apt -y install \ - php$1-bcmath \ - php$1-cli \ - php$1-common \ - php$1-curl \ - php$1-gd \ - php$1-intl \ - php$1-mbstring \ - php$1-mysql \ - php$1-readline \ - php$1-sqlite3 \ - php$1-xml \ - php$1-zip -else - sudo apt -y install \ - php$1-apcu \ - php$1-bcmath \ - php$1-cli \ - php$1-common \ - php$1-curl \ - php$1-gd \ - php$1-intl \ - php$1-mbstring \ - php$1-mysql \ - php$1-opcache \ - php$1-readline \ - php$1-sqlite3 \ - php$1-xml \ - php$1-zip -fi +sudo apt -y install \ + php$1-apcu \ + php$1-bcmath \ + php$1-cli \ + php$1-common \ + php$1-curl \ + php$1-gd \ + php$1-intl \ + php$1-mbstring \ + php$1-mysql \ + php$1-readline \ + php$1-sqlite3 \ + php$1-xml \ + php$1-zip # Adjust php.ini settings -if [[ "$1" == "8.5" ]]; then - sudo bash -c "echo 'register_argc_argv = On' >> /etc/php/$1/cli/php.ini" -else - sudo bash -c "echo 'opcache.enable = 1' >> /etc/php/$1/cli/conf.d/10-opcache.ini" - sudo bash -c "echo 'opcache.enable_cli = 1' >> /etc/php/$1/cli/conf.d/10-opcache.ini" - sudo bash -c "echo 'opcache.jit = tracing' >> /etc/php/$1/cli/conf.d/10-opcache.ini" - sudo bash -c "echo 'opcache.jit_buffer_size = 128M' >> /etc/php/$1/cli/conf.d/10-opcache.ini" -fi +sudo bash -c "echo 'register_argc_argv = On' >> /etc/php/$1/cli/php.ini" +sudo bash -c "echo 'opcache.enable = 1' >> /etc/php/$1/cli/conf.d/10-opcache.ini" +sudo bash -c "echo 'opcache.enable_cli = 1' >> /etc/php/$1/cli/conf.d/10-opcache.ini" +sudo bash -c "echo 'opcache.jit = tracing' >> /etc/php/$1/cli/conf.d/10-opcache.ini" +sudo bash -c "echo 'opcache.jit_buffer_size = 128M' >> /etc/php/$1/cli/conf.d/10-opcache.ini" # Enable APCu if [ -f "/etc/php/$1/cli/conf.d/20-apcu.ini" ]; then diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index 0c9f71190..a24ed24e3 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -139,7 +139,7 @@ class Context */ private static $_check_patterns = array( '@<(?:\?|%)@' => 'DENY ALL', - '@ diff --git a/modules/editor/editor.model.php b/modules/editor/editor.model.php index bcc20d225..f6a430aef 100644 --- a/modules/editor/editor.model.php +++ b/modules/editor/editor.model.php @@ -469,6 +469,11 @@ class EditorModel extends Editor if ($type === 'document') { $option->upload_target_type = 'doc'; + // For dispWidgetAdminAddContent + if ($primary_key_name === 'module_srl') + { + $option->upload_target_type = 'mod'; + } } elseif ($type === 'comment') { diff --git a/modules/file/file.controller.php b/modules/file/file.controller.php index cf1842a9e..ba8876dbf 100644 --- a/modules/file/file.controller.php +++ b/modules/file/file.controller.php @@ -307,7 +307,7 @@ class FileController extends File $file_srl = Context::get('file_srl'); $sid = Context::get('sid'); - $filename_arg = Context::get('filename'); + $filename_arg = htmlspecialchars_decode(Context::get('filename') ?? ''); // Get file information from the DB $file_obj = FileModel::getFile($file_srl); @@ -318,7 +318,7 @@ class FileController extends File { throw new Rhymix\Framework\Exceptions\TargetNotFound('msg_file_not_found'); } - if ($filename_arg !== null && $filename_arg !== $filename) + if ($filename_arg !== '' && $filename_arg !== $filename) { throw new Rhymix\Framework\Exceptions\TargetNotFound('msg_file_not_found'); } @@ -434,7 +434,7 @@ class FileController extends File // Get requsted file info $file_srl = Context::get('file_srl'); $file_key = Context::get('file_key'); - $filename_arg = Context::get('filename'); + $filename_arg = htmlspecialchars_decode(Context::get('filename') ?? ''); $columnList = array('source_filename', 'uploaded_filename', 'file_size'); $file_obj = FileModel::getFile($file_srl, $columnList); @@ -460,7 +460,7 @@ class FileController extends File } // Check filename if given - if ($filename_arg !== null && $filename_arg !== $filename) + if ($filename_arg !== '' && $filename_arg !== $filename) { throw new Rhymix\Framework\Exceptions\TargetNotFound('msg_file_not_found'); } diff --git a/modules/file/file.model.php b/modules/file/file.model.php index 4a1c40e7b..ba69f6c6e 100644 --- a/modules/file/file.model.php +++ b/modules/file/file.model.php @@ -476,8 +476,8 @@ class FileModel extends File $nullList = array(); foreach ($output->data as $file) { - $file->source_filename = escape($file->source_filename, false); $file->download_url = self::getDownloadUrl($file->file_srl, $file->sid, 0, $file->source_filename); + $file->source_filename = escape($file->source_filename, false); $fileList[] = $file; if ($file->upload_target_type === null) { diff --git a/modules/layout/layout.view.php b/modules/layout/layout.view.php index ee6e87b7c..b83713a16 100644 --- a/modules/layout/layout.view.php +++ b/modules/layout/layout.view.php @@ -320,7 +320,7 @@ class LayoutView extends Layout */ function dispLayoutPreview() { - if(!checkCSRF()) + if(!Rhymix\Framework\Security::checkCSRF()) { throw new Rhymix\Framework\Exceptions\InvalidRequest; } diff --git a/modules/member/lang/en.php b/modules/member/lang/en.php index 305947b29..874008eb8 100644 --- a/modules/member/lang/en.php +++ b/modules/member/lang/en.php @@ -152,6 +152,7 @@ $lang->cmd_modify_nickname_allow = 'Allow Nickname Change'; $lang->cmd_modify_nickname_log = 'Nickname Change Log'; $lang->cmd_nickname_symbols = 'Allow Symbols in Nickname'; $lang->cmd_nickname_symbols_list = 'Only Allow:'; +$lang->cmd_nickname_allow_spaces = 'Allow Spaces'; $lang->cmd_member_profile_view = 'Show member profile picture'; $lang->cmd_allow_duplicate_nickname = 'Allow Duplicate Nicknames'; $lang->about_allow_duplicate_nickname = 'Allow more than one member to use the same nickname.'; diff --git a/modules/member/lang/ko.php b/modules/member/lang/ko.php index d49ba42ea..fd29a4d81 100644 --- a/modules/member/lang/ko.php +++ b/modules/member/lang/ko.php @@ -154,6 +154,7 @@ $lang->cmd_modify_nickname_allow = '닉네임 변경 허용'; $lang->cmd_modify_nickname_log = '닉네임 변경 기록'; $lang->cmd_nickname_symbols = '닉네임에 특수문자 허용'; $lang->cmd_nickname_symbols_list = '다음의 문자만 허용:'; +$lang->cmd_nickname_allow_spaces = '띄어쓰기 허용'; $lang->cmd_member_profile_view = '회원 프로필사진 보이기'; $lang->cmd_allow_duplicate_nickname = '닉네임 중복 허용'; $lang->about_allow_duplicate_nickname = '여러 회원이 동일한 닉네임을 사용하는 것을 허용합니다. 주의: 잘못 사용할 경우 혼란이 발생할 수 있습니다.'; diff --git a/modules/member/member.admin.controller.php b/modules/member/member.admin.controller.php index c9aebbfae..1bc72fe41 100644 --- a/modules/member/member.admin.controller.php +++ b/modules/member/member.admin.controller.php @@ -24,7 +24,7 @@ class MemberAdminController extends Member // if(Context::getRequestMethod() == "GET") return new Object(-1, "msg_invalid_request"); // Extract the necessary information in advance $logged_info = Context::get('logged_info'); - if($logged_info->is_admin != 'Y' || !checkCSRF()) + if($logged_info->is_admin != 'Y' || !Rhymix\Framework\Security::checkCSRF()) { throw new Rhymix\Framework\Exceptions\InvalidRequest; } @@ -127,18 +127,26 @@ class MemberAdminController extends Member } // remove whitespace - foreach(['user_id', 'nick_name', 'email_address'] as $val) + foreach (['user_id', 'email_address'] as $val) { - if(isset($args->{$val})) + if (isset($args->{$val})) { $args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val}))); } } - foreach(['user_name'] as $val) + if (isset($args->user_name)) { - if(isset($args->{$val})) + $args->user_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->user_name))); + } + if (isset($args->nick_name)) + { + if (isset($config->nickname_spaces) && $config->nickname_spaces === 'Y') { - $args->{$val} = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->{$val}))); + $args->nick_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->nick_name))); + } + else + { + $args->nick_name = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->nick_name))); } } @@ -256,6 +264,7 @@ class MemberAdminController extends Member 'update_nickname_log', 'nickname_symbols', 'nickname_symbols_allowed_list', + 'nickname_spaces', 'allow_duplicate_nickname', 'member_profile_view' ); @@ -347,6 +356,7 @@ class MemberAdminController extends Member $args->nickname_symbols = 'Y'; } $args->nickname_symbols_allowed_list = utf8_trim($args->nickname_symbols_allowed_list); + $args->nickname_spaces = (isset($args->nickname_spaces) && $args->nickname_spaces === 'Y') ? 'Y' : 'N'; $oModuleController = getController('module'); $output = $oModuleController->updateModuleConfig('member', $args); diff --git a/modules/member/member.controller.php b/modules/member/member.controller.php index 8796115ad..a47d72a55 100644 --- a/modules/member/member.controller.php +++ b/modules/member/member.controller.php @@ -163,7 +163,7 @@ class MemberController extends Member */ function procMemberScrapDocument() { - $document_srl = (int) (Context::get('document_srl') ?: Context::get('target_srl')); + $document_srl = intval(Context::get('document_srl') ?: Context::get('target_srl')); if(!$document_srl) { throw new Rhymix\Framework\Exceptions\InvalidRequest; @@ -272,7 +272,7 @@ class MemberController extends Member if(!Context::get('is_logged')) throw new Rhymix\Framework\Exceptions\MustLogin; $logged_info = Context::get('logged_info'); - $document_srl = (int)Context::get('document_srl'); + $document_srl = intval(Context::get('document_srl') ?: Context::get('target_srl')); if(!$document_srl) { throw new Rhymix\Framework\Exceptions\InvalidRequest; @@ -312,8 +312,8 @@ class MemberController extends Member if(!Context::get('is_logged')) throw new Rhymix\Framework\Exceptions\MustLogin; $logged_info = Context::get('logged_info'); - $document_srl = (int)Context::get('document_srl'); - $folder_srl = (int)Context::get('folder_srl'); + $document_srl = intval(Context::get('document_srl') ?: Context::get('target_srl')); + $folder_srl = intval(Context::get('folder_srl')); if(!$document_srl || !$folder_srl) { throw new Rhymix\Framework\Exceptions\InvalidRequest; @@ -524,7 +524,7 @@ class MemberController extends Member if(!Context::get('is_logged')) throw new Rhymix\Framework\Exceptions\MustLogin; $logged_info = Context::get('logged_info'); - $document_srl = (int)Context::get('document_srl'); + $document_srl = intval(Context::get('document_srl') ?: Context::get('target_srl')); if(!$document_srl) throw new Rhymix\Framework\Exceptions\InvalidRequest; $oDocument = DocumentModel::getDocument($document_srl); @@ -796,25 +796,34 @@ class MemberController extends Member } // remove whitespace - foreach(['user_id', 'nick_name', 'email_address'] as $val) + foreach (['user_id', 'email_address'] as $val) { - if(isset($args->{$val})) + if (isset($args->{$val})) { $args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val}))); } } - foreach(['user_name'] as $val) + if (isset($args->user_name)) { - if(isset($args->{$val})) + $args->user_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->user_name))); + } + if (isset($args->nick_name)) + { + if (isset($config->nickname_spaces) && $config->nickname_spaces === 'Y') { - $args->{$val} = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->{$val}))); + $args->nick_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->nick_name))); } + else + { + $args->nick_name = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->nick_name))); + } + } // Check symbols in nickname if($config->nickname_symbols === 'N') { - if(preg_match('/[^\pL\d]/u', $args->nick_name, $matches)) + if(preg_match('/[^\pL\d\s]/u', $args->nick_name, $matches)) { throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0]))); } @@ -822,7 +831,7 @@ class MemberController extends Member elseif($config->nickname_symbols === 'LIST') { $list = preg_quote($config->nickname_symbols_allowed_list, '/'); - if(preg_match('/[^\pL\d' . $list . ']/u', $args->nick_name, $matches)) + if(preg_match('/[^\pL\d\s' . $list . ']/u', $args->nick_name, $matches)) { throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0]))); } @@ -1098,19 +1107,28 @@ class MemberController extends Member $args->extra_vars = serialize($extra_vars); // remove whitespace - foreach(['user_id', 'nick_name', 'email_address'] as $val) + foreach (['user_id', 'email_address'] as $val) { - if(isset($args->{$val})) + if (isset($args->{$val})) { $args->{$val} = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->{$val}))); } } - foreach(['user_name'] as $val) + if (isset($args->user_name)) { - if(isset($args->{$val})) + $args->user_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->user_name))); + } + if (isset($args->nick_name)) + { + if (isset($config->nickname_spaces) && $config->nickname_spaces === 'Y') { - $args->{$val} = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->{$val}))); + $args->nick_name = utf8_normalize_spaces(utf8_clean(html_entity_decode($args->nick_name))); } + else + { + $args->nick_name = preg_replace('/[\pZ\pC]+/u', '', utf8_clean(html_entity_decode($args->nick_name))); + } + } // Check if nickname change is allowed @@ -1134,7 +1152,7 @@ class MemberController extends Member // Check symbols in nickname if($config->nickname_symbols === 'N') { - if(preg_match('/[^\pL\d]/u', $args->nick_name, $matches)) + if(preg_match('/[^\pL\d\s]/u', $args->nick_name, $matches)) { throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0]))); } @@ -1142,7 +1160,7 @@ class MemberController extends Member elseif($config->nickname_symbols === 'LIST') { $list = preg_quote($config->nickname_symbols_allowed_list, '/'); - if(preg_match('/[^\pL\d' . $list . ']/u', $args->nick_name, $matches)) + if(preg_match('/[^\pL\d\s' . $list . ']/u', $args->nick_name, $matches)) { throw new Rhymix\Framework\Exception(sprintf(lang('msg_invalid_symbol_in_nickname'), escape($matches[0]))); } diff --git a/modules/member/tpl/default_config.html b/modules/member/tpl/default_config.html index ceb2b259e..0155e3140 100644 --- a/modules/member/tpl/default_config.html +++ b/modules/member/tpl/default_config.html @@ -83,6 +83,7 @@
{$lang->about_nickname_symbols}
+ + +suffix; + $__Context->employees = [ + ['name' => 'Alice', 'age' => 30], + ['name' => 'Bob', 'age' => 25], + ['name' => 'Charlie', 'age' => 35], + ]; + $__Context->suffix = '님'; + $__Context->names = array_map(function($e, $key = 'name') use ($suffix) { + return $e[$key] . $suffix; + }, $__Context->employees); + function convert_names(array $names = array()): array + { + return array_map(function($name) { + return ucfirst($name); + }, $names); + } +?> +