style: スタイルを修正

This commit is contained in:
usbharu 2023-05-02 16:21:12 +09:00
parent 95e47a0e9b
commit 2f1df0bcfd
24 changed files with 50 additions and 47 deletions

View File

@ -38,7 +38,7 @@ val Application.property: Application.(propertyName: String) -> String
} }
// application.conf references the main function. This annotation prevents the IDE from marking it as unused. // application.conf references the main function. This annotation prevents the IDE from marking it as unused.
@Suppress("unused") @Suppress("unused", "LongMethod")
fun Application.parent() { fun Application.parent() {
Config.configData = ConfigData( Config.configData = ConfigData(
url = property("hideout.url"), url = property("hideout.url"),
@ -86,9 +86,9 @@ fun Application.parent() {
single<IdGenerateService> { TwitterSnowflakeIdGenerateService } single<IdGenerateService> { TwitterSnowflakeIdGenerateService }
single<IMetaRepository> { MetaRepositoryImpl(get()) } single<IMetaRepository> { MetaRepositoryImpl(get()) }
single<IServerInitialiseService> { ServerInitialiseServiceImpl(get()) } single<IServerInitialiseService> { ServerInitialiseServiceImpl(get()) }
single<IJwtRefreshTokenRepository> { JwtRefreshTokenRepositoryImpl(get(),get()) } single<IJwtRefreshTokenRepository> { JwtRefreshTokenRepositoryImpl(get(), get()) }
single<IMetaService> { MetaServiceImpl(get()) } single<IMetaService> { MetaServiceImpl(get()) }
single<IJwtService> { JwtServiceImpl(get(),get(),get()) } single<IJwtService> { JwtServiceImpl(get(), get(), get()) }
} }
configureKoin(module) configureKoin(module)
runBlocking { runBlocking {

View File

@ -1,3 +1,3 @@
package dev.usbharu.hideout.domain.model.hideout.dto package dev.usbharu.hideout.domain.model.hideout.dto
data class JwtToken(val token:String,val refreshToken:String) data class JwtToken(val token: String, val refreshToken: String)

View File

@ -1,3 +1,3 @@
package dev.usbharu.hideout.domain.model.hideout.entity package dev.usbharu.hideout.domain.model.hideout.entity
data class Meta(val version:String,val jwt:Jwt) data class Meta(val version: String, val jwt: Jwt)

View File

@ -1,3 +1,3 @@
package dev.usbharu.hideout.domain.model.hideout.form package dev.usbharu.hideout.domain.model.hideout.form
data class RefreshToken(val refreshToken:String) data class RefreshToken(val refreshToken: String)

View File

@ -1,6 +1,6 @@
package dev.usbharu.hideout.exception package dev.usbharu.hideout.exception
class InvalidRefreshTokenException : IllegalArgumentException{ class InvalidRefreshTokenException : IllegalArgumentException {
constructor() : super() constructor() : super()
constructor(s: String?) : super(s) constructor(s: String?) : super(s)
constructor(message: String?, cause: Throwable?) : super(message, cause) constructor(message: String?, cause: Throwable?) : super(message, cause)

View File

@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit
const val TOKEN_AUTH = "jwt-auth" const val TOKEN_AUTH = "jwt-auth"
@Suppress("MagicNumber")
fun Application.configureSecurity( fun Application.configureSecurity(
userAuthService: IUserAuthService, userAuthService: IUserAuthService,
metaService: IMetaService, metaService: IMetaService,
@ -39,7 +40,6 @@ fun Application.configureSecurity(
jwt(TOKEN_AUTH) { jwt(TOKEN_AUTH) {
verifier(jwkProvider, issuer) { verifier(jwkProvider, issuer) {
acceptLeeway(3) acceptLeeway(3)
} }
validate { jwtCredential -> validate { jwtCredential ->
if (jwtCredential.payload.getClaim("username").asString().isNotEmpty()) { if (jwtCredential.payload.getClaim("username").asString().isNotEmpty()) {

View File

@ -3,18 +3,18 @@ package dev.usbharu.hideout.repository
import dev.usbharu.hideout.domain.model.hideout.entity.JwtRefreshToken import dev.usbharu.hideout.domain.model.hideout.entity.JwtRefreshToken
interface IJwtRefreshTokenRepository { interface IJwtRefreshTokenRepository {
suspend fun generateId():Long suspend fun generateId(): Long
suspend fun save(token: JwtRefreshToken) suspend fun save(token: JwtRefreshToken)
suspend fun findById(id:Long):JwtRefreshToken? suspend fun findById(id: Long): JwtRefreshToken?
suspend fun findByToken(token:String):JwtRefreshToken? suspend fun findByToken(token: String): JwtRefreshToken?
suspend fun findByUserId(userId:Long):JwtRefreshToken? suspend fun findByUserId(userId: Long): JwtRefreshToken?
suspend fun delete(token:JwtRefreshToken) suspend fun delete(token: JwtRefreshToken)
suspend fun deleteById(id:Long) suspend fun deleteById(id: Long)
suspend fun deleteByToken(token:String) suspend fun deleteByToken(token: String)
suspend fun deleteByUserId(userId:Long) suspend fun deleteByUserId(userId: Long)
suspend fun deleteAll() suspend fun deleteAll()
} }

View File

@ -6,5 +6,5 @@ interface IMetaRepository {
suspend fun save(meta: Meta) suspend fun save(meta: Meta)
suspend fun get():Meta? suspend fun get(): Meta?
} }

View File

@ -22,6 +22,7 @@ class JwtRefreshTokenRepositoryImpl(
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = suspend fun <T> query(block: suspend () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() } newSuspendedTransaction(Dispatchers.IO) { block() }

View File

@ -16,6 +16,7 @@ class MetaRepositoryImpl(private val database: Database) : IMetaRepository {
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = suspend fun <T> query(block: suspend () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() } newSuspendedTransaction(Dispatchers.IO) { block() }
@ -29,7 +30,7 @@ class MetaRepositoryImpl(private val database: Database) : IMetaRepository {
it[this.jwtPrivateKey] = meta.jwt.privateKey it[this.jwtPrivateKey] = meta.jwt.privateKey
it[this.jwtPublicKey] = meta.jwt.publicKey it[this.jwtPublicKey] = meta.jwt.publicKey
} }
}else { } else {
Meta.update({ Meta.id eq 1 }) { Meta.update({ Meta.id eq 1 }) {
it[this.version] = meta.version it[this.version] = meta.version
it[kid] = UUID.randomUUID().toString() it[kid] = UUID.randomUUID().toString()

View File

@ -20,6 +20,7 @@ class PostRepositoryImpl(database: Database, private val idGenerateService: IdGe
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = suspend fun <T> query(block: suspend () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() } newSuspendedTransaction(Dispatchers.IO) { block() }

View File

@ -21,6 +21,7 @@ class UserRepository(private val database: Database, private val idGenerateServi
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = suspend fun <T> query(block: suspend () -> T): T =
newSuspendedTransaction(Dispatchers.IO) { block() } newSuspendedTransaction(Dispatchers.IO) { block() }

View File

@ -7,10 +7,9 @@ import io.ktor.server.auth.jwt.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
fun Routing.authTestRouting() {
fun Routing.authTestRouting(){ authenticate(TOKEN_AUTH) {
authenticate(TOKEN_AUTH){ get("/auth-check") {
get("/auth-check"){
val principal = call.principal<JWTPrincipal>() val principal = call.principal<JWTPrincipal>()
val username = principal!!.payload.getClaim("username") val username = principal!!.payload.getClaim("username")
call.respondText("Hello $username") call.respondText("Hello $username")

View File

@ -3,6 +3,5 @@ package dev.usbharu.hideout.routing
import dev.usbharu.hideout.service.IUserAuthService import dev.usbharu.hideout.service.IUserAuthService
import io.ktor.server.routing.* import io.ktor.server.routing.*
fun Routing.login(userAuthService: IUserAuthService){ fun Routing.login(userAuthService: IUserAuthService) {
} }

View File

@ -5,10 +5,10 @@ import dev.usbharu.hideout.domain.model.hideout.entity.User
import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
interface IJwtService { interface IJwtService {
suspend fun createToken(user:User):JwtToken suspend fun createToken(user: User): JwtToken
suspend fun refreshToken(refreshToken: RefreshToken):JwtToken suspend fun refreshToken(refreshToken: RefreshToken): JwtToken
suspend fun revokeToken(refreshToken: RefreshToken) suspend fun revokeToken(refreshToken: RefreshToken)
suspend fun revokeToken(user:User) suspend fun revokeToken(user: User)
suspend fun revokeAll() suspend fun revokeAll()
} }

View File

@ -18,6 +18,7 @@ import java.time.Instant
import java.time.temporal.ChronoUnit import java.time.temporal.ChronoUnit
import java.util.* import java.util.*
@Suppress("InjectDispatcher")
class JwtServiceImpl( class JwtServiceImpl(
private val metaService: IMetaService, private val metaService: IMetaService,
private val refreshTokenRepository: IJwtRefreshTokenRepository, private val refreshTokenRepository: IJwtRefreshTokenRepository,
@ -42,6 +43,7 @@ class JwtServiceImpl(
} }
} }
@Suppress("MagicNumber")
override suspend fun createToken(user: User): JwtToken { override suspend fun createToken(user: User): JwtToken {
val now = Instant.now() val now = Instant.now()
val token = JWT.create() val token = JWT.create()

View File

@ -4,16 +4,16 @@ import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
import dev.usbharu.hideout.domain.model.hideout.entity.Meta import dev.usbharu.hideout.domain.model.hideout.entity.Meta
import dev.usbharu.hideout.repository.IMetaRepository import dev.usbharu.hideout.repository.IMetaRepository
import dev.usbharu.hideout.util.ServerUtil import dev.usbharu.hideout.util.ServerUtil
import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.security.KeyPairGenerator import java.security.KeyPairGenerator
import java.util.* import java.util.*
class ServerInitialiseServiceImpl(private val metaRepository: IMetaRepository) : IServerInitialiseService { class ServerInitialiseServiceImpl(private val metaRepository: IMetaRepository) : IServerInitialiseService {
val logger = LoggerFactory.getLogger(ServerInitialiseServiceImpl::class.java) val logger: Logger = LoggerFactory.getLogger(ServerInitialiseServiceImpl::class.java)
override suspend fun init() { override suspend fun init() {
val savedMeta = metaRepository.get() val savedMeta = metaRepository.get()
val implementationVersion = ServerUtil.getImplementationVersion() val implementationVersion = ServerUtil.getImplementationVersion()
if (wasInitialised(savedMeta).not()) { if (wasInitialised(savedMeta).not()) {
@ -27,7 +27,6 @@ class ServerInitialiseServiceImpl(private val metaRepository: IMetaRepository) :
logger.info("Version changed!! (${savedMeta.version} -> $implementationVersion)") logger.info("Version changed!! (${savedMeta.version} -> $implementationVersion)")
updateVersion(savedMeta, implementationVersion) updateVersion(savedMeta, implementationVersion)
} }
} }
private fun wasInitialised(meta: Meta?): Boolean { private fun wasInitialised(meta: Meta?): Boolean {

View File

@ -77,7 +77,7 @@ class ActivityPubUserServiceImpl(
publicKeyPem = userEntity.publicKey publicKeyPem = userEntity.publicKey
) )
) )
} catch (e: UserNotFoundException) { } catch (ignore: UserNotFoundException) {
val httpResponse = if (targetActor != null) { val httpResponse = if (targetActor != null) {
httpClient.getAp(url, "$targetActor#pubkey") httpClient.getAp(url, "$targetActor#pubkey")
} else { } else {

View File

@ -6,5 +6,4 @@ object Base64Util {
fun decode(str: String): ByteArray = Base64.getDecoder().decode(str) fun decode(str: String): ByteArray = Base64.getDecoder().decode(str)
fun encode(bytes: ByteArray): String = Base64.getEncoder().encodeToString(bytes) fun encode(bytes: ByteArray): String = Base64.getEncoder().encodeToString(bytes)
} }

View File

@ -8,29 +8,27 @@ import java.util.*
object JsonWebKeyUtil { object JsonWebKeyUtil {
fun publicKeyToJwk(publicKey: String,kid:String): String { fun publicKeyToJwk(publicKey: String, kid: String): String {
val x509EncodedKeySpec = X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)) val x509EncodedKeySpec = X509EncodedKeySpec(Base64.getDecoder().decode(publicKey))
val generatePublic = KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec) val generatePublic = KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec)
return publicKeyToJwk(generatePublic as RSAPublicKey,kid) return publicKeyToJwk(generatePublic as RSAPublicKey, kid)
} }
fun publicKeyToJwk(publicKey: RSAPublicKey,kid:String): String { fun publicKeyToJwk(publicKey: RSAPublicKey, kid: String): String {
val e = encodeBase64UInt(publicKey.publicExponent) val e = encodeBase64UInt(publicKey.publicExponent)
val n = encodeBase64UInt(publicKey.modulus) val n = encodeBase64UInt(publicKey.modulus)
return """{"keys":[{"e":"$e","n":"$n","use":"sig","kid":"$kid","kty":"RSA"}]}""" return """{"keys":[{"e":"$e","n":"$n","use":"sig","kid":"$kid","kty":"RSA"}]}"""
} }
private fun encodeBase64UInt(bigInteger: BigInteger, minLength: Int = -1): String { private fun encodeBase64UInt(bigInteger: BigInteger, minLength: Int = -1): String {
if(bigInteger.signum() < 0){ require(bigInteger.signum() >= 0) { "Cannot encode negative numbers" }
throw IllegalArgumentException("Cannot encode negative numbers")
}
var bytes = bigInteger.toByteArray() var bytes = bigInteger.toByteArray()
if (bigInteger.bitLength() % 8 == 0 && (bytes[0] == 0.toByte()) && bytes.size > 1){ if (bigInteger.bitLength() % 8 == 0 && (bytes[0] == 0.toByte()) && bytes.size > 1) {
bytes = Arrays.copyOfRange(bytes, 1, bytes.size) bytes = Arrays.copyOfRange(bytes, 1, bytes.size)
} }
if (minLength != -1){ if (minLength != -1) {
if (bytes.size < minLength){ if (bytes.size < minLength) {
val array = ByteArray(minLength) val array = ByteArray(minLength)
System.arraycopy(bytes, 0, array, minLength - bytes.size, bytes.size) System.arraycopy(bytes, 0, array, minLength - bytes.size, bytes.size)
bytes = array bytes = array

View File

@ -7,17 +7,17 @@ import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.X509EncodedKeySpec import java.security.spec.X509EncodedKeySpec
object RsaUtil { object RsaUtil {
fun decodeRsaPublicKey(byteArray: ByteArray):RSAPublicKey{ fun decodeRsaPublicKey(byteArray: ByteArray): RSAPublicKey {
val x509EncodedKeySpec = X509EncodedKeySpec(byteArray) val x509EncodedKeySpec = X509EncodedKeySpec(byteArray)
return KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec) as RSAPublicKey return KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec) as RSAPublicKey
} }
fun decodeRsaPublicKey(encoded: String): RSAPublicKey = decodeRsaPublicKey(Base64Util.decode(encoded)) fun decodeRsaPublicKey(encoded: String): RSAPublicKey = decodeRsaPublicKey(Base64Util.decode(encoded))
fun decodeRsaPrivateKey(byteArray: ByteArray):RSAPrivateKey{ fun decodeRsaPrivateKey(byteArray: ByteArray): RSAPrivateKey {
val pkcS8EncodedKeySpec = PKCS8EncodedKeySpec(byteArray) val pkcS8EncodedKeySpec = PKCS8EncodedKeySpec(byteArray)
return KeyFactory.getInstance("RSA").generatePrivate(pkcS8EncodedKeySpec) as RSAPrivateKey return KeyFactory.getInstance("RSA").generatePrivate(pkcS8EncodedKeySpec) as RSAPrivateKey
} }
fun decodeRsaPrivateKey(encoded: String):RSAPrivateKey = decodeRsaPrivateKey(Base64Util.decode(encoded)) fun decodeRsaPrivateKey(encoded: String): RSAPrivateKey = decodeRsaPrivateKey(Base64Util.decode(encoded))
} }

View File

@ -1,5 +1,6 @@
package dev.usbharu.hideout.util package dev.usbharu.hideout.util
object ServerUtil { object ServerUtil {
fun getImplementationVersion():String = ServerUtil.javaClass.`package`.implementationVersion ?: "DEVELOPMENT-VERSION" fun getImplementationVersion(): String =
ServerUtil.javaClass.`package`.implementationVersion ?: "DEVELOPMENT-VERSION"
} }

View File

@ -54,6 +54,7 @@ class ExposedJobRepository(
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = newSuspendedTransaction(Dispatchers.IO) { block() } suspend fun <T> query(block: suspend () -> T): T = newSuspendedTransaction(Dispatchers.IO) { block() }
override suspend fun completeProgress(id: String): Boolean { override suspend fun completeProgress(id: String): Boolean {
@ -204,7 +205,7 @@ class ExposedJobRepository(
this ?: return emptyMap() this ?: return emptyMap()
return json.parseToJsonElement(this).jsonObject.mapValues { (_, el) -> return json.parseToJsonElement(this).jsonObject.mapValues { (_, el) ->
if (el is JsonObject) { if (el is JsonObject) {
val t = el["t"]?.jsonPrimitive?.content ?: error("Cannot get jsonPrimitive") val t = el["t"]?.run { jsonPrimitive.content } ?: error("Cannot get jsonPrimitive")
val value = el["v"]?.jsonArray ?: error("Cannot get jsonArray") val value = el["v"]?.jsonArray ?: error("Cannot get jsonArray")
when (t) { when (t) {
"s" -> value.map { it.jsonPrimitive.content } "s" -> value.map { it.jsonPrimitive.content }

View File

@ -33,6 +33,7 @@ class ExposedLockRepository(
} }
} }
@Suppress("InjectDispatcher")
suspend fun <T> query(block: suspend () -> T): T = newSuspendedTransaction(Dispatchers.IO) { block() } suspend fun <T> query(block: suspend () -> T): T = newSuspendedTransaction(Dispatchers.IO) { block() }
override suspend fun exists(id: UUID): Boolean { override suspend fun exists(id: UUID): Boolean {