From 8c3998b5ba583f1763e641a4fe314446b0ed11fc Mon Sep 17 00:00:00 2001 From: Kima Date: Sat, 6 Jan 2024 21:38:35 +0100 Subject: [PATCH] premium thingies --- lib/api/auth.dart | 194 +++++++++++++++------------- lib/models/premium_result.dart | 8 +- lib/providers/premium_provider.dart | 7 +- 3 files changed, 111 insertions(+), 98 deletions(-) diff --git a/lib/api/auth.dart b/lib/api/auth.dart index d9ba587..2d6b1d0 100644 --- a/lib/api/auth.dart +++ b/lib/api/auth.dart @@ -1,124 +1,136 @@ import 'dart:async'; +import 'dart:convert'; import 'dart:developer'; import 'dart:io'; +import 'package:filcnaplo/api/client.dart'; import 'package:filcnaplo/models/settings.dart'; -import 'package:refilc_plus/models/premium_scopes.dart'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/services.dart'; -import 'package:home_widget/home_widget.dart'; +import 'package:refilc_plus/models/premium_result.dart'; +// import 'package:flutter/foundation.dart'; +// import 'package:flutter/services.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 { final SettingsProvider _settings; + StreamSubscription? _sub; PremiumAuth({required SettingsProvider settings}) : _settings = settings; initAuth() { - finishAuth("igen"); - // try { - // _sub ??= uriLinkStream.listen( - // (Uri? uri) { - // if (uri != null) { - // final accessToken = uri.queryParameters['access_token']; - // if (accessToken != null) { - // finishAuth(accessToken); - // } - // } - // }, - // onError: (err) { - // log("ERROR: initAuth: $err"); - // }, - // ); + try { + _sub ??= uriLinkStream.listen( + (Uri? uri) { + if (uri != null) { + final accessToken = uri.queryParameters['access_token']; + if (accessToken != null) { + finishAuth(accessToken); + } + } + }, + onError: (err) { + log("ERROR: initAuth: $err"); + }, + ); - // launchUrl( - // Uri.parse("https://api.filcnaplo.hu/oauth"), - // mode: LaunchMode.externalApplication, - // ); - // } catch (err, sta) { - // log("ERROR: initAuth: $err\n$sta"); - // } + launchUrl( + Uri.parse(FilcAPI.plusAuthLogin), + mode: LaunchMode.externalApplication, + ); + } catch (err, sta) { + log("ERROR: initAuth: $err\n$sta"); + } } Future finishAuth(String accessToken) async { try { - // final res = await http.get(Uri.parse("${FilcAPI.premiumScopesApi}?access_token=${Uri.encodeComponent(accessToken)}")); - // final scopes = ((jsonDecode(res.body) as Map)["scopes"] as List).cast(); + // final res = await http.get(Uri.parse( + // "${FilcAPI.plusScopes}?access_token=${Uri.encodeComponent(accessToken)}")); + // final scopes = + // ((jsonDecode(res.body) as Map)["scopes"] as List).cast(); // log("[INFO] Premium auth finish: ${scopes.join(',')}"); await _settings.update(premiumAccessToken: accessToken); final result = await refreshAuth(); - if (Platform.isAndroid) updateWidget(); + // if (Platform.isAndroid) updateWidget(); return result; } catch (err, sta) { - log("[ERROR] Premium auth failed: $err\n$sta"); + log("[ERROR] reFilc+ auth failed: $err\n$sta"); } await _settings.update(premiumAccessToken: "", premiumScopes: []); - if (Platform.isAndroid) updateWidget(); + // if (Platform.isAndroid) updateWidget(); return false; } - Future updateWidget() async { - try { - return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable'); - } on PlatformException catch (exception) { - if (kDebugMode) { - print('Error Updating Widget After Auth. $exception'); - } - } - return false; - } + // Future updateWidget() async { + // try { + // return HomeWidget.updateWidget(name: 'widget_timetable.WidgetTimetable'); + // } on PlatformException catch (exception) { + // if (kDebugMode) { + // print('Error Updating Widget After Auth. $exception'); + // } + // } + // return false; + // } Future 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( - premiumAccessToken: "igen", - premiumScopes: [PremiumScopes.all], - 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; + premiumAccessToken: "", premiumScopes: [], premiumLogin: ""); + return false; } } diff --git a/lib/models/premium_result.dart b/lib/models/premium_result.dart index 5f674ec..4ed19f9 100644 --- a/lib/models/premium_result.dart +++ b/lib/models/premium_result.dart @@ -1,5 +1,3 @@ -import 'package:refilc_plus/models/premium_scopes.dart'; - class PremiumResult { final String accessToken; final List scopes; @@ -13,9 +11,9 @@ class PremiumResult { factory PremiumResult.fromJson(Map json) { return PremiumResult( - accessToken: json["access_token"] ?? "igen", - scopes: (json["scopes"] ?? [PremiumScopes.all]).cast(), - login: json["login"] ?? "igen", + accessToken: json["access_token"] ?? "", + scopes: (json["scopes"] ?? []).cast(), + login: json["login"] ?? "", ); } } diff --git a/lib/providers/premium_provider.dart b/lib/providers/premium_provider.dart index 50c8298..7b4510a 100644 --- a/lib/providers/premium_provider.dart +++ b/lib/providers/premium_provider.dart @@ -1,14 +1,17 @@ import 'package:filcnaplo/models/settings.dart'; import 'package:refilc_plus/api/auth.dart'; +import 'package:refilc_plus/models/premium_scopes.dart'; import 'package:flutter/widgets.dart'; class PremiumProvider extends ChangeNotifier { final SettingsProvider _settings; List 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 login => _settings.premiumLogin; - bool get hasPremium => true; + bool get hasPremium => + _settings.premiumAccessToken != "" && _settings.premiumScopes.isNotEmpty; late final PremiumAuth _auth; PremiumAuth get auth => _auth;