Compare commits

...

2 commits

Author SHA1 Message Date
386f7fffd6
Working impl 2025-06-19 13:39:52 -04:00
93b6f180f6
working a bit 2025-06-19 13:03:18 -04:00
11 changed files with 110 additions and 63 deletions

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
.dart_tool/ .dart_tool/
.direnv .direnv
secret

10
.vscode/launch.json vendored
View file

@ -9,13 +9,15 @@
"program": "bin/matrixgate.dart", "program": "bin/matrixgate.dart",
"args": [ "args": [
"--homeserver", "--homeserver",
"foo", "https://matrix.federated.nexus",
"--jwtSecretFile", "--jwtSecretFile",
"foo", "secret",
"--issuer", "--issuer",
"http://localhost:8080", "http://localhost:8080/",
"--authorizeEndpoint", "--authorizeEndpoint",
"https://federated.nexus/login" "http://localhost:4321/login",
"--serviceDomain",
"federated.nexus"
], ],
"request": "launch", "request": "launch",
"type": "dart" "type": "dart"

View file

@ -1,13 +1,13 @@
# This file configures the static analysis results for your project (errors, # This file configures the static analysis results for your project (errors,
# warnings, and lints). # warnings, and lints).
# #
# This enables the 'recommended' set of lints from `package:lints`. # This enables the "recommended" set of lints from `package:lints`.
# This set helps identify many issues that may lead to problems when running # This set helps identify many issues that may lead to problems when running
# or consuming Dart code, and enforces writing Dart using a single, idiomatic # or consuming Dart code, and enforces writing Dart using a single, idiomatic
# style and format. # style and format.
# #
# If you want a smaller set of lints you can change this to specify # If you want a smaller set of lints you can change this to specify
# 'package:lints/core.yaml'. These are just the most critical lints # "package:lints/core.yaml". These are just the most critical lints
# (the recommended set includes the core lints). # (the recommended set includes the core lints).
# The core lints are also what is used by pub.dev for scoring packages. # The core lints are also what is used by pub.dev for scoring packages.

View file

@ -10,8 +10,9 @@ import "package:shelf_router/shelf_router.dart";
void main(List<String> argsRaw) async { void main(List<String> argsRaw) async {
final parser = ArgParser() final parser = ArgParser()
..addOption("socket", abbr: "s") ..addOption("socket", abbr: "s")
..addOption("address", abbr: "a", defaultsTo: "127.0.0.1") ..addOption("serviceDomain", abbr: "d")
..addOption("port", abbr: "p", defaultsTo: "8080") ..addOption("port", abbr: "p", defaultsTo: "8080")
..addOption("address", abbr: "a", defaultsTo: "127.0.0.1")
..addOption("issuer", abbr: "i", mandatory: true) ..addOption("issuer", abbr: "i", mandatory: true)
..addOption("homeserver", abbr: "h", mandatory: true) ..addOption("homeserver", abbr: "h", mandatory: true)
..addOption("jwtSecretFile", abbr: "j", mandatory: true) ..addOption("jwtSecretFile", abbr: "j", mandatory: true)
@ -33,7 +34,7 @@ void main(List<String> argsRaw) async {
"/.well-known/openid-configuration", "/.well-known/openid-configuration",
apiHelper.openidConfiguration, apiHelper.openidConfiguration,
) )
..get("/userInfo", apiHelper.userinfoHandler) ..get("/userinfo", apiHelper.userinfoHandler)
..get("/jwks.json", apiHelper.jwks) ..get("/jwks.json", apiHelper.jwks)
..post("/login", apiHelper.handleLogin) ..post("/login", apiHelper.handleLogin)
..post("/token", apiHelper.tokenHandler)) ..post("/token", apiHelper.tokenHandler))

View file

@ -21,9 +21,28 @@ class ApiHelper {
final password = data["password"]; final password = data["password"];
final redirectUri = data["redirect_uri"]; final redirectUri = data["redirect_uri"];
final state = data["state"] ?? ""; final state = data["state"] ?? "";
final clientId = data["client_id"];
final scope = data["scope"];
final nonce = data["nonce"];
if ([
username,
password,
redirectUri,
clientId,
nonce,
scope,
].any((f) => f == null)) {
return Response(400, body: "Missing required field(s)");
}
if (!Uri.parse(redirectUri!).host.endsWith(settings.serviceDomain)) {
return Response(403, body: "Redirect URI not allowed");
}
final loginRes = await http.post( final loginRes = await http.post(
Uri.https(settings.homeserver, "_matrix/client/v3/login"), Uri.parse("${settings.homeserver}/_matrix/client/v3/login"),
headers: {"Content-Type": "application/json"},
body: json.encode({ body: json.encode({
"type": "m.login.password", "type": "m.login.password",
"identifier": {"type": "m.id.user", "user": username}, "identifier": {"type": "m.id.user", "user": username},
@ -40,9 +59,8 @@ class ApiHelper {
final accessToken = loginData["access_token"]; final accessToken = loginData["access_token"];
final openidRes = await http.post( final openidRes = await http.post(
Uri.https( Uri.parse(
settings.homeserver, "${settings.homeserver}/_matrix/client/v3/user/${Uri.encodeComponent(userId)}/openid/request_token",
"_matrix/client/v3/user/$userId/openid/request",
), ),
headers: {"Authorization": "Bearer $accessToken"}, headers: {"Authorization": "Bearer $accessToken"},
); );
@ -58,9 +76,13 @@ class ApiHelper {
final code = base64Url.encode( final code = base64Url.encode(
List<int>.generate(16, (_) => DateTime.now().millisecond % 256), List<int>.generate(16, (_) => DateTime.now().millisecond % 256),
); );
ref ref
.read(AuthCodeController.provider.notifier) .read(AuthCodeController.provider.notifier)
.set(code, MatrixUser(userId: userId, matrixToken: openidToken)); .set(
code,
MatrixUser(userId: userId, matrixToken: openidToken, nonce: nonce!),
);
return Response.found("$redirectUri?code=$code&state=$state"); return Response.found("$redirectUri?code=$code&state=$state");
} }
@ -69,34 +91,38 @@ class ApiHelper {
final settings = ref.read(SettingsController.provider)!; final settings = ref.read(SettingsController.provider)!;
final body = Uri.splitQueryString(await request.readAsString()); final body = Uri.splitQueryString(await request.readAsString());
final code = body["code"]; final code = body["code"];
final clientId = body["client_id"];
if (code == null || clientId == null) {
return Response(400, body: "Missing code or client_id");
}
final codes = ref.read(AuthCodeController.provider); final codes = ref.read(AuthCodeController.provider);
if (!codes.containsKey(code)) {
if (code == null || !codes.containsKey(code)) {
return Response(400, body: "Invalid code"); return Response(400, body: "Invalid code");
} }
final user = codes[code]!; final user = codes[code]!;
ref.read(AuthCodeController.provider.notifier).remove(code); ref.read(AuthCodeController.provider.notifier).remove(code);
final secret = await File.fromUri(
Uri.file(settings.jwtSecretFile),
).readAsString();
final jwt = JWT( final jwt = JWT(
{ {
"nonce": user.nonce,
"exp": "exp":
DateTime.now().add(Duration(minutes: 10)).millisecondsSinceEpoch ~/ DateTime.now().add(Duration(days: 7)).millisecondsSinceEpoch ~/
1000, 1000,
"iat": DateTime.now().millisecondsSinceEpoch ~/ 1000, "iat": DateTime.now().millisecondsSinceEpoch ~/ 1000,
}, },
subject: user.userId, subject: user.userId,
issuer: ref.read(SettingsController.provider)!.issuer, issuer: settings.issuer,
audience: Audience([body["client_id"]!]), audience: Audience([clientId]),
); );
final token = jwt.sign( final token = jwt.sign(SecretKey(secret), algorithm: JWTAlgorithm.HS256);
SecretKey(
await File.fromUri(Uri.file(settings.jwtSecretFile)).readAsString(),
),
algorithm: JWTAlgorithm.HS256,
);
return Response.ok( return Response.ok(
json.encode({ json.encode({
@ -119,9 +145,8 @@ class ApiHelper {
final token = auth.substring(7); final token = auth.substring(7);
final matrixResp = await http.get( final matrixResp = await http.get(
Uri.https( Uri.parse(
ref.read(SettingsController.provider)!.homeserver, "${ref.read(SettingsController.provider)!.homeserver}/_matrix/federation/v1/openid/userinfo",
"_matrix/federation/v1/openid/userinfo",
), ),
headers: {"Authorization": "Bearer $token"}, headers: {"Authorization": "Bearer $token"},
); );
@ -133,10 +158,16 @@ class ApiHelper {
); );
} }
return Response.ok(matrixResp.body); return Response.ok(
matrixResp.body,
headers: {"content-type": "application/json"},
);
} }
Response jwks(_) => Response.ok(json.encode({"keys": []})); Response jwks(_) => Response.ok(
json.encode({"keys": []}),
headers: {"content-type": "application/json"},
);
Response openidConfiguration(_) { Response openidConfiguration(_) {
final settings = ref.read(SettingsController.provider)!; final settings = ref.read(SettingsController.provider)!;
@ -145,7 +176,7 @@ class ApiHelper {
"issuer": settings.issuer, "issuer": settings.issuer,
"authorization_endpoint": settings.authorizeEndpoint, "authorization_endpoint": settings.authorizeEndpoint,
"token_endpoint": "${settings.issuer}/token", "token_endpoint": "${settings.issuer}/token",
"userinfo_endpoint": "${settings.issuer}/userInfo", "userinfo_endpoint": "${settings.issuer}/userinfo",
"jwks_uri": "${settings.issuer}/jwks.json", "jwks_uri": "${settings.issuer}/jwks.json",
"response_types_supported": ["code"], "response_types_supported": ["code"],
"subject_types_supported": ["public"], "subject_types_supported": ["public"],

View file

@ -8,6 +8,7 @@ abstract class MatrixUser with _$MatrixUser {
const factory MatrixUser({ const factory MatrixUser({
required String userId, required String userId,
required String matrixToken, required String matrixToken,
required String nonce,
}) = _MatrixUser; }) = _MatrixUser;
factory MatrixUser.fromJson(Map<String, dynamic> json) => factory MatrixUser.fromJson(Map<String, dynamic> json) =>

View file

@ -4,7 +4,7 @@
// ignore_for_file: type=lint // ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'matrix_user.dart'; part of "matrix_user.dart";
// ************************************************************************** // **************************************************************************
// FreezedGenerator // FreezedGenerator
@ -16,11 +16,11 @@ T _$identity<T>(T value) => value;
/// @nodoc /// @nodoc
mixin _$MatrixUser { mixin _$MatrixUser {
String get userId; String get matrixToken; String get userId; String get matrixToken; String get nonce;
/// Create a copy of MatrixUser /// Create a copy of MatrixUser
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline') @pragma("vm:prefer-inline")
$MatrixUserCopyWith<MatrixUser> get copyWith => _$MatrixUserCopyWithImpl<MatrixUser>(this as MatrixUser, _$identity); $MatrixUserCopyWith<MatrixUser> get copyWith => _$MatrixUserCopyWithImpl<MatrixUser>(this as MatrixUser, _$identity);
/// Serializes this MatrixUser to a JSON map. /// Serializes this MatrixUser to a JSON map.
@ -29,16 +29,16 @@ $MatrixUserCopyWith<MatrixUser> get copyWith => _$MatrixUserCopyWithImpl<MatrixU
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is MatrixUser&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.matrixToken, matrixToken) || other.matrixToken == matrixToken)); return identical(this, other) || (other.runtimeType == runtimeType&&other is MatrixUser&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.matrixToken, matrixToken) || other.matrixToken == matrixToken)&&(identical(other.nonce, nonce) || other.nonce == nonce));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,userId,matrixToken); int get hashCode => Object.hash(runtimeType,userId,matrixToken,nonce);
@override @override
String toString() { String toString() {
return 'MatrixUser(userId: $userId, matrixToken: $matrixToken)'; return "MatrixUser(userId: $userId, matrixToken: $matrixToken, nonce: $nonce)";
} }
@ -49,7 +49,7 @@ abstract mixin class $MatrixUserCopyWith<$Res> {
factory $MatrixUserCopyWith(MatrixUser value, $Res Function(MatrixUser) _then) = _$MatrixUserCopyWithImpl; factory $MatrixUserCopyWith(MatrixUser value, $Res Function(MatrixUser) _then) = _$MatrixUserCopyWithImpl;
@useResult @useResult
$Res call({ $Res call({
String userId, String matrixToken String userId, String matrixToken, String nonce
}); });
@ -66,10 +66,11 @@ class _$MatrixUserCopyWithImpl<$Res>
/// Create a copy of MatrixUser /// Create a copy of MatrixUser
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? userId = null,Object? matrixToken = null,}) { @pragma("vm:prefer-inline") @override $Res call({Object? userId = null,Object? matrixToken = null,Object? nonce = null,}) {
return _then(_self.copyWith( return _then(_self.copyWith(
userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,matrixToken: null == matrixToken ? _self.matrixToken : matrixToken // ignore: cast_nullable_to_non_nullable as String,matrixToken: null == matrixToken ? _self.matrixToken : matrixToken // ignore: cast_nullable_to_non_nullable
as String,nonce: null == nonce ? _self.nonce : nonce // ignore: cast_nullable_to_non_nullable
as String, as String,
)); ));
} }
@ -81,16 +82,17 @@ as String,
@JsonSerializable() @JsonSerializable()
class _MatrixUser implements MatrixUser { class _MatrixUser implements MatrixUser {
const _MatrixUser({required this.userId, required this.matrixToken}); const _MatrixUser({required this.userId, required this.matrixToken, required this.nonce});
factory _MatrixUser.fromJson(Map<String, dynamic> json) => _$MatrixUserFromJson(json); factory _MatrixUser.fromJson(Map<String, dynamic> json) => _$MatrixUserFromJson(json);
@override final String userId; @override final String userId;
@override final String matrixToken; @override final String matrixToken;
@override final String nonce;
/// Create a copy of MatrixUser /// Create a copy of MatrixUser
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@override @JsonKey(includeFromJson: false, includeToJson: false) @override @JsonKey(includeFromJson: false, includeToJson: false)
@pragma('vm:prefer-inline') @pragma("vm:prefer-inline")
_$MatrixUserCopyWith<_MatrixUser> get copyWith => __$MatrixUserCopyWithImpl<_MatrixUser>(this, _$identity); _$MatrixUserCopyWith<_MatrixUser> get copyWith => __$MatrixUserCopyWithImpl<_MatrixUser>(this, _$identity);
@override @override
@ -100,16 +102,16 @@ Map<String, dynamic> toJson() {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _MatrixUser&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.matrixToken, matrixToken) || other.matrixToken == matrixToken)); return identical(this, other) || (other.runtimeType == runtimeType&&other is _MatrixUser&&(identical(other.userId, userId) || other.userId == userId)&&(identical(other.matrixToken, matrixToken) || other.matrixToken == matrixToken)&&(identical(other.nonce, nonce) || other.nonce == nonce));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,userId,matrixToken); int get hashCode => Object.hash(runtimeType,userId,matrixToken,nonce);
@override @override
String toString() { String toString() {
return 'MatrixUser(userId: $userId, matrixToken: $matrixToken)'; return "MatrixUser(userId: $userId, matrixToken: $matrixToken, nonce: $nonce)";
} }
@ -120,7 +122,7 @@ abstract mixin class _$MatrixUserCopyWith<$Res> implements $MatrixUserCopyWith<$
factory _$MatrixUserCopyWith(_MatrixUser value, $Res Function(_MatrixUser) _then) = __$MatrixUserCopyWithImpl; factory _$MatrixUserCopyWith(_MatrixUser value, $Res Function(_MatrixUser) _then) = __$MatrixUserCopyWithImpl;
@override @useResult @override @useResult
$Res call({ $Res call({
String userId, String matrixToken String userId, String matrixToken, String nonce
}); });
@ -137,10 +139,11 @@ class __$MatrixUserCopyWithImpl<$Res>
/// Create a copy of MatrixUser /// Create a copy of MatrixUser
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? userId = null,Object? matrixToken = null,}) { @override @pragma("vm:prefer-inline") $Res call({Object? userId = null,Object? matrixToken = null,Object? nonce = null,}) {
return _then(_MatrixUser( return _then(_MatrixUser(
userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable userId: null == userId ? _self.userId : userId // ignore: cast_nullable_to_non_nullable
as String,matrixToken: null == matrixToken ? _self.matrixToken : matrixToken // ignore: cast_nullable_to_non_nullable as String,matrixToken: null == matrixToken ? _self.matrixToken : matrixToken // ignore: cast_nullable_to_non_nullable
as String,nonce: null == nonce ? _self.nonce : nonce // ignore: cast_nullable_to_non_nullable
as String, as String,
)); ));
} }

View file

@ -1,18 +1,20 @@
// GENERATED CODE - DO NOT MODIFY BY HAND // GENERATED CODE - DO NOT MODIFY BY HAND
part of 'matrix_user.dart'; part of "matrix_user.dart";
// ************************************************************************** // **************************************************************************
// JsonSerializableGenerator // JsonSerializableGenerator
// ************************************************************************** // **************************************************************************
_MatrixUser _$MatrixUserFromJson(Map<String, dynamic> json) => _MatrixUser( _MatrixUser _$MatrixUserFromJson(Map<String, dynamic> json) => _MatrixUser(
userId: json['userId'] as String, userId: json["userId"] as String,
matrixToken: json['matrixToken'] as String, matrixToken: json["matrixToken"] as String,
nonce: json["nonce"] as String,
); );
Map<String, dynamic> _$MatrixUserToJson(_MatrixUser instance) => Map<String, dynamic> _$MatrixUserToJson(_MatrixUser instance) =>
<String, dynamic>{ <String, dynamic>{
'userId': instance.userId, "userId": instance.userId,
'matrixToken': instance.matrixToken, "matrixToken": instance.matrixToken,
"nonce": instance.nonce,
}; };

View file

@ -11,6 +11,7 @@ abstract class Settings with _$Settings {
required String port, required String port,
required String homeserver, required String homeserver,
required String issuer, required String issuer,
required String serviceDomain,
required String jwtSecretFile, required String jwtSecretFile,
required String authorizeEndpoint, required String authorizeEndpoint,
}) = _Settings; }) = _Settings;

View file

@ -16,7 +16,7 @@ T _$identity<T>(T value) => value;
/// @nodoc /// @nodoc
mixin _$Settings { mixin _$Settings {
String? get socket; String get address; String get port; String get homeserver; String get issuer; String get jwtSecretFile; String get authorizeEndpoint; String? get socket; String get address; String get port; String get homeserver; String get issuer; String get serviceDomain; String get jwtSecretFile; String get authorizeEndpoint;
/// Create a copy of Settings /// Create a copy of Settings
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@ -29,16 +29,16 @@ $SettingsCopyWith<Settings> get copyWith => _$SettingsCopyWithImpl<Settings>(thi
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.address, address) || other.address == address)&&(identical(other.port, port) || other.port == port)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.issuer, issuer) || other.issuer == issuer)&&(identical(other.jwtSecretFile, jwtSecretFile) || other.jwtSecretFile == jwtSecretFile)&&(identical(other.authorizeEndpoint, authorizeEndpoint) || other.authorizeEndpoint == authorizeEndpoint)); return identical(this, other) || (other.runtimeType == runtimeType&&other is Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.address, address) || other.address == address)&&(identical(other.port, port) || other.port == port)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.issuer, issuer) || other.issuer == issuer)&&(identical(other.serviceDomain, serviceDomain) || other.serviceDomain == serviceDomain)&&(identical(other.jwtSecretFile, jwtSecretFile) || other.jwtSecretFile == jwtSecretFile)&&(identical(other.authorizeEndpoint, authorizeEndpoint) || other.authorizeEndpoint == authorizeEndpoint));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,socket,address,port,homeserver,issuer,jwtSecretFile,authorizeEndpoint); int get hashCode => Object.hash(runtimeType,socket,address,port,homeserver,issuer,serviceDomain,jwtSecretFile,authorizeEndpoint);
@override @override
String toString() { String toString() {
return 'Settings(socket: $socket, address: $address, port: $port, homeserver: $homeserver, issuer: $issuer, jwtSecretFile: $jwtSecretFile, authorizeEndpoint: $authorizeEndpoint)'; return 'Settings(socket: $socket, address: $address, port: $port, homeserver: $homeserver, issuer: $issuer, serviceDomain: $serviceDomain, jwtSecretFile: $jwtSecretFile, authorizeEndpoint: $authorizeEndpoint)';
} }
@ -49,7 +49,7 @@ abstract mixin class $SettingsCopyWith<$Res> {
factory $SettingsCopyWith(Settings value, $Res Function(Settings) _then) = _$SettingsCopyWithImpl; factory $SettingsCopyWith(Settings value, $Res Function(Settings) _then) = _$SettingsCopyWithImpl;
@useResult @useResult
$Res call({ $Res call({
String? socket, String address, String port, String homeserver, String issuer, String jwtSecretFile, String authorizeEndpoint String? socket, String address, String port, String homeserver, String issuer, String serviceDomain, String jwtSecretFile, String authorizeEndpoint
}); });
@ -66,13 +66,14 @@ class _$SettingsCopyWithImpl<$Res>
/// Create a copy of Settings /// Create a copy of Settings
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @override $Res call({Object? socket = freezed,Object? address = null,Object? port = null,Object? homeserver = null,Object? issuer = null,Object? jwtSecretFile = null,Object? authorizeEndpoint = null,}) { @pragma('vm:prefer-inline') @override $Res call({Object? socket = freezed,Object? address = null,Object? port = null,Object? homeserver = null,Object? issuer = null,Object? serviceDomain = null,Object? jwtSecretFile = null,Object? authorizeEndpoint = null,}) {
return _then(_self.copyWith( return _then(_self.copyWith(
socket: freezed == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable socket: freezed == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable
as String?,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as String?,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable
as String,port: null == port ? _self.port : port // ignore: cast_nullable_to_non_nullable as String,port: null == port ? _self.port : port // ignore: cast_nullable_to_non_nullable
as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable
as String,issuer: null == issuer ? _self.issuer : issuer // ignore: cast_nullable_to_non_nullable as String,issuer: null == issuer ? _self.issuer : issuer // ignore: cast_nullable_to_non_nullable
as String,serviceDomain: null == serviceDomain ? _self.serviceDomain : serviceDomain // ignore: cast_nullable_to_non_nullable
as String,jwtSecretFile: null == jwtSecretFile ? _self.jwtSecretFile : jwtSecretFile // ignore: cast_nullable_to_non_nullable as String,jwtSecretFile: null == jwtSecretFile ? _self.jwtSecretFile : jwtSecretFile // ignore: cast_nullable_to_non_nullable
as String,authorizeEndpoint: null == authorizeEndpoint ? _self.authorizeEndpoint : authorizeEndpoint // ignore: cast_nullable_to_non_nullable as String,authorizeEndpoint: null == authorizeEndpoint ? _self.authorizeEndpoint : authorizeEndpoint // ignore: cast_nullable_to_non_nullable
as String, as String,
@ -86,7 +87,7 @@ as String,
@JsonSerializable() @JsonSerializable()
class _Settings implements Settings { class _Settings implements Settings {
const _Settings({required this.socket, required this.address, required this.port, required this.homeserver, required this.issuer, required this.jwtSecretFile, required this.authorizeEndpoint}); const _Settings({required this.socket, required this.address, required this.port, required this.homeserver, required this.issuer, required this.serviceDomain, required this.jwtSecretFile, required this.authorizeEndpoint});
factory _Settings.fromJson(Map<String, dynamic> json) => _$SettingsFromJson(json); factory _Settings.fromJson(Map<String, dynamic> json) => _$SettingsFromJson(json);
@override final String? socket; @override final String? socket;
@ -94,6 +95,7 @@ class _Settings implements Settings {
@override final String port; @override final String port;
@override final String homeserver; @override final String homeserver;
@override final String issuer; @override final String issuer;
@override final String serviceDomain;
@override final String jwtSecretFile; @override final String jwtSecretFile;
@override final String authorizeEndpoint; @override final String authorizeEndpoint;
@ -110,16 +112,16 @@ Map<String, dynamic> toJson() {
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return identical(this, other) || (other.runtimeType == runtimeType&&other is _Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.address, address) || other.address == address)&&(identical(other.port, port) || other.port == port)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.issuer, issuer) || other.issuer == issuer)&&(identical(other.jwtSecretFile, jwtSecretFile) || other.jwtSecretFile == jwtSecretFile)&&(identical(other.authorizeEndpoint, authorizeEndpoint) || other.authorizeEndpoint == authorizeEndpoint)); return identical(this, other) || (other.runtimeType == runtimeType&&other is _Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.address, address) || other.address == address)&&(identical(other.port, port) || other.port == port)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.issuer, issuer) || other.issuer == issuer)&&(identical(other.serviceDomain, serviceDomain) || other.serviceDomain == serviceDomain)&&(identical(other.jwtSecretFile, jwtSecretFile) || other.jwtSecretFile == jwtSecretFile)&&(identical(other.authorizeEndpoint, authorizeEndpoint) || other.authorizeEndpoint == authorizeEndpoint));
} }
@JsonKey(includeFromJson: false, includeToJson: false) @JsonKey(includeFromJson: false, includeToJson: false)
@override @override
int get hashCode => Object.hash(runtimeType,socket,address,port,homeserver,issuer,jwtSecretFile,authorizeEndpoint); int get hashCode => Object.hash(runtimeType,socket,address,port,homeserver,issuer,serviceDomain,jwtSecretFile,authorizeEndpoint);
@override @override
String toString() { String toString() {
return 'Settings(socket: $socket, address: $address, port: $port, homeserver: $homeserver, issuer: $issuer, jwtSecretFile: $jwtSecretFile, authorizeEndpoint: $authorizeEndpoint)'; return 'Settings(socket: $socket, address: $address, port: $port, homeserver: $homeserver, issuer: $issuer, serviceDomain: $serviceDomain, jwtSecretFile: $jwtSecretFile, authorizeEndpoint: $authorizeEndpoint)';
} }
@ -130,7 +132,7 @@ abstract mixin class _$SettingsCopyWith<$Res> implements $SettingsCopyWith<$Res>
factory _$SettingsCopyWith(_Settings value, $Res Function(_Settings) _then) = __$SettingsCopyWithImpl; factory _$SettingsCopyWith(_Settings value, $Res Function(_Settings) _then) = __$SettingsCopyWithImpl;
@override @useResult @override @useResult
$Res call({ $Res call({
String? socket, String address, String port, String homeserver, String issuer, String jwtSecretFile, String authorizeEndpoint String? socket, String address, String port, String homeserver, String issuer, String serviceDomain, String jwtSecretFile, String authorizeEndpoint
}); });
@ -147,13 +149,14 @@ class __$SettingsCopyWithImpl<$Res>
/// Create a copy of Settings /// Create a copy of Settings
/// with the given fields replaced by the non-null parameter values. /// with the given fields replaced by the non-null parameter values.
@override @pragma('vm:prefer-inline') $Res call({Object? socket = freezed,Object? address = null,Object? port = null,Object? homeserver = null,Object? issuer = null,Object? jwtSecretFile = null,Object? authorizeEndpoint = null,}) { @override @pragma('vm:prefer-inline') $Res call({Object? socket = freezed,Object? address = null,Object? port = null,Object? homeserver = null,Object? issuer = null,Object? serviceDomain = null,Object? jwtSecretFile = null,Object? authorizeEndpoint = null,}) {
return _then(_Settings( return _then(_Settings(
socket: freezed == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable socket: freezed == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable
as String?,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable as String?,address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable
as String,port: null == port ? _self.port : port // ignore: cast_nullable_to_non_nullable as String,port: null == port ? _self.port : port // ignore: cast_nullable_to_non_nullable
as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable
as String,issuer: null == issuer ? _self.issuer : issuer // ignore: cast_nullable_to_non_nullable as String,issuer: null == issuer ? _self.issuer : issuer // ignore: cast_nullable_to_non_nullable
as String,serviceDomain: null == serviceDomain ? _self.serviceDomain : serviceDomain // ignore: cast_nullable_to_non_nullable
as String,jwtSecretFile: null == jwtSecretFile ? _self.jwtSecretFile : jwtSecretFile // ignore: cast_nullable_to_non_nullable as String,jwtSecretFile: null == jwtSecretFile ? _self.jwtSecretFile : jwtSecretFile // ignore: cast_nullable_to_non_nullable
as String,authorizeEndpoint: null == authorizeEndpoint ? _self.authorizeEndpoint : authorizeEndpoint // ignore: cast_nullable_to_non_nullable as String,authorizeEndpoint: null == authorizeEndpoint ? _self.authorizeEndpoint : authorizeEndpoint // ignore: cast_nullable_to_non_nullable
as String, as String,

View file

@ -12,6 +12,7 @@ _Settings _$SettingsFromJson(Map<String, dynamic> json) => _Settings(
port: json['port'] as String, port: json['port'] as String,
homeserver: json['homeserver'] as String, homeserver: json['homeserver'] as String,
issuer: json['issuer'] as String, issuer: json['issuer'] as String,
serviceDomain: json['serviceDomain'] as String,
jwtSecretFile: json['jwtSecretFile'] as String, jwtSecretFile: json['jwtSecretFile'] as String,
authorizeEndpoint: json['authorizeEndpoint'] as String, authorizeEndpoint: json['authorizeEndpoint'] as String,
); );
@ -22,6 +23,7 @@ Map<String, dynamic> _$SettingsToJson(_Settings instance) => <String, dynamic>{
'port': instance.port, 'port': instance.port,
'homeserver': instance.homeserver, 'homeserver': instance.homeserver,
'issuer': instance.issuer, 'issuer': instance.issuer,
'serviceDomain': instance.serviceDomain,
'jwtSecretFile': instance.jwtSecretFile, 'jwtSecretFile': instance.jwtSecretFile,
'authorizeEndpoint': instance.authorizeEndpoint, 'authorizeEndpoint': instance.authorizeEndpoint,
}; };