private string Authenticate() { string token = GetToken(); if (token == null) { if (ServerSettings.Instance.WebCache.BannedExpiration.HasValue && ServerSettings.Instance.WebCache.BannedExpiration.HasValue && ServerSettings.Instance.WebCache.BannedExpiration.Value > DateTime.UtcNow) { return(null); } CookieContainer cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler)) { client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16241"); Uri uri = new Uri("http://anidb.net/perl-bin/animedb.pl"); //MOVE TO Properties string post = $"show=userpage&xuser={HttpUtility.UrlEncode(ServerSettings.Instance.AniDb.Username)}&xpass={HttpUtility.UrlEncode(ServerSettings.Instance.AniDb.Password)}&do.auth=login"; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri); request.Headers.Referrer = uri; request.Content = new ByteArrayContent(Encoding.UTF8.GetBytes(post)); Uri host = new Uri(uri.Scheme + "://" + uri.Host); HttpResponseMessage response = Task.Run(async() => await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)).GetAwaiter().GetResult(); if (response.IsSuccessStatusCode) { List <Cookie> cookies = cookieContainer.GetCookies(host).Cast <Cookie>().ToList(); if (!cookies.Any(a => a.Name == "adbsess" && !string.IsNullOrEmpty(a.Value))) { return(null); } WebCache_AniDBLoggedInfo logged = new WebCache_AniDBLoggedInfo(); logged.Cookies = cookies.ToDictionary(a => a.Name, a => a.Value); logged.UserName = ServerSettings.Instance.AniDb.Username; try { WebCache_SessionInfo session = cclient.Verify(logged); ServerSettings.Instance.WebCache.Session = session; ServerSettings.Instance.SaveSettings(); return(GetToken()); } catch (SwaggerException e) { if (e.StatusCode == 403) { ServerSettings.Instance.WebCache.BannedReason = "Unable to login to AniDB"; ServerSettings.Instance.WebCache.BannedExpiration = DateTime.UtcNow.AddHours(1); logger.Error("Unable to login to AniDB, waiting for 1 hour. Error:" + e); return(null); } logger.Error("Unable to login to AniDB. Error: " + e); return(null); } } ServerSettings.Instance.WebCache.BannedReason = "Unable to login to AniDB"; ServerSettings.Instance.WebCache.BannedExpiration = DateTime.UtcNow.AddHours(1); logger.Error("Unable to login to AniDB, waiting for 1 hour"); } return(null); } return(token); }
public async Task <IActionResult> Verify(WebCache_AniDBLoggedInfo data) { try { CookieContainer cookieContainer = new CookieContainer(); using (var handler = new HttpClientHandler { CookieContainer = cookieContainer }) using (var client = new HttpClient(handler)) { string curi = GetAniDBUserVerificationUri(); string regex = GetAniDBUserVerificationRegEx(); client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", User_Agent); Uri uri = new Uri(curi); Regex rn = new Regex(regex, RegexOptions.Singleline); foreach (string k in data.Cookies.Keys) { cookieContainer.Add(new Cookie(k, data.Cookies[k], "/", uri.Host)); } HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri); HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseContentRead); if (response.IsSuccessStatusCode) { string str = await response.Content.ReadAsStringAsync(); response.Dispose(); Match m = rn.Match(str); if (m.Success) { if (m.Groups.Count > 1) { string val = m.Groups["username"]?.Value; string id = m.Groups["id"]?.Value; int aniid; if (val != null && id != null && int.TryParse(id, out aniid)) { if (string.Compare(val, data.UserName, StringComparison.InvariantCultureIgnoreCase) == 0) { uri = new Uri(GetAniDBLogoutUri()); try { request = new HttpRequestMessage(HttpMethod.Get, uri); response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); response.Dispose(); } catch (Exception) { //ignore } WebCache_User u = await _db.Users.FirstOrDefaultAsync(a => a.AniDBUserId == aniid); if (u == null) { u = new WebCache_User(); u.AniDBUserId = aniid; u.AniDBUserName = val; _db.Add(u); } else if (u.AniDBUserName != val) { u.AniDBUserName = val; } WebCache_Session s = new WebCache_Session(); s.Token = Guid.NewGuid().ToString().Replace("-", string.Empty); s.Expiration = DateTime.UtcNow.AddHours(GetTokenExpirationInHours()); s.AniDBUserName = val; s.AniDBUserId = aniid; _db.Add(s); await _db.SaveChangesAsync(); SessionInfoWithError si = new SessionInfoWithError { AniDBUserId = s.AniDBUserId, AniDBUserName = s.AniDBUserName, Expiration = s.Expiration, Token = s.Token }; si.Role = GetRole(s.AniDBUserId); si.Error = null; return(new JsonResult(s)); } } } } } } return(StatusCode(403, "Invalid credentials")); } catch (Exception e) { _logger.LogError(e, $"VERIFY with UserName={data.UserName}"); return(StatusCode(500)); } }