增加VMS获取服务器信息的网络请求接口

This commit is contained in:
free will
2021-08-05 10:30:53 +08:00
parent 2929e28194
commit 0ae08fd92c
7 changed files with 191 additions and 2 deletions
+1
View File
@@ -42,4 +42,5 @@
## 用户名及密码说明V2
经过简化,用户输入的username将直接作为注册、登录及连接VPN时发送给后台的username而存在,
证书则是"/"+username,完全去除Base64编解码化。
密码:代码运行时候的密码passwd是用户输入的原始密码RawPasswd经过md5哈希之后得到。
@@ -6,5 +6,5 @@ public class GlobalSetting {
// public static boolean openBiometric = false;
// 控制与VPNServer的对称加密通信方法,true表示使用sm4,false表示使用AES
public static boolean isSM4 =false;
public static boolean isSM4 =false;
}
@@ -0,0 +1,16 @@
package com.pkusz.min_vpn_client.model.OriginalRequest;
/*
* @Author: Wang Feng
* @Description: 获取VPN服务器信息的请求的原始属性
* @Version: 1.0.0
* @Date: 17:22 2021/6/23
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class OriginalGetVpnInfoRequest {
public String username;
public OriginalGetVpnInfoRequest(String username){
this.username=username;
}
}
@@ -0,0 +1,60 @@
package com.pkusz.min_vpn_client.model.Response;
import VMSConnection.TCPNet.Message.BaseStruct;
import java.util.ArrayList;
/*
* @Author: Wang Feng
* @Description:
* @Version: 1.0.0
* @Date: 17:26 2021/8/4
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class VpnServerInfo extends BaseStruct {
public int ID;
public String Name;
public String ClientPrefix;
public boolean IsInner;
public int Mtu;
public String IP;
public int Port;
public String RemotePrefix;
public String InnerIP;
public int UGroupID;
public String TimeStamp;
/**
* 解析并获取InnerIP列表
* 例子:"10.0.0.0/24, 172.16.0.0/12, 192.168.0.0/16"
* @return
*/
public ArrayList<String> getInnerIPList(){
ArrayList<String> res=new ArrayList<>();
if(InnerIP.equals("")){
return res;
}
for (String ipAndMask:
InnerIP.split(", ")) {
res.add(ipAndMask);
}
return res;
}
@Override
public String toString() {
return "VpnServerInfo{" +
"ID=" + ID +
", Name='" + Name + '\'' +
", ClientPrefix='" + ClientPrefix + '\'' +
", IsInner=" + IsInner +
", Mtu=" + Mtu +
", IP='" + IP + '\'' +
", Port=" + Port +
", RemotePrefix='" + RemotePrefix + '\'' +
", InnerIP='" + InnerIP + '\'' +
", UGroupID=" + UGroupID +
", TimeStamp='" + TimeStamp + '\'' +
'}';
}
}
@@ -0,0 +1,50 @@
package com.pkusz.min_vpn_client.model.Response;
import com.alibaba.fastjson.JSONArray;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
/*
* @Author: Wang Feng
* @Description:
* @Version: 1.0.0
* @Date: 17:28 2021/8/4
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class VpnServerInfoList {
private ArrayList<VpnServerInfo> vpnServerInfoList=new ArrayList<>();
/**
* 将json数组解析为VPNInfoList
* @param data
* @return
*/
public boolean parseToVpnInfoList(byte[] data){
try {
vpnServerInfoList.clear();
JSONArray jsonArray = JSONArray.parseArray(new String(data));
for (int i = 0; i < jsonArray.size(); i++) {
VpnServerInfo vpnserverinfo = new VpnServerInfo();
vpnserverinfo.unJson(jsonArray.get(i).toString().getBytes(StandardCharsets.UTF_8),
vpnserverinfo);
vpnServerInfoList.add(vpnserverinfo);
}
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
public ArrayList<VpnServerInfo> getVpnServerInfoList(){
return this.vpnServerInfoList;
}
@Override
public String toString() {
return "VpnServerInfoList{" +
"vpnServerInfoList=" + vpnServerInfoList +
'}';
}
}
@@ -8,8 +8,10 @@ package com.pkusz.min_vpn_client.model;
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalGetVpnInfoRequest;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest;
import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest;
import com.pkusz.min_vpn_client.model.Response.VpnServerInfoList;
import com.pkusz.min_vpn_client.utils.KeyManager;
import org.bouncycastle.crypto.CryptoException;
@@ -28,6 +30,7 @@ import javax.crypto.NoSuchPaddingException;
import VMSConnection.BC_API;
import VMSConnection.Model.LoginWithSignRequest;
import VMSConnection.Model.RegisterWithSignRequest;
import VMSConnection.Model.VpnServerInfoRequest;
import VMSConnection.TCPNet.Message.NetworkResponse;
import VMSConnection.Utils.Base64Helper;
import minsecurity.certificate.cert.CertException;
@@ -162,6 +165,65 @@ public enum VMSRequestAPI {
return networkResponse.get().Code;
}
/**
* 构造并发送VMS获取VPN服务器信息的请求,返回解析后的服务器信息(列表)
* @param original
* @return
*/
public VpnServerInfoList getVPNServerInfoList(OriginalGetVpnInfoRequest original){
// 1. 生成用户的公钥私钥(有则直接取出)
this.generateForeverIdentity(original.username);
// 2. 构造vpnserver信息请求包
VpnServerInfoRequest vpnServerInfoRequest=new VpnServerInfoRequest(1, original.username);
try {
System.out.println("getVpnInfo request: "+vpnServerInfoRequest.toJson());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 4. 调用bc-api,发送获取信息请求到VMSip tcpPort sslPort VMSPubkey(可选,有默认key)
AtomicReference<NetworkResponse> networkResponse = new AtomicReference<>();
Thread netRequestThread = new Thread(() -> {
BC_API bc_api = new BC_API(MINVpnSettingAPI.INSTANCE.getBlockChainIpAddress(),
MINVpnSettingAPI.INSTANCE.getBcTcpPort(), MINVpnSettingAPI.INSTANCE.getBcSslPort());
networkResponse.set(bc_api.getVpnServerInfo(vpnServerInfoRequest));
});
netRequestThread.start();
// 等待五秒,五秒内收不到包就放弃,收到包就停止等待
long startTime=System.currentTimeMillis();
while ((System.currentTimeMillis()-startTime)/1000<5){
if(networkResponse.get()!=null){
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(networkResponse.get()==null){
System.out.println("获取VPN信息未收到合法应答信息");
return null;
}
// 输出getVpnServerInfo应答信息
try {
System.out.println("获取vpn信息的应答: "+networkResponse.get().toJson());
System.out.println("获取到的vpn信息: "+new String(networkResponse.get().Data));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 4. 解析应答信息,并返回
VpnServerInfoList list=new VpnServerInfoList();
boolean flag=list.parseToVpnInfoList(networkResponse.get().Data);
if(flag){
return list;
}else{
return null;
}
}
/**
* 生成本地密钥,持久化存储到本地硬盘
* @param username
@@ -69,7 +69,7 @@ public class MINVpnConnection implements Runnable{
private final VpnService mService;
private final int mConnectionId;
// face的注册前缀 格式为:/{边界路由器的服务前缀}/{用户名}/{当前系统时间},
// 如:"/min/gdcni19/Base64Util.Base64PlusEncode(wefree)/"+System.currentTimeMillis();
// 如:"/min/gdcni19/wefree/"+System.currentTimeMillis();
// 在执行initFace的时候初始化
private String localFacePrefix;