From 799f94bb60becbe93686c6eae2ad37bcc6465534 Mon Sep 17 00:00:00 2001 From: "thomashii@dukefirehawk.com" Date: Sun, 8 Oct 2023 11:29:28 +0800 Subject: [PATCH] Updated logo --- README.md | 2 +- angel3_logo.svg | 148 ++++++++++++++++++ .../eventsource.zip | Bin logo.png => archived/logo.png | Bin logo3.png => archived/logo3.png | Bin {archived_packages => archived}/orm.zip | Bin {archived_packages => archived}/poll.zip | Bin {archived_packages => archived}/relations.zip | Bin {archived_packages => archived}/rethink.zip | Bin {archived_packages => archived}/seeder.zip | Bin {tool => archived/tool}/archived/move_repos | 0 .../tool}/archived/pull_subproject | 0 .../typed_service.zip | Bin {archived_packages => archived}/wings.zip | Bin logo3.xcf | Bin 24261 -> 0 bytes logo_icon_512.png | Bin 0 -> 22727 bytes packages/framework/lib/src/core/driver.dart | 2 + packages/oauth2/README.md | 4 +- packages/oauth2/example/example1.dart | 94 +++++++++++ packages/oauth2/lib/src/server.dart | 3 + packages/oauth2/pubspec.yaml | 3 +- packages/oauth2/test/device_code_test.dart | 17 +- packages/oauth2/test/pkce_test.dart | 3 +- 23 files changed, 268 insertions(+), 8 deletions(-) create mode 100644 angel3_logo.svg rename {archived_packages => archived}/eventsource.zip (100%) rename logo.png => archived/logo.png (100%) rename logo3.png => archived/logo3.png (100%) rename {archived_packages => archived}/orm.zip (100%) rename {archived_packages => archived}/poll.zip (100%) rename {archived_packages => archived}/relations.zip (100%) rename {archived_packages => archived}/rethink.zip (100%) rename {archived_packages => archived}/seeder.zip (100%) rename {tool => archived/tool}/archived/move_repos (100%) rename {tool => archived/tool}/archived/pull_subproject (100%) rename {archived_packages => archived}/typed_service.zip (100%) rename {archived_packages => archived}/wings.zip (100%) delete mode 100644 logo3.xcf create mode 100644 logo_icon_512.png create mode 100644 packages/oauth2/example/example1.dart diff --git a/README.md b/README.md index 6e51276b..71c7ba2f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Angel3 Framework -[![Angel3 Framework](./logo3.png)](https://github.com/dukefirehawk/angel) +[![Angel3 Framework](./angel3_logo.svg)](https://github.com/dukefirehawk/angel) ![Pub Version (including pre-releases)](https://img.shields.io/pub/v/angel3_framework?include_prereleases) [![Null Safety](https://img.shields.io/badge/null-safety-brightgreen)](https://dart.dev/null-safety) diff --git a/angel3_logo.svg b/angel3_logo.svg new file mode 100644 index 00000000..ea984e5f --- /dev/null +++ b/angel3_logo.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + A + 3 + + + diff --git a/archived_packages/eventsource.zip b/archived/eventsource.zip similarity index 100% rename from archived_packages/eventsource.zip rename to archived/eventsource.zip diff --git a/logo.png b/archived/logo.png similarity index 100% rename from logo.png rename to archived/logo.png diff --git a/logo3.png b/archived/logo3.png similarity index 100% rename from logo3.png rename to archived/logo3.png diff --git a/archived_packages/orm.zip b/archived/orm.zip similarity index 100% rename from archived_packages/orm.zip rename to archived/orm.zip diff --git a/archived_packages/poll.zip b/archived/poll.zip similarity index 100% rename from archived_packages/poll.zip rename to archived/poll.zip diff --git a/archived_packages/relations.zip b/archived/relations.zip similarity index 100% rename from archived_packages/relations.zip rename to archived/relations.zip diff --git a/archived_packages/rethink.zip b/archived/rethink.zip similarity index 100% rename from archived_packages/rethink.zip rename to archived/rethink.zip diff --git a/archived_packages/seeder.zip b/archived/seeder.zip similarity index 100% rename from archived_packages/seeder.zip rename to archived/seeder.zip diff --git a/tool/archived/move_repos b/archived/tool/archived/move_repos similarity index 100% rename from tool/archived/move_repos rename to archived/tool/archived/move_repos diff --git a/tool/archived/pull_subproject b/archived/tool/archived/pull_subproject similarity index 100% rename from tool/archived/pull_subproject rename to archived/tool/archived/pull_subproject diff --git a/archived_packages/typed_service.zip b/archived/typed_service.zip similarity index 100% rename from archived_packages/typed_service.zip rename to archived/typed_service.zip diff --git a/archived_packages/wings.zip b/archived/wings.zip similarity index 100% rename from archived_packages/wings.zip rename to archived/wings.zip diff --git a/logo3.xcf b/logo3.xcf deleted file mode 100644 index abff3b69f8c1853b825e925f131261d2ca6f8b61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24261 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 literal 0 HcmV?d00001 diff --git a/packages/framework/lib/src/core/driver.dart b/packages/framework/lib/src/core/driver.dart index fb328f4e..47e5e982 100644 --- a/packages/framework/lib/src/core/driver.dart +++ b/packages/framework/lib/src/core/driver.dart @@ -108,6 +108,8 @@ abstract class Driver< /// Handles a single request. Future handleRawRequest(Request request, Response response) { + app.logger.info('[Server] Called handleRawRequest'); + return createRequestContext(request, response).then((req) { return createResponseContext(request, response, req).then((res) { Future handle() { diff --git a/packages/oauth2/README.md b/packages/oauth2/README.md index ec243fda..4e16a747 100644 --- a/packages/oauth2/README.md +++ b/packages/oauth2/README.md @@ -20,8 +20,8 @@ In your `pubspec.yaml`: ```yaml dependencies: - angel3_framework: ^6.0.0 - angel3_oauth2: ^6.0.0 + angel3_framework: ^8.0.0 + angel3_oauth2: ^8.0.0 ``` ## Usage diff --git a/packages/oauth2/example/example1.dart b/packages/oauth2/example/example1.dart new file mode 100644 index 00000000..84142a73 --- /dev/null +++ b/packages/oauth2/example/example1.dart @@ -0,0 +1,94 @@ +import 'dart:async'; + +import 'package:angel3_container/mirrors.dart'; +import 'package:angel3_framework/angel3_framework.dart'; +import 'package:angel3_oauth2/angel3_oauth2.dart'; +import 'package:logging/logging.dart'; + +import '../test/common.dart'; + +void main() { + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((record) { + print( + '${record.time} ${record.level.name.padLeft(6, ' ')} [${record.loggerName}] : ${record.message}'); + if (record.error != null) print(record.error); + if (record.stackTrace != null) print(record.stackTrace); + }); + + // Declae the function + void setUp() async { + var app = Angel(reflector: MirrorsReflector()); + var oauth2 = _AuthorizationServer(); + + app.group('/oauth2', (router) { + router + ..get('/authorize', oauth2.authorizationEndpoint) + ..post('/token', oauth2.tokenEndpoint); + }); + + //app.logger.level = Level.ALL; + app.logger = Logger("oauth2") + ..onRecord.listen((rec) { + print(rec); + if (rec.error != null) print(rec.error); + if (rec.stackTrace != null) print(rec.stackTrace); + }); + + app.errorHandler = (e, req, res) async { + res.json(e.toJson()); + }; + } + + setUp(); +} + +class _AuthorizationServer + extends AuthorizationServer { + var logger = Logger('AuthorizationServer'); + + @override + PseudoApplication? findClient(String? clientId) { + return clientId == pseudoApplication.id ? pseudoApplication : null; + } + + @override + Future verifyClient( + PseudoApplication client, String? clientSecret) async { + return client.secret == clientSecret; + } + + @override + FutureOr requestDeviceCode(PseudoApplication client, + Iterable scopes, RequestContext req, ResponseContext res) { + return DeviceCodeResponse( + 'foo', + 'bar', + Uri.parse('https://regiostech.com') + .replace(queryParameters: {'scopes': scopes.join(',')}), + 3600); + } + + @override + FutureOr exchangeDeviceCodeForToken( + PseudoApplication client, + String? deviceCode, + String state, + RequestContext req, + ResponseContext res) { + print("[Server] exchangeDeviceCodeForToken"); + print("[Server] $deviceCode"); + print("[Server] $client"); + + if (deviceCode == 'brute') { + print("[Server] Throws AuthorizationException"); + + throw AuthorizationException(ErrorResponse( + ErrorResponse.slowDown, + 'Ho, brother! Ho, whoa, whoa, whoa now! You got too much dip on your chip!', + state)); + } + + return AuthorizationTokenResponse('foo'); + } +} diff --git a/packages/oauth2/lib/src/server.dart b/packages/oauth2/lib/src/server.dart index 8bfa68ad..4bc643c1 100644 --- a/packages/oauth2/lib/src/server.dart +++ b/packages/oauth2/lib/src/server.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:convert'; import 'package:angel3_framework/angel3_framework.dart'; +import 'package:logging/logging.dart'; import 'exception.dart'; import 'pkce.dart'; import 'response.dart'; @@ -51,6 +52,8 @@ Future> _getScopes(RequestContext req, /// An OAuth2 authorization server, which issues access tokens to third parties. abstract class AuthorizationServer { + static Logger logger = Logger('AuthorizationServer'); + const AuthorizationServer(); static const String _internalServerError = diff --git a/packages/oauth2/pubspec.yaml b/packages/oauth2/pubspec.yaml index 61ef4e52..d9a80137 100644 --- a/packages/oauth2/pubspec.yaml +++ b/packages/oauth2/pubspec.yaml @@ -11,10 +11,11 @@ dependencies: angel3_http_exception: ^8.0.0 crypto: ^3.0.1 collection: ^1.17.0 + logging: ^1.2.0 dev_dependencies: angel3_validate: ^8.0.0 angel3_test: ^8.0.0 - logging: ^1.2.0 + angel3_container: ^8.0.0 oauth2: ^2.0.0 lints: ^2.1.0 test: ^1.24.0 diff --git a/packages/oauth2/test/device_code_test.dart b/packages/oauth2/test/device_code_test.dart index 62d9e388..a255afc2 100644 --- a/packages/oauth2/test/device_code_test.dart +++ b/packages/oauth2/test/device_code_test.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:angel3_container/mirrors.dart'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_test/angel3_test.dart'; import 'package:angel3_oauth2/angel3_oauth2.dart'; @@ -10,7 +11,7 @@ void main() { late TestClient client; setUp(() async { - var app = Angel(); + var app = Angel(reflector: MirrorsReflector()); var oauth2 = _AuthorizationServer(); app.group('/oauth2', (router) { @@ -19,7 +20,8 @@ void main() { ..post('/token', oauth2.tokenEndpoint); }); - app.logger = Logger('angel_oauth2') + //app.logger.level = Level.ALL; + app.logger = Logger("oauth2") ..onRecord.listen((rec) { print(rec); if (rec.error != null) print(rec.error); @@ -113,7 +115,8 @@ void main() { 'device_code': 'brute', }); - print(response.body); + print("[Client] ${response.headers}"); + print("[Client] ${response.body}"); expect( response, allOf( @@ -130,6 +133,8 @@ void main() { class _AuthorizationServer extends AuthorizationServer { + var logger = Logger('AuthorizationServer'); + @override PseudoApplication? findClient(String? clientId) { return clientId == pseudoApplication.id ? pseudoApplication : null; @@ -159,7 +164,13 @@ class _AuthorizationServer String state, RequestContext req, ResponseContext res) { + print("[Server] exchangeDeviceCodeForToken"); + print("[Server] $deviceCode"); + print("[Server] $client"); + if (deviceCode == 'brute') { + print("[Server] Throws AuthorizationException"); + throw AuthorizationException(ErrorResponse( ErrorResponse.slowDown, 'Ho, brother! Ho, whoa, whoa, whoa now! You got too much dip on your chip!', diff --git a/packages/oauth2/test/pkce_test.dart b/packages/oauth2/test/pkce_test.dart index 0b58cc3b..11e3905d 100644 --- a/packages/oauth2/test/pkce_test.dart +++ b/packages/oauth2/test/pkce_test.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:collection'; +import 'package:angel3_container/mirrors.dart'; import 'package:angel3_framework/angel3_framework.dart'; import 'package:angel3_framework/http.dart'; import 'package:angel3_oauth2/angel3_oauth2.dart'; @@ -14,7 +15,7 @@ void main() { late TestClient testClient; setUp(() async { - app = Angel(); + app = Angel(reflector: MirrorsReflector()); app.container.registerSingleton(AuthCodes()); var server = _Server();