diff --git a/README.md b/README.md
index 15865b7..c8b8267 100644
--- a/README.md
+++ b/README.md
@@ -17,8 +17,8 @@ root helper.
| WebDAV server | yes | yes |
| `.deb` installer + apt/dpkg | yes | yes |
| Terminal | — | full a-Shell command set |
-| SSH server | — | mobile / root, password `alpine`, port 2222 |
-| `mount`, `extract`, archive support | terminal only | yes |
+| SSH server | mobile / root, password `alpine`, port 2222 | same |
+| `mount`, `extract`, archive support | SSH / basic shell | yes |
| `neofetch`, `respring` | — | yes |
Release assets are named exactly:
@@ -118,7 +118,7 @@ extract sample.zip -C out
`./test` is a `#!/bin/dash` script; iOS does not allow executing Mach-O files
from the app data container, so scripts are run through the bundled `dash`.
-SSH (developer build):
+SSH (both builds; developer also has the full terminal command set):
```sh
ssh -p 2222 mobile@DEVICE_IP # password: alpine
diff --git a/Tweak.m b/Tweak.m
index a45267b..ab97e17 100644
--- a/Tweak.m
+++ b/Tweak.m
@@ -2118,8 +2118,7 @@ static NSString *hook_prefTitleForFooter(id self, SEL _cmd, UITableView *tableVi
@"Running · %@ · users: mobile, root · password: alpine",
WQSSHServerURL()];
}
- return @"Enable SSH access for mobile and root (password alpine). "
- @"Requires the developer build with libssh.";
+ return @"Enable SSH access for mobile and root (password alpine).";
}
return orig_prefTitleForFooter
? ((NSString *(*)(id, SEL, UITableView *, NSInteger))orig_prefTitleForFooter)(
diff --git a/scripts/build_wq_ipa.sh b/scripts/build_wq_ipa.sh
index 2ac0751..9213bd9 100755
--- a/scripts/build_wq_ipa.sh
+++ b/scripts/build_wq_ipa.sh
@@ -118,6 +118,15 @@ mkdir -p "$APP/Frameworks"
cp "$DYLIB" "$APP/Frameworks/FilzaApplySandboxExt.dylib"
codesign --remove-signature "$APP/Frameworks/FilzaApplySandboxExt.dylib" 2>/dev/null || true
+# SSH server runtime is included in both public and developer builds.
+if [[ -f "$REPO_ROOT/vendor/libssh/libssh.4.dylib" ]]; then
+ cp "$REPO_ROOT/vendor/libssh/libssh.4.dylib" "$APP/Frameworks/libssh.4.dylib"
+fi
+if [[ -d "$REPO_ROOT/vendor/openssl.framework" ]]; then
+ rm -rf "$APP/Frameworks/openssl.framework"
+ cp -R "$REPO_ROOT/vendor/openssl.framework" "$APP/Frameworks/openssl.framework"
+fi
+
if [[ "${WQ_TERMINAL:-0}" == "full" ]]; then
ASHELL_IPA="${ASHELL_IPA:-$HOME/Downloads/Terminal.ipa}"
"$REPO_ROOT/scripts/prepare_dev_terminal.sh" "$APP" "$ASHELL_IPA"
diff --git a/vendor/openssl.framework/Info.plist b/vendor/openssl.framework/Info.plist
new file mode 100644
index 0000000..20d9fad
--- /dev/null
+++ b/vendor/openssl.framework/Info.plist
@@ -0,0 +1,24 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ openssl
+ CFBundleIdentifier
+ org.openssl.OpenSSL
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ openssl
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.1.123
+ CFBundleVersion
+ 1
+ MinimumOSVersion
+ 14.0
+
+
diff --git a/vendor/openssl.framework/_CodeSignature/CodeResources b/vendor/openssl.framework/_CodeSignature/CodeResources
new file mode 100644
index 0000000..c14ea12
--- /dev/null
+++ b/vendor/openssl.framework/_CodeSignature/CodeResources
@@ -0,0 +1,101 @@
+
+
+
+
+ files
+
+ Info.plist
+
+ FVnf8y74Ll+GghvlSKXTaKcT3i8=
+
+
+ files2
+
+ rules
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^version.plist$
+
+
+ rules2
+
+ .*\.dSYM($|/)
+
+ weight
+ 11
+
+ ^(.*/)?\.DS_Store$
+
+ omit
+
+ weight
+ 2000
+
+ ^.*
+
+ ^.*\.lproj/
+
+ optional
+
+ weight
+ 1000
+
+ ^.*\.lproj/locversion.plist$
+
+ omit
+
+ weight
+ 1100
+
+ ^Base\.lproj/
+
+ weight
+ 1010
+
+ ^Info\.plist$
+
+ omit
+
+ weight
+ 20
+
+ ^PkgInfo$
+
+ omit
+
+ weight
+ 20
+
+ ^embedded\.provisionprofile$
+
+ weight
+ 20
+
+ ^version\.plist$
+
+ weight
+ 20
+
+
+
+
diff --git a/vendor/openssl.framework/openssl b/vendor/openssl.framework/openssl
new file mode 100644
index 0000000..a9cb5e3
Binary files /dev/null and b/vendor/openssl.framework/openssl differ