This commit is contained in:
Niels Andriesse
2021-04-29 10:02:07 +10:00
parent 6a116100ae
commit 761c12addd
46 changed files with 56 additions and 146 deletions

View File

@@ -22,7 +22,6 @@ import org.session.libsignal.service.api.messages.SignalServiceEnvelope;
import org.session.libsignal.service.api.messages.SignalServiceGroup;
import org.session.libsignal.service.api.messages.SignalServiceReceiptMessage;
import org.session.libsignal.service.api.messages.SignalServiceTypingMessage;
import org.session.libsignal.service.api.messages.shared.SharedContact;
import org.session.libsignal.service.api.push.SignalServiceAddress;
import org.session.libsignal.service.internal.push.PushTransportDetails;
import org.session.libsignal.service.internal.push.SignalServiceProtos;
@@ -34,7 +33,7 @@ import org.session.libsignal.service.internal.push.SignalServiceProtos.ReceiptMe
import org.session.libsignal.service.internal.push.SignalServiceProtos.TypingMessage;
import org.session.libsignal.service.loki.api.crypto.SessionProtocol;
import org.session.libsignal.service.loki.api.crypto.SessionProtocolUtilities;
import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol;
import org.session.libsignal.service.loki.LokiAPIDatabaseProtocol;
import java.util.ArrayList;
import java.util.LinkedList;

View File

@@ -1,6 +1,5 @@
package org.session.libsignal.service.api.messages.shared;
import org.session.libsignal.libsignal.util.guava.Optional;
import org.session.libsignal.service.api.messages.SignalServiceAttachment;

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.utilities
package org.session.libsignal.service.loki
interface Broadcaster {

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.api.utilities
package org.session.libsignal.service.loki
import okhttp3.*
import org.session.libsignal.utilities.logging.Log

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.database
package org.session.libsignal.service.loki
import org.session.libsignal.libsignal.ecc.ECKeyPair
import org.session.libsignal.service.loki.Snode

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.database
package org.session.libsignal.service.loki
interface LokiMessageDatabaseProtocol {

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.database
package org.session.libsignal.service.loki
interface LokiOpenGroupDatabaseProtocol {

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.database
package org.session.libsignal.service.loki
interface LokiUserDatabaseProtocol {

View File

@@ -1,3 +1,3 @@
package org.session.libsignal.service.loki.utilities.mentions
package org.session.libsignal.service.loki
data class Mention(val publicKey: String, val displayName: String)

View File

@@ -1,6 +1,5 @@
package org.session.libsignal.service.loki.crypto
package org.session.libsignal.service.loki
import java.io.File
import java.util.zip.CRC32
/**
@@ -95,8 +94,10 @@ class MnemonicCodec(private val loadFileContents: (String) -> String) {
var result = ""
val n = truncatedWordSet.size.toLong()
// Check preconditions
if (words.size < 12) { throw DecodingError.InputTooShort }
if (words.size % 3 == 0) { throw DecodingError.MissingLastWord }
if (words.size < 12) { throw DecodingError.InputTooShort
}
if (words.size % 3 == 0) { throw DecodingError.MissingLastWord
}
// Get checksum word
val checksumWord = words.removeAt(words.lastIndex)
// Decode
@@ -106,7 +107,8 @@ class MnemonicCodec(private val loadFileContents: (String) -> String) {
val w2 = truncatedWordSet.indexOf(words[chunkStartIndex + 1].substring(0 until prefixLength))
val w3 = truncatedWordSet.indexOf(words[chunkStartIndex + 2].substring(0 until prefixLength))
val x = w1 + n * ((n - w1 + w2) % n) + n * n * ((n - w2 + w3) % n)
if (x % n != w1.toLong()) { throw DecodingError.Generic }
if (x % n != w1.toLong()) { throw DecodingError.Generic
}
val string = "0000000" + x.toString(16)
result += swap(string.substring(string.length - 8 until string.length))
} catch (e: Exception) {
@@ -116,7 +118,8 @@ class MnemonicCodec(private val loadFileContents: (String) -> String) {
// Verify checksum
val checksumIndex = determineChecksumIndex(words, prefixLength)
val expectedChecksumWord = words[checksumIndex]
if (expectedChecksumWord.substring(0 until prefixLength) != checksumWord.substring(0 until prefixLength)) { throw DecodingError.VerificationFailed }
if (expectedChecksumWord.substring(0 until prefixLength) != checksumWord.substring(0 until prefixLength)) { throw DecodingError.VerificationFailed
}
// Return
return result
}

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.utilities
package org.session.libsignal.service.loki
import org.session.libsignal.service.api.crypto.DigestingOutputStream
import org.session.libsignal.service.internal.push.http.OutputStreamFactory

View File

@@ -1,7 +1,7 @@
package org.session.libsignal.service.loki.api.crypto
import org.session.libsignal.libsignal.ecc.ECKeyPair
import org.session.libsignal.service.loki.database.LokiAPIDatabaseProtocol
import org.session.libsignal.service.loki.LokiAPIDatabaseProtocol
interface SessionProtocol {

View File

@@ -1,4 +1,4 @@
package org.session.libsignal.service.loki.api
package org.session.libsignal.service.loki
import org.session.libsignal.service.internal.push.SignalServiceProtos

View File

@@ -1,49 +0,0 @@
package org.session.libsignal.service.loki.api.utilities
import okhttp3.MultipartBody
import okhttp3.Request
import okio.Buffer
import org.session.libsignal.utilities.Base64
import java.io.IOException
import java.util.*
internal fun Request.getHeadersForOnionRequest(): Map<String, Any> {
val result = mutableMapOf<String, Any>()
val contentType = body()?.contentType()
if (contentType != null) {
result["content-type"] = contentType.toString()
}
val headers = headers()
for (name in headers.names()) {
val value = headers.get(name)
if (value != null) {
if (value.toLowerCase(Locale.US) == "true" || value.toLowerCase(Locale.US) == "false") {
result[name] = value.toBoolean()
} else if (value.toIntOrNull() != null) {
result[name] = value.toInt()
} else {
result[name] = value
}
}
}
return result
}
internal fun Request.getBodyForOnionRequest(): Any? {
try {
val copyOfThis = newBuilder().build()
val buffer = Buffer()
val body = copyOfThis.body() ?: return null
body.writeTo(buffer)
val bodyAsData = buffer.readByteArray()
if (body is MultipartBody) {
val base64EncodedBody: String = Base64.encodeBytes(bodyAsData)
return mapOf( "fileUpload" to base64EncodedBody )
} else {
val charset = body.contentType()?.charset() ?: Charsets.UTF_8
return bodyAsData?.toString(charset)
}
} catch (e: IOException) {
return null
}
}

View File

@@ -58,7 +58,7 @@ public class JsonUtil {
return objectMapper.writeValueAsString(object);
}
public static String toJson(Object object) {
public static String toJson(Object object) {
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
@@ -67,32 +67,11 @@ public class JsonUtil {
}
}
public static class IdentityKeySerializer extends JsonSerializer<IdentityKey> {
@Override
public void serialize(IdentityKey value, JsonGenerator gen, SerializerProvider serializers)
throws IOException
{
gen.writeString(Base64.encodeBytesWithoutPadding(value.serialize()));
}
}
public static class IdentityKeyDeserializer extends JsonDeserializer<IdentityKey> {
@Override
public IdentityKey deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
try {
return new IdentityKey(Base64.decodeWithoutPadding(p.getValueAsString()), 0);
} catch (InvalidKeyException e) {
throw new IOException(e);
}
}
}
public static ObjectMapper getMapper() {
return objectMapper;
}
public static class SaneJSONObject {
private final JSONObject delegate;
public SaneJSONObject(JSONObject delegate) {

View File

@@ -1,25 +1,11 @@
@file:JvmName("PromiseUtilities")
package org.session.libsignal.utilities
import nl.komponents.kovenant.Context
import nl.komponents.kovenant.Kovenant
import nl.komponents.kovenant.Promise
import nl.komponents.kovenant.deferred
import nl.komponents.kovenant.jvm.asDispatcher
import org.session.libsignal.utilities.logging.Log
import java.util.concurrent.Executors
import java.util.concurrent.TimeoutException
fun Kovenant.createContext(): Context {
return createContext {
callbackContext.dispatcher = Executors.newSingleThreadExecutor().asDispatcher()
workerContext.dispatcher = ThreadUtils.executorPool.asDispatcher()
multipleCompletion = { v1, v2 ->
Log.d("Loki", "Promise resolved more than once (first with $v1, then with $v2); ignoring $v2.")
}
}
}
fun <V, E : Throwable> Promise<V, E>.get(defaultValue: V): V {
return try {
get()

View File

@@ -3,7 +3,6 @@ package org.session.libsignal.utilities
import java.util.concurrent.*
object ThreadUtils {
val executorPool = Executors.newCachedThreadPool()
@JvmStatic
@@ -17,10 +16,8 @@ object ThreadUtils {
@JvmStatic
fun newDynamicSingleThreadedExecutor(): ExecutorService {
val executor = ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
LinkedBlockingQueue())
val executor = ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS, LinkedBlockingQueue())
executor.allowCoreThreadTimeOut(true)
return executor
}
}