From e32de618dba04101ca62d9e2832a6472a8ba05e4 Mon Sep 17 00:00:00 2001
From: Noah Moss <32746338+noahmoss@users.noreply.github.com>
Date: Tue, 11 Jan 2022 12:58:54 -0500
Subject: [PATCH] Move `is-hosted?` check out of memoized function for cloud
 gateway IP setting (#19576)

---
 .../test/metabase/driver/oracle_test.clj      | 115 +++++++++---------
 src/metabase/public_settings.clj              |  19 +--
 test/metabase/public_settings_test.clj        |  11 +-
 3 files changed, 74 insertions(+), 71 deletions(-)

diff --git a/modules/drivers/oracle/test/metabase/driver/oracle_test.clj b/modules/drivers/oracle/test/metabase/driver/oracle_test.clj
index ca0b68ed38d..5519c798802 100644
--- a/modules/drivers/oracle/test/metabase/driver/oracle_test.clj
+++ b/modules/drivers/oracle/test/metabase/driver/oracle_test.clj
@@ -14,6 +14,7 @@
             [metabase.models.database :refer [Database]]
             [metabase.models.field :refer [Field]]
             [metabase.models.table :refer [Table]]
+            [metabase.public-settings.premium-features :as premium-features]
             [metabase.query-processor :as qp]
             [metabase.query-processor-test :as qp.test]
             [metabase.query-processor-test.order-by-test :as qp-test.order-by-test] ; used for one SSL connectivity test
@@ -88,63 +89,63 @@
 
 (deftest connection-properties-test
   (testing "Connection properties should be returned properly (including transformation of secret types)"
-    (let [expected [{:name "host"}
-                    {:name "port"}
-                    {:name "sid"}
-                    {:name "service-name"}
-                    {:name "user"}
-                    {:name "password"}
-                    {:name "cloud-ip-address-info"}
-                    {:name "ssl"}
-                    {:name "ssl-use-keystore"}
-                    {:name       "ssl-keystore-options"
-                     :type       "select"
-                     :options    [{:name  "Local file path"
-                                   :value "local"}
-                                  {:name  "Uploaded file path"
-                                   :value "uploaded"}]
-                     :visible-if {:ssl-use-keystore true}}
-                    {:name       "ssl-keystore-value"
-                     :type       "textFile"
-                     :visible-if {:ssl-keystore-options "uploaded"}}
-                    {:name       "ssl-keystore-path"
-                     :type       "string"
-                     :visible-if {:ssl-keystore-options "local"}}
-                    {:name "ssl-keystore-password-value"
-                     :type "password"}
-                    {:name "ssl-use-truststore"}
-                    {:name       "ssl-truststore-options"
-                     :type       "select"
-                     :options    [{:name  "Local file path"
-                                   :value "local"}
-                                  {:name  "Uploaded file path"
-                                   :value "uploaded"}]
-                     :visible-if {:ssl-use-truststore true}}
-                    {:name       "ssl-truststore-value"
-                     :type       "textFile"
-                     :visible-if {:ssl-truststore-options "uploaded"}}
-                    {:name       "ssl-truststore-path"
-                     :type       "string"
-                     :visible-if {:ssl-truststore-options "local"}}
-                    {:name "ssl-truststore-password-value"
-                     :type "password"}
-                    {:name "tunnel-enabled"}
-                    {:name "tunnel-host"}
-                    {:name "tunnel-port"}
-                    {:name "tunnel-user"}
-                    {:name "tunnel-auth-option"}
-                    {:name "tunnel-pass"}
-                    {:name "tunnel-private-key"}
-                    {:name "tunnel-private-key-passphrase"}
-                    {:name "advanced-options"}
-                    {:name "auto_run_queries"}
-                    {:name "let-user-control-scheduling"}
-                    {:name "schedules.metadata_sync"}
-                    {:name "schedules.cache_field_values"}
-                    {:name "refingerprint"}]
-          actual   (->> (driver/connection-properties :oracle)
-                        (driver.u/connection-props-server->client :oracle))]
-      (is (= expected (mt/select-keys-sequentially expected actual))))))
+    (with-redefs [premium-features/is-hosted? (constantly false)]
+      (let [expected [{:name "host"}
+                      {:name "port"}
+                      {:name "sid"}
+                      {:name "service-name"}
+                      {:name "user"}
+                      {:name "password"}
+                      {:name "ssl"}
+                      {:name "ssl-use-keystore"}
+                      {:name       "ssl-keystore-options"
+                       :type       "select"
+                       :options    [{:name  "Local file path"
+                                     :value "local"}
+                                    {:name  "Uploaded file path"
+                                     :value "uploaded"}]
+                       :visible-if {:ssl-use-keystore true}}
+                      {:name       "ssl-keystore-value"
+                       :type       "textFile"
+                       :visible-if {:ssl-keystore-options "uploaded"}}
+                      {:name       "ssl-keystore-path"
+                       :type       "string"
+                       :visible-if {:ssl-keystore-options "local"}}
+                      {:name "ssl-keystore-password-value"
+                       :type "password"}
+                      {:name "ssl-use-truststore"}
+                      {:name       "ssl-truststore-options"
+                       :type       "select"
+                       :options    [{:name  "Local file path"
+                                     :value "local"}
+                                    {:name  "Uploaded file path"
+                                     :value "uploaded"}]
+                       :visible-if {:ssl-use-truststore true}}
+                      {:name       "ssl-truststore-value"
+                       :type       "textFile"
+                       :visible-if {:ssl-truststore-options "uploaded"}}
+                      {:name       "ssl-truststore-path"
+                       :type       "string"
+                       :visible-if {:ssl-truststore-options "local"}}
+                      {:name "ssl-truststore-password-value"
+                       :type "password"}
+                      {:name "tunnel-enabled"}
+                      {:name "tunnel-host"}
+                      {:name "tunnel-port"}
+                      {:name "tunnel-user"}
+                      {:name "tunnel-auth-option"}
+                      {:name "tunnel-pass"}
+                      {:name "tunnel-private-key"}
+                      {:name "tunnel-private-key-passphrase"}
+                      {:name "advanced-options"}
+                      {:name "auto_run_queries"}
+                      {:name "let-user-control-scheduling"}
+                      {:name "schedules.metadata_sync"}
+                      {:name "schedules.cache_field_values"}
+                      {:name "refingerprint"}]
+            actual   (->> (driver/connection-properties :oracle)
+                          (driver.u/connection-props-server->client :oracle))]
+        (is (= expected (mt/select-keys-sequentially expected actual)))))))
 
 (deftest test-ssh-connection
   (testing "Gets an error when it can't connect to oracle via ssh tunnel"
diff --git a/src/metabase/public_settings.clj b/src/metabase/public_settings.clj
index cb2d1e2ac00..ee4fed4c8db 100644
--- a/src/metabase/public_settings.clj
+++ b/src/metabase/public_settings.clj
@@ -454,14 +454,13 @@
 (def ^:private fetch-cloud-gateway-ips-fn
   (memoize/ttl
    (fn []
-       (when (premium-features/is-hosted?)
-         (try
-           (-> (http/get (cloud-gateway-ips-url))
-               :body
-               (json/parse-string keyword)
-               :ip_addresses)
-           (catch Exception e
-             (log/error e (trs "Error fetching Metabase Cloud gateway IP addresses:"))))))
+     (try
+       (-> (http/get (cloud-gateway-ips-url))
+           :body
+           (json/parse-string keyword)
+           :ip_addresses)
+       (catch Exception e
+         (log/error e (trs "Error fetching Metabase Cloud gateway IP addresses:")))))
    :ttl/threshold (* 1000 60 60 24)))
 
 (defsetting cloud-gateway-ips
@@ -469,7 +468,9 @@
   :visibility :public
   :type       :json
   :setter     :none
-  :getter     fetch-cloud-gateway-ips-fn)
+  :getter     (fn []
+                (when (premium-features/is-hosted?)
+                  (fetch-cloud-gateway-ips-fn))))
 
 (defsetting show-database-syncing-modal
   (str (deferred-tru "Whether an introductory modal should be shown after the next database connection is added.")
diff --git a/test/metabase/public_settings_test.clj b/test/metabase/public_settings_test.clj
index 064c5d43492..50360b05f51 100644
--- a/test/metabase/public_settings_test.clj
+++ b/test/metabase/public_settings_test.clj
@@ -206,8 +206,9 @@
         (is (= nil (public-settings/cloud-gateway-ips))))))
 
   (testing "Setting returns nil in self-hosted environments"
-    (memoize/memo-clear! @#'public-settings/fetch-cloud-gateway-ips-fn)
-    (http-fake/with-fake-routes-in-isolation
-      {{:address (public-settings/cloud-gateway-ips-url)}
-       (constantly {:status 200 :body "{\"ip_addresses\": [\"127.0.0.1\"]}"})}
-      (is (= nil (public-settings/cloud-gateway-ips))))))
+    (with-redefs [premium-features/is-hosted? (constantly false)]
+      (memoize/memo-clear! @#'public-settings/fetch-cloud-gateway-ips-fn)
+      (http-fake/with-fake-routes-in-isolation
+        {{:address (public-settings/cloud-gateway-ips-url)}
+         (constantly {:status 200 :body "{\"ip_addresses\": [\"127.0.0.1\"]}"})}
+        (is (= nil (public-settings/cloud-gateway-ips)))))))
-- 
GitLab