using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Text; using System.Threading; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using CefSharp; using CefSharp.OffScreen; using Wabbajack.Common; using Wabbajack.Common.Serialization.Json; using Cookie = CefSharp.Cookie; namespace Wabbajack.Lib.LibCefHelpers { public static class Helpers { public static Wabbajack.Lib.Http.Client GetClient(IEnumerable cookies, string referer) { var client = new Wabbajack.Lib.Http.Client(); client.Headers.Add(("Referrer", referer)); client.Cookies.AddRange(cookies.Select(cookie => new System.Net.Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain))); return client; } private static CookieContainer ToCookieContainer(IEnumerable cookies) { var container = new CookieContainer(); cookies .Do(cookie => { container.Add(new System.Net.Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain)); }); return container; } public static async Task GetCookies(string domainEnding = "") { var manager = Cef.GetGlobalCookieManager(); var visitor = new CookieVisitor(); if (!manager.VisitAllCookies(visitor)) return new Cookie[0]; var cc = await visitor.Task; return (await visitor.Task).Where(c => c.Domain.EndsWith(domainEnding)).ToArray(); } private class CookieVisitor : ICookieVisitor { TaskCompletionSource> _source = new TaskCompletionSource>(); public Task> Task => _source.Task; public List Cookies { get; } = new List(); public void Dispose() { _source.SetResult(Cookies); } public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie) { Cookies.Add(new Cookie { Name = cookie.Name, Value = cookie.Value, Domain = cookie.Domain, Path = cookie.Path }); if (count == total) _source.SetResult(Cookies); deleteCookie = false; return true; } } [JsonName("HttpCookie")] public class Cookie { public string Name { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; public string Domain { get; set; } = string.Empty; public string Path { get; set; } = string.Empty; } public static void Init() { if (Inited) return; Inited = true; CefSettings settings = new CefSettings(); settings.CachePath = Consts.CefCacheLocation.ToString(); settings.JavascriptFlags = "--noexpose_wasm"; Cef.Initialize(settings); } public static bool Inited { get; set; } public static void ClearCookies() { var manager = Cef.GetGlobalCookieManager(); var visitor = new CookieDeleter(); manager.VisitAllCookies(visitor); } } class CookieDeleter : ICookieVisitor { public void Dispose() { } public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie) { deleteCookie = true; return true; } } public static class ModuleInitializer { public static void Initialize() { var es = Assembly.GetEntryAssembly(); if (es != null && es.Location != null && Path.GetFileNameWithoutExtension(es.Location) == "Wabbajack") Helpers.Init(); } } }