Only allow SSLed urls for external actions. Closes https://github.com/owncast/owncast/issues/833
This commit is contained in:
@@ -43,8 +43,21 @@ function NewActionModal(props: Props) {
|
|||||||
onOk(actionUrl, actionTitle, actionDescription, actionIcon, actionColor, openExternally);
|
onOk(actionUrl, actionTitle, actionDescription, actionIcon, actionColor, openExternally);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function canSave(): Boolean {
|
||||||
|
try {
|
||||||
|
const validationObject = new URL(actionUrl);
|
||||||
|
if (validationObject.protocol !== 'https:') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isValidUrl(actionUrl) && actionTitle !== '';
|
||||||
|
}
|
||||||
|
|
||||||
const okButtonProps = {
|
const okButtonProps = {
|
||||||
disabled: !isValidUrl(actionUrl) || actionTitle === '',
|
disabled: !canSave(),
|
||||||
};
|
};
|
||||||
|
|
||||||
const onOpenExternallyChanged = checkbox => {
|
const onOpenExternallyChanged = checkbox => {
|
||||||
@@ -60,6 +73,8 @@ function NewActionModal(props: Props) {
|
|||||||
okButtonProps={okButtonProps}
|
okButtonProps={okButtonProps}
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
|
Add the URL for the external action you want to present. <strong>Only HTTPS urls are supported.</strong>
|
||||||
|
<p><a href="https://owncast.online/docs">Read more about external actions.</a></p>
|
||||||
<p>
|
<p>
|
||||||
<Input
|
<Input
|
||||||
value={actionUrl}
|
value={actionUrl}
|
||||||
@@ -99,6 +114,7 @@ function NewActionModal(props: Props) {
|
|||||||
value={actionColor}
|
value={actionColor}
|
||||||
onChange={input => setActionColor(input.currentTarget.value)}
|
onChange={input => setActionColor(input.currentTarget.value)}
|
||||||
/>
|
/>
|
||||||
|
Optional background color of the action button.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<Checkbox
|
<Checkbox
|
||||||
@@ -169,7 +185,7 @@ export default function Actions() {
|
|||||||
dataIndex: 'color',
|
dataIndex: 'color',
|
||||||
key: 'color',
|
key: 'color',
|
||||||
render: (color: string) => {
|
render: (color: string) => {
|
||||||
return color ? (<div style={{backgroundColor: color, height: '30px'}}>{color}</div>) : null;
|
return color ? <div style={{ backgroundColor: color, height: '30px' }}>{color}</div> : null;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -205,7 +221,14 @@ export default function Actions() {
|
|||||||
) {
|
) {
|
||||||
try {
|
try {
|
||||||
let actionsData = [...actions];
|
let actionsData = [...actions];
|
||||||
const updatedActions = actionsData.concat({ url, title, description, icon, color, openExternally });
|
const updatedActions = actionsData.concat({
|
||||||
|
url,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
icon,
|
||||||
|
color,
|
||||||
|
openExternally,
|
||||||
|
});
|
||||||
setActions(updatedActions);
|
setActions(updatedActions);
|
||||||
await save(updatedActions);
|
await save(updatedActions);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user