Add useTempFile extension methods

Signed-off-by: Graham <gpe@openrs2.dev>
Graham 5 years ago
parent 8370ad104e
commit c3715d7320
  1. 6
      asm/src/main/java/dev/openrs2/asm/io/SignedJarLibraryWriter.kt
  2. 21
      crypto/src/test/java/dev/openrs2/crypto/RsaTest.kt
  3. 29
      util/src/main/java/dev/openrs2/util/io/PathExtensions.kt

@ -4,6 +4,7 @@ import dev.openrs2.asm.classpath.ClassPath
import dev.openrs2.crypto.Pkcs12KeyStore import dev.openrs2.crypto.Pkcs12KeyStore
import dev.openrs2.util.io.DeterministicJarOutputStream import dev.openrs2.util.io.DeterministicJarOutputStream
import dev.openrs2.util.io.entries import dev.openrs2.util.io.entries
import dev.openrs2.util.io.useTempFile
import org.objectweb.asm.tree.ClassNode import org.objectweb.asm.tree.ClassNode
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
@ -18,8 +19,7 @@ class SignedJarLibraryWriter(
private val keyStore: Pkcs12KeyStore private val keyStore: Pkcs12KeyStore
) : LibraryWriter { ) : LibraryWriter {
override fun write(output: OutputStream, classPath: ClassPath, classes: Iterable<ClassNode>) { override fun write(output: OutputStream, classPath: ClassPath, classes: Iterable<ClassNode>) {
val unsignedJar = Files.createTempFile(TEMP_PREFIX, JAR_SUFFIX) useTempFile(TEMP_PREFIX, JAR_SUFFIX) { unsignedJar ->
try {
Files.newOutputStream(unsignedJar).use { unsignedOutput -> Files.newOutputStream(unsignedJar).use { unsignedOutput ->
ManifestJarLibraryWriter(manifest).write(unsignedOutput, classPath, classes) ManifestJarLibraryWriter(manifest).write(unsignedOutput, classPath, classes)
} }
@ -31,8 +31,6 @@ class SignedJarLibraryWriter(
repack(signedInput, output) repack(signedInput, output)
} }
} }
} finally {
Files.deleteIfExists(unsignedJar)
} }
} }

@ -2,6 +2,7 @@ package dev.openrs2.crypto
import com.google.common.jimfs.Configuration import com.google.common.jimfs.Configuration
import com.google.common.jimfs.Jimfs import com.google.common.jimfs.Jimfs
import dev.openrs2.util.io.useTempFile
import io.netty.buffer.Unpooled import io.netty.buffer.Unpooled
import org.bouncycastle.crypto.params.RSAKeyParameters import org.bouncycastle.crypto.params.RSAKeyParameters
import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters
@ -116,16 +117,13 @@ object RsaTest {
@Test @Test
fun testReadPublicKey() { fun testReadPublicKey() {
Jimfs.newFileSystem(Configuration.unix()).use { fs -> Jimfs.newFileSystem(Configuration.unix()).use { fs ->
val file = Files.createTempFile(fs.getPath("/"), "public", ".key") fs.getPath("/").useTempFile("public", ".key") { file ->
try {
Files.write(file, PUBLIC_KEY_PEM) Files.write(file, PUBLIC_KEY_PEM)
val key = allowUnsafeMod { Rsa.readPublicKey(file) } val key = allowUnsafeMod { Rsa.readPublicKey(file) }
assertFalse(key.isPrivate) assertFalse(key.isPrivate)
assertEquals(PUBLIC_KEY.modulus, key.modulus) assertEquals(PUBLIC_KEY.modulus, key.modulus)
assertEquals(PUBLIC_KEY.exponent, key.exponent) assertEquals(PUBLIC_KEY.exponent, key.exponent)
} finally {
Files.deleteIfExists(file)
} }
} }
} }
@ -133,13 +131,10 @@ object RsaTest {
@Test @Test
fun testWritePublicKey() { fun testWritePublicKey() {
Jimfs.newFileSystem(Configuration.unix()).use { fs -> Jimfs.newFileSystem(Configuration.unix()).use { fs ->
val file = Files.createTempFile(fs.getPath("/"), "public", ".key") fs.getPath("/").useTempFile("public", ".key") { file ->
try {
Rsa.writePublicKey(file, PUBLIC_KEY) Rsa.writePublicKey(file, PUBLIC_KEY)
assertEquals(PUBLIC_KEY_PEM, Files.readAllLines(file)) assertEquals(PUBLIC_KEY_PEM, Files.readAllLines(file))
} finally {
Files.deleteIfExists(file)
} }
} }
} }
@ -147,8 +142,7 @@ object RsaTest {
@Test @Test
fun testReadPrivateKey() { fun testReadPrivateKey() {
Jimfs.newFileSystem(Configuration.unix()).use { fs -> Jimfs.newFileSystem(Configuration.unix()).use { fs ->
val file = Files.createTempFile(fs.getPath("/"), "private", ".key") fs.getPath("/").useTempFile("private", ".key") { file ->
try {
Files.write(file, PRIVATE_KEY_PEM) Files.write(file, PRIVATE_KEY_PEM)
val key = allowUnsafeMod { Rsa.readPrivateKey(file) } val key = allowUnsafeMod { Rsa.readPrivateKey(file) }
@ -161,8 +155,6 @@ object RsaTest {
assertEquals(PRIVATE_KEY_CRT.dp, key.dp) assertEquals(PRIVATE_KEY_CRT.dp, key.dp)
assertEquals(PRIVATE_KEY_CRT.dq, key.dq) assertEquals(PRIVATE_KEY_CRT.dq, key.dq)
assertEquals(PRIVATE_KEY_CRT.qInv, key.qInv) assertEquals(PRIVATE_KEY_CRT.qInv, key.qInv)
} finally {
Files.deleteIfExists(file)
} }
} }
} }
@ -170,13 +162,10 @@ object RsaTest {
@Test @Test
fun testWritePrivateKey() { fun testWritePrivateKey() {
Jimfs.newFileSystem(Configuration.unix()).use { fs -> Jimfs.newFileSystem(Configuration.unix()).use { fs ->
val file = Files.createTempFile(fs.getPath("/"), "private", ".key") fs.getPath("/").useTempFile("private", ".key") { file ->
try {
Rsa.writePrivateKey(file, PRIVATE_KEY_CRT) Rsa.writePrivateKey(file, PRIVATE_KEY_CRT)
assertEquals(PRIVATE_KEY_PEM, Files.readAllLines(file)) assertEquals(PRIVATE_KEY_PEM, Files.readAllLines(file))
} finally {
Files.deleteIfExists(file)
} }
} }
} }

@ -7,6 +7,35 @@ import java.nio.file.Files
import java.nio.file.OpenOption import java.nio.file.OpenOption
import java.nio.file.Path import java.nio.file.Path
import java.nio.file.StandardCopyOption import java.nio.file.StandardCopyOption
import java.nio.file.attribute.FileAttribute
inline fun <T> useTempFile(
prefix: String? = null,
suffix: String? = null,
vararg attributes: FileAttribute<*>,
f: (Path) -> T
): T {
val tempFile = Files.createTempFile(prefix, suffix, *attributes)
try {
return f(tempFile)
} finally {
Files.deleteIfExists(tempFile)
}
}
inline fun <T> Path.useTempFile(
prefix: String? = null,
suffix: String? = null,
vararg attributes: FileAttribute<*>,
f: (Path) -> T
): T {
val tempFile = Files.createTempFile(this, prefix, suffix, *attributes)
try {
return f(tempFile)
} finally {
Files.deleteIfExists(tempFile)
}
}
inline fun <T> Path.atomicWrite(f: (Path) -> T): T { inline fun <T> Path.atomicWrite(f: (Path) -> T): T {
val tempFile = Files.createTempFile(parent, ".$fileName", ".tmp") val tempFile = Files.createTempFile(parent, ".$fileName", ".tmp")

Loading…
Cancel
Save