From 9593e4b5db604957545b4ab6747c82fb815ac08b Mon Sep 17 00:00:00 2001 From: KAZI MMT <82371061+kazimmt@users.noreply.github.com> Date: Sun, 21 May 2023 21:55:10 +0600 Subject: [PATCH] feat(reddit): add `sanitize-sharing-links` patch (#2192) Co-authored-by: oSumAtrIX --- .../SanitizeUrlQueryCompatibility.kt | 8 +++ .../ShareLinkFactoryFingerprint.kt | 22 ++++++++ .../url/patch/SanitizeUrlQueryPatch.kt | 52 +++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/annotations/SanitizeUrlQueryCompatibility.kt create mode 100644 src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFactoryFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/patch/SanitizeUrlQueryPatch.kt diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/annotations/SanitizeUrlQueryCompatibility.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/annotations/SanitizeUrlQueryCompatibility.kt new file mode 100644 index 0000000000..2643ebe874 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/annotations/SanitizeUrlQueryCompatibility.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.reddit.misc.tracking.url.annotations + +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Package + +@Compatibility([Package("com.reddit.frontpage", arrayOf("2023.12.0", "2023.17.1"))]) +@Target(AnnotationTarget.CLASS) +internal annotation class SanitizeUrlQueryCompatibility \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFactoryFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFactoryFingerprint.kt new file mode 100644 index 0000000000..d3268c1b7c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFactoryFingerprint.kt @@ -0,0 +1,22 @@ +package app.revanced.patches.reddit.misc.tracking.url.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags +import org.jf.dexlib2.Opcode + +object ShareLinkFactoryFingerprint : MethodFingerprint( + returnType = "L", + access = AccessFlags.PUBLIC or AccessFlags.FINAL, + opcodes = listOf( + Opcode.CONST_STRING, + Opcode.CONST_STRING, + Opcode.INVOKE_DIRECT, + Opcode.APUT_OBJECT, + Opcode.INVOKE_STATIC, + Opcode.MOVE_RESULT_OBJECT, + Opcode.INVOKE_STATIC, // Returns the URL. + Opcode.MOVE_RESULT_OBJECT + ), + customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("ShareLinkFactory;") } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/patch/SanitizeUrlQueryPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/patch/SanitizeUrlQueryPatch.kt new file mode 100644 index 0000000000..1f494a4019 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/patch/SanitizeUrlQueryPatch.kt @@ -0,0 +1,52 @@ +package app.revanced.patches.reddit.misc.tracking.url.patch + +import app.revanced.extensions.toErrorResult +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Version +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.addInstructions +import app.revanced.patcher.extensions.instruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchResult +import app.revanced.patcher.patch.PatchResultSuccess +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patcher.patch.annotations.RequiresIntegrations +import app.revanced.patches.reddit.misc.tracking.url.annotations.SanitizeUrlQueryCompatibility +import app.revanced.patches.reddit.misc.tracking.url.fingerprints.ShareLinkFactoryFingerprint +import org.jf.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch +@Name("sanitize-sharing-links") +@Description("Removes (tracking) query parameters from the URLs when sharing links.") +@SanitizeUrlQueryCompatibility +@Version("0.0.1") +@RequiresIntegrations +class SanitizeUrlQueryPatch : BytecodePatch( + listOf(ShareLinkFactoryFingerprint) +) { + override fun execute(context: BytecodeContext): PatchResult { + ShareLinkFactoryFingerprint.result?.let { result -> + result.mutableMethod.apply { + val insertIndex = result.scanResult.patternScanResult!!.endIndex + 1 + val urlRegister = instruction(insertIndex - 1).registerA + + addInstructions( + insertIndex, + """ + invoke-static {v$urlRegister}, $SANITIZE_METHOD_DESCRIPTOR + move-result-object v$urlRegister + """ + ) + } + } ?: return ShareLinkFactoryFingerprint.toErrorResult() + + return PatchResultSuccess() + } + + private companion object { + private const val SANITIZE_METHOD_DESCRIPTOR = + "Lapp/revanced/reddit/patches/SanitizeUrlQueryPatch;" + + "->stripQueryParameters(Ljava/lang/String;)Ljava/lang/String;" + } +}