feat(Sync for Reddit): Add Fix /user/ endpoint patch

This commit is contained in:
oSumAtrIX 2024-09-12 20:18:22 +02:00
parent 96e03caad1
commit 46d11f3530
No known key found for this signature in database
GPG key ID: A9B3094ACDB604B4
9 changed files with 108 additions and 0 deletions

View file

@ -828,6 +828,12 @@ public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/s
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/fix/slink/FixSLinksPatch;
}
public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/user/FixUserEndpointPatch : app/revanced/patcher/patch/BytecodePatch {
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/fix/user/FixUserEndpointPatch;
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
}
public final class app/revanced/patches/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch;
}

View file

@ -0,0 +1,60 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints.*
import app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints.OAuthFriendRequestFingerprint
import app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints.OAuthSubredditInfoRequestHelperFingerprint
import app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints.OAuthUnfriendRequestFingerprint
import app.revanced.util.getReference
import app.revanced.util.resultOrThrow
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
import com.android.tools.smali.dexlib2.iface.reference.StringReference
@Patch(
name = "Fix /user/ endpoint",
description = "Fixes the endpoint for viewing user profiles by replacing /u/ with /user/.",
compatiblePackages = [
CompatiblePackage("com.laurencedawson.reddit_sync"),
CompatiblePackage("com.laurencedawson.reddit_sync.pro"),
CompatiblePackage("com.laurencedawson.reddit_sync.dev"),
],
)
@Suppress("unused")
object FixUserEndpointPatch : BytecodePatch(
fingerprints = setOf(
OAuthFriendRequestFingerprint,
OAuthSubredditInfoRequestConstructorFingerprint,
OAuthSubredditInfoRequestHelperFingerprint,
OAuthUnfriendRequestFingerprint,
OAuthUserIdRequestFingerprint,
OAuthUserInfoRequestFingerprint,
),
) {
override fun execute(context: BytecodeContext) {
arrayOf(
OAuthFriendRequestFingerprint,
OAuthSubredditInfoRequestConstructorFingerprint,
OAuthSubredditInfoRequestHelperFingerprint,
OAuthUnfriendRequestFingerprint,
OAuthUserIdRequestFingerprint,
OAuthUserInfoRequestFingerprint,
).map(MethodFingerprint::resultOrThrow).map {
it.scanResult.stringsScanResult!!.matches.first().index to it.mutableMethod
}.forEach { (userPathStringIndex, method) ->
val userPathStringInstruction = method.getInstruction<OneRegisterInstruction>(userPathStringIndex)
val userPathStringRegister = userPathStringInstruction.registerA
val fixedUserPathString = userPathStringInstruction.getReference<StringReference>()!!.string.replace("u/", "user/")
method.replaceInstruction(
userPathStringIndex,
"const-string v$userPathStringRegister, \"${fixedUserPathString}\"",
)
}
}
}

View file

@ -0,0 +1,10 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
import app.revanced.patcher.fingerprint.MethodFingerprint
internal abstract class BaseUserEndpointFingerprint(source: String, accessFlags: Int? = null) :
MethodFingerprint(
accessFlags = accessFlags,
strings = listOf("u/"),
customFingerprint = { _, classDef -> classDef.sourceFile == source },
)

View file

@ -0,0 +1,3 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
internal object OAuthFriendRequestFingerprint : BaseUserEndpointFingerprint("OAuthFriendRequest.java")

View file

@ -0,0 +1,10 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
import app.revanced.patcher.extensions.or
import com.android.tools.smali.dexlib2.AccessFlags
internal object OAuthSubredditInfoRequestConstructorFingerprint :
BaseUserEndpointFingerprint(
"OAuthSubredditInfoRequest.java",
AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
)

View file

@ -0,0 +1,10 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
import app.revanced.patcher.extensions.or
import com.android.tools.smali.dexlib2.AccessFlags
internal object OAuthSubredditInfoRequestHelperFingerprint :
BaseUserEndpointFingerprint(
"OAuthSubredditInfoRequest.java",
AccessFlags.PRIVATE or AccessFlags.STATIC,
)

View file

@ -0,0 +1,3 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
internal object OAuthUnfriendRequestFingerprint : BaseUserEndpointFingerprint("OAuthUnfriendRequest.java")

View file

@ -0,0 +1,3 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
internal object OAuthUserIdRequestFingerprint : BaseUserEndpointFingerprint("OAuthUserIdRequest.java")

View file

@ -0,0 +1,3 @@
package app.revanced.patches.reddit.customclients.syncforreddit.fix.user.fingerprints
internal object OAuthUserInfoRequestFingerprint : BaseUserEndpointFingerprint("OAuthUserInfoRequest.java")