(ns metabase-enterprise.sso.api.interface
  (:require
   [metabase-enterprise.sso.integrations.sso-settings :as sso-settings]
   [metabase.util.i18n :refer [tru]]))
(defn- select-sso-backend
  [req]
  (if (contains? (:params req) :jwt)
    :jwt
    :saml))

Function that powers the defmulti in figuring out which SSO backend to use. It might be that we need to have more complex logic around this, but now it's just a simple priority. If SAML is configured use that otherwise JWT

(defn- sso-backend
  [req]
  (cond
    (and (sso-settings/saml-enabled) (sso-settings/jwt-enabled)) (select-sso-backend req)
    (sso-settings/saml-enabled) :saml
    (sso-settings/jwt-enabled)  :jwt
    :else                       nil))

Multi-method for supporting the first part of an SSO signin request. An implementation of this method will usually result in a redirect to an SSO backend

(defmulti sso-get
  sso-backend)

Multi-method for supporting a POST-back from an SSO signin request. An implementation of this method will need to validate the POST from the SSO backend and successfully log the user into Metabase.

(defmulti sso-post
  sso-backend)

Multi-method for handling a SLO request from an SSO backend. An implementation of this method will need to validate the SLO request and log the user out of Metabase.

(defmulti sso-handle-slo
  sso-backend)
(defn- throw-not-configured-error []
  (throw
   (ex-info (tru "SSO has not been enabled and/or configured")
            {:status-code 400
             :status      "error-sso-disabled"})))
(defmethod sso-get :default
  [_]
  (throw-not-configured-error))
(defmethod sso-post :default
  [_]
  (throw-not-configured-error))
(defmethod sso-handle-slo :default
  [_]
  (throw-not-configured-error))