From d3268d8a7b2980038942f097588042140bddb0cd Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Sat, 22 Feb 2025 14:44:12 -0500 Subject: [PATCH 01/11] Change oidc-client to oidc-client-ts --- deps.edn | 10 +++++----- src/lib/com/yetanalytics/re_oidc.cljs | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deps.edn b/deps.edn index 368dbe7..f6fbe45 100644 --- a/deps.edn +++ b/deps.edn @@ -1,8 +1,8 @@ -{:deps {org.clojure/clojure {:mvn/version "1.10.0"} - org.clojure/clojurescript {:mvn/version "1.10.773"} - reagent/reagent {:mvn/version "0.10.0"} - re-frame/re-frame {:mvn/version "1.3.0-rc2"} - cljsjs/oidc-client {:mvn/version "1.11.5-0"}} +{:deps {org.clojure/clojure {:mvn/version "1.10.0"} + org.clojure/clojurescript {:mvn/version "1.10.773"} + reagent/reagent {:mvn/version "0.10.0"} + re-frame/re-frame {:mvn/version "1.3.0-rc2"} + io.github.cljsjs/oidc-client-ts {:mvn/version "2.0.1-1"}} :paths ["src/lib" "resources"] :aliases {:dev {:extra-deps {org.clojure/test.check {:mvn/version "1.1.1"} diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index c78db7c..33122f7 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -1,5 +1,5 @@ (ns com.yetanalytics.re-oidc - (:require [cljsjs.oidc-client :refer [UserManager Log WebStorageStateStore]] + (:require [cljsjs.oidc-client-ts :refer [UserManager Log WebStorageStateStore]] [re-frame.core :as re-frame] [clojure.spec.alpha :as s :include-macros true] [com.yetanalytics.re-oidc.user :as user] From 880926903070dba732c4a79909aa2c1515946155 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Sat, 22 Feb 2025 14:44:35 -0500 Subject: [PATCH 02/11] Do absurd-amount-of-flag fixes for chromium tests --- test.cljs.edn | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test.cljs.edn b/test.cljs.edn index a3b3b09..0d9b2a4 100644 --- a/test.cljs.edn +++ b/test.cljs.edn @@ -5,6 +5,13 @@ ;; uncomment to launch tests in a headless environment ;; you will have to figure out the path to chrome on your system - :launch-js ["chromium" "--headless=new" "--disable-gpu" "--repl" :open-url] + :launch-js ["chromium" + "--headless=new" + "--disable-gpu" + "--no-sandbox" + "--disable-setuid-sandbox" + "--password-store=basic" + "--user-data-dir=/tmp/chromium" + "--repl" :open-url] } {:main com.test-runner} From f6ad999f343ddb9fca81bba821dad2ae4e0611a8 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Mon, 24 Feb 2025 16:51:36 -0500 Subject: [PATCH 03/11] Refactor out web-storage-state-store instantiation --- src/lib/com/yetanalytics/re_oidc.cljs | 34 +++++++++++---------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index 33122f7..adfab61 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -77,6 +77,17 @@ (doto (UserManager. (clj->js config)) (reg-events! lifecycle-callbacks)))) +(defn- web-storage-state-store + [store] + (let [store* (case store + :local-storage + js/window.localStorage + :session-storage + js/window.sessionStorage + ;; custom + store)] + (new WebStorageStateStore #js {:store store*}))) + (re-frame/reg-fx ::init-fx (fn [{:keys [config @@ -87,26 +98,9 @@ :as init-input}] (swap! user-manager init! - (assoc - config - "stateStore" - (new WebStorageStateStore - #js {:store (case state-store - :local-storage - js/window.localStorage - :session-storage - js/window.sessionStorage - ;; custom - state-store)}) - "userStore" - (new WebStorageStateStore - #js {:store (case user-store - :local-storage - js/window.localStorage - :session-storage - js/window.sessionStorage - ;; custom - user-store)})) + (assoc config + "stateStore" (web-storage-state-store state-store) + "userStore" (web-storage-state-store user-store)) (select-keys init-input [:on-user-loaded :on-user-unloaded])))) From c371f7b4f563ab23801901048ea62fe2b6bccc0e Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Mon, 24 Feb 2025 17:19:56 -0500 Subject: [PATCH 04/11] Set loadUserInfo back to default true --- src/lib/com/yetanalytics/re_oidc.cljs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index adfab61..aa3e2fc 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -99,8 +99,11 @@ (swap! user-manager init! (assoc config - "stateStore" (web-storage-state-store state-store) - "userStore" (web-storage-state-store user-store)) + ;; loadUserInfo is default true in original oidc-client lib, + ;; false in new oidc-client-ts lib. + "loadUserInfo" true + "stateStore" (web-storage-state-store state-store) + "userStore" (web-storage-state-store user-store)) (select-keys init-input [:on-user-loaded :on-user-unloaded])))) From 3d982fb2280849958b287abfd301bec15065d2b0 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:00:36 -0500 Subject: [PATCH 05/11] Log errors to console when they are caught by add-error --- src/lib/com/yetanalytics/re_oidc.cljs | 22 +++++++++++++-------- src/test/com/yetanalytics/re_oidc_test.cljs | 12 +++++------ 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index aa3e2fc..66ef754 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -193,17 +193,23 @@ .signoutRedirectCallback (u/handle-promise on-success on-failure))))) +(re-frame/reg-fx + ::print-error-fx + (fn [js-error] + (js/console.error js-error))) + (defn add-error "Add a thrown error to the list in the db" - [db [_ handler-id js-error]] - (update db - :errors - (fnil conj []) - (u/js-error->clj - handler-id - js-error))) + [{:keys [db]} [_ handler-id js-error]] + {:db (update db + :errors + (fnil conj []) + (u/js-error->clj + handler-id + js-error)) + :fx [[::print-error-fx js-error]]}) -(re-frame/reg-event-db +(re-frame/reg-event-fx ::add-error add-error) diff --git a/src/test/com/yetanalytics/re_oidc_test.cljs b/src/test/com/yetanalytics/re_oidc_test.cljs index 396c565..1d7d70e 100644 --- a/src/test/com/yetanalytics/re_oidc_test.cljs +++ b/src/test/com/yetanalytics/re_oidc_test.cljs @@ -16,12 +16,12 @@ :message "whoops!", :handler :some-handler, :ex-data {:type :com.yetanalytics.re-oidc-test/whoops}}]} - (add-error - {} - [nil - :some-handler - (ex-info "whoops!" - {:type ::whoops})]))))) + (:db (add-error + {:db {}} + [nil + :some-handler + (ex-info "whoops!" + {:type ::whoops})])))))) (deftest user-loaded-test (testing "Loads the user from JS" From 20f1ad83e9946218ccdf96776642f08c2aa5ec5f Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:31:55 -0500 Subject: [PATCH 06/11] Pass full URL to signinRedirectCallback --- src/lib/com/yetanalytics/re_oidc.cljs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index 66ef754..06c32e7 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -165,13 +165,16 @@ (fn [{:keys [on-success on-failure query-string]}] - (let [on-failure (or on-failure - [::add-error ::signin-redirect-callback-fx]) - um (get-user-manager)] - (-> um - (.signinRedirectCallback query-string) + (let [on-failure (or on-failure + [::add-error ::signin-redirect-callback-fx]) + user-manager (get-user-manager) + ;; We need a full URL, not query param string, here. + ;; See: PRs #535 and #999 on oidc-client-ts. + url-string (str "http://127.0.0.1" query-string)] + (-> user-manager + (.signinRedirectCallback url-string) (u/handle-promise on-success on-failure) - (.then #(.clearStaleState um)))))) + (.then #(.clearStaleState user-manager)))))) (re-frame/reg-fx ::signout-redirect-fx From 91992ab39311bc0becd00211bab780f9d7b3d444 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:33:07 -0500 Subject: [PATCH 07/11] Add VSCode files to gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8e850dc..a5c38bc 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ pom.xml .cpcache/ .rebel_readline_history resources/public/cljs-out/ +.calva/ .clj-kondo/.cache +.cljs_node_repl/ +.lsp/ .DS_Store - From 58881ac4ee87c08a005db4f9b4a58ca34ea94bf0 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:34:11 -0500 Subject: [PATCH 08/11] Remove linting errors --- src/lib/com/yetanalytics/re_oidc.cljs | 1 + src/test/com/test_runner.cljs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index 06c32e7..c1ab0c8 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -1,4 +1,5 @@ (ns com.yetanalytics.re-oidc + #_{:clj-kondo/ignore [:unused-referred-var]} ; For Log (:require [cljsjs.oidc-client-ts :refer [UserManager Log WebStorageStateStore]] [re-frame.core :as re-frame] [clojure.spec.alpha :as s :include-macros true] diff --git a/src/test/com/test_runner.cljs b/src/test/com/test_runner.cljs index 65d38eb..72f4045 100644 --- a/src/test/com/test_runner.cljs +++ b/src/test/com/test_runner.cljs @@ -5,5 +5,5 @@ [com.yetanalytics.re-oidc-test] [figwheel.main.testing :refer [run-tests-async]])) -(defn -main [& args] +(defn -main [& _args] (run-tests-async 5000)) From 97e1dbb8299c4dc84141b6db328c39eea0950c36 Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:35:48 -0500 Subject: [PATCH 09/11] Straighten out maps --- src/lib/com/yetanalytics/re_oidc.cljs | 50 +++++++++++++-------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index c1ab0c8..ac0e2d7 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -220,27 +220,27 @@ (defn user-loaded "Load a user object from js into the db and set status to :loaded" [db [_ js-user]] - (let [id-token (.-id_token js-user) - access-token (.-access_token js-user) - expires-at (.-expires_at js-user) + (let [id-token (.-id_token js-user) + access-token (.-access_token js-user) + expires-at (.-expires_at js-user) refresh-token (.-refresh_token js-user) - token-type (.-token_type js-user) - state (.-state js-user) + token-type (.-token_type js-user) + state (.-state js-user) session-state (.-session_state js-user) - scope (.-scope js-user) - profile (js->clj (.-profile js-user))] + scope (.-scope js-user) + profile (js->clj (.-profile js-user))] (assoc db ::status :loaded ::user - {:id-token id-token - :access-token access-token + {:id-token id-token + :access-token access-token :refresh-token refresh-token - :expires-at expires-at - :token-type token-type - :state state - :scope scope + :expires-at expires-at + :token-type token-type + :state state + :scope scope :session-state session-state - :profile profile}))) + :profile profile}))) (re-frame/reg-event-db ::user-loaded @@ -368,26 +368,26 @@ (dissoc ::callback ::login-query-string)) :fx [[::init-fx - {:config (cond-> oidc-config - redirect-uri-absolution - u/absolve-redirect-uris) - :state-store state-store - :user-store user-store - :on-user-loaded on-user-loaded + {:config (cond-> oidc-config + redirect-uri-absolution + u/absolve-redirect-uris) + :state-store state-store + :user-store user-store + :on-user-loaded on-user-loaded :on-user-unloaded on-user-unloaded}] (case ?callback :login [::signin-redirect-callback-fx {:query-string ?qstring - :on-success on-login-success - :on-failure on-login-failure}] + :on-success on-login-success + :on-failure on-login-failure}] :logout [::signout-redirect-callback-fx {:on-success on-logout-success :on-failure on-logout-failure}] [::get-user-fx ;; We need to set the user, if present, no matter what - {:auto-login auto-login - :on-success on-get-user-success - :on-failure on-get-user-failure + {:auto-login auto-login + :on-success on-get-user-success + :on-failure on-get-user-failure :on-user-loaded on-user-loaded}])]})) (re-frame/reg-event-fx From acd78308318c26f295f3c0245f77b4d71bb7214f Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 12:36:25 -0500 Subject: [PATCH 10/11] Remove redundant ?user --- src/lib/com/yetanalytics/re_oidc.cljs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/lib/com/yetanalytics/re_oidc.cljs b/src/lib/com/yetanalytics/re_oidc.cljs index ac0e2d7..ec90d67 100644 --- a/src/lib/com/yetanalytics/re_oidc.cljs +++ b/src/lib/com/yetanalytics/re_oidc.cljs @@ -133,12 +133,9 @@ .getUser (u/handle-promise (cond-> (fn [?user] - (if-let [logged-in-user (and ?user - (not - (some-> ?user - .-expires_at - u/expired?)) - ?user)] + (if-let [logged-in-user + (and ?user + (not (some-> ?user .-expires_at u/expired?)))] (do (re-frame/dispatch [::user-loaded logged-in-user]) ;; ensure any custom loaded callback is fired From f84b8314d127bb973df1d62a6fceefdd9efcf0fd Mon Sep 17 00:00:00 2001 From: kelvinqian00 Date: Wed, 26 Feb 2025 14:24:03 -0500 Subject: [PATCH 11/11] Update GH workflow action versions --- .github/workflows/ci.yml | 6 +++--- .github/workflows/deploy.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 999016a..3e1e2cf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,13 +8,13 @@ jobs: timeout-minutes: 5 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CI Environment - uses: yetanalytics/actions/setup-env@v0.0.4 + uses: yetanalytics/action-setup-env@v2 - name: Cache Deps - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.m2 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ff5e4fc..22f71e2 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -11,13 +11,13 @@ jobs: timeout-minutes: 5 steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup CD Environment - uses: yetanalytics/actions/setup-env@v0.0.4 + uses: yetanalytics/action-setup-env@v2 - name: Cache Deps - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.m2 @@ -37,7 +37,7 @@ jobs: run: echo version=${GITHUB_REF#refs\/tags\/v} >> $GITHUB_OUTPUT - name: Build and deploy to Clojars - uses: yetanalytics/actions/deploy-clojars@v0.0.4 + uses: yetanalytics/action-deploy-clojars@v2 with: artifact-id: 're-oidc' src-dirs: '["src/lib"]'