import 'dart:convert'; import 'package:flutter_test/flutter_test.dart'; import 'package:hepan_everyday/features/school/undergraduate/navigation_policy.dart'; import 'package:hepan_everyday/features/school/undergraduate/page_probe.dart'; void main() { final uri = Uri.parse('https://eams.uestc.edu.cn/eams/'); test( 'navigation and capture distinguish official data from authentication', () { for (final host in [ 'eams.uestc.edu.cn', 'idas.uestc.edu.cn', 'eportal.uestc.edu.cn', ]) { expect( UndergraduateNavigationPolicy.canNavigate( Uri.https(host, '/'), isMainFrame: true, ), isTrue, ); } for (final value in [ 'https://eams.uestc.edu.cn.attacker.test/eams/', 'https://eams.uestc.edu.cn:444/eams/', 'https://user@eams.uestc.edu.cn/eams/', 'http://eams.uestc.edu.cn/eams/', ]) { expect( UndergraduateNavigationPolicy.canNavigate( Uri.parse(value), isMainFrame: true, ), isFalse, ); } expect(UndergraduateNavigationPolicy.isDataPage(uri), isTrue); expect( UndergraduateNavigationPolicy.isDataPage( Uri.parse('https://idas.uestc.edu.cn/authserver/login'), ), isFalse, ); expect( UndergraduateNavigationPolicy.secureIdentityRedirect( Uri.parse('http://idas.uestc.edu.cn/authserver/login?service=abc'), ).toString(), 'https://idas.uestc.edu.cn/authserver/login?service=abc', ); }, ); test( 'page evidence rejects changed URLs cross origins and aggregate oversize', () { Map value() => { 'topUrl': uri.toString(), 'authenticated': true, 'pages': [ {'kind': 'timetable', 'url': uri.toString(), 'html': 'table'}, ], }; expect( UndergraduatePageEvidence.decode(jsonEncode(value()), uri).pages, hasLength(1), ); expect( () => UndergraduatePageEvidence.decode({ ...value(), 'topUrl': 'https://other.test', }, uri), throwsFormatException, ); final cross = value(); (cross['pages'] as List).single['url'] = 'https://idas.uestc.edu.cn/'; expect( () => UndergraduatePageEvidence.decode(cross, uri), throwsFormatException, ); final large = value(); (large['pages'] as List).single['html'] = '汉' * 800000; expect( () => UndergraduatePageEvidence.decode(large, uri), throwsFormatException, ); expect( () => UndergraduatePageEvidence.decode({ ...value(), 'error': 'capture_limit', }, uri), throwsFormatException, ); }, ); }