修复 启动隧道时,隧道修改设置的bug
去除无用import
This commit is contained in:
parent
9c581f3a7c
commit
bddc0ea80d
2
pom.xml
2
pom.xml
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>top.octopusyan</groupId>
|
||||
<artifactId>YanFrp</artifactId>
|
||||
<version>0.1.2-SNAPSHOT</version>
|
||||
<version>1.0.3-SNAPSHOT</version>
|
||||
<name>YanFrp</name>
|
||||
|
||||
<properties>
|
||||
|
@ -10,7 +10,7 @@ import javafx.stage.Stage;
|
||||
import javafx.stage.StageStyle;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import top.octopusyan.base.BaseController;
|
||||
import top.octopusyan.controller.LoginController;
|
||||
import top.octopusyan.http.OkHttpClientConfig;
|
||||
import top.octopusyan.manager.FrpManager;
|
||||
import top.octopusyan.manager.http.HttpConfig;
|
||||
@ -21,6 +21,8 @@ import top.octopusyan.utils.AlertUtil;
|
||||
import top.octopusyan.utils.EncryptionUtil;
|
||||
import top.octopusyan.utils.FxmlUtil;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author : octopus yan
|
||||
* @email : octopus_yan@foxmail.com
|
||||
@ -84,11 +86,11 @@ public class YanFrpApplication extends Application {
|
||||
root.getPrefHeight() + 20,
|
||||
Color.TRANSPARENT
|
||||
);
|
||||
scene.getStylesheets().addAll(getClass().getResource("/css/root.css").toExternalForm());
|
||||
scene.getStylesheets().addAll(Objects.requireNonNull(getClass().getResource("/css/root.css")).toExternalForm());
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
|
||||
BaseController controller = fxmlLoader.getController();
|
||||
LoginController controller = fxmlLoader.getController();
|
||||
controller.setApplication(this);
|
||||
|
||||
} catch (Throwable t) {
|
||||
|
@ -52,7 +52,6 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
public static final String PROXY_LIST_ITEM_RUN_CLASS = "proxyListItem-run";
|
||||
public static final String PROXY_LIST_ITEM_CLOSE_CLASS = "proxyListItem-close";
|
||||
public static final String PROXY_LIST_ITEM_SELECT_CLASS = "proxyListItem-select";
|
||||
public static final String INPUT_CLASS = "inputText";
|
||||
|
||||
@FXML
|
||||
public StackPane root;
|
||||
@ -93,12 +92,13 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
@FXML
|
||||
public JFXButton logoutBtn;
|
||||
|
||||
private ToggleGroup openProxyGroup = new ToggleGroup();
|
||||
private SimpleBooleanProperty customizeDomain = new SimpleBooleanProperty(false);
|
||||
private Map<String, FrpManager> frpUtilMap = new HashMap<>();
|
||||
private final ToggleGroup openProxyGroup = new ToggleGroup();
|
||||
private final SimpleBooleanProperty customizeDomain = new SimpleBooleanProperty(false);
|
||||
private final Map<Integer, FrpManager> frpUtilMap = new HashMap<>();
|
||||
private final Map<Integer, ProxySetup> userProxy = new HashMap<>();
|
||||
private ProxySetupModel proxySetupModel;
|
||||
private ProxySetup proxySetup;
|
||||
private SimpleBooleanProperty setup = new SimpleBooleanProperty(false);
|
||||
private final SimpleBooleanProperty setup = new SimpleBooleanProperty(false);
|
||||
|
||||
@Override
|
||||
public boolean dragWindow() {
|
||||
@ -156,6 +156,20 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
|
||||
// 如果用户隧道列表不为空
|
||||
if (result != null && result.size() > 0) {
|
||||
|
||||
// 上次关闭时选择的隧道
|
||||
if (selectProxyName != null)
|
||||
for (int i = 0; i < result.size(); i++) {
|
||||
if (result.get(i).getProxy_name().equals(selectProxyName))
|
||||
selectProxy(i);
|
||||
selectProxyName = null;
|
||||
}
|
||||
|
||||
// 保存用户隧道信息
|
||||
for (ProxySetup setup : result) {
|
||||
userProxy.put(setup.getId(), setup);
|
||||
}
|
||||
|
||||
proxySetup = result.get(selectProxy());
|
||||
proxySetupModel.set(result.get(selectProxy()));
|
||||
// 初始化用户隧道列表
|
||||
@ -163,10 +177,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
// 重置隧道列表视图
|
||||
initProxyListView();
|
||||
}
|
||||
// else {
|
||||
// }
|
||||
//
|
||||
// bindDataView();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@ -264,8 +275,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
// 是否切换为自定义域名
|
||||
if (newValue) {
|
||||
// 隐藏系统域名
|
||||
if (parent.getChildren().contains(domainSuffixTextField))
|
||||
parent.getChildren().remove(domainSuffixTextField);
|
||||
parent.getChildren().remove(domainSuffixTextField);
|
||||
// 用户域名是否自定义
|
||||
if (!DomainUtil.isCustomize(proxySetupModel.get())) {
|
||||
proxySetupModel.setDomain("");
|
||||
@ -298,7 +308,9 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
tabPane.getSelectionModel().select(1);
|
||||
}
|
||||
|
||||
/** 设置访问链接 */
|
||||
/**
|
||||
* 设置访问链接
|
||||
*/
|
||||
private void setDomainLink() {
|
||||
// 外网访问连接
|
||||
if (DomainUtil.isHttp(proxySetupModel)) {
|
||||
@ -315,15 +327,16 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
public void initViewAction() {
|
||||
// 重置
|
||||
resetProxyBtn.setOnMouseClicked(event -> {
|
||||
proxySetup.setRuning(false);
|
||||
proxySetup = userProxy.get(proxySetup.getId());
|
||||
proxySetup.setRuning(proxySetupModel.isRunning());
|
||||
proxySetupModel.set(proxySetup);
|
||||
domainTextField.resetValidation();
|
||||
});
|
||||
|
||||
// 日志清理
|
||||
clearLogBtn.setOnMouseClicked(event -> {
|
||||
if (frpUtilMap.get(proxySetupModel.getProxyName()) != null)
|
||||
frpUtilMap.get(proxySetupModel.getProxyName()).clearLog();
|
||||
if (frpUtilMap.get(proxySetup.getId()) != null)
|
||||
frpUtilMap.get(proxySetup.getId()).clearLog();
|
||||
});
|
||||
|
||||
// 更换服务器地址
|
||||
@ -356,16 +369,12 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
// 本地IP检查
|
||||
localHostTextField.getValidators().add(TextValidate.IpRequired);
|
||||
localHostTextField.getValidators().add(TextValidate.IpFormat);
|
||||
localHostTextField.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||
localHostTextField.validate();
|
||||
});
|
||||
localHostTextField.textProperty().addListener((observable, oldValue, newValue) -> localHostTextField.validate());
|
||||
|
||||
// 端口检查
|
||||
localPortTextField.getValidators().add(TextValidate.PortRequired);
|
||||
localPortTextField.getValidators().add(TextValidate.PortFormat);
|
||||
localPortTextField.textProperty().addListener((observable, oldValue, newValue) -> {
|
||||
localPortTextField.validate();
|
||||
});
|
||||
localPortTextField.textProperty().addListener((observable, oldValue, newValue) -> localPortTextField.validate());
|
||||
|
||||
// 域名检查
|
||||
setup.addListener((observable, oldValue, newValue) -> {
|
||||
@ -403,7 +412,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
Platform.runLater(() -> {
|
||||
setup.set(false);
|
||||
proxySetupModel.set(proxySetup);
|
||||
FrpManager frpManager = frpUtilMap.get(proxySetup.getProxy_name());
|
||||
FrpManager frpManager = frpUtilMap.get(proxySetup.getId());
|
||||
proxyLogPane.contentProperty().set(frpManager == null ? null : frpManager.getConsole());
|
||||
setup.set(true);
|
||||
setDomainLink();
|
||||
@ -430,9 +439,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
});
|
||||
|
||||
// 链接跳转
|
||||
domainLink.setOnMouseClicked(event -> {
|
||||
getApplication().getHostServices().showDocument(domainLink.getText());
|
||||
});
|
||||
domainLink.setOnMouseClicked(event -> getApplication().getHostServices().showDocument(domainLink.getText()));
|
||||
|
||||
// 复制外网访问地址
|
||||
copyDomainBtn.setOnMouseClicked(event -> {
|
||||
@ -448,7 +455,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
|
||||
// 退出登录
|
||||
logoutBtn.setOnMouseClicked(event -> {
|
||||
for (String key : frpUtilMap.keySet()) {
|
||||
for (Integer key : frpUtilMap.keySet()) {
|
||||
frpUtilMap.get(key).stop();
|
||||
}
|
||||
ApplicatonStore.logout();
|
||||
@ -516,16 +523,15 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
proxyListView.getSelectionModel().select(items.size() - 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启动代理
|
||||
*/
|
||||
private void startProxy() {
|
||||
|
||||
// 验证
|
||||
if(!domainTextField.validate() || !localHostTextField.validate() || !localPortTextField.validate())
|
||||
if (!domainTextField.validate() || !localHostTextField.validate() || !localPortTextField.validate())
|
||||
return;
|
||||
|
||||
// 非 http 隧道系统随机分配端口
|
||||
@ -533,45 +539,37 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
proxySetupModel.setRemotePort(String.valueOf(ProxyManager.randomPort()));
|
||||
}
|
||||
|
||||
// 是用户隧道
|
||||
if (proxySetupModel.getId() != null && !proxySetupModel.get().equals(proxySetup)) {
|
||||
// 删除旧隧道
|
||||
ProxyManager.delete(Integer.parseInt(proxySetupModel.getId()));
|
||||
|
||||
// 是否有修改
|
||||
if (!proxySetupModel.get().equals(userProxy.get(proxySetup.getId()))) {
|
||||
// 添加隧道
|
||||
ProxyManager.add(new OnHttpListener<ProxySetup>() {
|
||||
@Override
|
||||
public void onSucceed(ProxySetup result) {
|
||||
result.setRuning(frpUtilMap.containsKey(result.getProxy_name()));
|
||||
proxySetupModel.set(result);
|
||||
// 如果添加成功
|
||||
if (result != null) {
|
||||
userProxy.put(result.getId(), result);
|
||||
start(result);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(Exception e) {
|
||||
|
||||
}
|
||||
}, proxySetupModel.get());
|
||||
} else if(proxySetupModel.getId() == null) {
|
||||
|
||||
// 添加隧道
|
||||
ProxyManager.add(new OnHttpListener<ProxySetup>() {
|
||||
@Override
|
||||
public void onSucceed(ProxySetup result) {
|
||||
result.setRuning(frpUtilMap.containsKey(result.getProxy_name()));
|
||||
proxySetupModel.set(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(Exception e) {
|
||||
|
||||
}
|
||||
}, proxySetupModel.get());
|
||||
} else {
|
||||
start(proxySetup);
|
||||
}
|
||||
}
|
||||
|
||||
private void start(ProxySetup setup) {
|
||||
// 添加成功,设置运行状态
|
||||
setup.setRuning(frpUtilMap.containsKey(setup.getId()));
|
||||
proxySetupModel.set(setup);
|
||||
|
||||
// 初始化frputil
|
||||
FrpManager frpManager;
|
||||
if ((frpManager = frpUtilMap.get(proxySetupModel.getProxyName())) == null)
|
||||
frpUtilMap.put(proxySetupModel.getProxyName(), frpManager = FrpManager.init(proxySetupModel));
|
||||
if ((frpManager = frpUtilMap.get(setup.getId())) == null)
|
||||
frpUtilMap.put(proxySetup.getId(), frpManager = FrpManager.init(proxySetupModel));
|
||||
|
||||
// 设置文本域对象
|
||||
if (proxyLogPane.getContent() == null) proxyLogPane.contentProperty().set(frpManager.getConsole());
|
||||
@ -588,7 +586,7 @@ public class MainController extends BaseController<StackPane> implements Initial
|
||||
*/
|
||||
private void stopProxy() {
|
||||
// 关闭CMD
|
||||
FrpManager frpManager = frpUtilMap.get(proxySetupModel.getProxyName());
|
||||
FrpManager frpManager = frpUtilMap.get(proxySetup.getId());
|
||||
if (frpManager != null) frpManager.stop();
|
||||
}
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
package top.octopusyan.http;
|
||||
|
||||
import top.octopusyan.http.request.*;
|
||||
import top.octopusyan.manager.ProxyManager;
|
||||
import top.octopusyan.manager.http.api.NotParamApi;
|
||||
import top.octopusyan.manager.http.api.ParamApi;
|
||||
import top.octopusyan.manager.http.api.PathParamApi;
|
||||
import top.octopusyan.manager.http.config.BodyType;
|
||||
import top.octopusyan.manager.http.config.HttpConstant;
|
||||
import top.octopusyan.manager.ProxyManager;
|
||||
|
||||
/**
|
||||
* @author : octopus yan
|
||||
|
@ -32,29 +32,27 @@ public class OkHttpClientConfig {
|
||||
public static final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
|
||||
|
||||
public static OkHttpClient httpClient() {
|
||||
Interceptor tokenInterceptor = new Interceptor() {//全局拦截器,往请求头部添加 token 字段,实现全局添加 token
|
||||
@Override
|
||||
public Response intercept(Chain chain) throws IOException {// 打印请求报文
|
||||
// 获取请求
|
||||
Request request = chain.request();
|
||||
// 取出请求参数
|
||||
String reqBody = getRequestBody(request);
|
||||
//全局拦截器,往请求头部添加 token 字段,实现全局添加 token
|
||||
Interceptor tokenInterceptor = chain -> {// 打印请求报文
|
||||
// 获取请求
|
||||
Request request = chain.request();
|
||||
// 取出请求参数
|
||||
String reqBody = getRequestBody(request);
|
||||
|
||||
// 打印请求报文
|
||||
log.info("【" + TAG + "】 " + String.format("发送新请求\n-\tmethod:%s\n-\turl:%s\n-\theaders: %s\n-\tbody:%s",
|
||||
request.method(), request.url(), request.headers(), reqBody));
|
||||
// 执行请求,获取响应报文
|
||||
Response response = chain.proceed(request);
|
||||
// 获取响应内容 TODO 读取结果乱码
|
||||
String respBody = getResponseBody(response);
|
||||
// 打印响应报文
|
||||
// 打印请求报文
|
||||
log.info("【" + TAG + "】 " + String.format("发送新请求\n-\tmethod:%s\n-\turl:%s\n-\theaders: %s\n-\tbody:%s",
|
||||
request.method(), request.url(), request.headers(), reqBody));
|
||||
// 执行请求,获取响应报文
|
||||
Response response = chain.proceed(request);
|
||||
// 获取响应内容 TODO 读取结果乱码
|
||||
String respBody = getResponseBody(response);
|
||||
// 打印响应报文
|
||||
// log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s\n-\t响应body:%s",
|
||||
// response.code(), response.message(), response.request().url(), reqBody, respBody));
|
||||
log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s",
|
||||
response.code(), response.message(), response.request().url(), reqBody));
|
||||
log.info("【" + TAG + "】 " + String.format("收到响应 %s %s\n-\t请求url:%s\n-\t请求body:%s",
|
||||
response.code(), response.message(), response.request().url(), reqBody));
|
||||
|
||||
return response;
|
||||
}
|
||||
return response;
|
||||
};
|
||||
|
||||
Dispatcher dispatcher = new Dispatcher();
|
||||
@ -93,6 +91,7 @@ public class OkHttpClientConfig {
|
||||
if (contentType != null) {
|
||||
charset = contentType.charset(StandardCharsets.UTF_8);
|
||||
}
|
||||
assert charset != null;
|
||||
reqBody = buffer.readString(charset);
|
||||
}
|
||||
|
||||
@ -116,6 +115,7 @@ public class OkHttpClientConfig {
|
||||
charset = contentType.charset(charset);
|
||||
|
||||
//获取Response的body的字符串 并打印
|
||||
assert charset != null;
|
||||
respBody = buffer.clone().readString(charset);
|
||||
}
|
||||
|
||||
@ -133,7 +133,7 @@ public class OkHttpClientConfig {
|
||||
@Override
|
||||
public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
|
||||
List<Cookie> cookies = cookieStore.get(httpUrl.host());
|
||||
return cookies != null ? cookies : new ArrayList<Cookie>();
|
||||
return cookies != null ? cookies : new ArrayList<>();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -3,14 +3,19 @@ package top.octopusyan.manager;
|
||||
import javafx.application.Platform;
|
||||
import javafx.scene.control.TextArea;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import top.octopusyan.http.Api;
|
||||
import top.octopusyan.manager.http.EasyHttp;
|
||||
import top.octopusyan.manager.http.model.ResponseClass;
|
||||
import top.octopusyan.model.ApplicatonStore;
|
||||
import top.octopusyan.model.ProxySetupModel;
|
||||
import top.octopusyan.utils.JsoupUtil;
|
||||
|
||||
import java.io.*;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author : octopus yan
|
||||
@ -24,6 +29,7 @@ public class FrpManager {
|
||||
public static final String FRPC_CLIENT_FILE_NAME = "frpclienttmpfile.exe";
|
||||
private final String FRPC_CONF_PREFIX_NAME = "proxy_";
|
||||
private final String FRPC_CONF_SUFFIX_NAME = ".ini";
|
||||
private static final Map<Integer, String> serverConfigraution = new HashMap<>(3);
|
||||
/**
|
||||
* 应用临时目录 地址
|
||||
*/
|
||||
@ -65,6 +71,7 @@ public class FrpManager {
|
||||
*/
|
||||
public void start() {
|
||||
thread = new ProxyThread();
|
||||
thread.setName(FRPC_CONF_PREFIX_NAME + model.getSort());
|
||||
thread.start();
|
||||
}
|
||||
|
||||
@ -98,14 +105,14 @@ public class FrpManager {
|
||||
*/
|
||||
public void clearLog() {
|
||||
if (console != null)
|
||||
Platform.runLater(() -> console.clear());
|
||||
Platform.runLater(console::clear);
|
||||
}
|
||||
|
||||
/**
|
||||
* 隧道配置文件地址
|
||||
*/
|
||||
private String getConfigFilePath() {
|
||||
return YAN_FRP_TEMP_DIR_PATH + File.separator + FRPC_CONF_PREFIX_NAME + model.getProxyName() + FRPC_CONF_SUFFIX_NAME;
|
||||
return YAN_FRP_TEMP_DIR_PATH + File.separator + FRPC_CONF_PREFIX_NAME + model.getSort() + FRPC_CONF_SUFFIX_NAME;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -121,11 +128,62 @@ public class FrpManager {
|
||||
frpcConfigFile.deleteOnExit();
|
||||
|
||||
// 写入服务配置
|
||||
FileUtils.write(frpcConfigFile, ProxyManager.getUserServerConfig(model.get().getNode()), StandardCharsets.UTF_8);
|
||||
FileUtils.write(frpcConfigFile, getUserFrpServerConfig(model.get().getNode()), StandardCharsets.UTF_8);
|
||||
// 写入隧道配置
|
||||
FileUtils.write(frpcConfigFile, ProxyManager.getProxyConfig(model), StandardCharsets.UTF_8, true);
|
||||
FileUtils.write(frpcConfigFile, getProxyFrpConfig(model), StandardCharsets.UTF_8, true);
|
||||
}
|
||||
|
||||
|
||||
public static String getUserFrpServerConfig(int node) {
|
||||
String config = serverConfigraution.get(node);
|
||||
if (StringUtils.isNotEmpty(config)) return config;
|
||||
try {
|
||||
String result = EasyHttp.builder()
|
||||
.api(Api.getServerConfiguration(node))
|
||||
.pathParam(String.valueOf(node))
|
||||
.execute(new ResponseClass<String>() {
|
||||
});
|
||||
config = JsoupUtil.getServerConfiguration(result);
|
||||
if (StringUtils.isNotEmpty(config)) serverConfigraution.put(node, config);
|
||||
return config;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getProxyFrpConfig(ProxySetupModel setup) {
|
||||
String n = "\n";
|
||||
// 基础配置
|
||||
StringBuilder stringBuilder = new StringBuilder("[" + ApplicatonStore.getAccount() + "_" + setup.getSort() + "]\n");
|
||||
stringBuilder.append("privilege_mode = true\n")
|
||||
.append("type = ").append(setup.getProxyType().contains("http") ? "http" : setup.getProxyType()).append(n)
|
||||
.append("local_ip = ").append(setup.getLocalIp()).append(n)
|
||||
.append("local_port = ").append(setup.getLocalPort()).append(n).append(n);
|
||||
|
||||
if ("http".equals(setup.getProxyType()) || "https".equals(setup.getProxyType())) {
|
||||
// HTTP / HTTPS
|
||||
stringBuilder.append("custom_domains = ").append(setup.getDomain()).append(setup.getDomainSuffix()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("locations = ").append(setup.getLocations()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("host_header_rewrite = ").append(setup.getHostHeaderRewrite()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("header_X-From-Where = ").append(setup.getHeader_X_From_Where()).append(n);
|
||||
} else {
|
||||
// TCP / UDP / XTCP / STCP
|
||||
stringBuilder.append("remote_port = ").append(setup.getRemotePort()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getSk()))
|
||||
stringBuilder.append("sk = ").append(setup.getSk()).append(n);
|
||||
}
|
||||
// 压缩和加密
|
||||
stringBuilder.append("use_encryption = ").append(setup.isUseEncryption()).append(n)
|
||||
.append("use_compression = ").append(setup.isUseCompression()).append(n).append(n);
|
||||
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 初始化frpc客户端文件
|
||||
*/
|
||||
@ -135,7 +193,7 @@ public class FrpManager {
|
||||
frpc.createNewFile();
|
||||
|
||||
// 复制 frpc
|
||||
copyFileUsingFileStreams(FrpManager.class.getResourceAsStream("/static/frpc.exe"), frpc);
|
||||
copyFileUsingFileStreams(Objects.requireNonNull(FrpManager.class.getResourceAsStream("/static/frpc.exe")));
|
||||
}
|
||||
|
||||
// frpc 临时配置文件
|
||||
@ -154,7 +212,7 @@ public class FrpManager {
|
||||
try {
|
||||
FileUtils.deleteDirectory(frpconfigDir);
|
||||
|
||||
for (File file : FileUtils.getTempDirectory().listFiles()) {
|
||||
for (File file : Objects.requireNonNull(FileUtils.getTempDirectory().listFiles())) {
|
||||
if (file.getPath().contains(YAN_FRP_TEMP_DIR_NAME) && file.canWrite() && file.isDirectory()) {
|
||||
FileUtils.deleteDirectory(file);
|
||||
}
|
||||
@ -171,11 +229,11 @@ public class FrpManager {
|
||||
}
|
||||
}
|
||||
|
||||
private static void copyFileUsingFileStreams(InputStream input, File dest)
|
||||
private static void copyFileUsingFileStreams(InputStream input)
|
||||
throws IOException {
|
||||
OutputStream output = null;
|
||||
try {
|
||||
output = new FileOutputStream(dest);
|
||||
output = new FileOutputStream(FrpManager.frpc);
|
||||
byte[] buf = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = input.read(buf)) > 0) {
|
||||
@ -183,12 +241,13 @@ public class FrpManager {
|
||||
}
|
||||
} finally {
|
||||
input.close();
|
||||
output.close();
|
||||
if (output != null) output.close();
|
||||
}
|
||||
}
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
class ProxyThread extends Thread{
|
||||
class ProxyThread extends Thread {
|
||||
private volatile boolean exit = false;
|
||||
|
||||
@Override
|
||||
@ -216,13 +275,13 @@ public class FrpManager {
|
||||
String line;
|
||||
while ((line = readStdout.readLine()) != null && !exit) {
|
||||
String finalLine = line;
|
||||
System.out.println("yan-frp-info:" + line);
|
||||
Platform.runLater(() -> console.appendText("yan-frp-info:" + finalLine + "\n"));
|
||||
System.out.println(line);
|
||||
Platform.runLater(() -> console.appendText(finalLine + "\n"));
|
||||
}
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
//
|
||||
// TODO 报错
|
||||
Platform.runLater(() -> console.appendText("yan-frp-error:" + e.getMessage() + "\n"));
|
||||
Platform.runLater(() -> console.appendText("yan-frp-error:启动失败\n"));
|
||||
}
|
||||
|
@ -13,14 +13,9 @@ import top.octopusyan.http.request.ProxySetup;
|
||||
import top.octopusyan.manager.http.EasyHttp;
|
||||
import top.octopusyan.manager.http.listener.OnHttpListener;
|
||||
import top.octopusyan.manager.http.model.ResponseClass;
|
||||
import top.octopusyan.model.ApplicatonStore;
|
||||
import top.octopusyan.model.ProxySetupModel;
|
||||
import top.octopusyan.utils.AlertUtil;
|
||||
import top.octopusyan.utils.JsoupUtil;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -32,7 +27,6 @@ import java.util.stream.Collectors;
|
||||
*/
|
||||
public class ProxyManager {
|
||||
private static String csrf;
|
||||
private static Map<Integer, String> serverConfigraution = new HashMap<>(3);
|
||||
|
||||
/**
|
||||
* 初始化隧道设置
|
||||
@ -170,6 +164,14 @@ public class ProxyManager {
|
||||
.request(new OnHttpListener<String>() {
|
||||
@Override
|
||||
public void onSucceed(String result) {
|
||||
|
||||
// 不成功
|
||||
if(!result.contains("成功")){
|
||||
Platform.runLater(() -> AlertUtil.error(result).header(null).show());
|
||||
listener.onSucceed(null);
|
||||
return;
|
||||
}
|
||||
|
||||
getList(new OnHttpListener<List<ProxySetup>>() {
|
||||
@Override
|
||||
public void onSucceed(List<ProxySetup> result) {
|
||||
@ -181,7 +183,9 @@ public class ProxyManager {
|
||||
return;
|
||||
}
|
||||
}
|
||||
listener.onSucceed(null);
|
||||
}
|
||||
listener.onSucceed(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -207,53 +211,4 @@ public class ProxyManager {
|
||||
int i1 = htmlStr.indexOf("\"", i + 18);
|
||||
ProxyManager.csrf = htmlStr.substring(i + 18, i1);
|
||||
}
|
||||
|
||||
public static String getUserServerConfig(int node) {
|
||||
String config = serverConfigraution.get(node);
|
||||
if (StringUtils.isNotEmpty(config)) return config;
|
||||
try {
|
||||
String result = EasyHttp.builder()
|
||||
.api(Api.getServerConfiguration(node))
|
||||
.pathParam(String.valueOf(node))
|
||||
.execute(new ResponseClass<String>() {
|
||||
});
|
||||
config = JsoupUtil.getServerConfiguration(result);
|
||||
if (StringUtils.isNotEmpty(config)) serverConfigraution.put(node, config);
|
||||
return config;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String getProxyConfig(ProxySetupModel setup) {
|
||||
String n = "\n";
|
||||
// 基础配置
|
||||
StringBuilder stringBuilder = new StringBuilder("[" + ApplicatonStore.getAccount() + "_" + setup.getProxyName() + "]\n");
|
||||
stringBuilder.append("privilege_mode = true\n")
|
||||
.append("type = ").append(setup.getProxyType().contains("http") ? "http" : setup.getProxyType()).append(n)
|
||||
.append("local_ip = ").append(setup.getLocalIp()).append(n)
|
||||
.append("local_port = ").append(setup.getLocalPort()).append(n).append(n);
|
||||
|
||||
if ("http".equals(setup.getProxyType()) || "https".equals(setup.getProxyType())) {
|
||||
// HTTP / HTTPS
|
||||
stringBuilder.append("custom_domains = ").append(setup.getDomain()).append(setup.getDomainSuffix()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("locations = ").append(setup.getLocations()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("host_header_rewrite = ").append(setup.getHostHeaderRewrite()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getLocations()))
|
||||
stringBuilder.append("header_X-From-Where = ").append(setup.getHeader_X_From_Where()).append(n);
|
||||
} else {
|
||||
// TCP / UDP / XTCP / STCP
|
||||
stringBuilder.append("remote_port = ").append(setup.getRemotePort()).append(n);
|
||||
if (!StringUtils.isEmpty(setup.getSk()))
|
||||
stringBuilder.append("sk = ").append(setup.getSk()).append(n);
|
||||
}
|
||||
// 压缩和加密
|
||||
stringBuilder.append("use_encryption = ").append(setup.isUseEncryption()).append(n)
|
||||
.append("use_compression = ").append(setup.isUseCompression()).append(n).append(n);
|
||||
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
}
|
||||
|
@ -9,15 +9,11 @@ import top.octopusyan.manager.http.api.ParamApi;
|
||||
import top.octopusyan.manager.http.api.PathParamApi;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
import top.octopusyan.manager.http.callback.NormalCallback;
|
||||
import top.octopusyan.manager.http.listener.OnHttpListener;
|
||||
import top.octopusyan.manager.http.model.CallProxy;
|
||||
import top.octopusyan.manager.http.model.HttpHeaders;
|
||||
import top.octopusyan.manager.http.model.HttpParams;
|
||||
import top.octopusyan.manager.http.model.JsonBody;
|
||||
import top.octopusyan.manager.http.config.BodyType;
|
||||
import top.octopusyan.manager.http.config.HttpConstant;
|
||||
import top.octopusyan.manager.http.listener.OnHttpListener;
|
||||
import top.octopusyan.manager.http.model.*;
|
||||
import top.octopusyan.manager.http.request.IRequestHandler;
|
||||
import top.octopusyan.manager.http.model.ResponseClass;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
@ -195,7 +191,7 @@ public class EasyHttp<Param, Result> {
|
||||
try {
|
||||
mCallProxy = new CallProxy(createCall());
|
||||
Response response = mCallProxy.execute();
|
||||
return (Result) mHandler.requestSucceed(getRequestApi(), response, mHandler.getType(responseClass));
|
||||
return mHandler.requestSucceed(getRequestApi(), response, mHandler.getType(responseClass));
|
||||
} catch (Exception e) {
|
||||
throw mHandler.requestFail(getRequestApi(), e);
|
||||
}
|
||||
|
@ -7,11 +7,11 @@ import okhttp3.MediaType;
|
||||
import okhttp3.MultipartBody;
|
||||
import okhttp3.RequestBody;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import top.octopusyan.manager.ThreadPoolManager;
|
||||
import top.octopusyan.manager.http.annotation.HttpIgnore;
|
||||
import top.octopusyan.manager.http.annotation.HttpRename;
|
||||
import top.octopusyan.manager.http.config.ContentType;
|
||||
import top.octopusyan.manager.http.model.UpdateBody;
|
||||
import top.octopusyan.manager.ThreadPoolManager;
|
||||
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Field;
|
||||
|
@ -1,6 +1,6 @@
|
||||
package top.octopusyan.manager.http;
|
||||
|
||||
import okhttp3.*;
|
||||
import okhttp3.OkHttpClient;
|
||||
import top.octopusyan.manager.http.config.ILogStrategy;
|
||||
import top.octopusyan.manager.http.request.IRequestHandler;
|
||||
|
||||
@ -47,11 +47,11 @@ public class HttpConfig {
|
||||
|
||||
private HttpConfig(OkHttpClient client) {
|
||||
mClient = client;
|
||||
mParams = new HashMap<String, Object>();
|
||||
mParams = new HashMap<>();
|
||||
mHeaders = new HashMap<>();
|
||||
}
|
||||
private HttpConfig() {
|
||||
mParams = new HashMap<String, Object>();
|
||||
mParams = new HashMap<>();
|
||||
mHeaders = new HashMap<>();
|
||||
initHttpClient();
|
||||
}
|
||||
@ -81,7 +81,7 @@ public class HttpConfig {
|
||||
|
||||
public HttpConfig setParams(HashMap<String, Object> params) {
|
||||
if (params == null) {
|
||||
params = new HashMap<String, Object>();
|
||||
params = new HashMap<>();
|
||||
}
|
||||
mParams = params;
|
||||
return this;
|
||||
@ -207,6 +207,6 @@ public class HttpConfig {
|
||||
}
|
||||
|
||||
private void initHttpClient() {
|
||||
;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -3,10 +3,11 @@ package top.octopusyan.manager.http.callback;
|
||||
import okhttp3.Call;
|
||||
import okhttp3.Callback;
|
||||
import okhttp3.Response;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import top.octopusyan.manager.http.EasyUtils;
|
||||
import top.octopusyan.manager.http.HttpConfig;
|
||||
import top.octopusyan.manager.http.HttpLog;
|
||||
import top.octopusyan.manager.http.model.CallProxy;
|
||||
import top.octopusyan.manager.http.EasyUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.SocketTimeoutException;
|
||||
@ -34,7 +35,7 @@ public abstract class BaseCallback implements Callback {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResponse(Call call, Response response) {
|
||||
public void onResponse(@NotNull Call call, @NotNull Response response) {
|
||||
try {
|
||||
// 收到响应
|
||||
onResponse(response);
|
||||
@ -48,7 +49,7 @@ public abstract class BaseCallback implements Callback {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call call, IOException e) {
|
||||
public void onFailure(@NotNull Call call, @NotNull IOException e) {
|
||||
// 服务器请求超时重试
|
||||
if (e instanceof SocketTimeoutException && mRetryCount < HttpConfig.getInstance().getRetryCount()) {
|
||||
// 设置延迟 N 秒后重试该请求
|
||||
|
@ -2,12 +2,12 @@ package top.octopusyan.manager.http.callback;
|
||||
|
||||
import javafx.application.Platform;
|
||||
import okhttp3.Response;
|
||||
import top.octopusyan.manager.http.listener.OnHttpListener;
|
||||
import top.octopusyan.manager.http.HttpLog;
|
||||
import top.octopusyan.manager.http.model.CallProxy;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
import top.octopusyan.manager.http.request.IRequestHandler;
|
||||
import top.octopusyan.manager.http.EasyUtils;
|
||||
import top.octopusyan.manager.http.HttpLog;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
import top.octopusyan.manager.http.listener.OnHttpListener;
|
||||
import top.octopusyan.manager.http.model.CallProxy;
|
||||
import top.octopusyan.manager.http.request.IRequestHandler;
|
||||
|
||||
/**
|
||||
* @author : octopus yan
|
||||
|
@ -1,8 +1,8 @@
|
||||
package top.octopusyan.manager.http.config;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import top.octopusyan.manager.http.EasyHttp;
|
||||
import top.octopusyan.manager.http.HttpConfig;
|
||||
|
||||
|
@ -5,8 +5,8 @@ import okhttp3.RequestBody;
|
||||
import okio.BufferedSink;
|
||||
import okio.Okio;
|
||||
import okio.Source;
|
||||
import top.octopusyan.manager.http.config.ContentType;
|
||||
import top.octopusyan.manager.http.EasyUtils;
|
||||
import top.octopusyan.manager.http.config.ContentType;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -1,12 +1,12 @@
|
||||
package top.octopusyan.manager.http.request;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import top.octopusyan.manager.http.EasyUtils;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
|
||||
public interface IRequestHandler {
|
||||
|
||||
/**
|
||||
@ -28,7 +28,7 @@ public interface IRequestHandler {
|
||||
*
|
||||
* @throws Exception 如果抛出则回调失败
|
||||
*/
|
||||
<Param, Result> Object requestSucceed(RequestApi<Param, Result> api, Response response, Type type) throws Exception;
|
||||
<Param, Result> Result requestSucceed(RequestApi<Param, Result> api, Response response, Type type) throws Exception;
|
||||
|
||||
/**
|
||||
* 请求失败
|
||||
|
@ -8,8 +8,8 @@ import okhttp3.Headers;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
import top.octopusyan.manager.http.HttpLog;
|
||||
import top.octopusyan.manager.http.api.RequestApi;
|
||||
import top.octopusyan.manager.http.exception.*;
|
||||
import top.octopusyan.manager.http.response.BaseRest;
|
||||
|
||||
@ -24,8 +24,8 @@ import java.net.UnknownHostException;
|
||||
/**
|
||||
* @author octopus yan
|
||||
* @email octopus_yan@foxmail.com
|
||||
* @Description 请求处理类
|
||||
* @createTime 2021-07-23 11:55:26
|
||||
* @description 请求处理类
|
||||
* @create 2021-07-23 11:55:26
|
||||
*/
|
||||
public final class RequestHandler implements IRequestHandler {
|
||||
|
||||
@ -125,7 +125,7 @@ public final class RequestHandler implements IRequestHandler {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Exception requestFail(RequestApi api, Exception e) {
|
||||
public <Param, Result> Exception requestFail(RequestApi<Param, Result> api, Exception e) {
|
||||
// 判断这个异常是不是自己抛的
|
||||
if (e instanceof HttpException) {
|
||||
if (e instanceof TokenException) {
|
||||
@ -159,9 +159,6 @@ public final class RequestHandler implements IRequestHandler {
|
||||
|
||||
/**
|
||||
* 传入需要连接的IP,返回是否连接成功
|
||||
*
|
||||
* @param remoteInetAddr
|
||||
* @return
|
||||
*/
|
||||
public static boolean isReachable(String remoteInetAddr) {
|
||||
boolean reachable = false;
|
||||
|
@ -41,6 +41,7 @@ public class ApplicatonStore {
|
||||
private static final SimpleBooleanProperty registerSuccess = new SimpleBooleanProperty();
|
||||
private static final ObservableList<ProxySetup> proxyList = FXCollections.observableList(new ArrayList<>());
|
||||
private static final SimpleIntegerProperty selectProxy = new SimpleIntegerProperty(0);
|
||||
public static String selectProxyName = null;
|
||||
|
||||
public static void setAccount(String account) {
|
||||
ApplicatonStore.account.set(account);
|
||||
@ -153,11 +154,8 @@ public class ApplicatonStore {
|
||||
if (appDataJson.containsKey(AUTO_LOGIN_KEY)) autoLogin.set(appDataJson.getBoolean(AUTO_LOGIN_KEY));
|
||||
// 记住
|
||||
if (appDataJson.containsKey(REMEMBER_ME_KEY)) rememberMe.set(appDataJson.getBoolean(REMEMBER_ME_KEY));
|
||||
// TODO 已选择隧道
|
||||
if (appDataJson.containsKey(SELECT_PROXY_NAME_KEY)) {
|
||||
// String proxtName = appDataJson.getString(SELECT_PROXY_NAME_KEY);
|
||||
// proxyListProperty().addListener(new );
|
||||
}
|
||||
// 已选择隧道
|
||||
if (appDataJson.containsKey(SELECT_PROXY_NAME_KEY)) selectProxyName = appDataJson.getString(SELECT_PROXY_NAME_KEY);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -174,7 +172,7 @@ public class ApplicatonStore {
|
||||
if (rememberMe.get() && password.get() != null) appDataJson.put(PASSWORD_KEY, password.get());
|
||||
// 选择隧道
|
||||
if (selectProxy.getValue() != null && proxyList.size() > 0 && proxyList.size() > selectProxy.get())
|
||||
appDataJson.put(SELECT_PROXY_NAME_KEY, proxyList.get(selectProxy.getValue()));
|
||||
appDataJson.put(SELECT_PROXY_NAME_KEY, proxyList.get(selectProxy.getValue()).getProxy_name());
|
||||
// 自动登录
|
||||
appDataJson.put(AUTO_LOGIN_KEY, autoLogin.get());
|
||||
// 记住
|
||||
|
@ -2,9 +2,7 @@ package top.octopusyan.utils;
|
||||
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.fxml.JavaFXBuilderFactory;
|
||||
import sun.reflect.Reflection;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,5 @@
|
||||
package top.octopusyan.utils;
|
||||
|
||||
import com.google.code.kaptcha.Producer;
|
||||
import com.google.code.kaptcha.impl.DefaultKaptcha;
|
||||
import com.google.code.kaptcha.util.Config;
|
||||
|
||||
@ -15,7 +14,7 @@ import java.util.Properties;
|
||||
*/
|
||||
public class KaptchaUtil {
|
||||
public static volatile KaptchaUtil util;
|
||||
private DefaultKaptcha defaultKaptcha;
|
||||
private final DefaultKaptcha defaultKaptcha;
|
||||
|
||||
private KaptchaUtil(DefaultKaptcha kaptcha){
|
||||
this.defaultKaptcha = kaptcha;
|
||||
|
Loading…
Reference in New Issue
Block a user