Fessの文書IDによる取得にも仮想ホストの範囲を適用する

1つのFessで複数の仮想ホストを使うとき、検索結果だけでなく、文書IDを指定して取り出す経路も確認しておきたいところです。文書IDによる取得に、通常検索と同じ仮想ホストの条件を加える修正がマージされました。

ロールが同じでも仮想ホストが違う場合

従来のgetDocumentByDocIdとgetDocumentListByDocIdsはロールの条件を適用していましたが、仮想ホストの条件がありませんでした。利用者のロールが一致すると、別の仮想ホストに属する文書をID経由で取得できる場合がありました。

修正は、v2のキャッシュAPI、/go/による転送、サムネイル、お気に入りなどで使う共通の文書取得処理に条件を加えます。対象文書の仮想ホストが現在のリクエストと違えば、取得処理は文書を返しません。各エンドポイントの応答形式はそれぞれの実装に従います。

有効になる条件と例外

新しいオン・オフ設定は追加されません。リクエストから仮想ホストのキーが解決された場合、そのキーと文書のvirtual_hostフィールドを照合します。キーが設定されたリクエストでは、仮想ホストの値を持たない文書も通常検索と同様に対象外です。

初期設定のindex.field.virtual_hostはvirtual_hostで、virtual.host.headersは空です。ただし、この値だけでリクエストにキーが付くわけではありません。既存の仮想ホスト設定と、実際に解決されるキーを確認してください。

キーが解決されないデフォルトホストやリクエストのないバックグラウンド処理には、この条件は加わりません。管理者検索の一覧取得も対象外です。この変更を、すべての経路を無条件に分離する仕組みとして扱うことはできません。

更新前後で試したいこと

同じ検索ロールの利用者を使い、ホストAの文書がAの通常検索とキャッシュで表示されること、ホストBから同じIDを使った取得では返らないことを確認します。仮想ホスト未設定の文書と、管理者検索も別に試します。

通常検索の条件を共通の取得処理へそろえる修正なので、文書を登録し直すこと自体は変更の必須条件ではありません。ただし、既存文書の仮想ホスト値が誤っている場合は、元のクロール設定と再登録を含めて修正します。ユーザータグの仮想ホスト別管理とは別の変更です。

関連PR

FessのZIP抽出でバイナリーのごみが検索本文に入る問題の修正案

ZIPのクロールで、展開を拒否したはずのファイルがバイナリーのごみとして検索本文へ入る問題に対し、fess-crawlerのPR #228が提案されています。

原因の例外にあるZIP爆弾の検出結果を拾う

Tikaが過大な展開を検出すると、外側の例外はTIKA-237: Illegal SAXExceptionとなり、Suspected zip bombという情報が原因の例外にだけ入ることがあります。従来の抽出処理は外側のメッセージしか確認せず、このケースを見逃していました。

標準の抽出設定ではxmlExtractorが登録されています。そのため、通常のXML抽出への代替処理へ進み、ZIPの生のバイト列が本文として返ることがありました。PRには、約0.3MBのファイルから展開後300MB相当となるZIPで、約305KBのごみが登録された例が記載されています。Tika 3.3.2でも同じ挙動と報告されており、Tika 4だけに起因する問題ではありません。

修正案の適用条件と初期値

修正案は原因の例外を順にたどり、メッセージにzip bombがあれば、既存のreason=zipBombDetectedを含む抽出エラーとして拒否します。他のSAXExceptionでは従来どおりXML抽出への代替処理を残します。

新しい有効化スイッチや初期値の変更はありません。確認した標準extractor.xmlではmaxCompressionRatio=1、maxUncompressionSize=10000000が設定されていますが、今回のPRはこれらの閾値を変更しません。実際の判定はTikaと環境の抽出設定にも依存するので、この値をすべてのアーカイブの安全性を保証する上限として扱わないでください。

利用には修正を含むcrawlerを組み込んだ対応Fessビルドが必要です。PR番号だけを根拠に、本番環境のjarを単独で差し替える手順にはしません。

運用で確認すること

取り込み後の本文に読めないバイト列が並ぶ場合は、元のファイル、抽出ログ、原因の例外を併せて確認します。修正を含む検証環境では、疑わしいファイルが本文として返らず、reason=zipBombDetectedの抽出エラーになることを確認します。実運用のファイルを検証する際も、隔離した環境で扱います。

既に登録されたごみを自動削除する処理は含みません。対象文書を特定し、運用上の削除・再クロール方針を決める必要があります。失敗した再クロールだけで古い文書が必ず消えるとは判断しません。また、例外メッセージを調べる修正であり、すべての圧縮爆弾を検出する新しい仕組みではありません。

PRではxmlExtractorを登録したコンテナーと生成ZIPを使う回帰テストが追加されています。テスト成功はPR作者の報告で、こちらでFessの実クロールを再実行したものではありません。

関連PR

FessのStaticテーマでログイン用パスワード欄が出ない場合の確認

FessのStaticテーマで、ログインダイアログは開くのにパスワード欄が表示されず、ログインできない問題の修正が提案されています。

11テーマ共通のダイアログを確認する

対象はBootstrapの代わりにcompat.jsのModalを使う11種類のStaticテーマです。PR #83でパスワード欄を必要な場面だけ生成する方式へ変えた後、生成のきっかけとなるshow.bs.modalイベントが発生しないため、欄がフォームへ追加されなくなっていました。

修正案では、ダイアログを開く前にshow.bs.modal、開いた後にshown.bs.modalを発生させます。最初のイベントがキャンセルされた場合は開きません。認証方式やパスワードポリシーを変更するものではなく、利用者に新しい有効化設定を求める変更でもありません。

ログイン必須の環境で特に影響が出ますが、認証必須設定を解除して回避する手順にはしません。標準Bootstrapテーマを含むすべてのログイン障害の原因がこの問題である、という説明でもありません。

Fess本体とテーマの対応を分けて選ぶ

main向けの修正案ではテーマのバージョンは15.10.1、最小Fessバージョンは15.10です。Fess 15.9で確認する場合は15.9.x向けのPR #88を含むソースを使います。たとえばDocSearchは15.9.12から15.9.13へ上がり、最小Fessバージョンは15.9のままです。全テーマが同じ15.9系パッチ番号になるわけではありません。

修正を含むチェックアウトで./scripts/package.sh docsearchを実行し、生成したZIPを管理画面「テーマ」(/admin/theme/)でアップロードして選択します。仮想ホストを使う場合は、そのテーマ割り当ても確認します。テーマの自動切り替えや新しい初期値の追加はありません。PRが未マージのため、ブランチ名や版番号だけで修正入りと判断しないでください。

更新後の確認と制限

独自に編集したテーマのファイルを控え、対応する検証環境で、ダイアログを開くとパスワード欄が出ること、ログインできること、閉じると欄が取り除かれることを確認します。ブラウザに古いJavaScriptが残る場合は再読み込みも行います。

PR #87ではFess 15.10.0-SNAPSHOTとsemanticlensでのログイン確認が報告されています。PR #88では自動テストと11テーマのバンドル検証が報告されていますが、こちらで全テーマの稼働確認を行ったものではありません。配布ZIPの公開も別途確認が必要です。

先の11テーマの記事はパスワード変更などの移植を紹介しました。今回はその後に分かったパスワード欄生成の不具合に絞った補足です。

関連PR