Skip to content

Print TXT record values quoted, matching dig output #82

Description

@toshi0806

問題

tdig は TXT レコードの値を引用符なしで出力するため、dig と表示が食い違います。

$ dig +noall +answer google.com TXT @8.8.8.8
google.com.  300  IN  TXT  "v=spf1 include:_spf.google.com ~all"

$ ./tdig google.com TXT @8.8.8.8
google.com.  285  IN  TXT  v=spf1 include:_spf.google.com ~all

該当箇所は lib/tdig.ex の 1 行です。

def rdata_to_string(rdata, :txt), do: escape(rdata.txt)

dig は TXT の character-string を必ず " で囲んで出力します。tdig は dig 互換の出力フォーマットを掲げているため、この差異は解消すべきです。

対応

rdata_to_string(rdata, :txt) で値を " で囲む。値中の " および \ のエスケープも併せて実装する。

複数 character-string は連結して単一の引用符で表示する

dig は複数の character-string を個別に引用して表示します。

example.com.  300  IN  TXT  "abc" "def"

一方 tdig ではこれを

example.com.  300  IN  TXT  "abcdef"

と表示します。この差異は意図的に受け入れる方針です。

tenbin_dns の decode(rdata, :txt, _, _) は全 character-string を連結した単一バイナリを返し、境界情報を保持しません。

DNSpacket.parse_rdata(<<3, "abc", 3, "def">>, :txt, nil, nil)
#=> %{txt: "abcdef"}

これは smkwlab/tenbin_dns#95 で 3 案(binary のまま / リストに変更 / 別フィールド併設)を比較したうえで選択された設計で、境界を保持しないことは受容されたトレードオフとして記録されています(RFC 7208 §3.3 のとおり SPF 等では連結値が論理値であり、境界に意味を与えるプロトコルは稀)。tenbin_dns 側での再検討は smkwlab/tenbin_dns#134 で提起しましたが、この判断を覆すには至らないと結論し close しています。

したがって tdig 側だけで完結する対応とし、値そのものは連結された完全な形で表示されるため情報の欠落はありません。

ドキュメント

README の dig 比較表に、複数 character-string TXT の表示形式が dig と異なる旨を既知の制約として記載する。

補足: tenbin_dns 0.8.0 による退行ではありません

引用符が付かない件は 0.8.0 以前からの挙動です。また 0.7.1 では TXT の最初の character-string しか取得できておらず(残りは破棄されていた)、255 バイトを超える TXT(DKIM 公開鍵、長い SPF レコード等)は値が途中で切れて表示されていました。0.8.0 で全体が表示されるようになったのは改善です。

関連: smkwlab/tenbin_dns#95

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions