Skip to content

Commit 9ec5de1

Browse files
committed
Cannot resend the same intent (security issue when sharing)
1 parent 830fcbb commit 9ec5de1

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

vector/src/main/java/im/vector/app/features/MainActivity.kt

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ class MainActivity : VectorBaseActivity<ActivityMainBinding>(), UnlockedActivity
8383
companion object {
8484
private const val EXTRA_ARGS = "EXTRA_ARGS"
8585
private const val EXTRA_NEXT_INTENT = "EXTRA_NEXT_INTENT"
86+
private const val EXTRA_INIT_SESSION = "EXTRA_INIT_SESSION"
8687

8788
// Special action to clear cache and/or clear credentials
8889
fun restartApp(activity: Activity, args: MainActivityArgs) {
@@ -93,6 +94,12 @@ class MainActivity : VectorBaseActivity<ActivityMainBinding>(), UnlockedActivity
9394
activity.startActivity(intent)
9495
}
9596

97+
fun getIntentToInitSession(activity: Activity): Intent {
98+
val intent = Intent(activity, MainActivity::class.java)
99+
intent.putExtra(EXTRA_INIT_SESSION, true)
100+
return intent
101+
}
102+
96103
fun getIntentWithNextIntent(context: Context, nextIntent: Intent): Intent {
97104
val intent = Intent(context, MainActivity::class.java)
98105
intent.putExtra(EXTRA_NEXT_INTENT, nextIntent)
@@ -151,6 +158,9 @@ class MainActivity : VectorBaseActivity<ActivityMainBinding>(), UnlockedActivity
151158
// Start the next Activity
152159
val nextIntent = intent.getParcelableExtra<Intent>(EXTRA_NEXT_INTENT)
153160
startIntentAndFinish(nextIntent)
161+
} else if (intent.hasExtra(EXTRA_INIT_SESSION)) {
162+
setResult(RESULT_OK)
163+
finish()
154164
} else {
155165
args = parseArgs()
156166
if (args.clearCredentials || args.isUserLoggedOut || args.clearCache) {

vector/src/main/java/im/vector/app/features/link/LinkHandlerActivity.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import dagger.hilt.android.AndroidEntryPoint
2626
import im.vector.app.R
2727
import im.vector.app.core.di.ActiveSessionHolder
2828
import im.vector.app.core.error.ErrorFormatter
29+
import im.vector.app.core.extensions.registerStartForActivityResult
2930
import im.vector.app.core.platform.VectorBaseActivity
3031
import im.vector.app.core.utils.toast
3132
import im.vector.app.databinding.ActivityProgressBinding
@@ -57,13 +58,20 @@ class LinkHandlerActivity : VectorBaseActivity<ActivityProgressBinding>() {
5758
handleIntent()
5859
}
5960

61+
private val launcher = registerStartForActivityResult {
62+
if (it.resultCode == RESULT_OK) {
63+
handleIntent()
64+
} else {
65+
// User has pressed back on the MainActivity, so finish also this one.
66+
finish()
67+
}
68+
}
69+
6070
override fun onCreate(savedInstanceState: Bundle?) {
6171
super.onCreate(savedInstanceState)
6272

6373
if (startAppViewModel.shouldStartApp()) {
64-
// Start MainActivity, providing current Intent has next intent
65-
startActivity(MainActivity.getIntentWithNextIntent(this, intent))
66-
finish()
74+
launcher.launch(MainActivity.getIntentToInitSession(this))
6775
} else {
6876
handleIntent()
6977
}

vector/src/main/java/im/vector/app/features/share/IncomingShareActivity.kt

+11-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import com.airbnb.mvrx.viewModel
2222
import dagger.hilt.android.AndroidEntryPoint
2323
import im.vector.app.core.di.ActiveSessionHolder
2424
import im.vector.app.core.extensions.addFragment
25+
import im.vector.app.core.extensions.registerStartForActivityResult
2526
import im.vector.app.core.platform.VectorBaseActivity
2627
import im.vector.app.databinding.ActivitySimpleBinding
2728
import im.vector.app.features.MainActivity
@@ -35,13 +36,20 @@ class IncomingShareActivity : VectorBaseActivity<ActivitySimpleBinding>() {
3536

3637
@Inject lateinit var activeSessionHolder: ActiveSessionHolder
3738

39+
private val launcher = registerStartForActivityResult {
40+
if (it.resultCode == RESULT_OK) {
41+
handleAppStarted()
42+
} else {
43+
// User has pressed back on the MainActivity, so finish also this one.
44+
finish()
45+
}
46+
}
47+
3848
override fun onCreate(savedInstanceState: Bundle?) {
3949
super.onCreate(savedInstanceState)
4050

4151
if (startAppViewModel.shouldStartApp()) {
42-
// Start MainActivity, providing current Intent has next intent
43-
startActivity(MainActivity.getIntentWithNextIntent(this, intent))
44-
finish()
52+
launcher.launch(MainActivity.getIntentToInitSession(this))
4553
} else {
4654
handleAppStarted()
4755
}

0 commit comments

Comments
 (0)