:don: 170806

v1.5.0から今日の分まで。そろそろパッチリリース出るんじゃないかって気もするけど。

https://github.com/tootsuite/mastodon/compare/v1.5.0…d1d4653

重い話

絵文字をドメイン名に含んだURLを投稿すると、投稿時やTL取得時に500になっていた件

Don’t throw while normalizing invalid domain names by TheKinrar · Pull Request #4499 · tootsuite/mastodon

Issueに書かれていたURLの例が http://🌹🌹🌹.ws/ です。そんなドメインあるんか…。

トゥート内のURLをリンクに変換する際、こうした国際化ドメイン名(IDN)は http://xn--2h8haa.ws といった形に正規化されて <a href="..."> に埋め込まれるのですが、高速化のためにv1.5.0からは idn-ruby というライブラリを使うようになりました。その中身である libidn が上記ドメインを無効なものとして例外を投げたために、当該statusを投稿した際や当該statusを含むTLの取得時にエラーになっていた、というものです。ちなみに投稿がエラーになるように見えますが、エラーが起きるのは保存された投稿をJSON等に変換する処理の一部*1なので、DBには保存されちゃってます、はい。

いずれにせよ不正なURLが投稿されただけでこのようなエラーになるのはまずいので、ひとまずIDNの正規化に失敗したらURLのリンク化をやめるだけで、その後の処理に支障がでないようにしたのがこのパッチです。

ただ上記URLに実際アクセスできることからも、本来はURLとして扱いたいところです。libidnが準拠するIDNA2003は禁止リスト制だったので、後から追加されたコードポイントはデフォルトでは禁止するようになっていました。そこでnullkal氏によって ALLOW_UNASSIGNED オプションをつけるPRがadressableに投げられています *2

Docker環境でプレビューカードの文字化けを防ぐためにlibiconvを自前ビルドするように

Use GNU libiconv in Nokogiri by ykzts · Pull Request #4494 · tootsuite/mastodon

URLをトゥート内に書いた時のプレビューカードを取得する際、UTF-8以外のエンコーディングの場合はNokogiri経由で変換を行っていたのですが、MastodonのDocker構成で使っているAlpine Linuxのlibiconvは対応するエンコーディングが少なく、例えばSJISのサイトでは化けてしまっていました。ITmediaとか。

そこで GNU libiconv のソースコードを取得してきて自前ビルドし、Nokogiri で利用してもらう、というのがこのパッチです。今後ビルドにかかる時間が増えるのでは?という点については、一度ビルドすれば大抵はキャッシュが効くのでそこまで大変でもないかと。自分でビルドせずにDockerHubからpullしてそのまま使うのも手ではあります。

重くはない

右端のカラムの中身が変わったらページ全体を右端までスクロールするように

Scroll columns area to right when children property is changed by akihikodaki · Pull Request #4517 · tootsuite/mastodon

ピン留めしているカラム数に対してウィンドウの幅が狭いと、全てのカラムを見るには横にスクロールしなければいけません。で、アカウントやトゥートをクリックするなどしてURLと右端のカラムが変更されたときに、自動的にスクロールする、というものです。なおシングルカラムの場合にエラーが出ていたので、別途修正されています。

Disable scroll columns area to right when single column mode by MitarashiDango · Pull Request #4528 · tootsuite/mastodon

ログイン中のアカウントの情報を一部ページで表示するように

Add “signed in as” header to some pages by Gargron · Pull Request #4523 · tootsuite/mastodon

具体的にはリモートフォローの確認ページ*3やOAuthの承認ページなどです。これらのページで、ページの一番上にログイン中のアカウントが表示されるようになりました。

キーボード操作のHome/EndをCtrl+Home/Ctrl+Endに修正

fix(status_list): Use correct keys for keyboard navigation by sorin-davidoi · Pull Request #4487 · tootsuite/mastodon

修正?って話については、PageUp/PageDown/Ctrl+Home/Ctrl+EndというキーバインドWAI-ARIA Authoring Practices 1.1 という文書に則っているので、という。

細かいの

一部ブラウザでの「戻る」ボタンのスタイルを修正

Fix column-back-button style for some browsers (regression #4457) by unarist · Pull Request #4484 · tootsuite/mastodon

Edgeで中央揃えになっていた件と、Safariで周りにmarginがついていた(黒枠にも見える)件。

パスワードリセットを行う際、リンクの期限が切れていたら最初のフォームに戻すように

Redirect to PasswordController#new when reset_password_token is invalid by nullkal · Pull Request #4506 · tootsuite/mastodon

これまでは新パスワードを設定するフォームが謎のバリデーションエラーと共に表示されていたとのことで…。

Transfer-Encoding: chunked なサイトでWebFingerに失敗することがあった問題を修正

Update goldfinger to 2.0.1, see tootsuite/goldfinger#5 by Gargron · Pull Request #4527 · tootsuite/mastodon

*1:Mastodonはリモートの投稿はHTMLで、ローカルの投稿はプレーンテキストでDBに保存しており、プレーンテキストからHTMLへの変換はAPIが呼び出されたときやAtomが必要になった場合に行われます。この変換処理の中に、今回問題となったURLのリンク化処理が含まれています。ですから1.4.7以前のインスタンスやGNUSocialからこのような投稿が流れてきても、今回の問題は発生しません。

*2:ところでIDNAには後継のIDNA2008という版があるのですが、こちらでは記号や絵文字は disallowed という扱いに変更されています。といっても既存のドメインにアクセスできないのでは困りますから、TR46 という文章で移行期間中の変換手順が用意されており、こちらでは絵文字も通るようになっているようです。libidn2では IDN2_TRANSITIONAL を付けるといいようです。参考: FAQ - International Domain Names (IDN)

*3:フォロー元のアカウント名を入力するフォームでも表示されるようになったのですが、フォロー相手のインスタンスでログイン済みだとリモートフォローボタンが表示されないので、あまり目にすることはないですね…。