Skip to content

Commit 20c4131

Browse files
authored
feat(Instagram): Add Custom share domain patch (#5998)
1 parent 5ed092b commit 20c4131

File tree

11 files changed

+192
-47
lines changed

11 files changed

+192
-47
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package app.revanced.extension.instagram.misc.share.domain;
2+
3+
import android.net.Uri;
4+
import app.revanced.extension.shared.Logger;
5+
6+
@SuppressWarnings("unused")
7+
public final class ChangeLinkSharingDomainPatch {
8+
9+
private static String getCustomShareDomain() {
10+
// Method is modified during patching.
11+
throw new IllegalStateException();
12+
}
13+
14+
/**
15+
* Injection point.
16+
*/
17+
public static String setCustomShareDomain(String url) {
18+
try {
19+
Uri uri = Uri.parse(url);
20+
Uri.Builder builder = uri
21+
.buildUpon()
22+
.authority(getCustomShareDomain())
23+
.clearQuery();
24+
25+
String patchedUrl = builder.build().toString();
26+
Logger.printInfo(() -> "Domain change from : " + url + " to: " + patchedUrl);
27+
return patchedUrl;
28+
} catch (Exception ex) {
29+
Logger.printException(() -> "setCustomShareDomain failure with " + url, ex);
30+
return url;
31+
}
32+
}
33+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package app.revanced.extension.instagram.misc.share.privacy;
2+
3+
import app.revanced.extension.shared.privacy.LinkSanitizer;
4+
5+
@SuppressWarnings("unused")
6+
public final class SanitizeSharingLinksPatch {
7+
private static final LinkSanitizer sanitizer = new LinkSanitizer("igsh");
8+
9+
/**
10+
* Injection point.
11+
*/
12+
public static String sanitizeSharingLink(String url) {
13+
return sanitizer.sanitizeUrlString(url);
14+
}
15+
}

patches/api/patches.api

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ public final class app/revanced/patches/instagram/misc/privacy/SanitizeSharingLi
292292
public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
293293
}
294294

295+
public final class app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatchKt {
296+
public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
297+
}
298+
299+
public final class app/revanced/patches/instagram/misc/share/privacy/SanitizeSharingLinksPatchKt {
300+
public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
301+
}
302+
295303
public final class app/revanced/patches/instagram/misc/signature/SignatureCheckPatchKt {
296304
public static final fun getSignatureCheckPatch ()Lapp/revanced/patcher/patch/BytecodePatch;
297305
}
Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,12 @@
11
package app.revanced.patches.instagram.misc.privacy
22

3-
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
4-
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
53
import app.revanced.patcher.patch.bytecodePatch
6-
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
7-
import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS
8-
import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS
9-
import app.revanced.util.indexOfFirstInstructionOrThrow
10-
import com.android.tools.smali.dexlib2.Opcode
11-
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
12-
13-
private const val EXTENSION_CLASS_DESCRIPTOR =
14-
"Lapp/revanced/extension/instagram/misc/privacy/SanitizeSharingLinksPatch;"
154

5+
@Deprecated(
6+
"Patch was moved to a different package",
7+
ReplaceWith("app.revanced.patches.instagram.misc.share.privacy.sanitizeSharingLinksPatch")
8+
)
169
@Suppress("unused")
17-
val sanitizeSharingLinksPatch = bytecodePatch(
18-
name = PATCH_NAME_SANITIZE_SHARING_LINKS,
19-
description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS,
20-
) {
21-
compatibleWith("com.instagram.android")
22-
23-
dependsOn(sharedExtensionPatch)
24-
25-
execute {
26-
arrayOf(
27-
permalinkResponseJsonParserFingerprint,
28-
storyUrlResponseJsonParserFingerprint,
29-
profileUrlResponseJsonParserFingerprint,
30-
liveUrlResponseJsonParserFingerprint
31-
).forEach { fingerprint ->
32-
fingerprint.method.apply {
33-
val putSharingUrlIndex = indexOfFirstInstructionOrThrow(
34-
fingerprint.stringMatches!!.first().index,
35-
Opcode.IPUT_OBJECT
36-
)
37-
38-
val sharingUrlRegister = getInstruction<TwoRegisterInstruction>(putSharingUrlIndex).registerA
39-
40-
addInstructions(
41-
putSharingUrlIndex,
42-
"""
43-
invoke-static { v$sharingUrlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;
44-
move-result-object v$sharingUrlRegister
45-
"""
46-
)
47-
}
48-
}
49-
}
10+
val sanitizeSharingLinksPatch = bytecodePatch {
11+
dependsOn(app.revanced.patches.instagram.misc.share.privacy.sanitizeSharingLinksPatch)
5012
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package app.revanced.patches.instagram.misc.share
2+
3+
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
4+
import app.revanced.patcher.patch.BytecodePatchContext
5+
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
6+
import app.revanced.util.indexOfFirstInstruction
7+
import com.android.tools.smali.dexlib2.Opcode
8+
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
9+
10+
context(BytecodePatchContext)
11+
internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) {
12+
val fingerprintsToPatch = arrayOf(
13+
permalinkResponseJsonParserFingerprint,
14+
storyUrlResponseJsonParserFingerprint,
15+
profileUrlResponseJsonParserFingerprint,
16+
liveUrlResponseJsonParserFingerprint
17+
)
18+
19+
for (fingerprint in fingerprintsToPatch) {
20+
fingerprint.method.apply {
21+
val putSharingUrlIndex = indexOfFirstInstruction(
22+
permalinkResponseJsonParserFingerprint.stringMatches!!.first().index,
23+
Opcode.IPUT_OBJECT
24+
)
25+
26+
val sharingUrlRegister = getInstruction<TwoRegisterInstruction>(putSharingUrlIndex).registerA
27+
28+
block(putSharingUrlIndex, sharingUrlRegister)
29+
}
30+
}
31+
}

patches/src/main/kotlin/app/revanced/patches/instagram/misc/privacy/Fingerprints.kt renamed to patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package app.revanced.patches.instagram.misc.privacy
1+
package app.revanced.patches.instagram.misc.share
22

33
import app.revanced.patcher.fingerprint
44

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package app.revanced.patches.instagram.misc.share.domain
2+
3+
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
4+
import app.revanced.patcher.patch.bytecodePatch
5+
import app.revanced.patcher.patch.stringOption
6+
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
7+
import app.revanced.patches.instagram.misc.share.editShareLinksPatch
8+
import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN
9+
import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN
10+
import app.revanced.util.returnEarly
11+
12+
@Suppress("unused")
13+
val changeLinkSharingDomainPatch = bytecodePatch(
14+
name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN,
15+
description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN,
16+
use = false
17+
) {
18+
compatibleWith("com.instagram.android")
19+
20+
dependsOn(sharedExtensionPatch)
21+
22+
execute {
23+
val customDomainHost by stringOption(
24+
key = "domainName",
25+
default = "imginn.com",
26+
title = "Domain name",
27+
description = "The domain name to use when sharing links."
28+
)
29+
30+
getCustomShareDomainFingerprint.method.returnEarly(customDomainHost!!)
31+
32+
editShareLinksPatch { index, register ->
33+
addInstructions(
34+
index,
35+
"""
36+
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setCustomShareDomain(Ljava/lang/String;)Ljava/lang/String;
37+
move-result-object v$register
38+
"""
39+
)
40+
}
41+
}
42+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package app.revanced.patches.instagram.misc.share.domain
2+
3+
import app.revanced.patcher.fingerprint
4+
import com.android.tools.smali.dexlib2.AccessFlags
5+
6+
internal const val EXTENSION_CLASS_DESCRIPTOR =
7+
"Lapp/revanced/extension/instagram/misc/share/domain/ChangeLinkSharingDomainPatch;"
8+
9+
internal val getCustomShareDomainFingerprint = fingerprint {
10+
accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC)
11+
returns("Ljava/lang/String;")
12+
parameters()
13+
custom { method, classDef ->
14+
method.name == "getCustomShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR
15+
}
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package app.revanced.patches.instagram.misc.share.privacy
2+
3+
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
4+
import app.revanced.patcher.patch.bytecodePatch
5+
import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch
6+
import app.revanced.patches.instagram.misc.share.editShareLinksPatch
7+
import app.revanced.patches.shared.PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS
8+
import app.revanced.patches.shared.PATCH_NAME_SANITIZE_SHARING_LINKS
9+
10+
private const val EXTENSION_CLASS_DESCRIPTOR =
11+
"Lapp/revanced/extension/instagram/misc/share/privacy/SanitizeSharingLinksPatch;"
12+
13+
@Suppress("unused")
14+
val sanitizeSharingLinksPatch = bytecodePatch(
15+
name = PATCH_NAME_SANITIZE_SHARING_LINKS,
16+
description = PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS,
17+
) {
18+
compatibleWith("com.instagram.android")
19+
20+
dependsOn(sharedExtensionPatch)
21+
22+
execute {
23+
editShareLinksPatch { index, register ->
24+
addInstructions(
25+
index,
26+
"""
27+
invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;
28+
move-result-object v$register
29+
"""
30+
)
31+
}
32+
}
33+
}

patches/src/main/kotlin/app/revanced/patches/shared/SharedPatchNames.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,6 @@ internal const val PATCH_DESCRIPTION_REMOVE_ROOT_DETECTION = "Removes the check
99

1010
internal const val PATCH_NAME_SANITIZE_SHARING_LINKS = "Sanitize sharing links"
1111
internal const val PATCH_DESCRIPTION_SANITIZE_SHARING_LINKS = "Removes the tracking query parameters from shared links."
12+
13+
internal const val PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN = "Change link sharing domain"
14+
internal const val PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN = "Replaces the domain name of shared links."

0 commit comments

Comments
 (0)