import 'dart:convert'; import 'package:crypto/crypto.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:neon/src/neon.dart'; import 'package:nextcloud/nextcloud.dart'; import 'package:rxdart/rxdart.dart'; import 'package:settings/settings.dart'; part 'account.g.dart'; String userAgentOverride() => 'Neon ${Global.packageInfo.version}+${Global.packageInfo.buildNumber}'; @JsonSerializable() class Account { Account({ required this.serverURL, required this.username, this.password, this.appPassword, }) : assert( (password != null && appPassword == null) || (password == null && appPassword != null), 'Either password or appPassword has to be set', ); factory Account.fromJson(final Map json) => _$AccountFromJson(json); Map toJson() => _$AccountToJson(this); final String serverURL; final String username; final String? password; final String? appPassword; @override // ignore: avoid_equals_and_hash_code_on_mutable_classes bool operator ==(final Object other) => other is Account && other.serverURL == serverURL && other.username == username && other.password == password && other.appPassword == appPassword; @override // ignore: avoid_equals_and_hash_code_on_mutable_classes int get hashCode => serverURL.hashCode + username.hashCode; String get id => client.id; NextcloudClient? _client; NextcloudClient get client => _client ??= NextcloudClient( serverURL, username: username, password: password ?? appPassword, userAgentOverride: userAgentOverride(), ); } Map _idCache = {}; extension NextcloudClientID on NextcloudClient { String get id { final key = '$username@$baseURL'; if (_idCache[key] != null) { return _idCache[key]!; } return _idCache[key] = sha1.convert(utf8.encode(key)).toString(); } } class AccountSpecificOptions { AccountSpecificOptions(this._storage); final Storage _storage; final _appIDsSubject = BehaviorSubject>(); late final List