Last modified by Super Admin on 2026/03/22 00:39

From version Icon 22.1 Icon
edited by Super Admin
on 2026/03/09 11:59
Change comment: There is no comment for this version
To version Icon 27.1 Icon
edited by Super Admin
on 2026/03/12 12:20
Change comment: There is no comment for this version

Summary

Details

Icon Page properties
Content
... ... @@ -27,7 +27,9 @@
27 27   ## ページをプログラム的に作成
28 28   #set($newDoc = $xwiki.getDocument($targetPage))
29 29   ## SchoolTemplateのコンテンツを参照として設定(テンプレートの include)
30 - $newDoc.setContent('{{include reference="SeitokaiCode.SchoolTemplate" /}}')
30 + ## author="target" により、SchoolTemplateの作者(superadmin)の権限でVelocityを実行
31 + ## これがないと学校ページの作者(一般ユーザー)のscript権限が必要になりエラーになる
32 + $newDoc.setContent('{{include reference="SeitokaiCode.SchoolTemplate" author="target" /}}')
31 31   $newDoc.setTitle($schoolName)
32 32   $newDoc.setParent('Schools.WebHome')
33 33   ## SchoolClassオブジェクトを追加して初期値を設定
... ... @@ -116,6 +116,13 @@
116 116  
117 117  <script>
118 118  (function() {
121 + // XSSエスケープ関数
122 + function escapeHtml(s) {
123 + var div = document.createElement('div');
124 + div.appendChild(document.createTextNode(s));
125 + return div.innerHTML;
126 + }
127 +
119 119   // 学校マスターデータをJSON APIから取得
120 120   var schools = [];
121 121   var schoolsLoaded = false;
... ... @@ -159,11 +159,11 @@
159 159   var li = document.createElement('li');
160 160   li.className = 'search-result-item';
161 161   li.innerHTML =
162 - '<div class="search-result-name">' + s.name + '</div>' +
171 + '<div class="search-result-name">' + escapeHtml(s.name) + '</div>' +
163 163   '<div class="search-result-info">' +
164 - s.pref + ' ' + s.city + ' ・ ' + s.type + '(' + s.est + ')' +
173 + escapeHtml(s.pref) + ' ' + escapeHtml(s.city) + ' ・ ' + escapeHtml(s.type) + '(' + escapeHtml(s.est) + ')' +
165 165   '</div>' +
166 - '<div class="search-result-code">' + s.code + '</div>';
175 + '<div class="search-result-code">' + escapeHtml(s.code) + '</div>';
167 167   li.onclick = function() { selectSchool(s); };
168 168   resultsList.appendChild(li);
169 169   });
... ... @@ -195,7 +195,7 @@
195 195   // 既存ページあり
196 196   document.getElementById('duplicateWarning').style.display = 'block';
197 197   document.getElementById('duplicateLink').href =
198 - '/bin/view/Schools/' + school.code + '/';
207 + '/bin/Schools/' + school.code + '/';
199 199   document.getElementById('submitArea').style.display = 'none';
200 200   } else {
201 201   // 新規作成OK