Пример #1
0
        private async Task <PowerGuideAuthToken> logIn()
        {
            LOGGER.Debug("Logging in to MySolarCity as {0}", username);
            PreLogInData preLogInData = await client.authentication.fetchPreLogInData();

            IDictionary <string, string> credentialResponseParams =
                await client.authentication.submitCredentials(username, password, preLogInData);

            PowerGuideAuthToken authToken = await client.authentication.fetchAuthToken(credentialResponseParams);

            LOGGER.Debug("Logged in to MySolarCity");
            LOGGER.Trace($"MySolarCity auth token: {authToken}");
            return(authToken);
        }
        private Task <PowerGuideAuthToken> MockLogIn()
        {
            var preLogInData = new PreLogInData();

            A.CallTo(() => authClient.FetchPreLogInData()).Returns(preLogInData);

            IDictionary <string, string> credentialResponseParams = new Dictionary <string, string>();

            A.CallTo(() => authClient.SubmitCredentials(A <string> ._, A <string> ._, A <PreLogInData> ._))
            .Returns(credentialResponseParams);


            A.CallTo(() => authClient.FetchAuthToken(A <IDictionary <string, string> > ._)).Returns(new PowerGuideAuthToken("abcdef"));

            return(service.GetAuthToken());
        }
        public void SubmitCredentialsFailure()
        {
            A.CallTo(() => httpMessageHander.SendAsync(A <HttpRequestMessage> ._))
            .ThrowsAsync(new HttpRequestException());

            Func <Task> thrower = async() =>
            {
                var preLogInData = new PreLogInData
                {
                    LogInUri = new Uri(
                        "https://login.solarcity.com/account/SignIn?signin=f1938d8ff30a3b6648ebd619e4278c46")
                };
                await client.SubmitCredentials("*****@*****.**", "pass", preLogInData);
            };

            thrower.Should().Throw <PowerGuideException>()
            .WithMessage(
                "Auth Phase 2/3: Failed to log in with credentials, username or password may be incorrect.");
        }
        public async void SubmitCredentials()
        {
            var    response    = A.Fake <HttpResponseMessage>();
            string requestBody = null;

            A.CallTo(() => httpMessageHander.SendAsync(A <HttpRequestMessage> ._)).ReturnsLazily(async call =>
            {
                requestBody = await call.Arguments[0].As <HttpRequestMessage>().Content.ReadAsStringAsync();
                return(response);
            });

            var doc = new HtmlParser().Parse(File.Open("Data/solarcity-submit-credentials.html", FileMode.Open));

            A.CallTo(() => contentHandlers.ReadContentAsHtml(response)).Returns(doc);

            PreLogInData preLogInData = new PreLogInData
            {
                CsrfToken =
                    "AAEAADs8_pWJ1-mMSxXSyne1GfJK4mpiFEvpzx0H4QuZcyOzvhUazxugwlou0Ay3rK8wNvDuo4Knpm3lGpH0ccZ8KE5coMqF238vBY-BR823zQmLHvD2hn--JpbdIq5isvqiTGS-DLf9IgNc-Pph_-K4Tz0HduJgLMI6EVBf4wBYfsQGlBZDkQ9HFk2yciyHHqnl9dzLMZTPj1cNQrLZRN4tNpRNzy06tijZHwYfnp89HiTYRdb0Pxe8OsZu9nch3osHNpsNyeamXqQ02qao4zEYI2ZFMyNzwAEpieMlFawDcdLLmL__C-BIkXdqmOYgBIaVKwrBHdfQdpGq628QiC-5oUwswJDMnzjEMnUhlo8yRJUmIa_vo1MbGSH1obG1AhiU5wABAACOtoMOY_r2dfuBF9Pc0tz-fi5cogml1fVaetrrXVQ0LElY2Ova0-vqSYQ9rC0ygjLOIzDt0IvqiN8VT18bIEd-4YARmH2LxxEMMw5lXc2NgV_0c5qj_kEO6bSOJyu1Qyq_DtN9DUFVdXa04ZY3X0CWOf7DLGDF-P_RLkHclHc-eeeo7NZwQyFooAAnytoDVZB01JqfMHyZAxcalNs7Z8UnOwIxwplY5pgb2T1v5tNvQ1yIk9_BO6MovmkCDM8V8ATUySXGcjyQHqJi0ogrK5NMoEGt8G0G5oJ2JolPGA8XW1iw5Ja10Mu19EPdqHiXZxjgtTMkmA62c-BlP_Wuk1U6IAAAAB_Fer7EeK4abWYA6T-DJzyzl36Mfntzc3_pNTEAB2Hl",
                LogInUri = new Uri("https://login.solarcity.com/account/SignIn?signin=f1938d8ff30a3b6648ebd619e4278c46")
            };
            IDictionary <string, string>
            actual = await client.SubmitCredentials("*****@*****.**", "pass", preLogInData);

            actual.Count.Should().Be(3);
            actual.Should().Contain("wa", "wsignin1.0");
            actual.Should().Contain("wresult",
                                    @"<trust:RequestSecurityTokenResponseCollection xmlns:trust=""http://docs.oasis-open.org/ws-sx/ws-trust/200512""><trust:RequestSecurityTokenResponse Context=""rm=0&amp;id=passive&amp;ru=%2f""><wsp:AppliesTo xmlns:wsp=""http://schemas.xmlsoap.org/ws/2004/09/policy""><wsa:EndpointReference xmlns:wsa=""http://www.w3.org/2005/08/addressing""><wsa:Address>https://mysolarcity.com/</wsa:Address></wsa:EndpointReference></wsp:AppliesTo><trust:RequestedSecurityToken><wsse:BinarySecurityToken ValueType=""urn:ietf:params:oauth:token-type:jwt"" EncodingType=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"" xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJbWRUUWtWU1pVSkRPVWQwUW1wTlFWcHFlak5ZWVdFMFMwbFpkeUo5LmV5Sm9kSFJ3T2k4dmMyOXNZWEpqYVhSNUxtTnZiUzkzY3k4eU1ERTBMekF5TDJsa1pXNTBhWFI1TDJOc1lXbHRjeTlqYjI1MFlXTjBMV2xrSWpvaU5ESXdPRFF6T0NJc0ltaDBkSEE2THk5emIyeGhjbU5wZEhrdVkyOXRMM2R6THpJd01UUXZNRFF2YVdSbGJuUnBkSGt2WTJ4aGFXMXpMMk52Ym5SaFkzUXRaM1ZwWkNJNkltSmpPVFkxWXpFekxUQXhZamN0TkROa01TMWlNalV6TFRBNE1UUTROMkZrTjJNMVppSXNJbVZ0WVdsc0lqb2laWFpoYmtCaGJHUmhkbWwyWVM1amIyMGlMQ0pvZEhSd09pOHZjMjlzWVhKamFYUjVMbU52YlM5M2N5OHlNREUwTHpBMEwybGtaVzUwYVhSNUwyTnNZV2x0Y3k5amIyNTBZV04wTFhSNWNHVWlPaUpEZFhOMGIyMWxjaUlzSW1GMWRHaHRaWFJvYjJRaU9pSm9kSFJ3T2k4dmMyTm9aVzFoY3k1dGFXTnliM052Wm5RdVkyOXRMM2R6THpJd01EZ3ZNRFl2YVdSbGJuUnBkSGt2WVhWMGFHVnVkR2xqWVhScGIyNXRaWFJvYjJRdmNHRnpjM2R2Y21RaUxDSmhkWFJvWDNScGJXVWlPaUl5TURFM0xUQTVMVEEwVkRBeU9qUXlPakkwTGpBNU5Gb2lMQ0pwYzNNaU9pSlRiMnhoY2tOcGRIbFRWRk1pTENKaGRXUWlPaUpvZEhSd2N6b3ZMMjE1YzI5c1lYSmphWFI1TG1OdmJTOGlMQ0psZUhBaU9qRTFNRFExTWpFM05EUXNJbTVpWmlJNk1UVXdORFE1TWprME5IMC5GNDF5a29GclZGX1dVN2EydEhLRzItOHE0Y1ZMZWxFQmRhLXViSzNiTVYtcVJ6QXM3am82RE1OUXFqaVJxdTBSenhqTHF3VC1WSEo4WWdfMXZ1WEtiX0hIUUJ2aE5uYnR1OTQtVnNIU2h3LUpEUUYtRHVNZXRBYjFMcHZXV1RXTlo2c2ZiMG45dWxaWmZUcExUdGc4ZHZRR3U3NVdlSDlyWXpvN2tfbzRTQUtBYTF6S09zWVo0RTBZYmRxTmsxRk1aWmxYNFFIb0lHTmc4cmJCUTFkeVhEVks0Y1pEUUgtbS1HS1pvaExFcnlzRTd2WjZfY292S0xkVGd1dWJJXzE4TjdOV3NEY05DUFAtUWNCX01qd0R4QV9JYmlzQWNpMzgxNTl0RGs4Y0x5ci05SGNPcDBNNTUzb3ByTFE2S1FTMlFPMzdVWmtqelcyRzZsUGFVRFdyY1E=</wsse:BinarySecurityToken></trust:RequestedSecurityToken></trust:RequestSecurityTokenResponse></trust:RequestSecurityTokenResponseCollection>");
            actual.Should().Contain("wctx", "rm=0&id=passive&ru=%2f");

            A.CallTo(() => httpMessageHander.SendAsync(A <HttpRequestMessage> .That.Matches(message =>
                                                                                            message.Method == HttpMethod.Post &&
                                                                                            message.RequestUri.ToString()
                                                                                            .Equals("https://login.solarcity.com/account/SignIn?signin=f1938d8ff30a3b6648ebd619e4278c46")
                                                                                            ))).MustHaveHappened();

            requestBody.Should().Be(
                "idsrv.xsrf=AAEAADs8_pWJ1-mMSxXSyne1GfJK4mpiFEvpzx0H4QuZcyOzvhUazxugwlou0Ay3rK8wNvDuo4Knpm3lGpH0ccZ8KE5coMqF238vBY-BR823zQmLHvD2hn--JpbdIq5isvqiTGS-DLf9IgNc-Pph_-K4Tz0HduJgLMI6EVBf4wBYfsQGlBZDkQ9HFk2yciyHHqnl9dzLMZTPj1cNQrLZRN4tNpRNzy06tijZHwYfnp89HiTYRdb0Pxe8OsZu9nch3osHNpsNyeamXqQ02qao4zEYI2ZFMyNzwAEpieMlFawDcdLLmL__C-BIkXdqmOYgBIaVKwrBHdfQdpGq628QiC-5oUwswJDMnzjEMnUhlo8yRJUmIa_vo1MbGSH1obG1AhiU5wABAACOtoMOY_r2dfuBF9Pc0tz-fi5cogml1fVaetrrXVQ0LElY2Ova0-vqSYQ9rC0ygjLOIzDt0IvqiN8VT18bIEd-4YARmH2LxxEMMw5lXc2NgV_0c5qj_kEO6bSOJyu1Qyq_DtN9DUFVdXa04ZY3X0CWOf7DLGDF-P_RLkHclHc-eeeo7NZwQyFooAAnytoDVZB01JqfMHyZAxcalNs7Z8UnOwIxwplY5pgb2T1v5tNvQ1yIk9_BO6MovmkCDM8V8ATUySXGcjyQHqJi0ogrK5NMoEGt8G0G5oJ2JolPGA8XW1iw5Ja10Mu19EPdqHiXZxjgtTMkmA62c-BlP_Wuk1U6IAAAAB_Fer7EeK4abWYA6T-DJzyzl36Mfntzc3_pNTEAB2Hl" +
                "&username=user%40domain.com" +
                "&password=pass" +
                "&RecaptchaResponse=");
        }
        public async void FetchPreLogInData()
        {
            var response = A.Fake <HttpResponseMessage>();

            A.CallTo(() => httpMessageHander.SendAsync(A <HttpRequestMessage> ._)).Returns(response);

            var doc = new HtmlParser().Parse(File.Open("Data/solarcity-login.html", FileMode.Open));

            A.CallTo(() => contentHandlers.ReadContentAsHtml(response)).Returns(doc);

            PreLogInData actual = await client.FetchPreLogInData();

            actual.CsrfToken.Should().Be(
                "AAEAADs8_pWJ1-mMSxXSyne1GfJK4mpiFEvpzx0H4QuZcyOzvhUazxugwlou0Ay3rK8wNvDuo4Knpm3lGpH0ccZ8KE5coMqF238vBY-BR823zQmLHvD2hn--JpbdIq5isvqiTGS-DLf9IgNc-Pph_-K4Tz0HduJgLMI6EVBf4wBYfsQGlBZDkQ9HFk2yciyHHqnl9dzLMZTPj1cNQrLZRN4tNpRNzy06tijZHwYfnp89HiTYRdb0Pxe8OsZu9nch3osHNpsNyeamXqQ02qao4zEYI2ZFMyNzwAEpieMlFawDcdLLmL__C-BIkXdqmOYgBIaVKwrBHdfQdpGq628QiC-5oUwswJDMnzjEMnUhlo8yRJUmIa_vo1MbGSH1obG1AhiU5wABAACOtoMOY_r2dfuBF9Pc0tz-fi5cogml1fVaetrrXVQ0LElY2Ova0-vqSYQ9rC0ygjLOIzDt0IvqiN8VT18bIEd-4YARmH2LxxEMMw5lXc2NgV_0c5qj_kEO6bSOJyu1Qyq_DtN9DUFVdXa04ZY3X0CWOf7DLGDF-P_RLkHclHc-eeeo7NZwQyFooAAnytoDVZB01JqfMHyZAxcalNs7Z8UnOwIxwplY5pgb2T1v5tNvQ1yIk9_BO6MovmkCDM8V8ATUySXGcjyQHqJi0ogrK5NMoEGt8G0G5oJ2JolPGA8XW1iw5Ja10Mu19EPdqHiXZxjgtTMkmA62c-BlP_Wuk1U6IAAAAB_Fer7EeK4abWYA6T-DJzyzl36Mfntzc3_pNTEAB2Hl");
            actual.LogInUri.ToString().Should()
            .Be("https://login.solarcity.com/account/SignIn?signin=f1938d8ff30a3b6648ebd619e4278c46");

            A.CallTo(() => httpMessageHander.SendAsync(A <HttpRequestMessage> .That.Matches(message =>
                                                                                            message.Method == HttpMethod.Get &&
                                                                                            message.RequestUri.ToString().Equals("https://mysolarcity.com/")
                                                                                            ))).MustHaveHappened();
        }
        public async Task <IDictionary <string, string> > submitCredentials(string username, string password,
                                                                            PreLogInData preLogInData)
        {
            IEnumerable <KeyValuePair <string, string> > formValues = new List <KeyValuePair <string, string> > {
                new KeyValuePair <string, string>("idsrv.xsrf", preLogInData.csrfToken),
                new KeyValuePair <string, string>("username", username),
                new KeyValuePair <string, string>("password", password),
                new KeyValuePair <string, string>("RecaptchaResponse", string.Empty)
            };

            try {
                using HttpResponseMessage response =
                          await httpClient.PostAsync(preLogInData.logInUri, new FormUrlEncodedContent (formValues));

                using IHtmlDocument html = await readContentAsHtml(response);

                return(html.QuerySelectorAll("input[name]").ToDictionary(
                           e => e.GetAttribute("name"),
                           e => e.GetAttribute("value")));
            } catch (HttpRequestException e) {
                throw new PowerGuideException(
                          "Auth Phase 2/3: Failed to log in with credentials, username or password may be incorrect.", e);
            }
        }