Linkify URLs containing @
This commit is contained in:
parent
d387481001
commit
980862768b
3 changed files with 26 additions and 6 deletions
|
@ -133,6 +133,15 @@ function findLinks(text, caretLocation) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function hasAuth(url) {
|
||||||
|
try {
|
||||||
|
const urlObject = new URL(url);
|
||||||
|
return Boolean(urlObject.username);
|
||||||
|
} catch (e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function getDomain(url) {
|
function getDomain(url) {
|
||||||
try {
|
try {
|
||||||
const urlObject = new URL(url);
|
const urlObject = new URL(url);
|
||||||
|
@ -215,6 +224,11 @@ function assembleChunks(chunkDescriptors) {
|
||||||
const ASCII_PATTERN = new RegExp('[\\u0000-\\u007F]', 'g');
|
const ASCII_PATTERN = new RegExp('[\\u0000-\\u007F]', 'g');
|
||||||
|
|
||||||
function isLinkSneaky(link) {
|
function isLinkSneaky(link) {
|
||||||
|
// Any links which contain auth are considered sneaky
|
||||||
|
if (hasAuth(link)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
const domain = getDomain(link);
|
const domain = getDomain(link);
|
||||||
// If the domain is falsy, something fishy is going on
|
// If the domain is falsy, something fishy is going on
|
||||||
if (!domain) {
|
if (!domain) {
|
||||||
|
|
|
@ -391,5 +391,16 @@ describe('Link previews', () => {
|
||||||
const link = 'r.id^s.id';
|
const link = 'r.id^s.id';
|
||||||
assert.strictEqual(isLinkSneaky(link), true);
|
assert.strictEqual(isLinkSneaky(link), true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('returns true for auth (or pretend auth)', () => {
|
||||||
|
const link = 'http://whatever.com&login=someuser@77777777';
|
||||||
|
assert.strictEqual(isLinkSneaky(link), true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns false for regular @ in url', () => {
|
||||||
|
const link =
|
||||||
|
'https://lbry.tv/@ScammerRevolts:b0/DELETING-EVERY-FILE-OFF-A-SCAMMERS-LAPTOP-Destroyed:1';
|
||||||
|
assert.strictEqual(isLinkSneaky(link), false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -14,7 +14,6 @@ interface Props {
|
||||||
}
|
}
|
||||||
|
|
||||||
const SUPPORTED_PROTOCOLS = /^(http|https):/i;
|
const SUPPORTED_PROTOCOLS = /^(http|https):/i;
|
||||||
const HAS_AT = /@/;
|
|
||||||
|
|
||||||
export class Linkify extends React.Component<Props> {
|
export class Linkify extends React.Component<Props> {
|
||||||
public static defaultProps: Partial<Props> = {
|
public static defaultProps: Partial<Props> = {
|
||||||
|
@ -51,11 +50,7 @@ export class Linkify extends React.Component<Props> {
|
||||||
}
|
}
|
||||||
|
|
||||||
const { url, text: originalText } = match;
|
const { url, text: originalText } = match;
|
||||||
if (
|
if (SUPPORTED_PROTOCOLS.test(url) && !isLinkSneaky(url)) {
|
||||||
SUPPORTED_PROTOCOLS.test(url) &&
|
|
||||||
!isLinkSneaky(url) &&
|
|
||||||
!HAS_AT.test(url)
|
|
||||||
) {
|
|
||||||
results.push(
|
results.push(
|
||||||
<a key={count++} href={url}>
|
<a key={count++} href={url}>
|
||||||
{originalText}
|
{originalText}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue