File: Commands\KeyCommand.cs
Web Access
Project: src\src\Tools\dotnet-user-jwts\src\dotnet-user-jwts.csproj (dotnet-user-jwts)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Tools.Internal;
 
namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
 
internal sealed class KeyCommand
{
    public static void Register(ProjectCommandLineApplication app)
    {
        app.Command("key", cmd =>
        {
            cmd.Description = Resources.KeyCommand_Description;
 
            var schemeOption = cmd.Option(
                "--scheme",
                Resources.KeyCommand_SchemeOption_Description,
                CommandOptionType.SingleValue);
 
            var issuerOption = cmd.Option(
                "--issuer",
                Resources.KeyCommand_IssuerOption_Description,
                CommandOptionType.SingleValue
            );
 
            var resetOption = cmd.Option(
                "--reset",
                Resources.KeyCommand_ResetOption_Description,
                CommandOptionType.NoValue);
 
            var forceOption = cmd.Option(
                "--force",
                Resources.KeyCommand_ForceOption_Description,
                CommandOptionType.NoValue);
 
            cmd.HelpOption("-h|--help");
 
            cmd.OnExecute(() =>
            {
                return Execute(cmd.Reporter,
                    cmd.ProjectOption.Value(),
                    schemeOption.Value() ?? DevJwtsDefaults.Scheme,
                    issuerOption.Value() ?? DevJwtsDefaults.Issuer,
                    resetOption.HasValue(), forceOption.HasValue());
            });
        });
    }
 
    private static int Execute(IReporter reporter, string projectPath, string scheme, string issuer, bool reset, bool force)
    {
        if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var _, out var userSecretsId))
        {
            return 1;
        }
 
        if (reset == true)
        {
            if (!force)
            {
                reporter.Output(Resources.KeyCommand_Permission);
                reporter.Error("[Y]es / [N]o");
                if (Console.ReadLine().Trim().ToUpperInvariant() != "Y")
                {
                    reporter.Output(Resources.KeyCommand_Canceled);
                    return 0;
                }
            }
 
            var key = SigningKeysHandler.CreateSigningKeyMaterial(userSecretsId, scheme, issuer, reset: true);
            reporter.Output(Resources.FormatKeyCommand_KeyCreated(Convert.ToBase64String(key)));
            return 0;
        }
 
        var signingKeyMaterial = SigningKeysHandler.GetSigningKeyMaterial(userSecretsId, scheme, issuer);
 
        if (signingKeyMaterial is null)
        {
            reporter.Output(Resources.KeyCommand_KeyNotFound);
            return 0;
        }
 
        reporter.Output(Resources.FormatKeyCommand_Confirmed(Convert.ToBase64String(signingKeyMaterial)));
        return 0;
    }
}