Skip to content

Commit

Permalink
GH-458 Move to Javalin 4.0.0-RC1 and bump related libraries
Browse files Browse the repository at this point in the history
  • Loading branch information
dzikoysk committed Aug 17, 2021
1 parent 78098e1 commit 687e51f
Show file tree
Hide file tree
Showing 12 changed files with 37 additions and 39 deletions.
10 changes: 4 additions & 6 deletions reposilite-backend/reposilite-backend.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ publishing {
repositories {
mavenCentral()
maven { url = uri("https://repo.panda-lang.org/releases") }
maven { url = uri("https://jitpack.io") }
maven { url = uri("https://s01.oss.sonatype.org/content/repositories/releases/") }
}

Expand All @@ -82,7 +81,7 @@ dependencies {
implementation("org.jetbrains.exposed:exposed-dao:$exposed")
implementation("org.jetbrains.exposed:exposed-jdbc:$exposed")
implementation("org.jetbrains.exposed:exposed-java-time:$exposed")
implementation("net.dzikoysk:exposed-upsert:1.0.0")
implementation("net.dzikoysk:exposed-upsert:1.0.1")
implementation("com.h2database:h2:1.4.199")

val fuel = "2.3.1"
Expand All @@ -94,13 +93,12 @@ dependencies {
implementation("io.javalin-rfc:javalin-openapi-plugin:$openapi")
implementation("io.javalin-rfc:javalin-swagger-plugin:$openapi")

val javalinRfcs = "1.0.6"
val javalinRfcs = "1.0.7"
implementation("com.reposilite.javalin-rfcs:javalin-context:$javalinRfcs")
implementation("com.reposilite.javalin-rfcs:javalin-reactive-routing:$javalinRfcs")

val javalin = "4.0.0.RC0"
//implementation("io.javalin:javalin:$javalin")
implementation("com.github.tipsy:javalin:master-SNAPSHOT")
val javalin = "4.0.0.RC1"
implementation("io.javalin:javalin:$javalin")

val picocli = "4.6.1"
kapt("info.picocli:picocli-codegen:$picocli")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ object ReposiliteWebConfiguration {
val webServer = WebConfiguration.createWebServer()
val failureFacade = FailureWebConfiguration.createFacade(logger)
val consoleFacade = ConsoleWebConfiguration.createFacade(logger, failureFacade)
val mavenFacade = MavenWebConfiguration.createFacade(logger, failureFacade, workingDirectory, HttpRemoteClient(), configuration.repositories)
val mavenFacade = MavenWebConfiguration.createFacade(logger, workingDirectory, HttpRemoteClient(), configuration.repositories)
val frontendFacade = FrontendWebConfiguration.createFacade()
val statisticFacade = StatisticsWebConfiguration.createFacade(logger)
val accessTokenFacade = AccessTokenWebConfiguration.createFacade(logger)
val authenticationFacade = AuthenticationWebConfiguration.createFacade(logger, accessTokenFacade, mavenFacade)
val authenticationFacade = AuthenticationWebConfiguration.createFacade(logger, accessTokenFacade)
val contextFactory = ReposiliteContextFactory(logger, configuration.forwardedIp, authenticationFacade)

return Reposilite(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@
package com.reposilite.auth

import com.reposilite.token.AccessTokenFacade
import com.reposilite.token.AccessTokenFacade.Companion.B_CRYPT_TOKENS_ENCODER
import com.reposilite.token.api.AccessToken
import com.reposilite.token.api.RoutePermission.READ
import panda.std.Result
import panda.std.Result.error
import panda.std.Result.ok
import panda.std.asSuccess
import panda.utilities.StringUtils
import java.nio.charset.StandardCharsets
import java.util.Base64
Expand Down Expand Up @@ -82,16 +83,18 @@ class Authenticator(private val accessTokenFacade: AccessTokenFacade) {
return error("Invalid authorization credentials")
}

val token = accessTokenFacade.getToken(values[0])
?: return error("Invalid authorization credentials")
return authByCredentials(values[0], values[1])
}

val authorized = AccessTokenFacade.B_CRYPT_TOKENS_ENCODER.matches(values[1], token.secret)
fun authByCredentials(alias: String, secret: String): Result<AccessToken, String> {
val accessToken = accessTokenFacade.getToken(alias) ?: return error("Invalid authorization credentials")
val authorized = B_CRYPT_TOKENS_ENCODER.matches(secret, accessToken.secret)

if (!authorized) {
return error("Invalid authorization credentials")
}

return ok(token)
return accessToken.asSuccess()
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,9 @@

package com.reposilite.auth

import com.reposilite.maven.MavenFacade
import com.reposilite.token.api.AccessToken

internal class SessionService(private val mavenFacade: MavenFacade) {
internal class SessionService {

fun createSession(path: String, method: SessionMethod, address: String, accessToken: AccessToken) =
Session(path, method, address, accessToken, emptyList())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,15 @@ import com.reposilite.auth.Authenticator
import com.reposilite.auth.SessionService
import com.reposilite.auth.infrastructure.AuthenticationEndpoint
import com.reposilite.auth.infrastructure.PostAuthHandler
import com.reposilite.maven.MavenFacade
import com.reposilite.token.AccessTokenFacade
import com.reposilite.web.ReposiliteRoutes
import net.dzikoysk.dynamiclogger.Journalist

internal object AuthenticationWebConfiguration {

fun createFacade(journalist: Journalist, accessTokenFacade: AccessTokenFacade, mavenFacade: MavenFacade): AuthenticationFacade {
fun createFacade(journalist: Journalist, accessTokenFacade: AccessTokenFacade): AuthenticationFacade {
val authenticator = Authenticator(accessTokenFacade)
val sessionService = SessionService(mavenFacade)
val sessionService = SessionService()

return AuthenticationFacade(journalist, authenticator, sessionService)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package com.reposilite.frontend.infrastructure
import com.reposilite.frontend.FrontendFacade
import com.reposilite.shared.FilesUtils.getExtension
import com.reposilite.web.ReposiliteRoutes
import com.reposilite.web.http.ContentType
import com.reposilite.web.http.ContentType.Companion.PLAIN
import com.reposilite.web.http.ErrorResponse
import com.reposilite.web.http.encoding
import io.javalin.http.ContentType
import io.javalin.http.ContentType.Companion.PLAIN
import io.javalin.http.Context
import io.javalin.http.HttpCode.NOT_FOUND
import panda.std.Result
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ import com.reposilite.shared.exists
import com.reposilite.shared.getExtension
import com.reposilite.shared.getSimpleName
import com.reposilite.shared.type
import com.reposilite.web.http.ContentType
import com.reposilite.web.http.ContentType.APPLICATION_OCTET_STREAM
import io.javalin.http.ContentType
import io.javalin.http.ContentType.APPLICATION_OCTET_STREAM
import com.reposilite.web.http.ErrorResponse
import panda.std.Result
import panda.std.asSuccess
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.reposilite.maven.application

import com.reposilite.config.Configuration.RepositoryConfiguration
import com.reposilite.failure.FailureFacade
import com.reposilite.maven.MavenFacade
import com.reposilite.maven.MetadataService
import com.reposilite.maven.ProxyService
Expand All @@ -32,7 +31,7 @@ import java.nio.file.Path

internal object MavenWebConfiguration {

fun createFacade(journalist: Journalist, failureFacade: FailureFacade, workingDirectory: Path, remoteClient: RemoteClient, repositories: Map<String, RepositoryConfiguration>): MavenFacade {
fun createFacade(journalist: Journalist, workingDirectory: Path, remoteClient: RemoteClient, repositories: Map<String, RepositoryConfiguration>): MavenFacade {
val repositoryFactory = RepositoryFactory(journalist, workingDirectory)

val repositoryService = repositories
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import com.github.kittinunf.fuel.coroutines.awaitByteArrayResponseResult
import com.reposilite.maven.api.DocumentInfo
import com.reposilite.maven.api.UNKNOWN_LENGTH
import com.reposilite.shared.FilesUtils.getExtension
import com.reposilite.web.http.ContentType
import io.javalin.http.ContentType
import com.reposilite.web.http.ErrorResponse
import com.reposilite.web.http.errorResponse
import io.javalin.http.HttpCode.BAD_REQUEST
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import com.reposilite.shared.getExtension
import com.reposilite.shared.getSimpleName
import com.reposilite.shared.safeResolve
import com.reposilite.storage.StorageProvider
import com.reposilite.web.http.ContentType
import com.reposilite.web.http.ContentType.APPLICATION_OCTET_STREAM
import com.reposilite.web.http.ContentType.Companion.OCTET_STREAM
import io.javalin.http.ContentType
import io.javalin.http.ContentType.APPLICATION_OCTET_STREAM
import io.javalin.http.ContentType.Companion.OCTET_STREAM
import com.reposilite.web.http.ErrorResponse
import com.reposilite.web.http.errorResponse
import io.javalin.http.HttpCode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
*/
package com.reposilite.token

import net.dzikoysk.dynamiclogger.Journalist
import net.dzikoysk.dynamiclogger.Logger
import com.reposilite.token.api.AccessToken
import com.reposilite.token.api.AccessTokenPermission
import com.reposilite.token.api.CreateAccessTokenResponse
import net.dzikoysk.dynamiclogger.Journalist
import net.dzikoysk.dynamiclogger.Logger
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import java.security.SecureRandom
import java.util.Base64
Expand All @@ -30,23 +30,22 @@ class AccessTokenFacade internal constructor(
) : Journalist {

companion object {
val SECURE_RANDOM = SecureRandom()
val B_CRYPT_TOKENS_ENCODER = BCryptPasswordEncoder()
}

fun createAccessToken(alias: String, permissions: Set<AccessTokenPermission> = emptySet()): CreateAccessTokenResponse {
val randomBytes = ByteArray(48)
SECURE_RANDOM.nextBytes(randomBytes)
return createAccessToken(alias, Base64.getEncoder().encodeToString(randomBytes), permissions)
private val SECRET_GENERATOR: () -> String = {
val secret = ByteArray(48)
SecureRandom().nextBytes(secret)
Base64.getEncoder().encodeToString(secret)
}
}

private fun createAccessToken(alias: String, token: String, permissions: Set<AccessTokenPermission>): CreateAccessTokenResponse {
val encodedToken = B_CRYPT_TOKENS_ENCODER.encode(token)
fun createAccessToken(alias: String, secret: String = SECRET_GENERATOR(), permissions: Set<AccessTokenPermission> = emptySet()): CreateAccessTokenResponse {
val encodedToken = B_CRYPT_TOKENS_ENCODER.encode(secret)

accessTokenRepository.saveAccessToken(AccessToken(alias = alias, secret = encodedToken, permissions = permissions))
val accessToken = accessTokenRepository.findAccessTokenByAlias(alias)

return CreateAccessTokenResponse(accessToken!!, token)
return CreateAccessTokenResponse(accessToken!!, secret)
}

fun updateToken(accessToken: AccessToken) =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ internal class JavalinWebServer : WebServer {
}
listener.serverStopped {
dispatcher.completeShutdown()
reposilite.coreThreadPool.stop()
reposilite.logger.info("Bye! Uptime: " + reposilite.getPrettyUptime())
}
}
Expand Down

0 comments on commit 687e51f

Please sign in to comment.