Skip to content

Commit addca36

Browse files
authored
Merge pull request #50 from namib-project/refactor-security-scheme-deserialization
refactor!: rework deserialization of security schemes
2 parents a817508 + 617e064 commit addca36

12 files changed

+219
-210
lines changed

lib/src/definitions/extensions/json_parser.dart

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@ import '../interaction_affordances/event.dart';
99
import '../interaction_affordances/interaction_affordance.dart';
1010
import '../interaction_affordances/property.dart';
1111
import '../link.dart';
12+
import '../security/ace_security_scheme.dart';
13+
import '../security/apikey_security_scheme.dart';
14+
import '../security/auto_security_scheme.dart';
15+
import '../security/basic_security_scheme.dart';
16+
import '../security/bearer_security_scheme.dart';
17+
import '../security/combo_security_scheme.dart';
18+
import '../security/digest_security_scheme.dart';
19+
import '../security/no_security_scheme.dart';
20+
import '../security/oauth2_security_scheme.dart';
21+
import '../security/psk_security_scheme.dart';
1222
import '../security/security_scheme.dart';
1323
import '../thing_description.dart';
1424
import '../validation/validation_exception.dart';
@@ -312,7 +322,7 @@ extension ParseField on Map<String, dynamic> {
312322
/// defined.
313323
Map<String, SecurityScheme>? parseSecurityDefinitions(
314324
PrefixMapping prefixMapping,
315-
Set<String>? parsedFields,
325+
Set<String> parsedFields,
316326
) {
317327
final fieldValue =
318328
parseMapField<dynamic>('securityDefinitions', parsedFields);
@@ -326,7 +336,7 @@ extension ParseField on Map<String, dynamic> {
326336
for (final securityDefinition in fieldValue.entries) {
327337
final dynamic value = securityDefinition.value;
328338
if (value is Map<String, dynamic>) {
329-
final securityScheme = SecurityScheme.fromJson(value, prefixMapping);
339+
final securityScheme = value._parseSecurityScheme(prefixMapping, {});
330340
if (securityScheme != null) {
331341
result[securityDefinition.key] = securityScheme;
332342
}
@@ -336,6 +346,38 @@ extension ParseField on Map<String, dynamic> {
336346
return result;
337347
}
338348

349+
SecurityScheme? _parseSecurityScheme(
350+
PrefixMapping prefixMapping,
351+
Set<String> parsedFields,
352+
) {
353+
final scheme = parseRequiredField('scheme', parsedFields);
354+
355+
switch (scheme) {
356+
case 'auto':
357+
return AutoSecurityScheme.fromJson(this, prefixMapping, parsedFields);
358+
case 'basic':
359+
return BasicSecurityScheme.fromJson(this, prefixMapping, parsedFields);
360+
case 'bearer':
361+
return BearerSecurityScheme.fromJson(this, prefixMapping, parsedFields);
362+
case 'combo':
363+
return ComboSecurityScheme.fromJson(this, prefixMapping, parsedFields);
364+
case 'nosec':
365+
return NoSecurityScheme.fromJson(this, prefixMapping, parsedFields);
366+
case 'psk':
367+
return PskSecurityScheme.fromJson(this, prefixMapping, parsedFields);
368+
case 'digest':
369+
return DigestSecurityScheme.fromJson(this, prefixMapping, parsedFields);
370+
case 'apikey':
371+
return ApiKeySecurityScheme.fromJson(this, prefixMapping, parsedFields);
372+
case 'oauth2':
373+
return OAuth2SecurityScheme.fromJson(this, prefixMapping, parsedFields);
374+
case 'ace:ACESecurityScheme':
375+
return AceSecurityScheme.fromJson(this, prefixMapping, parsedFields);
376+
}
377+
378+
return null;
379+
}
380+
339381
/// Parses [Property]s contained in this JSON object.
340382
///
341383
/// Adds the key `properties` to the set of [parsedFields], if defined.

lib/src/definitions/security/ace_security_scheme.dart

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,50 +10,53 @@ import '../extensions/json_parser.dart';
1010

1111
import 'security_scheme.dart';
1212

13+
const _schemeName = 'ace:ACESecurityScheme';
14+
1315
/// Experimental ACE Security Scheme.
1416
class AceSecurityScheme extends SecurityScheme {
1517
/// Constructor.
1618
AceSecurityScheme({
17-
String? description,
1819
this.as,
1920
this.audience,
2021
this.scopes,
2122
this.cnonce,
22-
Map<String, String>? descriptions,
23-
}) : super('ace:ACESecurityScheme') {
24-
this.description = description;
25-
this.descriptions.addAll(descriptions ?? {});
26-
}
23+
super.description,
24+
super.descriptions,
25+
super.proxy,
26+
super.jsonLdType,
27+
super.additionalFields,
28+
}) : super(_schemeName);
2729

2830
/// Creates an [AceSecurityScheme] from a [json] object.
2931
AceSecurityScheme.fromJson(
3032
Map<String, dynamic> json,
3133
PrefixMapping prefixMapping,
32-
) : super('ace:ACESecurityScheme') {
33-
final Set<String> parsedFields = {};
34-
35-
as = json.parseField<String>('ace:as', parsedFields);
36-
cnonce = json.parseField<bool>('ace:cnonce', parsedFields);
37-
audience = json.parseField<String>('ace:audience', parsedFields);
38-
scopes = json.parseArrayField<String>('ace:scopes', parsedFields);
39-
40-
parseSecurityJson(json, parsedFields, prefixMapping);
41-
}
34+
Set<String> parsedFields,
35+
) : as = json.parseField<String>('ace:as', parsedFields),
36+
cnonce = json.parseField<bool>('ace:cnonce', parsedFields),
37+
audience = json.parseField<String>('ace:audience', parsedFields),
38+
scopes = json.parseArrayField<String>('ace:scopes', parsedFields),
39+
super.fromJson(
40+
_schemeName,
41+
json,
42+
prefixMapping,
43+
parsedFields,
44+
);
4245

4346
/// URI of the authorization server.
44-
String? as;
47+
final String? as;
4548

4649
/// The intended audience for this [AceSecurityScheme].
47-
String? audience;
50+
final String? audience;
4851

4952
/// Set of authorization scope identifiers provided as an array.
5053
///
5154
/// These are provided in tokens returned by an authorization server and
5255
/// associated with forms in order to identify what resources a client may
5356
/// access and how. The values associated with a form should be chosen from
5457
/// those defined in an [AceSecurityScheme] active on that form.
55-
List<String>? scopes;
58+
final List<String>? scopes;
5659

5760
/// Indicates whether a [cnonce] is required by the Resource Server.
58-
bool? cnonce;
61+
final bool? cnonce;
5962
}

lib/src/definitions/security/apikey_security_scheme.dart

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,40 @@ import '../extensions/json_parser.dart';
1010
import 'security_scheme.dart';
1111

1212
const _defaultInValue = 'query';
13+
const _schemeName = 'apikey';
1314

1415
/// API key authentication security configuration identified by the Vocabulary
1516
/// Term `apikey`.
1617
class ApiKeySecurityScheme extends SecurityScheme {
1718
/// Constructor.
1819
ApiKeySecurityScheme({
19-
super.description,
20-
super.proxy,
2120
this.name,
22-
String? in_,
21+
this.in_ = _defaultInValue,
22+
super.description,
2323
super.descriptions,
24-
}) : in_ = in_ ?? _defaultInValue,
25-
super('apikey');
24+
super.proxy,
25+
super.jsonLdType,
26+
super.additionalFields,
27+
}) : super(_schemeName);
2628

2729
/// Creates a [ApiKeySecurityScheme] from a [json] object.
30+
2831
ApiKeySecurityScheme.fromJson(
2932
Map<String, dynamic> json,
3033
PrefixMapping prefixMapping,
31-
) : super('apikey') {
32-
final Set<String> parsedFields = {};
33-
34-
name = json.parseField<String>('name', parsedFields);
35-
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue;
36-
37-
parseSecurityJson(json, parsedFields, prefixMapping);
38-
}
34+
Set<String> parsedFields,
35+
) : name = json.parseField<String>('name', parsedFields),
36+
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue,
37+
super.fromJson(
38+
_schemeName,
39+
json,
40+
prefixMapping,
41+
parsedFields,
42+
);
3943

4044
/// Name for query, header, cookie, or uri parameters.
4145
String? name;
4246

4347
/// Specifies the location of security authentication information.
44-
late String in_;
48+
final String in_;
4549
}

lib/src/definitions/security/auto_security_scheme.dart

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,24 @@ import 'package:curie/curie.dart';
88

99
import 'security_scheme.dart';
1010

11+
const _schemeName = 'auto';
12+
1113
/// An automatic security configuration identified by the
1214
/// vocabulary term `auto`.
1315
class AutoSecurityScheme extends SecurityScheme {
16+
/// Constructor.
17+
AutoSecurityScheme({
18+
super.description,
19+
super.descriptions,
20+
super.proxy,
21+
super.jsonLdType,
22+
super.additionalFields,
23+
}) : super(_schemeName);
24+
1425
/// Creates an [AutoSecurityScheme] from a [json] object.
1526
AutoSecurityScheme.fromJson(
1627
Map<String, dynamic> json,
1728
PrefixMapping prefixMapping,
18-
) : super('auto') {
19-
parseSecurityJson(json, {}, prefixMapping);
20-
}
29+
Set<String> parsedFields,
30+
) : super.fromJson(_schemeName, json, prefixMapping, parsedFields);
2131
}

lib/src/definitions/security/basic_security_scheme.dart

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,34 @@ import 'security_scheme.dart';
1111

1212
const _defaultInValue = 'header';
1313

14+
const _schemeName = 'basic';
15+
1416
/// Basic Authentication security configuration identified by the Vocabulary
1517
/// Term `basic`.
1618
class BasicSecurityScheme extends SecurityScheme {
1719
/// Constructor.
1820
BasicSecurityScheme({
19-
super.description,
20-
super.proxy,
2121
this.name,
22-
String? in_,
22+
this.in_ = _defaultInValue,
23+
super.description,
2324
super.descriptions,
24-
}) : in_ = in_ ?? _defaultInValue,
25-
super('basic');
25+
super.proxy,
26+
super.jsonLdType,
27+
super.additionalFields,
28+
}) : super(_schemeName);
2629

2730
/// Creates a [BasicSecurityScheme] from a [json] object.
2831
BasicSecurityScheme.fromJson(
2932
Map<String, dynamic> json,
3033
PrefixMapping prefixMapping,
31-
) : super('basic') {
32-
final Set<String> parsedFields = {};
33-
34-
name = json.parseField<String>('name', parsedFields);
35-
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue;
36-
37-
parseSecurityJson(json, parsedFields, prefixMapping);
38-
}
34+
Set<String> parsedFields,
35+
) : name = json.parseField<String>('name', parsedFields),
36+
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue,
37+
super.fromJson(_schemeName, json, prefixMapping, parsedFields);
3938

4039
/// Name for query, header, cookie, or uri parameters.
41-
late final String? name;
40+
final String? name;
4241

4342
/// Specifies the location of security authentication information.
44-
late String in_ = 'header';
43+
final String in_;
4544
}

lib/src/definitions/security/bearer_security_scheme.dart

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,53 +13,50 @@ const _defaultInValue = 'header';
1313
const _defaultAlgValue = 'ES256';
1414
const _defaultFormatValue = 'jwt';
1515

16+
const _schemeName = 'bearer';
17+
1618
/// Bearer Token security configuration identified by the Vocabulary Term
1719
/// `bearer`.
1820
class BearerSecurityScheme extends SecurityScheme {
1921
/// Constructor.
2022
BearerSecurityScheme({
2123
this.name,
22-
String? alg,
23-
String? format,
24+
this.alg = _defaultAlgValue,
25+
this.format = _defaultFormatValue,
2426
this.authorization,
25-
String? in_,
26-
super.proxy,
27+
this.in_ = _defaultInValue,
2728
super.description,
2829
super.descriptions,
29-
}) : in_ = in_ ?? _defaultInValue,
30-
alg = alg ?? _defaultAlgValue,
31-
format = format ?? _defaultFormatValue,
32-
super('bearer');
30+
super.proxy,
31+
super.jsonLdType,
32+
super.additionalFields,
33+
}) : super(_schemeName);
3334

3435
/// Creates a [BearerSecurityScheme] from a [json] object.
3536
BearerSecurityScheme.fromJson(
3637
Map<String, dynamic> json,
3738
PrefixMapping prefixMapping,
38-
) : super('bearer') {
39-
final Set<String> parsedFields = {};
40-
41-
name = json.parseField<String>('name', parsedFields);
42-
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue;
43-
format =
44-
json.parseField<String>('format', parsedFields) ?? _defaultFormatValue;
45-
alg = json.parseField<String>('alg', parsedFields) ?? _defaultAlgValue;
46-
authorization = json.parseField<String>('authorization', parsedFields);
47-
48-
parseSecurityJson(json, parsedFields, prefixMapping);
49-
}
39+
Set<String> parsedFields,
40+
) : name = json.parseField<String>('name', parsedFields),
41+
in_ = json.parseField<String>('in', parsedFields) ?? _defaultInValue,
42+
format = json.parseField<String>('format', parsedFields) ??
43+
_defaultFormatValue,
44+
alg = json.parseField<String>('alg', parsedFields) ?? _defaultAlgValue,
45+
authorization = json.parseField<String>('authorization', parsedFields),
46+
super.fromJson(_schemeName, json, prefixMapping, parsedFields);
5047

5148
/// URI of the authorization server.
52-
late final String? authorization;
49+
final String? authorization;
5350

5451
/// Name for query, header, cookie, or uri parameters.
55-
late final String? name;
52+
final String? name;
5653

5754
/// Encoding, encryption, or digest algorithm.
58-
late final String alg;
55+
final String alg;
5956

6057
/// Specifies format of security authentication information.
61-
late final String format;
58+
final String format;
6259

6360
/// Specifies the location of security authentication information.
64-
late final String in_;
61+
final String in_;
6562
}

lib/src/definitions/security/combo_security_scheme.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class ComboSecurityScheme extends SecurityScheme {
2121
super.description,
2222
super.descriptions,
2323
super.proxy,
24+
super.jsonLdType,
25+
super.additionalFields,
2426
}) : super(_schemeName);
2527

2628
/// Creates a [ComboSecurityScheme] from a [json] object.
@@ -30,9 +32,7 @@ class ComboSecurityScheme extends SecurityScheme {
3032
Set<String> parsedFields,
3133
) : oneOf = json.parseArrayField<String>('oneOf', parsedFields),
3234
allOf = json.parseArrayField<String>('allOf', parsedFields),
33-
super(_schemeName) {
34-
parseSecurityJson(json, parsedFields, prefixMapping);
35-
}
35+
super.fromJson(_schemeName, json, prefixMapping, parsedFields);
3636

3737
/// Array of two or more strings identifying other named security scheme
3838
/// definitions, any one of which, when satisfied, will allow access.

0 commit comments

Comments
 (0)