Example #1
0
        public Using_integration_with_github_test_organization()
        {
            var options = Substitute.For <IOptions <GitHubAppOptions> >();

            var builder = new ConfigurationBuilder()
                          .AddUserSecrets <Using_integration_with_github_test_organization>();

            Configuration = builder.Build();

            var gitHubAppOptions = new GitHubAppOptions
            {
                ApplicationId  = 0,
                InstallationId = 0,
                Name           = "Subscribe_to_Label",
                PrivateKey     = new PrivateKeyOptions
                {
                    KeyString = null,
                }
            };

            Configuration.Bind("GitHubApp", gitHubAppOptions);

            options.Value.Returns(gitHubAppOptions);

            RepositoryOwner = "rokonec-int-tests";
            RepositoryName  = "issue-notify-tests";
            UserX           = "TestLabelNotifyUserX";
            UserY           = "TestLabelNotifyUserY";
            AreaCat         = "area-cat";
            AreaDog         = "area-dog";

            GitHubClientFactory = new GitHubClientFactory(options);
        }
        public void GetPrivateKeyReaderTest()
        {
            var options = new GitHubAppOptions
            {
                PrivateKey = "123456"
            };
            var optionsAccessor = Substitute.For <IOptions <GitHubAppOptions> >();

            optionsAccessor.Value.Returns(options);

            var keySource = new GitHubAppOptionsPrivateKeySource(optionsAccessor);

            var reader = keySource.GetPrivateKeyReader();

            var privateKey = reader.ReadToEnd();

            privateKey.Should().Be($"-----BEGIN RSA PRIVATE KEY-----\r\n{options.PrivateKey}\r\n-----END RSA PRIVATE KEY-----\r\n");
        }
        private string GetJwtToken()
        {
            GitHubAppOptions settings = _settings.Value;

            var factoryOptions = new GitHubJwtFactoryOptions
            {
                AppIntegrationId  = settings.ApplicationId, // The GitHub App Id
                ExpirationSeconds = 9 * 60                  // 10 minutes is the maximum time allowed, but because exp claim is absolute time, lets have it 9 minutes to cover time skew
            };

            // TODO: refactor into TryXXX(factoryOptions)
            if (!string.IsNullOrEmpty(settings.PrivateKey.KeyString))
            {
                // use `awk '{printf "%s\\n", $0}' private-key.pem` to store the pem data
                var privateKey = settings.PrivateKey.KeyString.Replace("\n", Environment.NewLine, StringComparison.Ordinal);

                var generator = new GitHubJwtFactory(new StringPrivateKeySource(privateKey), factoryOptions);

                return(generator.CreateEncodedJwtToken());
            }
            else if (!string.IsNullOrEmpty(settings.PrivateKey.Base64))
            {
                byte[] data          = Convert.FromBase64String(settings.PrivateKey.Base64);
                string decodedString = Encoding.UTF8.GetString(data);

                var generator = new GitHubJwtFactory(new StringPrivateKeySource(decodedString), factoryOptions);

                return(generator.CreateEncodedJwtToken());
            }
            else if (!string.IsNullOrEmpty(settings.PrivateKey.File))
            {
                var generator = new GitHubJwtFactory(new FilePrivateKeySource(settings.PrivateKey.File), factoryOptions);

                return(generator.CreateEncodedJwtToken());
            }
            else
            {
                throw new InvalidOperationException("Not configured GitHubAppSettings.PrivateKey");
            }
        }