MastodonにはPublic、Unlisted、Private、Direct…と、4つの公開オプションがあるのだが、何故かUnlistedにしても、ネットからProfileをアクセス(インスタンスURL/@ユーザーID)すると、Toot一覧に出てしまう問題がある。仕様かBUGかは不明だが気持ち悪いので修正したい。方法は…。
Mastodon本体はRuby on Railsで書かれており、昔やったな…と思いながらコードを探すと、controllersのaccounts_controller.rbに
1 2 3 4 5 6 7 8 9 |
def show respond_to do |format| format.html do @statuses = @account.statuses.permitted_for(@account, current_account).order('id desc').paginate_by_max_id(20, params[:max_id], params[:since_id]) @statuses = cache_collection(@statuses, Status) end . . . |
を発見。どうやらmodelsのpermitted_for()でデータを取得しているようだ。該当箇所は、status.rbのここ。
1 2 |
def permitted_for(target_account, account) return where.not(visibility: [:private, :direct]) if account.nil? |
account.nil?つまり非ログイン時、privateとdirectだけ除外している。ここへunlistedを加え、
1 2 |
def permitted_for(target_account, account) return where.not(visibility: [:unlisted, :private, :direct]) if account.nil? |
こうすればいい(外に何も出したくない時は:publicも加えればいい)。
ただDockerからシステムを剥がして運用している場合は修正するだけでいいのだが、docker-compose up -dで起動している場合は、一旦downして再度buildしないとこの修正が反映されない。
docker-compose downするのはちょっと嫌なので(笑)、直接コンテナの中を触ることにする。
1 2 3 4 5 6 7 8 |
$ docker-compose ps Name Command State -------------------------------------------------------------- mastodon_db_1 docker-entrypoint.sh postgres Up mastodon_redis_1 docker-entrypoint.sh redis ... Up mastodon_sidekiq_1 bundle exec sidekiq -q def ... Up mastodon_streaming_1 npm run start Up mastodon_web_1 bundle exec rails s -p 300 ... Up |
ログインする名前を探す(ここではmastodon_web_1)。
$ docker exec -it mastodon_web_1 ash
でログインできるので、該当コードを修正(viが使える)。
$ docker-compose stop
$ docker-compose start
これでコードが反映される。既にMyインスタンスは修正済だ。
余談になるが、Privateで写真を添付した場合でも、写真のURLが分かればネットから抜けてしまう(大昔のmixiもそうだった)。
真面目に対応するのは結構面倒で且つDBに負荷がかかるので(画像を表示する度に相手との関係を調べる必要があるのと、URLではアクセスできないPATHへ画像を置き、表示する時はリダイレクトしなければならない)、Mastodonが対応するのは望み薄だろう。
追記:この件、どうやら意図的らしいので、pullリクしても駄目な雰囲気。各インスタンスで個別対応だろうか!?