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 542ff01..7317f15 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 @@ -42,6 +42,8 @@ import cn.qjm253.quick_android_easy_bar.EasyBar; import cn.qjm253.quick_android_easy_bar.EasyBarExtensionsKt; import kotlin.Unit; import kotlin.jvm.functions.Function1; +import com.pkusz.min_vpn_client.utils.IdentityDump; + public class LoginActivity extends MINVpnBaseActivity implements LoginActivityContract.View{ @@ -140,6 +142,26 @@ public class LoginActivity extends MINVpnBaseActivity etPassword.setText(MINVpnSettingAPI.INSTANCE.getPassword()); } + //导出按钮 + export_identity.setBackgroundResource(R.drawable.button_shape_default); + export_identity.setOnClickListener(v->{ + ContextExtensionKt.hideSoftKeyboard(this,export_identity); + export_identity.startAnimation(); + export_identity.revertAnimation(); + new IdentityDump().exportIdentity(); + Toast.makeText(this, "You clicked export identity button", Toast.LENGTH_SHORT).show(); + }); + + //导入按钮 + import_identity.setBackgroundResource(R.drawable.button_shape_default); + import_identity.setOnClickListener(v->{ + ContextExtensionKt.hideSoftKeyboard(this,import_identity); + import_identity.startAnimation(); + import_identity.revertAnimation(); + new IdentityDump().importIdentity(); + Toast.makeText(this, "You clicked import identity button", Toast.LENGTH_SHORT).show(); + }); + // 登录按钮 btnLogin.setBackgroundResource(R.drawable.button_shape_default); btnLogin.setOnClickListener(v->{ @@ -189,6 +211,10 @@ public class LoginActivity extends MINVpnBaseActivity ViewExtensionKt.transYAnimation(etPassword, 0f, -DisplayUtils.dp2px(this, 90)), ViewExtensionKt.transYAnimation(btnLogin, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(export_identity, + 0f, -DisplayUtils.dp2px(this, 90)), + ViewExtensionKt.transYAnimation(import_identity, 0f, -DisplayUtils.dp2px(this, 90))); }else{ ViewExtensionKt.animer200(imageView_imgLogo, @@ -201,6 +227,10 @@ public class LoginActivity extends MINVpnBaseActivity ViewExtensionKt.transYAnimation(etPassword, 0f, -DisplayUtils.dp2px(this, 90),0f), ViewExtensionKt.transYAnimation(btnLogin, + 0f, -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(export_identity, + 0f, -DisplayUtils.dp2px(this, 90),0f), + ViewExtensionKt.transYAnimation(import_identity, 0f, -DisplayUtils.dp2px(this, 90),0f)); } return null; diff --git a/app/src/main/java/com/pkusz/min_vpn_client/utils/IdentityDump.java b/app/src/main/java/com/pkusz/min_vpn_client/utils/IdentityDump.java new file mode 100644 index 0000000..9c98f3f --- /dev/null +++ b/app/src/main/java/com/pkusz/min_vpn_client/utils/IdentityDump.java @@ -0,0 +1,84 @@ +package com.pkusz.min_vpn_client.utils; + + +import security.SafeBag; +import util.FileUtil; +import java.io.IOException; +import java.util.Arrays; + + +public class IdentityDump { + // 身份信息保存位置 + public static String identityPath="/storage/emulated/0/Identity/"; + // 用户名 + public static String username="UserName1"; + // 身份文件保存位置 + public static String identityFilePath=identityPath+username+".export"; + + /** + * 生成本地密钥,持久化存储到本地硬盘 + * @param username + * @param identityPath + */ + private void generateForeverIdentity(String username,String identityPath){ + // identityName是将username前面加上"/" + String identityName="/"+username; + KeyManager.INSTANCE.initKeyChain(identityName,identityPath); + } + + /** + * 导出用户身份 + */ + public void exportIdentity(){ + // 生成数据库身份 + new IdentityDump().generateForeverIdentity(username,identityPath); + System.out.println("生成的用户身份: "+KeyManager.INSTANCE + .getIdentity("/"+username,identityPath)); + // 导出数据库身份 + SafeBag safeBag; + try { + safeBag=KeyManager.INSTANCE.getKeyChain().exportSafeBag(""); + System.out.println(Arrays.toString(safeBag.getValue())); + } catch (Exception e) { + e.printStackTrace(); + return; + } + // 将身份数据写入本地文件 + try { + FileUtil.writeFile(identityFilePath,safeBag.getValue()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 导入用户身份 + */ + public void importIdentity(){ + // 导入身份前查看是否有该用户身份 +// System.out.println("试图取出未导入的用户身份: "+KeyManager.INSTANCE +// .getIdentity("/"+username,identityPath)); + // 从本地文件中读取身份数据 + byte[] identityBytes; + try { + identityBytes=FileUtil.readFile(identityFilePath); + } catch (IOException e) { + e.printStackTrace(); + return; + } + // 转成SafeBag + SafeBag safeBag=new SafeBag(identityBytes); + // 导入到本地身份数据库中 + try { + KeyManager.INSTANCE.getKeyChain().importSafeBag(safeBag,"",true); + } catch (Exception e) { + e.printStackTrace(); + } + // 导入身份后查看是否有该用户身份 + System.out.println("查看是否成功导入用户身份: "+KeyManager.INSTANCE + .getIdentity("/"+username,identityPath)); + } + + + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 0ba1020..d513c54 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -94,12 +94,50 @@ + + + +