diff --git a/refilc_mobile_ui/lib/screens/login/kreten_login.dart b/refilc_mobile_ui/lib/screens/login/kreten_login.dart new file mode 100644 index 0000000..cbafab8 --- /dev/null +++ b/refilc_mobile_ui/lib/screens/login/kreten_login.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:refilc_kreta_api/client/api.dart'; +import 'package:refilc_kreta_api/client/client.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class KretenLoginScreen extends StatefulWidget { + const KretenLoginScreen({super.key}); + + @override + State createState() => _KretenLoginScreenState(); +} + +class _KretenLoginScreenState extends State { + late final WebViewController controller; + var loadingPercentage = 0; + var currentUrl = ''; + + @override + void initState() { + super.initState(); + controller = WebViewController() + ..setJavaScriptMode(JavaScriptMode.unrestricted) + ..setNavigationDelegate(NavigationDelegate( + onPageStarted: (url) async { + setState(() { + loadingPercentage = 0; + currentUrl = url; + }); + + List requiredThings = url + .replaceAll( + '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=', + ':') + .split(':'); + + String code = requiredThings[0]; + // String sessionState = requiredThings[1]; + + debugPrint('url: $url'); + + // actual login (token grant) logic + Map headers = { + "content-type": "application/x-www-form-urlencoded", + "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", + }); + if (res != null) { + 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 (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); + + // // 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(); + + // 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) { + setState(() { + loadingPercentage = progress; + }); + }, + onPageFinished: (url) { + setState(() { + loadingPercentage = 100; + }); + }, + )) + ..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'), + ); + } + + // Future loadLoginUrl() async { + // String nonceStr = await Provider.of(context, listen: false) + // .getAPI(KretaAPI.nonce, json: false); + + // Nonce nonce = getNonce(nonceStr, ); + // } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: const BackButton(), + title: const Text('e-KRÉTA Bejelentkezés'), + ), + body: Stack( + children: [ + WebViewWidget( + controller: controller, + ), + if (loadingPercentage < 100) + LinearProgressIndicator( + value: loadingPercentage / 100.0, + ), + ], + ), + ); + } +} diff --git a/refilc_mobile_ui/pubspec.yaml b/refilc_mobile_ui/pubspec.yaml index 43ffc5e..555383f 100644 --- a/refilc_mobile_ui/pubspec.yaml +++ b/refilc_mobile_ui/pubspec.yaml @@ -71,6 +71,7 @@ dependencies: markdown: ^7.2.2 carousel_slider: ^4.2.1 flutter_portal: ^1.1.4 + webview_flutter: ^4.8.0 dev_dependencies: flutter_lints: ^3.0.1