From 78af09d5804e3bc215abfcffccef4c52593e404a Mon Sep 17 00:00:00 2001 From: mrhcjones <150591975+TheHCJ@users.noreply.github.com> Date: Tue, 23 Apr 2024 21:33:27 +0100 Subject: [PATCH] no longer require prefs to access XRegularAccount --- lib/client/client.dart | 2 +- lib/client/client_regular_account.dart | 171 +++---------------------- lib/database/repository.dart | 1 - lib/main.dart | 2 +- lib/settings/_account.dart | 6 +- 5 files changed, 20 insertions(+), 162 deletions(-) diff --git a/lib/client/client.dart b/lib/client/client.dart index 0c35778..a39dc5d 100644 --- a/lib/client/client.dart +++ b/lib/client/client.dart @@ -37,7 +37,7 @@ class _QuackerTwitterClient extends TwitterClient { static Future fetch(Uri uri, {Map? headers}) async { var prefs = await PrefServiceShared.init(prefix: 'pref_'); - final XRegularAccount xRegularAccount = XRegularAccount(prefs); + final XRegularAccount xRegularAccount = XRegularAccount(); var authHeader = await getAuthHeader(prefs); if (authHeader != null) { diff --git a/lib/client/client_regular_account.dart b/lib/client/client_regular_account.dart index 1013495..37b1e58 100644 --- a/lib/client/client_regular_account.dart +++ b/lib/client/client_regular_account.dart @@ -10,9 +10,9 @@ import 'package:quacker/database/entities.dart'; import 'package:quacker/database/repository.dart'; import 'package:quacker/generated/l10n.dart'; -Future addAccount(BasePrefService prefs, String username, String password, String email) async { +Future addAccount(String username, String password, String? email) async { var database = await Repository.writable(); - final model = XRegularAccount(prefs); + final model = XRegularAccount(); try { final authHeader = await model.GetAuthHeader(username: username, password: password, email: email); @@ -57,25 +57,12 @@ Future?> getAuthHeader(BasePrefService prefs) async { class XRegularAccount extends ChangeNotifier { static final log = Logger('XRegularAccount'); - XRegularAccount(this.prefs) : super(); - final BasePrefService prefs; + XRegularAccount() : super(); static http.Client client = http.Client(); static List cookies = []; - static Map? _authHeader; - static var _tokenLimit = -1; - static var _tokenRemaining = -1; - static var _expiresAt = -1; - - static var gtToken, - flowToken1, - flowToken2, - flowTokenUserName, - flowTokenPassword, - flowToken2FA, - auth_token, - csrf_token; + static var gtToken, flowToken1, flowToken2, flowTokenUserName, flowTokenPassword, auth_token, csrf_token; static var kdt_Coookie; Future fetch(Uri uri, @@ -85,7 +72,7 @@ class XRegularAccount extends ChangeNotifier { required Map authHeader}) async { log.info('Fetching $uri'); - XRegularAccount xRegularAccount = XRegularAccount(prefs); + XRegularAccount xRegularAccount = XRegularAccount(); var response = await http.get(uri, headers: { ...?headers, ...authHeader, @@ -105,7 +92,6 @@ class XRegularAccount extends ChangeNotifier { } Future GetGuestId(Map userAgentHeader) async { - kdt_Coookie = await GetKdtCookie(); if (kdt_Coookie != null) cookies.add(kdt_Coookie!); var request = http.Request("GET", Uri.parse('https://twitter.com/i/flow/login'))..followRedirects = false; @@ -141,6 +127,8 @@ class XRegularAccount extends ChangeNotifier { if (gtToken_cookie != null) { cookies.add(gtToken_cookie); return gtToken_cookie; + } else { + return null; } } else throw Exception("Return Status is (${response.statusCode}), it should be 200"); @@ -398,7 +386,6 @@ class XRegularAccount extends ChangeNotifier { var auth_token_Coookie = matchAuthToken!.group(1).toString(); cookies.add(auth_token_Coookie); } - GetAuthTokenLimits(responseHeader); final expCt0 = RegExp(r'(ct0=(.+?));'); RegExpMatch? matchCt0 = expCt0.firstMatch(responseHeader); csrf_token = matchCt0?.group(2).toString(); @@ -413,9 +400,6 @@ class XRegularAccount extends ChangeNotifier { final expKdt = RegExp(r'(kdt=(.+?));'); RegExpMatch? matchKdt = expKdt.firstMatch(responseHeader); kdt_Coookie = matchKdt?.group(1).toString(); - if (kdt_Coookie != null) { - await SetKdtCookie(kdt_Coookie); - } } // final exptwid = RegExp(r'(twid="(.+?))"'); // RegExpMatch? matchtwid = exptwid.firstMatch(responseHeader); @@ -425,77 +409,17 @@ class XRegularAccount extends ChangeNotifier { throw Exception("Return Status is (${response.statusCode}), it should be 200"); } - Future BuildAuthHeader() async { - _authHeader = Map(); - _authHeader?.addAll({"Cookie": cookies.join(";")}); - _authHeader?.addAll({"authorization": bearerToken}); - _authHeader?.addAll({"x-csrf-token": csrf_token}); - //_authHeader!.addAll(userAgentHeader); - //authHeader.addAll({"Host": "api.twitter.com"}); - } - - Future IsTokenExpired() async { - if (_authHeader != null) { - // If we don't have an expiry or limit, it's probably because we haven't made a request yet, so assume they're OK - if (_expiresAt == -1 && _tokenLimit == -1 && _tokenRemaining == -1) { - // TODO: Null safety with concurrent threads - return true; - } - // Check if the token we have hasn't expired yet - if (DateTime.now().millisecondsSinceEpoch < _expiresAt) { - // Check if the token we have still has usages remaining - if (_tokenRemaining < _tokenLimit) { - // TODO: Null safety with concurrent threads - return false; - } else - return false; - } - return false; - } else - return true; - - //log.info('Refreshing the Twitter token'); - } - - Future getAuthTokenFromPref() async { - if (_expiresAt == -1) _expiresAt = await GetTokenExpires(); - if (_tokenRemaining == -1) _tokenRemaining = await GetTokenRemaining(); - if (_tokenLimit == -1) _tokenLimit = await GetTokenLimit(); - } - - Future GetAuthTokenLimits( - String responseHeader, - ) async { - // Update our token's rate limit counters - final expAuthTokenLimitReset = RegExp(r'(x-rate-limit-reset:(.+?)),'); - RegExpMatch? matchAuthTokenLimitReset = expAuthTokenLimitReset.firstMatch(responseHeader); - var limitReset = matchAuthTokenLimitReset?.group(2).toString(); - - final expAuthTokenLimitRemaining = RegExp(r'(x-rate-limit-remaining:(.+?)),'); - RegExpMatch? matchAuthTokenLimitRemaining = expAuthTokenLimitRemaining.firstMatch(responseHeader); - var limitRemaining = matchAuthTokenLimitRemaining?.group(2).toString(); - - final expAuthTokenLimitLimit = RegExp(r'(x-rate-limit-limit:(.+?)),'); - RegExpMatch? matchAuthTokenLimitLimit = expAuthTokenLimitLimit.firstMatch(responseHeader); - var limitLimit = matchAuthTokenLimitLimit?.group(2).toString(); - - if (limitReset != null && limitRemaining != null && _tokenLimit != null) { - _expiresAt = int.parse(limitReset) * 1000; - _tokenRemaining = int.parse(limitRemaining); - _tokenLimit = int.parse(limitLimit!); - - await SetTokenExpires(_expiresAt); - await SetTokenExpires(_tokenRemaining); - await SetTokenExpires(_tokenLimit); - } + Future> BuildAuthHeader() async { + var _authHeader = Map(); + _authHeader.addAll({"Cookie": cookies.join(";")}); + _authHeader.addAll({"authorization": bearerToken}); + _authHeader.addAll({"x-csrf-token": csrf_token}); + return _authHeader; } Future?> GetAuthHeader( - {required String username, required String password, String? email, BuildContext? context}) async { + {required String username, required String password, String? email}) async { try { - DeleteAllCookies(); - if (_authHeader == null) await getAuthTokenFromPref(); - if (!await IsTokenExpired() && _authHeader != null) return _authHeader!; await GetGuestId(userAgentHeader); await GetGT(userAgentHeader); await GetFlowToken1(userAgentHeader); @@ -504,74 +428,9 @@ class XRegularAccount extends ChangeNotifier { await PassPassword(password, userAgentHeader); await GetAuthTokenCsrf(userAgentHeader); - await BuildAuthHeader(); + return await BuildAuthHeader(); } on Exception catch (e) { - this.DeleteAllCookies(); throw Exception(e); } - - if (_authHeader != null) { - return _authHeader!; - } - } - - Future DeleteAllCookies() async { - this.DeleteTokenExpires(); - this.DeleteTokenLimit(); - this.DeleteTokenRemaining(); - _expiresAt = -1; - _tokenLimit = -1; - _tokenRemaining = -1; - cookies.clear(); - } - - Future SetKdtCookie(String cookie) async { - await prefs.set("KDT_Cookie", cookie); - } - - Future GetKdtCookie() async { - return prefs.get("KDT_Cookie"); } - - Future DeleteKdtCookie() async { - return prefs.remove("KDT_Cookie"); - } - - Future SetTokenExpires(int expiresAt) async { - await prefs.set("auth_expiresAt", expiresAt); - } - - Future GetTokenExpires() async { - return prefs.get("auth_expiresAt") ?? -1; - } - - Future DeleteTokenExpires() async { - return prefs.remove("auth_expiresAt"); - } - - Future SetTokenRemaining(int tokenRemaining) async { - await prefs.set("auth_tokenRemaining", tokenRemaining); - } - - Future GetTokenRemaining() async { - return prefs.get("auth_tokenRemaining") ?? -1; - } - - Future DeleteTokenRemaining() async { - return prefs.remove("auth_tokenRemaining"); - } - - Future SetTokenLimit(int tokenLimit) async { - await prefs.set("auth_tokenLimit", tokenLimit); - } - - Future GetTokenLimit() async { - return prefs.get("auth_tokenLimit") ?? -1; - } - - Future DeleteTokenLimit() async { - return prefs.remove("auth_tokenLimit"); - } - - // log.info('Imported data into ${}'); } diff --git a/lib/database/repository.dart b/lib/database/repository.dart index 6972ca2..9cee707 100644 --- a/lib/database/repository.dart +++ b/lib/database/repository.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:pref/pref.dart'; import 'package:quacker/group/group_model.dart'; import 'package:logging/logging.dart'; import 'package:sqflite/sqflite.dart'; diff --git a/lib/main.dart b/lib/main.dart index 6333224..44b7211 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -226,7 +226,7 @@ Future main() async { Provider(create: (context) => TrendLocationsModel()), Provider(create: (context) => TrendsModel(trendLocationModel)), ChangeNotifierProvider(create: (_) => VideoContextState(prefService.get(optionMediaDefaultMute))), - ChangeNotifierProvider(create: (_) => XRegularAccount(prefService)), + ChangeNotifierProvider(create: (_) => XRegularAccount()), ], child: FritterApp(), builder: (BuildContext _, Widget? w) => w ?? Container(), diff --git a/lib/settings/_account.dart b/lib/settings/_account.dart index 389818c..39f5eb7 100644 --- a/lib/settings/_account.dart +++ b/lib/settings/_account.dart @@ -44,8 +44,8 @@ class _SettingsAccountFragment extends State { IconButton( icon: Icon(Icons.refresh), onPressed: () async { - await addAccount(model.prefs, data[index]['id'] as String, - data[index]['password'] as String, data[index]['email'].toString()); + await addAccount(data[index]['id'] as String, data[index]['password'] as String, + data[index]['email'].toString()); setState(() {}); }, ), @@ -147,7 +147,7 @@ class _addDialog extends State { actions: [ TextButton( onPressed: () async { - final response = await addAccount(PrefService.of(context), _username.text, _password.text, _email.text); + final response = await addAccount(_username.text, _password.text, _email.text); if (context.mounted) { showSnackBar(context, icon: '', message: response); }