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 ; + } +};