Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions app/src/main/java/org/lsposed/manager/ConfigManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -409,4 +409,30 @@ public static boolean setAutoInclude(String packageName, boolean enable) {
return false;
}
}

public static String getCurrentCliPin() {
try {
return LSPManagerServiceHolder.getService().getCurrentCliPin();
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));
return null;
}
}

public static String resetCliPin() {
try {
return LSPManagerServiceHolder.getService().resetCliPin();
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));
return null;
}
}

public static void disableCli() {
try {
LSPManagerServiceHolder.getService().disableCli();
} catch (RemoteException e) {
Log.e(App.TAG, Log.getStackTraceString(e));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.text.Html;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
Expand Down Expand Up @@ -58,6 +59,7 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Locale;
import java.util.UUID;

import rikka.core.util.ResourceUtils;
import rikka.material.app.LocaleDelegate;
Expand Down Expand Up @@ -371,6 +373,12 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
translation_contributors.setSummary(translators);
}
}

MaterialSwitchPreference prefCli = findPreference("enable_cli");
if (prefCli != null) {
setupCliPreference(prefCli);
}

SimpleMenuPreference channel = findPreference("update_channel");
if (channel != null) {
channel.setOnPreferenceChangeListener((preference, newValue) -> {
Expand Down Expand Up @@ -398,5 +406,50 @@ public RecyclerView onCreateRecyclerView(@NonNull LayoutInflater inflater, @NonN
}
return recyclerView;
}

private void setupCliPreference(MaterialSwitchPreference prefCli) {
boolean installed = ConfigManager.isBinderAlive();
if (!installed) {
prefCli.setEnabled(false);
return;
}
prefCli.setEnabled(true);

// On load, check the daemon's memory for the current state.
String currentPin = ConfigManager.getCurrentCliPin();
boolean isEnabled;
if (BuildConfig.DEBUG) {
// On DEBUG, the feature is considered enabled even if PIN is null (default-on state)
isEnabled = true;
prefCli.setEnabled(false);
} else {
isEnabled = currentPin != null;
}
prefCli.setChecked(isEnabled);
updateCliSummary(prefCli, currentPin);

prefCli.setOnPreferenceChangeListener((preference, newValue) -> {
boolean enable = (boolean) newValue;
String newPin = null;
if (enable) {
newPin = ConfigManager.resetCliPin();
} else {
ConfigManager.disableCli();
}
updateCliSummary(preference, newPin);
return true;
});
}

private void updateCliSummary(Preference pref, String pin) {
if (BuildConfig.DEBUG && pin == null) {
pref.setSummary(R.string.pref_summary_cli_debug);
} else if (pin != null) {
String summary = getString(R.string.pref_summary_cli_pin, pin);
pref.setSummary(Html.fromHtml(summary, Html.FROM_HTML_MODE_COMPACT));
} else {
pref.setSummary(R.string.pref_summary_enable_cli);
}
}
}
}
10 changes: 10 additions & 0 deletions app/src/main/res/drawable/ic_outline_cmd_24.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal" >
<path
android:fillColor="@android:color/white"
android:pathData="M3.2383,3.1211C2.4531,3.332 1.8086,3.9375 1.5391,4.7188L1.4297,5.0391L1.4297,18.9609L1.5391,19.2813C1.75,19.8828 2.1563,20.3672 2.7109,20.6641C3.2891,20.9727 2.6758,20.9531 12,20.9531C21.3242,20.9531 20.7109,20.9727 21.2891,20.6641C21.8438,20.3672 22.25,19.8828 22.4609,19.2813L22.5703,18.9609L22.5703,5.0391L22.4609,4.7188C22.25,4.1172 21.8438,3.6328 21.2891,3.3359C20.7109,3.0273 21.3281,3.0469 11.9766,3.0508C4.7188,3.0508 3.4531,3.0625 3.2383,3.1211ZM20.9453,12.9805C20.9297,18.8125 20.9297,18.8398 20.832,18.9648C20.6875,19.1641 20.5156,19.2695 20.293,19.3164C20.0234,19.3672 3.9766,19.3672 3.707,19.3164C3.4844,19.2695 3.3125,19.1641 3.168,18.9648C3.0703,18.8398 3.0703,18.8125 3.0547,12.9805L3.0469,7.125L20.9531,7.125ZM20.9453,12.9805,M6.4219,10.9922L7.8516,12.4219L5.0391,15.2344L7.1016,15.2344L9.9141,12.4219L7.0547,9.5625L4.9922,9.5625ZM6.4219,10.9922,M11.6328,13.7383C11.207,13.9492 11.0664,14.5391 11.3594,14.9219C11.6055,15.2422 11.5508,15.2383 14.0938,15.2266L16.3828,15.2109L16.543,15.0977C16.7266,14.9688 16.8711,14.6719 16.875,14.4336C16.875,14.1719 16.6914,13.875 16.4531,13.75L16.25,13.6406L14.043,13.6406C11.8867,13.6406 11.832,13.6445 11.6328,13.7383ZM11.6328,13.7383" />
</vector>
10 changes: 10 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,16 @@
<string name="update_channel_nightly">Nightly build</string>
<string name="settings_xposed_api_call_protection">Xposed API call protection</string>
<string name="settings_xposed_api_call_protection_summary">Block dynamically loaded module code to use Xposed API, this may break some modules but benefit security</string>
<string name="settings_group_cli">Command line interface</string>
<string name="pref_title_enable_cli">Enable CLI feature</string>
<!-- Default summary when disabled -->
<string name="pref_summary_enable_cli">Automate LSPosed with shell scripts via PIN authentication</string>
<!-- Summary for Release builds when enabled -->
<string name="pref_summary_cli_pin">Your CLI auth PIN is: <B>%1$s</B><br/></string>
<!-- Summary for Debug builds when enabled -->
<string name="pref_summary_cli_debug">Enabled for debugging. No authentication required.</string>
<string name="disabled">Disabled</string>

<!-- Module Repo -->
<string name="module_readme">Readme</string>
<string name="module_releases">Releases</string>
Expand Down
10 changes: 10 additions & 0 deletions app/src/main/res/xml/prefs.xml
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,14 @@
android:summary="@string/settings_show_hidden_icon_apps_enabled_summary"
android:title="@string/settings_show_hidden_icon_apps_enabled" />
</PreferenceCategory>

<PreferenceCategory android:title="@string/settings_group_cli">
<rikka.material.preference.MaterialSwitchPreference
android:key="enable_cli"
android:title="@string/pref_title_enable_cli"
android:summary="@string/pref_summary_enable_cli"
android:defaultValue="false"
android:icon="@drawable/ic_outline_cmd_24"
android:persistent="false"/>
</PreferenceCategory>
</PreferenceScreen>
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,14 @@ public ParcelFileDescriptor requestInjectedManagerBinder(List<IBinder> binder) {
return null;
}

@Override
public void requestCLIBinder(String sPin, List<IBinder> binder) {
try {
service.requestCLIBinder(sPin, binder);
} catch (RemoteException | NullPointerException ignored) {
}
}

@Override
public IBinder asBinder() {
return service.asBinder();
Expand Down
4 changes: 4 additions & 0 deletions daemon/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.android.build.api.dsl.ApplicationExtension
import com.android.ide.common.signing.KeystoreHelper
import java.io.PrintStream
import java.util.UUID

plugins {
alias(libs.plugins.agp.app)
Expand Down Expand Up @@ -99,13 +100,15 @@ android.applicationVariants.all {
sign?.keyPassword,
sign?.keyAlias
)
val uuid = UUID.randomUUID().toString();
PrintStream(outSrc).print(
"""
|package org.lsposed.lspd.util;
|public final class SignInfo {
| public static final byte[] CERTIFICATE = {${
certificateInfo.certificate.encoded.joinToString(",")
}};
| public static final String CLI_UUID = "$uuid";
|}""".trimMargin()
)
}
Expand All @@ -116,6 +119,7 @@ android.applicationVariants.all {
dependencies {
implementation(libs.libxposed.`interface`)
implementation(libs.agp.apksig)
implementation(libs.picocli)
implementation(projects.apache)
implementation(projects.hiddenapi.bridge)
implementation(projects.services.daemonService)
Expand Down
13 changes: 13 additions & 0 deletions daemon/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
-keepclasseswithmembers,includedescriptorclasses class * {
native <methods>;
}
-keepattributes *Annotation*, Signature, Exception

-keep class picocli.CommandLine { *; }
-keep class picocli.CommandLine$* { *; }
-keep class org.lsposed.lspd.cli.* {*;}

-keepclassmembers class * extends java.util.concurrent.Callable {
public java.lang.Integer call();
}

-keepclasseswithmembers class org.lsposed.lspd.cli.Main {
public static void main(java.lang.String[]);
}
-keepclasseswithmembers class org.lsposed.lspd.Main {
public static void main(java.lang.String[]);
}
Expand Down
8 changes: 8 additions & 0 deletions daemon/src/main/java/org/lsposed/lspd/cli/GlobalOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lsposed.lspd.cli;

import picocli.CommandLine;

public class GlobalOptions {
@CommandLine.Option(names = {"-j", "--json"}, description = "Output results in JSON format.")
public boolean jsonOutput;
}
Loading