Refactored to use StreamableWriter
Bumped the msgpack library to 2.0.1 (the 2.0.0 build was fubar)
This commit is contained in:
		@@ -19,6 +19,7 @@ package ch.dissem.bitmessage.extensions
 | 
			
		||||
import ch.dissem.bitmessage.entity.BitmessageAddress
 | 
			
		||||
import ch.dissem.bitmessage.entity.CustomMessage
 | 
			
		||||
import ch.dissem.bitmessage.entity.Streamable
 | 
			
		||||
import ch.dissem.bitmessage.entity.StreamableWriter
 | 
			
		||||
import ch.dissem.bitmessage.entity.payload.CryptoBox
 | 
			
		||||
import ch.dissem.bitmessage.entity.payload.Pubkey
 | 
			
		||||
import ch.dissem.bitmessage.exception.DecryptionFailedException
 | 
			
		||||
@@ -73,7 +74,7 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
 | 
			
		||||
            Encode.varInt(privateKey.pubkey.extraBytes, out)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        data?.write(out) ?: throw IllegalStateException("no unencrypted data available")
 | 
			
		||||
        data?.writer()?.write(out) ?: throw IllegalStateException("no unencrypted data available")
 | 
			
		||||
        Encode.varBytes(cryptography().getSignature(out.toByteArray(), privateKey), out)
 | 
			
		||||
        container = CryptoBox(out.toByteArray(), publicKey)
 | 
			
		||||
    }
 | 
			
		||||
@@ -109,9 +110,17 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
 | 
			
		||||
        return data!!
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun write(out: OutputStream) {
 | 
			
		||||
        Encode.varString(COMMAND, out)
 | 
			
		||||
        container?.write(out) ?: throw IllegalStateException("not encrypted yet")
 | 
			
		||||
    override fun writer(): StreamableWriter = Writer(this)
 | 
			
		||||
 | 
			
		||||
    private class Writer(
 | 
			
		||||
        private val item: CryptoCustomMessage<*>
 | 
			
		||||
    ) : CustomMessage.Writer(item) {
 | 
			
		||||
 | 
			
		||||
        override fun write(out: OutputStream) {
 | 
			
		||||
            Encode.varString(COMMAND, out)
 | 
			
		||||
            item.container?.writer()?.write(out) ?: throw IllegalStateException("not encrypted yet")
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface Reader<out T> {
 | 
			
		||||
@@ -136,9 +145,11 @@ class CryptoCustomMessage<T : Streamable> : CustomMessage {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        @JvmField val COMMAND = "ENCRYPTED"
 | 
			
		||||
        @JvmField
 | 
			
		||||
        val COMMAND = "ENCRYPTED"
 | 
			
		||||
 | 
			
		||||
        @JvmStatic fun <T : Streamable> read(data: CustomMessage, dataReader: Reader<T>): CryptoCustomMessage<T> {
 | 
			
		||||
        @JvmStatic
 | 
			
		||||
        fun <T : Streamable> read(data: CustomMessage, dataReader: Reader<T>): CryptoCustomMessage<T> {
 | 
			
		||||
            val cryptoBox = CryptoBox.read(ByteArrayInputStream(data.getData()), data.getData().size)
 | 
			
		||||
            return CryptoCustomMessage(cryptoBox, dataReader)
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -18,6 +18,7 @@ package ch.dissem.bitmessage.extensions.pow
 | 
			
		||||
 | 
			
		||||
import ch.dissem.bitmessage.entity.BitmessageAddress
 | 
			
		||||
import ch.dissem.bitmessage.entity.Streamable
 | 
			
		||||
import ch.dissem.bitmessage.entity.StreamableWriter
 | 
			
		||||
import ch.dissem.bitmessage.extensions.CryptoCustomMessage
 | 
			
		||||
import ch.dissem.bitmessage.utils.Decode.bytes
 | 
			
		||||
import ch.dissem.bitmessage.utils.Decode.varBytes
 | 
			
		||||
@@ -33,16 +34,24 @@ import java.util.*
 | 
			
		||||
 */
 | 
			
		||||
data class ProofOfWorkRequest @JvmOverloads constructor(val sender: BitmessageAddress, val initialHash: ByteArray, val request: ProofOfWorkRequest.Request, val data: ByteArray = ByteArray(0)) : Streamable {
 | 
			
		||||
 | 
			
		||||
    override fun write(out: OutputStream) {
 | 
			
		||||
        out.write(initialHash)
 | 
			
		||||
        Encode.varString(request.name, out)
 | 
			
		||||
        Encode.varBytes(data, out)
 | 
			
		||||
    }
 | 
			
		||||
    override fun writer(): StreamableWriter = Writer(this)
 | 
			
		||||
 | 
			
		||||
    private class Writer(
 | 
			
		||||
        private val item: ProofOfWorkRequest
 | 
			
		||||
    ) : StreamableWriter {
 | 
			
		||||
 | 
			
		||||
        override fun write(out: OutputStream) {
 | 
			
		||||
            out.write(item.initialHash)
 | 
			
		||||
            Encode.varString(item.request.name, out)
 | 
			
		||||
            Encode.varBytes(item.data, out)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        override fun write(buffer: ByteBuffer) {
 | 
			
		||||
            buffer.put(item.initialHash)
 | 
			
		||||
            Encode.varString(item.request.name, buffer)
 | 
			
		||||
            Encode.varBytes(item.data, buffer)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    override fun write(buffer: ByteBuffer) {
 | 
			
		||||
        buffer.put(initialHash)
 | 
			
		||||
        Encode.varString(request.name, buffer)
 | 
			
		||||
        Encode.varBytes(data, buffer)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    class Reader(private val identity: BitmessageAddress) : CryptoCustomMessage.Reader<ProofOfWorkRequest> {
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ class CryptoCustomMessageTest : TestBase() {
 | 
			
		||||
        messageBefore.signAndEncrypt(sendingIdentity, cryptography().createPublicKey(sendingIdentity.publicDecryptionKey))
 | 
			
		||||
 | 
			
		||||
        val out = ByteArrayOutputStream()
 | 
			
		||||
        messageBefore.write(out)
 | 
			
		||||
        messageBefore.writer().write(out)
 | 
			
		||||
        val `in` = ByteArrayInputStream(out.toByteArray())
 | 
			
		||||
 | 
			
		||||
        val customMessage = CustomMessage.read(`in`, out.size())
 | 
			
		||||
@@ -71,7 +71,7 @@ class CryptoCustomMessageTest : TestBase() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        val out = ByteArrayOutputStream()
 | 
			
		||||
        messageBefore.write(out)
 | 
			
		||||
        messageBefore.writer().write(out)
 | 
			
		||||
        val `in` = ByteArrayInputStream(out.toByteArray())
 | 
			
		||||
 | 
			
		||||
        val customMessage = CustomMessage.read(`in`, out.size())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user