feat: allow access from LAN (tray action)

This commit is contained in:
arm64v8a
2022-08-27 09:44:32 +08:00
parent 6873a7e1ba
commit b48583ae1b
7 changed files with 56 additions and 25 deletions

View File

@@ -77,12 +77,18 @@ bool IsIpAddressV6(const QString &str) {
return false; return false;
} }
QWidget *GetMessageBoxParent() {
if (mainwindow == nullptr) return nullptr;
if (mainwindow->isVisible()) return mainwindow;
return nullptr;
}
int MessageBoxWarning(const QString &title, const QString &text) { int MessageBoxWarning(const QString &title, const QString &text) {
return QMessageBox::warning(nullptr, title, text); return QMessageBox::warning(GetMessageBoxParent(), title, text);
} }
int MessageBoxInfo(const QString &title, const QString &text) { int MessageBoxInfo(const QString &title, const QString &text) {
return QMessageBox::information(nullptr, title, text); return QMessageBox::information(GetMessageBoxParent(), title, text);
} }
void runOnUiThread(const std::function<void()> &callback, QObject *parent) { void runOnUiThread(const std::function<void()> &callback, QObject *parent) {

View File

@@ -159,6 +159,8 @@ inline QString ReadableSize(const qint64 &size) {
// UI // UI
QWidget *GetMessageBoxParent();
int MessageBoxWarning(const QString &title, const QString &text); int MessageBoxWarning(const QString &title, const QString &text);
int MessageBoxInfo(const QString &title, const QString &text); int MessageBoxInfo(const QString &title, const QString &text);

View File

@@ -151,6 +151,10 @@
<source>Connection statistics</source> <source>Connection statistics</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Minimize to tray icon on startup</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>DialogEditGroup</name> <name>DialogEditGroup</name>
@@ -941,10 +945,6 @@ End: %2</source>
<source>Remember last profile</source> <source>Remember last profile</source>
<translation></translation> <translation></translation>
</message> </message>
<message>
<source>Start minimal</source>
<translation></translation>
</message>
<message> <message>
<source>Move %1 item(s)</source> <source>Move %1 item(s)</source>
<translation> %1 </translation> <translation> %1 </translation>
@@ -1081,6 +1081,14 @@ End: %2</source>
<source>Copy links of selected (Nekoray)</source> <source>Copy links of selected (Nekoray)</source>
<translation> (Nekoray)</translation> <translation> (Nekoray)</translation>
</message> </message>
<message>
<source>Allow connections from the LAN</source>
<translation></translation>
</message>
<message>
<source>Manual addition of profiles is not allowed in subscription groupings.</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>ProxyItem</name> <name>ProxyItem</name>

View File

@@ -83,6 +83,7 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent)
connect(ui->language, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=](int index) { connect(ui->language, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [=](int index) {
CACHE.needRestart = true; CACHE.needRestart = true;
}); });
ui->start_minimal->setChecked(NekoRay::dataStore->start_minimal);
int built_in_len = ui->theme->count(); int built_in_len = ui->theme->count();
ui->theme->addItems(QStyleFactory::keys()); ui->theme->addItems(QStyleFactory::keys());
@@ -200,6 +201,7 @@ void DialogBasicSettings::accept() {
// Style // Style
NekoRay::dataStore->language = ui->language->currentIndex(); NekoRay::dataStore->language = ui->language->currentIndex();
NekoRay::dataStore->start_minimal = ui->start_minimal->isChecked();
// Subscription // Subscription

View File

@@ -384,6 +384,13 @@
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="0">
<widget class="QCheckBox" name="start_minimal">
<property name="text">
<string>Minimize to tray icon on startup</string>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="tab_2"> <widget class="QWidget" name="tab_2">

View File

@@ -262,7 +262,7 @@ MainWindow::MainWindow(QWidget *parent)
connect(ui->menu_program, &QMenu::aboutToShow, this, [=]() { connect(ui->menu_program, &QMenu::aboutToShow, this, [=]() {
ui->actionRemember_last_proxy->setChecked(NekoRay::dataStore->remember_enable); ui->actionRemember_last_proxy->setChecked(NekoRay::dataStore->remember_enable);
ui->actionStart_with_system->setChecked(GetProcessAutoRunSelf()); ui->actionStart_with_system->setChecked(GetProcessAutoRunSelf());
ui->actionStart_minimal->setChecked(NekoRay::dataStore->start_minimal); ui->actionAllow_LAN->setChecked(NekoRay::dataStore->inbound_address == "0.0.0.0");
// active server // active server
for (const auto &old: ui->menuActive_Server->actions()) { for (const auto &old: ui->menuActive_Server->actions()) {
ui->menuActive_Server->removeAction(old); ui->menuActive_Server->removeAction(old);
@@ -304,7 +304,7 @@ MainWindow::MainWindow(QWidget *parent)
r.load_control_force = true; r.load_control_force = true;
r.fn = "routes/" + fn; r.fn = "routes/" + fn;
if (r.Load()) { if (r.Load()) {
auto btn = QMessageBox::question(nullptr, "NekoRay", auto btn = QMessageBox::question(GetMessageBoxParent(), "NekoRay",
tr("Load routing and apply: %1").arg(fn) + "\n" + r.toString()); tr("Load routing and apply: %1").arg(fn) + "\n" + r.toString());
if (btn == QMessageBox::Yes) { if (btn == QMessageBox::Yes) {
NekoRay::Routing::SetToActive(fn); NekoRay::Routing::SetToActive(fn);
@@ -324,9 +324,9 @@ MainWindow::MainWindow(QWidget *parent)
connect(ui->actionStart_with_system, &QAction::triggered, this, [=](bool checked) { connect(ui->actionStart_with_system, &QAction::triggered, this, [=](bool checked) {
SetProcessAutoRunSelf(checked); SetProcessAutoRunSelf(checked);
}); });
connect(ui->actionStart_minimal, &QAction::triggered, this, [=](bool checked) { connect(ui->actionAllow_LAN, &QAction::triggered, this, [=](bool checked) {
NekoRay::dataStore->start_minimal = checked; NekoRay::dataStore->inbound_address = checked ? "0.0.0.0" : "127.0.0.1";
NekoRay::dataStore->Save(); dialog_message(Dialog_DialogManageRoutes, "UpdateDataStore,RouteChanged");
}); });
// //
connect(ui->checkBox_VPN, &QCheckBox::clicked, this, [=](bool checked) { connect(ui->checkBox_VPN, &QCheckBox::clicked, this, [=](bool checked) {
@@ -489,8 +489,8 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info)
if (info.contains("VPNChanged") && title_spmode == NekoRay::SystemProxyMode::VPN) { if (info.contains("VPNChanged") && title_spmode == NekoRay::SystemProxyMode::VPN) {
MessageBoxWarning(tr("VPN settings changed"), tr("Restart VPN to take effect.")); MessageBoxWarning(tr("VPN settings changed"), tr("Restart VPN to take effect."));
} else if (changed && NekoRay::dataStore->started_id >= 0 && } else if (changed && NekoRay::dataStore->started_id >= 0 &&
QMessageBox::question(this, tr("Confirmation"), tr("Settings changed, restart proxy?") QMessageBox::question(GetMessageBoxParent(), tr("Confirmation"),
) == QMessageBox::StandardButton::Yes) { tr("Settings changed, restart proxy?")) == QMessageBox::StandardButton::Yes) {
neko_start(NekoRay::dataStore->started_id); neko_start(NekoRay::dataStore->started_id);
} }
refresh_status(); refresh_status();
@@ -507,8 +507,7 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info)
// 订阅完毕 // 订阅完毕
refresh_proxy_list(); refresh_proxy_list();
if (!info.contains("dingyue")) { if (!info.contains("dingyue")) {
QMessageBox::information(this, "NekoRay", MessageBoxInfo("NekoRay", tr("Imported %1 profile(s)").arg(NekoRay::dataStore->imported_count));
tr("Imported %1 profile(s)").arg(NekoRay::dataStore->imported_count));
} }
} else if (sender == "ExternalProcess") { } else if (sender == "ExternalProcess") {
if (info == "Crashed") { if (info == "Crashed") {
@@ -880,14 +879,20 @@ void MainWindow::on_proxyListTable_itemDoubleClicked(QTableWidgetItem *item) {
connect(dialog, &QDialog::finished, dialog, &QDialog::deleteLater); connect(dialog, &QDialog::finished, dialog, &QDialog::deleteLater);
} }
#define NO_ADD_TO_SUBSCRIPTION_GROUP \
if (!NekoRay::profileManager->CurrentGroup()->url.isEmpty()) { \
MessageBoxWarning("NekoRay", MainWindow::tr("Manual addition of profiles is not allowed in subscription groupings.")); \
return; \
}
void MainWindow::on_menu_add_from_input_triggered() { void MainWindow::on_menu_add_from_input_triggered() {
if (!NekoRay::profileManager->CurrentGroup()->url.isEmpty()) return; NO_ADD_TO_SUBSCRIPTION_GROUP
auto dialog = new DialogEditProfile("socks", NekoRay::dataStore->current_group, this); auto dialog = new DialogEditProfile("socks", NekoRay::dataStore->current_group, this);
connect(dialog, &QDialog::finished, dialog, &QDialog::deleteLater); connect(dialog, &QDialog::finished, dialog, &QDialog::deleteLater);
} }
void MainWindow::on_menu_add_from_clipboard_triggered() { void MainWindow::on_menu_add_from_clipboard_triggered() {
if (!NekoRay::profileManager->CurrentGroup()->url.isEmpty()) return; NO_ADD_TO_SUBSCRIPTION_GROUP
auto clipboard = QApplication::clipboard()->text(); auto clipboard = QApplication::clipboard()->text();
NekoRay::sub::groupUpdater->AsyncUpdate(clipboard); NekoRay::sub::groupUpdater->AsyncUpdate(clipboard);
} }
@@ -896,9 +901,7 @@ void MainWindow::on_menu_clone_triggered() {
auto ents = get_now_selected(); auto ents = get_now_selected();
if (ents.isEmpty()) return; if (ents.isEmpty()) return;
auto btn = QMessageBox::question(nullptr, auto btn = QMessageBox::question(this, tr("Clone"), tr("Clone %1 item(s)").arg(ents.count()));
tr("Clone"),
tr("Clone %1 item(s)").arg(ents.count()));
if (btn != QMessageBox::Yes) return; if (btn != QMessageBox::Yes) return;
QStringList sls; QStringList sls;
@@ -961,7 +964,7 @@ void MainWindow::on_menu_reset_traffic_triggered() {
void MainWindow::on_menu_profile_debug_info_triggered() { void MainWindow::on_menu_profile_debug_info_triggered() {
auto ents = get_now_selected(); auto ents = get_now_selected();
if (ents.count() != 1) return; if (ents.count() != 1) return;
auto btn = QMessageBox::information(nullptr, "NekoRay", ents.first()->ToJsonBytes(), "OK", "Edit", "Reload", 0, 0); auto btn = QMessageBox::information(this, "NekoRay", ents.first()->ToJsonBytes(), "OK", "Edit", "Reload", 0, 0);
if (btn == 1) { if (btn == 1) {
QDesktopServices::openUrl(QUrl::fromLocalFile( QDesktopServices::openUrl(QUrl::fromLocalFile(
QFileInfo(QString("profiles/%1.json").arg(ents.first()->id)).absoluteFilePath() QFileInfo(QString("profiles/%1.json").arg(ents.first()->id)).absoluteFilePath()
@@ -1068,7 +1071,7 @@ void MainWindow::display_qr_link(bool nkrFormat) {
} }
void MainWindow::on_menu_scan_qr_triggered() { void MainWindow::on_menu_scan_qr_triggered() {
if (!NekoRay::profileManager->CurrentGroup()->url.isEmpty()) return; NO_ADD_TO_SUBSCRIPTION_GROUP
#ifndef NKR_NO_EXTERNAL #ifndef NKR_NO_EXTERNAL
using namespace ZXingQt; using namespace ZXingQt;

View File

@@ -482,8 +482,8 @@
<addaction name="menu_scan_qr"/> <addaction name="menu_scan_qr"/>
<addaction name="separator"/> <addaction name="separator"/>
<addaction name="actionStart_with_system"/> <addaction name="actionStart_with_system"/>
<addaction name="actionStart_minimal"/>
<addaction name="actionRemember_last_proxy"/> <addaction name="actionRemember_last_proxy"/>
<addaction name="actionAllow_LAN"/>
<addaction name="menuActive_Server"/> <addaction name="menuActive_Server"/>
<addaction name="menuActive_Routing"/> <addaction name="menuActive_Routing"/>
<addaction name="menu_spmode"/> <addaction name="menu_spmode"/>
@@ -704,6 +704,9 @@
<property name="text"> <property name="text">
<string>Move</string> <string>Move</string>
</property> </property>
<property name="shortcut">
<string notr="true">Ctrl+M</string>
</property>
</action> </action>
<action name="actionStart_with_system"> <action name="actionStart_with_system">
<property name="checkable"> <property name="checkable">
@@ -721,12 +724,12 @@
<string>Remember last profile</string> <string>Remember last profile</string>
</property> </property>
</action> </action>
<action name="actionStart_minimal"> <action name="actionAllow_LAN">
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
</property> </property>
<property name="text"> <property name="text">
<string>Start minimal</string> <string>Allow connections from the LAN</string>
</property> </property>
</action> </action>
<action name="menu_remove_unavailable"> <action name="menu_remove_unavailable">