Skip to content

Commit

Permalink
feat: add DigestSecurityScheme and Credentials
Browse files Browse the repository at this point in the history
  • Loading branch information
JKRhb committed Feb 3, 2022
1 parent c33f248 commit ef85dd7
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/definitions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
export 'src/definitions/credentials/basic_credentials.dart';
export 'src/definitions/credentials/credentials.dart';
export 'src/definitions/credentials/digest_credentials.dart';
export 'src/definitions/credentials/psk_credentials.dart';
export 'src/definitions/thing_description.dart';
export 'src/definitions/thing_model.dart';
6 changes: 6 additions & 0 deletions lib/src/core/consumed_thing.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import '../../scripting_api.dart' as scripting_api;
import '../../scripting_api.dart' hide ConsumedThing, InteractionOutput;
import '../definitions/credentials/basic_credentials.dart';
import '../definitions/credentials/credentials.dart';
import '../definitions/credentials/digest_credentials.dart';
import '../definitions/credentials/psk_credentials.dart';
import '../definitions/data_schema.dart';
import '../definitions/form.dart';
import '../definitions/interaction_affordances/interaction_affordance.dart';
import '../definitions/security/basic_security_scheme.dart';
import '../definitions/security/digest_security_scheme.dart';
import '../definitions/security/psk_security_scheme.dart';
import '../definitions/security/security_scheme.dart';
import '../definitions/thing_description.dart';
Expand Down Expand Up @@ -68,12 +70,16 @@ class ConsumedThing implements scripting_api.ConsumedThing {
for (final entry in securityDefinitions.entries) {
final credentials = credentialStore?[entry.key];
final securityDefinition = entry.value;
// TODO(JKRhb): Maybe this matching can be done more elegantly.
if (securityDefinition is BasicSecurityScheme &&
credentials is BasicCredentials) {
securityDefinition.credentials = credentials;
} else if (securityDefinition is PskSecurityScheme &&
credentials is PskCredentials) {
securityDefinition.credentials = credentials;
} else if (securityDefinition is DigestSecurityScheme &&
credentials is DigestCredentials) {
securityDefinition.credentials = credentials;
}
}
}
Expand Down
19 changes: 19 additions & 0 deletions lib/src/definitions/credentials/digest_credentials.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2022 The NAMIB Project Developers. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
// SPDX-License-Identifier: BSD-3-Clause

import 'credentials.dart';

/// [Credentials] used for the `DigestSecurityScheme`.
class DigestCredentials extends Credentials {
/// The [username] associated with these [DigestCredentials].
String username;

/// The [password] associated with these [DigestCredentials].
String password;

/// Constructor.
DigestCredentials(this.username, this.password) : super("digest");
}
74 changes: 74 additions & 0 deletions lib/src/definitions/security/digest_security_scheme.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// Copyright 2022 The NAMIB Project Developers. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
// SPDX-License-Identifier: BSD-3-Clause

import '../credentials/digest_credentials.dart';
import 'helper_functions.dart';
import 'security_scheme.dart';

/// Digest Access Authentication security configuration identified by the
/// Vocabulary Term `digest`.
class DigestSecurityScheme extends SecurityScheme {
@override
String get scheme => "digest";

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

/// Specifies the location of security authentication information.
late String in_ = "header";

/// Quality of protection.
late String qop = "auth";

final List<String> _parsedJsonFields = [];

@override
DigestCredentials? credentials;

/// Constructor.
DigestSecurityScheme(
{String? description,
String? proxy,
this.name,
String? in_,
String? qop,
Map<String, String>? descriptions})
: in_ = in_ ?? "header",
qop = qop ?? "auth" {
this.description = description;
this.descriptions.addAll(descriptions ?? {});
}

dynamic _getJsonValue(Map<String, dynamic> json, String key) {
_parsedJsonFields.add(key);
return json[key];
}

/// Creates a [DigestSecurityScheme] from a [json] object.
DigestSecurityScheme.fromJson(Map<String, dynamic> json) {
_parsedJsonFields.addAll(parseSecurityJson(this, json));

final dynamic jsonIn = _getJsonValue(json, "in");
if (jsonIn is String) {
in_ = jsonIn;
_parsedJsonFields.add("in");
}

final dynamic jsonQop = _getJsonValue(json, "qop");
if (jsonQop is String) {
qop = jsonQop;
_parsedJsonFields.add("qop");
}

final dynamic jsonName = _getJsonValue(json, "name");
if (jsonName is String) {
name = jsonName;
_parsedJsonFields.add("name");
}

parseAdditionalFields(additionalFields, json, _parsedJsonFields);
}
}
6 changes: 6 additions & 0 deletions lib/src/definitions/thing_description.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import 'interaction_affordances/event.dart';
import 'interaction_affordances/property.dart';
import 'link.dart';
import 'security/basic_security_scheme.dart';
import 'security/digest_security_scheme.dart';
import 'security/no_security_scheme.dart';
import 'security/psk_security_scheme.dart';
import 'security/security_scheme.dart';
Expand Down Expand Up @@ -235,6 +236,11 @@ class ThingDescription {
securityScheme = PskSecurityScheme.fromJson(value);
break;
}
case "digest":
{
securityScheme = DigestSecurityScheme.fromJson(value);
break;
}
default:
continue;
}
Expand Down

0 comments on commit ef85dd7

Please sign in to comment.