Example #1
0
        public async Task AzureReposProvider_GetCredentialAsync_PatMode_ExistingPat_ReturnsExistingCredential()
        {
            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "https",
                ["host"]     = "dev.azure.com",
                ["path"]     = "org/proj/_git/repo"
            });

            var          remoteUri           = new Uri("https://dev.azure.com/org/proj/_git/repo");
            var          personalAccessToken = "PERSONAL-ACCESS-TOKEN";
            const string service             = "https://dev.azure.com/org";
            const string account             = "john.doe";

            var context = new TestCommandContext();

            context.CredentialStore.Add(service, account, personalAccessToken);

            var azDevOps       = Mock.Of <IAzureDevOpsRestApi>();
            var msAuth         = Mock.Of <IMicrosoftAuthentication>();
            var authorityCache = Mock.Of <IAzureDevOpsAuthorityCache>();
            var userMgr        = Mock.Of <IAzureReposBindingManager>();

            var provider = new AzureReposHostProvider(context, azDevOps, msAuth, authorityCache, userMgr);

            ICredential credential = await provider.GetCredentialAsync(input);

            Assert.NotNull(credential);
            Assert.Equal(account, credential.Account);
            Assert.Equal(personalAccessToken, credential.Password);
        }
Example #2
0
        public async Task AzureReposProvider_GetCredentialAsync_JwtMode_NoCachedAuthority_NoUser_ReturnsCredential()
        {
            var orgName = "org";

            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "https",
                ["host"]     = "dev.azure.com",
                ["path"]     = "org/proj/_git/repo"
            });

            var expectedOrgUri      = new Uri("https://dev.azure.com/org");
            var remoteUri           = new Uri("https://dev.azure.com/org/proj/_git/repo");
            var authorityUrl        = "https://login.microsoftonline.com/common";
            var expectedClientId    = AzureDevOpsConstants.AadClientId;
            var expectedRedirectUri = AzureDevOpsConstants.AadRedirectUri;
            var expectedScopes      = AzureDevOpsConstants.AzureDevOpsDefaultScopes;
            var accessToken         = "ACCESS-TOKEN";
            var account             = "john.doe";
            var authResult          = CreateAuthResult(account, accessToken);

            var context = new TestCommandContext();

            // Use OAuth Access Tokens
            context.Environment.Variables[AzureDevOpsConstants.EnvironmentVariables.CredentialType] =
                AzureDevOpsConstants.OAuthCredentialType;

            var azDevOpsMock = new Mock <IAzureDevOpsRestApi>(MockBehavior.Strict);

            azDevOpsMock.Setup(x => x.GetAuthorityAsync(expectedOrgUri)).ReturnsAsync(authorityUrl);

            var msAuthMock = new Mock <IMicrosoftAuthentication>(MockBehavior.Strict);

            msAuthMock.Setup(x => x.GetTokenAsync(authorityUrl, expectedClientId, expectedRedirectUri, expectedScopes, null))
            .ReturnsAsync(authResult);

            var authorityCacheMock = new Mock <IAzureDevOpsAuthorityCache>(MockBehavior.Strict);

            authorityCacheMock.Setup(x => x.GetAuthority(It.IsAny <string>())).Returns((string)null);
            authorityCacheMock.Setup(x => x.UpdateAuthority(orgName, authorityUrl));

            var userMgrMock = new Mock <IAzureReposBindingManager>(MockBehavior.Strict);

            userMgrMock.Setup(x => x.GetBinding(orgName)).Returns((AzureReposBinding)null);

            var provider = new AzureReposHostProvider(context, azDevOpsMock.Object, msAuthMock.Object, authorityCacheMock.Object, userMgrMock.Object);

            ICredential credential = await provider.GetCredentialAsync(input);

            Assert.NotNull(credential);
            Assert.Equal(account, credential.Account);
            Assert.Equal(accessToken, credential.Password);
        }
Example #3
0
        public async Task AzureReposProvider_GetCredentialAsync_UnencryptedHttp_ThrowsException()
        {
            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "http",
                ["host"]     = "dev.azure.com",
                ["path"]     = "org/proj/_git/repo"
            });

            var context  = new TestCommandContext();
            var azDevOps = Mock.Of <IAzureDevOpsRestApi>();
            var msAuth   = Mock.Of <IMicrosoftAuthentication>();

            var provider = new AzureReposHostProvider(context, azDevOps, msAuth);

            await Assert.ThrowsAsync <Exception>(() => provider.GetCredentialAsync(input));
        }
Example #4
0
        public async Task AzureReposProvider_GetCredentialAsync_PatMode_NoExistingPat_GeneratesCredential()
        {
            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "https",
                ["host"]     = "dev.azure.com",
                ["path"]     = "org/proj/_git/repo"
            });

            var expectedOrgUri      = new Uri("https://dev.azure.com/org");
            var remoteUri           = new Uri("https://dev.azure.com/org/proj/_git/repo");
            var authorityUrl        = "https://login.microsoftonline.com/common";
            var expectedClientId    = AzureDevOpsConstants.AadClientId;
            var expectedRedirectUri = AzureDevOpsConstants.AadRedirectUri;
            var expectedScopes      = AzureDevOpsConstants.AzureDevOpsDefaultScopes;
            var accessToken         = "ACCESS-TOKEN";
            var personalAccessToken = "PERSONAL-ACCESS-TOKEN";
            var account             = "john.doe";
            var authResult          = CreateAuthResult(account, accessToken);

            var context = new TestCommandContext();

            var azDevOpsMock = new Mock <IAzureDevOpsRestApi>(MockBehavior.Strict);

            azDevOpsMock.Setup(x => x.GetAuthorityAsync(expectedOrgUri)).ReturnsAsync(authorityUrl);
            azDevOpsMock.Setup(x => x.CreatePersonalAccessTokenAsync(expectedOrgUri, accessToken, It.IsAny <IEnumerable <string> >()))
            .ReturnsAsync(personalAccessToken);

            var msAuthMock = new Mock <IMicrosoftAuthentication>(MockBehavior.Strict);

            msAuthMock.Setup(x => x.GetTokenAsync(authorityUrl, expectedClientId, expectedRedirectUri, expectedScopes, null))
            .ReturnsAsync(authResult);

            var authorityCacheMock = new Mock <IAzureDevOpsAuthorityCache>(MockBehavior.Strict);

            var userMgrMock = new Mock <IAzureReposBindingManager>(MockBehavior.Strict);

            var provider = new AzureReposHostProvider(context, azDevOpsMock.Object, msAuthMock.Object, authorityCacheMock.Object, userMgrMock.Object);

            ICredential credential = await provider.GetCredentialAsync(input);

            Assert.NotNull(credential);
            Assert.Equal(account, credential.Account);
            Assert.Equal(personalAccessToken, credential.Password);
        }
        async Task <ICredential?> GetCredentialAsync(Uri uri)
        {
            if (credential != null)
            {
                return(credential);
            }

            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "https",
                ["host"]     = "dev.azure.com",
                ["path"]     = uri.GetComponents(UriComponents.Path, UriFormat.Unescaped),
            });

            var provider = new AzureReposHostProvider(new CommandContext(AppPath.Default));

            credential = await provider.GetCredentialAsync(input);

            return(credential);
        }
Example #6
0
        public async Task AzureReposProvider_GetCredentialAsync_ReturnsCredential()
        {
            var input = new InputArguments(new Dictionary <string, string>
            {
                ["protocol"] = "https",
                ["host"]     = "dev.azure.com",
                ["path"]     = "org/proj/_git/repo"
            });

            var expectedOrgUri      = new Uri("https://dev.azure.com/org");
            var remoteUri           = new Uri("https://dev.azure.com/org/proj/_git/repo");
            var authorityUrl        = "https://login.microsoftonline.com/common";
            var expectedClientId    = AzureDevOpsConstants.AadClientId;
            var expectedRedirectUri = AzureDevOpsConstants.AadRedirectUri;
            var expectedResource    = AzureDevOpsConstants.AadResourceId;
            var accessToken         = CreateJwt("john.doe");
            var personalAccessToken = "PERSONAL-ACCESS-TOKEN";

            var context = new TestCommandContext();

            var azDevOpsMock = new Mock <IAzureDevOpsRestApi>();

            azDevOpsMock.Setup(x => x.GetAuthorityAsync(expectedOrgUri))
            .ReturnsAsync(authorityUrl);
            azDevOpsMock.Setup(x => x.CreatePersonalAccessTokenAsync(expectedOrgUri, accessToken, It.IsAny <IEnumerable <string> >()))
            .ReturnsAsync(personalAccessToken);

            var msAuthMock = new Mock <IMicrosoftAuthentication>();

            msAuthMock.Setup(x => x.GetAccessTokenAsync(authorityUrl, expectedClientId, expectedRedirectUri, expectedResource, remoteUri, null))
            .ReturnsAsync(accessToken);

            var provider = new AzureReposHostProvider(context, azDevOpsMock.Object, msAuthMock.Object);

            ICredential credential = await provider.GetCredentialAsync(input);

            Assert.NotNull(credential);
            Assert.Equal(personalAccessToken, credential.Password);
            // We don't care about the username value
        }