Skip to content
Closed
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
30 changes: 26 additions & 4 deletions .github/workflows/build-nym-vpn-android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,161 +63,183 @@

jobs:
build:
runs-on: arc-linux-latest
runs-on: AppleSilicon

env:
SIGNING_KEY_ALIAS: ${{ secrets.ANDROID_SIGNING_KEY_ALIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.ANDROID_SIGNING_KEY_PASSWORD }}
SIGNING_STORE_PASSWORD: ${{ secrets.ANDROID_SIGNING_STORE_PASSWORD }}
SENTRY_DSN: ${{ secrets.ANDROID_SENTRY_DSN }}
KEY_STORE_FILE: "android_keystore.jks"
KEY_STORE_LOCATION: ${{ github.workspace }}/nym-vpn-android/app/keystore/
defaults:
run:
working-directory: nym-vpn-android
outputs:
UPLOAD_DIR_ANDROID: ${{ env.UPLOAD_DIR_ANDROID }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
distribution: "temurin"
java-version: "17"
cache: gradle

- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Setup NDK
uses: nttld/setup-ndk@v1
id: setup-ndk
with:
ndk-version: ${{ vars.REQUIRED_NDK_VERSION }}
add-to-path: false

- name: Set env
shell: bash
run: |
echo "ANDROID_NDK_HOME=${{ steps.setup-ndk.outputs.ndk-path }}" >> $GITHUB_ENV
echo "NDK_TOOLCHAIN_DIR=${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/linux-x86_64/bin" >> $GITHUB_ENV
case "$(uname -s)" in
Linux*) host_tag=linux-x86_64 ;;
Darwin*) host_tag=darwin-x86_64 ;;
*) host_tag=linux-x86_64 ;;
esac
echo "NDK_TOOLCHAIN_DIR=${{ steps.setup-ndk.outputs.ndk-path }}/toolchains/llvm/prebuilt/${host_tag}/bin" >> $GITHUB_ENV

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Install Go
uses: actions/setup-go@v6
with:
go-version: ${{ vars.REQUIRED_GOLANG_VERSION }}
cache-dependency-path: |
wireguard/libwg/go.sum

- name: Install rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ vars.REQUIRED_RUSTC_VERSION }}
targets: aarch64-linux-android

- name: Install cargo-ndk
uses: baptiste0928/cargo-install@v3
with:
crate: cargo-ndk

- name: Install cargo-license
uses: baptiste0928/cargo-install@v3
with:
crate: cargo-license

- name: Install deps
- name: Install deps (Linux)
if: runner.os == 'Linux'
run: |
sudo apt-get update && sudo apt-get install -y libdbus-1-dev libmnl-dev libnftnl-dev protobuf-compiler git curl gcc g++ make unzip rsync
sudo apt-get update && sudo apt-get install -y \
libdbus-1-dev libmnl-dev libnftnl-dev protobuf-compiler \
git curl gcc g++ make unzip rsync

- name: Install deps (macOS)
if: runner.os == 'macOS'
run: |
brew update
brew install \
protobuf \
git \
curl \
gcc \
make \
unzip \
rsync || true

# Here we need to decode keystore.jks from base64 string and place it
# in the folder specified in the release signing configuration
- name: Decode Keystore
if: ${{ inputs.build_type != 'debug' }}
id: decode_keystore
uses: timheuer/[email protected]
with:
fileName: ${{ env.KEY_STORE_FILE }}
fileDir: ${{ env.KEY_STORE_LOCATION }}
encodedString: ${{ secrets.ANDROID_KEYSTORE }}

# create keystore path for gradle to read
- name: Create keystore path env var
if: ${{ inputs.build_type != 'debug' }}
run: |
store_path=${{ env.KEY_STORE_LOCATION }}${{ env.KEY_STORE_FILE }}
echo "KEY_STORE_PATH=$store_path" >> $GITHUB_ENV

- name: Create service_account.json
if: ${{ inputs.build_type != 'debug' }}
id: createServiceAccount
run: echo '${{ secrets.ANDROID_SERVICE_ACCOUNT_JSON }}' > service_account.json

- name: Build Fdroid Release Apk
if: ${{ inputs.build_type == 'release' && inputs.build_format == 'apk' }}
run: ./gradlew :app:assembleFdroidRelease --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Fdroid Release Bundle
if: ${{ inputs.build_type == 'release' && inputs.build_format == 'aab' }}
run: ./gradlew :app:bundleFdroidRelease --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Fdroid Prerelease Apk
if: ${{ inputs.build_type == 'prerelease' && inputs.build_format == 'apk' }}
run: ./gradlew :app:assembleFdroidPrerelease --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Fdroid Prerelease Bundle
if: ${{ inputs.build_type == 'prerelease' && inputs.build_format == 'aab' }}
run: ./gradlew :app:bundleFdroidPrerelease --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Fdroid Nightly Apk
if: ${{ inputs.build_type == 'nightly' && inputs.build_format == 'apk' }}
run: ./gradlew :app:assembleFdroidNightly --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Fdroid Nightly Bundle
if: ${{ inputs.build_type == 'nightly' && inputs.build_format == 'aab' }}
run: ./gradlew :app:bundleFdroidNightly --info
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Debug Apk
if: ${{ inputs.build_type == 'debug' && inputs.build_format == 'apk' }}
run: ./gradlew :app:assembleFdroidDebug --stacktrace
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Build Debug Bundle
if: ${{ inputs.build_type == 'debug' && inputs.build_format == 'aab' }}
run: ./gradlew :app:bundleFdroidDebug --stacktrace
env:
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}

- name: Get output path
id: output-path
run: |
if [ "${{ inputs.build_format }}" == "apk" ]; then
echo "path=$(find . -regex '^.*/build/outputs/apk/fdroid/${{ inputs.build_type }}/.*\.apk$' -type f | head -1 | tail -c+2)" >> $GITHUB_OUTPUT
else
BUILD_TYPE=$(echo "${{ inputs.build_type }}" | sed 's/./\u&/')
echo "path=$(find . -regex '^.*/build/outputs/bundle/fdroidRelease/.*\.aab$' -type f | head -1 | tail -c+2)" >> $GITHUB_OUTPUT
fi

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ env.UPLOAD_DIR_ANDROID }}
path: ${{ github.workspace }}/nym-vpn-android${{ steps.output-path.outputs.path }}
if-no-files-found: error
retention-days: 1

Check warning

Code scanning / CodeQL

Workflow does not contain permissions Medium

Actions job or workflow does not limit the permissions of the GITHUB_TOKEN. Consider setting an explicit permissions block, using the following as a minimal starting point: {contents: read}
8 changes: 4 additions & 4 deletions .pkg/linux/install
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,17 @@ CORE_BUILD=${CORE_BUILD:-0}

## STABLE BUILDS #################################################
# app artifacts
app_tag=nym-vpn-app-v1.19.0
app_version=1.19.0
app_tag=nym-vpn-app-v1.20.0
app_version=1.20.0
appimage_url="https://github.com/nymtech/nym-vpn-client/releases/download/$app_tag/NymVPN_${app_version}_x64.AppImage"
app_deb_url="https://github.com/nymtech/nym-vpn-client/releases/download/$app_tag/nym-vpn-app_${app_version}_amd64.deb"
desktop_url="https://raw.githubusercontent.com/nymtech/nym-vpn-client/ac4153bb1/nym-vpn-app/.pkg/app.desktop"
icon_url="https://raw.githubusercontent.com/nymtech/nym-vpn-client/fb526935/nym-vpn-app/.pkg/icon.svg"

# nym-vpnd artifacts
vpnd_tag=nym-vpn-core-v1.19.0
vpnd_tag=nym-vpn-core-v1.20.0
# ⚠ there are inconsistencies in the package version naming…
vpnd_version=1.19.0
vpnd_version=1.20.0
vpnd_deb_ver=$vpnd_version
vpnd_deb_ver_url=$vpnd_version
vpnd_raw_url="https://github.com/nymtech/nym-vpn-client/releases/download/$vpnd_tag/nym-vpn-core-v${vpnd_version}_linux_x86_64.tar.gz"
Expand Down
6 changes: 3 additions & 3 deletions .pkg/tauri-updater/stable.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"version": "1.19.0",
"version": "1.20.0",
"platforms": {
"windows-x86_64": {
"signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTTjN5M3FybWZ5VjJvNFU3cjhES2V2MWJXUEpBaGw2RGZVMUNleHpyc1ZVY3dhazVZYlZEMkgzMk1MNytBTTUweGFlOWl0UzVUdS85VE8yd2FyNG5IMmxaTkF5WnA5UFFnPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzYzNTQ0MzgwCWZpbGU6TnltVlBOXzEuMTkuMF94NjQtc2V0dXAuZXhlClFZV1N1WmYvbkJsUDduYkw2NXJwT1ZIYXNmbTVDZnVxMER4WWUrdWlMWGVDNzlhdk1uakRHdWdadURuRCtWVlBvdzdQQmxwejY4UFEydHdkZWNpWkFnPT0K",
"url": "https://github.com/nymtech/nym-vpn-client/releases/download/nym-vpn-app-v1.19.0/NymVPN_1.19.0_x64-setup.exe"
"signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTTjN5M3FybWZ5VjdtYzlYSDdYNGlIQnRQaDJQQTRHaGh1c2o5cGszM1dXVUZwODUxZEJPdS9OWi9rVytsZDluaTUweGorQ0h6RUlBUk5RQjY4TS92QlVENHpVK2U5NXdBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzY0Njk3MDAwCWZpbGU6TnltVlBOXzEuMjAuMF94NjQtc2V0dXAuZXhlCjBFWURWWVd6NndmOC9adlBOV1ByN2JIVnpjZWxhTDB5V1haM3ZLdUwyNWJxQ3J4Qm9PUFYrYmdHVEw0dEVOdjFZL1hFV1dZNk90NXEzMk9NQUpaOENRPT0K",
"url": "https://github.com/nymtech/nym-vpn-client/releases/download/nym-vpn-app-v1.20.0/NymVPN_1.20.0_x64-setup.exe"
}
}
}
2 changes: 1 addition & 1 deletion fastlane/metadata/android/de-DE/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Die weltweit einzige VPN-App, die dich nicht ausspionieren kann. Akademisch gestaltet, Schweizer gemacht.
Die einzige VPN-App, die dich nicht ausspioniert – akademisch & schweizerisch.
5 changes: 5 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/25000.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
What's new:
- Added node details to quick settings and a new Account screen
- Introduced bi-mode split tunneling on Android
- Updated Settings, Privacy, Censorship, and navigation UI
- Improved connection stability and error handling
2 changes: 1 addition & 1 deletion fastlane/metadata/android/es-ES/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
La única aplicación VPN del mundo que no puede espiarte. Académicamente diseñado, fabricado en Suiza.
La VPN única que no puede espiarte, diseñada académicamente y hecha en Suiza.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/fa/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
تنها برنامهٔ VPN در جهان که توانایی جاسوسی از شما را ندارد. طراحی علمی با ساخت کشور سوئیس.
تنها VPN‌ای که نمی‌تواند از شما جاسوسی کند؛ طراحی علمی و ساختِ سوئیس.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/fr-FR/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
La seule application VPN au monde qui ne peut pas vous espionner. Elaboré par des universitaires, Swiss made .
La seule VPN qui ne peut pas vous espionner, conçue par des experts suisses.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/hi-IN/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
दुनिया का एकमात्र VPN ऐप जो आप पर जासूसी नहीं कर सकताअकादमिक रूप से तैयार किया गया, स्विस कारीगरी से बना।
एकमात्र VPN जो आप पर जासूसी नहीं कर सकताअकादमिक डिज़ाइन, स्विस बना।
2 changes: 1 addition & 1 deletion fastlane/metadata/android/ru-RU/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Единственное в мире приложение VPN, которое не может шпионить за вами. Разработано учёными, создано в Швейцарии.
Единственный VPN, который не может шпионить за вами — создан учёными Швейцарии.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/tr-TR/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Dünyadaki tek VPN uygulaması—sizi gözetlemesi imkânsız. Akademik tasarım, İsviçre menşeeli.
Gözetleyemeyen tek VPN: akademik tasarım, İsviçre üretimi.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/uk/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Єдиний у світі VPN, який не може шпигувати за вами. Розроблено в академічних колах, виготовлено в Швейцарії.
Єдиний VPN, що не може шпигувати за вами — академічна розробка зі Швейцарії.
2 changes: 1 addition & 1 deletion fastlane/metadata/android/vi/short_description.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Ứng dụng VPN duy nhất trên thế giới không thể theo dõi bạn. Thiết kế học thuật, sản xuất tại Thụy Sĩ.
VPN duy nhất không thể theo dõi bạn — thiết kế học thuật, sản xuất Thụy Sĩ.
5 changes: 4 additions & 1 deletion nym-vpn-android/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.5.0] - 2025-12-03

### Added
- Node details added in quick settings notification (https://github.com/nymtech/nym-vpn-client/pull/4029)
- AmneziaWG section added to censorship screen (https://github.com/nymtech/nym-vpn-client/pull/4033)
- Revoke implementation added for VPN service (https://github.com/nymtech/nym-vpn-client/pull/4041)
- Account screen added (https://github.com/nymtech/nym-vpn-client/pull/4060)
- Android: Bi-mode Split Tunneling (https://github.com/nymtech/nym-vpn-client/pull/4049
- "Help with translation" link added to Languages screen (https://github.com/nymtech/nym-vpn-client/pull/4086)
- Allow user to logout when tunnel is Up (https://github.com/nymtech/nym-vpn-client/pull/4103)

### Changed
- UI changes and updates for Settings screen (https://github.com/nymtech/nym-vpn-client/pull/4060)
Expand All @@ -27,7 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Fix QUIC autostart issue (https://github.com/nymtech/nym-vpn-client/pull/4040)
- Fix for Sentry toggle (https://github.com/nymtech/nym-vpn-client/pull/4060)

## [2.4.0]
## [2.4.0] - 2025-11-19

### Added
- Crowdin Translations (https://github.com/nymtech/nym-vpn-client/pull/2777)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,17 +73,20 @@ constructor(
fun logout(onComplete: (() -> Unit)? = null) = viewModelScope.launch {
runCatching {
if (backendManager.getState() == Tunnel.State.Down) {
backendManager.removeMnemonic()
backendManager.refresh()
onComplete?.invoke()
performLogout(onComplete)
} else {
SnackbarController.showMessage(
StringValue.StringResource(R.string.action_requires_tunnel_down),
)
backendManager.stopTunnel()
performLogout(onComplete)
}
}.onFailure { Timber.e(it) }
}

private suspend fun performLogout(onComplete: (() -> Unit)? = null) {
backendManager.removeMnemonic()
backendManager.refresh()
onComplete?.invoke()
}

fun onLocaleChange(localeTag: String) = viewModelScope.launch {
settingsRepository.setLocale(localeTag)
LocaleUtil.changeLocale(localeTag)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import net.nymtech.nymvpn.BuildConfig
import net.nymtech.nymvpn.R
import net.nymtech.nymvpn.ui.AppUiState
import net.nymtech.nymvpn.ui.AppViewModel
import net.nymtech.nymvpn.ui.Route
Expand All @@ -46,7 +45,6 @@ import net.nymtech.nymvpn.util.extensions.launchBatteryOptSettingsScreen
import net.nymtech.nymvpn.util.extensions.launchNotificationSettings
import net.nymtech.nymvpn.util.extensions.launchVpnSettings
import net.nymtech.nymvpn.util.extensions.scaledWidth
import net.nymtech.vpn.backend.Tunnel
import kotlin.Boolean

@Composable
Expand Down Expand Up @@ -120,11 +118,7 @@ fun SettingsScreen(appViewModel: AppViewModel, appUiState: AppUiState, showVpnSe
onSystemStatusClick = {
},
onLogoutClick = {
if (appUiState.managerState.tunnelState != Tunnel.State.Down) {
snackbar.showMessage(context.getString(R.string.action_requires_tunnel_down))
} else {
showLogoutDialog = true
}
showLogoutDialog = true
},
onQuitClick = {
(context as Activity).finishAffinity()
Expand Down
4 changes: 2 additions & 2 deletions nym-vpn-android/buildSrc/src/main/kotlin/Constants.kt
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import org.gradle.api.JavaVersion

object Constants {
const val VERSION_NAME = "v2.4.0"
const val VERSION_CODE = 24000
const val VERSION_NAME = "v2.5.0"
const val VERSION_CODE = 25000
const val TARGET_SDK = 36
const val COMPILE_SDK = 36
const val MIN_SDK = 24
Expand Down
3 changes: 3 additions & 0 deletions nym-vpn-app/.pkg/flatpak/net.nymtech.NymVPN.metainfo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@
</p>
</description>
<releases>
<release version="1.20.0" date="2025-12-02">
<url type="details">https://github.com/nymtech/nym-vpn-client/releases/tag/nym-vpn-app-v1.20.0</url>
</release>
<release version="1.19.0" date="2025-11-19">
<url type="details">https://github.com/nymtech/nym-vpn-client/releases/tag/nym-vpn-app-v1.19.0</url>
</release>
Expand Down
18 changes: 18 additions & 0 deletions nym-vpn-app/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.20.0] - 2025-12-02

### Added

- Allow seeing server details from home screen
- Auto focus node list search input
- Minimal obfuscation (AmneziaWG)
- Allow to connect dApps / wallets to the mixnet via SOCKS5 url or HTTP RPC url

### Changed

- Always show Anti-Censorship setting option
- Visual improvements

### Fixed

- Styling fixes and visual improvements

## [1.19.0] - 2025-11-19

### Added
Expand Down
57 changes: 57 additions & 0 deletions nym-vpn-app/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions nym-vpn-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
},
"dependencies": {
"@base-ui-components/react": "^1.0.0-beta.3",
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@headlessui/react": "^2.1.2",
"@lottiefiles/dotlottie-react": "^0.17.0",
"@radix-ui/react-accordion": "^1.2.3",
Expand Down
22 changes: 22 additions & 0 deletions nym-vpn-app/src-tauri/src/commands/tunnel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use crate::{
};
use tauri::{Manager, State};
use tracing::{debug, info, instrument, warn};
use std::net::IpAddr;

#[instrument(skip_all)]
#[tauri::command]
Expand Down Expand Up @@ -153,3 +154,24 @@ pub async fn set_allow_lan(vpnd: State<'_, VpndClient>, enabled: bool) -> Result
vpnd.set_allow_lan(enabled).await?;
Ok(())
}

#[instrument(skip(vpnd))]
#[tauri::command]
pub async fn get_default_dns(vpnd: State<'_, VpndClient>) -> Result<Vec<IpAddr>, BackendError> {
let dns = vpnd.get_default_dns().await?;
Ok(dns)
}

#[instrument(skip(vpnd))]
#[tauri::command]
pub async fn set_custom_dns_enabled(vpnd: State<'_, VpndClient>, enabled: bool) -> Result<(), BackendError> {
vpnd.set_custom_dns_enabled(enabled).await?;
Ok(())
}

#[instrument(skip(vpnd))]
#[tauri::command]
pub async fn set_custom_dns(vpnd: State<'_, VpndClient>, dns: Vec<IpAddr>) -> Result<(), BackendError> {
vpnd.set_custom_dns(dns).await?;
Ok(())
}
3 changes: 3 additions & 0 deletions nym-vpn-app/src-tauri/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@ async fn main() -> Result<()> {
tunnel::disconnect,
tunnel::set_node,
tunnel::set_quic,
tunnel::get_default_dns,
tunnel::set_custom_dns,
tunnel::set_custom_dns_enabled,
tunnel::set_no_ipv6,
tunnel::set_allow_lan,
cmd_db::db_set,
Expand Down
Loading