From 2424dbba190cd01dbf7855fdee62efedb4dcf40b Mon Sep 17 00:00:00 2001
From: William Turner <william.turner@aero.bombardier.com>
Date: Wed, 29 Mar 2017 12:34:55 -0400
Subject: [PATCH] Adds working admin panel with filter validation

---
 .../settings/components/SettingsLdapForm.jsx    | 17 +++++++++++++++++
 .../src/metabase/admin/settings/selectors.js    |  3 ++-
 src/metabase/api/ldap.clj                       | 16 ++++++++++++++++
 src/metabase/api/routes.clj                     |  2 ++
 4 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 src/metabase/api/ldap.clj

diff --git a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.jsx b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.jsx
index 4791c2010f8..095bedf0159 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.jsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.jsx
@@ -56,8 +56,12 @@ export default class SettingsLdapForm extends Component {
         if (MetabaseUtils.isEmpty(value)) return;
 
         switch (validationType) {
+            case "email":
+                return !MetabaseUtils.validEmail(value) ? (validationMessage || "That's not a valid email address") : null;
             case "integer":
                 return isNaN(parseInt(value)) ? (validationMessage || "That's not a valid integer") : null;
+            case "ldap_filter":
+                return (value.match(/\(/g) || []).length !== (value.match(/\)/g) || []).length ? (validationMessage || "Check your parentheses") : null;
         }
     }
 
@@ -147,6 +151,19 @@ export default class SettingsLdapForm extends Component {
             let errorMessage = (formErrors && formErrors.elements) ? formErrors.elements[element.key] : validationErrors[element.key];
             let value = formData[element.key] == null ? element.defaultValue : formData[element.key];
 
+            if (element.key === "ldap-enabled") {
+                let configuredEnough = formData["ldap-host"] && formData['ldap-bind-dn'] && formData['ldap-password'] && formData['ldap-base'];
+                return (
+                    <SettingsSetting
+                        key={element.key}
+                        setting={{ ...element, value }}
+                        updateSetting={(value) => this.handleChangeEvent(element, value)}
+                        errorMessage={errorMessage}
+                        disabled={!configuredEnough}
+                    />
+                );
+            }
+
             return (
                 <SettingsSetting
                     key={element.key}
diff --git a/frontend/src/metabase/admin/settings/selectors.js b/frontend/src/metabase/admin/settings/selectors.js
index 8f6f5287565..dbd5785b49b 100644
--- a/frontend/src/metabase/admin/settings/selectors.js
+++ b/frontend/src/metabase/admin/settings/selectors.js
@@ -209,7 +209,8 @@ const SECTIONS = [
             {
                 key: "ldap-user-filter",
                 display_name: "User filter",
-                type: "string"
+                type: "string",
+                validations: [["ldap_filter", "Check your parentheses"]]
             },
             {
                 key: "ldap-attribute-email",
diff --git a/src/metabase/api/ldap.clj b/src/metabase/api/ldap.clj
new file mode 100644
index 00000000000..73e109aa279
--- /dev/null
+++ b/src/metabase/api/ldap.clj
@@ -0,0 +1,16 @@
+(ns metabase.api.ldap
+  "/api/ldap endpoints"
+  (:require [compojure.core :refer [PUT]]
+            [metabase.api.common :refer :all]
+            [metabase.models.setting :as setting]
+            [metabase.util.schema :as su]))
+
+(defendpoint PUT "/settings"
+  "Update LDAP related settings. You must be a superuser to do this."
+  [:as {settings :body}]
+  {settings su/Map}
+  (check-superuser)
+  (setting/set-many! settings)
+  {:ok true})
+
+(define-routes)
diff --git a/src/metabase/api/routes.clj b/src/metabase/api/routes.clj
index 20ed2d16ff2..5d7d642fa40 100644
--- a/src/metabase/api/routes.clj
+++ b/src/metabase/api/routes.clj
@@ -13,6 +13,7 @@
                           [getting-started :as getting-started]
                           [geojson :as geojson]
                           [label :as label]
+                          [ldap :as ldap]
                           [metric :as metric]
                           [notify :as notify]
                           [permissions :as permissions]
@@ -61,6 +62,7 @@
   (context "/getting_started" [] (+auth getting-started/routes))
   (context "/geojson"         [] (+auth geojson/routes))
   (context "/label"           [] (+auth label/routes))
+  (context "/ldap"            [] (+auth ldap/routes))
   (context "/metric"          [] (+auth metric/routes))
   (context "/notify"          [] (+apikey notify/routes))
   (context "/permissions"     [] (+auth permissions/routes))
-- 
GitLab