blob: 36cd8e6aeff8b33f1c019c5ff4ef5a3dc2a31be2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
@page "/MediaLocator"
@inject HttpClient Http
<h3>Media locator</h3>
<hr/>
<b>This is going to expose your IP address to all these homeservers!</b>
<details>
<summary>Checked homeserver list (@homeservers.Count entries)</summary>
<ul>
@foreach (var hs in homeservers) {
<li>@hs</li>
}
</ul>
</details>
<button @onclick="addMoreHomeservers">Add more homeservers</button>
<br/>
<span>MXC URL: </span>
<input type="text" @bind="mxcUrl"/>
<button @onclick="executeSearch">Search</button>
@if (successResults.Count > 0) {
<h4>Successes</h4>
<ul>
@foreach (var result in successResults) {
<li>@result</li>
}
</ul>
}
@if (errorResults.Count > 0) {
<h4>Errors</h4>
<ul>
@foreach (var result in errorResults) {
<li>@result</li>
}
</ul>
}
@code {
string mxcUrl { get; set; }
readonly List<string> successResults = new();
readonly List<string> errorResults = new();
readonly List<string> homeservers = new();
protected override async Task OnInitializedAsync() {
await base.OnInitializedAsync();
homeservers.AddRange(new[] {
"matrix.org",
"feline.support",
"rory.gay",
"the-apothecary.club",
"envs.net",
"projectsegfau.lt"
});
}
async Task executeSearch() {
var sem = new SemaphoreSlim(128, 128);
homeservers.ForEach(async hs => {
await sem.WaitAsync();
var httpClient = new HttpClient { BaseAddress = new Uri(hs) };
httpClient.Timeout = TimeSpan.FromSeconds(5);
var rmu = mxcUrl.Replace("mxc://", $"{hs}/_matrix/media/r0/download/");
try {
var res = await httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Head, rmu));
if (res.IsSuccessStatusCode) {
successResults.Add($"{hs}: found - {res.Content.Headers.ContentLength} bytes");
StateHasChanged();
return;
}
errorResults.Add($"Error: {hs} - {res.StatusCode}\n" + await res.Content.ReadAsStringAsync());
}
catch (Exception e) {
errorResults.Add($"Error: {e}");
}
finally {
sem.Release();
}
StateHasChanged();
});
}
async Task addMoreHomeservers() {
await LocalStorageWrapper.LoadFromLocalStorage(LocalStorage);
var res = await Http.GetAsync("/homeservers.txt");
var content = await res.Content.ReadAsStringAsync();
homeservers.Clear();
var lines = content.Split("\n");
var rhs = new RemoteHomeServer("rory.gay");
var sem = new SemaphoreSlim(128, 128);
lines.ToList().ForEach(async line => {
await sem.WaitAsync();
try {
homeservers.Add(await rhs.ResolveHomeserverFromWellKnown(line));
StateHasChanged();
if (Random.Shared.Next(0, 101) == 50)
await LocalStorageWrapper.SaveCacheToLocalStorage(LocalStorage);
}
catch (Exception e) {
Console.WriteLine(e);
}
finally {
sem.Release();
}
});
StateHasChanged();
}
}
|