import "dart:io"; import "package:args/args.dart"; import "package:matrixoidc/controllers/settings_controller.dart"; import "package:matrixoidc/helpers/api_helper.dart"; import "package:riverpod/riverpod.dart"; import "package:shelf/shelf.dart"; import "package:shelf/shelf_io.dart"; import "package:shelf_router/shelf_router.dart"; void main(List argsRaw) async { final parser = ArgParser() ..addOption("socket", abbr: "s") ..addOption("serviceDomain", abbr: "d") ..addOption("port", abbr: "p", defaultsTo: "8080") ..addOption("address", abbr: "a", defaultsTo: "127.0.0.1") ..addOption("issuer", abbr: "i", mandatory: true) ..addOption("homeserver", abbr: "h", mandatory: true) ..addOption("jwtSecretFile", abbr: "j", mandatory: true) ..addOption("authorizeEndpoint", abbr: "e", mandatory: true); final container = ProviderContainer(); container .read(SettingsController.provider.notifier) .set(parser.parse(argsRaw)); final apiHelper = container.read(ApiHelper.provider); final handler = const Pipeline() .addMiddleware(logRequests()) .addHandler( (Router() ..get( "/.well-known/openid-configuration", apiHelper.openidConfiguration, ) ..get("/userinfo", apiHelper.userinfoHandler) ..get("/jwks.json", apiHelper.jwks) ..post("/login", apiHelper.handleLogin) ..post("/token", apiHelper.tokenHandler)) .call, ); final args = container.read(SettingsController.provider)!; final server = HttpServer.listenOn( await ServerSocket.bind( InternetAddress( args.socket ?? args.address, type: args.socket == null ? InternetAddressType.any : InternetAddressType.unix, ), int.parse(args.port), ), ); serveRequests(server, handler); print("OIDC provider listening at ${server.address.address}:${server.port}"); }