me-web? 0.15.0: address blocks from Asia, Africa and Latin America too
Build / Desktop, server and tools (push) Successful in 1m10s
Release / Every platform, the server, the release (push) Successful in 29m11s

- The provider card now names the address block your connection belongs to in Asia and the Pacific, in Africa, and
  in Latin America and the Caribbean, not only in Europe and the Middle East. The blocks come from the address
  registries APNIC, AFRINIC and LACNIC, used with their permission, and travel inside the app, so this works
  without a connection too.
- In Latin America and the Caribbean the registry gives no names for its blocks, so the card says how the block was
  handed out instead, for example "passed on by the provider to one of its customers".
- The app is about 6 MB larger, because it carries these blocks.
- The app's name no longer has quotation marks where it stands on its own: the window title, the name under the
  icon, the version line and the website's titles. Inside a sentence it keeps them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-30 22:32:49 +01:00
1 parent 599ea2bf84
commit 6209c7f2e1
134 files changed
+1026 -433

No files matched your search

+10 -2
View File
@@ -4,6 +4,7 @@ using MeWeb.Core.History;
using MeWeb.Core.Knowledge;
using MeWeb.Core.Net;
using MeWeb.Core.Router;
using MeWeb.Shared;
namespace MeWeb.Core.Checks;
@@ -102,8 +103,8 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k
var echo6 = await v6;
run.PublicV4 = echo4?.Address;
run.PublicV6 = echo6?.Address;
run.BlockV4 = echo4?.Block is null ? null : new RegistryBlock { Name = echo4.Block, Country = echo4.BlockCountry };
run.BlockV6 = echo6?.Block is null ? null : new RegistryBlock { Name = echo6.Block, Country = echo6.BlockCountry };
run.BlockV4 = BlockOf(echo4);
run.BlockV6 = BlockOf(echo6);
await Task.WhenAll(connection, router);
run.OwnNetwork = Addresses.SameNetwork(await ServerProbe.ServerAddresses(ct), run.PublicV4, run.PublicV6);
Settle(Verdicts.Addresses(run.PublicV4, run.PublicV6, run.Local, run.Router));
@@ -219,4 +220,11 @@ public class CheckRunner(IPlatform platform, ServerProbe server, KnowledgeBase k
});
return run;
}
static RegistryBlock BlockOf(ViewIp echo) => echo?.Block is null && echo?.BlockStatus is null ? null : new RegistryBlock
{
Name = echo.Block,
Country = echo.BlockCountry,
Status = Enum.TryParse<BlockStatus>(echo.BlockStatus, out var status) ? status : BlockStatus.Unknown,
};
}
+20 -4
View File
@@ -127,9 +127,8 @@ public static class Verdicts
finding.Args = [profile?.Name ?? Display(main)];
finding.With("FactNetwork", Describe(main));
if (v6 is not null && v4 is not null && v6.Number != v4.Number) finding.With("FactNetworkIpv6", Describe(v6));
var block = v4 is not null ? blockV4 : blockV6;
finding.With("FactBlock", Describe(block));
if (v4 is not null && blockV6 is not null && blockV6.Name != blockV4?.Name) finding.With("FactBlockIpv6", Describe(blockV6));
Block(finding, "FactBlock", v4 is not null ? blockV4 : blockV6);
if (v4 is not null && blockV6 is not null && (blockV6.Name != blockV4?.Name || blockV6.Status != blockV4?.Status)) Block(finding, "FactBlockIpv6", blockV6);
var upstreams = knowledge.NetworkFor(main.Number)?.Upstreams ?? [];
if (upstreams.Count > 0) finding.With("FactUpstreams", string.Join("\n", upstreams.Select(u => $"{knowledge.NameOf(u) ?? "AS" + u} (AS{u})")));
if (hand is null && observed is null) return finding;
@@ -486,7 +485,24 @@ public static class Verdicts
static string Describe(AsnEntry entry) => $"{Display(entry)} (AS{entry.Number})";
static string Describe(RegistryBlock block) => block is null ? null : string.IsNullOrEmpty(block.Country) ? block.Name : $"{block.Name} ({block.Country})";
static void Block(Finding finding, string label, RegistryBlock block)
{
if (block is null) return;
if (!string.IsNullOrEmpty(block.Name))
{
finding.With(label, string.IsNullOrEmpty(block.Country) ? block.Name : $"{block.Name} ({block.Country})");
return;
}
var key = block.Status switch
{
BlockStatus.Allocated => "ValueBlockAllocated",
BlockStatus.Assigned => "ValueBlockAssigned",
BlockStatus.Reallocated => "ValueBlockReallocated",
BlockStatus.Reassigned => "ValueBlockReassigned",
_ => null,
};
if (key is not null) finding.WithKey(label, key, block.Country ?? "");
}
static string Join(string make, string label)
{