From 37907772fe45272f22bedc2610f33633d1d066bf Mon Sep 17 00:00:00 2001
From: Leonardo Menezes <mail@lmenezes.com>
Date: Wed, 25 Oct 2017 19:51:30 +0200
Subject: [PATCH] allow providing known host auth through request

---
 app/models/CerebroRequest.scala | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/app/models/CerebroRequest.scala b/app/models/CerebroRequest.scala
index d710823..829cc22 100644
--- a/app/models/CerebroRequest.scala
+++ b/app/models/CerebroRequest.scala
@@ -4,7 +4,7 @@ import controllers.auth.AuthRequest
 import exceptions.{MissingRequiredParamException, MissingTargetHostException}
 import play.api.libs.json.{JsArray, JsObject, JsValue}
 
-class CerebroRequest(val target: ElasticServer, body: JsValue, val user: Option[User]) {
+case class CerebroRequest(val target: ElasticServer, body: JsValue, val user: Option[User]) {
 
   def get(name: String) =
     (body \ name).asOpt[String].getOrElse(throw MissingRequiredParamException(name))
@@ -36,22 +36,23 @@ class CerebroRequest(val target: ElasticServer, body: JsValue, val user: Option[
 
 object CerebroRequest {
 
-  def apply(request: AuthRequest[JsValue], hosts: Hosts) = {
+  def apply(request: AuthRequest[JsValue], hosts: Hosts): CerebroRequest = {
     val body = request.body
 
     val host = (body \ "host").asOpt[String].getOrElse(throw MissingTargetHostException)
-    val knownHost = hosts.getServer(host)
-    val cluster = knownHost.getOrElse {
-      val username = (body \ "username").asOpt[String]
-      val password = (body \ "password").asOpt[String]
-      if (username.isDefined && password.isDefined) {
-        val auth = ESAuth(username.get, password.get)
-        ElasticServer(host, Some(auth))
-      } else {
-        ElasticServer(host, None)
-      }
+    val username = (body \ "username").asOpt[String]
+    val password = (body \ "password").asOpt[String]
+
+    val requestAuth = (username, password) match {
+      case (Some(u), Some(p)) => Some(ESAuth(u, p))
+      case _ => None
+    }
+
+    val server = hosts.getServer(host) match {
+      case Some(ElasticServer(h, a)) => ElasticServer(h, a.orElse(requestAuth))
+      case None => ElasticServer(host, requestAuth)
     }
-    new CerebroRequest(cluster, body, request.user)
+    CerebroRequest(server, body, request.user)
   }
 
 }
-- 
GitLab