From c53a5d8a2247b4ba6b1cb79e6f587e91cf370742 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mickae=CC=88l=20Menu?= Date: Tue, 29 Nov 2022 18:58:14 +0100 Subject: [PATCH 1/3] Allow to bypass the selection protection with LCP --- .../r2/navigator/epub/EpubNavigatorFragment.kt | 14 +++++++++++++- .../r2/navigator/epub/EpubNavigatorViewModel.kt | 6 +++++- .../org/readium/r2/navigator/epub/HtmlInjector.kt | 4 ++-- .../org/readium/r2/navigator/epub/WebViewServer.kt | 7 ++++++- 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt index f92c7df883..01378b61f5 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorFragment.kt @@ -66,6 +66,7 @@ import org.readium.r2.shared.publication.Link import org.readium.r2.shared.publication.Locator import org.readium.r2.shared.publication.Publication import org.readium.r2.shared.publication.ReadingProgression as PublicationReadingProgression +import org.readium.r2.shared.InternalReadiumApi import org.readium.r2.shared.publication.epub.EpubLayout import org.readium.r2.shared.publication.presentation.presentation import org.readium.r2.shared.publication.services.isRestricted @@ -154,7 +155,18 @@ class EpubNavigatorFragment internal constructor( */ val shouldApplyInsetsPadding: Boolean? = true, - internal val javascriptInterfaces: MutableMap = mutableMapOf() + internal val javascriptInterfaces: MutableMap = mutableMapOf(), + + /** + * Disable user selection if the publication is protected by a DRM (e.g. with LCP). + * + * WARNING: If you choose to disable this, you MUST remove the Copy and Share selection + * menu items in your app. Otherwise, you will void the EDRLab certification for your + * application. If you need help, follow up on: + * https://github.com/readium/kotlin-toolkit/issues/299#issuecomment-1315643577 + */ + @InternalReadiumApi + val disableSelectionWhenProtected: Boolean = true ) { /** * Registers a new factory for the [JavascriptInterface] named [name]. diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt index 22db459060..47796fb335 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/EpubNavigatorViewModel.kt @@ -386,7 +386,11 @@ internal class EpubNavigatorViewModel( defaults = defaults, baseUrl = baseUrl, server = if (baseUrl != null) null - else WebViewServer(application, publication, servedAssets = config.servedAssets) + else WebViewServer( + application, publication, + servedAssets = config.servedAssets, + disableSelectionWhenProtected = config.disableSelectionWhenProtected + ) ) } } diff --git a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt index 254ceb1930..e6943f8ee1 100644 --- a/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt +++ b/readium/navigator/src/main/java/org/readium/r2/navigator/epub/HtmlInjector.kt @@ -22,7 +22,7 @@ import timber.log.Timber * @param baseHref Base URL where the Readium CSS and scripts are served. */ @OptIn(ExperimentalReadiumApi::class) -internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, baseHref: String): Resource = +internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, baseHref: String, disableSelectionWhenProtected: Boolean): Resource = TransformingResource(this) { bytes -> val link = link() check(link.mediaType.isHtml) @@ -40,7 +40,7 @@ internal fun Resource.injectHtml(publication: Publication, css: ReadiumCss, base // Disable the text selection if the publication is protected. // FIXME: This is a hack until proper LCP copy is implemented, see https://github.com/readium/kotlin-toolkit/issues/221 - if (publication.isProtected) { + if (disableSelectionWhenProtected && publication.isProtected) { injectables.add( """