diff --git a/package-lock.json b/package-lock.json
index f2d00d40d..e4198e049 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -54,7 +54,6 @@
"@types/url-parse": "^1.4.11",
"autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0",
- "com.foxdebug.acode.rk.exec.proot": "file:src/plugins/proot",
"com.foxdebug.acode.rk.exec.terminal": "file:src/plugins/terminal",
"cordova-android": "^14.0.1",
"cordova-clipboard": "^1.3.0",
@@ -4335,10 +4334,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/com.foxdebug.acode.rk.exec.proot": {
- "resolved": "src/plugins/proot",
- "link": true
- },
"node_modules/com.foxdebug.acode.rk.exec.terminal": {
"resolved": "src/plugins/terminal",
"link": true
@@ -11207,7 +11202,7 @@
"src/plugins/proot": {
"name": "com.foxdebug.acode.rk.exec.proot",
"version": "1.0.0",
- "dev": true,
+ "extraneous": true,
"license": "MIT"
},
"src/plugins/sdcard": {
diff --git a/package.json b/package.json
index 741b987c6..d6ef79942 100644
--- a/package.json
+++ b/package.json
@@ -34,11 +34,10 @@
},
"cordova-plugin-websocket": {},
"cordova-plugin-buildinfo": {},
- "cordova-plugin-system": {},
"cordova-plugin-browser": {},
- "com.foxdebug.acode.rk.exec.terminal": {},
- "com.foxdebug.acode.rk.exec.proot": {},
- "cordova-plugin-sftp": {}
+ "cordova-plugin-sftp": {},
+ "cordova-plugin-system": {},
+ "com.foxdebug.acode.rk.exec.terminal": {}
},
"platforms": [
"android"
@@ -63,7 +62,6 @@
"@types/url-parse": "^1.4.11",
"autoprefixer": "^10.4.21",
"babel-loader": "^10.0.0",
- "com.foxdebug.acode.rk.exec.proot": "file:src/plugins/proot",
"com.foxdebug.acode.rk.exec.terminal": "file:src/plugins/terminal",
"cordova-android": "^14.0.1",
"cordova-clipboard": "^1.3.0",
diff --git a/src/plugins/system/android/com/foxdebug/system/System.java b/src/plugins/system/android/com/foxdebug/system/System.java
index 861032524..daff3eb66 100644
--- a/src/plugins/system/android/com/foxdebug/system/System.java
+++ b/src/plugins/system/android/com/foxdebug/system/System.java
@@ -315,12 +315,26 @@ public void run() {
return true;
case "mkdirs":
- File file = new File(args.getString(0));
- if (file.mkdirs()) {
+ if (new File(args.getString(0)).mkdirs()) {
callbackContext.success();
} else {
callbackContext.error("mkdirs failed");
}
+ return true;
+ case "deleteFile":
+ if (new File(args.getString(0)).delete()) {
+ callbackContext.success();
+ } else {
+ callbackContext.error("delete failed");
+ }
+ return true;
+ case "setExec":
+ if (new File(args.getString(0)).setExecutable(Boolean.parseBoolean(args.getString(1)))) {
+ callbackContext.success();
+ } else {
+ callbackContext.error("set exec faild");
+ }
+
return true;
default:
return false;
diff --git a/src/plugins/system/www/plugin.js b/src/plugins/system/www/plugin.js
index 7f02d67be..d63af6ddc 100644
--- a/src/plugins/system/www/plugin.js
+++ b/src/plugins/system/www/plugin.js
@@ -21,6 +21,13 @@ module.exports = {
writeText: function (path, content, success, error) {
cordova.exec(success, error, 'System', 'writeText', [path, content]);
},
+ deleteFile: function (path, success, error) {
+ cordova.exec(success, error, 'System', 'deleteFile', [path]);
+ },
+ setExec: function (path, executable, success, error) {
+ cordova.exec(success, error, 'System', 'setExec', [path, String(executable)]);
+ },
+
getNativeLibraryPath: function (success, error) {
cordova.exec(success, error, 'System', 'getNativeLibraryPath', []);
diff --git a/src/plugins/terminal/plugin.xml b/src/plugins/terminal/plugin.xml
index f6e159ccd..fbde6010f 100644
--- a/src/plugins/terminal/plugin.xml
+++ b/src/plugins/terminal/plugin.xml
@@ -26,8 +26,8 @@
+
-
-
+
+
+
+
\ No newline at end of file
diff --git a/src/plugins/terminal/scripts/rm-wrapper.sh b/src/plugins/terminal/scripts/rm-wrapper.sh
new file mode 100644
index 000000000..8058e56c4
--- /dev/null
+++ b/src/plugins/terminal/scripts/rm-wrapper.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+unlink_recursive() {
+ path="$1"
+
+ # Try to recurse into it as a directory first
+ for entry in "$path"/* "$path"/.[!.]* "$path"/..?*; do
+ case "$entry" in
+ *'*'*|*'?'*) continue ;;
+ esac
+ unlink_recursive "$entry"
+ done 2>/dev/null
+
+ # Then try to remove the path itself
+ if rmdir "$path" 2>/dev/null; then
+ :
+ elif unlink "$path" 2>/dev/null; then
+ :
+ else
+ :
+ fi
+}
+
+for target in "$@"; do
+ echo "Unlinking broken symlinks..."
+ unlink_recursive "$target"
+done
+
+busybox rm "$@"
\ No newline at end of file
diff --git a/src/plugins/terminal/www/Terminal.js b/src/plugins/terminal/www/Terminal.js
index cf05ddb8b..279cefbf6 100644
--- a/src/plugins/terminal/www/Terminal.js
+++ b/src/plugins/terminal/www/Terminal.js
@@ -19,6 +19,12 @@ const Terminal = {
system.writeText(`${filesDir}/init-alpine.sh`, content, logger, err_logger);
});
+ readAsset("rm-wrapper.sh", async (content) => {
+ system.deleteFile(`${filesDir}/alpine/bin/rm`, logger, err_logger);
+ system.writeText(`${filesDir}/alpine/bin/rm`, content, logger, err_logger);
+ system.setExec(`${filesDir}/alpine/bin/rm`, true, logger, err_logger);
+ });
+
readAsset("init-sandbox.sh", (content) => {
system.writeText(`${filesDir}/init-sandbox.sh`, content, logger, err_logger);
@@ -38,6 +44,12 @@ const Terminal = {
});
});
} else {
+ readAsset("rm-wrapper.sh", async (content) => {
+ system.deleteFile(`${filesDir}/alpine/bin/rm`, logger, err_logger);
+ system.writeText(`${filesDir}/alpine/bin/rm`, content, logger, err_logger);
+ system.setExec(`${filesDir}/alpine/bin/rm`, true, logger, err_logger);
+ });
+
readAsset("init-alpine.sh", async (content) => {
system.writeText(`${filesDir}/init-alpine.sh`, content, logger, err_logger);
});
@@ -222,6 +234,12 @@ const Terminal = {
logger("⚙️ Applying basic configuration...");
system.writeText(`${alpineDir}/etc/resolv.conf`, `nameserver 8.8.4.4 \nnameserver 8.8.8.8`);
+ readAsset("rm-wrapper.sh", async (content) => {
+ system.deleteFile(`${alpineDir}/bin/rm`, logger, err_logger);
+ system.writeText(`${alpineDir}/bin/rm`, content, logger, err_logger);
+ system.setExec(`${alpineDir}/bin/rm`, true, logger, err_logger);
+ });
+
logger("✅ Extraction complete");
await new Promise((resolve, reject) => {
system.mkdirs(`${filesDir}/.extracted`, resolve, reject);