From 148a43663cbaf79706167b42bc20f2e0b6a7a9e3 Mon Sep 17 00:00:00 2001 From: Kima Date: Tue, 13 Aug 2024 01:08:05 +0200 Subject: [PATCH] made kreten web login work hah --- refilc/lib/app.dart | 3 +- .../lib/screens/login/kreten_login.dart | 159 +++++++++--------- .../lib/screens/login/login_screen.dart | 12 ++ .../lib/screens/settings/settings_screen.dart | 66 ++++++++ 4 files changed, 164 insertions(+), 76 deletions(-) diff --git a/refilc/lib/app.dart b/refilc/lib/app.dart index f38352b..7bfb9c0 100644 --- a/refilc/lib/app.dart +++ b/refilc/lib/app.dart @@ -31,6 +31,7 @@ import 'package:provider/provider.dart'; import 'package:refilc_mobile_ui/common/system_chrome.dart' as mobile; import 'package:refilc_mobile_ui/screens/login/login_route.dart' as mobile; import 'package:refilc_mobile_ui/screens/login/login_screen.dart' as mobile; +// import 'package:refilc_mobile_ui/screens/login/kreten_login.dart' as mobileTest; import 'package:refilc_mobile_ui/screens/navigation/navigation_screen.dart' as mobile; import 'package:refilc_mobile_ui/screens/settings/settings_route.dart' @@ -261,7 +262,7 @@ class App extends StatelessWidget { switch (route.name) { case "login_back": return CupertinoPageRoute( - builder: (context) => const mobile.LoginScreen(back: true)); + builder: (context) => const mobile.LoginScreen()); case "login": return _rootRoute(const mobile.LoginScreen()); case "navigation": diff --git a/refilc_mobile_ui/lib/screens/login/kreten_login.dart b/refilc_mobile_ui/lib/screens/login/kreten_login.dart index 2d0e28a..d809af6 100644 --- a/refilc_mobile_ui/lib/screens/login/kreten_login.dart +++ b/refilc_mobile_ui/lib/screens/login/kreten_login.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -34,7 +36,7 @@ class _KretenLoginScreenState extends State { 'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=', '') .replaceAll( - '&scope=openid email offline_access kreta-ellenorzo-webapi.public kreta-eugyintezes-webapi.public kreta-fileservice-webapi.public kreta-mobile-global-webapi.public kreta-dkt-webapi.public kreta-ier-webapi.public&state=refilc_student_mobile&session_state=', + '&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&state=refilc_student_mobile&session_state=', ':') .split(':'); @@ -43,97 +45,104 @@ class _KretenLoginScreenState extends State { debugPrint('url: $url'); + print(code); + // actual login (token grant) logic Map headers = { - "content-type": "application/x-www-form-urlencoded", + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", "accept": "*/*", "user-agent": "eKretaStudent/264745 CFNetwork/1494.0.7 Darwin/23.4.0", - "code_verifier": "THDUSddKOOndwCkqBtVHvRjh2LK0V2kMyLP2QirqVWQ", }; Map? res = await Provider.of(context, listen: false) - .postAPI(KretaAPI.login, headers: headers, body: { - "code": code, - "redirect_uri": - "https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect", - "client_id": "kreta-ellenorzo-student-mobile-ios", - "grant_type": "authorization_code", - }); + .postAPI(KretaAPI.login, + autoHeader: false, + headers: headers, + body: { + "code": code, + "code_verifier": "DSpuqj_HhDX4wzQIbtn8lr8NLE5wEi1iVLMtMK0jY6c", + "redirect_uri": + "https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect", + "client_id": "kreta-ellenorzo-student-mobile-ios", + "grant_type": "authorization_code", + }); if (res != null) { if (kDebugMode) { print(res); } - // if (res.containsKey("error")) { - // if (res["error"] == "invalid_grant") { - // print("ERROR: invalid_grant"); - // return; - // } - // } else { - // if (res.containsKey("access_token")) { - // try { - // Provider.of(context, listen: false).accessToken = - // res["access_token"]; - // Map? studentJson = - // await Provider.of(context, listen: false) - // .getAPI(KretaAPI.student(instituteCode)); - // Student student = Student.fromJson(studentJson!); - // var user = User( - // username: username, - // password: password, - // instituteCode: instituteCode, - // name: student.name, - // student: student, - // role: JwtUtils.getRoleFromJWT(res["access_token"])!, - // ); + if (res.containsKey("error")) { + if (res["error"] == "invalid_grant") { + print("ERROR: invalid_grant"); + return; + } + } else { + print("MUKODIK GECI"); + print("ACCESS TOKEN: ${res["access_token"]}"); + // if (res.containsKey("access_token")) { + // try { + // Provider.of(context, listen: false).accessToken = + // res["access_token"]; + // Map? studentJson = + // await Provider.of(context, listen: false) + // .getAPI(KretaAPI.student(instituteCode)); + // Student student = Student.fromJson(studentJson!); + // var user = User( + // username: username, + // password: password, + // instituteCode: instituteCode, + // name: student.name, + // student: student, + // role: JwtUtils.getRoleFromJWT(res["access_token"])!, + // ); - // if (onLogin != null) onLogin(user); + // if (onLogin != null) onLogin(user); - // // Store User in the database - // await Provider.of(context, listen: false) - // .store - // .storeUser(user); - // Provider.of(context, listen: false) - // .addUser(user); - // Provider.of(context, listen: false) - // .setUser(user.id); + // // Store User in the database + // await Provider.of(context, listen: false) + // .store + // .storeUser(user); + // Provider.of(context, listen: false) + // .addUser(user); + // Provider.of(context, listen: false) + // .setUser(user.id); - // // Get user data - // try { - // await Future.wait([ - // Provider.of(context, listen: false) - // .fetch(), - // Provider.of(context, listen: false) - // .fetch(week: Week.current()), - // Provider.of(context, listen: false).fetch(), - // Provider.of(context, listen: false) - // .fetch(), - // Provider.of(context, listen: false) - // .fetchAll(), - // Provider.of(context, listen: false) - // .fetchAllRecipients(), - // Provider.of(context, listen: false).fetch(), - // Provider.of(context, listen: false) - // .fetch(), - // Provider.of(context, listen: false) - // .fetch(), - // ]); - // } catch (error) { - // print("WARNING: failed to fetch user data: $error"); - // } + // // Get user data + // try { + // await Future.wait([ + // Provider.of(context, listen: false) + // .fetch(), + // Provider.of(context, listen: false) + // .fetch(week: Week.current()), + // Provider.of(context, listen: false).fetch(), + // Provider.of(context, listen: false) + // .fetch(), + // Provider.of(context, listen: false) + // .fetchAll(), + // Provider.of(context, listen: false) + // .fetchAllRecipients(), + // Provider.of(context, listen: false).fetch(), + // Provider.of(context, listen: false) + // .fetch(), + // Provider.of(context, listen: false) + // .fetch(), + // ]); + // } catch (error) { + // print("WARNING: failed to fetch user data: $error"); + // } - // if (onSuccess != null) onSuccess(); + // if (onSuccess != null) onSuccess(); - // return LoginState.success; - // } catch (error) { - // print("ERROR: loginAPI: $error"); - // // maybe check debug mode - // // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("ERROR: $error"))); - // return LoginState.failed; - // } - // } - // } + // return LoginState.success; + // } catch (error) { + // print("ERROR: loginAPI: $error"); + // // maybe check debug mode + // // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("ERROR: $error"))); + // return LoginState.failed; + // } + // } + } } }, onProgress: (progress) { @@ -149,7 +158,7 @@ class _KretenLoginScreenState extends State { )) ..loadRequest( Uri.parse( - 'https://idp.e-kreta.hu/connect/authorize?prompt=login&nonce=refilc&response_type=code&code_challenge_method=S256&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&code_challenge=Oj_aVMRJHYsv00mrtGJY72NJa7HY54lVnU2Cb4CWbWw&redirect_uri=https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect&client_id=kreta-ellenorzo-student-mobile-ios&state=refilc_student_mobile'), + 'https://idp.e-kreta.hu/connect/authorize?prompt=login&nonce=wylCrqT4oN6PPgQn2yQB0euKei9nJeZ6_ffJ-VpSKZU&response_type=code&code_challenge_method=S256&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&code_challenge=HByZRRnPGb-Ko_wTI7ibIba1HQ6lor0ws4bcgReuYSQ&redirect_uri=https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect&client_id=kreta-ellenorzo-student-mobile-ios&state=refilc_student_mobile'), ); } diff --git a/refilc_mobile_ui/lib/screens/login/login_screen.dart b/refilc_mobile_ui/lib/screens/login/login_screen.dart index 572f3dc..123b046 100644 --- a/refilc_mobile_ui/lib/screens/login/login_screen.dart +++ b/refilc_mobile_ui/lib/screens/login/login_screen.dart @@ -5,6 +5,7 @@ import 'package:refilc/api/login.dart'; import 'package:refilc/theme/colors/colors.dart'; import 'package:refilc_mobile_ui/common/custom_snack_bar.dart'; import 'package:refilc_mobile_ui/common/system_chrome.dart'; +import 'package:refilc_mobile_ui/screens/login/kreten_login.dart'; import 'package:refilc_mobile_ui/screens/login/login_button.dart'; import 'package:refilc_mobile_ui/screens/login/login_input.dart'; import 'package:refilc_mobile_ui/screens/login/school_input/school_input.dart'; @@ -104,6 +105,17 @@ class LoginScreenState extends State { ), ), + TextButton( + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => const KretenLoginScreen(), + ), + ); + }, + child: const Text("login_w_kreten"), + ), + // app icon Padding( padding: EdgeInsets.zero, diff --git a/refilc_mobile_ui/lib/screens/settings/settings_screen.dart b/refilc_mobile_ui/lib/screens/settings/settings_screen.dart index b2c8f6e..d13f60d 100644 --- a/refilc_mobile_ui/lib/screens/settings/settings_screen.dart +++ b/refilc_mobile_ui/lib/screens/settings/settings_screen.dart @@ -749,6 +749,72 @@ class SettingsScreenState extends State // plus subscribe inline const PlusSettingsInline(), + // const SizedBox( + // height: 16.0, + // ), + + // Panel( + // hasShadow: false, + // padding: const EdgeInsets.only(left: 24.0, right: 24.0), + // title: Padding( + // padding: const EdgeInsets.only(left: 24.0), + // child: Text('account_link'.i18n), + // ), + // isTransparent: true, + // child: Column( + // children: [ + // // QwID account linking + // PanelButton( + // onPressed: () { + // launchUrl( + // Uri.parse( + // 'https://qwid.qwit.dev/oauth2/authorize?client_id=refilc&response_type=code&scope=*'), + // mode: LaunchMode.externalApplication, + // ); + // }, + // title: Text("QwID fiók-összekapcsolás".i18n), + // leading: Icon( + // FeatherIcons.link, + // size: 22.0, + // color: AppColors.of(context).text.withOpacity(0.95), + // ), + // trailing: GestureDetector( + // onTap: () { + // showDialog( + // context: context, + // builder: (BuildContext context) { + // return AlertDialog( + // title: const Text("QwID?!"), + // content: const Text( + // "A QwID egy olyan fiók, mellyel az összes QwIT szolgáltatásba beléphetsz és minden adatod egy helyen kezelheted. \"Miért jó ez nekem?\" A QwID fiókba való bejelentkezéssel rengeteg új funkcióhoz férhetsz hozzá, ami sajnos korábban lehetetlen volt egy szimpla e-KRÉTA fiókkal. Fiókhoz kötve megoszthatsz bármilyen adatot a barátaiddal, vagy ha szeretnéd nyilvánosságra is hozhatod jegyeid, reFilc témáid, és még rengeteg dolgot. A QwID fiók abban is segít, hogy egyszerűbben kezelhesd előfizetéseid, valamint fiókodnak köszönhetően rengeteg ajándékot kaphatsz reFilc+ előfizetésed mellé egyéb QwIT és reFilc szolgáltatásokban. \"Miért QwID?\" A név a reFilc mögött álló fejlesztői csapat, a QwIT nevéből, valamint az angol Identity szó rövidítéséből ered. \"Egyéb hasznos tudnivalók?\" A QwID fiókodat bármikor törölheted, ha úgy érzed, hogy nem szeretnéd tovább használni. Bővebb információt az adatkezelésről és az általános feltételekről megtalálsz a regisztrációs oldalon. Fiókod kezeléséhez látogass el a qwid.qwit.dev weboldalra.", + // ), + // actions: [ + // TextButton( + // onPressed: () { + // Navigator.of(context).pop(); + // }, + // child: const Text("Szuper!"), + // ), + // ], + // ); + // }, + // ); + // }, + // child: Icon( + // FeatherIcons.helpCircle, + // size: 20.0, + // color: AppColors.of(context).text.withOpacity(0.95), + // ), + // ), + // borderRadius: const BorderRadius.vertical( + // top: Radius.circular(12.0), + // bottom: Radius.circular(4.0), + // ), + // ), + // ], + // ), + // ), + // settings submenus const SizedBox( height: 16.0,