Refactor checkFileTypes
- Don't check the protocol in `checkFileTypes`, it should be doing one thing only, and that is check whether the URL ends with a particular file extension. - Raise an error when a URI object can't be created from the passed in URL Adds new function `isAllowedProtocolForMedia` which checks whether the URL points to a file on the file system (`file:`), is in a Chrome extension or uses HTTPs. Use that in `shouldRenderMediaFromURL` to filter out URLs that shouldn't be rendered. Re-add utility methods to the `u` object so that 3rd party plugins can use them.
This commit is contained in:
parent
be561addfa
commit
c3933426b9
@ -1,12 +1,24 @@
|
|||||||
import URI from 'urijs';
|
import URI from 'urijs';
|
||||||
import log from '@converse/headless/log';
|
import log from '@converse/headless/log';
|
||||||
import { api } from '@converse/headless/core';
|
import { api, converse } from '@converse/headless/core';
|
||||||
|
|
||||||
function checkTLS (uri) {
|
const { u } = converse.env;
|
||||||
const uri_protocol = uri.protocol().toLowerCase();
|
|
||||||
|
/**
|
||||||
|
* Given a url, check whether the protocol being used is allowed for rendering
|
||||||
|
* the media in the chat (as opposed to just rendering a URL hyperlink).
|
||||||
|
* @param { String } url
|
||||||
|
* @returns { Boolean }
|
||||||
|
*/
|
||||||
|
function isAllowedProtocolForMedia(url) {
|
||||||
|
const uri = getURI(url);
|
||||||
|
const { protocol } = window.location;
|
||||||
|
if (['chrome-extension:','file:'].includes(protocol)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
window.location.protocol === 'http:' ||
|
protocol === 'http:' ||
|
||||||
(window.location.protocol === 'https:' && ['https', 'aesgcm'].includes(uri_protocol))
|
(protocol === 'https:' && ['https', 'aesgcm'].includes(uri.protocol().toLowerCase()))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,10 +31,19 @@ export function getURI (url) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given the an array of file extensions, check whether a URL points to a file
|
||||||
|
* ending in one of them.
|
||||||
|
* @param { String[] } types - An array of file extensions
|
||||||
|
* @param { String } url
|
||||||
|
* @returns { Boolean }
|
||||||
|
* @example
|
||||||
|
* checkFileTypes(['.gif'], 'https://conversejs.org/cat.gif?foo=bar');
|
||||||
|
*/
|
||||||
function checkFileTypes (types, url) {
|
function checkFileTypes (types, url) {
|
||||||
const uri = getURI(url);
|
const uri = getURI(url);
|
||||||
if (uri === null || (!['chrome-extension:','file:'].includes(window.location.protocol) && !checkTLS(uri))) {
|
if (uri === null) {
|
||||||
return false;
|
throw new Error(`checkFileTypes: could not parse url ${url}`);
|
||||||
}
|
}
|
||||||
const filename = uri.filename().toLowerCase();
|
const filename = uri.filename().toLowerCase();
|
||||||
return !!types.filter(ext => filename.endsWith(ext)).length;
|
return !!types.filter(ext => filename.endsWith(ext)).length;
|
||||||
@ -37,6 +58,9 @@ export function isDomainWhitelisted (whitelist, url) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function shouldRenderMediaFromURL (url_text, type) {
|
export function shouldRenderMediaFromURL (url_text, type) {
|
||||||
|
if (!isAllowedProtocolForMedia(url_text)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
const may_render = api.settings.get('render_media');
|
const may_render = api.settings.get('render_media');
|
||||||
const is_domain_allowed = isDomainAllowed(url_text, `allowed_${type}_domains`);
|
const is_domain_allowed = isDomainAllowed(url_text, `allowed_${type}_domains`);
|
||||||
|
|
||||||
@ -103,3 +127,15 @@ export function isImageURL (url) {
|
|||||||
export function isEncryptedFileURL (url) {
|
export function isEncryptedFileURL (url) {
|
||||||
return url.startsWith('aesgcm://');
|
return url.startsWith('aesgcm://');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object.assign(u, {
|
||||||
|
isAudioURL,
|
||||||
|
isGIFURL,
|
||||||
|
isVideoURL,
|
||||||
|
isImageURL,
|
||||||
|
isURLWithImageExtension,
|
||||||
|
checkFileTypes,
|
||||||
|
getURI,
|
||||||
|
shouldRenderMediaFromURL,
|
||||||
|
isAllowedProtocolForMedia,
|
||||||
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user