1
0
Fork 0

For #4686: Fix potential security issue (#4764)

master
Colin Lee 2019-08-16 16:50:54 -05:00 committed by GitHub
parent 727457f0ed
commit d1aed157dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 76 additions and 43 deletions

View File

@ -160,7 +160,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } }, findInPageLauncher = { findInPageIntegration.withFeature { it.launch() } },
nestedScrollQuickActionView = nestedScrollQuickAction, nestedScrollQuickActionView = nestedScrollQuickAction,
engineView = engineView, engineView = engineView,
currentSession = session, customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) },
viewModel = viewModel, viewModel = viewModel,
getSupportUrl = { getSupportUrl = {
SupportUtils.getSumoURLForTopic( SupportUtils.getSumoURLForTopic(
@ -177,12 +177,14 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
) )
browserInteractor = browserInteractor =
createBrowserToolbarViewInteractor(browserToolbarController, session) createBrowserToolbarViewInteractor(
browserToolbarController,
customTabSessionId?.let { sessionManager.findSessionById(it) })
browserToolbarView = BrowserToolbarView( browserToolbarView = BrowserToolbarView(
container = view.browserLayout, container = view.browserLayout,
interactor = browserInteractor, interactor = browserInteractor,
currentSession = session customTabSession = customTabSessionId?.let { sessionManager.findSessionById(it) }
) )
toolbarIntegration.set( toolbarIntegration.set(
@ -476,7 +478,7 @@ abstract class BaseBrowserFragment : Fragment(), BackHandler, SessionManager.Obs
protected abstract fun createBrowserToolbarViewInteractor( protected abstract fun createBrowserToolbarViewInteractor(
browserToolbarController: BrowserToolbarController, browserToolbarController: BrowserToolbarController,
session: Session session: Session?
): BrowserInteractor ): BrowserInteractor
/** /**

View File

@ -192,7 +192,7 @@ class BrowserFragment : BaseBrowserFragment(), BackHandler {
override fun createBrowserToolbarViewInteractor( override fun createBrowserToolbarViewInteractor(
browserToolbarController: BrowserToolbarController, browserToolbarController: BrowserToolbarController,
session: Session session: Session?
) = BrowserInteractor( ) = BrowserInteractor(
context = context!!, context = context!!,
store = browserStore, store = browserStore,
@ -208,7 +208,7 @@ class BrowserFragment : BaseBrowserFragment(), BackHandler {
} }
), ),
readerModeController = DefaultReaderModeController(readerViewFeature), readerModeController = DefaultReaderModeController(readerViewFeature),
currentSession = session customTabSession = customTabSessionId?.let { requireComponents.core.sessionManager.findSessionById(it) }
) )
override fun getEngineMargins(): Pair<Int, Int> { override fun getEngineMargins(): Pair<Int, Int> {

View File

@ -8,6 +8,7 @@ import android.content.Context
import mozilla.components.browser.session.Session import mozilla.components.browser.session.Session
import org.mozilla.fenix.browser.readermode.ReaderModeController import org.mozilla.fenix.browser.readermode.ReaderModeController
import org.mozilla.fenix.components.metrics.Event import org.mozilla.fenix.components.metrics.Event
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.metrics import org.mozilla.fenix.ext.metrics
import org.mozilla.fenix.quickactionsheet.QuickActionSheetController import org.mozilla.fenix.quickactionsheet.QuickActionSheetController
import org.mozilla.fenix.quickactionsheet.QuickActionSheetViewInteractor import org.mozilla.fenix.quickactionsheet.QuickActionSheetViewInteractor
@ -18,7 +19,7 @@ class BrowserInteractor(
private val browserToolbarController: BrowserToolbarController, private val browserToolbarController: BrowserToolbarController,
private val quickActionSheetController: QuickActionSheetController, private val quickActionSheetController: QuickActionSheetController,
private val readerModeController: ReaderModeController, private val readerModeController: ReaderModeController,
private val currentSession: Session private val customTabSession: Session?
) : BrowserToolbarViewInteractor, QuickActionSheetViewInteractor { ) : BrowserToolbarViewInteractor, QuickActionSheetViewInteractor {
override fun onBrowserToolbarClicked() { override fun onBrowserToolbarClicked() {
@ -50,7 +51,8 @@ class BrowserInteractor(
} }
override fun onQuickActionSheetReadPressed() { override fun onQuickActionSheetReadPressed() {
val enabled = currentSession.readerMode val enabled =
customTabSession?.readerMode ?: context.components.core.sessionManager.selectedSession?.readerMode ?: false
if (enabled) { if (enabled) {
context.metrics.track(Event.QuickActionSheetClosed) context.metrics.track(Event.QuickActionSheetClosed)

View File

@ -43,7 +43,7 @@ class DefaultBrowserToolbarController(
private val findInPageLauncher: () -> Unit, private val findInPageLauncher: () -> Unit,
private val nestedScrollQuickActionView: NestedScrollView, private val nestedScrollQuickActionView: NestedScrollView,
private val engineView: EngineView, private val engineView: EngineView,
private val currentSession: Session, private val customTabSession: Session?,
private val viewModel: CreateCollectionViewModel, private val viewModel: CreateCollectionViewModel,
private val getSupportUrl: () -> String, private val getSupportUrl: () -> String,
private val openInFenixIntent: Intent, private val openInFenixIntent: Intent,
@ -58,7 +58,7 @@ class DefaultBrowserToolbarController(
navController.nav( navController.nav(
R.id.browserFragment, R.id.browserFragment,
BrowserFragmentDirections.actionBrowserFragmentToSearchFragment( BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(
currentSession.id customTabSession?.id
) )
) )
} }
@ -69,6 +69,7 @@ class DefaultBrowserToolbarController(
override fun handleToolbarItemInteraction(item: ToolbarMenu.Item) { override fun handleToolbarItemInteraction(item: ToolbarMenu.Item) {
val sessionUseCases = context.components.useCases.sessionUseCases val sessionUseCases = context.components.useCases.sessionUseCases
trackToolbarItemInteraction(item) trackToolbarItemInteraction(item)
val currentSession = customTabSession ?: context.components.core.sessionManager.selectedSession
Do exhaustive when (item) { Do exhaustive when (item) {
ToolbarMenu.Item.Back -> sessionUseCases.goBack.invoke(currentSession) ToolbarMenu.Item.Back -> sessionUseCases.goBack.invoke(currentSession)
@ -88,7 +89,8 @@ class DefaultBrowserToolbarController(
currentSession currentSession
) )
ToolbarMenu.Item.Share -> { ToolbarMenu.Item.Share -> {
currentSession.url.apply { val currentUrl = currentSession?.url
currentUrl?.apply {
val directions = BrowserFragmentDirections.actionBrowserFragmentToShareFragment(this) val directions = BrowserFragmentDirections.actionBrowserFragmentToShareFragment(this)
navController.nav(R.id.browserFragment, directions) navController.nav(R.id.browserFragment, directions)
} }
@ -109,7 +111,8 @@ class DefaultBrowserToolbarController(
context.components.analytics.metrics.track(Event.FindInPageOpened) context.components.analytics.metrics.track(Event.FindInPageOpened)
} }
ToolbarMenu.Item.ReportIssue -> { ToolbarMenu.Item.ReportIssue -> {
currentSession.url.apply { val currentUrl = currentSession?.url
currentUrl?.apply {
val reportUrl = String.format(BrowserFragment.REPORT_SITE_ISSUE_URL, this) val reportUrl = String.format(BrowserFragment.REPORT_SITE_ISSUE_URL, this)
context.components.useCases.tabsUseCases.addTab.invoke(reportUrl) context.components.useCases.tabsUseCases.addTab.invoke(reportUrl)
} }
@ -121,25 +124,25 @@ class DefaultBrowserToolbarController(
context.components.analytics.metrics context.components.analytics.metrics
.track(Event.CollectionSaveButtonPressed(TELEMETRY_BROWSER_IDENTIFIER)) .track(Event.CollectionSaveButtonPressed(TELEMETRY_BROWSER_IDENTIFIER))
viewModel.tabs = listOf(currentSessionAsTab) viewModel.tabs = listOf(currentSessionAsTab)
val selectedSet = mutableSetOf(currentSessionAsTab) val selectedSet = mutableSetOf(currentSessionAsTab)
viewModel.selectedTabs = selectedSet viewModel.selectedTabs = selectedSet
viewModel.tabCollections = viewModel.tabCollections =
context.components.core.tabCollectionStorage.cachedTabCollections.reversed() context.components.core.tabCollectionStorage.cachedTabCollections.reversed()
viewModel.saveCollectionStep = viewModel.tabCollections.getStepForCollectionsSize() viewModel.saveCollectionStep = viewModel.tabCollections.getStepForCollectionsSize()
viewModel.snackbarAnchorView = nestedScrollQuickActionView viewModel.snackbarAnchorView = nestedScrollQuickActionView
viewModel.previousFragmentId = R.id.browserFragment viewModel.previousFragmentId = R.id.browserFragment
val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment() val directions = BrowserFragmentDirections.actionBrowserFragmentToCreateCollectionFragment()
navController.nav(R.id.browserFragment, directions) navController.nav(R.id.browserFragment, directions)
} }
ToolbarMenu.Item.OpenInFenix -> { ToolbarMenu.Item.OpenInFenix -> {
// Release the session from this view so that it can immediately be rendered by a different view // Release the session from this view so that it can immediately be rendered by a different view
engineView.release() engineView.release()
// Strip the CustomTabConfig to turn this Session into a regular tab and then select it // Strip the CustomTabConfig to turn this Session into a regular tab and then select it
currentSession.customTabConfig = null customTabSession!!.customTabConfig = null
context.components.core.sessionManager.select(currentSession) context.components.core.sessionManager.select(customTabSession)
// Switch to the actual browser which should now display our new selected session // Switch to the actual browser which should now display our new selected session
context.startActivity(openInFenixIntent) context.startActivity(openInFenixIntent)

View File

@ -23,7 +23,7 @@ interface BrowserToolbarViewInteractor {
class BrowserToolbarView( class BrowserToolbarView(
private val container: ViewGroup, private val container: ViewGroup,
private val interactor: BrowserToolbarViewInteractor, private val interactor: BrowserToolbarViewInteractor,
private val currentSession: Session private val customTabSession: Session?
) : LayoutContainer { ) : LayoutContainer {
override val containerView: View? override val containerView: View?
@ -41,7 +41,7 @@ class BrowserToolbarView(
init { init {
with(container.context) { with(container.context) {
val sessionManager = components.core.sessionManager val sessionManager = components.core.sessionManager
val isCustomTabSession = currentSession.isCustomTabSession() val isCustomTabSession = customTabSession != null
view.apply { view.apply {
elevation = TOOLBAR_ELEVATION.dpToFloat(resources.displayMetrics) elevation = TOOLBAR_ELEVATION.dpToFloat(resources.displayMetrics)
@ -80,7 +80,7 @@ class BrowserToolbarView(
CustomTabToolbarMenu( CustomTabToolbarMenu(
this, this,
sessionManager, sessionManager,
currentSession.id, customTabSession?.id,
onItemTapped = { onItemTapped = {
interactor.onBrowserToolbarMenuItemTapped(it) interactor.onBrowserToolbarMenuItemTapped(it)
} }
@ -89,7 +89,9 @@ class BrowserToolbarView(
DefaultToolbarMenu( DefaultToolbarMenu(
this, this,
hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(), hasAccountProblem = components.backgroundServices.accountManager.accountNeedsReauth(),
requestDesktopStateProvider = { currentSession.desktopMode }, requestDesktopStateProvider = {
sessionManager.selectedSession?.private ?: false
},
onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) } onItemTapped = { interactor.onBrowserToolbarMenuItemTapped(it) }
) )
} }
@ -102,8 +104,8 @@ class BrowserToolbarView(
ShippedDomainsProvider().also { it.initialize(this) }, ShippedDomainsProvider().also { it.initialize(this) },
components.core.historyStorage, components.core.historyStorage,
components.core.sessionManager, components.core.sessionManager,
currentSession.id, customTabSession?.id,
currentSession.private customTabSession?.private ?: sessionManager.selectedSession?.private ?: false
) )
} }
} }

View File

@ -69,7 +69,7 @@ class DefaultBrowserToolbarControllerTest {
findInPageLauncher = findInPageLauncher, findInPageLauncher = findInPageLauncher,
nestedScrollQuickActionView = nestedScrollQuickActionView, nestedScrollQuickActionView = nestedScrollQuickActionView,
engineView = engineView, engineView = engineView,
currentSession = currentSession, customTabSession = null,
viewModel = viewModel, viewModel = viewModel,
getSupportUrl = getSupportUrl, getSupportUrl = getSupportUrl,
openInFenixIntent = openInFenixIntent, openInFenixIntent = openInFenixIntent,
@ -80,6 +80,7 @@ class DefaultBrowserToolbarControllerTest {
every { context.components.analytics } returns analytics every { context.components.analytics } returns analytics
every { analytics.metrics } returns metrics every { analytics.metrics } returns metrics
every { context.components.useCases.sessionUseCases } returns sessionUseCases every { context.components.useCases.sessionUseCases } returns sessionUseCases
every { context.components.core.sessionManager.selectedSession } returns currentSession
} }
@Test @Test
@ -89,10 +90,12 @@ class DefaultBrowserToolbarControllerTest {
controller.handleToolbarClick() controller.handleToolbarClick()
verify { metrics.track(Event.SearchBarTapped(Event.SearchBarTapped.Source.BROWSER)) } verify { metrics.track(Event.SearchBarTapped(Event.SearchBarTapped.Source.BROWSER)) }
verify { navController.nav( verify {
R.id.browserFragment, navController.nav(
BrowserFragmentDirections.actionBrowserFragmentToSearchFragment(currentSession.id) R.id.browserFragment,
) } BrowserFragmentDirections.actionBrowserFragmentToSearchFragment("1")
)
}
} }
@Test @Test
@ -144,11 +147,14 @@ class DefaultBrowserToolbarControllerTest {
controller.handleToolbarItemInteraction(item) controller.handleToolbarItemInteraction(item)
verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.SETTINGS)) } verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.SETTINGS)) }
verify { navController.nav( verify {
R.id.settingsFragment, navController.nav(
BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment() R.id.settingsFragment,
) } BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment()
)
}
} }
@Test @Test
fun handleToolbarLibraryPress() { fun handleToolbarLibraryPress() {
val item = ToolbarMenu.Item.Library val item = ToolbarMenu.Item.Library
@ -156,10 +162,12 @@ class DefaultBrowserToolbarControllerTest {
controller.handleToolbarItemInteraction(item) controller.handleToolbarItemInteraction(item)
verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.LIBRARY)) } verify { metrics.track(Event.BrowserMenuItemTapped(Event.BrowserMenuItemTapped.Item.LIBRARY)) }
verify { navController.nav( verify {
R.id.libraryFragment, navController.nav(
BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment() R.id.libraryFragment,
) } BrowserFragmentDirections.actionBrowserFragmentToSettingsFragment()
)
}
} }
@Test @Test
@ -248,6 +256,7 @@ class DefaultBrowserToolbarControllerTest {
val item = ToolbarMenu.Item.ReportIssue val item = ToolbarMenu.Item.ReportIssue
every { currentSession.id } returns "1"
every { currentSession.url } returns "https://mozilla.org" every { currentSession.url } returns "https://mozilla.org"
every { context.components.useCases.tabsUseCases } returns tabsUseCases every { context.components.useCases.tabsUseCases } returns tabsUseCases
every { tabsUseCases.addTab } returns addTabUseCase every { tabsUseCases.addTab } returns addTabUseCase
@ -322,6 +331,21 @@ class DefaultBrowserToolbarControllerTest {
@Test @Test
fun handleToolbarOpenInFenixPress() { fun handleToolbarOpenInFenixPress() {
controller = DefaultBrowserToolbarController(
context = context,
navController = navController,
browsingModeManager = browsingModeManager,
findInPageLauncher = findInPageLauncher,
nestedScrollQuickActionView = nestedScrollQuickActionView,
engineView = engineView,
customTabSession = currentSession,
viewModel = viewModel,
getSupportUrl = getSupportUrl,
openInFenixIntent = openInFenixIntent,
currentSessionAsTab = currentSessionAsTab,
bottomSheetBehavior = bottomSheetBehavior
)
val sessionManager: SessionManager = mockk(relaxed = true) val sessionManager: SessionManager = mockk(relaxed = true)
val item = ToolbarMenu.Item.OpenInFenix val item = ToolbarMenu.Item.OpenInFenix