login.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import 'package:dio/dio.dart';
  2. import 'package:flutter_secure_storage/flutter_secure_storage.dart';
  3. import 'package:encrypt/encrypt.dart';
  4. import 'package:e2ee_chat/common/global.dart';
  5. import 'package:e2ee_chat/common/api.dart';
  6. import '../model/user.dart';
  7. import '../objectbox.g.dart';
  8. import 'profile.dart';
  9. /*
  10. static Future<void> put(User user) async {
  11. debug('put user ${user.id} ${user.username}');
  12. final store = await openStore();
  13. final box = store.box<User>();
  14. box.put(user);
  15. store.close();
  16. }
  17. static Future<User?> query(String username) async {
  18. final store = await openStore();
  19. final box = store.box<User>();
  20. int id = 0;
  21. box.getAll().forEach((user) {
  22. if (user.username == username) id = user.id;
  23. });
  24. User? user = box.get(id);
  25. // Query<User> query = box.query(User_.username.equals(username)).build();
  26. // final user = query.findFirst();
  27. // query.close();
  28. debug('query user with username=$username get id=$id');
  29. store.close();
  30. return user;
  31. }
  32. */
  33. class LoginPresenter extends ProfilePresenter {
  34. bool get isLogin => profile.isLogin;
  35. User? get user => profile.user;
  36. @Transient()
  37. Future<String?> get _secretKey async {
  38. if (user == null) return null;
  39. final storage = FlutterSecureStorage();
  40. String? _key = await storage.read(key: _keyKey);
  41. if (_key == null) {
  42. _key = Key.fromSecureRandom(256).base64;
  43. await storage.write(key: _keyKey, value: _key);
  44. }
  45. return _key;
  46. }
  47. String get _keyKey => "e2ee_chat secret key of ${user!.username}";
  48. Future<bool> login({String? username, String? password}) async {
  49. debug('UserModel login begin');
  50. if (username != null) {
  51. profile.user = User(username);
  52. }
  53. bool _result = false;
  54. String? token = await profile.token;
  55. if (profile.username != null && (password != null || token != null)) {
  56. String? _token;
  57. try {
  58. _token = await Api().login(username: profile.username!, password: password, token: token);
  59. _result = _token != null;
  60. } on DioError catch(e) {
  61. print(e);
  62. }
  63. profile.setToken(_token);
  64. debug('UserModel login get token: ${await profile.token}');
  65. if (await profile.token != null) {
  66. debug('UserModel login success!');
  67. profile.isLogin = true;
  68. profile.isLogout = false;
  69. // await User.put(profile.user!);
  70. profile.setToken(_token);
  71. notifyListeners();
  72. }
  73. }
  74. debug('UserModel login end');
  75. return _result;
  76. }
  77. Future<void> logout() async {
  78. if (profile.isLogin && await Api().logout()) {
  79. profile.isLogin = false;
  80. profile.isLogout = true;
  81. notifyListeners();
  82. }
  83. }
  84. Future<bool> loginOrRegister(String username, String password) async {
  85. if (await login(username: username, password: password)) {
  86. return true;
  87. } else if (await Api().register(username, password)) {
  88. return await login(username: username, password: password);
  89. }
  90. return false;
  91. }
  92. }