Refactoring : sécurité (XSS), découpage en modules inc/* et js/admin/*, IDs résolus par slug, perf (caches, cron Gravatar, assets auto-hébergés), tests

This commit is contained in:
2026-06-10 21:30:25 +02:00
parent e6b73df516
commit 9280c3b9ce
44 changed files with 3209 additions and 2907 deletions

View File

@@ -42,7 +42,7 @@
<ul>
<li data-role="">{{ current_language == 'en' ? 'All statuses' : 'Tous les statuts' }}</li>
{% for role in filter_roles %}
<li data-role="{{ role.name }}">{{ role.name }}</li>
<li data-role="{{ role.name|esc_attr }}">{{ role.name|esc_html }}</li>
{% endfor %}
</ul>
</div>
@@ -81,18 +81,20 @@
</thead>
<tbody>
{% for member in group.members %}
<tr onclick="window.location.href='{{ member.url }}'"
data-name="{{ member.display_name }}"
data-sort-name="{{ member.sort_key }}"
data-roles="{{ member.role_names|join('|') }}"
data-avatar="{{ member.avatar_url }}"
data-status="{{ member.status }}"
data-affiliation="{{ member.affiliation }}"
data-domaines="{{ member.domaines|join(', ') }}"
data-autres-domaines="{{ member.autres_domaines }}">
<td>{{ member.display_name }}</td>
<td>{{ member.status }}</td>
<td>{{ member.affiliation }}</td>
{# data-url + listener délégué (membresFilters.js) au lieu d'un onclick inline ;
tout passe par esc_attr/esc_html : ces valeurs viennent des profils utilisateurs #}
<tr data-url="{{ member.url|esc_url }}"
data-name="{{ member.display_name|esc_attr }}"
data-sort-name="{{ member.sort_key|esc_attr }}"
data-roles="{{ member.role_names|join('|')|esc_attr }}"
data-avatar="{{ member.avatar_url|esc_url }}"
data-status="{{ member.status|esc_attr }}"
data-affiliation="{{ member.affiliation|esc_attr }}"
data-domaines="{{ member.domaines|join(', ')|esc_attr }}"
data-autres-domaines="{{ member.autres_domaines|esc_attr }}">
<td>{{ member.display_name|esc_html }}</td>
<td>{{ member.status|esc_html }}</td>
<td>{{ member.affiliation|esc_html }}</td>
</tr>
{% endfor %}
</tbody>