<?php

declare(strict_types=1);

namespace Acms\Services\Template\Twig\Mail;

/**
 * メールフォーム本文 (運営者の管理画面入力) を Twig サンドボックスで評価するときの「基本許可リスト」。
 *
 * 文字列直接入力経路の Twig サービス (`template.mail.twig.sandboxed`) は信頼境界が
 * 「サイト運営者の管理画面入力」となるため、SSTI 防止に SandboxExtension を組み合わせる。
 * ここで定義した基本集合に、AcmsExtension 由来 / extendsTwig 由来のフィルタ・関数名を
 * {@see \Acms\Services\Template\Twig::buildSandboxPolicy()} が合成して最終的な許可リストを作る。
 *
 * メソッド呼び出しとプロパティアクセスは全面禁止 (Twig サービス側で空配列を渡す)。変数辞書は
 * フラット化した連想配列で渡す想定で、テンプレ側からはトップレベルのキーへのアクセスしか発生しない。
 */
final class SecurityPolicy
{
    /** @var list<string> */
    public const ALLOWED_TAGS = [
        'if',
        'for',
        'set',
        'block',
        'extends',
    ];

    /** @var list<string> */
    public const ALLOWED_FILTERS = [
        'escape',
        'e',
        'raw',
        'nl2br',
        'default',
        'upper',
        'lower',
        'trim',
        'replace',
        'length',
        'format',
        'date',
        'striptags',
        'url_encode',
        'join',
        'split',
    ];

    /** @var list<string> */
    public const ALLOWED_FUNCTIONS = [
        'range',
    ];
}
