import 'dart:math'; import 'dart:typed_data'; import 'package:base32/base32.dart'; import 'package:libac_dart/nbt/NbtUtils.dart'; import 'package:libac_dart/nbt/impl/CompoundTag.dart'; import 'package:libac_dart/utils/uuid/NbtUUID.dart'; import 'package:libac_dart/utils/uuid/UUID.dart'; /// The user class is a user object. /// /// This, most basic object, will only contain data needed for user identification. Issues, groups, etc shall be handled in another area. class User { String sName; UUID ID; User({required this.sName, required this.ID}); } String generateTOTPSecret({int length = 32}) { final random = Random.secure(); final List bytes = List.generate(length, (_) => random.nextInt(256)); return base32.encode(Uint8List.fromList(bytes)); } class DBUser { String sName; UUID ID; late String TOTPSecret; DBUser({required this.sName, required this.ID, String? totp}) { if (totp == null) { TOTPSecret = generateTOTPSecret(); } else { TOTPSecret = totp; } } factory DBUser.load({required CompoundTag serialized}) { UUID IDv4 = UUID.generate(4); NbtUUID saved = NbtUtils.readUUID(serialized, "id"); IDv4 = saved.toUUID(); DBUser user = DBUser( sName: serialized.get("name")?.asString() ?? "", ID: IDv4, totp: serialized.get("mfa_secret")?.asString() ?? "", ); return user; } void regenerateTOTP() { TOTPSecret = generateTOTPSecret(); } }