mirror of
https://github.com/corda/corda.git
synced 2025-01-28 23:24:29 +00:00
addressed PR issues, added withFinalizable to remove try->finally boiler plate code
This commit is contained in:
parent
549a952cc0
commit
ce41d6a7a9
@ -31,7 +31,6 @@ import kotlin.system.exitProcess
|
|||||||
* The Intermediate CA certificate,Intermediate CA private key and Root CA Certificate should use alias name specified in [X509Utilities]
|
* The Intermediate CA certificate,Intermediate CA private key and Root CA Certificate should use alias name specified in [X509Utilities]
|
||||||
*/
|
*/
|
||||||
class CertificateSigningServer(val webServerAddr: HostAndPort, val certSigningService: CertificateSigningService) : Closeable {
|
class CertificateSigningServer(val webServerAddr: HostAndPort, val certSigningService: CertificateSigningService) : Closeable {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val log = loggerFor<CertificateSigningServer>()
|
val log = loggerFor<CertificateSigningServer>()
|
||||||
fun Server.hostAndPort(): HostAndPort {
|
fun Server.hostAndPort(): HostAndPort {
|
||||||
|
@ -29,7 +29,7 @@ interface CertificationRequestStorage {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve list of request IDs waiting for approval.
|
* Retrieve list of request IDs waiting for approval.
|
||||||
* TODO : This is use for the background thread to approve request automatically without KYC checks, should be removed after testnet.
|
* TODO : This is used for the background thread to approve request automatically without KYC checks, should be removed after testnet.
|
||||||
*/
|
*/
|
||||||
fun pendingRequestIds(): List<String>
|
fun pendingRequestIds(): List<String>
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,12 @@
|
|||||||
package com.r3corda.netpermission.internal.persistence
|
package com.r3corda.netpermission.internal.persistence
|
||||||
|
|
||||||
import com.r3corda.core.crypto.SecureHash
|
import com.r3corda.core.crypto.SecureHash
|
||||||
import com.r3corda.node.utilities.databaseTransaction
|
import com.r3corda.node.utilities.*
|
||||||
import com.r3corda.node.utilities.deserializeFromBlob
|
|
||||||
import com.r3corda.node.utilities.localDateTime
|
|
||||||
import com.r3corda.node.utilities.serializeToBlob
|
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import java.security.cert.Certificate
|
import java.security.cert.Certificate
|
||||||
import java.time.LocalDateTime
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
class DBCertificateRequestStorage(private val database: Database) : CertificationRequestStorage {
|
class DBCertificateRequestStorage(private val database: Database) : CertificationRequestStorage {
|
||||||
|
|
||||||
private object DataTable : Table("certificate_signing_request") {
|
private object DataTable : Table("certificate_signing_request") {
|
||||||
val requestId = varchar("request_id", 64).index().primaryKey()
|
val requestId = varchar("request_id", 64).index().primaryKey()
|
||||||
val hostName = varchar("hostName", 100)
|
val hostName = varchar("hostName", 100)
|
||||||
@ -35,8 +31,7 @@ class DBCertificateRequestStorage(private val database: Database) : Certificatio
|
|||||||
|
|
||||||
override fun saveCertificate(requestId: String, certificateGenerator: (CertificationData) -> Certificate) {
|
override fun saveCertificate(requestId: String, certificateGenerator: (CertificationData) -> Certificate) {
|
||||||
databaseTransaction(database) {
|
databaseTransaction(database) {
|
||||||
val finalizables = mutableListOf<() -> Unit>()
|
withFinalizables { finalizables ->
|
||||||
try {
|
|
||||||
getRequest(requestId)?.let {
|
getRequest(requestId)?.let {
|
||||||
val clientCert = certificateGenerator(it)
|
val clientCert = certificateGenerator(it)
|
||||||
DataTable.update({ DataTable.requestId eq requestId }) {
|
DataTable.update({ DataTable.requestId eq requestId }) {
|
||||||
@ -44,8 +39,6 @@ class DBCertificateRequestStorage(private val database: Database) : Certificatio
|
|||||||
it[certificate] = serializeToBlob(clientCert, finalizables)
|
it[certificate] = serializeToBlob(clientCert, finalizables)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
finalizables.forEach { it() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -56,8 +49,7 @@ class DBCertificateRequestStorage(private val database: Database) : Certificatio
|
|||||||
|
|
||||||
override fun saveRequest(certificationData: CertificationData): String {
|
override fun saveRequest(certificationData: CertificationData): String {
|
||||||
return databaseTransaction(database) {
|
return databaseTransaction(database) {
|
||||||
val finalizables = mutableListOf<() -> Unit>()
|
withFinalizables { finalizables ->
|
||||||
try {
|
|
||||||
val requestId = SecureHash.randomSHA256().toString()
|
val requestId = SecureHash.randomSHA256().toString()
|
||||||
DataTable.insert {
|
DataTable.insert {
|
||||||
it[DataTable.requestId] = requestId
|
it[DataTable.requestId] = requestId
|
||||||
@ -67,8 +59,6 @@ class DBCertificateRequestStorage(private val database: Database) : Certificatio
|
|||||||
it[requestTimestamp] = LocalDateTime.now()
|
it[requestTimestamp] = LocalDateTime.now()
|
||||||
}
|
}
|
||||||
requestId
|
requestId
|
||||||
} finally {
|
|
||||||
finalizables.forEach { it() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@ approveAll = true
|
|||||||
|
|
||||||
dataSourceProperties {
|
dataSourceProperties {
|
||||||
dataSourceClassName = org.h2.jdbcx.JdbcDataSource
|
dataSourceClassName = org.h2.jdbcx.JdbcDataSource
|
||||||
"dataSource.url" = "jdbc:h2:file:"${basedir}"/persistence;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;MVCC=true;MV_STORE=true;WRITE_DELAY=0;AUTO_SERVER_PORT="${h2port}
|
"dataSource.url" = "jdbc:h2:file:"${basedir}"/persistence;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000;WRITE_DELAY=0;AUTO_SERVER_PORT="${h2port}
|
||||||
"dataSource.user" = sa
|
"dataSource.user" = sa
|
||||||
"dataSource.password" = ""
|
"dataSource.password" = ""
|
||||||
}
|
}
|
||||||
|
@ -110,9 +110,7 @@ class CertificateSigningServiceTest {
|
|||||||
})
|
})
|
||||||
|
|
||||||
val certificates = assertNotNull(poll())
|
val certificates = assertNotNull(poll())
|
||||||
|
|
||||||
verify(storage, times(3)).getCertificate(any())
|
verify(storage, times(3)).getCertificate(any())
|
||||||
|
|
||||||
assertEquals(3, certificates.size)
|
assertEquals(3, certificates.size)
|
||||||
|
|
||||||
(certificates.first() as X509Certificate).run {
|
(certificates.first() as X509Certificate).run {
|
||||||
|
@ -11,7 +11,6 @@ import kotlin.test.assertNull
|
|||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
|
|
||||||
class DBCertificateRequestStorageTest {
|
class DBCertificateRequestStorageTest {
|
||||||
|
|
||||||
val intermediateCA = X509Utilities.createSelfSignedCACert("Corda Node Intermediate CA")
|
val intermediateCA = X509Utilities.createSelfSignedCACert("Corda Node Intermediate CA")
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -30,6 +30,15 @@ fun <T> databaseTransaction(db: Database, statement: Transaction.() -> T): T {
|
|||||||
return org.jetbrains.exposed.sql.transactions.transaction(Connection.TRANSACTION_REPEATABLE_READ, 1, statement)
|
return org.jetbrains.exposed.sql.transactions.transaction(Connection.TRANSACTION_REPEATABLE_READ, 1, statement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun <T> withFinalizables(statement: (MutableList<() -> Unit>) -> T): T {
|
||||||
|
val finalizables = mutableListOf<() -> Unit>()
|
||||||
|
return try {
|
||||||
|
statement(finalizables)
|
||||||
|
} finally {
|
||||||
|
finalizables.forEach { it() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun createDatabaseTransaction(db: Database): Transaction {
|
fun createDatabaseTransaction(db: Database): Transaction {
|
||||||
// We need to set the database for the current [Thread] or [Fiber] here as some tests share threads across databases.
|
// We need to set the database for the current [Thread] or [Fiber] here as some tests share threads across databases.
|
||||||
StrandLocalTransactionManager.database = db
|
StrandLocalTransactionManager.database = db
|
||||||
@ -138,12 +147,14 @@ class StrandLocalTransactionManager(initWithDatabase: Database) : TransactionMan
|
|||||||
|
|
||||||
// Composite columns for use with below Exposed helpers.
|
// Composite columns for use with below Exposed helpers.
|
||||||
data class PartyColumns(val name: Column<String>, val owningKey: Column<PublicKey>)
|
data class PartyColumns(val name: Column<String>, val owningKey: Column<PublicKey>)
|
||||||
|
|
||||||
data class StateRefColumns(val txId: Column<SecureHash>, val index: Column<Int>)
|
data class StateRefColumns(val txId: Column<SecureHash>, val index: Column<Int>)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [Table] column helpers for use with Exposed, as per [varchar] etc.
|
* [Table] column helpers for use with Exposed, as per [varchar] etc.
|
||||||
*/
|
*/
|
||||||
fun Table.publicKey(name: String) = this.registerColumn<PublicKey>(name, PublicKeyColumnType)
|
fun Table.publicKey(name: String) = this.registerColumn<PublicKey>(name, PublicKeyColumnType)
|
||||||
|
|
||||||
fun Table.secureHash(name: String) = this.registerColumn<SecureHash>(name, SecureHashColumnType)
|
fun Table.secureHash(name: String) = this.registerColumn<SecureHash>(name, SecureHashColumnType)
|
||||||
fun Table.party(nameColumnName: String, keyColumnName: String) = PartyColumns(this.varchar(nameColumnName, length = 255), this.publicKey(keyColumnName))
|
fun Table.party(nameColumnName: String, keyColumnName: String) = PartyColumns(this.varchar(nameColumnName, length = 255), this.publicKey(keyColumnName))
|
||||||
fun Table.uuidString(name: String) = this.registerColumn<UUID>(name, UUIDStringColumnType)
|
fun Table.uuidString(name: String) = this.registerColumn<UUID>(name, UUIDStringColumnType)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user