From 9237f63f07e9d2f0ba5a0e41e8485bbd65c161ce Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 29 Jul 2021 20:18:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=95=8C=E9=9D=A2=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E4=B8=8EVMS=E7=BD=91=E7=BB=9C=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E5=AE=9E=E7=8E=B0=E6=B3=A8=E5=86=8C=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=EF=BC=9B=E8=A7=84=E8=8C=83=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=90=8D=E3=80=81=E6=B3=A8=E5=86=8C=E7=94=A8=E6=88=B7=E5=90=8D?= =?UTF-8?q?=E3=80=81=E8=BA=AB=E4=BB=BD=E6=A0=87=E8=AF=86=E5=90=8D=E3=80=81?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E3=80=81=E6=B3=A8=E5=86=8C=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E4=B9=8B=E9=97=B4=E7=9A=84=E5=8C=BA=E5=88=AB=E5=92=8C=E8=81=94?= =?UTF-8?q?=E7=B3=BB=EF=BC=88=E5=8F=82=E8=A7=81README.md=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++- .../activity/login/LoginActivity.java | 56 ++++++++----------- .../activity/login/LoginActivityContract.java | 2 +- .../activity/login/LoginActivityModel.java | 22 +++----- .../login/LoginActivityPresenter.java | 2 +- .../activity/register/RegisterActivity.java | 25 +++++---- .../register/RegisterActivityContract.java | 2 +- .../register/RegisterActivityModel.java | 18 ++++-- .../register/RegisterActivityPresenter.java | 2 +- .../OriginalLoginRequest.java | 2 +- .../OriginalRegisterRequest.java | 2 +- .../min_vpn_client/model/VMSRequestAPI.java | 4 +- .../min_vpn_client/model/TestBase64.java | 20 +++++++ 13 files changed, 99 insertions(+), 71 deletions(-) rename app/src/main/java/com/pkusz/min_vpn_client/model/{request => OriginalRequest}/OriginalLoginRequest.java (89%) rename app/src/main/java/com/pkusz/min_vpn_client/model/{request => OriginalRequest}/OriginalRegisterRequest.java (93%) create mode 100644 app/src/test/java/com/pkusz/min_vpn_client/model/TestBase64.java diff --git a/README.md b/README.md index 41128bc..65c92d3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# MIN-VPN-Client +# MIN-VPN-Client项目说明 ## 项目开发背景说明 本项目前身是MIN-VPN-Android的V2master分支。 @@ -27,3 +27,14 @@ ## 使用说明 导出APK,安装到安卓手机,即可使用 + +# MIN-VPN-Client开发说明 + +## 用户名及密码说明 + 用户输入的用户名将永远不作为项目中代码运行使用的用户名而存在,以避免前后端交互时因编码问题而出现BUG, + 例如,用户输入的用户名RawUsername为:“张三”, + 则项目中的用户名则为其经过base64编码后的Username:"5byg5LiJ", + 而标识则使用再次经过base64编码后然后前面加上"/"的IdentityName:"/NWJ5ZzVMaUo-"; + 可以看出,其中的Username和IdentityName均与用户注册时输入的用户名有关,但不是同一个字符串。 + 密码也是同理,代码运行时候的密码passwd是用户输入的原始密码RawPasswd经过md5哈希之后得到。 + MINVpnSettingAPI中的用户名和密码是用户输入的RawUsername和RawPasswd,在注册和登录时再进行处理。 diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivity.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivity.java index 05953b0..cc44cca 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivity.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivity.java @@ -14,18 +14,16 @@ import android.widget.ImageView; import android.widget.TextView; import com.google.android.material.checkbox.MaterialCheckBox; -import com.pkusz.min_vpn_client.GlobalSetting; import com.pkusz.min_vpn_client.R; import com.pkusz.min_vpn_client.activity.base.MINVpnBaseActivity; import com.pkusz.min_vpn_client.activity.main.MainActivity; import com.pkusz.min_vpn_client.activity.register.RegisterActivity; import com.pkusz.min_vpn_client.activity.setting.SettingActivity; import com.pkusz.min_vpn_client.model.MINVpnSettingAPI; -import com.pkusz.min_vpn_client.model.request.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest; import com.pkusz.min_vpn_client.utils.AccountValidatorRegexUtil; import com.pkusz.min_vpn_client.utils.Base64Util; import com.pkusz.min_vpn_client.utils.DigestUtilKt; -import com.pkusz.min_vpn_client.utils.KeyManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -47,8 +45,8 @@ import kotlin.jvm.functions.Function1; public class LoginActivity extends MINVpnBaseActivity implements LoginActivityContract.View{ // 常规变量区 - private String username=""; - private String password=""; + private String rawUsername =""; + private String rawPassword =""; // 界面变量区 private EasyBar easyBar; private ImageView imageView_imgLogo; @@ -143,47 +141,44 @@ public class LoginActivity extends MINVpnBaseActivity ContextExtensionKt.hideSoftKeyboard(this,btnLogin); btnLogin.startAnimation(); - this.username= Objects.requireNonNull(etUsername.getText()).toString(); - this.password= Objects.requireNonNull(etPassword.getText()).toString(); + this.rawUsername = Objects.requireNonNull(etUsername.getText()).toString(); + this.rawPassword = Objects.requireNonNull(etPassword.getText()).toString(); - boolean testFlag=true; - if(!testFlag){ - if (username.isEmpty() || password.isEmpty()) { +// boolean testFlag=true; +// if(!testFlag){ + if (rawUsername.isEmpty() || rawPassword.isEmpty()) { showWarning("请将信息填写完整"); btnLogin.revertAnimation(); return; } - if (!AccountValidatorRegexUtil.INSTANCE.isPassword(password)) { + if (!AccountValidatorRegexUtil.INSTANCE.isPassword(rawPassword)) { showWarning("请输入有效的密码,密码为8-16位,必须包含大小写字母和特殊符号"); btnLogin.revertAnimation(); return; } - if (!AccountValidatorRegexUtil.INSTANCE.isUsername(username)) { + if (!AccountValidatorRegexUtil.INSTANCE.isUsername(rawUsername)) { showWarning("请输入有效的用户名,用户名长度需要大于0小于20"); btnLogin.revertAnimation(); return; } - // 账号转base64 + // 用户名经base64编码 + String username; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - username = Base64Util.Base64PlusEncode(username); + username = Base64Util.Base64PlusEncode(rawUsername); } else { System.out.println("Base64Util.Base64PlusDecode error"); + btnLogin.revertAnimation(); + return; } - } - // 初始化keymanager - KeyManager.INSTANCE.initKeyChain("/"+username); + // 密码经md5哈希 + String password =DigestUtilKt.encodeToMD5(rawPassword); +// } - // 登录server(密码转md5) - OriginalLoginRequest loginRequest=new OriginalLoginRequest(username, - DigestUtilKt.encodeToMD5(password)); - if(GlobalSetting.openBiometric){ - // 第一种模式,人脸识别登录,暂时废弃 -// mPresenter.downloadRegisterFacePicture(username,loginRequest,this); - }else{ - mPresenter.login(loginRequest); - } + // 传递登录请求信息,执行登录网络请求 + OriginalLoginRequest loginRequest=new OriginalLoginRequest(username, password); + mPresenter.login(loginRequest); }); // 监听键盘是否弹起 @@ -215,13 +210,8 @@ public class LoginActivity extends MINVpnBaseActivity } return null; }); - - } - - - @NotNull @Override public LoginActivityPresenter onCreatePresenter() { @@ -236,9 +226,9 @@ public class LoginActivity extends MINVpnBaseActivity @Override public void loginSuccess(String successMsg) { showSuccess(successMsg); - MINVpnSettingAPI.INSTANCE.updateUsername(username); + MINVpnSettingAPI.INSTANCE.updateUsername(rawUsername); if(savePasswordBox.isChecked()){ - MINVpnSettingAPI.INSTANCE.updatePassword(password); + MINVpnSettingAPI.INSTANCE.updatePassword(rawPassword); }else{ MINVpnSettingAPI.INSTANCE.updatePassword(""); } diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityContract.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityContract.java index 9c6aed6..89de86d 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityContract.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityContract.java @@ -10,7 +10,7 @@ package com.pkusz.min_vpn_client.activity.login; import android.content.Context; import com.pkusz.min_vpn_client.activity.base.MINVpnBaseView; -import com.pkusz.min_vpn_client.model.request.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest; import cn.qjm253.quick_android_mvp.base.mvp.BaseModel; import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter; diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityModel.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityModel.java index ad10eae..9228c60 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityModel.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityModel.java @@ -9,7 +9,8 @@ package com.pkusz.min_vpn_client.activity.login; import android.content.Context; -import com.pkusz.min_vpn_client.model.request.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.VMSRequestAPI; import common.LoggerHelper; @@ -22,30 +23,23 @@ public class LoginActivityModel implements LoginActivityContract.Model{ @Override public void login(OriginalLoginRequest loginRequest) { -// 与MIS通信,获取返回信息 -// Request_API.INSTANCE.login() - // 假定成功登录,则执行下面语句 - boolean flag=true; - if(flag){ + Integer resCode= VMSRequestAPI.INSTANCE.login(loginRequest); + if(resCode==200) { mPresenter.loginSuccess(); }else{ - mPresenter.loginFailed("测试登录失败..."); + mPresenter.loginFailed("登录失败,VMS应答码为"+resCode); } } @Override public void loginWithSafetyInfo(OriginalLoginRequest loginRequest, Context context) { - // 内含百度定位、mac地址等信息 - boolean flag=true; - if(flag){ - mPresenter.loginSuccess(); - }else{ - mPresenter.loginFailed("测试登录失败..."); - } + // 废弃接口 + LoggerHelper.warning("model.loginWithSafetyInfo: 暂停使用含有mac地址等安全信息的登录功能"); } @Override public void downloadRegisterFacePicture(String username, OriginalLoginRequest loginRequest, Context context) { + // 废弃接口 LoggerHelper.warning("model.downloadRegisterFacePicture: 暂停人脸识别登录功能"); } } diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityPresenter.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityPresenter.java index 25b88ff..86aa315 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityPresenter.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/login/LoginActivityPresenter.java @@ -9,7 +9,7 @@ package com.pkusz.min_vpn_client.activity.login; import android.content.Context; -import com.pkusz.min_vpn_client.model.request.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest; public class LoginActivityPresenter extends LoginActivityContract.Presenter{ public LoginActivityPresenter(LoginActivity loginActivity){ diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java index d9981ed..193db15 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivity.java @@ -16,9 +16,10 @@ import android.widget.Toast; import com.pkusz.min_vpn_client.R; import com.pkusz.min_vpn_client.activity.base.MINVpnBaseActivity; import com.pkusz.min_vpn_client.activity.login.LoginActivity; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest; import com.pkusz.min_vpn_client.utils.AccountValidatorRegexUtil; import com.pkusz.min_vpn_client.utils.Base64Util; -import com.pkusz.min_vpn_client.utils.KeyManager; +import com.pkusz.min_vpn_client.utils.DigestUtilKt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -152,21 +153,23 @@ public class RegisterActivity extends MINVpnBaseActivity= Build.VERSION_CODES.O) { - username= Base64Util.Base64PlusEncode(username); - }else{ - showWarning("username base64 error"); + base64Username = Base64Util.Base64PlusEncode(username); + } else { + System.out.println("Base64Util.Base64PlusDecode error"); + btnRegister.revertAnimation(); return; } - System.out.println("username: "+username); - - // todo: 这里存疑 - byte[] certification= KeyManager.INSTANCE.initKeyChain("/"+username) - .getCertification("/"+username).getSignature(); - - // todo: 发送注册信息 + // 密码经md5哈希 + String md5Password = DigestUtilKt.encodeToMD5(password); + // 传递注册请求信息,执行注册网络请求 + OriginalRegisterRequest original=new OriginalRegisterRequest( + base64Username,md5Password,phone,email,inviteCode); + mPresenter.register(original); }); // 监听键盘是否弹起 diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityContract.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityContract.java index bbb3747..be4f2fb 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityContract.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityContract.java @@ -10,7 +10,7 @@ package com.pkusz.min_vpn_client.activity.register; import android.content.Context; import com.pkusz.min_vpn_client.activity.base.MINVpnBaseView; -import com.pkusz.min_vpn_client.model.request.OriginalRegisterRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest; import cn.qjm253.quick_android_mvp.base.mvp.BaseModel; import cn.qjm253.quick_android_mvp.base.mvp.BasePresenter; diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java index 9d1cca5..cf844b8 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityModel.java @@ -9,7 +9,10 @@ package com.pkusz.min_vpn_client.activity.register; import android.content.Context; -import com.pkusz.min_vpn_client.model.request.OriginalRegisterRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest; +import com.pkusz.min_vpn_client.model.VMSRequestAPI; + +import common.LoggerHelper; public class RegisterActivityModel implements RegisterActivityContract.Model{ private RegisterActivityPresenter mPresenter; @@ -19,16 +22,23 @@ public class RegisterActivityModel implements RegisterActivityContract.Model{ @Override public void register(OriginalRegisterRequest registerRequest) { - mPresenter.registerSuccess(); + Integer resCode=VMSRequestAPI.INSTANCE.register(registerRequest); + if(resCode==200) { + mPresenter.registerSuccess(); + }else{ + mPresenter.registerFailed("注册失败,VMS应答码为"+resCode); + } } @Override public void registerWithSafetyInfo(OriginalRegisterRequest registerRequest, Context context) { - mPresenter.registerSuccess(); + // 废弃接口 + LoggerHelper.warning("model.registerWithSafetyInfo: 暂停使用含有mac地址等安全信息的注册功能"); } @Override public void uploadRegisterFacePicture(String username, OriginalRegisterRequest registerRequest, Context context) { - // 废弃接口。 + // 废弃接口 + LoggerHelper.warning("model.uploadRegisterFacePicture: 暂停人脸识别注册功能"); } } diff --git a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java index 82b9fc6..7532c77 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/activity/register/RegisterActivityPresenter.java @@ -9,7 +9,7 @@ package com.pkusz.min_vpn_client.activity.register; import android.content.Context; -import com.pkusz.min_vpn_client.model.request.OriginalRegisterRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest; public class RegisterActivityPresenter extends RegisterActivityContract.Presenter{ public RegisterActivityPresenter(RegisterActivity registerActivity){ diff --git a/app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalLoginRequest.java b/app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalLoginRequest.java similarity index 89% rename from app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalLoginRequest.java rename to app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalLoginRequest.java index c07af07..7ae9ee3 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalLoginRequest.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalLoginRequest.java @@ -1,4 +1,4 @@ -package com.pkusz.min_vpn_client.model.request; +package com.pkusz.min_vpn_client.model.OriginalRequest; /* * @Author: Wang Feng * @Description: 登录请求的原始属性 diff --git a/app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalRegisterRequest.java b/app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalRegisterRequest.java similarity index 93% rename from app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalRegisterRequest.java rename to app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalRegisterRequest.java index 4a790e3..f02f358 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/model/request/OriginalRegisterRequest.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/model/OriginalRequest/OriginalRegisterRequest.java @@ -1,4 +1,4 @@ -package com.pkusz.min_vpn_client.model.request; +package com.pkusz.min_vpn_client.model.OriginalRequest; /* * @Author: Wang Feng * @Description: 注册请求的原始属性 diff --git a/app/src/main/java/com/pkusz/min_vpn_client/model/VMSRequestAPI.java b/app/src/main/java/com/pkusz/min_vpn_client/model/VMSRequestAPI.java index ad11dec..e4865d0 100644 --- a/app/src/main/java/com/pkusz/min_vpn_client/model/VMSRequestAPI.java +++ b/app/src/main/java/com/pkusz/min_vpn_client/model/VMSRequestAPI.java @@ -8,8 +8,8 @@ package com.pkusz.min_vpn_client.model; * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 */ -import com.pkusz.min_vpn_client.model.request.OriginalLoginRequest; -import com.pkusz.min_vpn_client.model.request.OriginalRegisterRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalLoginRequest; +import com.pkusz.min_vpn_client.model.OriginalRequest.OriginalRegisterRequest; import com.pkusz.min_vpn_client.utils.KeyManager; import org.bouncycastle.crypto.CryptoException; diff --git a/app/src/test/java/com/pkusz/min_vpn_client/model/TestBase64.java b/app/src/test/java/com/pkusz/min_vpn_client/model/TestBase64.java new file mode 100644 index 0000000..d88d834 --- /dev/null +++ b/app/src/test/java/com/pkusz/min_vpn_client/model/TestBase64.java @@ -0,0 +1,20 @@ +package com.pkusz.min_vpn_client.model; +/* + * @Author: Wang Feng + * @Description: + * @Version: 1.0.0 + * @Date: 19:28 2021/7/29 + * @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 + */ + +import com.pkusz.min_vpn_client.utils.Base64Util; + +import org.junit.Test; + +public class TestBase64 { + @Test + public void testBasePlus64(){ + System.out.println(Base64Util.Base64PlusEncode("张三")); + System.out.println(Base64Util.Base64PlusEncode(Base64Util.Base64PlusEncode("张三"))); + } +}