Worldon: セキュリティアップデート

Worldonを更新しました。 利用されている方はアップデートを推奨します。また、以下の操作を推奨します。

  • mikutter上でWorldonを使用して登録されたアカウントをすべて削除
  • Mastodonの設定→認証済みアプリからWorldonのものをすべて削除
  • mikutter上で改めてアカウント認証

特に、Worldonを入れた状態でmikutterがクラッシュし、次の起動時に表示されるログを送信したり、mastodonredmine等に貼り付けたことがある人は、上記の操作を行っておいたほうがよいです。

危険性

アカウントとトークンの組み合わせがわかると、以下のことができます。

  • 勝手にトゥートする
  • 既存フォロー先の非公開トゥートを読める
  • あなた宛のダイレクトトゥートを読める
  • 勝手にフォローする

トークンは漏れないように注意しましょう。

問題点

worlduriaccess_tokenが含まれていたため、バグ報告などのためにログを取ったりして公開すると、意図せずトークンが漏れる可能性がありました。

このため、uriaccess_tokenを含まないようにする改修を行いました。

この問題は @rinsuki@mstdn.maud.ioさんに指摘していただきました。ありがとうございます。

mikutter_justsize プラグインが mikutter 3.7.2対応

remain_charcount spellの導入にともない、起動できなくなっていたので修正しました。

また、Twitterが行っているURLの文字数緩和を中途半端に入れているのが不自然だったため撤廃しました。これからは純粋に(Rubyにおける)文字数をカウントして表示します。

twemojiプラグインの対応emoji大幅追加

どうも参照していたtwemojiのバージョンが古く*1、最近のemojiに対応できていなかったようなんですね。

でもtwemojiの正規表現サロゲートペアを復元しながらまたコンバートするのは面倒だったので、今回はFull Emoji List, v11.0https://unicode.org/Public/emoji/11.0/emoji-variation-sequences.txtから自力で正規表現を組むことにしました。

そんなわけでZWJを使った複合emojiや、:thinking_face:のような最近の顔文字も表示できるようになりました。

*1:READMEをちゃんと読めという話

投稿する時のキーによって投稿先を切り替える

例として以下のような挙動を実現する方法を紹介します。

これ以外にも、slackなど任意のWorldを組み合わせることができます。また、Mastodonプラグインとして必ずしもWorldonを使う必要はありません。World対応のプラグインであれば何でもOKです。

手順

  1. あらかじめTwitterアカウントとMastodonアカウントを追加しておきます。
  2. portalプラグインをインストールします。
  3. multiposterプラグインをインストールします。
  4. アカウントを追加する時に"Portal"が選択できるようになっているので、追加します。Primary WorldをMastodonアカウントに、Secondary WorldをTwitterアカウントに設定します。名前は何でもいいのですが、空欄のままはNGです。
  5. 設定>ショートカットキーから「追加」します。"postbox"を展開すると"Secondary Worldにポストする(Portal)"というコマンドがあります。これを選択して、キーバインドAlt+Enterを設定して「OK」します。
  6. 更に「追加」で、"postbox>マルチポストする(Portal)"を選択肢、キーバインドCtrl+Alt+Enterを設定します。

デフォルトでは「投稿する」がCtrl+Enterになっていると思いますので、これで3つのキーバインドができました。

注意しなければならないのは、追加したAlt+EnterCtrl+Alt+Enterでは返信ツリーを繋ぐ形での返信はできない、ということです。返信する際は、Ctrl+Enterを使えば、返信先がMastodonのTootならMastodonアカウントが、TwitterTweetならTwitterアカウントが、自動的に選択されます。

twitter-cardプラグイン

TL;DR

というプラグインを書いたけど、Twitter側はまだいいとして、Worldonと組み合わせてしまうとあまり使い物にはならないね、というだけの話です。

以下、主にプラグイン開発者向けの話。

mikutterにおける引用

↑でも少し触れましたが、mikutter 3.7では引用の処理の仕方が変わったのです。

3.6までは、カスタムModelquoting_messagesというメソッドを定義して、カスタムModelのArrayを返してやれば、それを引用として表示する、というものでした。

この仕様では、自分が書いたプラグインにいろいろ対応させることはできます。実際、WorldonではtweetのURLには特別に対応し、tootの中にtweetのURLが引用されていれば、それを返すようにしていました。そのため、tweetのURLがmastodonで流れてきていれば、それを引用として表示することができていました。

ところが、「自分が書いたプラグインのモデルを、他のプラグインに引用させる」ことはできないのです*1TwitterプラグインのカスタムModelであるPlugin::Twitter::Messageというモデルはquoting_messagesメソッドを実装していましたが、Worldonや、そのカスタムModelであるPlugin::Worldon::Statusというモデルのことは知らないので、Plugin::Twitter::Message#quoting_messagesPlugin::Worldon::Statusを返すことは無いわけです。

西端の放送局、brsywe--mikutterの薄い本制作委員会から参照できる「mikutterの薄い本vol.11」には、intentという機能が紹介されていますが、p.21にhandleというものについて触れられています。これを使うと、URLとカスタムModelを結びつけることができます。

mikutter 3.7では、このhandleで定義されるURLとカスタムModelの紐づけを通じて、引用対象を取得するようになりました。 Plugin::Twitter::Messageには、最初からhandleが定義されていますから、Toot内のTweetは(URLだけ正しくScoreに入れておけば)自動的に引用されるわけです。

Plugin::Worldon::Statusについては、handleを追加する更新を行いました。これにより、Tweet内のTootについても、引用表示されるようになっています。イタコ芸が捗りますね!

これは単にTwitter-Mastodon間の話ではなく、他のあらゆるカスタムModelで、handleを定義して、timeline: trueにしておけば、引用・被引用が自在になるのです。

そういうわけで

被引用だけがされるモデルを作るなら簡単だろう、という目論見で作ったのが冒頭で紹介したtwitter-cardプラグインです。これは、あらゆるURLに反応し、もしそのURLがOpenGraphProtocolやTwitterCardといったメタ情報の提供規格に沿っていれば、それを引用できるようにカスタムModelとして返す、というものです。

TwitterMastodonに限らず、(マイクロ)ブログサービスでURLを貼り付けるのは日常茶飯事です。こういったものが多少詳しめに表示されれば、TwitterCardと同様の恩恵を得ることができます。

だが、幸せは長くは続かなかった……

ところでmastodonもOGPに対応しています。つまり、mastodonのユーザーページや単独Tootのページ、ハッシュタグ検索用のURLなどからHTMLを取得すると、OGPの情報が取得できるので、つまりtwitter-cardプラグインのモデルが取得され、それが引用されます。

これが本当に鬱陶しく、特に、リプライ時にいちいち相手のアカウント情報が出たり、ハッシュタグを複数並べるような場合(特にpawooで絵を上げる場合などによくある)、それぞれのハッシュタグごとにコレが出てしまうわけです。しかも大した情報があるわけでもない。これは厳しい。

Twitter側と同様に、timeline: falseなHashTagのようなモデルを作って返せばいい、はずなのですが、別の問題(https://dev.mikutter.hachune.net/issues/1226)があり、一筋縄ではいかないようです。

*1:もちろんモンキーパッチすればできましたが、Worldonではそれはやりませんでした。

mikutter 3.7とWorldon

出ましたね。いくつか新機能を提案したり実装したりして取り入れてもらえたので、僕としてもうれしいです。

Worldonの方も、developブランチでセコセコ作ってた3.7対応系の機能をmasterに入れました。

今日からは3.7以降でしか動きませんので、注意してください。

カスタム絵文字が出たり、Tweet内のToot URL引用が"ナウい引用"形式で表示されたりする*1のが新しいところだと思います。

*1:逆の、「Toot内のTweet」が表示されるのはできていましたが、Tweet内のTootの表示には、Scoreと、本体付属のsub-parts-quoteの改良が必要でした。