toshirot / mychat

chat on Elysia
MIT License
0 stars 0 forks source link

v0.1.030現在の単一ルーム制を複数ルーム制に変更する #12

Open toshirot opened 5 months ago

toshirot commented 5 months ago

**機能リクエストは問題に関連していますか?説明してください。 何が問題なのかを明確かつ簡潔に説明してください。

v0.1.030現在単一ルームなのを複数ルーム制に変更したい

**あなたが望む解決策を記述してください。 あなたが望むことを明確かつ簡潔に記述してください。

テーブルを追加・変更する

**あなたが検討した代替案を記述してください。 あなたが検討した代替案や機能について、明確かつ簡潔に説明してください。

現状のテーブルは CREATE TABLE IF NOT EXISTS ${TABLE_NAME} ( id INTEGER PRIMARY KEY, name VARCHAR(255), msg VARCHAR(200000), uid VARCHAR(128), created_at TIMESTAMP );

これを

CREATE TABLE IF NOT EXISTS room_users ( room_id INTEGER, user_uid VARCHAR(128), msg VARCHAR(200000), -- 追加 PRIMARY KEY (room_id, user_uid), FOREIGN KEY (room_id) REFERENCES rooms(id), FOREIGN KEY (user_uid) REFERENCES users(uid) );

などへ変更。

更に、下記のようなrooms 、users テーブルを追加する

CREATE TABLE IF NOT EXISTS rooms ( id INTEGER PRIMARY KEY, room_name VARCHAR(255), created_at TIMESTAMP );

CREATE TABLE IF NOT EXISTS users ( uid VARCHAR(128) PRIMARY KEY, user_name VARCHAR(255), created_at TIMESTAMP );

※ msg と user_name はend-to-endで暗号化される。

toshirot commented 5 months ago

各テーブルの生成タイミングは rooms 、users 、room_users テーブルすべて、「秘密のフレーズ」(ローカルへのみ保存・サーバーへは送らない)入力時で良いかな 別途、現在同様のデフォルト用も必要

toshirot commented 5 months ago

複数ルーム用のDBテスト追加 https://github.com/toshirot/mychat/blob/dev/test/rooms/rooms.test.ts image

toshirot commented 4 months ago

v0.1.030現在の単一ルーム制を複数ルーム制に変更する #12 https://github.com/toshirot/mychat/issues/12

手順

main   アリス: ブラウザで mychat へアクセスする   ブラウザ: set|get uid to cookie uid|uid=crypto.createHash('sha512').update(str).digest('hex') DOMContentLoaded   ブラウザ: 「名前」入力フィールドを表示する
function inputBox   アリス: 「名前」を入力する user_name   ブラウザ: 「名前」またはDEFAULT_NAME→set to cookie   アリス: <設定/ログイン を選ぶ> function regBox_1   ブラウザ: 「相手と共有する"秘密のフレーズ"を入力してください」   アリス: 秘密の"秘密のフレーズ"を入力する   アリス: 「デバイスだけに登録」ボタンを押す(※サーバーには送りません)   ブラウザ: LocalStorageへ encrypt("秘密のフレーズ") を保存する( ※サーバーからはcookie と違い読めない 検証: #2 (comment) )       input_my_pass.value = input_my_pass.value||getLocalStorage('mypass')||'';       setLocalStorage('mypass', input_my_pass.value); function conn2Server   ブラウザ: システムへ送信 (user_id, user_name) function conn2Client   システム: DBが無ければ生成する   システム: rooms, users, msgs 各テーブルが無ければroom_idを作り、テーブル生成する #12         テーブルは、TABLE_ROOMS、TABLE_USERS、TABLE_MSGS   システム: room_id で生成した chat url をブラウザへ送る   ブラウザ: room_id で生成した chat url をアリスへ表示する main + etc...   アリス: chat urlをクリックしてルームへ入る   ブラウザ: チャット画面を表示する   アリス: 直接相手へ口頭あるいはemailなど当該chatとは別の手段で"秘密のフレーズ"とroom_idを伝える         ※ "秘密のフレーズ"とroom_idは長いと覚えられないので、メモしておくこと

main   ボブ: ブラウザで mychat へアクセスする   ブラウザ: set|get uid to cookie uid|uid=crypto.createHash('sha512').update(str).digest('hex') DOMContentLoaded   ブラウザ: 「名前」入力フィールドを表示する
  ブラウザ: 「room_id」入力フィールドを表示する
function inputBox   ボブ: 「room_id」を入力する room_id   ブラウザ: →set to cookie   ボブ: 「名前」を入力する user_name   ブラウザ: 「名前」またはDEFAULT_NAME→set to cookie   ボブ: <設定/ログイン を選ぶ> function regBox_2   ブラウザ: 「相手と共有する"秘密のフレーズ"入力してください」   ボブ:: 秘密の"秘密のフレーズを入力する   ボブ:: 「デバイスだけに登録」ボタンを押す(※サーバーには送りません)   ブラウザ: LocalStorageへ encrypt("秘密のフレーズ") を保存する( ※サーバーからはcookie と違い読めない 検証: #2 (comment) )       input_my_pass.value = input_my_pass.value||getLocalStorage('mypass')||'';       setLocalStorage('mypass', input_my_pass.value); function conn2Server   ブラウザ: システムへ送信 (user_id, user_name) function conn2Client   システム: DBが無ければ終了しボブへmsg   システム: rooms, users, msgs 各テーブルが無ければ どうする??         テーブルは、TABLE_ROOMS、TABLE_USERS、TABLE_MSGS   システム: room_id で生成した chat url をブラウザへ送る   ブラウザ: room_id で生成した chat url をボブへ表示する main + etc...   アリス: chat urlをクリックしてルームへ入る   ブラウザ: チャット画面を表示する

チャット開始

・uid で認証しなければ chat url には入れない ・認証すれば、入ってチャットできる。 ・"秘密のフレーズ"が違えば読めない ・貴方と相手の「"秘密のフレーズ"は必ずチャット以外の手段で共有する」

・チャットはエンドツーエンドで暗号化され途中はシステム・サーバー側では読めない ・暗号化の"秘密のフレーズ"は、ローカルストレージに保存する ( ※サーバーからはcookie と違い読めない 検証: #2 (comment) )

シンプルになった^^

toshirot commented 4 months ago
function regBox_1
  ブラウザ: 「相手と共有する"秘密のフレーズ"を入力してください」
  アリス: 秘密の"秘密のフレーズ"を入力する

これいらないんじゃないかな、表示や受け渡しなどができれば。 例えばこんな感じで。

function regBox_1
  ブラウザ: 「相手と共有する"秘密のフレーズ"です。メモして相手に伝えてください。
   ※注意※このフレーズを忘れると会話を解読できなくなります」
  アリス: 「OK」ボタンを押す(※サーバーには送りません)