概要

コマンド権限設定は、ユーザーが特定の GROWI に対して任意の /growi コマンドの使用を禁止するために存在する。

例:general チャンネルには一般のユーザーも存在するから、Admin GROWI には /growi search コマンドは使えないようにしよう。だけど、admin チャンネルからは search できるようにしよう。といったことが実現できます。

用語集

Slack コマンドに関する用語

  • GROWI command を使う

    • /growi create や /growi search hoge などを Slack 上で使用すること
  • Interaction

    • GROWI command を使用した後に表示されるモーダルやメッセージから何かアクションを行うこと

With proxy ↖️↗️

登場人物

GROWI サーバー上の登場人物

  • SlackAppIntegration エンティティ
    • Slackbot-proxy と GROWI を Many-to-One で繋ぐ
    • Proxy 側では Relation というエンティティ が対応している

Proxy 上の登場人物

  • Relation エンティティ
    • Slack(OAuth Installation) と GROWI を Many-to-Many で繋ぐ
    • GROWI 側では SlackAppIntegration というエンティティ が対応している
    • Relation は expiredAtCommands (有効期限) カラムを持ち、キャッシュになっている
    • Proxy はキャッシュの有効期限を見て SlackAppIntegration と情報をすり合わせる仕様になっている

権限の設定

権限の設定の種類は 3 種類ある
権限は各コマンドごとに設定する

  1. 全てのチャンネルを許可
  2. 全てのチャンネルを無効
  3. 特定のチャンネルからは許可

権限設定のチェックの発生箇所

  1. ユーザーが Growi command を使う OR search の share などの Interaction を行う
  2. Slack -> Proxy のリクエストが発生
  3. 第一チェック: Proxy 上で Relation の権限の項目のデータを見て、GROWI command が使用されたチャンネルと使用されたコマンドが宛先の GROWI で許可されているかをチェックする
  4. Proxy -> GROWI のリクエスト発生
  5. 第二チェック: GROWI 上で SlackAppIntegration の権限の項目のデータを見て、同様にチェックする

2回のチェックが必要な理由:
SlackAppIntegration と Relation は基本的には権限に関して同じ情報を持つが、厳密なトランザクションによって更新しているわけではないので、キャッシュが切れている場合は本体でもチェックが行われる仕様になっている。Proxy でチェックするのは、無駄なリクエストを本体に送ることを防いでいる。

権限情報の更新

基本的に SlackAppIntegration と Relation の変更は SlackAppIntegration を主体に同時に起こる。主なタイミングは 2 つある。

  1. 管理画面で権限設定を変更した時 (GROWI -> Proxy)
  2. キャッシュが切れている状態で GROWI command が使用された時 (Proxy -> GROWI)