diff --git a/cli-e2e/src/logseq/cli/e2e/runner.clj b/cli-e2e/src/logseq/cli/e2e/runner.clj index ff69fc133a..ebf082a1e1 100644 --- a/cli-e2e/src/logseq/cli/e2e/runner.clj +++ b/cli-e2e/src/logseq/cli/e2e/runner.clj @@ -14,6 +14,7 @@ text))) (def template-pattern #"\{\{([^}]+)\}\}") +(def ^:private e2e-env {"CLI_E2E_TEST" "1"}) (defn- render-string [template context] @@ -165,6 +166,7 @@ [command context {:keys [run-command stdin allow-failure phase step-index step-total case-id]}] (run-command {:cmd (render-string command context) :dir (paths/repo-root) + :env e2e-env :stdin (some-> stdin (render-string context)) :phase phase :step-index step-index diff --git a/src/main/frontend/handler/e2ee.cljs b/src/main/frontend/handler/e2ee.cljs index e0b8d95655..6b01bb141b 100644 --- a/src/main/frontend/handler/e2ee.cljs +++ b/src/main/frontend/handler/e2ee.cljs @@ -1,12 +1,8 @@ (ns frontend.handler.e2ee "rtc E2EE related fns" (:require [electron.ipc :as ipc] - [frontend.common.crypt :as crypt] - [frontend.common.thread-api :refer [def-thread-api]] [frontend.mobile.secure-storage :as secure-storage] - [frontend.state :as state] [frontend.util :as util] - [lambdaisland.glogi :as log] [promesa.core :as p])) (def ^:private save-op :keychain/save-e2ee-password) @@ -70,35 +66,3 @@ (if (native-storage-supported?) ( - (p/let [private-key-promise (state/pub-event! [:rtc/decrypt-user-e2ee-private-key encrypted-private-key]) - private-key private-key-promise] - (crypt/ (p/let [_ (.setPassword ^js keytar keychain-service (keychain-account key) text)] + (-> (p/let [_ (.setPassword ^js keytar keychain-service key text)] nil) (p/catch (fn [e] (log/warn :db-worker/keychain-save-failed {:error e :key key}) - ((:set! kv) (secret-key key) text))))) + ((:set! kv) key text))))) (defn- (p/let [secret (.getPassword ^js keytar keychain-service (keychain-account key))] + (-> (p/let [secret (.getPassword ^js keytar keychain-service key)] secret) (p/catch (fn [e] (log/warn :db-worker/keychain-read-failed {:error e :key key}) - ((:get kv) (secret-key key)))))) + ((:get kv) key))))) (defn- (p/let [_ (.deletePassword ^js keytar keychain-service (keychain-account key))] + (-> (p/let [_ (.deletePassword ^js keytar keychain-service key)] nil) (p/catch (fn [e] (log/warn :db-worker/keychain-delete-failed {:error e :key key}) - ((:set! kv) (secret-key key) nil))))) + ((:set! kv) key nil))))) + +(defn- truthy-env? + [value] + (contains? #{"1" "true" "yes" "on"} + (string/lower-case (string/trim (str (or value "")))))) + +(defn- use-keychain-for-owner? + [owner-source] + (not (and (= :cli owner-source) + (truthy-env? (gobj/get (.-env js/process) "CLI_E2E_TEST"))))) + +(defn- (p/let [platform (platform-node/node-platform {:data-dir data-dir + :owner-source :cli}) + crypto (:crypto platform) + kv (:kv platform) + _ ((:save-secret-text! crypto) "secret-key" "secret-value") + kv-value ((:get kv) "secret-key") + secret-value ((:read-secret-text crypto) "secret-key") + _ ((:delete-secret-text! crypto) "secret-key") + kv-cleared ((:get kv) "secret-key")] + (is (= "secret-value" kv-value)) + (is (= "secret-value" secret-value)) + (is (nil? kv-cleared)) + (is (= {:save 0 :read 0 :delete 0} @calls))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally (fn [] + (gobj/set keytar "setPassword" original-save) + (gobj/set keytar "getPassword" original-read) + (gobj/set keytar "deletePassword" original-delete) + (if (some? original-cli-e2e-test) + (gobj/set process-env "CLI_E2E_TEST" original-cli-e2e-test) + (gobj/remove process-env "CLI_E2E_TEST")) + (done))))))) + +(deftest node-platform-cli-owner-uses-keychain-when-keychain-present + (async done + (let [data-dir (node-helper/create-tmp-dir "platform-node-cli-secrets-keychain") + process-env (.-env js/process) + original-cli-e2e-test (gobj/get process-env "CLI_E2E_TEST") + calls (atom {:save 0 :read 0 :delete 0}) + secrets (atom {}) + original-save (gobj/get keytar "setPassword") + original-read (gobj/get keytar "getPassword") + original-delete (gobj/get keytar "deletePassword")] + (gobj/remove process-env "CLI_E2E_TEST") + (gobj/set keytar "setPassword" (fn [_service key value] + (swap! calls update :save inc) + (swap! secrets assoc key value) + (js/Promise.resolve true))) + (gobj/set keytar "getPassword" (fn [_service key] + (swap! calls update :read inc) + (js/Promise.resolve (get @secrets key)))) + (gobj/set keytar "deletePassword" (fn [_service key] + (swap! calls update :delete inc) + (swap! secrets dissoc key) + (js/Promise.resolve true))) + (-> (p/let [platform (platform-node/node-platform {:data-dir data-dir + :owner-source :cli}) + crypto (:crypto platform) + kv (:kv platform) + _ ((:save-secret-text! crypto) "secret-key" "secret-value") + kv-value ((:get kv) "secret-key") + secret-value ((:read-secret-text crypto) "secret-key") + _ ((:delete-secret-text! crypto) "secret-key") + deleted-value ((:read-secret-text crypto) "secret-key")] + (is (nil? kv-value)) + (is (= "secret-value" secret-value)) + (is (nil? deleted-value)) + (is (= {:save 1 :read 2 :delete 1} @calls))) + (p/catch (fn [e] + (is false (str "unexpected error: " e)))) + (p/finally (fn [] + (gobj/set keytar "setPassword" original-save) + (gobj/set keytar "getPassword" original-read) + (gobj/set keytar "deletePassword" original-delete) + (if (some? original-cli-e2e-test) + (gobj/set process-env "CLI_E2E_TEST" original-cli-e2e-test) + (gobj/remove process-env "CLI_E2E_TEST")) + (done))))))) + (deftest kv-store-preserves-uint8array-values-across-reloads-test (async done (let [data-dir (node-helper/create-tmp-dir "platform-node-kv-store")