添加了解析getVPNInfo()的方法,放在了example目录下,已测试通过

This commit is contained in:
free will
2021-08-04 20:44:23 +08:00
parent a0ef28e161
commit a6cd910d00
6 changed files with 206 additions and 15 deletions
@@ -10,7 +10,7 @@ import VMSConnection.TCPNet.Message.BaseStruct;
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class VpnServerInfoRequest extends BaseStruct {
public int ID;
public int ID; // 本结构体的这个字段其实没用到
public String Name;
public VpnServerInfoRequest(int ID,String name){
+1 -1
View File
@@ -31,7 +31,7 @@ class SSL_Message extends BaseStruct {
public int IsEncrypted=0;
public int MType=0;
public byte[] Data;
public String Nonce ="";
public String Nonce =""; // 本结构体的这个字段其实没用到
public int Code=0;
}
+57 -13
View File
@@ -3,6 +3,7 @@ package examples;
import VMSConnection.BC_API;
import VMSConnection.Model.LoginWithSignRequest;
import VMSConnection.Model.RegisterWithSignRequest;
import VMSConnection.Model.VpnServerInfoRequest;
import VMSConnection.Security.BC_KeyManager;
import VMSConnection.TCPNet.Message.NetworkResponse;
import VMSConnection.Utils.Base64Helper;
@@ -30,7 +31,7 @@ public class VPNLoginExample {
// 身份信息保存位置
public static String identityPath="D:\\TEST\\Identitys\\";
// 用户名
public static String username="freewill111";
public static String username="freesajgl111";
// VMS发送来的证书的密码
public static byte[] certPasswd="123456".getBytes(StandardCharsets.UTF_8);
// 基于用户名的用户身份标识
@@ -38,7 +39,7 @@ public class VPNLoginExample {
// 注册用户的IP
public static String vms_ip="121.15.171.91";
// 注册邮箱
public static String email="2555627323s111@163.com";
public static String email="25556272asjys111@163.com";
/**
* 生成本地密钥,持久化存储到本地硬盘
@@ -47,7 +48,7 @@ public class VPNLoginExample {
*/
public void generateForeverIdentity(String username,String identityPath){
// identityName是将username进行base64编码,然后加上"/"
String identityName="/"+Base64Helper.Base64PlusEncode(username);
String identityName="/"+username;
KeyManagerExample.INSTANCE.initKeyChain(identityName,identityPath);
}
@@ -124,15 +125,15 @@ public class VPNLoginExample {
.getBytes(),StandardCharsets.UTF_8);
System.out.println("pubkey: "+pubKey);
// 测试验签
try {
boolean r=KeyManagerExample.INSTANCE.getKeyChain().getCurrentIdentity().verify(
username.getBytes(StandardCharsets.UTF_8),registerSign);
System.out.println("测试验签结果:"+r);
} catch (IdentityException | AsymKeyException e) {
e.printStackTrace();
}
boolean rr=new BC_KeyManager().Verify(username.getBytes(StandardCharsets.UTF_8),new String(registerSign),pubKey);
System.out.println("测试验签结果2"+rr);
// try {
// boolean r=KeyManagerExample.INSTANCE.getKeyChain().getCurrentIdentity().verify(
// username.getBytes(StandardCharsets.UTF_8),registerSign);
// System.out.println("测试验签结果:"+r);
// } catch (IdentityException | AsymKeyException e) {
// e.printStackTrace();
// }
// boolean rr=new BC_KeyManager().Verify(username.getBytes(StandardCharsets.UTF_8),new String(registerSign),pubKey);
// System.out.println("测试验签结果2"+rr);
// 3. 构造注册请求包
RegisterWithSignRequest request=new RegisterWithSignRequest(1,username,"password",
@@ -172,10 +173,16 @@ public class VPNLoginExample {
// 2. 签名(签名用户名) & 证书(用户本地保存的证书,注册时接收到的VMS数据)
byte[] loginSign= vpnExample.signBytes(username);
String cert=vpnExample.exportVMSCert(certPasswd);
System.out.println("证书取出: "+cert);
// 3. 构造登录请求包
LoginWithSignRequest loginWithSignRequest=new LoginWithSignRequest(username,
"password",cert,loginSign);
try {
System.out.println("login request: "+loginWithSignRequest.toJson());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 4. 调用bc-api,进行登录
BC_API bc_api=new BC_API();
@@ -190,9 +197,46 @@ public class VPNLoginExample {
System.out.println(networkResponse.Code);
}
public VpnServerInfoListExample testGetVPNInfo(){
// 1. 生成用户的公钥私钥(有则直接取出)
VPNLoginExample vpnExample=new VPNLoginExample();
vpnExample.generateForeverIdentity(username,identityPath);
// 2. 构造vpnserver信息请求包
VpnServerInfoRequest vpnServerInfoRequest=new VpnServerInfoRequest(1233,username);
try {
System.out.println("vpn request: "+vpnServerInfoRequest.toJson());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 3. 调用bc-api,进行信息获取
BC_API bc_api=new BC_API();
bc_api.ip=vms_ip;
// 获取vpnserver信息
NetworkResponse networkResponse3=bc_api.getVpnServerInfo(vpnServerInfoRequest);
try {
System.out.println("获取vpn信息的应答: "+networkResponse3.toJson());
System.out.println("获取到的vpn信息: "+new String(networkResponse3.Data));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(networkResponse3.Code);
// 4. 解析应答
VpnServerInfoListExample list=new VpnServerInfoListExample();
boolean flag=list.parseToVpnInfoList(networkResponse3.Data);
if(flag){
return list;
}
return null;
}
// 测试注册登录
public static void main(String[] args){
new VPNLoginExample().testRegister();
// new VPNLoginExample().testRegister();
// new VPNLoginExample().testLogin();
VpnServerInfoListExample infoList = new VPNLoginExample().testGetVPNInfo();
System.out.println(infoList);
}
}
@@ -0,0 +1,60 @@
package examples;
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 VpnServerInfoExample 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 "VpnServerInfoExample{" +
"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 examples;
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 VpnServerInfoListExample {
private ArrayList<VpnServerInfoExample> 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++) {
VpnServerInfoExample vpnserverinfo = new VpnServerInfoExample();
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<VpnServerInfoExample> getVpnServerInfoList(){
return this.vpnServerInfoList;
}
@Override
public String toString() {
return "VpnServerInfoListExample{" +
"vpnServerInfoList=" + vpnServerInfoList +
'}';
}
}
@@ -0,0 +1,37 @@
package examples;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
/*
* @Author: Wang Feng
* @Description:
* @Version: 1.0.0
* @Date: 17:35 2021/8/4
* @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
*/
public class TestVpnInfoList {
@Test
public void testVpnInfoList(){
String ss="[{\"ID\":1,\"Name\":\"内网服务器\",\"ClientPrefix\":\"/min/gdcni19\",\"IsInner\":true,\"" +
"Mtu\":1500,\"IP\":\"121.15.171.82\",\"Port\":14922,\"RemotePrefix\":\"/min/gdcni12/vpnserver\"," +
"\"InnerIP\":\"10.0.0.0/24, 172.16.0.0/12, 192.168.0.0/16\",\"UGroupID\":1,\"TimeStamp\":\"1635248741\"}," +
"{\"ID\":2,\"Name\":\"外网服务器\",\"ClientPrefix\":\"/min/gdcni9\",\"IsInner\":false,\"Mtu\":1500,\"" +
"IP\":\"14.215.134.202\",\"Port\":14922,\"RemotePrefix\":\"/hk/vpnserver\",\"InnerIP\":\"\",\"UGroupID" +
"\":1,\"TimeStamp\":\"1635248742\"}]";
VpnServerInfoListExample list=new VpnServerInfoListExample();
boolean flag=list.parseToVpnInfoList(ss.getBytes(StandardCharsets.UTF_8));
if(flag){
System.out.println(list);
System.out.println(list.getVpnServerInfoList().get(0)
.getInnerIPList());
System.out.println(list.getVpnServerInfoList().get(0)
.getInnerIPList().get(0));
System.out.println(list.getVpnServerInfoList().get(1)
.getInnerIPList());
System.out.println(list.getVpnServerInfoList().get(1)
.getInnerIPList().size());
}
}
}