Fix manual downloads from secure servers

This commit is contained in:
UrbanCMC 2023-08-09 21:05:20 +02:00
parent ae7402be58
commit 6399ef07d5
3 changed files with 21 additions and 19 deletions

View File

@ -23,7 +23,7 @@ public abstract class BrowserWindowViewModel : ViewModel
[Reactive] public string HeaderText { get; set; } [Reactive] public string HeaderText { get; set; }
[Reactive] public string Instructions { get; set; } [Reactive] public string Instructions { get; set; }
[Reactive] public string Address { get; set; } [Reactive] public string Address { get; set; }
public BrowserWindow? Browser { get; set; } public BrowserWindow? Browser { get; set; }
@ -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
@ -125,7 +130,7 @@ public abstract class BrowserWindowViewModel : ViewModel
{ {
source.SetCanceled(); source.SetCanceled();
} }
args.Cancel = true; args.Cancel = true;
args.Handled = true; args.Handled = true;
}; };
@ -146,12 +151,16 @@ 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,
("Referer", referer.ToString()) cookies,
}); new[]
{
("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)
{ {
var source = new TaskCompletionSource(); var source = new TaskCompletionSource();

View File

@ -19,7 +19,7 @@ public static class HttpExtensions
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 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 +29,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.Headers.Add("User-Agent", browserState.UserAgent);
msg.AddCookies(browserState.Cookies); msg.AddCookies(browserState.Cookies);
msg.AddHeaders(browserState.Headers); msg.AddHeaders(browserState.Headers);
return msg; return msg;

View File

@ -10,14 +10,14 @@ namespace Wabbajack.DTOs.Interventions;
public class ManualDownload : AUserIntervention<ManualDownload.BrowserDownloadState> public class ManualDownload : AUserIntervention<ManualDownload.BrowserDownloadState>
{ {
public Archive Archive { get; } public Archive Archive { get; }
public ManualDownload(Archive archive) public ManualDownload(Archive archive)
{ {
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)
{ {
} }
} }