Skip to content

Commit 0aed1ef

Browse files
committed
Merge remote-tracking branch 'origin/V4.0' into V5
2 parents 59479f0 + 423dd79 commit 0aed1ef

File tree

18 files changed

+100
-59
lines changed

18 files changed

+100
-59
lines changed

publiccms-parent/publiccms-core/src/main/java/com/publiccms/common/tools/CmsFileUtils.java

Lines changed: 54 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.nio.file.attribute.BasicFileAttributes;
1616
import java.util.ArrayList;
1717
import java.util.Arrays;
18+
import java.util.Collection;
1819
import java.util.Collections;
1920
import java.util.Comparator;
2021
import java.util.Date;
@@ -25,6 +26,7 @@
2526
import org.apache.commons.io.FileUtils;
2627
import org.apache.commons.io.IOUtils;
2728
import org.apache.commons.lang3.ArrayUtils;
29+
import org.apache.pdfbox.cos.COSArray;
2830
import org.apache.pdfbox.cos.COSBase;
2931
import org.apache.pdfbox.cos.COSDictionary;
3032
import org.apache.pdfbox.cos.COSName;
@@ -83,28 +85,34 @@ private CmsFileUtils() {
8385
/**
8486
*
8587
*/
86-
public static final String[] DOCUMENT_FILE_SUFFIXS = new String[] { ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".ofd" };
88+
public static final String[] DOCUMENT_FILE_SUFFIXS = new String[] { ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf",
89+
".txt", ".md", ".ofd" };
8790
/**
8891
*
8992
*/
90-
public static final String[] VIDEO_FILE_SUFFIXS = new String[] { ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm" };
93+
public static final String[] VIDEO_FILE_SUFFIXS = new String[] { ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg",
94+
".mpg", ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm" };
9195
/**
9296
*
9397
*/
94-
public static final String[] OTHER_FILE_SUFFIXS = new String[] { ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso", ".psd" };
98+
public static final String[] OTHER_FILE_SUFFIXS = new String[] { ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",
99+
".psd" };
95100
/**
96101
*
97102
*/
98-
public static final String[] ALLOW_FILES = ArrayUtils
99-
.addAll(ArrayUtils.addAll(ArrayUtils.addAll(ArrayUtils.addAll(AUDIO_FILE_SUFFIXS, VIDEO_FILE_SUFFIXS), IMAGE_FILE_SUFFIXS), DOCUMENT_FILE_SUFFIXS), OTHER_FILE_SUFFIXS);
103+
public static final String[] ALLOW_FILES = ArrayUtils.addAll(
104+
ArrayUtils.addAll(ArrayUtils.addAll(ArrayUtils.addAll(AUDIO_FILE_SUFFIXS, VIDEO_FILE_SUFFIXS), IMAGE_FILE_SUFFIXS),
105+
DOCUMENT_FILE_SUFFIXS),
106+
OTHER_FILE_SUFFIXS);
100107
/**
101108
*
102109
*/
103110
public static final String[] IMAGE_FILETYPES = new String[] { CmsFileUtils.FILE_TYPE_IMAGE };
104111
/**
105112
*
106113
*/
107-
public static final String[] OTHER_FILETYPES = new String[] { CmsFileUtils.FILE_TYPE_VIDEO, CmsFileUtils.FILE_TYPE_AUDIO, CmsFileUtils.FILE_TYPE_DOCUMENT, CmsFileUtils.FILE_TYPE_OTHER };
114+
public static final String[] OTHER_FILETYPES = new String[] { CmsFileUtils.FILE_TYPE_VIDEO, CmsFileUtils.FILE_TYPE_AUDIO,
115+
CmsFileUtils.FILE_TYPE_DOCUMENT, CmsFileUtils.FILE_TYPE_OTHER };
108116

109117
/**
110118
*
@@ -256,7 +264,8 @@ public static List<FileInfo> getFileList(String dirPath, boolean useFilter, Stri
256264
Path fileNamePath = entry.getFileName();
257265
if (null != fileNamePath) {
258266
String fileName = fileNamePath.toString();
259-
if (!useFilter || !fileName.endsWith(".data") && !TemplateComponent.INCLUDE_DIRECTORY.equalsIgnoreCase(fileName)) {
267+
if (!useFilter
268+
|| !fileName.endsWith(".data") && !TemplateComponent.INCLUDE_DIRECTORY.equalsIgnoreCase(fileName)) {
260269
BasicFileAttributes attrs = Files.readAttributes(entry, BasicFileAttributes.class);
261270
fileList.add(new FileInfo(fileName, attrs.isDirectory(), attrs));
262271
}
@@ -560,20 +569,46 @@ public static boolean isSafe(String filepath, String suffix) {
560569

561570
private static boolean isSafe(List<COSObject> pdfObjects) {
562571
for (COSObject object : pdfObjects) {
563-
COSBase realObject = object.getObject();
564-
if (realObject instanceof COSDictionary) {
565-
COSDictionary dic = (COSDictionary) realObject;
566-
if (null != dic.getDictionaryObject(COSName.JS) || null != dic.getDictionaryObject(COSName.JAVA_SCRIPT)) {
567-
return false;
568-
}
569-
} else if (realObject instanceof COSName && (COSName.JS.equals(realObject) || COSName.JAVA_SCRIPT.equals(realObject))) {
572+
if (isUnSafe(object)) {
570573
return false;
571-
572574
}
573575
}
574576
return true;
575577
}
576578

579+
private static boolean isUnSafe(Collection<COSBase> pdfObjects) {
580+
for (COSBase object : pdfObjects) {
581+
if (isUnSafe(object)) {
582+
return true;
583+
}
584+
}
585+
return false;
586+
}
587+
588+
private static boolean isUnSafe(COSObject object) {
589+
return isUnSafe(object.getObject());
590+
}
591+
592+
private static boolean isUnSafe(COSBase realObject) {
593+
if (realObject instanceof COSDictionary) {
594+
COSDictionary dic = (COSDictionary) realObject;
595+
if (null != dic.getDictionaryObject(COSName.JS) || null != dic.getDictionaryObject(COSName.JAVA_SCRIPT)) {
596+
return true;
597+
}
598+
return isUnSafe(dic.getValues());
599+
} else if (realObject instanceof COSArray) {
600+
COSArray array = (COSArray) realObject;
601+
for (COSBase object : array) {
602+
if (isUnSafe(object)) {
603+
return true;
604+
}
605+
}
606+
} else if (realObject instanceof COSName && (COSName.JS.equals(realObject) || COSName.JAVA_SCRIPT.equals(realObject))) {
607+
return false;
608+
}
609+
return false;
610+
}
611+
577612
/**
578613
* 获取文件内容 Get file content ファイルの内容を取得します
579614
*
@@ -658,7 +693,8 @@ public static String getSuffix(String originalFilename) {
658693
if (null != originalFilename) {
659694
int index = originalFilename.lastIndexOf(Constants.DOT);
660695
if (-1 < index) {
661-
return originalFilename.substring(originalFilename.lastIndexOf(Constants.DOT), originalFilename.length()).toLowerCase();
696+
return originalFilename.substring(originalFilename.lastIndexOf(Constants.DOT), originalFilename.length())
697+
.toLowerCase();
662698
}
663699
}
664700
return null;
@@ -711,7 +747,8 @@ public static String upload(byte[] data, String fileName) throws IllegalStateExc
711747
* @throws IllegalStateException
712748
* @throws IOException
713749
*/
714-
public static String upload(byte[] data, String fileName, String originalName, String metadataPath) throws IllegalStateException, IOException {
750+
public static String upload(byte[] data, String fileName, String originalName, String metadataPath)
751+
throws IllegalStateException, IOException {
715752
File dest = new File(fileName);
716753
dest.getParentFile().mkdirs();
717754
FileUtils.writeByteArrayToFile(dest, data);

publiccms-parent/publiccms-core/src/main/resources/initialization/sql/V4.0.202406-V4.0.202506.sql

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,6 @@ INSERT INTO `sys_module_lang` VALUES ('place_import', 'ja', '導入');
340340
INSERT INTO `sys_module_lang` VALUES ('place_import', 'zh', '导入');
341341
-- 2025-06-25 --
342342
DELETE FROM sys_module_lang WHERE module_id in ('myself_content_view','myself_process_view');
343-
UPDATE sys_module SET menu = 0 WHERE id = 'content_check';
343+
UPDATE sys_module SET menu = 0 WHERE id = 'content_check';
344+
--2025-12-05 --
345+
UPDATE sys_module SET has_child = 1 WHERE id = 'myself_profile';

publiccms-parent/publiccms-core/src/main/resources/initialization/sql/init.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,7 @@ INSERT INTO `sys_module` VALUES ('myself_device', 'myself/userDeviceList', 'sysA
973973
INSERT INTO `sys_module` VALUES ('myself_log_login', 'myself/logLogin', NULL, 'icon-signin', 'myself', 1, 0, 4);
974974
INSERT INTO `sys_module` VALUES ('myself_log_operate', 'myself/logOperate', NULL, 'icon-list-alt', 'myself', 1, 0, 3);
975975
INSERT INTO `sys_module` VALUES ('myself_password', 'myself/password', 'changePassword', NULL, 'myself_profile', 1, 0, 0);
976-
INSERT INTO `sys_module` VALUES ('myself_profile', 'myself/profile', 'sysUser/update,myself/otpsettings,otpSetting/bind,otpSetting/unbind,webauthn/attestation/options,webauthn/attestation/result,webauthn/getCredentials,webauthn/deleteCredential', 'icon-user', 'myself', 1, 0, 0);
976+
INSERT INTO `sys_module` VALUES ('myself_profile', 'myself/profile', 'sysUser/update,myself/otpsettings,otpSetting/bind,otpSetting/unbind,webauthn/attestation/options,webauthn/attestation/result,webauthn/getCredentials,webauthn/deleteCredential', 'icon-user', 'myself', 1, 1, 0);
977977
INSERT INTO `sys_module` VALUES ('myself_token', 'myself/userTokenList', 'sysUserToken/delete', 'icon-unlock-alt', 'myself', 1, 0, 5);
978978
INSERT INTO `sys_module` VALUES ('operation', NULL, NULL, 'bi bi-binoculars-fill', NULL, 1, 1, 7);
979979
INSERT INTO `sys_module` VALUES ('order_confirm', 'tradeOrder/confirmParameters', 'tradeOrder/confirm', NULL, 'order_list', 0, 0, 0);

publiccms-parent/publiccms/src/main/resources/templates/admin/cmsDictionary/add.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
<dt><@t.page 'id'/>:</dt>
3939
<dd>
4040
<input name="oldId" type="hidden" value="${(a.id.id)!}"/>
41-
<input class="required" name="id.id" remote="cmsDictionary/virify<#if id?has_content>?oldId=${(a.id.id)!}</#if>" data-msg-remote="<@t.message 'verify.hasExist.code'/>" type="text" size="20" maxlength="20" value="${(a.id.id)!}"/>
41+
<input class="required" name="id.id" remote="cmsDictionary/virify<#if id?has_content>?oldId=${(a.id.id?url)!}</#if>" data-msg-remote="<@t.message 'verify.hasExist.code'/>" type="text" size="20" maxlength="20" value="${(a.id.id)!}"/>
4242
</dd>
4343
</dl>
4444
<dl class="nowrap">

publiccms-parent/publiccms/src/main/resources/templates/admin/cmsDictionary/addChild.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<@cms.dictionaryDataList dictionaryId=dictionaryId parentValue=parentValue>
44
<#list list as d>
55
<li>
6-
<a href="cmsDictionary/add.html?id=${object.id.id}&parentValue=${d.id.value}" target="navTab" rel="cmsDictionary/edit" title="<@t.page 'dictionary.edit'/>">${d.id.value}:${d.text}</a>
6+
<a href="cmsDictionary/add.html?id=${object.id.id?url}&parentValue=${d.id.value}?url" target="navTab" rel="cmsDictionary/edit" title="<@t.page 'dictionary.edit'/>">${d.id.value}:${d.text}</a>
77
<#if depth gt 1>
88
<@dictionaryTree dictionaryId=dictionaryId parentValue=d.id.value depth=depth-1/>
99
</#if>
@@ -15,12 +15,12 @@
1515
<div class="pageFormContent" layoutH>
1616
<@cms.dictionary id=id>
1717
<ul class="tree treeFolder">
18-
<li><a href="cmsDictionary/add.html?id=${object.id.id}" target="navTab" rel="cmsDictionary/edit"><i class="icon-edit"></i><@t.page 'dictionary.edit'/></a></li>
18+
<li><a href="cmsDictionary/add.html?id=${object.id.id?url}" target="navTab" rel="cmsDictionary/edit"><i class="icon-edit"></i><@t.page 'dictionary.edit'/></a></li>
1919
<#if object.childDepth gt 0>
2020
<@cms.dictionaryDataList dictionaryId=object.id.id>
2121
<#list list as d>
2222
<li>
23-
<a href="cmsDictionary/add.html?id=${object.id.id}&parentValue=${d.id.value}" target="navTab" rel="cmsDictionary/edit" title="<@t.page 'dictionary.edit'/>"> ${d.id.value}:${d.text}</a>
23+
<a href="cmsDictionary/add.html?id=${object.id.id?url}&parentValue=${d.id.value?url}" target="navTab" rel="cmsDictionary/edit" title="<@t.page 'dictionary.edit'/>"> ${d.id.value}:${d.text}</a>
2424
<#if object.childDepth gt 1>
2525
<@dictionaryTree dictionaryId=id parentValue=d.id.value depth=object.childDepth-1/>
2626
</#if>

publiccms-parent/publiccms/src/main/resources/templates/admin/cmsDictionary/excludeTree.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<@cms.dictionaryExcludeValue dictionaryId=id excludeDictionaryId=excludeDictionaryId values=t.values><#assign excludeValueMap=map/></@cms.dictionaryExcludeValue>
99
<#list list as d>
1010
<li>
11-
<a href="cmsDictionary/excludeValue.html?id=${dictionaryId}&excludeDictionaryId=${excludeDictionaryId}&value=${d.id.value}&parentValue=${parentValue}" target="navTab" rel="cmsDictionary/excludeValue" title="<@t.page 'dictionary.exclude'/>">${d.id.value}:${d.text} <#if excludeValueMap[d.id.value]?has_content>(<@t.page 'dictionary.exclude_value'/>:<@cms.dictionaryData dictionaryId=excludeDictionaryId values=excludeValueMap[d.id.value].excludeValues><#list map as k,v>${v.text!}<#sep>,</#list></@cms.dictionaryData>)</#if></a>
11+
<a href="cmsDictionary/excludeValue.html?id=${dictionaryId?url}&excludeDictionaryId=${excludeDictionaryId?url}&value=${d.id.value?url}&parentValue=${parentValue?url}" target="navTab" rel="cmsDictionary/excludeValue" title="<@t.page 'dictionary.exclude'/>">${d.id.value}:${d.text} <#if excludeValueMap[d.id.value]?has_content>(<@t.page 'dictionary.exclude_value'/>:<@cms.dictionaryData dictionaryId=excludeDictionaryId values=excludeValueMap[d.id.value].excludeValues><#list map as k,v>${v.text!}<#sep>,</#list></@cms.dictionaryData>)</#if></a>
1212
<@dictionaryTree dictionaryId=dictionaryId excludeDictionaryId=excludeDictionaryId parentValue=d.id.value depth=depth-1/>
1313
</li>
1414
</#list>
@@ -27,7 +27,7 @@
2727
<ul class="tree treeFolder">
2828
<#if excludeDictionaryId?has_content>
2929
<li>
30-
<a href="cmsDictionary/excludeTree.html?id=${object.id.id}" target="navTab" rel="cmsDictionary/excludeTree" title="<@t.page 'button.return'/>">
30+
<a href="cmsDictionary/excludeTree.html?id=${object.id.id?url}" target="navTab" rel="cmsDictionary/excludeTree" title="<@t.page 'button.return'/>">
3131
<@t.page 'button.return'/>
3232
</a>
3333
</li>
@@ -38,7 +38,7 @@
3838
<@cms.dictionaryExcludeValue dictionaryId=id excludeDictionaryId=excludeDictionaryId values=t.values><#assign excludeValueMap=map/></@cms.dictionaryExcludeValue>
3939
<#list list as d>
4040
<li>
41-
<a href="cmsDictionary/excludeValue.html?id=${object.id.id}&excludeDictionaryId=${excludeDictionaryId}&value=${d.id.value}" target="navTab" rel="cmsDictionary/excludeValue" title="<@t.page 'dictionary.exclude'/>"> ${d.id.value}:${d.text} <#if excludeValueMap[d.id.value]?has_content>(<@t.page 'dictionary.exclude_value'/>:<@cms.dictionaryData dictionaryId=excludeDictionaryId values=excludeValueMap[d.id.value].excludeValues><#list map as k,v>${v.text!}<#sep>,</#list></@cms.dictionaryData>)</#if></a>
41+
<a href="cmsDictionary/excludeValue.html?id=${object.id.id?url}&excludeDictionaryId=${excludeDictionaryId?url}&value=${d.id.value?url}" target="navTab" rel="cmsDictionary/excludeValue" title="<@t.page 'dictionary.exclude'/>"> ${d.id.value}:${d.text} <#if excludeValueMap[d.id.value]?has_content>(<@t.page 'dictionary.exclude_value'/>:<@cms.dictionaryData dictionaryId=excludeDictionaryId values=excludeValueMap[d.id.value].excludeValues><#list map as k,v>${v.text!}<#sep>,</#list></@cms.dictionaryData>)</#if></a>
4242
<#if object.childDepth gt 0>
4343
<@dictionaryTree dictionaryId=id excludeDictionaryId=excludeDictionaryId parentValue=d.id.value depth=object.childDepth-1/>
4444
</#if>
@@ -47,12 +47,12 @@
4747
</@cms.dictionaryDataList>
4848
<#else>
4949
<li>
50-
<a href="cmsDictionary/exclude.html?id=${object.id.id}" target="navTab" rel="cmsDictionary/exclude"><i class="icon-edit"></i><@t.page 'dictionary.exclude'/></a>
50+
<a href="cmsDictionary/exclude.html?id=${object.id.id?url}" target="navTab" rel="cmsDictionary/exclude"><i class="icon-edit"></i><@t.page 'dictionary.exclude'/></a>
5151
</li>
5252
<@cms.dictionaryExcludeList dictionaryId=object.id.id>
5353
<#list list as d>
5454
<li>
55-
<a href="cmsDictionary/excludeTree.html?id=${object.id.id}&excludeDictionaryId=${d.id.excludeDictionaryId}" target="navTab" rel="cmsDictionary/excludeTree"> <@cms.dictionary id=d.id.excludeDictionaryId>${object.name}</@cms.dictionary></a>
55+
<a href="cmsDictionary/excludeTree.html?id=${object.id.id?url}&excludeDictionaryId=${d.id.excludeDictionaryId?url}" target="navTab" rel="cmsDictionary/excludeTree"> <@cms.dictionary id=d.id.excludeDictionaryId>${object.name}</@cms.dictionary></a>
5656
</li>
5757
</#list>
5858
</@cms.dictionaryExcludeList>

publiccms-parent/publiccms/src/main/resources/templates/admin/cmsDictionary/list.html

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,16 @@
6060
<td>${a.childDepth}</td>
6161
<td class="wrap">
6262
<#if a.childDepth gt 0>
63-
<a href="cmsDictionary/addChild.html?id=${a.id.id}" class="edit btnText blue" target="dialog" mask="true"><i class="icon-edit"></i><@t.page 'button.edit'/></a>
63+
<a href="cmsDictionary/addChild.html?id=${a.id.id?url}" class="edit btnText blue" target="dialog" mask="true"><i class="icon-edit"></i><@t.page 'button.edit'/></a>
6464
<#else>
65-
<a href="cmsDictionary/add.html?id=${a.id.id}" class="edit btnText blue" target="navTab" rel="cmsDictionary/edit"><i class="icon-edit"></i><@t.page 'button.edit'/></a>
65+
<a href="cmsDictionary/add.html?id=${a.id.id?url}" class="edit btnText blue" target="navTab" rel="cmsDictionary/edit"><i class="icon-edit"></i><@t.page 'button.edit'/></a>
6666
</#if>
6767
<#if !site.parentId?has_content && authorizedMap['cmsDictionary/export']>
68-
<a href="cmsDictionary/export?id=${a.id.id}&_csrf=<@tools.csrfToken admin=true/>" class="edit btnText" target="_blank"><i class="bi bi-cloud-download"></i><@t.page "button.export"/></a>
68+
<a href="cmsDictionary/export?id=${a.id.id?url}&_csrf=<@tools.csrfToken admin=true/>" class="edit btnText" target="_blank"><i class="bi bi-cloud-download"></i><@t.page "button.export"/></a>
6969
</#if>
70-
<a href="cmsDictionary/excludeTree.html?id=${a.id.id}" class="btnText blue" target="navTab" rel="cmsDictionary/excludeTree" title="${a.name!}"><i class="bi bi-exclude"></i><@t.page 'dictionary.exclude'/></a>
70+
<a href="cmsDictionary/excludeTree.html?id=${a.id.id?url}" class="btnText blue" target="navTab" rel="cmsDictionary/excludeTree" title="${a.name!}"><i class="bi bi-exclude"></i><@t.page 'dictionary.exclude'/></a>
7171
<#if !site.parentId?has_content && authorizedMap['cmsDictionary/delete']>
72-
<a href="cmsDictionary/delete?ids=${a.id.id}&_csrf=<@tools.csrfToken admin=true/>" class="btnText warn" title="<@t.page 'confirm.delete'/>" target="ajaxTodo"><i class="icon-trash"></i><@t.page 'button.delete'/></a>
72+
<a href="cmsDictionary/delete?ids=${a.id.id?url}&_csrf=<@tools.csrfToken admin=true/>" class="btnText warn" title="<@t.page 'confirm.delete'/>" target="ajaxTodo"><i class="icon-trash"></i><@t.page 'button.delete'/></a>
7373
</#if>
7474
</td>
7575
</tr>

publiccms-parent/publiccms/src/main/resources/templates/admin/include_page/extend/dictionary.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
</#if>
1313
<#if 'customform'!=type>
1414
<@sys.authorized roleIds=admin.roles url='cmsDictionary/add'>
15-
<a class="button" href="common/dictionary.html?id=${dictionary.id.id}&inputName=${inputName?url}&required=${extend.required!}&multiple=${extend.multiple!}&value=${value!}" target="ajax" rel="${dictionaryId}"><i class="icon-refresh"></i><@t.page 'button.refresh'/></a>
15+
<a class="button" href="common/dictionary.html?id=${dictionary.id.id?url}&inputName=${inputName?url}&required=${extend.required!}&multiple=${extend.multiple!}&value=${value!}" target="ajax" rel="${dictionaryId}"><i class="icon-refresh"></i><@t.page 'button.refresh'/></a>
1616
<#if dictionary.childDepth gt 0>
17-
<a class="button" href="cmsDictionary/addChild.html?id=${dictionary.id.id}" target="dialog" mask="true"><@t.page 'dictionary.edit'/></a>
17+
<a class="button" href="cmsDictionary/addChild.html?id=${dictionary.id.id?url}" target="dialog" mask="true"><@t.page 'dictionary.edit'/></a>
1818
<#else>
19-
<a class="button" href="cmsDictionary/add.html?id=${dictionary.id.id}" target="navTab" rel="cmsDictionary/edit"><@t.page 'dictionary.edit'/></a>
19+
<a class="button" href="cmsDictionary/add.html?id=${dictionary.id.id?url}" target="navTab" rel="cmsDictionary/edit"><@t.page 'dictionary.edit'/></a>
2020
</#if>
2121
</@sys.authorized>
2222
</#if>

0 commit comments

Comments
 (0)