private async Task Login()
        {
            var cookieContainer = new CookieContainer();
            var handler         = new HttpClientHandler {
                CookieContainer = cookieContainer
            };

            using (var client = new HttpClient(handler))
            {
                client.DefaultRequestHeaders.Add("User-Agent",
                                                 "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0");

                // Get the csrf_token

                var page = await client.GetAsync(UrlLogin);

                var document = new HtmlDocument();
                document.LoadHtml(await page.Content.ReadAsStringAsync());
                var csrf = document.DocumentNode
                           .Descendants("meta")
                           .First(node => node.Attributes["name"]?.Value == "csrf_token")
                           .Attributes["content"].Value;

                // Create the request

                var pairs = new Dictionary <string, string>
                {
                    { "user_name", _credentialsRepository.MyAnimeListConfig.Username },
                    { "password", _credentialsRepository.MyAnimeListConfig.Password },
                    { "cookie", "1" },
                    { "sublogin", "Login" },
                    { "submit", "1" },
                    { "csrf_token", csrf }
                };

                var content = new FormUrlEncodedContent(pairs);
                var request = await client.PostAsync(UrlLogin, content);

                var cookies = string.Join("; ",
                                          cookieContainer.GetCookies(new Uri(UrlLogin))
                                          .Cast <Cookie>()
                                          .Select(cookie => cookie.ToString()));

                // Save information to disk

                _credentials.CsrfToken = csrf;
                _credentials.CsrfTokenLastRetrieved = DateTime.Now;
                _credentials.Cookies = cookies;

                _credentialsRepository.Save();
            }
        }
        //

        public MyAnimeListInternalApi(ICredentialsRepository credentialsRepository, IDetailProviderService detailProvider)
        {
            _credentialsRepository = credentialsRepository;
            _detailProvider        = detailProvider;

            // Remove any api details on any changes to login credentials
            _credentialsRepository.MyAnimeListConfig.PropertyChanged += (sender, args) =>
            {
                if (args.PropertyName == "Username" || args.PropertyName == "Password")
                {
                    _credentialsRepository.MyAnimeListConfig.Credentials = new ApiCredentials();
                    _credentialsRepository.Save();
                    _clientReady = false;
                }
            };

            _client = new HttpClient(new HttpClientHandler
            {
                UseCookies             = false,
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            });

            _credentials = _credentialsRepository.MyAnimeListConfig.Credentials;
        }
Example #3
0
        // Auth related

        private async Task CheckAuthentication()
        {
            ApiCredentials credentials = null;

            // never retrieved: retrieve
            if (_credentials == null)
            {
                credentials = await GetCredentials();
            }

            // token expired: update
            else if (_credentials?.ExpiresDateTime < DateTime.Now)
            {
                credentials = await GetCredentials();
            }

            // a change was required to be made, save new credentials to settings
            if (credentials != null)
            {
                _credentials = credentials;
                _credentialsRepository.AniListConfiguration.Credentials = credentials;
                _credentialsRepository.Save();
            }
        }