Skip to content

Commit ae65225

Browse files
Merge pull request #77 from fullfacing/feature/fileread-fix
File read fix for attemptBuild in PolicyBuilders.scala
2 parents e1f1548 + 200ceba commit ae65225

File tree

13 files changed

+45
-35
lines changed

13 files changed

+45
-35
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file.
33

44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
55

6+
## [1.2.0] - 2019-09-05
7+
### Added
8+
- ConfigWithoutAuth; a version of KeycloakConfig that does not contain admin authentication details.
9+
### Fixed
10+
- Fixed a flaw in attemptBuild in PolicyBuilders.scala that could potentially throw a FileNotFoundException in certain environments.
11+
### Changed
12+
- Core functionality in the Akka-HTTP auth module has been split into a separate module to allow code reuse by any client adapter.
13+
- Transformed KeycloakConfig into a trait, with ConfigWithAuth and ConfigWithoutAuth as subtypes.
14+
615
## [1.1.0] - 2019-08-27
716
### Added
817
- KeycloakConfig.Auth split into two subtypes, Secret and Password, to additionally support a password grant type.

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
[![Maven Central](https://img.shields.io/maven-central/v/com.fullfacing/keycloak4s-core_2.12.svg)](https://search.maven.org/search?q=a:keycloak4s-core_2.12)
55

66
**A Scala-based middleware API for
7-
[Keycloak](https://www.keycloak.org/)**
8-
*Based on version 6.0.1*
7+
[Keycloak](https://www.keycloak.org/)**<br/>
8+
*Supports version 7.0.0*
99

1010
keycloak4s is an opinionated Scala-built API that serves as a bridge between any Scala project and a Keycloak server. It allows access to the server's [Admin API](https://www.keycloak.org/docs-api/6.0/rest-api/index.html), and provides adapters that validates Keycloak's bearer tokens. It authorizes requests via a JSON config file inspired by their [policy enforcement configuration][Policy-Configuration].
1111

@@ -31,10 +31,10 @@ The project is split into the following modules, each as a separate dependency:
3131
## Installation
3232

3333
Each module can be pulled into a project separately using the following SBT dependencies:
34-
* keycloak4s-core: `"com.fullfacing" %% "keycloak4s-core" % "1.1.0"`
35-
* keycloak4s-admin: `"com.fullfacing" %% "keycloak4s-admin" % "1.1.0"`
36-
* keycloak4s-admin-monix: `"com.fullfacing" %% "keycloak4s-admin-monix" % "1.1.0"`
37-
* keycloak4s-auth-akka-http: `"com.fullfacing" %% "keycloak4s-auth-akka-http" % "1.1.0"`
34+
* keycloak4s-core: `"com.fullfacing" %% "keycloak4s-core" % "1.2.0"`
35+
* keycloak4s-admin: `"com.fullfacing" %% "keycloak4s-admin" % "1.2.0"`
36+
* keycloak4s-admin-monix: `"com.fullfacing" %% "keycloak4s-admin-monix" % "1.2.0"`
37+
* keycloak4s-auth-akka-http: `"com.fullfacing" %% "keycloak4s-auth-akka-http" % "1.2.0"`
3838

3939
The core module is a dependency for all other modules, and is automatically pulled in when using any other module.
4040

build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import xerial.sbt.Sonatype.GitHubHosting
44

55
lazy val global = {
66
Seq(
7-
version := "1.1.0",
7+
version := "1.2.0",
88
scalaVersion := "2.12.8",
99
organization := "com.fullfacing",
1010
scalacOptions ++= scalacOpts,

keycloak4s-admin-monix/src/main/scala/com/fullfacing/keycloak4s/admin/monix/client/KeycloakClient.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import monix.reactive.Observable
1212
import scala.collection.immutable.Seq
1313
import scala.reflect._
1414

15-
class KeycloakClient[T](config: KeycloakConfig)(implicit client: SttpBackend[Task, Observable[T]]) extends KeycloakClientA[Task, Observable[T]](config) {
15+
class KeycloakClient[T](config: ConfigWithAuth)(implicit client: SttpBackend[Task, Observable[T]]) extends KeycloakClientA[Task, Observable[T]](config) {
1616

1717
/**
1818
* Used for calls that return a sequence of items, this sequentially makes calls to retrieve and process

keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/KeycloakClient.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import scala.reflect._
1919
import scala.reflect.runtime.universe.{TypeTag, typeOf}
2020
import scala.util.control.NonFatal
2121

22-
class KeycloakClient[F[+_] : Concurrent, -S](config: KeycloakConfig)(implicit client: SttpBackend[F, S]) extends TokenManager[F, S](config) {
22+
class KeycloakClient[F[+_] : Concurrent, -S](config: ConfigWithAuth)(implicit client: SttpBackend[F, S]) extends TokenManager[F, S](config) {
2323

2424
val realm: String = config.realm
2525

keycloak4s-admin/src/main/scala/com/fullfacing/keycloak4s.admin/client/TokenManager.scala

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import com.fullfacing.keycloak4s.admin.client.TokenManager.{Token, TokenResponse
1111
import com.fullfacing.keycloak4s.admin.handles.Logging
1212
import com.fullfacing.keycloak4s.admin.handles.Logging.handleLogging
1313
import com.fullfacing.keycloak4s.core.serialization.JsonFormats.default
14-
import com.fullfacing.keycloak4s.core.models.{KeycloakConfig, KeycloakSttpException, RequestInfo}
14+
import com.fullfacing.keycloak4s.core.models.{KeycloakConfig, ConfigWithAuth, KeycloakSttpException, RequestInfo}
1515
import com.softwaremill.sttp.json4s.asJson
1616
import com.softwaremill.sttp.{SttpBackend, _}
1717
import org.json4s.jackson.Serialization
1818

19-
abstract class TokenManager[F[_] : Concurrent, -S](config: KeycloakConfig)(implicit client: SttpBackend[F, S]) {
19+
abstract class TokenManager[F[_] : Concurrent, -S](config: ConfigWithAuth)(implicit client: SttpBackend[F, S]) {
2020

2121
protected implicit val serialization: Serialization.type = org.json4s.jackson.Serialization
2222

@@ -52,12 +52,12 @@ abstract class TokenManager[F[_] : Concurrent, -S](config: KeycloakConfig)(impli
5252
uri"${config.scheme}://${config.host}:${config.port}/auth/realms/${config.authn.realm}/protocol/openid-connect/token"
5353

5454
private val password = config.authn match {
55-
case KeycloakConfig.Password(_, clientId, username, password) =>
55+
case KeycloakConfig.Password(_, clientId, username, pass) =>
5656
Map(
5757
"grant_type" -> "password",
5858
"client_id" -> clientId,
5959
"username" -> username,
60-
"password" -> password
60+
"password" -> pass
6161
)
6262
case KeycloakConfig.Secret(_, clientId, clientSecret) =>
6363
Map(

keycloak4s-auth/core/src/main/scala/com/fullfacing/keycloak4s/auth/core/PolicyBuilders.scala

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,7 @@ object PolicyBuilders {
1212
* Throws an Exception in case of failure.
1313
*/
1414
private def attemptBuild(filename: String): BufferedSource = {
15-
val url = getClass.getResource(s"/$filename")
16-
17-
if (url == null) {
18-
throw Exceptions.CONFIG_NOT_FOUND(filename)
19-
} else try {
20-
Source.fromFile(url.getPath)
21-
} catch {
22-
case th: Throwable => Logging.configSetupError(); throw th
23-
}
15+
Source.fromResource(filename)
2416
}
2517

2618
/**

keycloak4s-core/src/main/scala/com/fullfacing/keycloak4s/core/models/KeycloakConfig.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
package com.fullfacing.keycloak4s.core.models
22

3-
final case class KeycloakConfig(scheme: String,
3+
sealed trait KeycloakConfig {
4+
val scheme: String
5+
val host: String
6+
val port: Int
7+
val realm: String
8+
}
9+
10+
final case class ConfigWithAuth(scheme: String,
411
host: String,
512
port: Int,
613
realm: String,
7-
authn: KeycloakConfig.Auth)
14+
authn: KeycloakConfig.Auth) extends KeycloakConfig
815

16+
final case class ConfigWithoutAuth(scheme: String,
17+
host: String,
18+
port: Int,
19+
realm: String) extends KeycloakConfig
920

1021
object KeycloakConfig {
1122

keycloak4s-playground/src/main/scala/com/fullfacing/transport/Main.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import cats.effect.ExitCode
66
import com.fullfacing.backend.AkkaMonixHttpBackend
77
import com.fullfacing.keycloak4s.admin.client.{Keycloak, KeycloakClient}
88
import com.fullfacing.keycloak4s.admin.monix.client.{Keycloak => KeycloakM, KeycloakClient => KeycloakClientM}
9-
import com.fullfacing.keycloak4s.core.models.KeycloakConfig
9+
import com.fullfacing.keycloak4s.core.models.{ConfigWithAuth, KeycloakConfig}
1010
import com.fullfacing.keycloak4s.core.serialization.JsonFormats.default
1111
import com.fullfacing.transport.backends.AkkaHttpBackendL
1212
import com.fullfacing.transport.handles.Akka
@@ -31,7 +31,7 @@ object Main extends TaskApp {
3131
val adminSecret: String = "???" //Secret of adminClient.
3232

3333
val authConfig = KeycloakConfig.Secret(adminRealm, adminClient, adminSecret)
34-
val config = KeycloakConfig("http", host, port, targetRealm, authConfig)
34+
val config = ConfigWithAuth("http", host, port, targetRealm, authConfig)
3535

3636
def run(args: List[String]): Task[ExitCode] = Akka.connect().flatMap { _ =>
3737

keycloak4s-playground/src/test/scala/ValidationTests.scala

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import cats.data.Validated.{invalidNel, valid}
66
import cats.implicits._
77
import com.fullfacing.keycloak4s.auth.core.validation.{ClaimValidators, TokenValidator}
88
import com.fullfacing.keycloak4s.core.Exceptions
9-
import com.fullfacing.keycloak4s.core.models.KeycloakConfig
9+
import com.fullfacing.keycloak4s.core.models.ConfigWithoutAuth
1010
import com.nimbusds.jose.JWSSigner
1111
import com.nimbusds.jose.crypto.RSASSASigner
1212
import com.nimbusds.jose.jwk.RSAKey
@@ -21,8 +21,7 @@ class ValidationTests extends FlatSpec with Matchers with PrivateMethodTester wi
2121
val port = 8080
2222
val realm = "test"
2323

24-
val authConfig = KeycloakConfig.Secret("", "", "")
25-
val config = KeycloakConfig(scheme, host, port, realm, authConfig)
24+
val config = ConfigWithoutAuth(scheme, host, port, realm)
2625

2726
val validator: TokenValidator = TokenValidator.Static(TestData.jwkSet, config)
2827
val validatorUri = s"$scheme://$host:$port/auth/realms/$realm"

0 commit comments

Comments
 (0)