Skip to content

Commit

Permalink
fix #1985
Browse files Browse the repository at this point in the history
  • Loading branch information
mathieuancelin committed Sep 20, 2024
1 parent dd1f1be commit 369ca7a
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 25 deletions.
3 changes: 2 additions & 1 deletion otoroshi/app/auth/basic.scala
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,8 @@ case class BasicAuthModule(authConfig: BasicAuthModuleConfig) extends AuthModule
Option(base64)
.map(decodeBase64)
.map(_.split(":").toSeq)
.flatMap(a => a.headOption.flatMap(head => a.lastOption.map(last => (head, last))))
.filter(v => v.nonEmpty && v.length > 1)
.flatMap(a => a.headOption.map(head => (head, a.tail.mkString(":"))))

}

Expand Down
3 changes: 2 additions & 1 deletion otoroshi/app/auth/ldap.scala
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,8 @@ case class LdapAuthModule(authConfig: LdapAuthModuleConfig) extends AuthModule {
Option(base64)
.map(decodeBase64)
.map(_.split(":").toSeq)
.flatMap(a => a.headOption.flatMap(head => a.lastOption.map(last => (head, last))))
.filter(v => v.nonEmpty && v.length > 1)
.flatMap(a => a.headOption.map(head => (head, a.tail.mkString(":"))))
}

def bindUser(username: String, password: String, descriptor: ServiceDescriptor)(implicit
Expand Down
15 changes: 10 additions & 5 deletions otoroshi/app/models/apikey.scala
Original file line number Diff line number Diff line change
Expand Up @@ -981,8 +981,9 @@ object ApiKeyHelper {
} getOrElse FastFuture.successful(None)
} else if (authBasic.isDefined && descriptor.apiKeyConstraints.basicAuth.enabled) {
val auth = authBasic.get
val id = auth.split(":").headOption.map(_.trim)
val secret = auth.split(":").lastOption.map(_.trim)
val parts = auth.split(":")
val id = parts.headOption.map(_.trim)
val secret = if (parts.length > 1) parts.tail.mkString(":").trim.some else None
(id, secret) match {
case (Some(apiKeyClientId), Some(apiKeySecret)) => {
env.datastores.apiKeyDataStore
Expand Down Expand Up @@ -1574,8 +1575,9 @@ object ApiKeyHelper {
} getOrElse errorResult(Unauthorized, s"Invalid ApiKey provided", "errors.invalid.api.key")
} else if (authBasic.isDefined && descriptor.apiKeyConstraints.basicAuth.enabled) {
val auth = authBasic.get
val id = auth.split(":").headOption.map(_.trim)
val secret = auth.split(":").lastOption.map(_.trim)
val parts = auth.split(":")
val id = parts.headOption.map(_.trim)
val secret = if (parts.length > 1) parts.tail.mkString(":").trim.some else None
(id, secret) match {
case (Some(apiKeyClientId), Some(apiKeySecret)) => {
env.datastores.apiKeyDataStore
Expand Down Expand Up @@ -1739,7 +1741,10 @@ object ApiKeyHelper {
)
)
.map(_.split(":"))
.filter(_.size == 2)
.collect {
case arr if arr.length == 2 => arr
case arr if arr.length > 2 => Array(arr.head, arr.tail.mkString(":"))
}
.map(parts => ApikeyTuple(parts.head, parts.lastOption, location = location.some, otoBearer = None))
val authByCustomHeaders: Option[ApikeyTuple] = req.headers
.get(
Expand Down
3 changes: 2 additions & 1 deletion otoroshi/app/next/plugins/apikey.scala
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,8 @@ class ApikeyAuthModule extends NgPreRouting {
Option(base64)
.map(decodeBase64)
.map(_.split(":").toSeq)
.flatMap(a => a.headOption.flatMap(head => a.lastOption.map(last => (head, last))))
.filter(v => v.nonEmpty && v.length > 1)
.flatMap(a => a.headOption.map(head => (head, a.tail.mkString(":"))))
}

def unauthorized(config: ApikeyAuthModuleConfig) = {
Expand Down
12 changes: 6 additions & 6 deletions otoroshi/app/next/plugins/clientcredentials.scala
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class NgClientCredentials extends NgRequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand All @@ -151,7 +151,7 @@ class NgClientCredentials extends NgRequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand Down Expand Up @@ -433,7 +433,7 @@ class NgClientCredentials extends NgRequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => (v.head, v.last))
.map(v => (v.head, v.tail.mkString(":")))
.map { case (clientId, clientSecret) =>
handleTokenRequest(
ClientCredentialFlowBody(
Expand Down Expand Up @@ -544,7 +544,7 @@ class NgClientCredentialTokenEndpoint extends NgBackendCall {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand All @@ -562,7 +562,7 @@ class NgClientCredentialTokenEndpoint extends NgBackendCall {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand Down Expand Up @@ -692,7 +692,7 @@ class NgClientCredentialTokenEndpoint extends NgBackendCall {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => (v.head, v.last))
.map(v => (v.head, v.tail.mkString(":")))
.map { case (clientId, clientSecret) =>
handleTokenRequest(
NgClientCredentialTokenEndpointBody(
Expand Down
17 changes: 9 additions & 8 deletions otoroshi/app/plugins/apikeys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ class ClientCredentialFlow extends RequestTransformer {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand All @@ -438,7 +438,7 @@ class ClientCredentialFlow extends RequestTransformer {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand Down Expand Up @@ -772,7 +772,7 @@ class ClientCredentialFlow extends RequestTransformer {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => (v.head, v.last))
.map(v => (v.head, v.tail.mkString(":")))
.map { case (clientId, clientSecret) =>
handleTokenRequest(
ClientCredentialFlowBody(
Expand Down Expand Up @@ -814,7 +814,7 @@ class ClientCredentialFlow extends RequestTransformer {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => (v.head, v.last))
.map(v => (v.head, v.tail.mkString(":")))
.map { case (clientId, clientSecret) =>
handleTokenRequest(
ClientCredentialFlowBody(
Expand Down Expand Up @@ -1038,7 +1038,7 @@ class ClientCredentialService extends RequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand All @@ -1056,7 +1056,7 @@ class ClientCredentialService extends RequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => Map("client_id" -> v.head, "client_secret" -> v.last))
.map(v => Map("client_id" -> v.head, "client_secret" -> v.tail.mkString(":")))
.getOrElse(Map.empty[String, String])
f(map)
}
Expand Down Expand Up @@ -1344,7 +1344,7 @@ class ClientCredentialService extends RequestSink {
.map(v => new String(v))
.filter(_.contains(":"))
.map(_.split(":").toSeq)
.map(v => (v.head, v.last))
.map(v => (v.head, v.tail.mkString(":")))
.map { case (clientId, clientSecret) =>
handleTokenRequest(
ClientCredentialFlowBody(
Expand Down Expand Up @@ -1430,7 +1430,8 @@ class ApikeyAuthModule extends PreRouting {
Option(base64)
.map(decodeBase64)
.map(_.split(":").toSeq)
.flatMap(a => a.headOption.flatMap(head => a.lastOption.map(last => (head, last))))
.filter(v => v.nonEmpty && v.length > 1)
.flatMap(a => a.headOption.map(head => (head, a.tail.mkString(":"))))
}

def unauthorized(ctx: PreRoutingContext): Future[Unit] = {
Expand Down
3 changes: 2 additions & 1 deletion otoroshi/app/plugins/body.scala
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,8 @@ class BodyLogger extends RequestTransformer {
Option(base64)
.map(decodeBase64)
.map(_.split(":").toSeq)
.flatMap(a => a.headOption.flatMap(head => a.lastOption.map(last => (head, last))))
.filter(v => v.nonEmpty && v.length > 1)
.flatMap(a => a.headOption.map(head => (head, a.tail.mkString(":"))))
}

private def set(key: String, value: ByteString, ttl: Option[Long])(implicit
Expand Down
5 changes: 3 additions & 2 deletions otoroshi/app/plugins/core/apikeys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,9 @@ class BasicAuthApikeyExtractor extends PreRouting {
)
if (authBasic.isDefined && descriptor.apiKeyConstraints.basicAuth.enabled) {
val auth = authBasic.get
val id = auth.split(":").headOption.map(_.trim)
val secret = auth.split(":").lastOption.map(_.trim)
val parts = auth.split(":")
val id = parts.headOption.map(_.trim)
val secret = if (parts.length > 1) parts.tail.mkString(":").trim.some else None
(id, secret) match {
case (Some(apiKeyClientId), Some(apiKeySecret)) => {
env.datastores.apiKeyDataStore
Expand Down

0 comments on commit 369ca7a

Please sign in to comment.