Fix soft crash around inviting invalid MXIDs in start DM on first message flow (#9281)
* Fix soft crash around inviting invalid MXIDs * Make ts --strict happier * Prevent suggesting invalid MXIDs * Add tests * Fix coverage * Fix coverage * Make tsc --strict happier * Fix test * Add tests
This commit is contained in:
parent
4fec436883
commit
4a23630e06
6 changed files with 194 additions and 57 deletions
|
@ -180,7 +180,7 @@ export class RoomPermalinkCreator {
|
|||
if (plEvent) {
|
||||
const content = plEvent.getContent();
|
||||
if (content) {
|
||||
const users = content.users;
|
||||
const users: Record<string, number> = content.users;
|
||||
if (users) {
|
||||
const entries = Object.entries(users);
|
||||
const allowedEntries = entries.filter(([userId]) => {
|
||||
|
@ -189,9 +189,11 @@ export class RoomPermalinkCreator {
|
|||
return false;
|
||||
}
|
||||
const serverName = getServerName(userId);
|
||||
return !isHostnameIpAddress(serverName) &&
|
||||
!isHostInRegex(serverName, this.bannedHostsRegexps) &&
|
||||
isHostInRegex(serverName, this.allowedHostsRegexps);
|
||||
|
||||
const domain = getHostnameFromMatrixServerName(serverName) ?? serverName;
|
||||
return !isHostnameIpAddress(domain) &&
|
||||
!isHostInRegex(domain, this.bannedHostsRegexps) &&
|
||||
isHostInRegex(domain, this.allowedHostsRegexps);
|
||||
});
|
||||
const maxEntry = allowedEntries.reduce((max, entry) => {
|
||||
return (entry[1] > max[1]) ? entry : max;
|
||||
|
@ -250,14 +252,15 @@ export class RoomPermalinkCreator {
|
|||
.sort((a, b) => this.populationMap[b] - this.populationMap[a]);
|
||||
|
||||
for (let i = 0; i < serversByPopulation.length && candidates.size < MAX_SERVER_CANDIDATES; i++) {
|
||||
const server = serversByPopulation[i];
|
||||
const serverName = serversByPopulation[i];
|
||||
const domain = getHostnameFromMatrixServerName(serverName) ?? "";
|
||||
if (
|
||||
!candidates.has(server) &&
|
||||
!isHostnameIpAddress(server) &&
|
||||
!isHostInRegex(server, this.bannedHostsRegexps) &&
|
||||
isHostInRegex(server, this.allowedHostsRegexps)
|
||||
!candidates.has(serverName) &&
|
||||
!isHostnameIpAddress(domain) &&
|
||||
!isHostInRegex(domain, this.bannedHostsRegexps) &&
|
||||
isHostInRegex(domain, this.allowedHostsRegexps)
|
||||
) {
|
||||
candidates.add(server);
|
||||
candidates.add(serverName);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -441,17 +444,21 @@ export function parsePermalink(fullUrl: string): PermalinkParts {
|
|||
return null; // not a permalink we can handle
|
||||
}
|
||||
|
||||
function getServerName(userId: string): string {
|
||||
export function getServerName(userId: string): string {
|
||||
return userId.split(":").splice(1).join(":");
|
||||
}
|
||||
|
||||
function getHostnameFromMatrixDomain(domain: string): string {
|
||||
if (!domain) return null;
|
||||
return new URL(`https://${domain}`).hostname;
|
||||
export function getHostnameFromMatrixServerName(serverName: string): string | null {
|
||||
if (!serverName) return null;
|
||||
try {
|
||||
return new URL(`https://${serverName}`).hostname;
|
||||
} catch (e) {
|
||||
console.error("Error encountered while extracting hostname from server name", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function isHostInRegex(hostname: string, regexps: RegExp[]): boolean {
|
||||
hostname = getHostnameFromMatrixDomain(hostname);
|
||||
if (!hostname) return true; // assumed
|
||||
if (regexps.length > 0 && !regexps[0].test) throw new Error(regexps[0].toString());
|
||||
|
||||
|
@ -459,7 +466,6 @@ function isHostInRegex(hostname: string, regexps: RegExp[]): boolean {
|
|||
}
|
||||
|
||||
function isHostnameIpAddress(hostname: string): boolean {
|
||||
hostname = getHostnameFromMatrixDomain(hostname);
|
||||
if (!hostname) return false;
|
||||
|
||||
// is-ip doesn't want IPv6 addresses surrounded by brackets, so
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue