=== Shed Form ===

確認画面・スパム対策・送信履歴機能を備えた、日本語サイト向け WordPress お問い合わせフォームプラグインです。

== Changelog ==

= 1.7.11 =
* 修正: フォームエディターの行追加ボタンとフィールド保存ボタンを連打しても重複登録されないよう制御を追加

= 1.7.10 =
* 修正: 同一 IP の繰り返し送信スパムスコアのしきい値が、レートリミットの最大送信回数設定に連動するよう修正（従来はハードコードの 5 件固定）
* 追加: スパム判定スコア設定の下に判定の仕組みを説明するガイドを追加
* 修正: メールログ全件削除クエリの Plugin Check 警告を phpcs:ignore で抑制

= 1.7.9 =
* 修正: 同一ページに同一フォームのショートコードが複数ある場合に確認画面が表示されない問題を修正

= 1.7.8 =
* 修正: 同一ページに同一フォームのショートコードが複数ある場合に「セッションが切れました」エラーが発生する問題を修正
* 追加: メール送信履歴ページに全件削除ボタンを追加

= 1.7.7 =
* 修正: 同一ページに同一フォームのショートコードが複数ある場合に Turnstile トークンが二重送信され timeout-or-duplicate エラーになる問題を修正

= 1.7.6 =
* 修正: Shed Turnstile が有効なときの設定ページへのリンクが誤ったスラッグを指していた問題を修正

= 1.7.5 =
* 修正: スタック型レイアウトの確認画面でラベル列が正しい幅で表示されない問題を修正

= 1.7.4 =
* WordPress 7.0 との互換性を確認

= 1.7.3 =
* 修正: 送信データを削除した際にアップロードファイルと DB レコードも合わせて削除するよう修正（個人情報がサーバーに残留するのを防止）
* 修正: cron によるファイルクリーンアップが年月サブディレクトリを再帰的にスキャンするよう修正
* 修正: メール設定保存ハンドラの冗長な wp_unslash() 呼び出しを削除
* 修正: コンソールログのプレフィックスを [WSF] から [Shed Form] に更新

= 1.7.2 =
* 修正: dataset 属性名の不一致（wsf → shedform プレフィックス）により郵便番号自動補完・条件分岐・同意スクロールが動作しない問題を修正
* 修正: Turnstile 検証失敗時にエラーメッセージを表示せずフォームが再描画される問題を修正
* 修正: 設定保存ハンドラの冗長な wp_unslash() 呼び出しを削除
* 修正: フォーム削除時に関連する行レコードも削除するよう修正
* 修正: error_log() の呼び出しを WP_DEBUG が有効な場合のみ実行するよう変更
* 修正: クラウドフレーズの version 値を保存前にサニタイズするよう修正
* 修正: 無効な正規表現パターンを含むクラウドフレーズをキャッシュ前にフィルタリング（ReDoS 対策）
* 修正: ライセンスヘッダー表記を GPL-2.0-or-later に統一

= 1.7.1 =
* 修正: フレーズに正規表現パターンが含まれる場合に NG フレーズリストが保存されない問題を修正（二重 wp_unslash による JSON 破損）
* 修正: フレーズ配列が空のとき syncJson() が呼ばれず「全クリア」が反映されない問題を修正

= 1.7.0 =
* 追加: フォーム編集ページにショートコードコピーボタンを追加
* 追加: フォームごとの最大幅設定（form_max_width）を追加
* 追加: デフォルト NG フレーズに「協業」「情報交換」を追加
* 変更: NG フレーズの種別ラベルを「完全一致」から「部分一致（含む）」に変更（実際の挙動に合わせて修正）

= 1.6.23 =
* 修正: FAQ から特定のアドオン名を削除（現在の提供状況に合わせて更新）

= 1.6.22 =
* 修正: サードパーティサービスセクションの WP Shed NG フレーズサービスのプライバシーポリシー URL を修正

= 1.6.8 =
* コード品質: ajax_save_field() の JSON フィールド（options/validation/extras）から wp_kses_post() を削除 — 角括弧を含む正規表現パターンが意図せず変換されるのを防止
* コード品質: nonce のサニタイズを sanitize_key() から sanitize_text_field() に変更（WPCS 準拠）
* 修正: 送信一覧ページの $_GET['status'] 直接参照をサニタイズ済み変数 $filter_status に変更

= 1.6.7 =
* セキュリティ: セッショントークンにフォーム ID を紐付け — 別フォームのトークンの流用を防止
* セキュリティ: セッショントークンを DB 書き込み後ではなく取得直後に削除 — 最大 1 時間のリプレイ攻撃ウィンドウを解消
* セキュリティ: テキストエリアの入力をサーバー側で 20,000 文字に制限 — 過大入力による DoS を防止
* セキュリティ: NG ワードのマッチングをフィールド単位でも実施 — 文字列を分割した回避リスクを低減
* セキュリティ: 拡張子を複数連ねたファイル名のアップロードを拒否（例: shell.php.jpg）
* 追加: ハニーポット隠しフィールド — 不可視フィールドに入力したボットをスパムスコアに関係なくブロック

= 1.6.6 =
* セキュリティ: 差出人の表示名を RFC 2047 MIME エンコード（mb_encode_mimeheader）で処理 — マルチバイト文字・特殊文字によるヘッダーインジェクションを防止
* セキュリティ: admin_email_to を is_email() で検証し CRLF 除去後に wp_mail() へ渡すよう変更
* セキュリティ: 再送メールの CC / BCC を DB から復元後に is_email() で再検証・CRLF 除去
* セキュリティ: ajax_download_file() のパスチェックに DIRECTORY_SEPARATOR の末尾を追加 — 隣接ディレクトリへのパス突破を防止
* セキュリティ: 管理者通知・自動返信の両メール件名でプラグイン層でも CRLF を除去
* パフォーマンス / セキュリティ: CSV エクスポートを 500 件単位のバッチストリーミング方式に変更 — 大量データでのメモリ消費を防止し、キーワードフィルタを SQL 層に移動

= 1.6.5 =
* 修正: CSV インジェクション対策 — =・+・-・@ で始まるフィールド値に CSV エクスポート時にシングルクォートを付与
* セキュリティ: {page_url} タグを $_SERVER['HTTP_HOST'] から home_url() に変更 — ホストヘッダーインジェクションを防止
* セキュリティ: ReDoS 検証をニアミス文字列でも実施。PCRE 制御動詞（*LIMIT_BACKTRACK 等）を保存時に拒否
* セキュリティ: 全正規表現ガードに pcre.recursion_limit を追加。try/finally で制限値を確実に復元
* セキュリティ: フィールドバリデーションの pattern ルールに ReDoS ガードを適用
* 修正: set_attachments() のパスチェックに DIRECTORY_SEPARATOR の末尾を追加 — shedform-uploads プレフィックス突破を防止
* セキュリティ: 管理画面ハンドラの残りの $_POST アクセスに wp_unslash() を追加

= 1.6.4 =
* セキュリティ: ReDoS 対策 — NG ワード正規表現を長さ 500 文字制限・pcre.backtrack_limit ガードで検証。無効なパターンはスキップし error_log に記録
* セキュリティ: X-Forwarded-For IP スプーフィング対策 — プロキシ経由時は最右端の IP を使用
* セキュリティ: メール添付ファイルのパストラバーサル防止 — set_attachments() で realpath() により shedform-uploads ベースディレクトリ外を拒否

= 1.6.3 =
* セキュリティ: アップロードサブディレクトリ（フォーム ID / 年 / 月）の作成時に .htaccess と index.php 保護を追加
* セキュリティ: Content-Disposition ヘッダーを RFC 5987（filename*=UTF-8）形式に変更 — 日本語ファイル名を正しく処理
* 修正: ALTER TABLE マイグレーションクエリに phpcs:ignore を追記（ユーザー入力なし・WPCS 準拠）

= 1.6.2 =
* 修正: XSS 対策 — {url_param} 動的タグを sanitize_text_field() のみから wp_kses() に変更
* 修正: XSS 対策 — {page_title} 動的タグを esc_html() でエスケープ
* セキュリティ: ファイルアップロード — finfo_file() 利用不可時は MIME チェックをスキップせずアップロードを拒否
* セキュリティ: ファイルアップロード — クライアントの Content-Type ではなく実際の MIME タイプを wp_handle_upload() に渡すよう変更
* セキュリティ: ファイルアップロード — $_FILES['size'] ではなくサーバー側で filesize() によりファイルサイズを計測
* セキュリティ: フォーム入力処理の全 $_POST アクセスに wp_unslash() を追加（WPCS 準拠）
* 修正: 同意フィールドのスクロールコンテンツで二重エスケープを解消（wp_kses_post() 内の冗長な esc_html() を削除）

= 1.6.1 =
* プラグインスラッグを shed-form に統一（WordPress.org 申請対応）

= 1.6.0 =
* WordPress.org ディレクトリ対応のため GPL-2.0+ ライセンスを追加
* wp_add_privacy_policy_content によるプライバシーポリシー提案を追加
* readme.txt にサードパーティサービス開示セクションを追加
* NG ワードクラウドの更新を自動 cron から手動ボタンへ変更
* SortableJS を CDN からローカルバンドルに変更
* 国際化対応: すべてのハードコードされた日本語文字列を __() でラップ
* .pot ファイルを生成し翻訳サポートを追加

= 1.5.4 =
* 修正: 管理者通知・自動返信メールの Reply-To プレースホルダー展開を修正
* 改善: フィールドキーのメールプレースホルダー処理を改善

= 1.5.3 =
* 追加: スクロールで有効化するコンセントフィールドタイプ
* 改善: 設定クラスの静的キャッシュでデータベースクエリを削減

= 1.5.1 =
* 修正: Turnstile 認証が完了するまで送信ボタンを無効化
* セキュリティ: PHP セッションを WordPress トランジェントとワンタイムトークンに置き換え
