From 38e51be766380ed3f4bdb9d1178a37f7b8f265de Mon Sep 17 00:00:00 2001 From: arm64v8a <48624112+arm64v8a@users.noreply.github.com> Date: Sat, 13 Aug 2022 14:09:21 +0800 Subject: [PATCH] parse hysteria share link --- fmt/Preset.hpp | 17 +++++++++++++++++ main/Const.hpp | 1 - sub/GroupUpdater.cpp | 27 +++++++++++++++++++++++++++ ui/edit/dialog_edit_profile.cpp | 14 +++----------- ui/edit/edit_custom.cpp | 2 +- ui/edit/gen_hysteria.cpp | 7 +++---- ui/edit/gen_hysteria.h | 4 +--- 7 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 fmt/Preset.hpp diff --git a/fmt/Preset.hpp b/fmt/Preset.hpp new file mode 100644 index 0000000..23f4753 --- /dev/null +++ b/fmt/Preset.hpp @@ -0,0 +1,17 @@ +#pragma once + +namespace Preset { + namespace Hysteria { + inline const char *command = "--no-check -c %config%"; + inline const char *config = "{\n" + " \"server\": \"127.0.0.1:%mapping_port%\",\n" + " \"obfs\": \"fuck me till the daylight\",\n" + " \"up_mbps\": 10,\n" + " \"down_mbps\": 50,\n" + " \"server_name\": \"real.name.com\",\n" + " \"socks5\": {\n" + " \"listen\": \"127.0.0.1:%socks_port%\"\n" + " }\n" + "}"; + } +} diff --git a/main/Const.hpp b/main/Const.hpp index d1863c5..2121b5a 100644 --- a/main/Const.hpp +++ b/main/Const.hpp @@ -23,6 +23,5 @@ namespace NekoRay { VPN, }; } - } diff --git a/sub/GroupUpdater.cpp b/sub/GroupUpdater.cpp index fd04e3f..cf34b63 100644 --- a/sub/GroupUpdater.cpp +++ b/sub/GroupUpdater.cpp @@ -3,10 +3,12 @@ #include "db/Database.hpp" #include "db/ProfileFilter.hpp" #include "fmt/includes.h" +#include "fmt/Preset.hpp" #include "GroupUpdater.hpp" #include +#include #ifndef NKR_NO_EXTERNAL @@ -105,6 +107,31 @@ namespace NekoRay::sub { if (!ok) return; } + // Hysteria + if (str.startsWith("hysteria://")) { + // https://github.com/HyNetwork/hysteria/wiki/URI-Scheme + ent = ProfileManager::NewProxyEntity("custom"); + auto bean = ent->CustomBean(); + auto url = QUrl(str); + auto query = QUrlQuery(url.query()); + if (url.host().isEmpty() || url.port() == -1 || !query.hasQueryItem("upmbps")) return; + bean->name = url.fragment(); + bean->serverAddress = url.host(); + bean->serverPort = url.port(); + bean->core = "hysteria"; + bean->command = QString(Preset::Hysteria::command).split(" "); + auto result = QString2QJsonObject(Preset::Hysteria::config); + result["obfs"] = query.queryItemValue("obfsParam"); + result["insecure"] = query.queryItemValue("insecure") == "1"; + result["up_mbps"] = query.queryItemValue("upmbps").toInt(); + result["down_mbps"] = query.queryItemValue("downmbps").toInt(); + result["protocol"] = query.hasQueryItem("protocol") ? query.queryItemValue("protocol") : "udp"; + if (query.hasQueryItem("auth")) result["auth_str"] = query.queryItemValue("auth"); + if (query.hasQueryItem("alpn")) result["alpn"] = query.queryItemValue("alpn"); + if (query.hasQueryItem("peer")) result["server_name"] = query.queryItemValue("peer"); + bean->config_simple = QJsonObject2QString(result, false); + } + // End if (ent == nullptr) return; profileManager->AddProfile(ent, gid_add_to); diff --git a/ui/edit/dialog_edit_profile.cpp b/ui/edit/dialog_edit_profile.cpp index 0765dd5..46783c0 100644 --- a/ui/edit/dialog_edit_profile.cpp +++ b/ui/edit/dialog_edit_profile.cpp @@ -10,6 +10,7 @@ #include "ui/edit/edit_custom.h" #include "fmt/includes.h" +#include "fmt/Preset.hpp" #include "qv2ray/v2/ui/widgets/editors/w_JsonEditor.hpp" #include "main/GuiUtils.hpp" @@ -129,17 +130,8 @@ void DialogEditProfile::typeSelected(const QString &newType) { innerEditor = _innerWidget; if (type == "hysteria" || ent->CustomBean()->core == "hysteria") { _innerWidget->preset_core = type; - _innerWidget->preset_command = "-c %config%"; - _innerWidget->preset_config = "{\n" - " \"server\": \"127.0.0.1:%mapping_port%\",\n" - " \"obfs\": \"fuck me till the daylight\",\n" - " \"up_mbps\": 10,\n" - " \"down_mbps\": 50,\n" - " \"server_name\": \"real.name.com\",\n" - " \"socks5\": {\n" - " \"listen\": \"127.0.0.1:%socks_port%\"\n" - " }\n" - "}"; + _innerWidget->preset_command = Preset::Hysteria::command; + _innerWidget->preset_config = Preset::Hysteria::config; } type = "custom"; } else { diff --git a/ui/edit/edit_custom.cpp b/ui/edit/edit_custom.cpp index dbbd266..632a30b 100644 --- a/ui/edit/edit_custom.cpp +++ b/ui/edit/edit_custom.cpp @@ -48,7 +48,7 @@ void EditCustom::onStart(QSharedPointer _ent) { // Generators if (bean->core == "hysteria") { ui->generator->setVisible(true); - auto genHy = new GenHysteria(ent, preset_config); + auto genHy = new GenHysteria(ent); ui->generator->layout()->addWidget(genHy); connect(genHy, &GenHysteria::config_generated, this, [=](const QString &result) { ui->config_simple->setText(result); diff --git a/ui/edit/gen_hysteria.cpp b/ui/edit/gen_hysteria.cpp index a540b0b..8c4e301 100644 --- a/ui/edit/gen_hysteria.cpp +++ b/ui/edit/gen_hysteria.cpp @@ -2,13 +2,12 @@ #include "ui_gen_hysteria.h" #include "fmt/CustomBean.hpp" +#include "fmt/Preset.hpp" -GenHysteria::GenHysteria(const QSharedPointer &ent, const QString &preset_config, - QWidget *parent) : +GenHysteria::GenHysteria(const QSharedPointer &ent, QWidget *parent) : QWidget(parent), ui(new Ui::GenHysteria) { ui->setupUi(this); this->ent = ent; - this->preset_config = preset_config; } GenHysteria::~GenHysteria() { @@ -16,7 +15,7 @@ GenHysteria::~GenHysteria() { } void GenHysteria::on_gen_clicked() { - auto result = QString2QJsonObject(preset_config); + auto result = QString2QJsonObject(Preset::Hysteria::config); result["obfs"] = ui->obfs_password->text(); result["insecure"] = ui->allow_insecure->isChecked(); result["protocol"] = ui->protocol->currentText(); diff --git a/ui/edit/gen_hysteria.h b/ui/edit/gen_hysteria.h index be92819..e7cb7b3 100644 --- a/ui/edit/gen_hysteria.h +++ b/ui/edit/gen_hysteria.h @@ -11,15 +11,13 @@ class GenHysteria : public QWidget { Q_OBJECT public: - explicit GenHysteria(const QSharedPointer &ent, const QString &preset_config, - QWidget *parent = nullptr); + explicit GenHysteria(const QSharedPointer &ent, QWidget *parent = nullptr); ~GenHysteria() override; private: Ui::GenHysteria *ui; QSharedPointer ent; - QString preset_config; signals: