From 9a3e7d2da51b2725e1fa211473621219f15e69a1 Mon Sep 17 00:00:00 2001
From: Der_Googler <54764558+DerGoogler@users.noreply.github.com>
Date: Thu, 29 Feb 2024 18:26:13 +0100
Subject: [PATCH] 2.1.0
---
.github/FUNDING.yaml | 1 +
.github/workflows/module.yaml | 29 ++++
README.md | 16 ++
module.prop | 4 +-
.../config/mmrl_wpd/components/CenterBox.jsx | 19 +++
.../mmrl_wpd/components/RenderToolbar.jsx | 21 +++
.../config/mmrl_wpd/hooks/useConfigStore.js | 20 +++
.../mmrl/config/mmrl_wpd/hooks/useNetworks.js | 40 +++++
.../usr/share/mmrl/config/mmrl_wpd/index.jsx | 150 +++++++-----------
9 files changed, 203 insertions(+), 97 deletions(-)
create mode 100644 .github/FUNDING.yaml
create mode 100644 .github/workflows/module.yaml
create mode 100644 README.md
create mode 100644 system/usr/share/mmrl/config/mmrl_wpd/components/CenterBox.jsx
create mode 100644 system/usr/share/mmrl/config/mmrl_wpd/components/RenderToolbar.jsx
create mode 100644 system/usr/share/mmrl/config/mmrl_wpd/hooks/useConfigStore.js
create mode 100644 system/usr/share/mmrl/config/mmrl_wpd/hooks/useNetworks.js
diff --git a/.github/FUNDING.yaml b/.github/FUNDING.yaml
new file mode 100644
index 0000000..4891d57
--- /dev/null
+++ b/.github/FUNDING.yaml
@@ -0,0 +1 @@
+github: DerGoogler
\ No newline at end of file
diff --git a/.github/workflows/module.yaml b/.github/workflows/module.yaml
new file mode 100644
index 0000000..9eaee5f
--- /dev/null
+++ b/.github/workflows/module.yaml
@@ -0,0 +1,29 @@
+name: Build Magisk/KernelSU Module
+
+on:
+ push:
+ tags: [ v*.*.* ]
+
+jobs:
+ build:
+ name: Build Module
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Setup Apt Dependencies
+ run: |
+ sudo apt update -y && sudo apt upgrade -y
+ sudo apt install zip unzip -y
+
+ - name: Make
+ shell: bash
+ run: |
+ zip -r "module.zip" * -x ".git" -x "README.md"
+
+ - name: Publish
+ uses: softprops/action-gh-release@v1
+ with:
+ files: 'module.zip'
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ad1933c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,16 @@
+# WiFi Password Viewer for MMRL
+
+An inspired project from [veez21](https://github.com/veez21)'s [wpd gist](https://gist.github.com/veez21/4f2541d271809864411e3ffbbe8e3df9), ported to MMRL.
+This project is also a example to show how powerful MMRL's ModConf feature is.
+
+Using `DOMParser` to extract local saved wifi passwords
+
+> [!IMPORTANT]
+> This project requires MMRL above 2.14.10!
+
+```js
+const wifiXmlParser = new DOMParser();
+```
+
+> This module does not extract passwords from unauthorized wifi's
+
diff --git a/module.prop b/module.prop
index 6a4fcf9..4ddabdb 100644
--- a/module.prop
+++ b/module.prop
@@ -1,6 +1,6 @@
id=mmrl_wpd
name=WiFi Password Viewer for MMRL
-version=1.1.0
-versionCode=110
+version=2.1.0
+versionCde=210
author=Der_Googler, veez21 @ xda-developers
description=View all your WiFi passwords inside MMRL
diff --git a/system/usr/share/mmrl/config/mmrl_wpd/components/CenterBox.jsx b/system/usr/share/mmrl/config/mmrl_wpd/components/CenterBox.jsx
new file mode 100644
index 0000000..50a0fae
--- /dev/null
+++ b/system/usr/share/mmrl/config/mmrl_wpd/components/CenterBox.jsx
@@ -0,0 +1,19 @@
+import React from "react";
+import { Box } from "@mui/material";
+
+export default (props) => {
+ return (
+
+ );
+};
diff --git a/system/usr/share/mmrl/config/mmrl_wpd/components/RenderToolbar.jsx b/system/usr/share/mmrl/config/mmrl_wpd/components/RenderToolbar.jsx
new file mode 100644
index 0000000..38b73f0
--- /dev/null
+++ b/system/usr/share/mmrl/config/mmrl_wpd/components/RenderToolbar.jsx
@@ -0,0 +1,21 @@
+import React from "react";
+import { Toolbar } from "@mmrl/ui";
+import { useActivity } from "@mmrl/hooks";
+
+export default () => {
+ const { context } = useActivity();
+ return (
+
+
+
+
+ WiFi Password Viewer
+
+ );
+};
diff --git a/system/usr/share/mmrl/config/mmrl_wpd/hooks/useConfigStore.js b/system/usr/share/mmrl/config/mmrl_wpd/hooks/useConfigStore.js
new file mode 100644
index 0000000..6136565
--- /dev/null
+++ b/system/usr/share/mmrl/config/mmrl_wpd/hooks/useConfigStore.js
@@ -0,0 +1,20 @@
+import React from "react";
+
+export default () => {
+ const [store, setStore] = React.useState(null);
+
+ React.useEffect(() => {
+ const miscWifiConfigStore = new SuFile("/data/misc/wifi/WifiConfigStore.xml");
+ const miscApexDataWifiConfigStore = new SuFile("/data/misc/apexdata/com.android.wifi/WifiConfigStore.xml");
+
+ if (miscWifiConfigStore.exist()) {
+ setStore(miscWifiConfigStore.read());
+ } else if (miscApexDataWifiConfigStore.exist()) {
+ setStore(miscApexDataWifiConfigStore.read());
+ } else {
+ setStore(null);
+ }
+ }, []);
+
+ return store;
+};
diff --git a/system/usr/share/mmrl/config/mmrl_wpd/hooks/useNetworks.js b/system/usr/share/mmrl/config/mmrl_wpd/hooks/useNetworks.js
new file mode 100644
index 0000000..6c0d9da
--- /dev/null
+++ b/system/usr/share/mmrl/config/mmrl_wpd/hooks/useNetworks.js
@@ -0,0 +1,40 @@
+import React from "react";
+
+const useConfigStore = include("hooks/useConfigStore.js")
+
+export default () => {
+ const [networks, setNetworks] = React.useState(null);
+ const config = useConfigStore();
+
+ React.useEffect(() => {
+ if (config) {
+ const wifiXmlParser = new DOMParser();
+ const xml = wifiXmlParser.parseFromString(config, "text/xml");
+
+ const WifiConfigStoreData = xml.getElementsByTagName("WifiConfigStoreData")[0];
+ const NetworkList = WifiConfigStoreData.getElementsByTagName("NetworkList")[0];
+
+ // array
+ const Network = [...NetworkList.getElementsByTagName("Network")];
+
+ setNetworks(
+ Network.flatMap((el) => {
+ const WifiConfiguration = [...el.getElementsByTagName("WifiConfiguration")];
+
+ return WifiConfiguration.map((s) => {
+ const ssid = s.querySelector('string[name="SSID"]').innerHTML;
+
+ const psk = s.querySelector('string[name="PreSharedKey"]');
+
+ return {
+ ssid: ssid.replace(/"(.+)"/g, "$1"),
+ psk: psk ? psk.innerHTML.replace(/"(.+)"/g, "$1") : null,
+ };
+ });
+ })
+ );
+ }
+ }, [config]);
+
+ return networks;
+};
diff --git a/system/usr/share/mmrl/config/mmrl_wpd/index.jsx b/system/usr/share/mmrl/config/mmrl_wpd/index.jsx
index 5af6604..230eeca 100644
--- a/system/usr/share/mmrl/config/mmrl_wpd/index.jsx
+++ b/system/usr/share/mmrl/config/mmrl_wpd/index.jsx
@@ -1,104 +1,64 @@
import React from "react";
-import { Page, Toolbar } from "@mmrl/ui";
-import { useActivity, useNativeStorage } from "@mmrl/hooks";
-import {
- List,
- ListItem,
- ListItemText,
- Divider
-} from "@mui/material";
-import Terminal from "@mmrl/terminal";
+import { Page } from "@mmrl/ui";
+import { useNativeStorage } from "@mmrl/hooks";
+import { List, ListItem, ListItemText, Divider } from "@mui/material";
-const __wpd = `[ "\$(whoami)" != "root" ] && { echo "root required"; exit 1; }
-configs=( /data/misc/wifi/WifiConfigStore.xml /data/misc/apexdata/com.android.wifi/WifiConfigStore.xml )
-for z in \${configs[@]}; do
- if [ -f \$z ]; then
- config=\$z
- break
- fi
-done
-SSID=(\$(grep 'name="SSID"' \$config | sed "s/.*>"//;s/".*//;s/ /-_-/g"))
-PSK=(\$(grep 'name="PreSharedKey"' \$config | sed "s/"//;s/".*//;s/ /-_-/g"))
-for i in \${!SSID[@]}; do
- echo "\${SSID[\$i]},\"\${PSK[\$i]}\"" | sed "s/-_-/ /g"
-done`
+const RenderToolbar = include("components/RenderToolbar.jsx");
+const CenterBox = include("components/CenterBox.jsx");
+const useNetworks = include("hooks/useNetworks.js");
+function App() {
+ const networks = useNetworks();
+ const [hidePasswords, setHidePasswords] = useNativeStorage("wpd_hide_passwords", true);
-function RenderToolbar() {
- const { context } = useActivity()
+ if (!networks) {
return (
-
-
-
-
-
- WiFi Password Viewer
-
-
- )
-}
-
-function Wpd() {
- const [lines, setLines] = React.useState([]);
- const [hidePasswords, setHidePasswords] = useNativeStorage("wpd_hide_passwords", true)
-
- const addLine = (line) => {
- setLines((lines) => [...lines, line]);
- };
-
- const saveLog = () => {
- write("/data/adb/wpd.log", lines.join("\n"))
- }
-
- const startLog = React.useMemo(() => {
- const envp = {
- MMRL_VER_NAME: BuildConfig.VERSION_NAME,
- PACKAGENAME: BuildConfig.APPLICATION_ID,
- };
+
+ No networks found
+
+ );
+ }
- Terminal.exec({
- command: __wpd,
- env: envp,
- onLine: (line) => {
- line = line.split(",")
- addLine({
- ssid: line[0],
- psk: line[1]
- });
- },
- onExit: (code) => { },
- });
- }, []);
+ return (
+
+ Settings}>
+
+
+ setHidePasswords(e.target.checked)} />
+
+
+
+ Passwords}>
+ {networks.map((wifi) => (
+
+
+
+ ))}
+
+
+ );
+}
+export default () => {
+ if (BuildConfig.VERSION_CODE < 21410) {
return (
-
- Settings}>
-
-
- setHidePasswords(e.target.checked)} />
-
-
-
- Passwords}>
- {lines.map((line) => (
-
-
-
- ))}
-
-
+
+
+ WPD requires MMRL above 2.14.10!
+
+
);
-}
-
-export default Wpd
+ } else {
+ return ;
+ }
+};