in src/ccf/ccf-provider-client/Controllers/NetworksController.cs [37:121]
public async Task<IActionResult> PutNetwork(
[FromRoute] string networkName,
[FromBody] PutNetworkInput content)
{
var error = ValidateCreateInput();
if (error != null)
{
return error;
}
CcfNetworkProvider ccfNetworkProvider = this.GetNetworkProvider(content.InfraType);
var initialMembers = content.Members.ConvertAll(x => new InitialMember
{
EncryptionPublicKey = x.EncryptionPublicKey,
Certificate = x.Certificate,
MemberData = x.MemberData
});
CcfNetwork network = await
ccfNetworkProvider.CreateNetwork(
networkName,
content.NodeCount,
initialMembers,
content.NodeLogLevel,
SecurityPolicyConfigInput.Convert(content.SecurityPolicy),
content.ProviderConfig);
return this.Ok(network);
IActionResult? ValidateCreateInput()
{
if (!string.IsNullOrEmpty(content.NodeLogLevel))
{
List<string> allowedValues =
[
"Trace", "Debug", "Info", "Fail", "Fatal"
];
if (!allowedValues.Contains(content.NodeLogLevel))
{
return this.BadRequest(new ODataError(
code: "InvalidNodeLogLevel",
message: $"Value should be one of: {string.Join(",", allowedValues)}"));
}
}
if (content.Members.Count == 0)
{
return this.BadRequest(new ODataError(
code: "MembersMissing",
message: "At least one member is required."));
}
foreach (var m in content.Members)
{
try
{
using var c = X509Certificate2.CreateFromPem(m.Certificate);
}
catch (Exception e)
{
return this.BadRequest(new ODataError(
code: "InvalidCertificate",
message: e.Message));
}
if (!string.IsNullOrEmpty(m.EncryptionPublicKey))
{
try
{
using var rsa = RSA.Create();
rsa.ImportFromPem(m.EncryptionPublicKey);
}
catch (Exception e)
{
return this.BadRequest(new ODataError(
code: "InvalidEncryptionPublicKey",
message: e.Message));
}
}
}
return null;
}
}