premium thingies

This commit is contained in:
Kima 2024-01-06 21:38:35 +01:00
parent 57525f3d67
commit 8c3998b5ba
3 changed files with 111 additions and 98 deletions

View File

@ -1,124 +1,136 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:filcnaplo/api/client.dart';
import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/settings.dart';
import 'package:refilc_plus/models/premium_scopes.dart'; import 'package:refilc_plus/models/premium_result.dart';
import 'package:flutter/foundation.dart'; // import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; // import 'package:flutter/services.dart';
import 'package:home_widget/home_widget.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:uni_links/uni_links.dart';
import 'package:http/http.dart' as http;
// import 'package:home_widget/home_widget.dart';
class PremiumAuth { class PremiumAuth {
final SettingsProvider _settings; final SettingsProvider _settings;
StreamSubscription? _sub;
PremiumAuth({required SettingsProvider settings}) : _settings = settings; PremiumAuth({required SettingsProvider settings}) : _settings = settings;
initAuth() { initAuth() {
finishAuth("igen"); try {
// try { _sub ??= uriLinkStream.listen(
// _sub ??= uriLinkStream.listen( (Uri? uri) {
// (Uri? uri) { if (uri != null) {
// if (uri != null) { final accessToken = uri.queryParameters['access_token'];
// final accessToken = uri.queryParameters['access_token']; if (accessToken != null) {
// if (accessToken != null) { finishAuth(accessToken);
// finishAuth(accessToken); }
// } }
// } },
// }, onError: (err) {
// onError: (err) { log("ERROR: initAuth: $err");
// log("ERROR: initAuth: $err"); },
// }, );
// );
// launchUrl( launchUrl(
// Uri.parse("https://api.filcnaplo.hu/oauth"), Uri.parse(FilcAPI.plusAuthLogin),
// mode: LaunchMode.externalApplication, mode: LaunchMode.externalApplication,
// ); );
// } catch (err, sta) { } catch (err, sta) {
// log("ERROR: initAuth: $err\n$sta"); log("ERROR: initAuth: $err\n$sta");
// } }
} }
Future<bool> finishAuth(String accessToken) async { Future<bool> finishAuth(String accessToken) async {
try { try {
// final res = await http.get(Uri.parse("${FilcAPI.premiumScopesApi}?access_token=${Uri.encodeComponent(accessToken)}")); // final res = await http.get(Uri.parse(
// final scopes = ((jsonDecode(res.body) as Map)["scopes"] as List).cast<String>(); // "${FilcAPI.plusScopes}?access_token=${Uri.encodeComponent(accessToken)}"));
// final scopes =
// ((jsonDecode(res.body) as Map)["scopes"] as List).cast<String>();
// log("[INFO] Premium auth finish: ${scopes.join(',')}"); // log("[INFO] Premium auth finish: ${scopes.join(',')}");
await _settings.update(premiumAccessToken: accessToken); await _settings.update(premiumAccessToken: accessToken);
final result = await refreshAuth(); final result = await refreshAuth();
if (Platform.isAndroid) updateWidget(); // if (Platform.isAndroid) updateWidget();
return result; return result;
} catch (err, sta) { } catch (err, sta) {
log("[ERROR] Premium auth failed: $err\n$sta"); log("[ERROR] reFilc+ auth failed: $err\n$sta");
} }
await _settings.update(premiumAccessToken: "", premiumScopes: []); await _settings.update(premiumAccessToken: "", premiumScopes: []);
if (Platform.isAndroid) updateWidget(); // if (Platform.isAndroid) updateWidget();
return false; return false;
} }
Future<bool?> updateWidget() async { // Future<bool?> updateWidget() async {
try { // try {
return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable'); // return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable');
} on PlatformException catch (exception) { // } on PlatformException catch (exception) {
if (kDebugMode) { // if (kDebugMode) {
print('Error Updating Widget After Auth. $exception'); // print('Error Updating Widget After Auth. $exception');
} // }
} // }
return false; // return false;
} // }
Future<bool> refreshAuth({bool removePremium = false}) async { Future<bool> refreshAuth({bool removePremium = false}) async {
if (!removePremium) {
if (_settings.premiumAccessToken == "") {
await _settings.update(premiumScopes: [], premiumLogin: "");
return false;
}
// skip reFilc+ check when disconnected
try {
final status = await InternetAddress.lookup('api.refilc.hu');
if (status.isEmpty) return false;
} on SocketException catch (_) {
return false;
}
for (int tries = 0; tries < 3; tries++) {
try {
print(FilcAPI.plusActivation);
print(_settings.premiumAccessToken);
final res = await http.post(Uri.parse(FilcAPI.plusActivation), body: {
"access_token": _settings.premiumAccessToken,
});
print(res.body);
if (res.body == "") throw "empty body";
if (res.body == "Unauthorized") {
throw "User is not autchenticated to Github!";
}
if (res.body == "empty_sponsors") {
throw "This user isn't sponsoring anyone currently!";
}
final premium = PremiumResult.fromJson(jsonDecode(res.body) as Map);
// successful activation of reFilc+
log("[INFO] reFilc+ activated: ${premium.scopes.join(',')}");
await _settings.update(
premiumAccessToken: premium.accessToken,
premiumScopes: premium.scopes,
premiumLogin: premium.login,
);
return true;
} catch (err, sta) {
// error while activating reFilc+
log("[ERROR] reFilc+ activation failed: $err\n$sta");
}
await Future.delayed(const Duration(seconds: 1));
}
}
// activation of reFilc+ failed
await _settings.update( await _settings.update(
premiumAccessToken: "igen", premiumAccessToken: "", premiumScopes: [], premiumLogin: "");
premiumScopes: [PremiumScopes.all], return false;
premiumLogin: "igen",
);
return true;
//if (!removePremium) {
//if (_settings.premiumAccessToken == "") {
// await _settings.update(premiumScopes: [], premiumLogin: "");
// return false;
//}
// Skip premium check when disconnected
// try {
// final status = await InternetAddress.lookup('github.com');
// if (status.isEmpty) return false;
// } on SocketException catch (_) {
// return false;
// }
//for (int tries = 0; tries < 3; tries++) {
// try {
// final res = await http.post(Uri.parse(FilcAPI.premiumApi), body: {
// "access_token": _settings.premiumAccessToken,
// });
//
// if (res.body == "") throw "empty body";
// final premium = PremiumResult.fromJson(jsonDecode(res.body) as Map);
// Activation succeeded
// log("[INFO] Premium activated: ${premium.scopes.join(',')}");
// await _settings.update(
// premiumAccessToken: premium.accessToken,
// premiumScopes: premium.scopes,
// premiumLogin: premium.login,
// );
// return true;
// } catch (err, sta) {
// log("[ERROR] Premium activation failed: $err\n$sta");
// }
// await Future.delayed(const Duration(seconds: 1));
//
//}
// Activation failed
//await _settings.update(
// premiumAccessToken: "igen",
// premiumScopes: [PremiumScopes.all],
// premiumLogin: "igen");
//return false;
} }
} }

View File

@ -1,5 +1,3 @@
import 'package:refilc_plus/models/premium_scopes.dart';
class PremiumResult { class PremiumResult {
final String accessToken; final String accessToken;
final List<String> scopes; final List<String> scopes;
@ -13,9 +11,9 @@ class PremiumResult {
factory PremiumResult.fromJson(Map json) { factory PremiumResult.fromJson(Map json) {
return PremiumResult( return PremiumResult(
accessToken: json["access_token"] ?? "igen", accessToken: json["access_token"] ?? "",
scopes: (json["scopes"] ?? [PremiumScopes.all]).cast<String>(), scopes: (json["scopes"] ?? []).cast<String>(),
login: json["login"] ?? "igen", login: json["login"] ?? "",
); );
} }
} }

View File

@ -1,14 +1,17 @@
import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/settings.dart';
import 'package:refilc_plus/api/auth.dart'; import 'package:refilc_plus/api/auth.dart';
import 'package:refilc_plus/models/premium_scopes.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
class PremiumProvider extends ChangeNotifier { class PremiumProvider extends ChangeNotifier {
final SettingsProvider _settings; final SettingsProvider _settings;
List<String> get scopes => _settings.premiumScopes; List<String> get scopes => _settings.premiumScopes;
bool hasScope(String scope) => true; bool hasScope(String scope) =>
scopes.contains(scope) || scopes.contains(PremiumScopes.all);
String get accessToken => _settings.premiumAccessToken; String get accessToken => _settings.premiumAccessToken;
String get login => _settings.premiumLogin; String get login => _settings.premiumLogin;
bool get hasPremium => true; bool get hasPremium =>
_settings.premiumAccessToken != "" && _settings.premiumScopes.isNotEmpty;
late final PremiumAuth _auth; late final PremiumAuth _auth;
PremiumAuth get auth => _auth; PremiumAuth get auth => _auth;