From 219d9ad201de122fefcaded6e718424e9649ce32 Mon Sep 17 00:00:00 2001 From: rcmerci Date: Sun, 9 Nov 2025 20:50:42 +0800 Subject: [PATCH] feat(rtc,e2ee): grant-access support e2ee --- src/main/frontend/components/e2ee.cljs | 4 +- src/main/frontend/components/header.cljs | 2 +- src/main/frontend/components/settings.cljs | 9 +- src/main/frontend/db/rtc/debug_ui.cljs | 23 ----- src/main/frontend/handler/db_based/rtc.cljs | 20 ++-- src/main/frontend/worker/rtc/core.cljs | 27 +++--- src/main/frontend/worker/rtc/crypt.cljs | 95 +++++++++++++------ src/main/frontend/worker/rtc/exception.cljs | 1 + .../frontend/worker/rtc/malli_schema.cljs | 15 ++- 9 files changed, 116 insertions(+), 80 deletions(-) diff --git a/src/main/frontend/components/e2ee.cljs b/src/main/frontend/components/e2ee.cljs index 256a56b186..bec52d7438 100644 --- a/src/main/frontend/components/e2ee.cljs +++ b/src/main/frontend/components/e2ee.cljs @@ -21,7 +21,7 @@ "OK") (shui/button {:on-click (fn [] - (p/reject! password-promise :cancelled) + (p/reject! password-promise (ex-info "cancelled" {})) (shui/dialog-close!))} "Cancel")]])) @@ -48,6 +48,6 @@ "OK") (shui/button {:on-click (fn [] - (p/reject! private-key-promise :cancelled) + (p/reject! private-key-promise (ex-info "input E2EE password cancelled" {})) (shui/dialog-close!))} "Cancel")]])) diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index f0ccb039ff..d7a7cc59e2 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -74,7 +74,7 @@ (fn [] [:div.p-2.-mb-8 [:h1.text-3xl.-mt-2.-ml-2 "Collaborators:"] - (settings/settings-collaboration)]))}) + (settings/settings-collaboration false)]))}) (when (seq online-users) (for [{user-email :user/email diff --git a/src/main/frontend/components/settings.cljs b/src/main/frontend/components/settings.cljs index 9ece65640b..4eb21f8caa 100644 --- a/src/main/frontend/components/settings.cljs +++ b/src/main/frontend/components/settings.cljs @@ -1253,11 +1253,12 @@ "Reset Password")]))])) (rum/defc settings-collaboration - [] + [include-e2ee-settings?] [:div.panel-wrap.is-collaboration.mb-8 (settings-rtc-members) - [:br] - (settings-rtc-e2ee)]) + (when include-e2ee-settings? + [:br] + (settings-rtc-e2ee))]) (rum/defc mcp-server-row [t] @@ -1483,7 +1484,7 @@ (settings-features) :collaboration - (settings-collaboration) + (settings-collaboration true) :ai (settings-ai) diff --git a/src/main/frontend/db/rtc/debug_ui.cljs b/src/main/frontend/db/rtc/debug_ui.cljs index c5a2ecbc4b..db6ec0ad66 100644 --- a/src/main/frontend/db/rtc/debug_ui.cljs +++ b/src/main/frontend/db/rtc/debug_ui.cljs @@ -137,29 +137,6 @@ :on-click (fn [] (stop))} (shui/tabler-icon "player-stop") "stop")]]) - (when (some? debug-state*) - [:hr] - [:div.flex.flex-row.items-center.gap-2 - (ui/button "grant graph access to" - {:icon "award" - :on-click (fn [] - (let [token (state/get-auth-id-token) - user-uuid (some-> (:grant-access-to-user debug-state*) parse-uuid) - user-email (when-not user-uuid (:grant-access-to-user debug-state*))] - (when-let [graph-uuid (:graph-uuid debug-state*)] - (state/ user-uuid vector) - (some-> user-email vector)))))}) - - [:b "➡️"] - [:input.form-input.my-2.py-1 - {:on-change (fn [e] (swap! debug-state assoc :grant-access-to-user (util/evalue e))) - :on-focus (fn [e] (let [v (.-value (.-target e))] - (when (= v "input email or user-uuid here") - (set! (.-value (.-target e)) "")))) - :placeholder "input email or user-uuid here"}]]) - [:hr.my-2] [:div.flex.flex-row.items-center.gap-2 diff --git a/src/main/frontend/handler/db_based/rtc.cljs b/src/main/frontend/handler/db_based/rtc.cljs index 6f407e4f92..cffc14207f 100644 --- a/src/main/frontend/handler/db_based/rtc.cljs +++ b/src/main/frontend/handler/db_based/rtc.cljs @@ -163,12 +163,14 @@ (defn - (p/do! - (state/ + (p/do! + (state/ {:action "grant-access" - :graph-uuid graph-uuid} - target-user-uuids (assoc :target-user-uuids target-user-uuids) - target-user-emails (assoc :target-user-emails target-user-emails))))) + [token graph-uuid user-uuid target-user-email] + (m/sp + (let [{:keys [get-ws-create-task]} (gen-get-ws-create-map--memoized (ws-util/get-ws-url token)) + encrypted-aes-key + (m/? (rtc-crypt/task--encrypt-graph-aes-key-by-other-user-public-key + get-ws-create-task graph-uuid user-uuid target-user-email)) + resp (m/? (ws-util/send&recv get-ws-create-task + (cond-> {:action "grant-access" + :graph-uuid graph-uuid + :target-user-email+encrypted-aes-key-coll + [{:user/email target-user-email + :encrypted-aes-key (ldb/write-transit-str encrypted-aes-key)}]})))] + (when (:ex-data resp) + (throw (ex-info (:ex-message resp) (:ex-data resp))))))) (defn new-task--get-block-content-versions "Return a task that return map [:ex-data :ex-message :versions]" @@ -612,10 +619,8 @@ (rtc-toggle-remote-profile)) (def-thread-api :thread-api/rtc-grant-graph-access - [token graph-uuid target-user-uuids target-user-emails] - (new-task--grant-access-to-others token graph-uuid - :target-user-uuids target-user-uuids - :target-user-emails target-user-emails)) + [token graph-uuid user-uuid target-user-email] + (new-task--grant-access-to-others token graph-uuid user-uuid target-user-email)) (def-thread-api :thread-api/rtc-get-graphs [token] diff --git a/src/main/frontend/worker/rtc/crypt.cljs b/src/main/frontend/worker/rtc/crypt.cljs index bb03001693..c040f0f30b 100644 --- a/src/main/frontend/worker/rtc/crypt.cljs +++ b/src/main/frontend/worker/rtc/crypt.cljs @@ -43,6 +43,12 @@ (assert (some? user-uuid)) (str "user-rsa-key-pair###" user-uuid))) +(defn-