mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Merge remote-tracking branch 'origin/webview-download-fix' into pre-release
This commit is contained in:
commit
5f2b64891a
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.VisualBasic.CompilerServices;
|
using Microsoft.VisualBasic.CompilerServices;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Wabbajack.Common;
|
||||||
using Wabbajack.Downloaders;
|
using Wabbajack.Downloaders;
|
||||||
using Wabbajack.DTOs;
|
using Wabbajack.DTOs;
|
||||||
using Wabbajack.DTOs.DownloadStates;
|
using Wabbajack.DTOs.DownloadStates;
|
||||||
@ -146,7 +147,7 @@ namespace Wabbajack
|
|||||||
private HttpRequestMessage MakeMessage(Uri uri)
|
private HttpRequestMessage MakeMessage(Uri uri)
|
||||||
{
|
{
|
||||||
var msg = new HttpRequestMessage(HttpMethod.Get, uri);
|
var msg = new HttpRequestMessage(HttpMethod.Get, uri);
|
||||||
msg.UseChromeUserAgent();
|
msg.AddChromeAgent();
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
using System.Security.Policy;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Wabbajack.DTOs;
|
|
||||||
using Wabbajack.DTOs.DownloadStates;
|
using Wabbajack.DTOs.DownloadStates;
|
||||||
using Wabbajack.DTOs.Interventions;
|
using Wabbajack.DTOs.Interventions;
|
||||||
using Wabbajack.Paths;
|
|
||||||
|
|
||||||
namespace Wabbajack.UserIntervention;
|
namespace Wabbajack.UserIntervention;
|
||||||
|
|
||||||
@ -21,13 +18,13 @@ public class ManualDownloadHandler : BrowserWindowViewModel
|
|||||||
HeaderText = $"Manual download ({md.Url.Host})";
|
HeaderText = $"Manual download ({md.Url.Host})";
|
||||||
|
|
||||||
Instructions = string.IsNullOrWhiteSpace(md.Prompt) ? $"Please download {archive.Name}" : md.Prompt;
|
Instructions = string.IsNullOrWhiteSpace(md.Prompt) ? $"Please download {archive.Name}" : md.Prompt;
|
||||||
await NavigateTo(md.Url);
|
|
||||||
|
|
||||||
|
var task = WaitForDownloadUri(token, async () =>
|
||||||
var uri = await WaitForDownloadUri(token, async () =>
|
|
||||||
{
|
{
|
||||||
await RunJavaScript("Array.from(document.getElementsByTagName(\"iframe\")).forEach(f => f.remove())");
|
await RunJavaScript("Array.from(document.getElementsByTagName(\"iframe\")).forEach(f => f.remove())");
|
||||||
});
|
});
|
||||||
|
await NavigateTo(md.Url);
|
||||||
|
var uri = await task;
|
||||||
|
|
||||||
Intervention.Finish(uri);
|
Intervention.Finish(uri);
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
|||||||
using System.Web;
|
using System.Web;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ReactiveUI;
|
using ReactiveUI;
|
||||||
|
using Wabbajack.Common;
|
||||||
using Wabbajack.DTOs.Interventions;
|
using Wabbajack.DTOs.Interventions;
|
||||||
using Wabbajack.DTOs.Logins;
|
using Wabbajack.DTOs.Logins;
|
||||||
using Wabbajack.Messages;
|
using Wabbajack.Messages;
|
||||||
@ -88,8 +89,7 @@ public abstract class OAuth2LoginHandler<TLoginType> : BrowserWindowViewModel
|
|||||||
var msg = new HttpRequestMessage();
|
var msg = new HttpRequestMessage();
|
||||||
msg.Method = HttpMethod.Post;
|
msg.Method = HttpMethod.Post;
|
||||||
msg.RequestUri = tlogin.TokenEndpoint;
|
msg.RequestUri = tlogin.TokenEndpoint;
|
||||||
msg.Headers.Add("User-Agent",
|
msg.AddChromeAgent();
|
||||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36");
|
|
||||||
msg.Headers.Add("Cookie", string.Join(";", cookies.Select(c => $"{c.Name}={c.Value}")));
|
msg.Headers.Add("Cookie", string.Join(";", cookies.Select(c => $"{c.Name}={c.Value}")));
|
||||||
msg.Content = new FormUrlEncodedContent(formData.ToList());
|
msg.Content = new FormUrlEncodedContent(formData.ToList());
|
||||||
|
|
||||||
|
@ -83,6 +83,11 @@ public abstract class BrowserWindowViewModel : ViewModel
|
|||||||
|
|
||||||
public async Task<Cookie[]> GetCookies(string domainEnding, CancellationToken token)
|
public async Task<Cookie[]> GetCookies(string domainEnding, CancellationToken token)
|
||||||
{
|
{
|
||||||
|
// Strip www. before searching for cookies on a domain to handle websites saving their cookies like .example.org
|
||||||
|
if (domainEnding.StartsWith("www."))
|
||||||
|
{
|
||||||
|
domainEnding = domainEnding[4..];
|
||||||
|
}
|
||||||
var cookies = (await _browser.CoreWebView2.CookieManager.GetCookiesAsync(""))
|
var cookies = (await _browser.CoreWebView2.CookieManager.GetCookiesAsync(""))
|
||||||
.Where(c => c.Domain.EndsWith(domainEnding));
|
.Where(c => c.Domain.EndsWith(domainEnding));
|
||||||
return cookies.Select(c => new Cookie
|
return cookies.Select(c => new Cookie
|
||||||
@ -112,11 +117,13 @@ public abstract class BrowserWindowViewModel : ViewModel
|
|||||||
{
|
{
|
||||||
var source = new TaskCompletionSource<Uri>();
|
var source = new TaskCompletionSource<Uri>();
|
||||||
var referer = _browser.Source;
|
var referer = _browser.Source;
|
||||||
|
while (_browser.CoreWebView2 == null)
|
||||||
|
await Task.Delay(10, token);
|
||||||
|
|
||||||
_browser.CoreWebView2.DownloadStarting += (sender, args) =>
|
_browser.CoreWebView2.DownloadStarting += (sender, args) =>
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
source.SetResult(new Uri(args.DownloadOperation.Uri));
|
source.SetResult(new Uri(args.DownloadOperation.Uri));
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception)
|
||||||
@ -144,10 +151,14 @@ public abstract class BrowserWindowViewModel : ViewModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
var cookies = await GetCookies(uri.Host, token);
|
var cookies = await GetCookies(uri.Host, token);
|
||||||
return new ManualDownload.BrowserDownloadState(uri, cookies, new[]
|
return new ManualDownload.BrowserDownloadState(
|
||||||
|
uri,
|
||||||
|
cookies,
|
||||||
|
new[]
|
||||||
{
|
{
|
||||||
("Referer", referer.ToString())
|
("Referer", referer?.ToString() ?? uri.ToString())
|
||||||
});
|
},
|
||||||
|
_browser.CoreWebView2.Settings.UserAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<Hash> WaitForDownload(AbsolutePath path, CancellationToken token)
|
public async Task<Hash> WaitForDownload(AbsolutePath path, CancellationToken token)
|
||||||
|
@ -14,12 +14,21 @@ namespace Wabbajack.Common;
|
|||||||
|
|
||||||
public static class HttpExtensions
|
public static class HttpExtensions
|
||||||
{
|
{
|
||||||
|
private const string ChromeUserAgent =
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36";
|
||||||
public static HttpRequestMessage AddCookies(this HttpRequestMessage msg, Cookie[] cookies)
|
public static HttpRequestMessage AddCookies(this HttpRequestMessage msg, Cookie[] cookies)
|
||||||
{
|
{
|
||||||
msg.Headers.Add("Cookie", string.Join(";", cookies.Select(c => $"{c.Name}={c.Value}")));
|
msg.Headers.Add("Cookie", string.Join(";", cookies.Select(c => $"{c.Name}={c.Value}")));
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static HttpRequestMessage AddChromeAgent(this HttpRequestMessage msg, string? overrideUserAgent = null)
|
||||||
|
{
|
||||||
|
msg.Headers.UserAgent.Clear();
|
||||||
|
msg.Headers.Add("User-Agent", overrideUserAgent ?? ChromeUserAgent);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
public static HttpRequestMessage AddHeaders(this HttpRequestMessage msg, IEnumerable<(string Key, string Value)> headers)
|
public static HttpRequestMessage AddHeaders(this HttpRequestMessage msg, IEnumerable<(string Key, string Value)> headers)
|
||||||
{
|
{
|
||||||
foreach (var header in headers)
|
foreach (var header in headers)
|
||||||
@ -29,17 +38,10 @@ public static class HttpExtensions
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static HttpRequestMessage AddChromeAgent(this HttpRequestMessage msg)
|
|
||||||
{
|
|
||||||
msg.Headers.Add("User-Agent",
|
|
||||||
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36");
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static HttpRequestMessage ToHttpRequestMessage(this ManualDownload.BrowserDownloadState browserState)
|
public static HttpRequestMessage ToHttpRequestMessage(this ManualDownload.BrowserDownloadState browserState)
|
||||||
{
|
{
|
||||||
var msg = new HttpRequestMessage(HttpMethod.Get, browserState.Uri);
|
var msg = new HttpRequestMessage(HttpMethod.Get, browserState.Uri);
|
||||||
msg.AddChromeAgent();
|
msg.AddChromeAgent(browserState.UserAgent);
|
||||||
msg.AddCookies(browserState.Cookies);
|
msg.AddCookies(browserState.Cookies);
|
||||||
msg.AddHeaders(browserState.Headers);
|
msg.AddHeaders(browserState.Headers);
|
||||||
return msg;
|
return msg;
|
||||||
|
@ -16,7 +16,7 @@ public class ManualDownload : AUserIntervention<ManualDownload.BrowserDownloadSt
|
|||||||
Archive = archive;
|
Archive = archive;
|
||||||
}
|
}
|
||||||
|
|
||||||
public record BrowserDownloadState(Uri Uri, Cookie[] Cookies, (string Key, string Value)[] Headers)
|
public record BrowserDownloadState(Uri Uri, Cookie[] Cookies, (string Key, string Value)[] Headers, string UserAgent)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -112,7 +112,7 @@ public class GoogleDriveDownloader : ADownloader<DTOs.DownloadStates.GoogleDrive
|
|||||||
{
|
{
|
||||||
var initialUrl = $"https://drive.google.com/uc?id={state.Id}&export=download";
|
var initialUrl = $"https://drive.google.com/uc?id={state.Id}&export=download";
|
||||||
var msg = new HttpRequestMessage(HttpMethod.Get, initialUrl);
|
var msg = new HttpRequestMessage(HttpMethod.Get, initialUrl);
|
||||||
msg.UseChromeUserAgent();
|
msg.AddChromeAgent();
|
||||||
|
|
||||||
using var response = await _client.SendAsync(msg, token);
|
using var response = await _client.SendAsync(msg, token);
|
||||||
var cookies = response.GetSetCookies();
|
var cookies = response.GetSetCookies();
|
||||||
@ -145,18 +145,18 @@ public class GoogleDriveDownloader : ADownloader<DTOs.DownloadStates.GoogleDrive
|
|||||||
|
|
||||||
var url = $"https://drive.google.com/uc?export=download&confirm={warning.Value}&id={state.Id}";
|
var url = $"https://drive.google.com/uc?export=download&confirm={warning.Value}&id={state.Id}";
|
||||||
var httpState = new HttpRequestMessage(HttpMethod.Get, url);
|
var httpState = new HttpRequestMessage(HttpMethod.Get, url);
|
||||||
httpState.UseChromeUserAgent();
|
httpState.AddChromeAgent();
|
||||||
return httpState;
|
return httpState;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var url = $"https://drive.google.com/file/d/{state.Id}/edit";
|
var url = $"https://drive.google.com/file/d/{state.Id}/edit";
|
||||||
var msg = new HttpRequestMessage(HttpMethod.Get, url);
|
var msg = new HttpRequestMessage(HttpMethod.Get, url);
|
||||||
msg.UseChromeUserAgent();
|
msg.AddChromeAgent();
|
||||||
|
|
||||||
using var response = await _client.SendAsync(msg, token);
|
using var response = await _client.SendAsync(msg, token);
|
||||||
msg = new HttpRequestMessage(HttpMethod.Get, url);
|
msg = new HttpRequestMessage(HttpMethod.Get, url);
|
||||||
msg.UseChromeUserAgent();
|
msg.AddChromeAgent();
|
||||||
return !response.IsSuccessStatusCode ? null : msg;
|
return !response.IsSuccessStatusCode ? null : msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,13 +10,6 @@ namespace Wabbajack.Networking.Http;
|
|||||||
|
|
||||||
public static class Extensions
|
public static class Extensions
|
||||||
{
|
{
|
||||||
public static HttpRequestMessage UseChromeUserAgent(this HttpRequestMessage msg)
|
|
||||||
{
|
|
||||||
msg.Headers.UserAgent.Clear();
|
|
||||||
msg.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36");
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async Task<T> GetJsonFromSendAsync<T>(this HttpClient client, HttpRequestMessage msg,
|
public static async Task<T> GetJsonFromSendAsync<T>(this HttpClient client, HttpRequestMessage msg,
|
||||||
JsonSerializerOptions opts, CancellationToken? token = null)
|
JsonSerializerOptions opts, CancellationToken? token = null)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user