（E2E暗号化 Matrixを介して）PC/Serverからクライアント（iPhoneなど）にプッシュ通知を送る


**[ introduction ]**
- サーバーからEnd-to-Endで暗号化したメッセージをiPhoneにプッシュ通知できる開かれた方法は限られています。(MicrosoftやSlackやDiscordなどの側の人間はやりとりを監視できます）
- さて、Thunderbirdにチャットアカウントを追加できますが、その中にE2EEでメッセージを送受信できるMatrixというものがあります。

https://qiita.com/guskma/items/20fa88c25bfdbfc99c2a

- ここでは、ThunderbirdにMatrixアカウントを登録する方法と、それと独立して[matrix-commander](https://github.com/8go/matrix-commander?tab=readme-ov-file)というCLIクライアントを使ってPCからモバイル端末にメッセージを送る方法を説明します。

## 1. ThunderbirdにMatrixアカウントを登録する
### 1.1 Matrixアカウントの作成
- 今回は、Matrixアカウントを作成するために、Element（Web版）というアプリケーションを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683564/a2ab11d9-ff94-4de5-8018-8deef8578c80.png)

- Element (Web版) はMatrixクライアントの一種です。
- Matrixサーバー(=Matrix Synapse)もElementもオープンソースであり、誰でも自由にサーバーを立てることができます。
- Element (Web版) はWebブラウザーを使って、Matrixサーバーのアカウントを操作することができますが、Elementには、iOS版もあり、APNs (Apple Push Notificationサービス)を介してプッシュ通知を受け取ることができます。
- Matrixアカウントはuser名とパスワードを使うBasicなものと、シングルサインオン（SSO）によるものと二種類のやり方で作成できます。~~Thunderbirdに登録するにはメールアドレス（前者のuser:pass方式）を使ってアカウントを作成する必要があります。~~ 
- 現在公式サーバ (matrix.org) は、メールアドレスを使って新しいアカウントを作成することはできません。SSOを使ってアカウントを作成する必要があります。
- Matrixサーバーは公式のmatrix.orgの他のもいくつか[公開されているもの](https://github.com/kyra-b/Matrix-Public-Home-Server-List?tab=readme-ov-file)がありますが、セキュリティの設定が甘かったり、公式と同様にメールアドレスでアカウントを作成できなかったり、ログインできないものも含まれていました。
    - 例えば以下のコマンドでエラーがあると、matrix-commanderでBasicな方式を使ってログインすることはできません。
        ```shell
        curl -Iv https://aria-net.org
        curl -Iv https://matrix.tchncs.de
        ```
### 1.2 MatrixアカウントのThunderbirdへの登録
- アカウントを作成できましたらThunderbirdに登録します。ユーザ名の書式は、省略形の`user`か、`@user:matrix.org`(公式サーバーの場合)です。Thunderbirdにおいては、サーバー名の書式は、`matrix.org`や、`example.net`や、`matrix.example.org`や、`matrix.example.me`などで登録できます。
- Thunderbirdにアカウントを登録するとき、**パスワードを空白にして登録すると、Matrixのログイン画面のウィンドウが起動し、SSOしたアカウントを登録することができるようになります。**
## 2. matrix-commanderにアカウントを登録する
- CLIをクライアント[matrix commander](https://github.com/8go/matrix-commander?tab=readme-ov-file)を使うことで、PCから他のMatrixクライントに暗号化メッセージを自由に送信することができます。

https://github.com/8go/matrix-commander?tab=readme-ov-file

- モバイル端末などで、ServerやPCからのメッセージを通知してもらうには、Matrixアカウントを2つ作成する必要あがります。1つだと通知を受け取ることができません。

### 2.1 matrix-commanderのインストール
- 私は、Debian12にPython仮想環境を作成してインストールしました。まずは、必要なライブラリをインストールします。
    ```shell
    sudo apt install python3.11-venv libolm-dev
    mkdir -p ~/projects/python/matrix; cd $_
    python3 -m venv .venv
    source .venv/bin/activate
    ```
- 仮想環境を有効化しましたら、次のコマンドでインストール完了です。
    ```python
    pip install matrix-commander
    ```
### 2.2 matrix-commanderの初期設定: 資格情報の作成
- はじめにmatrix-commanderで、Matrixアカウントにログインし、資格情報`credentials.json`を作成する必要があります。
- WSLから起動したブラウザでは資格情報を作成することができない場合があります。その場合は、非公式のサーバーでアカウントを作成するか、デスクトップ環境が使えるPCを使いましょう。
- 次のコマンドで、対話的に資格情報を作成することができますが、そのときにルームID（`"!********:matrix.org"`）を聞かれます。省略することができないので事前にElementなどでルームを作成している必要があります。
    ```python
    matrix-commander --login password # Basic
    matrix-commander --login sso # Single Sign On
    ```
- 上記を実行して、作成される資格情報`credentials.json`の中身は次のようになっています。
    ```json
    {
      "homeserver": "https://matrix.org",
      "device_id": "ABCDEFGHIJ",
      "user_id": "@user:matrix.org",
      "room_id": "!********:matrix.org",
      "access_token": "***_********"
    }
    ```
- 資格情報にはパスワードが含まれておらず、アクセストークンになっていますのでBasicな方式でもSSO方式でも作成される資格情報は同じ形式になります。

### 2.3 matrix-commanderで他のアカウントにDMを送信する
- DMは実際にはルーム上で行われます。Elementでルーム作成済みの場合は次のコマンドで資格情報`credentials.json`を参照してメッセージを送信できます。
    ```python
    matrix-commander --credentials credentials.json --room '!*********
- また、次のようなコマンドを実行すると、`@user:matrix.org`さんをDM用のルームに招待すると同時に、DM用のルームIDを取得することができます。
    ```python
     matrix-commander --credentials credentials.json --room-dm-create @user:matrix.org
    ```

### 2.4 matrix-commanderを他のクライアンによって認証する
- Matrix Serverで管理しているアカウントには、Matrixクライアント (Elementやmatrix-commander)とのセッション情報が紐づいています。
- Matrixアカウントの所有者と、Matrixクライアントの使用者が同一人物である確認がとれなければ、ルーム内のメッセージで認証されていないクライアントからのメッセージとして警告がつきます。
- あるセッションを認証するためには、すでに認証されている他のセッションから認証する必要があります。（わからなくなったら一度リセットし、Web版Elementから信頼チェーンをつくり直すとよいかもしれません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/683564/24692b79-b2ef-4f4a-811d-35a81b45eee8.png)
- 肝心のmatrix-commanderは次のコマンドで認証モードに入ってから、Elementなどで絵文字認証を要求するのですが、試した環境では認証できませんでした。
    ```python
    matrix-commander --credentials credentials.json --verify
    # 絵文字認証が最後まで進まない
    ```
- 私が見つけた方法は、iOSアプリ版のElement Messengerというアプリを使って同一アカウントにログインしWeb版Elementなどで認証を済ませてから、ユーザ設定>セキュリティ>セッション>信頼されていません>テキストを使って手動で認証から、matrix-commanderを認証する方法です。これにより一方的にmatrix-commanderを認証することができます。

### 2.5 matrix-commanderのその他のコマンド
- matrix-commanderは、テキストメッセージの他に写真送信やファイル送信もできます。
    ```python
    # ファイル送信
    matrix-commander --credentials credentials.json --file path/to/yourfile.pdf --room '!roomid:matrix.org'
    # 写真の送信
    matrix-commander --credentials credentials.json -i path/to/yourimage.jpg --room '!roomid:matrix.org'
    # テキストの取得
    matrix-commander --credentials credentials.json --tail --room '!roomid:matrix.org'
    ```

## 感想
- お疲れさまでした😉