') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Encrypted Environment Variables by AndiLavera · Pull Request #35 · BridgeAPI-dev/bridgeapi.js · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 34 additions & 6 deletions components/AccordionSummary/index.js
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
import {
AccordionSummary as MUIAccordionSummary, Grid, Typography, makeStyles,
AccordionSummary as MUIAccordionSummary, Grid, Typography, makeStyles, Tooltip, Button,
} from '@material-ui/core';
import PropTypes from 'prop-types';
import { FaQuestionCircle } from 'react-icons/fa';

const useStyles = makeStyles(() => ({
const useStyles = makeStyles((theme) => ({
root: {
borderBottom: '1px solid rgba(0, 0, 0, .125)',
},
Expand All@@ -13,20 +14,44 @@ const useStyles = makeStyles(() => ({
subtitle: {
color: '#a6a6a4',
},
'ml-2': {
marginLeft: theme.spacing(2),
},
}));

function AccordionSummary({ title, subtitle, icon }) {
function AccordionSummary({
title, subtitle, icon, tooltip = false, tooltipMessage,
}) {
const classes = useStyles();

return (
<MUIAccordionSummary
expandIcon={icon}
className={classes.root}
>
<Grid container direction="column" align="left">
<Typography className={classes.heading}>{title}</Typography>
<Typography variant="subtitle1" className={classes.subtitle}>{subtitle}</Typography>
<Grid container>
<Grid item direction="column" align="left">
<Typography className={classes.heading}>
{title}
</Typography>
<Typography variant="subtitle1" className={classes.subtitle}>
{subtitle}
</Typography>
</Grid>

{tooltip
&& (
<Grid item alignItems="center" style={{ display: 'flex' }}>
<Tooltip title={tooltipMessage} arrow>
<Button>
<FaQuestionCircle />
</Button>
</Tooltip>
</Grid>
)}

</Grid>

</MUIAccordionSummary>
);
}
Expand All@@ -40,4 +65,7 @@ AccordionSummary.propTypes = {
PropTypes.arrayOf(PropTypes.node),
PropTypes.node,
]).isRequired,
// TODO
tooltip: PropTypes.bool,
tooltipMessage: PropTypes.string,
};
2 changes: 2 additions & 0 deletions components/Editor/EnvironmentVariablesCard/index.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,8 @@ function EnvironmentVariablesCard({ environmentVariables }) {
icon={<ExpandMoreIcon />}
title="Environment variables"
subtitle="Keep Your Secrets Safe"
tooltip
tooltipMessage="Environment variables are encrypted for data protection. You will not be able to view the value after saving."
/>
<AccordionDetails>
<Grid container spacing={2}>
Expand Down
11 changes: 10 additions & 1 deletion components/Editor/index.js
Original file line numberDiff line numberDiff line change
Expand Up@@ -80,14 +80,23 @@ function Editor({ bridge, isEditView }) {
+ '}',
};

const cleanEnvironmentVariables = (values) => values.environmentVariables.map((envVar) => {
const cleanedEnvVar = { ...envVar };
if (envVar.id && envVar.value === 'XXXX-XXX-XXXX') {
delete cleanedEnvVar.value;
}

return cleanedEnvVar;
});

const generatePayload = (values) => ({
title: values.title,
method: values.method,
outbound_url: values.outboundUrl,
retries: values.retries,
delay: values.delay,
headers_attributes: values.headers,
environment_variables_attributes: values.environmentVariables,
environment_variables_attributes: cleanEnvironmentVariables(values),
data: {
payload: values.payloadCode,
test_payload: values.testPayloadCode,
Expand Down
8 changes: 7 additions & 1 deletion pages/bridge/[id].js
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,9 +22,15 @@ export async function getServerSideProps(context) {
const res = await fetchDataOrRedirect(context, `/bridges/${context.query.id}`);
if (!res) return { props: {} }; // Redirecting to /users/login

const bridge = toCamel(res.data.bridge);
bridge.environmentVariables.forEach((envVar) => {
// If you change this 'XXXX-XXX-XXXX', make sure to update PayloadCard#generatePayload
envVar.value = 'XXXX-XXX-XXXX';
});

return {
props: {
bridge: toCamel(res.data.bridge),
bridge,
},
};
}
Expand Down