mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-25 01:07:47 +00:00
Merge pull request #268 from loki-project/onion-requests
File Server & Open Group Onion Requests
This commit is contained in:
commit
d4e6e5750c
@ -84,8 +84,9 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
private static final int lokiV8 = 29;
|
private static final int lokiV8 = 29;
|
||||||
private static final int lokiV9 = 30;
|
private static final int lokiV9 = 30;
|
||||||
private static final int lokiV10 = 31;
|
private static final int lokiV10 = 31;
|
||||||
|
private static final int lokiV11 = 32;
|
||||||
|
|
||||||
private static final int DATABASE_VERSION = lokiV10; // Loki - onUpgrade(...) must be updated to use Loki version numbers if Signal makes any database changes
|
private static final int DATABASE_VERSION = lokiV11; // Loki - onUpgrade(...) must be updated to use Loki version numbers if Signal makes any database changes
|
||||||
private static final String DATABASE_NAME = "signal.db";
|
private static final String DATABASE_NAME = "signal.db";
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@ -146,6 +147,7 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
db.execSQL(LokiAPIDatabase.getCreateSessionRequestTimestampCacheCommand());
|
db.execSQL(LokiAPIDatabase.getCreateSessionRequestTimestampCacheCommand());
|
||||||
db.execSQL(LokiAPIDatabase.getCreateSessionRequestSentTimestampCacheCommand());
|
db.execSQL(LokiAPIDatabase.getCreateSessionRequestSentTimestampCacheCommand());
|
||||||
db.execSQL(LokiAPIDatabase.getCreateSessionRequestProcessedTimestampCacheCommand());
|
db.execSQL(LokiAPIDatabase.getCreateSessionRequestProcessedTimestampCacheCommand());
|
||||||
|
db.execSQL(LokiAPIDatabase.getCreateOpenGroupPublicKeyDBCommand());
|
||||||
db.execSQL(LokiPreKeyBundleDatabase.getCreateTableCommand());
|
db.execSQL(LokiPreKeyBundleDatabase.getCreateTableCommand());
|
||||||
db.execSQL(LokiPreKeyRecordDatabase.getCreateTableCommand());
|
db.execSQL(LokiPreKeyRecordDatabase.getCreateTableCommand());
|
||||||
db.execSQL(LokiMessageDatabase.getCreateMessageIDTableCommand());
|
db.execSQL(LokiMessageDatabase.getCreateMessageIDTableCommand());
|
||||||
@ -597,6 +599,10 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
|
|||||||
db.execSQL(LokiAPIDatabase.getCreateSessionRequestProcessedTimestampCacheCommand());
|
db.execSQL(LokiAPIDatabase.getCreateSessionRequestProcessedTimestampCacheCommand());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (oldVersion < lokiV11) {
|
||||||
|
db.execSQL(LokiAPIDatabase.getCreateOpenGroupPublicKeyDBCommand());
|
||||||
|
}
|
||||||
|
|
||||||
db.setTransactionSuccessful();
|
db.setTransactionSuccessful();
|
||||||
} finally {
|
} finally {
|
||||||
db.endTransaction();
|
db.endTransaction();
|
||||||
|
@ -14,8 +14,8 @@ class PushNotificationService : FirebaseMessagingService() {
|
|||||||
override fun onNewToken(token: String) {
|
override fun onNewToken(token: String) {
|
||||||
super.onNewToken(token)
|
super.onNewToken(token)
|
||||||
Log.d("Loki", "New FCM token: $token.")
|
Log.d("Loki", "New FCM token: $token.")
|
||||||
val userHexEncodedPublicKey = TextSecurePreferences.getLocalNumber(this) ?: return
|
val userPublicKey = TextSecurePreferences.getLocalNumber(this) ?: return
|
||||||
LokiPushNotificationManager.register(token, userHexEncodedPublicKey, this, false)
|
LokiPushNotificationManager.register(token, userPublicKey, this, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onMessageReceived(message: RemoteMessage) {
|
override fun onMessageReceived(message: RemoteMessage) {
|
||||||
|
@ -79,12 +79,15 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
|
|||||||
// Session request processed timestamp cache
|
// Session request processed timestamp cache
|
||||||
private val sessionRequestProcessedTimestampCache = "session_request_processed_timestamp_cache"
|
private val sessionRequestProcessedTimestampCache = "session_request_processed_timestamp_cache"
|
||||||
@JvmStatic val createSessionRequestProcessedTimestampCacheCommand = "CREATE TABLE $sessionRequestProcessedTimestampCache ($publicKey STRING PRIMARY KEY, $timestamp INTEGER DEFAULT 0);"
|
@JvmStatic val createSessionRequestProcessedTimestampCacheCommand = "CREATE TABLE $sessionRequestProcessedTimestampCache ($publicKey STRING PRIMARY KEY, $timestamp INTEGER DEFAULT 0);"
|
||||||
|
// Open group public keys
|
||||||
|
private val openGroupPublicKeyDB = "open_group_public_keys"
|
||||||
|
@JvmStatic val createOpenGroupPublicKeyDBCommand = "CREATE TABLE $openGroupPublicKeyDB ($server STRING PRIMARY KEY, $publicKey INTEGER DEFAULT 0);"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// region Deprecated
|
// region Deprecated
|
||||||
private val sessionRequestTimestampCache = "session_request_timestamp_cache"
|
private val sessionRequestTimestampCache = "session_request_timestamp_cache"
|
||||||
@JvmStatic val createSessionRequestTimestampCacheCommand = "CREATE TABLE $sessionRequestTimestampCache ($publicKey STRING PRIMARY KEY, $timestamp INTEGER DEFAULT 0);"
|
@JvmStatic val createSessionRequestTimestampCacheCommand = "CREATE TABLE $sessionRequestTimestampCache ($publicKey STRING PRIMARY KEY, $timestamp STRING);"
|
||||||
// endregion
|
// endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,10 +330,10 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
|
|||||||
}?.toInt()
|
}?.toInt()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setUserCount(userCount: Int, group: Long, server: String) {
|
override fun setUserCount(group: Long, server: String, newValue: Int) {
|
||||||
val database = databaseHelper.writableDatabase
|
val database = databaseHelper.writableDatabase
|
||||||
val index = "$server.$group"
|
val index = "$server.$group"
|
||||||
val row = wrap(mapOf(publicChatID to index, Companion.userCount to userCount.toString()))
|
val row = wrap(mapOf(publicChatID to index, Companion.userCount to newValue.toString()))
|
||||||
database.insertOrUpdate(userCountCache, row, "$publicChatID = ?", wrap(index))
|
database.insertOrUpdate(userCountCache, row, "$publicChatID = ?", wrap(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -341,9 +344,9 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
|
|||||||
}?.toLong()
|
}?.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setSessionRequestSentTimestamp(publicKey: String, timestamp: Long) {
|
override fun setSessionRequestSentTimestamp(publicKey: String, newValue: Long) {
|
||||||
val database = databaseHelper.writableDatabase
|
val database = databaseHelper.writableDatabase
|
||||||
val row = wrap(mapOf(LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to timestamp.toString()))
|
val row = wrap(mapOf(LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to newValue.toString()))
|
||||||
database.insertOrUpdate(sessionRequestSentTimestampCache, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey))
|
database.insertOrUpdate(sessionRequestSentTimestampCache, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -354,11 +357,24 @@ class LokiAPIDatabase(context: Context, helper: SQLCipherOpenHelper) : Database(
|
|||||||
}?.toLong()
|
}?.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setSessionRequestProcessedTimestamp(publicKey: String, timestamp: Long) {
|
override fun setSessionRequestProcessedTimestamp(publicKey: String, newValue: Long) {
|
||||||
val database = databaseHelper.writableDatabase
|
val database = databaseHelper.writableDatabase
|
||||||
val row = wrap(mapOf(LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to timestamp.toString()))
|
val row = wrap(mapOf(LokiAPIDatabase.publicKey to publicKey, LokiAPIDatabase.timestamp to newValue.toString()))
|
||||||
database.insertOrUpdate(sessionRequestProcessedTimestampCache, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey))
|
database.insertOrUpdate(sessionRequestProcessedTimestampCache, row, "${LokiAPIDatabase.publicKey} = ?", wrap(publicKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getOpenGroupPublicKey(server: String): String? {
|
||||||
|
val database = databaseHelper.readableDatabase
|
||||||
|
return database.get(openGroupPublicKeyDB, "${LokiAPIDatabase.server} = ?", wrap(server)) { cursor ->
|
||||||
|
cursor.getString(LokiAPIDatabase.publicKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setOpenGroupPublicKey(server: String, newValue: String) {
|
||||||
|
val database = databaseHelper.writableDatabase
|
||||||
|
val row = wrap(mapOf(LokiAPIDatabase.server to server, LokiAPIDatabase.publicKey to publicKey))
|
||||||
|
database.insertOrUpdate(openGroupPublicKeyDB, row, "${LokiAPIDatabase.server} = ?", wrap(server))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// region Convenience
|
// region Convenience
|
||||||
|
@ -1,76 +0,0 @@
|
|||||||
package org.thoughtcrime.securesms.loki.shelved
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.os.Handler
|
|
||||||
import android.text.Html
|
|
||||||
import android.util.Log
|
|
||||||
import com.prof.rssparser.engine.XMLParser
|
|
||||||
import kotlinx.coroutines.Job
|
|
||||||
import kotlinx.coroutines.Runnable
|
|
||||||
import org.thoughtcrime.securesms.jobs.PushDecryptJob
|
|
||||||
import org.thoughtcrime.securesms.loki.utilities.successBackground
|
|
||||||
import org.whispersystems.libsignal.util.guava.Optional
|
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceContent
|
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage
|
|
||||||
import org.whispersystems.signalservice.api.messages.SignalServiceGroup
|
|
||||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress
|
|
||||||
import org.whispersystems.signalservice.loki.api.shelved.rssfeeds.LokiRSSFeed
|
|
||||||
import org.whispersystems.signalservice.loki.api.shelved.rssfeeds.LokiRSSFeedProxy
|
|
||||||
import java.text.SimpleDateFormat
|
|
||||||
import java.util.regex.Pattern
|
|
||||||
|
|
||||||
class LokiRSSFeedPoller(private val context: Context, private val feed: LokiRSSFeed) {
|
|
||||||
private val handler = Handler()
|
|
||||||
private val job = Job()
|
|
||||||
private var hasStarted = false
|
|
||||||
|
|
||||||
private val task = object : Runnable {
|
|
||||||
|
|
||||||
override fun run() {
|
|
||||||
poll()
|
|
||||||
handler.postDelayed(this, interval)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
private val interval: Long = 8 * 60 * 1000
|
|
||||||
}
|
|
||||||
|
|
||||||
fun startIfNeeded() {
|
|
||||||
if (hasStarted) return
|
|
||||||
task.run()
|
|
||||||
hasStarted = true
|
|
||||||
}
|
|
||||||
|
|
||||||
fun stop() {
|
|
||||||
handler.removeCallbacks(task)
|
|
||||||
job.cancel()
|
|
||||||
hasStarted = false
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun poll() {
|
|
||||||
LokiRSSFeedProxy.fetch(feed.url).successBackground { xml ->
|
|
||||||
val items = XMLParser(xml).call()
|
|
||||||
items.reversed().forEach { item ->
|
|
||||||
val title = item.title ?: return@forEach
|
|
||||||
val description = item.description ?: return@forEach
|
|
||||||
val dateAsString = item.pubDate ?: return@forEach
|
|
||||||
val formatter = SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z") // e.g. Tue, 27 Aug 2019 03:52:05 +0000
|
|
||||||
val date = formatter.parse(dateAsString)
|
|
||||||
val timestamp = date.time
|
|
||||||
var bodyAsHTML = "$title<br>$description"
|
|
||||||
val urlRegex = Pattern.compile("<a\\s+(?:[^>]*?\\s+)?href=\"([^\"]*)\".*?>(.*?)<.*?\\/a>")
|
|
||||||
val matcher = urlRegex.matcher(bodyAsHTML)
|
|
||||||
bodyAsHTML = matcher.replaceAll("$2 ($1)")
|
|
||||||
val body = Html.fromHtml(bodyAsHTML).toString().trim()
|
|
||||||
val id = feed.id.toByteArray()
|
|
||||||
val x1 = SignalServiceGroup(SignalServiceGroup.Type.UPDATE, id, SignalServiceGroup.GroupType.RSS_FEED, null, null, null, null)
|
|
||||||
val x2 = SignalServiceDataMessage(timestamp, x1, null, body)
|
|
||||||
val x3 = SignalServiceContent(x2, "Loki", SignalServiceAddress.DEFAULT_DEVICE_ID, timestamp, false, false)
|
|
||||||
PushDecryptJob(context).handleTextMessage(x3, x2, Optional.absent(), Optional.absent())
|
|
||||||
}
|
|
||||||
}.fail { exception ->
|
|
||||||
Log.d("Loki", "Couldn't update RSS feed with ID: $feed.id due to exception: $exception.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user