session-android/src/org/thoughtcrime/securesms/loki/activities/LandingActivity.kt

154 lines
7.5 KiB
Kotlin
Raw Normal View History

2020-05-11 08:19:26 +02:00
package org.thoughtcrime.securesms.loki.activities
2019-12-16 11:43:08 +01:00
import android.content.Intent
import android.os.AsyncTask
2019-12-16 11:43:08 +01:00
import android.os.Bundle
import android.widget.Toast
2019-12-16 11:43:08 +01:00
import kotlinx.android.synthetic.main.activity_landing.*
import network.loki.messenger.R
import org.thoughtcrime.securesms.ApplicationContext
2019-12-16 11:43:08 +01:00
import org.thoughtcrime.securesms.BaseActionBarActivity
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.database.Address
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.IdentityDatabase
import org.thoughtcrime.securesms.logging.Log
2020-05-11 08:19:26 +02:00
import org.thoughtcrime.securesms.loki.dialogs.LinkDeviceSlaveModeDialog
import org.thoughtcrime.securesms.loki.dialogs.LinkDeviceSlaveModeDialogDelegate
2020-07-15 06:26:20 +02:00
import org.thoughtcrime.securesms.loki.protocol.SessionResetImplementation
2020-08-07 01:20:22 +02:00
import org.thoughtcrime.securesms.loki.protocol.shelved.MultiDeviceProtocol
2020-05-11 08:19:26 +02:00
import org.thoughtcrime.securesms.loki.utilities.push
import org.thoughtcrime.securesms.loki.utilities.setUpActionBarSessionLogo
import org.thoughtcrime.securesms.loki.utilities.show
import org.thoughtcrime.securesms.util.Base64
import org.thoughtcrime.securesms.util.Hex
import org.thoughtcrime.securesms.util.TextSecurePreferences
import org.whispersystems.curve25519.Curve25519
import org.whispersystems.libsignal.ecc.Curve
import org.whispersystems.libsignal.ecc.ECKeyPair
import org.whispersystems.libsignal.util.KeyHelper
2020-05-14 04:11:42 +02:00
import org.whispersystems.signalservice.loki.protocol.mentions.MentionsManager
import org.whispersystems.signalservice.loki.protocol.meta.SessionMetaProtocol
2020-08-04 07:33:37 +02:00
import org.whispersystems.signalservice.loki.protocol.shelved.multidevice.DeviceLink
2020-05-14 04:11:42 +02:00
import org.whispersystems.signalservice.loki.protocol.sessionmanagement.SessionManagementProtocol
2020-08-04 07:33:37 +02:00
import org.whispersystems.signalservice.loki.protocol.shelved.syncmessages.SyncMessagesProtocol
import org.whispersystems.signalservice.loki.utilities.hexEncodedPublicKey
import org.whispersystems.signalservice.loki.utilities.retryIfNeeded
2019-12-16 11:43:08 +01:00
class LandingActivity : BaseActionBarActivity(), LinkDeviceSlaveModeDialogDelegate {
2019-12-16 11:43:08 +01:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_landing)
2020-09-18 08:54:40 +02:00
setUpActionBarSessionLogo(true)
2019-12-16 16:20:48 +01:00
fakeChatView.startAnimating()
2019-12-16 11:43:08 +01:00
registerButton.setOnClickListener { register() }
restoreButton.setOnClickListener { restore() }
2020-10-20 06:39:01 +02:00
restoreBackupButton.setOnClickListener {
val intent = Intent(this, BackupRestoreActivity::class.java)
push(intent)
}
2020-07-30 08:53:34 +02:00
// linkButton.setOnClickListener { linkDevice() }
2020-05-13 04:29:31 +02:00
if (TextSecurePreferences.getWasUnlinked(this)) {
2020-05-25 07:24:55 +02:00
Toast.makeText(this, R.string.activity_landing_device_unlinked_dialog_title, Toast.LENGTH_LONG).show()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, intent)
if (resultCode != RESULT_OK) { return }
val hexEncodedPublicKey = data!!.getStringExtra("hexEncodedPublicKey")
requestDeviceLink(hexEncodedPublicKey)
2019-12-16 11:43:08 +01:00
}
private fun register() {
val intent = Intent(this, RegisterActivity::class.java)
2019-12-17 15:15:13 +01:00
push(intent)
2019-12-16 11:43:08 +01:00
}
private fun restore() {
val intent = Intent(this, RestoreActivity::class.java)
2019-12-17 15:15:13 +01:00
push(intent)
2019-12-16 11:43:08 +01:00
}
private fun linkDevice() {
val intent = Intent(this, LinkDeviceActivity::class.java)
show(intent, true)
}
private fun requestDeviceLink(hexEncodedPublicKey: String) {
var seed: ByteArray? = null
var keyPair: ECKeyPair? = null
fun generateKeyPair() {
val seedCandidate = Curve25519.getInstance(Curve25519.BEST).generateSeed(16)
try {
keyPair = Curve.generateKeyPair(seedCandidate + seedCandidate) // Validate the seed
} catch (exception: Exception) {
return generateKeyPair()
}
seed = seedCandidate
}
generateKeyPair()
2020-10-29 05:03:51 +01:00
IdentityKeyUtil.save(this, IdentityKeyUtil.LOKI_SEED, Hex.toStringCondensed(seed))
IdentityKeyUtil.save(this, IdentityKeyUtil.IDENTITY_PUBLIC_KEY_PREF, Base64.encodeBytes(keyPair!!.publicKey.serialize()))
IdentityKeyUtil.save(this, IdentityKeyUtil.IDENTITY_PRIVATE_KEY_PREF, Base64.encodeBytes(keyPair!!.privateKey.serialize()))
val userHexEncodedPublicKey = keyPair!!.hexEncodedPublicKey
val registrationID = KeyHelper.generateRegistrationId(false)
TextSecurePreferences.setLocalRegistrationId(this, registrationID)
DatabaseFactory.getIdentityDatabase(this).saveIdentity(Address.fromSerialized(userHexEncodedPublicKey),
IdentityKeyUtil.getIdentityKeyPair(this).publicKey, IdentityDatabase.VerifiedStatus.VERIFIED,
true, System.currentTimeMillis(), true)
TextSecurePreferences.setLocalNumber(this, userHexEncodedPublicKey)
TextSecurePreferences.setHasSeenWelcomeScreen(this, true)
TextSecurePreferences.setPromptedPushRegistration(this, true)
2020-02-13 04:39:29 +01:00
val deviceLink = DeviceLink(hexEncodedPublicKey, userHexEncodedPublicKey).sign(DeviceLink.Type.REQUEST, keyPair!!.privateKey.serialize())
if (deviceLink == null) {
Log.d("Loki", "Failed to sign device link request.")
reset()
2020-05-25 07:24:55 +02:00
return Toast.makeText(application, R.string.device_linking_failed, Toast.LENGTH_LONG).show()
}
val application = ApplicationContext.getInstance(this)
2020-03-24 03:48:23 +01:00
application.startPollingIfNeeded()
2020-05-14 04:11:42 +02:00
val apiDB = DatabaseFactory.getLokiAPIDatabase(this)
val threadDB = DatabaseFactory.getLokiThreadDatabase(this)
val userDB = DatabaseFactory.getLokiUserDatabase(this)
val sskDatabase = DatabaseFactory.getSSKDatabase(this)
2020-05-14 04:11:42 +02:00
val userPublicKey = TextSecurePreferences.getLocalNumber(this)
2020-07-15 06:26:20 +02:00
val sessionResetImpl = SessionResetImplementation(this)
2020-05-14 04:11:42 +02:00
MentionsManager.configureIfNeeded(userPublicKey, threadDB, userDB)
SessionMetaProtocol.configureIfNeeded(apiDB, userPublicKey)
2020-08-04 07:33:37 +02:00
org.whispersystems.signalservice.loki.protocol.shelved.multidevice.MultiDeviceProtocol.configureIfNeeded(apiDB)
SessionManagementProtocol.configureIfNeeded(sessionResetImpl, sskDatabase, application)
2020-05-14 04:11:42 +02:00
SyncMessagesProtocol.configureIfNeeded(apiDB, userPublicKey)
2020-05-14 01:35:34 +02:00
application.setUpP2PAPIIfNeeded()
application.setUpStorageAPIIfNeeded()
val linkDeviceDialog = LinkDeviceSlaveModeDialog()
linkDeviceDialog.delegate = this
linkDeviceDialog.show(supportFragmentManager, "Link Device Dialog")
AsyncTask.execute {
retryIfNeeded(8) {
2020-07-15 04:24:43 +02:00
MultiDeviceProtocol.sendDeviceLinkMessage(this@LandingActivity, deviceLink.masterPublicKey, deviceLink)
}
}
}
2020-02-12 02:26:27 +01:00
override fun onDeviceLinkRequestAuthorized(deviceLink: DeviceLink) {
2020-07-15 04:24:43 +02:00
TextSecurePreferences.setMasterHexEncodedPublicKey(this, deviceLink.masterPublicKey)
val intent = Intent(this, HomeActivity::class.java)
show(intent)
finish()
}
override fun onDeviceLinkCanceled() {
reset()
}
private fun reset() {
2020-10-29 05:03:51 +01:00
IdentityKeyUtil.delete(this, IdentityKeyUtil.LOKI_SEED)
TextSecurePreferences.removeLocalNumber(this)
TextSecurePreferences.setHasSeenWelcomeScreen(this, false)
TextSecurePreferences.setPromptedPushRegistration(this, false)
val application = ApplicationContext.getInstance(this)
2020-07-08 02:48:09 +02:00
application.stopPolling()
}
2019-12-16 11:43:08 +01:00
}