diff --git a/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po b/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po index 9436195..22ec41d 100644 --- a/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po +++ b/package/luci-compat/files/luci/i18n/smartdns.zh-cn.po @@ -269,6 +269,21 @@ msgstr "未运行" msgid "No check certificate" msgstr "停用证书校验" +msgid "Please set proxy server first." +msgstr "请先设置代理服务器。" + +msgid "Proxy Server" +msgstr "代理服务器" + +msgid "Proxy Server URL, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址,格式:[socks5|http]://user:pass@ip:port。" + +msgid "Proxy server URL format error, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址格式错误,格式:[socks5|http]://user:pass@ip:port。" + +msgid "Proxy Server Settings" +msgstr "代理服务器设置" + msgid "Query DNS through specific dns server group, such as office, home." msgstr "使用指定服务器组查询,比如office, home。" @@ -431,6 +446,12 @@ msgstr "设置所有域名的 TTL 值。" msgid "Technical Support" msgstr "技术支持" +msgid "Use Proxy" +msgstr "使用代理" + +msgid "Use proxy to connect to upstream DNS server." +msgstr "使用代理连接上游DNS服务器。" + msgid "URL" msgstr "URL" diff --git a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua index 39e8237..24c7ee1 100644 --- a/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua +++ b/package/luci-compat/files/luci/model/cbi/smartdns/smartdns.lua @@ -34,6 +34,7 @@ s.anonymous = true s:tab("settings", translate("General Settings")) s:tab("advanced", translate('Advanced Settings')) s:tab("seconddns", translate("Second Server Settings")) +s:tab("proxy", translate("Proxy Server Settings")) s:tab("custom", translate("Custom Settings")) ---- Eanble @@ -312,6 +313,21 @@ o.cfgvalue = function(...) return Flag.cfgvalue(...) or "0" end +----- Proxy server settings +o = s:taboption("proxy", Value, "proxy_server", translate("Proxy Server"), translate("Proxy Server URL, format: [socks5|http]://user:pass@ip:port.")); +o.datatype = 'string'; +function o.validate(self, value) + if (value == "") then + return true + end + + if (not value:match("^http://") and not value:match("^socks5://")) then + return nil, translate("Proxy server URL format error, format: [socks5|http]://user:pass@ip:port.") + end + + return value +end + ----- custom settings custom = s:taboption("custom", Value, "Custom Settings", translate(""), diff --git a/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua b/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua index e6b03a3..157f45c 100644 --- a/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua +++ b/package/luci-compat/files/luci/model/cbi/smartdns/upstream.lua @@ -133,6 +133,23 @@ o.default = "" o.rempty = true o.datatype = "uinteger" +---- use proxy +o = s:option(Flag, "use_proxy", translate("Use Proxy"), translate("Use proxy to connect to upstream DNS server.")) +o.rmempty = true +o.default = o.disabled +o.cfgvalue = function(...) + return Flag.cfgvalue(...) or "0" +end +function o.validate(self, value, section) + if value == "1" then + local proxy = m.uci:get_first("smartdns", "smartdns", "proxy_server") + if proxy == nil or proxy == "" then + return nil, translate("Please set proxy server first.") + end + end + return value +end + ---- other args o = s:option(Value, "addition_arg", translate("Additional Server Args"), translate("Additional Args for upstream dns servers")) o.default = "" diff --git a/package/luci/files/luci/i18n/smartdns.zh-cn.po b/package/luci/files/luci/i18n/smartdns.zh-cn.po index d0ffa62..0c51a14 100644 --- a/package/luci/files/luci/i18n/smartdns.zh-cn.po +++ b/package/luci/files/luci/i18n/smartdns.zh-cn.po @@ -301,6 +301,24 @@ msgstr "停用证书校验" msgid "None" msgstr "无" +msgid "Only socks5 proxy support udp server." +msgstr "仅SOCKS5代理支持UDP服务器。" + +msgid "Please set proxy server first." +msgstr "请先设置代理服务器。" + +msgid "Proxy Server" +msgstr "代理服务器" + +msgid "Proxy Server URL, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址,格式:[socks5|http]://user:pass@ip:port。" + +msgid "Proxy server URL format error, format: [socks5|http]://user:pass@ip:port." +msgstr "代理服务器地址格式错误,格式:[socks5|http]://user:pass@ip:port。" + +msgid "Proxy Server Settings" +msgstr "代理服务器设置" + msgid "Query DNS through specific dns server group, such as office, home." msgstr "使用指定服务器组查询,比如office, home。" @@ -463,6 +481,12 @@ msgstr "设置所有域名的 TTL 值。" msgid "Technical Support" msgstr "技术支持" +msgid "Use Proxy" +msgstr "使用代理" + +msgid "Use proxy to connect to upstream DNS server." +msgstr "使用代理连接上游DNS服务器。" + msgid "URL" msgstr "URL" diff --git a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js index f47802e..b5edc8c 100644 --- a/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js +++ b/package/luci/files/root/www/luci-static/resources/view/smartdns/smartdns.js @@ -132,6 +132,7 @@ return view.extend({ s.tab("advanced", _('Advanced Settings')); s.tab("seconddns", _("Second Server Settings")); s.tab("files", _("Download Files Setting"), _("Download domain list files for domain-rule and include config files, please refresh the page after download to take effect.")); + s.tab("proxy", _("Proxy Server Settings")); s.tab("custom", _("Custom Settings")); /////////////////////////////////////// @@ -444,6 +445,23 @@ return view.extend({ so.rmempty = true; so.datatype = 'string'; + /////////////////////////////////////// + // Proxy server settings; + /////////////////////////////////////// + o = s.taboption("proxy", form.Value, "proxy_server", _("Proxy Server"), _("Proxy Server URL, format: [socks5|http]://user:pass@ip:port.")); + o.datatype = 'string'; + o.validate = function (section_id, value) { + if (value == "") { + return true; + } + + if (!value.match(/^(socks5|http):\/\//)) { + return _("Proxy server URL format error, format: [socks5|http]://user:pass@ip:port."); + } + + return true; + } + /////////////////////////////////////// // custom settings; /////////////////////////////////////// @@ -602,6 +620,32 @@ return view.extend({ o.rempty = true o.datatype = "uinteger" o.modalonly = true; + + // use proxy + o = s.taboption("advanced", form.Flag, "use_proxy", _("Use Proxy"), + _("Use proxy to connect to upstream DNS server.")) + o.default = o.disabled + o.modalonly = true; + o.optional = true; + o.rempty = true; + o.validate = function(section_id, value) { + var flag = this.formvalue(section_id); + if (flag == "0") { + return true; + } + + var proxy_server = uci.sections("smartdns", "smartdns")[0].proxy_server; + var server_type = this.section.formvalue(section_id, "type"); + if (proxy_server == "" || proxy_server == undefined) { + return _("Please set proxy server first."); + } + + if (server_type == "udp" && !proxy_server.match(/^(socks5):\/\//)) { + return _("Only socks5 proxy support udp server."); + } + + return true; + } // other args o = s.taboption("advanced", form.Value, "addition_arg", _("Additional Server Args"), diff --git a/package/openwrt/files/etc/init.d/smartdns b/package/openwrt/files/etc/init.d/smartdns index 42e0734..f5062f3 100644 --- a/package/openwrt/files/etc/init.d/smartdns +++ b/package/openwrt/files/etc/init.d/smartdns @@ -184,6 +184,7 @@ load_server() config_get spki_pin "$section" "spki_pin" "" config_get addition_arg "$section" "addition_arg" "" config_get set_mark "$section" "set_mark" "" + config_get_bool use_proxy "$section" "use_proxy" "0" [ "$enabled" = "0" ] && return @@ -216,6 +217,7 @@ load_server() [ "$check_edns" = "0" ] || ADDITIONAL_ARGS="$ADDITIONAL_ARGS -check-edns" [ -z "$spki_pin" ] || ADDITIONAL_ARGS="$ADDITIONAL_ARGS -spki-pin $spki_pin" [ -z "$set_mark" ] || ADDITIONAL_ARGS="$ADDITIONAL_ARGS -set-mark $set_mark" + [ "$use_proxy" = "0" ] || ADDITIONAL_ARGS="$ADDITIONAL_ARGS -proxy default-proxy" if [ -z "$port" ]; then DNS_ADDRESS="$ip" @@ -533,6 +535,9 @@ load_service() config_get_bool bind_device "$section" "bind_device" "0" config_get bind_device_name "$section" "bind_device_name" "${lan_device}" [ ! -z "$bind_device_name" ] && [ "$bind_device" = "1" ] && device="${bind_device_name}" + + config_get proxy_server "$section" "proxy_server" "" + [ -z "$proxy_server" ] || conf_append "proxy-server" "$proxy_server -name default-proxy" config_get redirect "$section" "redirect" "" config_get old_port "$section" "old_port" "0" diff --git a/src/dns_client.c b/src/dns_client.c index 20ef485..956b427 100644 --- a/src/dns_client.c +++ b/src/dns_client.c @@ -1693,7 +1693,7 @@ static int _dns_client_create_socket_udp_proxy(struct dns_server_info *server_in proxy = proxy_conn_new(server_info->proxy_name, server_info->ip, server_info->port, 1); if (proxy == NULL) { - tlog(TLOG_ERROR, "create proxy failed, %s", server_info->ip); + tlog(TLOG_ERROR, "create proxy failed, %s, proxy: %s", server_info->ip, server_info->proxy_name); goto errout; } @@ -1837,7 +1837,7 @@ static int _DNS_client_create_socket_tcp(struct dns_server_info *server_info) if (server_info->proxy_name[0] != '\0') { proxy = proxy_conn_new(server_info->proxy_name, server_info->ip, server_info->port, 0); if (proxy == NULL) { - tlog(TLOG_ERROR, "create proxy failed, %s", server_info->ip); + tlog(TLOG_ERROR, "create proxy failed, %s, proxy: %s", server_info->ip, server_info->proxy_name); goto errout; } fd = proxy_conn_get_fd(proxy); @@ -1945,7 +1945,7 @@ static int _DNS_client_create_socket_tls(struct dns_server_info *server_info, ch if (server_info->proxy_name[0] != '\0') { proxy = proxy_conn_new(server_info->proxy_name, server_info->ip, server_info->port, 0); if (proxy == NULL) { - tlog(TLOG_ERROR, "create proxy failed, %s", server_info->ip); + tlog(TLOG_ERROR, "create proxy failed, %s, proxy: %s", server_info->ip, server_info->proxy_name); goto errout; } fd = proxy_conn_get_fd(proxy); diff --git a/src/dns_conf.c b/src/dns_conf.c index 6d02b67..e8c135b 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -1638,13 +1638,13 @@ static int _config_proxy_server(void *data, int argc, char *argv[]) server = malloc(sizeof(*server)); if (server == NULL) { tlog(TLOG_WARN, "malloc memory failed."); - return -1; + goto errout; } memset(server, 0, sizeof(*server)); ip = argv[1]; if (parse_uri_ext(ip, scheme, server->username, server->password, server->server, &port, NULL) != 0) { - return -1; + goto errout; } /* process extra options */