Skip to content
Snippets Groups Projects
Verified Commit ffd3221b authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Fixes a crash caused by incorrectly serialized values

parent 2fbf9cef
Branches
Tags
No related merge requests found
Pipeline #
...@@ -65,15 +65,15 @@ class IrcChannel( ...@@ -65,15 +65,15 @@ class IrcChannel(
} }
override fun initChanModes(): QVariantMap = mapOf( override fun initChanModes(): QVariantMap = mapOf(
"A" to QVariant.of(_A_channelModes.mapValues { (_, value) -> "A" to QVariant.of(_A_channelModes.map { (key, value) ->
QVariant.of(value.toList(), Type.QStringList) key.toString() to QVariant.of(value.toList(), Type.QStringList)
}, Type.QVariantMap), }.toMap(), Type.QVariantMap),
"B" to QVariant.of(_B_channelModes.mapValues { (_, value) -> "B" to QVariant.of(_B_channelModes.map { (key, value) ->
QVariant.of(value, Type.QString) key.toString() to QVariant.of(value, Type.QString)
}, Type.QVariantMap), }.toMap(), Type.QVariantMap),
"C" to QVariant.of(_C_channelModes.mapValues { (_, value) -> "C" to QVariant.of(_C_channelModes.map { (key, value) ->
QVariant.of(value, Type.QString) key.toString() to QVariant.of(value, Type.QString)
}, Type.QVariantMap), }.toMap(), Type.QVariantMap),
"D" to QVariant.of(_D_channelModes.joinToString(), Type.QString) "D" to QVariant.of(_D_channelModes.joinToString(), Type.QString)
) )
...@@ -89,14 +89,14 @@ class IrcChannel( ...@@ -89,14 +89,14 @@ class IrcChannel(
) )
override fun initSetChanModes(chanModes: QVariantMap) { override fun initSetChanModes(chanModes: QVariantMap) {
chanModes["A"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> chanModes["A"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
_A_channelModes[key.toCharArray().first()] = _A_channelModes[key.toCharArray().first()] =
variant.valueOr<QStringList>(::emptyList).filterNotNull().toMutableSet() variant.valueOr<QStringList>(::emptyList).filterNotNull().toMutableSet()
} }
chanModes["B"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> chanModes["B"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
_B_channelModes[key.toCharArray().first()] = variant.value("") _B_channelModes[key.toCharArray().first()] = variant.value("")
} }
chanModes["C"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) -> chanModes["C"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
_C_channelModes[key.toCharArray().first()] = variant.value("") _C_channelModes[key.toCharArray().first()] = variant.value("")
} }
_D_channelModes = chanModes["D"].value("").toCharArray().toMutableSet() _D_channelModes = chanModes["D"].value("").toCharArray().toMutableSet()
......
...@@ -71,6 +71,79 @@ class NetworkTest { ...@@ -71,6 +71,79 @@ class NetworkTest {
original.setCodecForServer(randomCharset().name()) original.setCodecForServer(randomCharset().name())
original.setCodecForEncoding(randomCharset().name()) original.setCodecForEncoding(randomCharset().name())
original.setCodecForDecoding(randomCharset().name()) original.setCodecForDecoding(randomCharset().name())
original.addSupport("AWAYLEN", "200")
original.addSupport("CALLERID", "g")
original.addSupport("CASEMAPPING", "rfc1459")
original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz")
original.addSupport("CHANNELLEN", "64")
original.addSupport("CHANTYPES", "#")
original.addSupport("CHARSET", "ascii")
original.addSupport("ELIST", "MU")
original.addSupport("ESILENCE", null)
original.addSupport("EXCEPTS", "e")
original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
original.addSupport("FNC", null)
original.addSupport("INVEX", "I")
for (i in 0 until randomUByte()) {
original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
setUser(randomString())
setHost(randomString())
setNick(randomString())
setRealName(randomString())
setAccount(randomString())
setAway(randomBoolean())
setAwayMessage(randomString())
setIdleTime(randomInstant())
setLoginTime(randomInstant())
setServer(randomString())
setIrcOperator(randomString())
setLastAwayMessageTime(randomInstant())
setWhoisServiceReply(randomString())
setSuserHost(randomString())
setEncrypted(randomBoolean())
setUserModes(listOf(
randomOf(*USERMODES),
randomOf(*USERMODES),
randomOf(*USERMODES)
).toString())
}
}
for (i in 0 until randomUByte()) {
original.newIrcChannel(randomString(), mapOf()).apply {
setTopic(randomString())
setPassword(randomString())
setEncrypted(randomBoolean())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_B), randomString())
addChannelMode(randomOf(*CHANMODES_C), randomString())
addChannelMode(randomOf(*CHANMODES_C), randomString())
addChannelMode(randomOf(*CHANMODES_D), null)
addChannelMode(randomOf(*CHANMODES_D), null)
addChannelMode(randomOf(*CHANMODES_D), null)
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
}
}
val copy = original.copy() val copy = original.copy()
copy.fromVariantMap(roundTrip(VariantMapSerializer, original.toVariantMap())) copy.fromVariantMap(roundTrip(VariantMapSerializer, original.toVariantMap()))
...@@ -122,10 +195,105 @@ class NetworkTest { ...@@ -122,10 +195,105 @@ class NetworkTest {
original.setCodecForServer(randomCharset().name()) original.setCodecForServer(randomCharset().name())
original.setCodecForEncoding(randomCharset().name()) original.setCodecForEncoding(randomCharset().name())
original.setCodecForDecoding(randomCharset().name()) original.setCodecForDecoding(randomCharset().name())
original.setAutoAwayActive(randomBoolean()) original.addSupport("AWAYLEN", "200")
original.addSupport("CALLERID", "g")
original.addSupport("CASEMAPPING", "rfc1459")
original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz")
original.addSupport("CHANNELLEN", "64")
original.addSupport("CHANTYPES", "#")
original.addSupport("CHARSET", "ascii")
original.addSupport("ELIST", "MU")
original.addSupport("ESILENCE", null)
original.addSupport("EXCEPTS", "e")
original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
original.addSupport("FNC", null)
original.addSupport("INVEX", "I")
for (i in 0 until randomUByte()) {
original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
setUser(randomString())
setHost(randomString())
setNick(randomString())
setRealName(randomString())
setAccount(randomString())
setAway(randomBoolean())
setAwayMessage(randomString())
setIdleTime(randomInstant())
setLoginTime(randomInstant())
setServer(randomString())
setIrcOperator(randomString())
setLastAwayMessageTime(randomInstant())
setWhoisServiceReply(randomString())
setSuserHost(randomString())
setEncrypted(randomBoolean())
setUserModes(listOf(
randomOf(*USERMODES),
randomOf(*USERMODES),
randomOf(*USERMODES)
).toString())
}
}
for (i in 0 until randomUByte()) {
original.newIrcChannel(randomString(), mapOf()).apply {
setTopic(randomString())
setPassword(randomString())
setEncrypted(randomBoolean())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_A), randomString())
addChannelMode(randomOf(*CHANMODES_B), randomString())
addChannelMode(randomOf(*CHANMODES_C), randomString())
addChannelMode(randomOf(*CHANMODES_C), randomString())
addChannelMode(randomOf(*CHANMODES_D), null)
addChannelMode(randomOf(*CHANMODES_D), null)
addChannelMode(randomOf(*CHANMODES_D), null)
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
randomOf(original.ircUsers()).let {
joinIrcUser(it)
setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
}
}
}
val copy = original.copy() val copy = original.copy()
copy.fromVariantMap(original.toVariantMap()) copy.fromVariantMap(original.toVariantMap())
assert(original.isEqual(copy)) assert(original.isEqual(copy))
} }
companion object {
private val USERMODES = arrayOf(
'B', 'H', 'I', 'L', 'O', 'R', 'S', 'T', 'W', 'c', 'd', 'g', 'h', 'i', 'k', 'o', 'r', 's', 'w',
'x'
)
private val CHANMODES_PREFIX = arrayOf(
'Y', 'o', 'h', 'v'
)
private val CHANMODES_A = arrayOf(
'I', 'X', 'Z', 'b', 'e', 'g', 'w'
)
private val CHANMODES_B = arrayOf(
'k'
)
private val CHANMODES_C = arrayOf(
'F', 'H', 'J', 'L', 'U', 'd', 'f', 'j', 'l', 'x'
)
private val CHANMODES_D = arrayOf(
'A', 'B', 'C', 'D', 'K', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'c', 'i', 'm', 'n', 'p', 'r',
's', 't', 'u', 'z'
)
}
} }
...@@ -22,6 +22,7 @@ package de.kuschku.libquassel.util ...@@ -22,6 +22,7 @@ package de.kuschku.libquassel.util
import de.kuschku.libquassel.protocol.UByte import de.kuschku.libquassel.protocol.UByte
import de.kuschku.libquassel.protocol.UInt import de.kuschku.libquassel.protocol.UInt
import de.kuschku.libquassel.protocol.UShort import de.kuschku.libquassel.protocol.UShort
import org.threeten.bp.Instant
import java.nio.charset.Charset import java.nio.charset.Charset
import java.util.* import java.util.*
...@@ -42,6 +43,9 @@ fun Any?.randomLong(): Long = random.nextLong() ...@@ -42,6 +43,9 @@ fun Any?.randomLong(): Long = random.nextLong()
fun Any?.randomString(): String = UUID.randomUUID().toString() fun Any?.randomString(): String = UUID.randomUUID().toString()
fun Any?.randomInstant(): Instant = Instant.ofEpochMilli(randomLong())
fun <T> Any?.randomOf(vararg elements: T): T = elements[random.nextInt(elements.size)] fun <T> Any?.randomOf(vararg elements: T): T = elements[random.nextInt(elements.size)]
fun <T> Any?.randomOf(elements: List<T>): T = elements[random.nextInt(elements.size)]
fun Any?.randomCharset(): Charset = randomOf(*Charset.availableCharsets().values.toTypedArray()) fun Any?.randomCharset(): Charset = randomOf(*Charset.availableCharsets().values.toTypedArray())
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment